X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=procln.c;h=8cdcc6af2501cd5e8b1886cbe76e3813a63a46d9;hp=85721e878bf1b1258c6640d55d4044ed4167a5ca;hb=HEAD;hpb=d21544da607af148b96a9d926d4564800892aa4e diff --git a/procln.c b/procln.c index 85721e8..463ed1d 100644 --- a/procln.c +++ b/procln.c @@ -1,7 +1,7 @@ // // RMAC - Renamed Macro Assembler for all Atari computers // PROCLN.C - Line Processing -// Copyright (C) 199x Landon Dyer, 2011-2021 Reboot and Friends +// Copyright (C) 199x Landon Dyer, 2011-2022 Reboot and Friends // RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986 // Source utilised with the kind permission of Landon Dyer // @@ -28,6 +28,8 @@ #define DEF_MN // Incl 68k keyword definitions #define DECL_MN // Incl 68k keyword state machine tables #include "mntab.h" +#define DEF_REG68 // Incl 68k register definitions +#include "68kregs.h" #define DEF_MR #define DECL_MR @@ -44,7 +46,8 @@ #define DEF_DSP // Include DSP56K keywords definitions #define DECL_DSP // Include DSP56K keyword state machine tables #include "dsp56kkw.h" - +#define DEF_REG56 // Include DSP56K register definitions +#include "56kregs.h" IFENT * ifent; // Current ifent static IFENT ifent0; // Root ifent @@ -114,11 +117,9 @@ LONG amsktab[0124] = { M_FPSCR // 0123 }; // 0123 length - // Function prototypes int HandleLabel(char *, int); - // // Initialize line processor // @@ -130,7 +131,6 @@ void InitLineProcessor(void) ifent0.if_state = 0; } - // // Line processor // @@ -154,7 +154,7 @@ void Assemble(void) char * opname = NULL; // Name of dirctve/mnemonic/macro int listflag; // 0: Don't call listeol() WORD rmask; // Register list, for REG - int riscreg; // RISC register + int equreg; // RISC register listflag = 0; // Initialise listing flag loop: // Line processing loop label @@ -200,10 +200,7 @@ loop1: // Internal line processing loop // First token MUST be a symbol (Shamus: not sure why :-/) if (*tok != SYMBOL) { - if ((*tok >= KW_D0) && (*tok <= KW_R31)) - error("cannot use reserved keyword as label name or .equ"); - else - error("syntax error; expected symbol"); + error("syntax error; expected symbol"); goto loop; } @@ -434,57 +431,48 @@ corresponding register bool to true. Whenever it's undef'ed, set it to false. When checking to see if it's already been equated, issue a warning. */ - if (rgpu || rdsp) + // Check for register to equate to + // This check will change once we split the registers per architecture into their own tables + // and out of kw.tab. But for now it'll do... + if ((*tok >= REG68_D0) && (*tok <= REG56_BA)) { - // GPU/DSP architectures need some special TLC for now - // Check for register to equate to - if ((*tok >= KW_R0) && (*tok <= KW_R31)) + sy->sattre = EQUATEDREG; // Mark as equated register + equreg = *tok; + // Check for "," override notation and skip past it. + // It is ignored now. Was that ever useful anyway? + if ((rgpu ||rdsp) && (tok[1] == ',') && (tok[2] == CONST)) { - sy->sattre = EQUATEDREG; // Mark as equated register - riscreg = *tok; - // Check for "," override notation and skip past it. - // It is ignored now. Was that ever useful anyway? - if ((tok[1] == ',') && (tok[2] == CONST)) - { - // Advance token pointer and skip everything - tok += 4; - } - - eattr = ABS | DEFINED | GLOBAL; - eval = riscreg; - tok++; + // Advance token pointer and skip everything + tok += 4; } - // Checking for a register symbol - else if (tok[0] == SYMBOL) - { - sy2 = lookup(string[tok[1]], LABEL, j); - // Make sure symbol is a valid equreg - if (!sy2 || !(sy2->sattre & EQUATEDREG)) - { - error("invalid GPU/DSP .equr/.regequ definition"); - goto loop; - } - else - { - eattr = ABS | DEFINED | GLOBAL; // Copy symbol's attributes - sy->sattre = sy2->sattre; - eval = (sy2->svalue & 0xFFFFF0FF); - tok += 2; - } + eattr = ABS | DEFINED | GLOBAL; + eval = equreg; + tok++; + } + // Checking for a register symbol + else if (tok[0] == SYMBOL) + { + sy2 = lookup(string[tok[1]], LABEL, j); + + // Make sure symbol is a valid equreg + if (!sy2 || !(sy2->sattre & EQUATEDREG)) + { + error("invalid .equr/.regequ definition"); + goto loop; } else { - error("invalid GPU/DSP .equr/.regequ definition"); - goto loop; + eattr = ABS | DEFINED | GLOBAL; // Copy symbol's attributes + sy->sattre = sy2->sattre; + eval = (sy2->svalue & 0xFFFFF0FF); + tok += 2; } } else { - sy->sattre = EQUATEDREG; // Mark as equated register - eattr = ABS | DEFINED | GLOBAL; - eval = *tok; - tok++; + error("invalid .equr/.regequ definition"); + goto loop; } } else if (equtyp == REG) @@ -751,6 +739,7 @@ When checking to see if it's already been equated, issue a warning. while ((dsp_am0 & md->mn0) == 0 || (dsp_am1 & md->mn1) == 0) md = &dsp56k_machtab[md->mncont]; + GENLINENOSYM(); (*md->mnfunc)(md->mninst | (parcode << 8)); goto loop; } @@ -796,6 +785,7 @@ When checking to see if it's already been equated, issue a warning. // Call special-mode handler if (m->mnattr & CGSPECIAL) { + GENLINENOSYM(); (*m->mnfunc)(m->mninst, siz); goto loop; } @@ -830,11 +820,11 @@ When checking to see if it's already been equated, issue a warning. DEBUG { printf(" 68K: mninst=$%X, siz=$%X, mnattr=$%X, amsk0=$%X, mn0=$%X, amsk1=$%X, mn1=$%X\n", m->mninst, siz, m->mnattr, amsk0, m->mn0, amsk1, m->mn1); } + GENLINENOSYM(); (*m->mnfunc)(m->mninst, siz); goto loop; } - // // Handle the creation of labels // @@ -885,4 +875,3 @@ int HandleLabel(char * label, int labelType) return 0; } -