mirror of http://shamusworld.gotdns.org/git/rmac
.equr overhaul part 4: handle equrundef (and the other permutations of the directive)
This commit is contained in:
parent
f23a0935e1
commit
1df6df8dae
4
kw.tab
4
kw.tab
|
@ -75,6 +75,10 @@ equ 61
|
|||
reg 82
|
||||
.equr 148
|
||||
equr 148
|
||||
.equrundef 50
|
||||
equrundef 50
|
||||
.regundef 50
|
||||
regundef 50
|
||||
.regequ 148
|
||||
regequ 148
|
||||
set 149
|
||||
|
|
12
rmac.h
12
rmac.h
|
@ -39,7 +39,6 @@
|
|||
#define STRINGIZE(x) STRINGIZE_HELPER(x)
|
||||
#define WARNING(desc) __pragma(message(__FILE__ "(" STRINGIZE(__LINE__) ") : Warning: " #desc))
|
||||
#define inline __inline
|
||||
|
||||
// usage:
|
||||
// WARNING(FIXME: Code removed because...)
|
||||
|
||||
|
@ -159,6 +158,17 @@
|
|||
#include <dirent.h>
|
||||
#include "symbol.h"
|
||||
|
||||
#if defined(WIN32) || defined(WIN64)
|
||||
// Ever since Visual Studio... 2017? 2019? the following constants come defined in the
|
||||
// platform SDK, which leads to endless warnings from the compiler. So let's just
|
||||
// put the pacifier on and undef them, sheesh! (No, we won't rename the defines,
|
||||
// we've been here since 1986, Visual Studio wasn't even a glimpse in the milkman's eyes,
|
||||
// if you catch my drift)
|
||||
#undef CONST
|
||||
#undef ERROR
|
||||
#undef TEXT
|
||||
#endif
|
||||
|
||||
#define BYTE uint8_t
|
||||
#define WORD uint16_t
|
||||
#define LONG uint32_t
|
||||
|
|
58
token.c
58
token.c
|
@ -975,6 +975,7 @@ int TokenizeLine(void)
|
|||
uint8_t c1;
|
||||
int stringNum = 0; // Pointer to string locations in tokenized line
|
||||
SYM* sy; // For looking up symbols (.equr)
|
||||
int equrundef = 0; // Flag for equrundef scanning
|
||||
|
||||
retry:
|
||||
|
||||
|
@ -1200,38 +1201,51 @@ DEBUG { printf("TokenizeLine: Calling fpop() from SRC_IFILE...\n"); }
|
|||
case 121: // date
|
||||
j = -1;
|
||||
}
|
||||
|
||||
// If we detected equrundef/regundef set relevant flag
|
||||
if (j == KW_EQURUNDEF)
|
||||
{
|
||||
equrundef = 1;
|
||||
j = -1;
|
||||
//printf("line %d, equrundef found\n", curlineno);
|
||||
}
|
||||
|
||||
// If not tokenized keyword OR token was not found
|
||||
if ((j < 0) || (state < 0))
|
||||
{
|
||||
// Last attempt: let's see if this is an equated register
|
||||
char temp = *ln;
|
||||
*ln = 0;
|
||||
sy = lookup(nullspot, LABEL, 0);
|
||||
*ln = temp;
|
||||
if (sy)
|
||||
// Only proceed if no equrundef has been detected. In that case we need to store the symbol
|
||||
// because the directive handler (d_equrundef) will run outside this loop, further into procln.c
|
||||
if (!equrundef)
|
||||
{
|
||||
if (sy->sattre & EQUATEDREG)
|
||||
// Last attempt: let's see if this is an equated register
|
||||
char temp = *ln;
|
||||
*ln = 0;
|
||||
sy = lookup(nullspot, LABEL, 0);
|
||||
*ln = temp;
|
||||
if (sy)
|
||||
{
|
||||
uint32_t register_token = sy->svalue;
|
||||
if (rgpu || rdsp)
|
||||
if (sy->sattre & EQUATEDREG)
|
||||
{
|
||||
// If we are in GPU or DSP mode then mark the register bank.
|
||||
// We will use it during EvaluateRegisterFromTokenStream()
|
||||
// when we check if we can use the equated register with the currently
|
||||
// selected bank.
|
||||
// Note (ggn): I find all this superfluous. Do we really want to be so
|
||||
// protective? Plus, the current implementation happily skips
|
||||
// these checks on .equr that are set during fixups - oops!
|
||||
register_token |= 0x80000000; // Mark that this is an .equr
|
||||
if (sy->sattre & BANK_1)
|
||||
uint32_t register_token = sy->svalue;
|
||||
if (rgpu || rdsp)
|
||||
{
|
||||
register_token |= 0x40000000; // Mark bank 1
|
||||
// If we are in GPU or DSP mode then mark the register bank.
|
||||
// We will use it during EvaluateRegisterFromTokenStream()
|
||||
// when we check if we can use the equated register with the currently
|
||||
// selected bank.
|
||||
// Note (ggn): I find all this superfluous. Do we really want to be so
|
||||
// protective? Plus, the current implementation happily skips
|
||||
// these checks on .equr that are set during fixups - oops!
|
||||
register_token |= 0x80000000; // Mark that this is an .equr
|
||||
if (sy->sattre & BANK_1)
|
||||
{
|
||||
register_token |= 0x40000000; // Mark bank 1
|
||||
}
|
||||
}
|
||||
*tk.u32++ = register_token;
|
||||
stuffnull = 0;
|
||||
continue;
|
||||
}
|
||||
*tk.u32++ = register_token;
|
||||
stuffnull = 0;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
// Ok, that failed, let's store the symbol instead
|
||||
|
|
2
token.h
2
token.h
|
@ -30,7 +30,7 @@
|
|||
#define TOKBUFSIZE 4096 // Size of token-line buffer
|
||||
#define QUANTUM 4096L // # bytes to eat at a time from a file
|
||||
#define LNBUFSIZ (QUANTUM*2) // Size of file's buffer
|
||||
#define KWSIZE 7 // Maximum size of keyword in kwtab.h
|
||||
#define KWSIZE 10 // Maximum size of keyword in kwtab.h
|
||||
|
||||
// (Normally) non-printable tokens
|
||||
#define COLON ':' // : (grumble: GNUmacs hates ':')
|
||||
|
|
Loading…
Reference in New Issue