]> Shamusworld >> Repos - rmac/blobdiff - token.c
Added in DSP fixups to sect.c, misc. fixes for 6502 assembler.
[rmac] / token.c
diff --git a/token.c b/token.c
index 9754f4e4220750a0b0e92886eb414a60ace3bb8d..564ff0cc895d9349644776c69021687927f7dd83 100644 (file)
--- a/token.c
+++ b/token.c
@@ -1,7 +1,7 @@
 //
 // RMAC - Reboot's Macro Assembler for all Atari computers
 // TOKEN.C - Token Handling
-// Copyright (C) 199x Landon Dyer, 2011-2017 Reboot and Friends
+// Copyright (C) 199x Landon Dyer, 2011-2019 Reboot and Friends
 // RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986
 // Source utilised with the kind permission of Landon Dyer
 //
@@ -531,22 +531,12 @@ arg_num:
                                                        switch ((int)*tk++)
                                                        {
                                                        case SYMBOL:
-#if 0
-//                                                             d = (char *)*tk++;
-                                                               d = string[*tk++];
-#else
-                                                               // This fix should be done for strings too
                                                                d = symbolString[*tk++];
 DEBUG { printf("ExM: SYMBOL=\"%s\"", d); }
-#endif
                                                                break;
                                                        case STRING:
-#if 0
-//                                                             d = (char *)*tk++;
-                                                               d = string[*tk++];
-#else
                                                                d = symbolString[*tk++];
-#endif
+
                                                                if (dst >= edst)
                                                                        goto overflow;
 
@@ -570,7 +560,8 @@ DEBUG { printf("ExM: SYMBOL=\"%s\"", d); }
 //         to choke on legitimate code... Need to investigate this further
 //         before changing anything else here!
                                                        case CONST:
-                                                               sprintf(numbuf, "$%lx", (uint64_t)*tk++);
+//                                                             sprintf(numbuf, "$%lx", (uint64_t)*tk++);
+                                                               sprintf(numbuf, "$%" PRIX64, (uint64_t)*tk++);
                                                                tk++;
                                                                d = numbuf;
                                                                break;
@@ -967,7 +958,7 @@ int TokenizeLine(void)
 
 retry:
 
-       if (cur_inobj == NULL)                  // Return EOF if input stack is empty
+       if (cur_inobj == NULL)          // Return EOF if input stack is empty
                return TKEOF;
 
        // Get another line of input from the current input source: a file, a
@@ -983,8 +974,8 @@ retry:
                if ((ln = GetNextLine()) == NULL)
                {
 DEBUG { printf("TokenizeLine: Calling fpop() from SRC_IFILE...\n"); }
-                       if (fpop() == 0)                                // Pop input level
-                               goto retry;                                     // Try for more lines
+                       if (fpop() == 0)        // Pop input level
+                               goto retry;             // Try for more lines
                        else
                        {
                                ifent->if_prev = (IFENT *)-1;   //Signal Assemble() that we have reached EOF with unbalanced if/endifs
@@ -992,7 +983,7 @@ DEBUG { printf("TokenizeLine: Calling fpop() from SRC_IFILE...\n"); }
                        }
                }
 
-               curlineno++;                                            // Bump line number
+               curlineno++;                    // Bump line number
                lntag = SPACE;
 
                if (as68_flag)
@@ -1054,7 +1045,7 @@ DEBUG { printf("TokenizeLine: Calling fpop() from SRC_IFILE...\n"); }
                strcpy(lnbuf, ln);
 
        // General housekeeping
-       tok = tokeol;           // Set "tok" to EOL in case of error
+       tok = tokeol;                   // Set "tok" to EOL in case of error
        tk.u32 = etok;                  // Reset token ptr
        stuffnull = 0;                  // Don't stuff nulls
        totlines++;                             // Bump total #lines assembled
@@ -1202,16 +1193,9 @@ DEBUG { printf("TokenizeLine: Calling fpop() from SRC_IFILE...\n"); }
                        if ((j < 0) || (state < 0))
                        {
                                *tk.u32++ = SYMBOL;
-//#warning
-//problem here: nullspot is a char * but TOKEN is a uint32_t. On a 64-bit
-//system, this will cause all kinds of mischief.
-#if 0
-                               *tk++ = (TOKEN)nullspot;
-#else
                                string[stringNum] = nullspot;
                                *tk.u32++ = stringNum;
                                stringNum++;
-#endif
                        }
                        else
                        {
@@ -1219,10 +1203,10 @@ DEBUG { printf("TokenizeLine: Calling fpop() from SRC_IFILE...\n"); }
                                stuffnull = 0;
                        }
 
-                       if (v)                                                  // Record attribute token (if any)
+                       if (v)                  // Record attribute token (if any)
                                *tk.u32++ = (TOKEN)v;
 
-                       if (stuffnull)                                  // Arrange for string termination on next pass
+                       if (stuffnull)  // Arrange for string termination on next pass
                                nullspot = ln;
 
                        continue;
@@ -1332,45 +1316,20 @@ dostring:
                                        while (hextab[*ln] >= 0)
                                                v = (v << 4) + (int)hextab[*ln++];
 
-                                       if (*ln == '.')
-                                       {
-                                               if (obj_format == BSD)
-                                               {
-                                                       if ((*(ln + 1) & 0xDF) == 'B')
-                                                       {
-                                                               v &= 0x000000FF;
-                                                               ln += 2;
-                                                       }
-                                                       else if ((*(ln + 1) & 0xDF) == 'W')
-                                                       {
-                                                               v &= 0x0000FFFF;
-                                                               ln += 2;
-                                                       }
-                                                       else if ((*(ln + 1) & 0xDF) == 'L')
-                                                       {
-                                                               v &= 0xFFFFFFFF;
-                                                               ln += 2;
-                                                       }
-                                               }
-                                       }
-
                                        *tk.u32++ = CONST;
                                        *tk.u64++ = v;
 
-                                       if (obj_format == ALCYON)
+                                       if (*ln == '.')
                                        {
-                                               if (*ln == '.')
+                                               if ((*(ln + 1) == 'w') || (*(ln + 1) == 'W'))
                                                {
-                                                       if ((*(ln + 1) == 'w') || (*(ln + 1) == 'W'))
-                                                       {
-                                                               *tk.u32++ = DOTW;
-                                                               ln += 2;
-                                                       }
-                                                       else if ((*(ln + 1) == 'l') || (*(ln + 1) == 'L'))
-                                                       {
-                                                               *tk.u32++ = DOTL;
-                                                               ln += 2;
-                                                       }
+                                                       *tk.u32++ = DOTW;
+                                                       ln += 2;
+                                               }
+                                               else if ((*(ln + 1) == 'l') || (*(ln + 1) == 'L'))
+                                               {
+                                                       *tk.u32++ = DOTL;
+                                                       ln += 2;
                                                }
                                        }
                                }
