// DIRECT.C - Directive Handling
// Copyright (C) 199x Landon Dyer, 2011 Reboot and Friends
// RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986
-// Source Utilised with the Kind Permission of Landon Dyer
+// Source utilised with the kind permission of Landon Dyer
//
#include "direct.h"
TOKEN exprbuf[128]; // Expression buffer
SYM * symbolPtr[1000000]; // Symbol pointers table
static long unused; // For supressing 'write' warnings
+char buffer[256]; // Scratch buffer for messages
// Directive handler table
//
-// 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)
switch(*tok)
{
case STRING:
-// sprintf(prntstr, "%s", (char *)tok[1]);
sprintf(prntstr, "%s", string[tok[1]]);
printf("%s", prntstr);
}
printf("\n");
-// println("\n");
return 0;
//
-// Undefine an Equated Condition Code
+// Undefine an equated condition code
//
int d_ccundef(void)
{
if (*tok != SYMBOL)
{
-// error(syntax_error);
error("syntax error; expected symbol");
return ERROR;
}
-// ccname = lookup((char *)tok[1], LABEL, 0);
ccname = lookup(string[tok[1]], LABEL, 0);
// Make sure symbol is a valid ccdef
//
-// 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)
{
unsigned skip = (rgpu || rdsp ? orgaddr : sloc) & 0x01;
-// if (sloc & 1)
if (skip)
{
if ((scattr & SBSS) == 0)
//
-// 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)
{
char buf[128];
char buf1[128];
- if (*tok == STRING) // Leave strings ALONE
-#if 0
- fn = (char *)*++tok;
-#else
+ if (*tok == STRING) // Leave strings ALONE
fn = string[*++tok];
-#endif
- else if (*tok == SYMBOL) // Try to append ".s" to symbols
+ else if (*tok == SYMBOL) // Try to append ".s" to symbols
{
-#if 0
- strcpy(buf, (char *)*++tok);
-#else
strcpy(buf, string[*++tok]);
-#endif
fext(buf, ".s", 0);
fn = &buf[0];
}
- else // Punt if no STRING or SYMBOL
+ else // Punt if no STRING or SYMBOL
return error("missing filename");
// Make sure the user didn't try anything like:
//
-// Switch Segments
+// Switch segments
//
-
int d_text(void)
{
if (rgpu || rdsp)
// dc.b 'string' [,] ...
if (siz == SIZB && *tok == STRING && (tok[2] == ',' || tok[2] == EOL))
{
-// i = strlen((const char*)tok[1]);
i = strlen(string[tok[1]]);
if ((challoc - ch_size) < i)
return error("non-absolute byte value");
if (eval + 0x100 >= 0x200)
- return error(range_error);
+ {
+ sprintf(buffer, "%s (value = $%X)", range_error, eval);
+// return error(range_error);
+ return error(buffer);
+ }
D_byte(eval);
}
if (*tok != SYMBOL)
return error("missing symbol");
-// p = (char *)tok[1];
p = string[tok[1]];
tok += 2;
//
-// .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)
{
{
if (*tok == SYMBOL)
{
-// p = (char *)tok[1];
p = string[tok[1]];
-#if 0
- if (*p == '.')
- env = curenv; // Label is local
- else
- env = 0; // Label is global
-#else
// Set env to either local (dot prefixed) or global scope
env = (*p == '.' ? curenv : 0);
-#endif
symbol = lookup(p, LABEL, env);
if (symbol == NULL)
return errors("multiply-defined label '%s'", p);
// Put symbol in "order of definition" list
- if (!(symbol->sattr & SDECLLIST))
- AddToSymbolOrderList(symbol);
+ AddToSymbolDeclarationList(symbol);
symbol->sattr |= (ABS | DEFINED | EQUATED);
symbol->svalue = eval;
if (reglist(&rlist) < 0)
return 0;
-// for(i=0; i++<16; rlist>>=1)
for(i=0; i<16; i++, rlist>>=1)
{
if (rlist & 1)
return errors("multiply-defined label '%s'", symbolName);
// Put symbol in "order of definition" list
- if (!(symbol->sattr & SDECLLIST))
- AddToSymbolOrderList(symbol);
+ AddToSymbolDeclarationList(symbol);
tok += 2;