//
-// Print Directive
+// Print directive
//
int d_print(void)
{
- char prntstr[LNSIZ]; // String for PRINT directive
- char format[LNSIZ]; // Format for PRINT directive
- int formatting = 0; // Formatting on/off
- int wordlong = 0; // WORD = 0, LONG = 1
- int outtype = 0; // 0:hex, 1:decimal, 2:unsigned
-
- VALUE eval; // Expression value
- WORD eattr; // Expression attributes
- SYM * esym; // External symbol involved in expr.
+ char prntstr[LNSIZ]; // String for PRINT directive
+ char format[LNSIZ]; // Format for PRINT directive
+ int formatting = 0; // Formatting on/off
+ int wordlong = 0; // WORD = 0, LONG = 1
+ int outtype = 0; // 0:hex, 1:decimal, 2:unsigned
+
+ VALUE eval; // Expression value
+ WORD eattr; // Expression attributes
+ SYM * esym; // External symbol involved in expr.
TOKEN r_expr[EXPRSIZE];
while (*tok != EOL)
//
-// Undefine an Equated Condition Code
+// Undefine an equated condition code
//
int d_ccundef(void)
{
//
-// Undefine an Equated Register
+// Undefine an equated register
//
int d_equrundef(void)
{
regname = lookup(string[tok[1]], LABEL, 0);
if (regname && (regname->sattre & EQUATEDREG))
+ {
+ // Reset the attributes of this symbol...
+ regname->sattr = 0;
+ regname->sattre &= ~(EQUATEDREG | BANK_0 | BANK_1);
regname->sattre |= UNDEF_EQUR;
+ }
// Skip over symbol token and address
tok += 2;
//
-// Do Not Allow the Use of the CLR.L Opcode
+// Do not allow use of the CLR.L opcode
//
int d_noclear(void)
{
//
-// Include Binary File
+// Include binary file
//
int d_incbin(void)
{
//
-// Set RISC Register Banks
+// Set RISC register banks
//
int d_regbank0(void)
{
//
-// Adjust Location to an EVEN Value
+// Adjust location to an EVEN value
//
int d_even(void)
{
//
-// Adjust Location to an LONG Value
+// Adjust location to a LONG value
//
int d_long(void)
{
//
-// Adjust Location to an PHRASE Value
+// Adjust location to a PHRASE value
//
// N.B.: We have to handle the GPU/DSP cases separately because you can embed
// RISC code in the middle of a regular 68K section. Also note that all
//
-// Adjust Location to an DPHRASE Value
+// Adjust location to a DPHRASE value
//
int d_dphrase(void)
{
//
-// Adjust Location to an QPHRASE Value
+// Adjust location to a QPHRASE value
//
int d_qphrase(void)
{
void auto_even(void)
{
if (scattr & SBSS)
- sloc++; // Bump BSS section
+ sloc++; // Bump BSS section
else
- D_byte(0); // Deposit 0.b in non-BSS
+ D_byte(0); // Deposit 0.b in non-BSS
- if (lab_sym != NULL) // Bump label if we have to
- ++lab_sym->svalue;
+ if (lab_sym != NULL) // Bump label if we have to
+ lab_sym->svalue++;
}
//
-// Unimplemened Directive Error
+// Unimplemened directive error
//
int d_unimpl(void)
{
//
-// Switch Segments
+// Switch segments
//
-
int d_text(void)
{
if (rgpu || rdsp)
//
-// .gpu - Switch to GPU Assembler
+// .gpu - Switch to GPU assembler
//
int d_gpu(void)
{
//
-// .dsp - Switch to DSP Assembler
+// .dsp - Switch to DSP assembler
//
int d_dsp(void)
{
symbol->sattr |= REFERENCED;
- // Check for undefined register equates
- if (symbol->sattre & UNDEF_EQUR)
+ // Check for undefined register equates, but only if it's not part
+ // of a #<SYMBOL> construct, as it could be that the label that's
+ // been undefined may later be used as an address label--which
+ // means it will be fixed up later, and thus, not an error.
+ if ((symbol->sattre & UNDEF_EQUR) && !riscImmTokenSeen)
{
errors("undefined register equate '%s'", symbol->sname);
//if we return right away, it returns some spurious errors...
}
else
{
- // Unknown type here... Alert the user!
+ // Unknown type here... Alert the user!,
error("undefined RISC register in expression");
// Prevent spurious error reporting...
tok++;
unsigned orgaddr = 0; // Org'd address
unsigned orgwarning = 0; // Has an ORG warning been issued
int lastOpcode = -1; // Last RISC opcode assembled
+uint8_t riscImmTokenSeen; // The '#' (immediate) token was seen
const char reg_err[] = "missing register R0...R31";
// Get opcode parameter and type
unsigned short parm = (WORD)(roptbl[state - 3000].parm);
unsigned type = roptbl[state - 3000].typ;
+ riscImmTokenSeen = 0; // Set to "token not seen yet"
// Detect whether the opcode parmeter passed determines that the opcode is
// specific to only one of the RISC processors and ensure it is legal in
return MalformedOpcode(0x01);
tok++;
+ riscImmTokenSeen = 1;
if (expr(r_expr, &eval, &eattr, &esym) != OK)
return MalformedOpcode(0x02);
return MalformedOpcode(0x03);
tok++;
+ riscImmTokenSeen = 1;
if (expr(r_expr, &eval, &eattr, &esym) != OK)
return MalformedOpcode(0x04);