@@ -1600,19 +1559,8 @@ dostring:
                                else if ((int)chrtab[*(ln + 1)] & DIGIT)
                                {
                                        // Hey, more digits after the dot, so we assume it's a
-                                       // floating point number of some kind
-#if 0
-                                       double fract = 10;
-                                       ln++;
-                                       f = (double)v;
-
-                                       while ((int)chrtab[*ln] & DIGIT)
-                                       {
-                                               f = f + (double)(*ln++ - '0') / fract;
-                                               fract *= 10;
-                                       }
-#else
-                                       // Here we parse the whole floating point number
+                                       // floating point number of some kind... numEnd will point
+                                       // to the first non-float character after it's done
                                        char * numEnd;
                                        errno = 0;
                                        double f = strtod(numStart, &numEnd);
@@ -1620,11 +1568,14 @@ dostring:
 
                                        if (errno != 0)
                                                return error("floating point parse error");
-#endif
 
+                                       // N.B.: We use the C compiler's internal double
+                                       //       representation for all internal float calcs and
+                                       //       are reasonably sure that the size of said double
+                                       //       is 8 bytes long (which we check for in fltpoint.c)
                                        *tk.u32++ = FCONST;
-// Shamus: Well, this is all kinds of icky--not the least of which is that unlike uintNN_t types, we have no guarantees of any kind when it comes to the size of floating point numbers in C (as far as I know of). If there is, we need to use those kinds here, or else figure out at runtime what sizes we're dealing with and act accordingly. To be fair, this is OK as long as the double type is less than 64 bits wide, but again, there's no guarantee that it isn't. :-/
-                                       *tk.u64++ = f;
+                                       *tk.dp = f;
+                                       tk.u64++;
                                        continue;
                                }
                        }
@@ -1645,9 +1596,9 @@ dostring:
        // Terminate line of tokens and return "success."
 
 goteol:
-       tok = etok;                                                     // Set tok to beginning of line
+       tok = etok;                             // Set tok to beginning of line
 
-       if (stuffnull)                                                  // Terminate last SYMBOL
+       if (stuffnull)                  // Terminate last SYMBOL
                *nullspot = EOS;
 
        *tk.u32++ = EOL;
@@ -1727,6 +1678,8 @@ void DumpToken(TOKEN t)
                printf("[COLON]");
        else if (t == CONST)
                printf("[CONST]");
+       else if (t == FCONST)
+               printf("[FCONST]");
        else if (t == ACONST)
                printf("[ACONST]");
        else if (t == STRING)
@@ -1815,6 +1768,13 @@ void DumpTokenBuffer(void)
                        printf("[CONST: $%lX]", *tp.u64);
                        t += 2;
                }
+               else if (*t == FCONST)
+               {
+                       PTR tp;
+                       tp.u32 = t + 1;
+                       printf("[FCONST: $%lX]", *tp.u64);
+                       t += 2;
+               }
                else if (*t == ACONST)
                {
                        printf("[ACONST: $%X, $%X]", (uint32_t)t[1], (uint32_t)t[2]);