X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=direct.c;h=0cee4b37640c331429b5f0c7c6134dc3ca34d91d;hp=5cdac4ca73b605c297caf6c0b870480677898fd4;hb=91beff6462d791d651b66ed0e1a4e1a82157fb6d;hpb=a48737de123e304866212f5382d6fa4174d496a0 diff --git a/direct.c b/direct.c index 5cdac4c..0cee4b3 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" @@ -22,9 +22,10 @@ #include "kwtab.h" -TOKEN exprbuf[128]; // Expression buffer +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 @@ -32,52 +33,52 @@ int (*dirtab[])() = { d_org, // 0 org d_even, // 1 even d_unimpl, // 2 .6502 - d_68000, // 3 .68000 + d_68000, // 3 .68000 d_bss, // 4 bss - d_data, // 5 data - d_text, // 6 text - d_abs, // 7 abs - d_comm, // 8 comm - d_init, // 9 init - d_cargs, // 10 cargs - d_goto, // 11 goto - d_dc, // 12 dc - d_ds, // 13 ds - d_undmac, // 14 undefmac + d_data, // 5 data + d_text, // 6 text + d_abs, // 7 abs + d_comm, // 8 comm + (void *)d_init, // 9 init + d_cargs, // 10 cargs + (void *)d_goto, // 11 goto + (void *)d_dc, // 12 dc + (void *)d_ds, // 13 ds + d_undmac, // 14 undefmac d_gpu, // 15 .gpu d_dsp, // 16 .dsp - d_dcb, // 17 dcb - d_unimpl, // 18* set - d_unimpl, // 19* reg - d_unimpl, // 20 dump - d_incbin, // 21 .incbin //load - d_unimpl, // 22 disable - d_unimpl, // 23 enable - d_globl, // 24 globl + (void *)d_dcb, // 17 dcb + d_unimpl, // 18* set + d_unimpl, // 19* reg + d_unimpl, // 20 dump + d_incbin, // 21 .incbin //load + d_unimpl, // 22 disable + d_unimpl, // 23 enable + d_globl, // 24 globl d_regbank0, // 25 .regbank0 d_regbank1, // 26 .regbank1 - d_unimpl, // 27 xdef - d_assert, // 28 assert - d_unimpl, // 29* if - d_unimpl, // 30* endif - d_unimpl, // 31* endc - d_unimpl, // 32* iif - d_include, // 33 include - fpop, // 34 end - d_unimpl, // 35* macro - ExitMacro, // 36* exitm - d_unimpl, // 37* endm - d_list, // 38 list - d_nlist, // 39 nlist - d_long, // 40* rept - d_phrase, // 41* endr - d_dphrase, // 42 struct - d_qphrase, // 43 ends - d_title, // 44 title - d_subttl, // 45 subttl - eject, // 46 eject - d_unimpl, // 47 error - d_unimpl, // 48 warn + d_unimpl, // 27 xdef + d_assert, // 28 assert + d_unimpl, // 29* if + d_unimpl, // 30* endif + d_unimpl, // 31* endc + d_unimpl, // 32* iif + d_include, // 33 include + fpop, // 34 end + d_unimpl, // 35* macro + ExitMacro, // 36* exitm + d_unimpl, // 37* endm + d_list, // 38 list + d_nlist, // 39 nlist + d_long, // 40* rept + d_phrase, // 41* endr + d_dphrase, // 42 struct + d_qphrase, // 43 ends + d_title, // 44 title + d_subttl, // 45 subttl + eject, // 46 eject + d_unimpl, // 47 error + d_unimpl, // 48 warn d_noclear, // 49 .noclear d_equrundef, // 50 .equrundef/.regundef d_ccundef, // 51 .ccundef @@ -291,6 +292,7 @@ int d_equrundef(void) // int d_noclear(void) { + warn("CLR.L opcode ignored..."); return 0; } @@ -802,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) @@ -854,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); }