// 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
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;
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
//
int d_noclear(void)
{
+ warn("CLR.L opcode ignored...");
return 0;
}
{
unsigned skip = (rgpu || rdsp ? orgaddr : sloc) & 0x01;
-// if (sloc & 1)
if (skip)
{
if ((scattr & SBSS) == 0)
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:
if ((scattr & SBSS) != 0)
return error("illegal initialization of section");
+ // Do an auto_even if it's not BYTE sized (hmm, should we be doing this???)
if ((siz != SIZB) && (sloc & 1))
auto_even();
+ // Check to see if we're trying to set LONGS on a non 32-bit aligned
+ // address in a GPU or DSP section, in their local RAM
+ if ((siz == SIZL) && (orgaddr & 0x03)
+ && ((rgpu && (orgaddr >= 0xF03000) && (orgaddr <= 0xF03FFFF))
+ || (rdsp && (orgaddr >= 0xF1B000) && (orgaddr <= 0xF1CFFFF))))
+ warn("depositing LONGs on a non-long address in local RAM");
+
for(;; ++tok)
{
// 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(buffer);
+ }
D_byte(eval);
}
if (*tok != SYMBOL)
return error("missing symbol");
-// p = (char *)tok[1];
p = string[tok[1]];
tok += 2;
{
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;