#include "sect.h"
#include "symbol.h"
#include "token.h"
+#include "math.h"
+#include "sect.h"
#define DEF_KW
#include "kwtab.h"
//
int d_org(void)
{
- uint32_t address;
+ uint64_t address;
if (!rgpu && !rdsp && !m6502)
return error(".org permitted only in gpu/dsp and 6502 sections");
int wordlong = 0; // WORD = 0, LONG = 1
int outtype = 0; // 0:hex, 1:decimal, 2:unsigned
- uint32_t eval; // Expression value
+ uint64_t eval; // Expression value
WORD eattr; // Expression attributes
SYM * esym; // External symbol involved in expr.
TOKEN r_expr[EXPRSIZE];
//
// Return absolute (not TDB) and defined expression or return an error
//
-int abs_expr(uint32_t * a_eval)
+int abs_expr(uint64_t * a_eval)
{
WORD eattr;
int d_assert(void)
{
WORD eattr;
- uint32_t eval;
+ uint64_t eval;
for(; expr(exprbuf, &eval, &eattr, NULL)==OK; ++tok)
{
//
int d_prgflags(void)
{
- uint32_t eval;
+ uint64_t eval;
if (*tok == EOL)
return error("PRGFLAGS requires value");
else if (abs_expr(&eval) == OK)
{
- PRGFLAGS=eval;
+ PRGFLAGS = (uint32_t)eval;
return 0;
}
else
//
int d_abs(void)
{
- uint32_t eval;
+ uint64_t eval;
if (m6502)
return error(in_6502mode);
return 0;
SwitchSection(ABS);
- sloc = eval;
+ sloc = (uint32_t)eval;
return 0;
}
{
DEBUG { printf("Directive: .ds.[size] = %u, sloc = $%X\n", siz, sloc); }
- uint32_t eval;
+ uint64_t eval;
if (cursect != M6502)
{
// of zeroed memory....
if ((scattr & SBSS) || cursect == M6502)
{
- listvalue(eval);
+ listvalue((uint32_t)eval);
eval *= siz;
- sloc += eval;
+ sloc += (uint32_t)eval;
if (cursect == M6502)
chptr += eval;
int d_dc(WORD siz)
{
WORD eattr;
- uint32_t eval;
+ uint64_t eval;
+ WORD tdb;
+ WORD defined;
+ uint64_t val64;
uint8_t * p;
if ((scattr & SBSS) != 0)
siz = SIZL;
}
+ if (siz != SIZQ)
+ {
// dc.x <expression>
SYM * esym = 0;
if (expr(exprbuf, &eval, &eattr, &esym) != OK)
return 0;
+ }
+ else
+ {
+ val64 = *(uint64_t *)(tok);
+ tok = tok + 2;
+ D_long((uint32_t)(val64 >> 32));
+ D_long((uint32_t)val64);
+
+ goto comma;
+ }
- uint16_t tdb = eattr & TDB;
- uint16_t defined = eattr & DEFINED;
+ tdb = (WORD)(eattr & TDB);
+ defined = (WORD)(eattr & DEFINED);
if ((challoc - ch_size) < 4)
chcheck(4);
break;
case SIZL:
+ // Shamus: Why can't we do longs in 6502 mode?
if (m6502)
return error(in_6502mode);
D_long(eval);
}
break;
+ case SIZS:
+ if (m6502)
+ return error(in_6502mode);
+
+ if (!defined)
+ {
+ float vv = 0;
+ AddFixup(FU_FLOATSING, sloc, exprbuf);
+
+ D_single(vv);
+ }
+ else
+ {
+ if (tdb)
+ MarkRelocatable(cursect, sloc, tdb, MSINGLE, NULL);
+
+ D_single(eval);
+ }
+ break;
+ case SIZD:
+ if (m6502)
+ return error(in_6502mode);
+
+ if (!defined)
+ {
+ double vv = 0;
+ AddFixup(FU_FLOATDOUB, sloc, exprbuf);
+
+ D_double(vv);
+ }
+ else
+ {
+ double vv;
+ if (tdb)
+ MarkRelocatable(cursect, sloc, tdb, MDOUBLE, NULL);
+
+ vv = *(double *)&eval;
+ D_double(vv);
+ }
+ break;
+ case SIZX:
+ if (m6502)
+ return error(in_6502mode);
+
+ if (!defined)
+ {
+ double vv = 0;
+ AddFixup(FU_FLOATEXT, sloc, exprbuf);
+
+ D_extend(vv);
+ }
+ else
+ {
+ float vv;
+ if (tdb)
+ MarkRelocatable(cursect, sloc, tdb, MEXTEND, NULL);
+
+ vv = *(double *)&eval;
+ D_extend(vv);
+ }
+ break;
}
+
comma:
if (*tok != ',')
break;
//
int d_dcb(WORD siz)
{
- uint32_t evalc, eval;
+ uint64_t evalc, eval;
WORD eattr;
DEBUG { printf("dcb: section is %s%s%s (scattr=$%X)\n", (cursect & TEXT ? "TEXT" : ""), (cursect & DATA ? " DATA" : ""), (cursect & BSS ? "BSS" : ""), scattr); }
if (cursect != M6502 && (siz != SIZB) && (sloc & 1))
auto_even();
- dep_block(evalc, siz, eval, eattr, exprbuf);
+ dep_block((uint32_t)evalc, siz, (uint32_t)eval, eattr, exprbuf);
return 0;
}
//
int d_init(WORD def_siz)
{
- uint32_t count;
- uint32_t eval;
+ uint64_t count;
+ uint64_t eval;
WORD eattr;
WORD siz;
break;
}
- dep_block(count, siz, eval, eattr, exprbuf);
+ dep_block((uint32_t)count, siz, (uint32_t)eval, eattr, exprbuf);
switch ((int)*tok)
{
{
SYM * sym;
char * p;
- uint32_t eval;
+ uint64_t eval;
if (m6502)
return error(in_6502mode);
if (abs_expr(&eval) != OK) // Parse size of common region
return 0;
- sym->svalue = eval; // Install common symbol's size
+ sym->svalue = (uint32_t)eval; // Install common symbol's size
at_eol();
return 0;
}
//
int d_cargs(void)
{
- uint32_t eval = 4; // Default to 4 if no offset specified (to account for
+ uint64_t eval = 4; // Default to 4 if no offset specified (to account for
// return address)
WORD rlist;
SYM * symbol;
AddToSymbolDeclarationList(symbol);
symbol->sattr |= (ABS | DEFINED | EQUATED);
- symbol->svalue = eval;
+ symbol->svalue = (uint32_t)eval;
tok += 2;
// What this does is eat any dot suffixes attached to a symbol. If
//
int d_cstruct(void)
{
- uint32_t eval = 0; // Default, if no offset specified, is zero
+ uint64_t eval = 0; // Default, if no offset specified, is zero
WORD rlist;
SYM * symbol;
char * symbolName;
}
symbol->sattr |= (ABS | DEFINED | EQUATED);
- symbol->svalue = eval;
+ symbol->svalue = (uint32_t)eval;
// Check for dot suffixes and adjust space accordingly (longs and
// words on an odd boundary get bumped to the next word aligned
int d_if(void)
{
WORD eattr;
- uint32_t eval;
+ uint64_t eval;
SYM * esym;
IFENT * rif = f_ifent;