From c77f5e305ec19e7d445bdd138187ca7458ba5a16 Mon Sep 17 00:00:00 2001 From: ggn Date: Sun, 6 Mar 2022 20:07:19 +0200 Subject: [PATCH] .equr overhaul part 1: remove gpu/dsp only restriction, make sure things still work (they do, but exported equrs do not match, which is weird considering they shouldn't be exported in the first place) --- expr.c | 5 ----- procln.c | 31 ++----------------------------- riscasm.c | 12 ++++++------ 3 files changed, 8 insertions(+), 40 deletions(-) diff --git a/expr.c b/expr.c index 527cb2a..4525754 100644 --- a/expr.c +++ b/expr.c @@ -494,13 +494,8 @@ be converted from a linked list into an array). *a_value = (symbol->sattr & DEFINED ? symbol->svalue : 0); *a_attr = (WORD)(symbol->sattr & ~GLOBAL); -/* -All that extra crap that was put into the svalue when doing the equr stuff is -thrown away right here. What the hell is it for? -*/ if (symbol->sattre & EQUATEDREG) { - *a_value &= 0x1F; *a_attr |= RISCREG; // Mark it as a register, 'cause it is *a_esym = symbol; } diff --git a/procln.c b/procln.c index 77b7b50..ae2b2b8 100644 --- a/procln.c +++ b/procln.c @@ -434,32 +434,16 @@ have an array of bools with 64 entries. Whenever a register is equated, set the 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. */ - // Check that we are in a RISC section - if (!rgpu && !rdsp) - { - error(".equr/.regequ must be defined in .gpu/.dsp section"); - goto loop; - } // Check for register to equate to if ((*tok >= KW_R0) && (*tok <= KW_R31)) { // sy->sattre = EQUATEDREG | RISCSYM; // Mark as equated register sy->sattre = EQUATEDREG; // Mark as equated register - riscreg = (*tok - KW_R0); -//is there any reason to do this, since we're putting this in svalue? -//i'm thinking, no. Let's test that out! :-D -// sy->sattre |= (riscreg << 8); // Store register number -//everything seems to build fine without it... We'll leave it here Just In Case(tm) - -#define DEBODGE_REGBANK -#ifdef DEBODGE_REGBANK + riscreg = (*tok); + // Default is current state of "regbank" registerbank = regbank; -#else - // Default is no register bank specified - registerbank = BANK_N; -#endif // Check for "," override notation if ((tok[1] == ',') && (tok[2] == CONST)) @@ -479,18 +463,7 @@ When checking to see if it's already been equated, issue a warning. tok++; } -#ifdef DEBODGE_REGBANK sy->sattre |= registerbank; // Store register bank -#else -// What needs to happen here is to prime registerbank with regbank, then use -// registerbank down below for the bank marking. -#warning "!!! regbank <-> registerbank confusion here !!!" -// The question here is why, if we're allowed to override the ".regbankN" rules -// above, then why is it using the one set by the directive in the extended -// attributes and not in what ends up in symbol->svalue? -// ".regbankN" is not an original Madmac directive, so it's suspect - sy->sattre |= regbank; // Store register bank -#endif eattr = ABS | DEFINED | GLOBAL; eval = riscreg; tok++; diff --git a/riscasm.c b/riscasm.c index 5681f35..fb6c5ce 100644 --- a/riscasm.c +++ b/riscasm.c @@ -231,8 +231,8 @@ static int EvaluateRegisterFromTokenStream(uint32_t fixup) } // If we got a register in range (0-31), return it - if (eval <= 31) - return (int)eval; + if (eattr & RISCREG) + return (int)eval - KW_R0; // Otherwise, it's out of range & we flag an error return error(reg_err); @@ -474,8 +474,8 @@ int GenerateRISCCode(int state) { if ((tok[2] == '+') || (tok[2] == '-')) { - if ((sy->svalue & 0x1F) == 14 || (sy->svalue & 0x1F) == 15) { - indexed = (sy->svalue & 0x1F); + if ((sy->svalue - KW_R0) == 14 || (sy->svalue - KW_R0) == 15) { + indexed = (sy->svalue - KW_R0); tok++; } else @@ -590,10 +590,10 @@ int GenerateRISCCode(int state) if (sy->sattre & EQUATEDREG) { - if (((sy->svalue & 0x1F) == 14 || (sy->svalue & 0x1F) == 15) + if (((sy->svalue - KW_R0) == 14 || (sy->svalue - KW_R0) == 15) && (tok[2] != ')')) { - indexed = (sy->svalue & 0x1F); + indexed = (sy->svalue - KW_R0); tok++; } } -- 2.37.2