X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=procln.c;h=eb7428121e8b2b4d1cd44576afd0f8449c711d11;hp=3a4aac8316d44c570373b675c6994cddfff00e76;hb=66b362fa203d0850e8dce8045adb454e354c22ce;hpb=cfd001aea60f54e49d9beae0f941c513f45c202b diff --git a/procln.c b/procln.c index 3a4aac8..eb74281 100644 --- a/procln.c +++ b/procln.c @@ -1,7 +1,7 @@ // // RMAC - Reboot's Macro Assembler for all Atari computers // PROCLN.C - Line Processing -// Copyright (C) 199x Landon Dyer, 2011-2017 Reboot and Friends +// Copyright (C) 199x Landon Dyer, 2011-2018 Reboot and Friends // RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986 // Source utilised with the kind permission of Landon Dyer // @@ -15,6 +15,7 @@ #include "listing.h" #include "mach.h" #include "macro.h" +#include "op.h" #include "riscasm.h" #include "sect.h" #include "symbol.h" @@ -34,6 +35,10 @@ #define DECL_MP // Include 6502 keyword state machine tables #include "6502kw.h" +#define DEF_MO // Include OP keyword definitions +#define DECL_MO // Include OP keyword state machine tables +#include "opkw.h" + IFENT * ifent; // Current ifent static IFENT ifent0; // Root ifent IFENT * f_ifent; // Freelist of ifents @@ -131,7 +136,7 @@ void Assemble(void) char * equate; // Symbol (or NULL) int labtyp = 0; // Label type (':', DCOLON) int equtyp = 0; // Equ type ('=', DEQUALS) - uint32_t eval; // Expression value + uint64_t eval; // Expression value WORD eattr; // Expression attributes SYM * esym; // External symbol involved in expr. WORD siz = 0; // Size suffix to mnem/diretve/macro @@ -229,7 +234,7 @@ as68label: if (*tok == EOL) goto normal; - // Next token MUST be a symbol + // First token MUST be a symbol (if we get here, tok didn't advance) if (*tok++ != SYMBOL) { error("syntax error; expected symbol"); @@ -281,7 +286,6 @@ as68label: case DOTX: siz = SIZX, tok++; break; } - // Do special directives (500..999) (These must be handled in "real time") if (state >= 500 && state < 1000) { @@ -399,13 +403,11 @@ normal: { if ((equtyp == EQUREG) && (sy->sattre & UNDEF_EQUR)) { -//REALLY? sy->sattre |= ~UNDEF_EQUR; sy->sattre &= ~UNDEF_EQUR; sy->svalue = 0; } else if ((equtyp == CCDEF) && (sy->sattre & UNDEF_CC)) { -//REALLY? sy->sattre |= ~UNDEF_CC; sy->sattre &= ~UNDEF_CC; sy->svalue = 0; } @@ -467,9 +469,9 @@ When checking to see if it's already been equated, issue a warning. tok += 3; // Anything other than a 0 or a 1 will result in "No Bank" - if (*tok == 0) + if (*(uint64_t *)tok == 0) registerbank = BANK_0; - else if (*tok == 1) + else if (*(uint64_t *)tok == 1) registerbank = BANK_1; } @@ -486,8 +488,6 @@ When checking to see if it's already been equated, issue a warning. sy->sattre |= regbank; // Store register bank #endif eattr = ABS | DEFINED | GLOBAL; -// & what does this $80000080 constant mean??? -// eval = 0x80000080 + (riscreg) + (registerbank << 8); eval = riscreg; tok++; } @@ -549,7 +549,7 @@ When checking to see if it's already been equated, issue a warning. else if (expr(exprbuf, &eval, &eattr, &esym) != OK) goto loop; } - //equ a equr + // equ an equr else if (*tok == SYMBOL) { sy2 = lookup(string[tok[1]], LABEL, j); @@ -559,7 +559,6 @@ When checking to see if it's already been equated, issue a warning. sy->stype = sy2->stype; sy->sattr = sy2->sattr; sy->sattre = sy2->sattre; -//ICK sy->svalue = (sy2->svalue & 0xFFFFF0FF); sy->svalue = sy2->svalue; goto loop; } @@ -579,7 +578,7 @@ When checking to see if it's already been equated, issue a warning. sy->svalue = eval; if (list_flag) // Put value in listing - listvalue(eval); + listvalue((uint32_t)eval); at_eol(); // Must be at EOL now goto loop; @@ -665,6 +664,38 @@ When checking to see if it's already been equated, issue a warning. } } + // If we are in OP mode and still in need of a mnemonic then search for one + if (robjproc && ((state < 0) || (state >= 1000))) + { + for(state=0, p=opname; state>=0;) + { + j = mobase[state] + (int)tolowertab[*p]; + + // Reject, character doesn't match + if (mocheck[j] != state) + { + state = -1; // No match + break; + } + + // Must accept or reject at EOS + if (!*++p) + { + state = moaccept[j]; // (-1 on no terminal match) + break; + } + + state = motab[j]; + } + + // Call OP code generator if we found a mnemonic + if (state >= 3100) + { + GenerateOPCode(state); + goto loop; + } + } + // Invoke macro or complain about bad mnemonic if (state < 0) { @@ -755,7 +786,6 @@ int HandleLabel(char * label, int labelType) { symbol = NewSymbol(label, LABEL, environment); symbol->sattr = 0; -// symbol->sattre = RISCSYM; symbol->sattre = 0; } else if (symbol->sattr & DEFINED)