]> Shamusworld >> Repos - rmac/blobdiff - procln.c
Fix a small buglet in the last patch. :-)
[rmac] / procln.c
index d7bf53c577044a5b5ee83659cbe6b8c697ef2712..8cdcc6af2501cd5e8b1886cbe76e3813a63a46d9 100644 (file)
--- a/procln.c
+++ b/procln.c
@@ -1,7 +1,7 @@
 //
 // RMAC - Reboot's Macro Assembler for all Atari computers
 // PROCLN.C - Line Processing
-// 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
 //
@@ -53,6 +53,7 @@ int disabled;                                 // Assembly conditionally disabled
 int just_bss;                                  // 1, ds.b in microprocessor mode
 uint32_t pcloc;                                        // Value of "PC" at beginning of line
 SYM * lab_sym;                                 // Label on line (or NULL)
+char * label_defined;                  // The name of the last label defined in current line (if any)
 
 const char extra_stuff[] = "extra (unexpected) text found after addressing mode";
 const char comma_error[] = "missing comma";
@@ -186,6 +187,7 @@ DEBUG { printf("Assemble: Found TKEOF flag...\n"); }
 
        state = -3;                                                             // No keyword (just EOL)
        label = NULL;                                                   // No label
+       label_defined = NULL;                                   // No label defined yet
        lab_sym = NULL;                                                 // No (exported) label
        equate = NULL;                                                  // No equate
        tk = tok;                                                               // Save first token in line
@@ -233,6 +235,8 @@ as68label:
                        if (HandleLabel(label, labtyp) != 0)
                                goto loop;
 
+                       label_defined = label;
+
                        goto as68label;
                }
        }
@@ -363,6 +367,8 @@ as68label:
                                {
                                        if (HandleLabel(label, labtyp) != 0)
                                                goto loop;
+
+                                       label_defined = label;
                                }
 
                                HandleRept();
@@ -480,6 +486,11 @@ When checking to see if it's already been equated, issue a warning.
                                                registerbank = BANK_0;
                                        else if (*(uint64_t *)tok == 1)
                                                registerbank = BANK_1;
+
+                                       // Advance half-way through the 64-bit const.
+                                       // The code below, expecting a regular token,
+                                       // will advance past the second half.
+                                       tok++;
                                }
 
 #ifdef DEBODGE_REGBANK
@@ -587,7 +598,7 @@ When checking to see if it's already been equated, issue a warning.
                if (list_flag)                                  // Put value in listing
                        listvalue((uint32_t)eval);
 
-               at_eol();                                               // Must be at EOL now
+               ErrorIfNotAtEOL();                              // Must be at EOL now
                goto loop;
        }
 
@@ -597,6 +608,8 @@ When checking to see if it's already been equated, issue a warning.
                // Non-zero == error occurred
                if (HandleLabel(label, labtyp) != 0)
                        goto loop;
+
+               label_defined = label;
        }
 
        // Punt on EOL
@@ -837,8 +850,13 @@ When checking to see if it's already been equated, issue a warning.
        if (amode(1) < 0)                               // Parse 0, 1 or 2 addr modes
                goto loop;
 
-       if (*tok != EOL)
-               error(extra_stuff);
+       // Check that we're at EOL
+       // The only exception is ptestr/ptestw instructions
+       // that have 3 or 4 operands and are not handled by
+       // amode(). (yes, we're taking a performance hit here sadly)
+       if (m->mnfunc != m_ptestr && m->mnfunc != m_ptestw)
+               if (*tok != EOL)
+                       error(extra_stuff);
 
        amsk0 = amsktab[am0];
        amsk1 = amsktab[am1];
@@ -854,9 +872,11 @@ When checking to see if it's already been equated, issue a warning.
        // Keep a backup of chptr (used for optimisations during codegen)
        chptr_opcode = chptr;
 
-       while ((m->mnattr & siz) && (amsk0 & m->mn0) == 0 || (amsk1 & m->mn1) == 0)
+       while (!(m->mnattr & siz) || (amsk0 & m->mn0) == 0 || (amsk1 & m->mn1) == 0)
                m = &machtab[m->mncont];
 
+       DEBUG { printf("    68K: mninst=$%X, siz=$%X, mnattr=$%X, amsk0=$%X, mn0=$%X, amsk1=$%X, mn1=$%X\n", m->mninst, siz, m->mnattr, amsk0, m->mn0, amsk1, m->mn1); }
+
        (*m->mnfunc)(m->mninst, siz);
        goto loop;
 }