X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=direct.c;h=5cdac4ca73b605c297caf6c0b870480677898fd4;hp=efec94a2f438fd63d3a3931f14567cfea8efa690;hb=a48737de123e304866212f5382d6fa4174d496a0;hpb=062214e62031c26d372edc2e68473ebb64f6a506 diff --git a/direct.c b/direct.c index efec94a..5cdac4c 100644 --- a/direct.c +++ b/direct.c @@ -108,26 +108,27 @@ int d_org(void) } orgaddr = address; - orgactive = 1; + orgactive = 1; +//printf("ORG: address = $%08X...\n", orgaddr); return 0; } // -// Print Directive +// Print directive // int d_print(void) { - char prntstr[LNSIZ]; // String for PRINT directive - char format[LNSIZ]; // Format for PRINT directive - int formatting = 0; // Formatting on/off - int wordlong = 0; // WORD = 0, LONG = 1 - int outtype = 0; // 0:hex, 1:decimal, 2:unsigned - - VALUE eval; // Expression value - WORD eattr; // Expression attributes - SYM * esym; // External symbol involved in expr. + char prntstr[LNSIZ]; // String for PRINT directive + char format[LNSIZ]; // Format for PRINT directive + int formatting = 0; // Formatting on/off + int wordlong = 0; // WORD = 0, LONG = 1 + int outtype = 0; // 0:hex, 1:decimal, 2:unsigned + + VALUE eval; // Expression value + WORD eattr; // Expression attributes + SYM * esym; // External symbol involved in expr. TOKEN r_expr[EXPRSIZE]; while (*tok != EOL) @@ -135,7 +136,6 @@ int d_print(void) switch(*tok) { case STRING: -// sprintf(prntstr, "%s", (char *)tok[1]); sprintf(prntstr, "%s", string[tok[1]]); printf("%s", prntstr); @@ -202,7 +202,6 @@ int d_print(void) } printf("\n"); -// println("\n"); return 0; @@ -213,7 +212,7 @@ token_err: // -// Undefine an Equated Condition Code +// Undefine an equated condition code // int d_ccundef(void) { @@ -228,12 +227,10 @@ int d_ccundef(void) if (*tok != SYMBOL) { -// error(syntax_error); error("syntax error; expected symbol"); return ERROR; } -// ccname = lookup((char *)tok[1], LABEL, 0); ccname = lookup(string[tok[1]], LABEL, 0); // Make sure symbol is a valid ccdef @@ -250,7 +247,7 @@ int d_ccundef(void) // -// Undefine an Equated Register +// Undefine an equated register // int d_equrundef(void) { @@ -274,7 +271,12 @@ int d_equrundef(void) regname = lookup(string[tok[1]], LABEL, 0); if (regname && (regname->sattre & EQUATEDREG)) + { + // Reset the attributes of this symbol... + regname->sattr = 0; + regname->sattre &= ~(EQUATEDREG | BANK_0 | BANK_1); regname->sattre |= UNDEF_EQUR; + } // Skip over symbol token and address tok += 2; @@ -285,7 +287,7 @@ int d_equrundef(void) // -// Do Not Allow the Use of the CLR.L Opcode +// Do not allow use of the CLR.L opcode // int d_noclear(void) { @@ -294,7 +296,7 @@ int d_noclear(void) // -// Include Binary File +// Include binary file // int d_incbin(void) { @@ -312,7 +314,6 @@ int d_incbin(void) if (*tok != STRING) { -// error(syntax_error); error("syntax error; string missing"); return ERROR; } @@ -339,7 +340,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; @@ -355,7 +355,7 @@ int d_incbin(void) // -// Set RISC Register Banks +// Set RISC register banks // int d_regbank0(void) { @@ -374,11 +374,36 @@ int d_regbank1(void) // -// Adjust Location to an EVEN Value +// 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 (skip) { if ((scattr & SBSS) == 0) { @@ -387,7 +412,10 @@ int d_even(void) } else { - ++sloc; + sloc++; + + if (orgactive) + orgaddr++; } } @@ -396,137 +424,61 @@ int d_even(void) // -// Adjust Location to an LONG Value +// Adjust location to a LONG value // 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; + if (lab_sym != NULL) // Bump label if we have to + lab_sym->svalue++; } // -// Unimplemened Directive Error +// Unimplemened directive error // int d_unimpl(void) { @@ -622,23 +576,15 @@ int d_include(void) char buf[128]; char buf1[128]; - if (*tok == STRING) // Leave strings ALONE -#if 0 - fn = (char *)*++tok; -#else + if (*tok == STRING) // Leave strings ALONE fn = string[*++tok]; -#endif - else if (*tok == SYMBOL) // Try to append ".s" to symbols + else if (*tok == SYMBOL) // Try to append ".s" to symbols { -#if 0 - strcpy(buf, (char *)*++tok); -#else strcpy(buf, string[*++tok]); -#endif fext(buf, ".s", 0); fn = &buf[0]; } - else // Punt if no STRING or SYMBOL + else // Punt if no STRING or SYMBOL return error("missing filename"); // Make sure the user didn't try anything like: @@ -750,9 +696,8 @@ int d_abs(void) // -// Switch Segments +// Switch segments // - int d_text(void) { if (rgpu || rdsp) @@ -1156,7 +1101,6 @@ int d_comm(void) if (*tok != SYMBOL) return error("missing symbol"); -// p = (char *)tok[1]; p = string[tok[1]]; tok += 2; @@ -1225,7 +1169,7 @@ int d_68000(void) // -// .gpu - Switch to GPU Assembler +// .gpu - Switch to GPU assembler // int d_gpu(void) { @@ -1238,9 +1182,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 @@ -1250,7 +1196,7 @@ int d_gpu(void) // -// .dsp - Switch to DSP Assembler +// .dsp - Switch to DSP assembler // int d_dsp(void) { @@ -1313,18 +1259,10 @@ int d_cargs(void) { if (*tok == SYMBOL) { -// p = (char *)tok[1]; p = string[tok[1]]; -#if 0 - if (*p == '.') - env = curenv; // Label is local - else - env = 0; // Label is global -#else // Set env to either local (dot prefixed) or global scope env = (*p == '.' ? curenv : 0); -#endif symbol = lookup(p, LABEL, env); if (symbol == NULL) @@ -1336,8 +1274,7 @@ int d_cargs(void) return errors("multiply-defined label '%s'", p); // Put symbol in "order of definition" list - if (!(symbol->sattr & SDECLLIST)) - AddToSymbolOrderList(symbol); + AddToSymbolDeclarationList(symbol); symbol->sattr |= (ABS | DEFINED | EQUATED); symbol->svalue = eval; @@ -1362,7 +1299,6 @@ int d_cargs(void) if (reglist(&rlist) < 0) return 0; -// for(i=0; i++<16; rlist>>=1) for(i=0; i<16; i++, rlist>>=1) { if (rlist & 1) @@ -1454,8 +1390,7 @@ int d_cstruct(void) return errors("multiply-defined label '%s'", symbolName); // Put symbol in "order of definition" list - if (!(symbol->sattr & SDECLLIST)) - AddToSymbolOrderList(symbol); + AddToSymbolDeclarationList(symbol); tok += 2;