mirror of http://shamusworld.gotdns.org/git/rmac
.equr overhaul part 5: enabled .equr for all registers for all architectures
This commit is contained in:
parent
d21544da60
commit
09135712da
|
@ -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
8
kw.tab
|
@ -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
|
||||
|
|
73
procln.c
73
procln.c
|
@ -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
1
sect.c
|
@ -20,6 +20,7 @@
|
|||
#include "token.h"
|
||||
#define DEF_KW
|
||||
#include "kwtab.h"
|
||||
#undef DEF_KW
|
||||
|
||||
// Function prototypes
|
||||
void MakeSection(int, uint16_t);
|
||||
|
|
Loading…
Reference in New Issue