X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=procln.c;h=463ed1db9d461dbc928c3fc4653e19b67dcb8f7a;hp=ae2b2b857dceeb144879a8e86f1b759fc1f7e18f;hb=HEAD;hpb=c77f5e305ec19e7d445bdd138187ca7458ba5a16 diff --git a/procln.c b/procln.c index ae2b2b8..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,8 +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 registerbank; // RISC register bank - int riscreg; // RISC register + int equreg; // RISC register listflag = 0; // Initialise listing flag loop: // Line processing loop label @@ -201,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; } @@ -436,36 +432,22 @@ When checking to see if it's already been equated, issue a warning. */ // Check for register to equate to - if ((*tok >= KW_R0) && (*tok <= KW_R31)) + // 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)) { -// sy->sattre = EQUATEDREG | RISCSYM; // Mark as equated register - sy->sattre = EQUATEDREG; // Mark as equated register - riscreg = (*tok); - - // Default is current state of "regbank" - registerbank = regbank; - - // Check for "," override notation - if ((tok[1] == ',') && (tok[2] == CONST)) + 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)) { - // Advance token pointer to the constant - tok += 3; - - // Anything other than a 0 or a 1 will result in "No Bank" - if (*(uint64_t *)tok == 0) - registerbank = BANK_0; - else if (*(uint64_t *)tok == 1) - registerbank = BANK_1; - - // Advance half-way through the 64-bit const. - // The code below, expecting a regular token, - // will advance past the second half. - tok++; + // Advance token pointer and skip everything + tok += 4; } - sy->sattre |= registerbank; // Store register bank eattr = ABS | DEFINED | GLOBAL; - eval = riscreg; + eval = equreg; tok++; } // Checking for a register symbol @@ -476,12 +458,12 @@ When checking to see if it's already been equated, issue a warning. // Make sure symbol is a valid equreg if (!sy2 || !(sy2->sattre & EQUATEDREG)) { - error("invalid GPU/DSP .equr/.regequ definition"); + error("invalid .equr/.regequ definition"); goto loop; } else { - eattr = ABS | DEFINED | GLOBAL; // Copy symbols attributes + eattr = ABS | DEFINED | GLOBAL; // Copy symbol's attributes sy->sattre = sy2->sattre; eval = (sy2->svalue & 0xFFFFF0FF); tok += 2; @@ -489,7 +471,7 @@ When checking to see if it's already been equated, issue a warning. } else { - error("invalid GPU/DSP .equr/.regequ definition"); + error("invalid .equr/.regequ definition"); goto loop; } } @@ -757,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; } @@ -802,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; } @@ -836,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 // @@ -891,4 +875,3 @@ int HandleLabel(char * label, int labelType) return 0; } -