]> Shamusworld >> Repos - rmac/blobdiff - riscasm.c
Version bump for last commit; now at v2.0.23.
[rmac] / riscasm.c
index d595ebc96257f275a907febb33e63b9cebcf81d5..3092e6e7017d4c0e0a5145baf33d3ffd2d09663a 100644 (file)
--- 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);