X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=procln.c;h=727b9dbb5f5cb630544c4c95435b4a3387248572;hp=743c9b96e13b61da115d038dc8f529578849eee7;hb=bcd800a128cf43be03cf6a7ea54b4fc404b3ed8d;hpb=b10167d55798ea184f97fafda075255c0852f3b6 diff --git a/procln.c b/procln.c index 743c9b9..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 @@ -171,7 +175,8 @@ loop1: // Internal line processing loop // First token MUST be a symbol if (*tok != SYMBOL) { - error(syntax_error); +// error(syntax_error); + error("syntax error; expected symbol"); goto loop; } @@ -198,23 +203,31 @@ 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; } } } - if (*tok == EOL) // EOL is legal here... + // EOL is legal here... + if (*tok == EOL) goto normal; // Next token MUST be a symbol if (*tok++ != SYMBOL) { - error(syntax_error); +// error(syntax_error); + error("syntax error; expected symbol"); goto loop; } @@ -259,11 +272,11 @@ as68label: siz = SIZN; if (*tok == DOTW) - siz = SIZW, ++tok; + siz = SIZW, tok++; else if (*tok == DOTL) - siz = SIZL, ++tok; + siz = SIZL, tok++; else if (*tok == DOTB) - siz = SIZB, ++tok; + siz = SIZB, tok++; // Do special directives (500..999) (These must be handled in "real time") if (state >= 500 && state < 1000) @@ -313,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); @@ -323,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(); } @@ -567,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); @@ -614,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 @@ -731,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 //