]> Shamusworld >> Repos - rmac/blobdiff - procln.c
6502 mode: fix clearing of its RAM space with each .6502 invocation. Also fixed chptr...
[rmac] / procln.c
index dd8980622be2eb42d4f4ebd7e3dd75ab3572c9f7..c4612cbce65cb438c1351a7f40a2f7b6399c5ff6 100644 (file)
--- a/procln.c
+++ b/procln.c
@@ -7,16 +7,17 @@
 //
 
 #include "procln.h"
-#include "listing.h"
+#include "6502.h"
 #include "amode.h"
+#include "direct.h"
 #include "error.h"
-#include "sect.h"
 #include "expr.h"
+#include "listing.h"
 #include "mach.h"
-#include "direct.h"
 #include "macro.h"
-#include "symbol.h"
 #include "riscasm.h"
+#include "sect.h"
+#include "symbol.h"
 
 #define DEF_KW                                 // Declare keyword values
 #include "kwtab.h"                             // Incl generated keyword tables & defs
@@ -29,6 +30,9 @@
 #define DECL_MR
 #include "risckw.h"
 
+#define DEF_MP                                 // Include 6502 keyword definitions
+#define DECL_MP                                        // Include 6502 keyword state machine tables
+#include "6502kw.h"
 
 IFENT * ifent;                                 // Current ifent
 static IFENT ifent0;                   // Root ifent
@@ -566,6 +570,41 @@ When checking to see if it's already been equated, issue a warning.
        if (state == -3)
                goto loop;
 
+       // If we're in 6502 mode and are still in need of a mnemonic, then search
+       // for valid 6502 mnemonic.
+       if (m6502 && (state < 0 || state >= 1000))
+       {
+#ifdef ST
+               state = kmatch(opname, mpbase, mpcheck, mptab, mpaccept);
+#else
+               for(state=0, p=opname; state>= 0; )
+               {
+                       j = mpbase[state] + tolowertab[*p];
+
+                       if (mpcheck[j] != state)        // Reject, character doesn't match
+                       {
+                               state = -1;             // No match
+                               break;
+                       }
+
+                       if (!*++p)
+                       {                       // Must accept or reject at EOS
+                               state = mpaccept[j];    // (-1 on no terminal match)
+                               break;
+                       }
+
+                       state = mptab[j];
+               }
+#endif
+
+               // Call 6502 code generator if we found a mnemonic
+               if (state >= 2000)
+               {
+                       m6502cg(state - 2000);
+                       goto loop;
+               }
+       }
+
        // If we are in GPU or DSP mode and still in need of a mnemonic then search
        // for one
        if ((rgpu || rdsp) && (state < 0 || state >= 1000))