X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=direct.c;h=04b576c22cc4df94d457c6fff750561937a1a264;hp=77fda019a62dd459a106f98959aac8be486a769b;hb=689d9bc6a5776f54995b68ad2493652f55b9d419;hpb=c04128b575f2db39445b9ef6fcf0c12b3bb2c60f diff --git a/direct.c b/direct.c index 77fda01..04b576c 100644 --- a/direct.c +++ b/direct.c @@ -3,7 +3,7 @@ // DIRECT.C - Directive Handling // Copyright (C) 199x Landon Dyer, 2011 Reboot and Friends // RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986 -// Source Utilised with the Kind Permission of Landon Dyer +// Source utilised with the kind permission of Landon Dyer // #include "direct.h" @@ -25,6 +25,7 @@ TOKEN exprbuf[128]; // Expression buffer SYM * symbolPtr[1000000]; // Symbol pointers table static long unused; // For supressing 'write' warnings +char buffer[256]; // Scratch buffer for messages // Directive handler table @@ -116,19 +117,19 @@ int d_org(void) // -// 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) @@ -136,7 +137,6 @@ int d_print(void) switch(*tok) { case STRING: -// sprintf(prntstr, "%s", (char *)tok[1]); sprintf(prntstr, "%s", string[tok[1]]); printf("%s", prntstr); @@ -203,7 +203,6 @@ int d_print(void) } printf("\n"); -// println("\n"); return 0; @@ -214,7 +213,7 @@ token_err: // -// Undefine an Equated Condition Code +// Undefine an equated condition code // int d_ccundef(void) { @@ -229,12 +228,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 @@ -251,7 +248,7 @@ int d_ccundef(void) // -// Undefine an Equated Register +// Undefine an equated register // int d_equrundef(void) { @@ -275,7 +272,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; @@ -286,16 +288,17 @@ 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) { + warn("CLR.L opcode ignored..."); return 0; } // -// Include Binary File +// Include binary file // int d_incbin(void) { @@ -354,7 +357,7 @@ int d_incbin(void) // -// Set RISC Register Banks +// Set RISC register banks // int d_regbank0(void) { @@ -396,13 +399,12 @@ static inline void SkipBytes(unsigned bytesToSkip) // -// Adjust Location to an EVEN Value +// Adjust location to an EVEN value // int d_even(void) { unsigned skip = (rgpu || rdsp ? orgaddr : sloc) & 0x01; -// if (sloc & 1) if (skip) { if ((scattr & SBSS) == 0) @@ -424,7 +426,7 @@ int d_even(void) // -// Adjust Location to an LONG Value +// Adjust location to a LONG value // int d_long(void) { @@ -437,7 +439,7 @@ int d_long(void) // -// Adjust Location to an PHRASE Value +// Adjust location to a 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 @@ -459,7 +461,7 @@ int d_phrase(void) // -// Adjust Location to an DPHRASE Value +// Adjust location to a DPHRASE value // int d_dphrase(void) { @@ -472,7 +474,7 @@ int d_dphrase(void) // -// Adjust Location to an QPHRASE Value +// Adjust location to a QPHRASE value // int d_qphrase(void) { @@ -497,17 +499,17 @@ int d_qphrase(void) 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 - ++lab_sym->svalue; + if (lab_sym != NULL) // Bump label if we have to + lab_sym->svalue++; } // -// Unimplemened Directive Error +// Unimplemened directive error // int d_unimpl(void) { @@ -576,23 +578,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: @@ -704,9 +698,8 @@ int d_abs(void) // -// Switch Segments +// Switch segments // - int d_text(void) { if (rgpu || rdsp) @@ -811,15 +804,22 @@ int d_dc(WORD siz) if ((scattr & SBSS) != 0) return error("illegal initialization of section"); + // Do an auto_even if it's not BYTE sized (hmm, should we be doing this???) if ((siz != SIZB) && (sloc & 1)) auto_even(); + // Check to see if we're trying to set LONGS on a non 32-bit aligned + // address in a GPU or DSP section, in their local RAM + if ((siz == SIZL) && (orgaddr & 0x03) + && ((rgpu && (orgaddr >= 0xF03000) && (orgaddr <= 0xF03FFFF)) + || (rdsp && (orgaddr >= 0xF1B000) && (orgaddr <= 0xF1CFFFF)))) + warn("depositing LONGs on a non-long address in local RAM"); + for(;; ++tok) { // dc.b 'string' [,] ... if (siz == SIZB && *tok == STRING && (tok[2] == ',' || tok[2] == EOL)) { -// i = strlen((const char*)tok[1]); i = strlen(string[tok[1]]); if ((challoc - ch_size) < i) @@ -863,7 +863,10 @@ int d_dc(WORD siz) return error("non-absolute byte value"); if (eval + 0x100 >= 0x200) - return error(range_error); + { + sprintf(buffer, "%s (value = $%X)", range_error, eval); + return error(buffer); + } D_byte(eval); } @@ -1110,7 +1113,6 @@ int d_comm(void) if (*tok != SYMBOL) return error("missing symbol"); -// p = (char *)tok[1]; p = string[tok[1]]; tok += 2; @@ -1179,7 +1181,7 @@ int d_68000(void) // -// .gpu - Switch to GPU Assembler +// .gpu - Switch to GPU assembler // int d_gpu(void) { @@ -1206,7 +1208,7 @@ int d_gpu(void) // -// .dsp - Switch to DSP Assembler +// .dsp - Switch to DSP assembler // int d_dsp(void) { @@ -1269,18 +1271,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) @@ -1292,8 +1286,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; @@ -1318,7 +1311,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) @@ -1410,8 +1402,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;