]> Shamusworld >> Repos - rmac/blobdiff - procln.c
Add support for 64-bit evaluations.
[rmac] / procln.c
index ab6cf3a5cfd24371ebf74e891858f661ab24b02d..f5a806b0bf9bbb7c0592a313a17d17dad99b39df 100644 (file)
--- a/procln.c
+++ b/procln.c
@@ -39,7 +39,7 @@ static IFENT ifent0;                  // Root ifent
 IFENT * f_ifent;                               // Freelist of ifents
 int disabled;                                  // Assembly conditionally disabled
 int just_bss;                                  // 1, ds.b in microprocessor mode
-VALUE pcloc;                                   // Value of "PC" at beginning of line
+uint32_t pcloc;                                        // Value of "PC" at beginning of line
 SYM * lab_sym;                                 // Label on line (or NULL)
 
 const char extra_stuff[] = "extra (unexpected) text found after addressing mode";
@@ -95,7 +95,7 @@ LONG amsktab[0124] = {
        0L,                             // 0115
        0L,                             // 0116
        0L,                             // 0117
-       M_CREG,                 // 0120 (caches - TODO: is this correct or does it need its own bitfield?)
+       M_CACHE40,              // 0120
        M_CREG,                 // 0121
        M_FREG,                 // 0122
        M_FPSCR                 // 0123
@@ -131,7 +131,7 @@ void Assemble(void)
        char * equate;                          // Symbol (or NULL)
        int labtyp = 0;                         // Label type (':', DCOLON)
        int equtyp = 0;                         // Equ type ('=', DEQUALS)
-       VALUE eval;                                     // Expression value
+       uint64_t eval;                          // Expression value
        WORD eattr;                                     // Expression attributes
        SYM * esym;                                     // External symbol involved in expr.
        WORD siz = 0;                           // Size suffix to mnem/diretve/macro
@@ -177,7 +177,7 @@ DEBUG { printf("Assemble: Found TKEOF flag...\n"); }
        lab_sym = NULL;                                                 // No (exported) label
        equate = NULL;                                                  // No equate
        tk = tok;                                                               // Save first token in line
-       pcloc = (VALUE)sloc;                                    // Set beginning-of-line PC
+       pcloc = (uint32_t)sloc;                                 // Set beginning-of-line PC
 
 loop1:                                                                         // Internal line processing loop
 
@@ -229,7 +229,7 @@ as68label:
        if (*tok == EOL)
                goto normal;
 
-       // Next token MUST be a symbol
+       // First token MUST be a symbol (if we get here, tok didn't advance)
        if (*tok++ != SYMBOL)
        {
                error("syntax error; expected symbol");
@@ -269,22 +269,17 @@ as68label:
        // Check for ".b" ".w" ".l" after directive, macro or mnemonic.
        siz = SIZN;
 
-       if (*tok == DOTW)
-               siz = SIZW, tok++;
-       else if (*tok == DOTL)
-               siz = SIZL, tok++;
-       else if (*tok == DOTB)
-               siz = SIZB, tok++;
-       else if(*tok == DOTD)
-               siz = SIZD, tok++;
-       else if(*tok == DOTP)
-               siz = SIZP, tok++;
-       else if(*tok == DOTQ)
-               siz = SIZQ, tok++;
-       else if(*tok == DOTS)
-               siz = SIZS, tok++;
-       else if(*tok == DOTX)
-               siz = SIZX, tok++;
+       switch (*tok)
+       {
+       case DOTW: siz = SIZW, tok++; break;
+       case DOTL: siz = SIZL, tok++; break;
+       case DOTB: siz = SIZB, tok++; break;
+       case DOTD: siz = SIZD, tok++; break;
+       case DOTP: siz = SIZP, tok++; break;
+       case DOTQ: siz = SIZQ, tok++; break;
+       case DOTS: siz = SIZS, tok++; break;
+       case DOTX: siz = SIZX, tok++; break;
+       }
 
 
        // Do special directives (500..999) (These must be handled in "real time")
@@ -470,6 +465,7 @@ When checking to see if it's already been equated, issue a warning.
                                {
                                        // Advance token pointer to the constant
                                        tok += 3;
+                                       tok++;          // Skip the hi LONG, so pointing at lo LONG
 
                                        // Anything other than a 0 or a 1 will result in "No Bank"
                                        if (*tok == 0)
@@ -526,7 +522,7 @@ When checking to see if it's already been equated, issue a warning.
                        if (reglist(&rmask) < 0)
                                goto loop;
 
-                       eval = (VALUE)rmask;
+                       eval = (uint32_t)rmask;
                        eattr = ABS | DEFINED;
                }
                else if (equtyp == CCDEF)
@@ -799,4 +795,3 @@ int HandleLabel(char * label, int labelType)
        return 0;
 }
 
-