X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=procln.c;h=eb7428121e8b2b4d1cd44576afd0f8449c711d11;hp=f5a806b0bf9bbb7c0592a313a17d17dad99b39df;hb=66b362fa203d0850e8dce8045adb454e354c22ce;hpb=ff8188b7e279f99cf11ac8a283c4146af324d26f diff --git a/procln.c b/procln.c index f5a806b..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 @@ -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; } @@ -465,12 +467,11 @@ When checking to see if it's already been equated, issue a warning. { // Advance token pointer to the constant tok += 3; - tok++; // Skip the hi LONG, so pointing at lo LONG // 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; } @@ -487,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++; } @@ -550,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); @@ -560,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; } @@ -580,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; @@ -666,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) { @@ -756,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)