X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=riscasm.c;h=3092e6e7017d4c0e0a5145baf33d3ffd2d09663a;hp=d595ebc96257f275a907febb33e63b9cebcf81d5;hb=d812346ecf7309ee3fb88a8dd1f4bca033121ad5;hpb=33bb2746fadd3501eccf6b1046cf8acdfb0f1e37 diff --git a/riscasm.c b/riscasm.c index d595ebc..3092e6e 100644 --- a/riscasm.c +++ b/riscasm.c @@ -1,7 +1,7 @@ // // RMAC - Reboot's Macro Assembler for all Atari computers // RISCA.C - GPU/DSP Assembler -// Copyright (C) 199x Landon Dyer, 2011-2018 Reboot and Friends +// Copyright (C) 199x Landon Dyer, 2011-2020 Reboot and Friends // RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986 // Source utilised with the kind permission of Landon Dyer // @@ -13,6 +13,7 @@ #include "expr.h" #include "mark.h" #include "procln.h" +#include "rmac.h" #include "sect.h" #include "token.h" @@ -134,16 +135,6 @@ static const char * malformErr[] = { }; -// -// Convert a string to uppercase -// -static void strtoupper(char * s) -{ - while (*s) - *s++ &= 0xDF; -} - - // // Function to return "malformed expression" error // This is done mainly to remove a bunch of GOTO statements in the parser @@ -238,8 +229,8 @@ int GenerateRISCCode(int state) int indexed; // Indexed register flag uint64_t eval; // Expression value - uint16_t eattr; // Expression attributes - SYM * esym; // External symbol involved in expr. + uint16_t eattr; // Expression attributes + SYM * esym = NULL; // External symbol involved in expr. TOKEN r_expr[EXPRSIZE]; // Expression token list // Get opcode parameter and type @@ -267,7 +258,7 @@ int GenerateRISCCode(int state) // UNPACK case RI_ONE: reg2 = EvaluateRegisterFromTokenStream(FU_REGTWO); - at_eol(); + ErrorIfNotAtEOL(); DepositRISCInstructionWord(parm, parm >> 6, reg2); break; @@ -285,7 +276,7 @@ int GenerateRISCCode(int state) altbankok = 1; // MOVETA reg2 = EvaluateRegisterFromTokenStream(FU_REGTWO); - at_eol(); + ErrorIfNotAtEOL(); DepositRISCInstructionWord(parm, reg1, reg2); break; @@ -334,8 +325,14 @@ int GenerateRISCCode(int state) } else { + if (esym && (esym->sattre & EQUATEDREG)) + return error("equated register seen for immediate value"); + + if (eattr & RISCREG) + return error("register seen for immediate value"); + if (((int)eval < reg1) || ((int)eval > reg2)) - return error("constant out of range (%d to %d", reg1, reg2); + return error("constant out of range (%d to %d)", reg1, reg2); if (parm & SUB32) reg1 = 32 - (int)eval; @@ -347,7 +344,7 @@ int GenerateRISCCode(int state) CHECK_COMMA; reg2 = EvaluateRegisterFromTokenStream(FU_REGTWO); - at_eol(); + ErrorIfNotAtEOL(); DepositRISCInstructionWord(parm, reg1, reg2); break; @@ -396,7 +393,7 @@ int GenerateRISCCode(int state) CHECK_COMMA; reg2 = EvaluateRegisterFromTokenStream(FU_REGTWO); - at_eol(); + ErrorIfNotAtEOL(); DepositRISCInstructionWord(parm, 0, reg2); val = WORDSWAP32(eval); @@ -419,7 +416,7 @@ int GenerateRISCCode(int state) CHECK_COMMA; reg2 = EvaluateRegisterFromTokenStream(FU_REGTWO); - at_eol(); + ErrorIfNotAtEOL(); DepositRISCInstructionWord(parm, reg1, reg2); break; @@ -542,7 +539,7 @@ int GenerateRISCCode(int state) tok++; CHECK_COMMA; reg2 = EvaluateRegisterFromTokenStream(FU_REGTWO); - at_eol(); + ErrorIfNotAtEOL(); DepositRISCInstructionWord(parm, reg1, reg2); break; @@ -661,7 +658,7 @@ int GenerateRISCCode(int state) return MalformedOpcode(MALF_RPAREN); tok++; - at_eol(); + ErrorIfNotAtEOL(); DepositRISCInstructionWord(parm, reg2, reg1); break; @@ -679,7 +676,7 @@ int GenerateRISCCode(int state) tok++; CHECK_COMMA; reg2 = EvaluateRegisterFromTokenStream(FU_REGTWO); - at_eol(); + ErrorIfNotAtEOL(); DepositRISCInstructionWord(parm, reg1, reg2); break; @@ -698,7 +695,7 @@ int GenerateRISCCode(int state) return MalformedOpcode(MALF_RPAREN); tok++; - at_eol(); + ErrorIfNotAtEOL(); DepositRISCInstructionWord(parm, reg2, reg1); break; @@ -811,7 +808,7 @@ int GenerateRISCCode(int state) return MalformedOpcode(MALF_RPAREN); tok++; - at_eol(); + ErrorIfNotAtEOL(); } DepositRISCInstructionWord(parm, reg2, reg1);