X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=direct.c;h=77fda019a62dd459a106f98959aac8be486a769b;hp=67a6ffdfcf014fa7111a1afd4e7330ce1046f15b;hb=c04128b575f2db39445b9ef6fcf0c12b3bb2c60f;hpb=58902b3fadb54775564b6c66684c3dcdb69eda83 diff --git a/direct.c b/direct.c index 67a6ffd..77fda01 100644 --- a/direct.c +++ b/direct.c @@ -108,7 +108,8 @@ int d_org(void) } orgaddr = address; - orgactive = 1; + orgactive = 1; +//printf("ORG: address = $%08X...\n", orgaddr); return 0; } @@ -258,10 +259,7 @@ int d_equrundef(void) // 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) { @@ -271,14 +269,9 @@ int d_equrundef(void) // 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)) @@ -320,7 +313,6 @@ int d_incbin(void) if (*tok != STRING) { -// error(syntax_error); error("syntax error; string missing"); return ERROR; } @@ -347,7 +339,6 @@ int d_incbin(void) return ERROR; } -//#define D_byte(b) {*chptr++=(char)b; ++sloc; ++ch_size; if(orgactive) ++orgaddr;} memcpy(chptr, fileBuffer, size); chptr += size; sloc += size; @@ -381,12 +372,38 @@ int d_regbank1(void) } +// +// 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) { @@ -395,7 +412,10 @@ int d_even(void) } else { - ++sloc; + sloc++; + + if (orgactive) + orgaddr++; } } @@ -408,30 +428,9 @@ int d_even(void) // 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; isvalue; } @@ -594,18 +540,14 @@ int abs_expr(VALUE * a_eval) // 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; @@ -616,7 +558,7 @@ int symlist(int(* func)()) if (*tok != ',') return error(em); - ++tok; + tok++; } return 0; @@ -715,7 +657,7 @@ int d_assert(void) // int globl1(char * p) { - SYM *sy; + SYM * sy; if (*p == '.') return error("cannot .globl local symbol"); @@ -725,6 +667,7 @@ int globl1(char * p) 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; @@ -747,14 +690,14 @@ int d_abs(void) { 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; } @@ -771,8 +714,8 @@ int d_text(void) if (cursect != TEXT) { - savsect(); - switchsect(TEXT); + SaveSection(); + SwitchSection(TEXT); } return 0; @@ -786,8 +729,8 @@ int d_data(void) if (cursect != DATA) { - savsect(); - switchsect(DATA); + SaveSection(); + SwitchSection(DATA); } return 0; @@ -801,8 +744,8 @@ int d_bss(void) if (cursect != BSS) { - savsect(); - switchsect(BSS); + SaveSection(); + SwitchSection(BSS); } return 0; @@ -911,7 +854,7 @@ int d_dc(WORD siz) case SIZB: if (!defined) { - fixup(FU_BYTE | FU_SEXT, sloc, exprbuf); + AddFixup(FU_BYTE | FU_SEXT, sloc, exprbuf); D_byte(0); } else @@ -930,7 +873,7 @@ int d_dc(WORD siz) case SIZN: if (!defined) { - fixup(FU_WORD | FU_SEXT, sloc, exprbuf); + AddFixup(FU_WORD | FU_SEXT, sloc, exprbuf); D_word(0); } else @@ -950,9 +893,9 @@ int d_dc(WORD siz) 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); } @@ -1098,7 +1041,7 @@ int dep_block(VALUE count, WORD siz, VALUE eval, WORD eattr, TOKEN * exprbuf) case SIZB: if (!defined) { - fixup(FU_BYTE | FU_SEXT, sloc, exprbuf); + AddFixup(FU_BYTE | FU_SEXT, sloc, exprbuf); D_byte(0); } else @@ -1117,7 +1060,7 @@ int dep_block(VALUE count, WORD siz, VALUE eval, WORD eattr, TOKEN * exprbuf) case SIZN: if (!defined) { - fixup(FU_WORD | FU_SEXT, sloc, exprbuf); + AddFixup(FU_WORD | FU_SEXT, sloc, exprbuf); D_word(0); } else @@ -1136,7 +1079,7 @@ int dep_block(VALUE count, WORD siz, VALUE eval, WORD eattr, TOKEN * exprbuf) case SIZL: if (!defined) { - fixup(FU_LONG, sloc, exprbuf); + AddFixup(FU_LONG, sloc, exprbuf); D_long(0); } else @@ -1229,8 +1172,8 @@ int d_68000(void) // Switching from gpu/dsp sections should reset any ORG'd Address orgactive = 0; orgwarning = 0; - savsect(); - switchsect(TEXT); + SaveSection(); + SwitchSection(TEXT); return 0; } @@ -1249,9 +1192,11 @@ int d_gpu(void) // 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 @@ -1348,7 +1293,7 @@ int d_cargs(void) // Put symbol in "order of definition" list if (!(symbol->sattr & SDECLLIST)) - sym_decl(symbol); + AddToSymbolOrderList(symbol); symbol->sattr |= (ABS | DEFINED | EQUATED); symbol->svalue = eval; @@ -1466,7 +1411,7 @@ int d_cstruct(void) // Put symbol in "order of definition" list if (!(symbol->sattr & SDECLLIST)) - sym_decl(symbol); + AddToSymbolOrderList(symbol); tok += 2;