From: Shamus Hammons Date: Sat, 2 Mar 2013 20:22:33 +0000 (-0600) Subject: Fix silly mask bugs, added check for use of undefined register equates. X-Git-Tag: 1.3.0~15 X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=commitdiff_plain;h=f6e6a55c4cdaf0dffa0897792dc5926c7b173a23 Fix silly mask bugs, added check for use of undefined register equates. --- diff --git a/direct.c b/direct.c index 100db42..1d77c1c 100644 --- a/direct.c +++ b/direct.c @@ -8,7 +8,7 @@ #include "direct.h" #include "sect.h" -#include "risca.h" +#include "riscasm.h" #include "error.h" #include "token.h" #include "procln.h" @@ -26,60 +26,60 @@ SYM * symbolPtr[1000000]; // Symbol pointers table // Directive handler table int (*dirtab[])() = { - d_org, // 0 org - d_even, // 1 even - d_unimpl, // 2 .6502 - 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_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 - 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_noclear, // 49 .noclear - d_equrundef, // 50 .equrundef/.regundef - d_ccundef, // 51 .ccundef - d_print, // 52 .print - d_cstruct, // 53 .cstruct + d_org, // 0 org + d_even, // 1 even + d_unimpl, // 2 .6502 + 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_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 + 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_noclear, // 49 .noclear + d_equrundef, // 50 .equrundef/.regundef + d_ccundef, // 51 .ccundef + d_print, // 52 .print + d_cstruct, // 53 .cstruct }; @@ -258,7 +258,7 @@ int d_equrundef(void) while (*tok != EOL) { - // Skip preceeding or seperating commas + // Skip preceeding or seperating commas (if any) if (*tok == ',') tok++; @@ -316,31 +316,6 @@ int d_incbin(void) return ERROR; } -#if 0 - if ((j = open(string[tok[1]], _OPEN_INC)) >= 0) - { - size = lseek(j, 0L, SEEK_END); - chcheck(size); - pos = lseek(j, 0L, SEEK_SET); - - DEBUG - { - printf("INCBIN: File '%s' is %li bytes.\n", string[tok[1]], size); - } - - for(i=0; isattr |= REFERENCED; + // Check for undefined register equates + if (sy->sattre & UNDEF_EQUR) + { + errors("undefined register equate '%s'", sy->sname); +//if we return right away, it returns some spurious errors... +// return ERROR; + } + // Check register bank usage if (sy->sattre & EQUATEDREG) { if ((regbank == BANK_0) && (sy->sattre & BANK_1) && !altbankok) - warns("equated symbol \'%s\' cannot be used in register bank 0", sy->sname); + warns("equated symbol '%s' cannot be used in register bank 0", sy->sname); if ((regbank == BANK_1) && (sy->sattre & BANK_0) && !altbankok) - warns("equated symbol \'%s\' cannot be used in register bank 1", sy->sname); + warns("equated symbol '%s' cannot be used in register bank 1", sy->sname); } *tk++ = SYMBOL; diff --git a/mach.c b/mach.c index 47896a9..2220d0f 100644 --- a/mach.c +++ b/mach.c @@ -12,7 +12,7 @@ #include "direct.h" #include "token.h" #include "procln.h" -#include "risca.h" +#include "riscasm.h" #define DEF_KW #include "kwtab.h" diff --git a/makefile b/makefile index 5e377d3..8b46eed 100644 --- a/makefile +++ b/makefile @@ -11,9 +11,9 @@ HOSTCC = gcc CFLAGS = -g -D__GCCUNIX__ -I. -O2 -SRCS = amode.c debug.c direct.c eagen.c error.c expr.c listing.c mach.c macro.c mark.c object.c procln.c risca.c rmac.c sect.c symbol.c token.c +SRCS = amode.c debug.c direct.c eagen.c error.c expr.c listing.c mach.c macro.c mark.c object.c procln.c riscasm.c rmac.c sect.c symbol.c token.c -OBJS = amode.o debug.o direct.o eagen.o error.o expr.o listing.o mach.o macro.o mark.o object.o procln.o risca.o rmac.o sect.o symbol.o token.o +OBJS = amode.o debug.o direct.o eagen.o error.o expr.o listing.o mach.o macro.o mark.o object.o procln.o riscasm.o rmac.o sect.o symbol.o token.o # # Build everything diff --git a/mark.c b/mark.c index 0ca98f0..eacebf5 100644 --- a/mark.c +++ b/mark.c @@ -9,7 +9,7 @@ #include "mark.h" #include "error.h" #include "object.h" -#include "risca.h" +#include "riscasm.h" MCHUNK * firstmch; // First mark chunk diff --git a/object.c b/object.c index c2b8d53..4f9309a 100644 --- a/object.c +++ b/object.c @@ -11,7 +11,7 @@ #include "symbol.h" #include "mark.h" #include "error.h" -#include "risca.h" +#include "riscasm.h" LONG symsize = 0; // Size of BSD symbol table LONG strindx = 0x00000004; // BSD string table index diff --git a/procln.c b/procln.c index ab9d53a..4ab0f7d 100644 --- a/procln.c +++ b/procln.c @@ -16,7 +16,7 @@ #include "direct.h" #include "macro.h" #include "symbol.h" -#include "risca.h" +#include "riscasm.h" #define DEF_KW // Declare keyword values #include "kwtab.h" // Incl generated keyword tables & defs @@ -375,12 +375,14 @@ normal: { if ((equtyp == EQUREG) && (sy->sattre & UNDEF_EQUR)) { - sy->sattre |= ~UNDEF_EQUR; +//REALLY? sy->sattre |= ~UNDEF_EQUR; + sy->sattre &= ~UNDEF_EQUR; sy->svalue = 0; } else if ((equtyp == CCDEF) && (sy->sattre & UNDEF_CC)) { - sy->sattre |= ~UNDEF_CC; +//REALLY? sy->sattre |= ~UNDEF_CC; + sy->sattre &= ~UNDEF_CC; sy->svalue = 0; } else diff --git a/risca.c b/riscasm.c similarity index 98% rename from risca.c rename to riscasm.c index 472e4f1..fbc8f81 100644 --- a/risca.c +++ b/riscasm.c @@ -6,7 +6,7 @@ // Source Utilised with the Kind Permission of Landon Dyer // -#include "risca.h" +#include "riscasm.h" #include "error.h" #include "sect.h" #include "token.h" @@ -171,6 +171,15 @@ int GetRegister(WORD rattr) if ((challoc - ch_size) < 4) chcheck(4L); + // See if this symbol has been defined, then undefined: +//does nothing +//segfaults now (esym == NULL?) +/* if (esym->sattre & UNDEF_EQUR) + { + error("undefined register"); + return ERROR; + }*/ + if (!(eattr & DEFINED)) { fixup((WORD)(FU_WORD | rattr), sloc, r_expr); diff --git a/risca.h b/riscasm.h similarity index 100% rename from risca.h rename to riscasm.h diff --git a/rmac.c b/rmac.c index 8dde4c6..02bdcfd 100644 --- a/rmac.c +++ b/rmac.c @@ -15,7 +15,7 @@ #include "sect.h" #include "mark.h" #include "macro.h" -#include "risca.h" +#include "riscasm.h" #include "direct.h" #include "version.h" #include "debug.h" diff --git a/sect.c b/sect.c index 21591a0..b8d6240 100644 --- a/sect.c +++ b/sect.c @@ -13,7 +13,7 @@ #include "listing.h" #include "mach.h" #include "mark.h" -#include "risca.h" +#include "riscasm.h" #include "symbol.h" #include "token.h" diff --git a/symbol.c b/symbol.c index f10c55a..f8d8424 100644 --- a/symbol.c +++ b/symbol.c @@ -151,13 +151,14 @@ SYM * lookup(char * name, int type, int envno) if (symbol->stype == type // Type, envno and name must match && symbol->senv == envno && *name == *symbol->sname // Fast check for first character - && !strcmp(name, symbol->sname)) + && !strcmp(name, symbol->sname)) // More expensive check break; symbol = symbol->snext; } - return symbol; // Return NULL or matching symbol + // Return NULL or matching symbol + return symbol; } diff --git a/token.h b/token.h index becd074..0109489 100644 --- a/token.h +++ b/token.h @@ -10,7 +10,6 @@ #define __TOKEN_H__ #include "rmac.h" -//#include "risca.h" // Include Files and Macros #define SRC_IFILE 0 // Input source is IFILE diff --git a/version.h b/version.h index 0187394..3017afc 100644 --- a/version.h +++ b/version.h @@ -13,6 +13,6 @@ #define MAJOR 1 // Major version number #define MINOR 2 // Minor version number -#define PATCH 2 // Patch release number +#define PATCH 3 // Patch release number #endif // __VERSION_H__