//
// 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
//
#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
#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
M_FPSCR // 0123
}; // 0123 length
-
// Function prototypes
int HandleLabel(char *, int);
-
//
// Initialize line processor
//
ifent0.if_state = 0;
}
-
//
// Line processor
//
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
// 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;
}
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 ",<bank #>" 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 ",<bank #>" 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)
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;
}
// Call special-mode handler
if (m->mnattr & CGSPECIAL)
{
+ GENLINENOSYM();
(*m->mnfunc)(m->mninst, siz);
goto loop;
}
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
//
return 0;
}
-