d_cstruct, // 53 .cstruct
d_jpad, // 54 .jpad (deprecated)
d_nojpad, // 55 .nojpad (deprecated)
+ d_gpumain, // 56 .gpumain (deprecated)
};
}
orgaddr = address;
- orgactive = 1;
+ orgactive = 1;
+//printf("ORG: address = $%08X...\n", orgaddr);
return 0;
}
// Check that we are in a RISC section
if (!rgpu && !rdsp)
- {
- error(".equrundef/.regundef must be defined in .gpu/.dsp section");
- return ERROR;
- }
+ return error(".equrundef/.regundef must be defined in .gpu/.dsp section");
while (*tok != EOL)
{
// Check we are dealing with a symbol
if (*tok != SYMBOL)
- {
-// error(syntax_error);
- error("syntax error; expected symbol");
- return ERROR;
- }
+ return error("syntax error; expected symbol");
// Lookup and undef if equated register
-// regname = lookup((char *)tok[1], LABEL, 0);
regname = lookup(string[tok[1]], LABEL, 0);
if (regname && (regname->sattre & EQUATEDREG))
if (*tok != STRING)
{
-// error(syntax_error);
error("syntax error; string missing");
return ERROR;
}
return ERROR;
}
-//#define D_byte(b) {*chptr++=(char)b; ++sloc; ++ch_size; if(orgactive) ++orgaddr;}
memcpy(chptr, fileBuffer, size);
chptr += size;
sloc += size;
}
+//
+// Helper function, to cut down on mistakes & typing
+//
+static inline void SkipBytes(unsigned bytesToSkip)
+{
+ if (!bytesToSkip)
+ return;
+
+ if ((scattr & SBSS) == 0)
+ {
+ chcheck(bytesToSkip);
+ D_ZEROFILL(bytesToSkip);
+ }
+ else
+ {
+ sloc += bytesToSkip;
+
+ if (orgactive)
+ orgaddr += bytesToSkip;
+ }
+}
+
+
//
// Adjust Location to an EVEN Value
//
int d_even(void)
{
- if (sloc & 1)
+ unsigned skip = (rgpu || rdsp ? orgaddr : sloc) & 0x01;
+
+// if (sloc & 1)
+ if (skip)
{
if ((scattr & SBSS) == 0)
{
}
else
{
- ++sloc;
+ sloc++;
+
+ if (orgactive)
+ orgaddr++;
}
}
//
int d_long(void)
{
- unsigned i;
- unsigned val = 4;
-
- i = sloc & ~(val - 1);
-
- if (i != sloc)
- val = val - (sloc - i);
- else
- val = 0;
-
- if (val)
- {
- if ((scattr & SBSS) == 0)
- {
- chcheck(val);
-
- for(i=0; i<val; i++)
- D_byte(0);
- }
- else
- {
- sloc += val;
- }
- }
+ unsigned lower2Bits = (rgpu || rdsp ? orgaddr : sloc) & 0x03;
+ unsigned bytesToSkip = (0x04 - lower2Bits) & 0x03;
+ SkipBytes(bytesToSkip);
return 0;
}
//
// Adjust Location to an PHRASE Value
//
+// N.B.: We have to handle the GPU/DSP cases separately because you can embed
+// RISC code in the middle of a regular 68K section. Also note that all
+// of the alignment pseudo-ops will have to be fixed this way.
+//
+// This *must* behave differently when in a RISC section, as following sloc
+// (instead of orgaddr) will fuck things up royally. Note that we do it this
+// way because you can embed RISC code in a 68K section, and have the origin
+// pointing to a different alignment in the RISC section than the 68K section.
+//
int d_phrase(void)
{
- unsigned i;
- unsigned val = 8;
-
- i = sloc & ~(val - 1);
-
- if (i != sloc)
- val = val - (sloc - i);
- else
- val = 0;
-
- if (val)
- {
- if ((scattr & SBSS) == 0)
- {
- chcheck(val);
-
- for(i=0; i<val; i++)
- D_byte(0);
- }
- else
- {
- sloc += val;
- }
- }
+ unsigned lower3Bits = (rgpu || rdsp ? orgaddr : sloc) & 0x07;
+ unsigned bytesToSkip = (0x08 - lower3Bits) & 0x07;
+ SkipBytes(bytesToSkip);
return 0;
}
//
int d_dphrase(void)
{
- unsigned i;
- unsigned val = 16;
-
- i = sloc & ~(val - 1);
-
- if (i != sloc)
- val = val - (sloc - i);
- else
- val = 0;
-
- if (val)
- {
- if ((scattr & SBSS) == 0)
- {
- chcheck(val);
-
- for(i=0; i<val; i++)
- D_byte(0);
- }
- else
- {
- sloc += val;
- }
- }
+ unsigned lower4Bits = (rgpu || rdsp ? orgaddr : sloc) & 0x0F;
+ unsigned bytesToSkip = (0x10 - lower4Bits) & 0x0F;
+ SkipBytes(bytesToSkip);
return 0;
}
//
int d_qphrase(void)
{
- unsigned i;
- unsigned val = 32;
-
- i = sloc & ~(val - 1);
-
- if (i != sloc)
- val = val - (sloc - i);
- else
- val = 0;
-
- if (val)
- {
- if ((scattr & SBSS) == 0)
- {
- savsect();
- chcheck(val);
-
- for(i=0; i<val; i++)
- D_byte(0);
- }
- else
- {
- sloc += val;
- }
- }
+ unsigned lower5Bits = (rgpu || rdsp ? orgaddr : sloc) & 0x1F;
+ unsigned bytesToSkip = (0x20 - lower5Bits) & 0x1F;
+ SkipBytes(bytesToSkip);
return 0;
}
// which is OK since multiple labels are only allowed in AS68 kludge mode, and
// the C compiler is VERY paranoid and uses ".even" whenever it can
//
+// N.B.: This probably needs the same fixes as above...
+//
void auto_even(void)
{
if (scattr & SBSS)
- ++sloc; // Bump BSS section
+ sloc++; // Bump BSS section
else
- D_byte(0) // Deposit 0.b in non-BSS
+ D_byte(0); // Deposit 0.b in non-BSS
- if (lab_sym != NULL) // Bump label if we have to
+ if (lab_sym != NULL) // Bump label if we have to
++lab_sym->svalue;
}
//
int symlist(int(* func)())
{
- char * em = "symbol list syntax";
+ const char * em = "symbol list syntax";
for(;;)
{
if (*tok != SYMBOL)
return error(em);
-#if 0
- if ((*func)(tok[1]) != OK)
-#else
if ((*func)(string[tok[1]]) != OK)
-#endif
break;
tok += 2;
if (*tok != ',')
return error(em);
- ++tok;
+ tok++;
}
return 0;
//
int globl1(char * p)
{
- SYM *sy;
+ SYM * sy;
if (*p == '.')
return error("cannot .globl local symbol");
sy = NewSymbol(p, LABEL, 0);
sy->svalue = 0;
sy->sattr = GLOBAL;
+//printf("glob1: Making global symbol: attr=%04X, eattr=%08X, %s\n", sy->sattr, sy->sattre, sy->sname);
}
else
sy->sattr |= GLOBAL;
{
VALUE eval;
- savsect();
+ SaveSection();
if (*tok == EOL)
eval = 0;
else if (abs_expr(&eval) != OK)
return 0;
- switchsect(ABS);
+ SwitchSection(ABS);
sloc = eval;
return 0;
}
if (cursect != TEXT)
{
- savsect();
- switchsect(TEXT);
+ SaveSection();
+ SwitchSection(TEXT);
}
return 0;
if (cursect != DATA)
{
- savsect();
- switchsect(DATA);
+ SaveSection();
+ SwitchSection(DATA);
}
return 0;
if (cursect != BSS)
{
- savsect();
- switchsect(BSS);
+ SaveSection();
+ SwitchSection(BSS);
}
return 0;
case SIZB:
if (!defined)
{
- fixup(FU_BYTE | FU_SEXT, sloc, exprbuf);
+ AddFixup(FU_BYTE | FU_SEXT, sloc, exprbuf);
D_byte(0);
}
else
case SIZN:
if (!defined)
{
- fixup(FU_WORD | FU_SEXT, sloc, exprbuf);
+ AddFixup(FU_WORD | FU_SEXT, sloc, exprbuf);
D_word(0);
}
else
if (!defined)
{
if (movei)
- fixup(FU_LONG | FU_MOVEI, sloc, exprbuf);
+ AddFixup(FU_LONG | FU_MOVEI, sloc, exprbuf);
else
- fixup(FU_LONG, sloc, exprbuf);
+ AddFixup(FU_LONG, sloc, exprbuf);
D_long(0);
}
case SIZB:
if (!defined)
{
- fixup(FU_BYTE | FU_SEXT, sloc, exprbuf);
+ AddFixup(FU_BYTE | FU_SEXT, sloc, exprbuf);
D_byte(0);
}
else
case SIZN:
if (!defined)
{
- fixup(FU_WORD | FU_SEXT, sloc, exprbuf);
+ AddFixup(FU_WORD | FU_SEXT, sloc, exprbuf);
D_word(0);
}
else
case SIZL:
if (!defined)
{
- fixup(FU_LONG, sloc, exprbuf);
+ AddFixup(FU_LONG, sloc, exprbuf);
D_long(0);
}
else
// Switching from gpu/dsp sections should reset any ORG'd Address
orgactive = 0;
orgwarning = 0;
- savsect();
- switchsect(TEXT);
+ SaveSection();
+ SwitchSection(TEXT);
return 0;
}
// If previous section was dsp or 68000 then we need to reset ORG'd Addresses
if (!rgpu)
{
+//printf("Resetting ORG...\n");
orgactive = 0;
orgwarning = 0;
}
+//else printf("NOT resetting ORG!\n");
rgpu = 1; // Set GPU assembly
rdsp = 0; // Unset DSP assembly
// Put symbol in "order of definition" list
if (!(symbol->sattr & SDECLLIST))
- sym_decl(symbol);
+ AddToSymbolOrderList(symbol);
symbol->sattr |= (ABS | DEFINED | EQUATED);
symbol->svalue = eval;
// Put symbol in "order of definition" list
if (!(symbol->sattr & SDECLLIST))
- sym_decl(symbol);
+ AddToSymbolOrderList(symbol);
tok += 2;
return OK;
}
+
+int d_gpumain(void)
+{
+ return error("What the hell? Do you think we adhere to the Goof standard?");
+}
+