//
// 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 registerbank; // RISC register bank
- 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;
}
*/
// 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 ",<bank #>" override notation
- if ((tok[1] == ',') && (tok[2] == CONST))
+ 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))
{
- // 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
// 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;
}
else
{
- error("invalid GPU/DSP .equr/.regequ definition");
+ error("invalid .equr/.regequ definition");
goto loop;
}
}
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;
}
-