]> Shamusworld >> Repos - rmac/blobdiff - token.c
.equr overhaul part 4: handle equrundef (and the other permutations of the directive)
[rmac] / token.c
diff --git a/token.c b/token.c
index 162e7390bcf2576998815c66c84db75d303c4986..2d3742fedc6d2643ef3d50f6ecfe118120777aed 100644 (file)
--- a/token.c
+++ b/token.c
@@ -975,6 +975,7 @@ int TokenizeLine(void)
        uint8_t c1;
        int stringNum = 0;                      // Pointer to string locations in tokenized line
        SYM* sy;                                        // For looking up symbols (.equr)
+       int equrundef = 0;                      // Flag for equrundef scanning
 
 retry:
 
@@ -1200,38 +1201,51 @@ DEBUG { printf("TokenizeLine: Calling fpop() from SRC_IFILE...\n"); }
                        case 121:   // date
                                j = -1;
                        }
+                       
+                       // If we detected equrundef/regundef set relevant flag
+                       if (j == KW_EQURUNDEF)
+                       {
+                               equrundef = 1;
+                               j = -1;
+                               //printf("line %d, equrundef found\n", curlineno);
+                       }
 
                        // If not tokenized keyword OR token was not found
                        if ((j < 0) || (state < 0))
                        {
-                               // Last attempt: let's see if this is an equated register
-                               char temp = *ln;
-                               *ln = 0;
-                               sy = lookup(nullspot, LABEL, 0);
-                               *ln = temp;
-                               if (sy)
+                               // Only proceed if no equrundef has been detected. In that case we need to store the symbol
+                               // because the directive handler (d_equrundef) will run outside this loop, further into procln.c
+                               if (!equrundef)
                                {
-                                       if (sy->sattre & EQUATEDREG)
+                                       // Last attempt: let's see if this is an equated register
+                                       char temp = *ln;
+                                       *ln = 0;
+                                       sy = lookup(nullspot, LABEL, 0);
+                                       *ln = temp;
+                                       if (sy)
                                        {
-                                               uint32_t register_token = sy->svalue;
-                                               if (rgpu || rdsp)
+                                               if (sy->sattre & EQUATEDREG)
                                                {
-                                                       // If we are in GPU or DSP mode then mark the register bank.
-                                                       // We will use it during EvaluateRegisterFromTokenStream()
-                                                       // when we check if we can use the equated register with the currently
-                                                       // selected bank.
-                                                       // Note (ggn): I find all this superfluous. Do we really want to be so
-                                                       //             protective? Plus, the current implementation happily skips
-                                                       //                         these checks on .equr that are set during fixups - oops!
-                                                       register_token |= 0x80000000;           // Mark that this is an .equr
-                                                       if (sy->sattre & BANK_1)
+                                                       uint32_t register_token = sy->svalue;
+                                                       if (rgpu || rdsp)
                                                        {
-                                                               register_token |= 0x40000000;   // Mark bank 1
+                                                               // If we are in GPU or DSP mode then mark the register bank.
+                                                               // We will use it during EvaluateRegisterFromTokenStream()
+                                                               // when we check if we can use the equated register with the currently
+                                                               // selected bank.
+                                                               // Note (ggn): I find all this superfluous. Do we really want to be so
+                                                               //             protective? Plus, the current implementation happily skips
+                                                               //                         these checks on .equr that are set during fixups - oops!
+                                                               register_token |= 0x80000000;           // Mark that this is an .equr
+                                                               if (sy->sattre & BANK_1)
+                                                               {
+                                                                       register_token |= 0x40000000;   // Mark bank 1
+                                                               }
                                                        }
+                                                       *tk.u32++ = register_token;
+                                                       stuffnull = 0;
+                                                       continue;
                                                }
-                                               *tk.u32++ = register_token;
-                                               stuffnull = 0;
-                                               continue;
                                        }
                                }
                                // Ok, that failed, let's store the symbol instead