.equr overhaul part 4: handle equrundef (and the other permutations of the directive)

This commit is contained in:
ggn 2022-03-07 18:50:33 +02:00 committed by Shamus Hammons
parent f23a0935e1
commit 1df6df8dae
4 changed files with 52 additions and 24 deletions

4
kw.tab
View File

@ -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
View File

@ -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
View File

@ -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

View File

@ -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 ':')