From: Shamus Hammons Date: Fri, 14 Mar 2014 15:48:53 +0000 (-0500) Subject: Fixed ignored label on rept line (bug #18) X-Git-Tag: 1.3.0~2 X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=commitdiff_plain;h=bcd800a128cf43be03cf6a7ea54b4fc404b3ed8d Fixed ignored label on rept line (bug #18) --- diff --git a/error.h b/error.h index 3a3551c..255027a 100644 --- a/error.h +++ b/error.h @@ -27,5 +27,6 @@ int warni(const char *, unsigned); int interror(int); void cantcreat(const char *); void err_setup(void); +int at_eol(void); #endif // __ERROR_H__ diff --git a/procln.c b/procln.c index 5ae5c5e..727b9db 100644 --- a/procln.c +++ b/procln.c @@ -89,6 +89,10 @@ LONG amsktab[0112] = { }; // 0112 length +// Function prototypes +int HandleLabel(char *, int); + + // // Initialize Line Processor // @@ -123,7 +127,7 @@ void Assemble(void) SYM * sy, * sy2; // Symbol (temp usage) char * opname = NULL; // Name of dirctve/mnemonic/macro int listflag; // 0: Don't call listeol() - int as68mode = 0; // 1: Handle multiple labels +// int as68mode = 0; // 1: Handle multiple labels WORD rmask; // Register list, for REG int registerbank; // RISC register bank int riscreg; // RISC register @@ -199,12 +203,18 @@ as68label: // and come back at `as68label' above. if (as68_flag) { - as68mode = 0; +// as68mode = 0; + // Looks like another label follows the previous one, so handle + // the previous one if (*tok == SYMBOL && tok[2] == ':') { - as68mode = 1; - goto do_label; +// as68mode = 1; +// goto do_label; + if (HandleLabel(label, labtyp) != 0) + goto loop; + + goto as68label; } } } @@ -316,6 +326,7 @@ as68label: case MN_ENDM: // .endm --- same as .exitm if (!disabled) { + // Label on a macro definition is bad mojo... Warn the user if (label != NULL) warn(lab_ignored); @@ -326,8 +337,17 @@ as68label: case MN_REPT: if (!disabled) { +#if 0 if (label != NULL) warn(lab_ignored); +#else + // Handle labels on REPT directive lines... + if (label) + { + if (HandleLabel(label, labtyp) != 0) + goto loop; + } +#endif defrept(); } @@ -570,6 +590,7 @@ checking to see if it's already been equated, issue a warning. if (label != NULL) { do_label: +#if 0 // Check for dot in front of label; means this is a local label if present j = (*label == '.' ? curenv : 0); sy = lookup(label, LABEL, j); @@ -617,10 +638,14 @@ do_label: sy->sattr |= GLOBAL; } - +#else + // Non-zero == error occurred + if (HandleLabel(label, labtyp) != 0) + goto loop; +#endif // If we're in as68 mode, and there's another label, go back and handle it - if (as68_flag && as68mode) - goto as68label; +// if (as68_flag && as68mode) +// goto as68label; } // Punt on EOL @@ -734,6 +759,57 @@ do_label: } +// +// Handle the creation of labels +// +int HandleLabel(char * label, int labelType) +{ + // Check for dot in front of label; means this is a local label if present + int j = (*label == '.' ? curenv : 0); + SYM * sy = lookup(label, LABEL, j); + + if (sy == NULL) + { + sy = NewSymbol(label, LABEL, j); + sy->sattr = 0; + sy->sattre = RISCSYM; + } + else if (sy->sattr & DEFINED) + return errors("multiply-defined label '%s'", label); + + // Put symbol in "order of definition" list + if (!(sy->sattr & SDECLLIST)) + sym_decl(sy); + + if (orgactive) + { + sy->svalue = orgaddr; + sy->sattr |= ABS | DEFINED | EQUATED; + } + else + { + sy->svalue = sloc; + sy->sattr |= DEFINED | cursect; + } + + lab_sym = sy; + + if (!j) + curenv++; + + // Make label global if it has a double colon + if (labelType == DCOLON) + { + if (j) + return error(locgl_error); + + sy->sattr |= GLOBAL; + } + + return 0; +} + + // // .if, Start Conditional Assembly // diff --git a/procln.h b/procln.h index 518e145..05d481c 100644 --- a/procln.h +++ b/procln.h @@ -20,17 +20,14 @@ extern const char syntax_error[]; extern const char extra_stuff[]; extern int just_bss; extern VALUE pcloc; -//extern IFENT * ifent; extern SYM * lab_sym; extern LONG amsktab[]; // Prototypes void InitLineProcessor(void); void Assemble(void); -int eject(void); int d_if(void); int d_else(void); int d_endif(void); -int at_eol(void); #endif // __PROCLN_H__ diff --git a/version.h b/version.h index f07b812..0302423 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 12 // Patch release number +#define PATCH 13 // Patch release number #endif // __VERSION_H__