.equr overhaul part 5: enabled .equr for all registers for all architectures

This commit is contained in:
ggn 2022-03-07 20:36:37 +02:00 committed by Shamus Hammons
parent d21544da60
commit 09135712da
5 changed files with 40 additions and 48 deletions

View File

@ -1261,11 +1261,11 @@ Directives relating to the 6502 are described in the chapter on `6502 Support`_.
**.equr** *expression*
Allows you to name a register. This is only implemented for GPU/DSP
code sections. For example:
Allows you to name a register. For example:
::
.gpu
Clipw .equr r19
. . .
add ClipW,r0 ; ClipW actually is r19

8
kw.tab
View File

@ -73,14 +73,14 @@ fp7 231
equ 61
.reg 82
reg 82
.equr 148
equr 148
.equr 85
equr 85
.regequ 85
regequ 85
.equrundef 50
equrundef 50
.regundef 50
regundef 50
.regequ 148
regequ 148
set 149
r0 151

View File

@ -154,7 +154,7 @@ void Assemble(void)
char * opname = NULL; // Name of dirctve/mnemonic/macro
int listflag; // 0: Don't call listeol()
WORD rmask; // Register list, for REG
int riscreg; // RISC register
int equreg; // RISC register
listflag = 0; // Initialise listing flag
loop: // Line processing loop label
@ -434,57 +434,48 @@ corresponding register bool to true. Whenever it's undef'ed, set it to false.
When checking to see if it's already been equated, issue a warning.
*/
if (rgpu || rdsp)
// Check for register to equate to
// This check will change once we split the registers per architecture into their own tables
// and out of kw.tab. But for now it'll do...
if ((*tok >= KW_D0) && (*tok <= KW_BA))
{
// GPU/DSP architectures need some special TLC for now
// Check for register to equate to
if ((*tok >= KW_R0) && (*tok <= KW_R31))
sy->sattre = EQUATEDREG; // Mark as equated register
equreg = *tok;
// Check for ",<bank #>" override notation and skip past it.
// It is ignored now. Was that ever useful anyway?
if ((rgpu ||rdsp) && (tok[1] == ',') && (tok[2] == CONST))
{
sy->sattre = EQUATEDREG; // Mark as equated register
riscreg = *tok;
// Check for ",<bank #>" override notation and skip past it.
// It is ignored now. Was that ever useful anyway?
if ((tok[1] == ',') && (tok[2] == CONST))
{
// Advance token pointer and skip everything
tok += 4;
}
eattr = ABS | DEFINED | GLOBAL;
eval = riscreg;
tok++;
// Advance token pointer and skip everything
tok += 4;
}
// Checking for a register symbol
else if (tok[0] == SYMBOL)
{
sy2 = lookup(string[tok[1]], LABEL, j);
// Make sure symbol is a valid equreg
if (!sy2 || !(sy2->sattre & EQUATEDREG))
{
error("invalid GPU/DSP .equr/.regequ definition");
goto loop;
}
else
{
eattr = ABS | DEFINED | GLOBAL; // Copy symbol's attributes
sy->sattre = sy2->sattre;
eval = (sy2->svalue & 0xFFFFF0FF);
tok += 2;
}
eattr = ABS | DEFINED | GLOBAL;
eval = equreg;
tok++;
}
// Checking for a register symbol
else if (tok[0] == SYMBOL)
{
sy2 = lookup(string[tok[1]], LABEL, j);
// Make sure symbol is a valid equreg
if (!sy2 || !(sy2->sattre & EQUATEDREG))
{
error("invalid .equr/.regequ definition");
goto loop;
}
else
{
error("invalid GPU/DSP .equr/.regequ definition");
goto loop;
eattr = ABS | DEFINED | GLOBAL; // Copy symbol's attributes
sy->sattre = sy2->sattre;
eval = (sy2->svalue & 0xFFFFF0FF);
tok += 2;
}
}
else
{
sy->sattre = EQUATEDREG; // Mark as equated register
eattr = ABS | DEFINED | GLOBAL;
eval = *tok;
tok++;
error("invalid .equr/.regequ definition");
goto loop;
}
}
else if (equtyp == REG)

1
sect.c
View File

@ -20,6 +20,7 @@
#include "token.h"
#define DEF_KW
#include "kwtab.h"
#undef DEF_KW
// Function prototypes
void MakeSection(int, uint16_t);

View File

@ -45,7 +45,7 @@
#define DEQUALS 'g' // ==
#define SET 0x95 // Set
#define REG 'R' // Reg
#define EQUREG 0x94 // equreg
#define EQUREG 'U' // equreg (must be synchronised with the equate in kw.tab)
#define CCDEF 0xB7 // ccdef
#define DCOLON 'h' // ::
#define GE 'i' // >=