X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=riscasm.c;h=f16abe0f30d201ffda4e5c424442bac1f784399b;hb=f23a0935e11c9a1ad61e4b4ee4a1e63fbd7b3e00;hp=fb6c5ce18781e6ec5cb1ccc9ba90b88473244a3b;hpb=216bfb25e0ce4afb65bb37347cc46b4c52c2220d;p=rmac diff --git a/riscasm.c b/riscasm.c index fb6c5ce..f16abe0 100644 --- a/riscasm.c +++ b/riscasm.c @@ -201,9 +201,23 @@ static int EvaluateRegisterFromTokenStream(uint32_t fixup) { // Firstly, check to see if it's a register token and return that. No // need to invoke expr() for easy cases like this. - if (*tok >= KW_R0 && *tok <= KW_R31) + int reg = *tok & 255; + if (reg >= KW_R0 && reg <= KW_R31) { - int reg = *tok - KW_R0; + // Check register bank usage in the case of .equr register + // (encoded as bits 30 and 31 in *tok). + // (I still think that this is superfluous and should be taken out, see my note in token.c) + if (*tok & 0x80000000) + { + // Oops, with all the evaluation in token.c we now lost the equated symbol reference, so we + // don't know its name or anything else. Oh well... + if ((regbank == BANK_0) && (*tok & 0x40000000) && !altbankok) + return error("equated symbol cannot be used in register bank 0"); + + if ((regbank == BANK_1) && !(*tok & 0x40000000) && !altbankok) + return error("equated symbol cannot be used in register bank 1"); + } + reg -= KW_R0; tok++; return reg; } @@ -230,12 +244,15 @@ static int EvaluateRegisterFromTokenStream(uint32_t fixup) return 0; } + // We shouldn't get here, that should not be legal + interror(9); + // If we got a register in range (0-31), return it - if (eattr & RISCREG) - return (int)eval - KW_R0; + //if (eattr & RISCREG) + // return (int)eval - KW_R0; - // Otherwise, it's out of range & we flag an error - return error(reg_err); + //// Otherwise, it's out of range & we flag an error + //return error(reg_err); } // @@ -454,35 +471,38 @@ int GenerateRISCCode(int state) if ((tok[1] == '+') || (tok[1] == '-')) { // Trying to make indexed call - if ((*tok == KW_R14) || (*tok == KW_R15)) - indexed = (*tok - KW_R0); + // Note: no bank check for .equr symbol here, but the original code for .equr + // below also didn't check for banks. Even more reasons to throw away + // bank checks. + if (((*tok & 0xff) == KW_R14) || ((*tok &0xff) == KW_R15)) + indexed = ((*tok & 0xff) - KW_R0); else return IllegalIndexedRegister(*tok); } - if (*tok == SYMBOL) - { - sy = lookup(string[tok[1]], LABEL, 0); - - if (!sy) - { - error(reg_err); - return ERROR; - } - - if (sy->sattre & EQUATEDREG) - { - if ((tok[2] == '+') || (tok[2] == '-')) - { - if ((sy->svalue - KW_R0) == 14 || (sy->svalue - KW_R0) == 15) { - indexed = (sy->svalue - KW_R0); - tok++; - } - else - return IllegalIndexedRegisterEqur(sy); - } - } - } + //if (*tok == SYMBOL) + //{ + // sy = lookup(string[tok[1]], LABEL, 0); + // + // if (!sy) + // { + // error(reg_err); + // return ERROR; + // } + // + // if (sy->sattre & EQUATEDREG) + // { + // if ((tok[2] == '+') || (tok[2] == '-')) + // { + // if ((sy->svalue - KW_R0) == 14 || (sy->svalue - KW_R0) == 15) { + // indexed = (sy->svalue - KW_R0); + // tok++; + // } + // else + // return IllegalIndexedRegisterEqur(sy); + // } + // } + //} if (!indexed) { @@ -499,7 +519,7 @@ int GenerateRISCCode(int state) parm = (WORD)(reg1 - 14 + 58); tok++; - if ((*tok >= KW_R0) && (*tok <= KW_R31)) + if (((*tok & 0xff) >= KW_R0) && ((*tok & 0xff) <= KW_R31)) indexed = 1; if (*tok == SYMBOL) @@ -575,29 +595,31 @@ int GenerateRISCCode(int state) tok++; indexed = 0; - if (((*tok == KW_R14) || (*tok == KW_R15)) && (tok[1] != ')')) - indexed = *tok - KW_R0; - - if (*tok == SYMBOL) - { - sy = lookup(string[tok[1]], LABEL, 0); - - if (!sy) - { - error(reg_err); - return ERROR; - } - - if (sy->sattre & EQUATEDREG) - { - if (((sy->svalue - KW_R0) == 14 || (sy->svalue - KW_R0) == 15) - && (tok[2] != ')')) - { - indexed = (sy->svalue - KW_R0); - tok++; - } - } - } + // Again, no bank checks here or in the original code. + // This check has more holes than a very hole-y thing. + if ((((*tok & 0xff) == KW_R14) || ((*tok & 0xff) == KW_R15)) && (tok[1] != ')')) + indexed = (*tok & 0xff) - KW_R0; + + //if (*tok == SYMBOL) + //{ + // sy = lookup(string[tok[1]], LABEL, 0); + // + // if (!sy) + // { + // error(reg_err); + // return ERROR; + // } + // + // if (sy->sattre & EQUATEDREG) + // { + // if (((sy->svalue - KW_R0) == 14 || (sy->svalue - KW_R0) == 15) + // && (tok[2] != ')')) + // { + // indexed = (sy->svalue - KW_R0); + // tok++; + // } + // } + //} if (!indexed) { @@ -614,7 +636,7 @@ int GenerateRISCCode(int state) parm = (WORD)(reg2 - 14 + 60); tok++; - if ((*tok >= KW_R0) && (*tok <= KW_R31)) + if (((*tok & 0xff) >= KW_R0) && ((*tok & 0xff) <= KW_R31)) indexed = 1; if (*tok == SYMBOL)