]> Shamusworld >> Repos - rmac/blobdiff - macro.c
Actually implement ^^FILESIZE this time :)
[rmac] / macro.c
diff --git a/macro.c b/macro.c
index 469a88c6493e9c9f61f408d3f987ed3da0467951..22bd0d9f7c444d4824228cab8307e82c648c9f85 100644 (file)
--- a/macro.c
+++ b/macro.c
@@ -1,7 +1,7 @@
 //
 // RMAC - Reboot's Macro Assembler for all Atari computers
 // MACRO.C - Macro Definition and Invocation
-// Copyright (C) 199x Landon Dyer, 2011-2017 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
 //
@@ -117,6 +117,7 @@ int defmac1(char * ln, int notEndFlag)
                        curmac->lineList = malloc(sizeof(LLIST));
                        curmac->lineList->next = NULL;
                        curmac->lineList->line = strdup(ln);
+                       curmac->lineList->lineno = curlineno;
                        curmac->last = curmac->lineList;
                }
                else
@@ -124,6 +125,7 @@ int defmac1(char * ln, int notEndFlag)
                        curmac->last->next = malloc(sizeof(LLIST));
                        curmac->last->next->next = NULL;
                        curmac->last->next->line = strdup(ln);
+                       curmac->lineList->lineno = curlineno;
                        curmac->last = curmac->last->next;
                }
 
@@ -170,7 +172,7 @@ int DefineMacro(void)
        {
                argno = 0;
                symlist(defmac2);
-               at_eol();
+               ErrorIfNotAtEOL();
        }
 
        // Suck in the macro definition; we're looking for an ENDM symbol on a line
@@ -224,6 +226,7 @@ WARNING("!!! Casting (char *) as LONG !!!")
                firstrpt = malloc(sizeof(LLIST));
                firstrpt->next = NULL;
                firstrpt->line = strdup(line);
+               firstrpt->lineno = curlineno;
                nextrpt = firstrpt;
        }
        else
@@ -231,6 +234,7 @@ WARNING("!!! Casting (char *) as LONG !!!")
                nextrpt->next = malloc(sizeof(LLIST));
                nextrpt->next->next = NULL;
                nextrpt->next->line = strdup(line);
+               nextrpt->next->lineno = curlineno;
                nextrpt = nextrpt->next;
        }
 #endif
@@ -244,7 +248,7 @@ WARNING("!!! Casting (char *) as LONG !!!")
 //
 int HandleRept(void)
 {
-       uint32_t eval;
+       uint64_t eval;
 
        // Evaluate repeat expression
        if (abs_expr(&eval) != OK)
@@ -264,7 +268,7 @@ int HandleRept(void)
                IREPT * irept = inobj->inobj.irept;
                irept->ir_firstln = firstrpt;
                irept->ir_nextln = NULL;
-               irept->ir_count = eval;
+               irept->ir_count = (uint32_t)eval;
        }
 
        return 0;
@@ -410,10 +414,14 @@ int InvokeMacro(SYM * mac, WORD siz)
                                for(int i=0; i<3; i++)
                                        *p++ = *tok++;
                        }
-                       else if (*tok == CONST)
+                       else if (*tok == CONST)         // Constants are 64-bits
                        {
-                               *p++ = *tok++;
-                               *p++ = *tok++;
+                               *p++ = *tok++;                  // Token
+                               uint64_t *p64 = (uint64_t *)p;
+                               uint64_t *tok64 = (uint64_t *)tok;
+                               *p64++ = *tok64++;
+                               tok = (TOKEN *)tok64;
+                               p = (uint32_t *)p64;
                        }
                        else if ((*tok == STRING) || (*tok == SYMBOL))
                        {