From 3c72bb9df3ceba67008e7d68795ea0c3f2ac51b5 Mon Sep 17 00:00:00 2001
From: David Schmenk <dschmenk@gmail.com>
Date: Fri, 23 Mar 2018 12:31:17 -0700
Subject: [PATCH] Better TOSL cache checks

---
 src/libsrc/apple/jit.pla | 131 ++++++++++++++++++++-------------------
 1 file changed, 68 insertions(+), 63 deletions(-)

diff --git a/src/libsrc/apple/jit.pla b/src/libsrc/apple/jit.pla
index 3627f7e..7d60480 100644
--- a/src/libsrc/apple/jit.pla
+++ b/src/libsrc/apple/jit.pla
@@ -29,6 +29,11 @@ const codemax     = $BEE0
 //
 const interpentry = $03DC
 //
+// TOS caching values
+//
+const TOSL_DIRTY = 1
+const TOSL_CLEAN = 2
+//
 // Resolve virtual X with real X
 //
 def resolveX(codeptr, VX)#2
@@ -214,7 +219,7 @@ def compiler(defptr)#0
             //
             // Optimization fence
             //
-            if A_IS_TOSL
+            if A_IS_TOSL & TOSL_DIRTY
                 ^codeptr = $95;    codeptr++ // STA zp,X
                 ^codeptr = $D0+VX; codeptr++ // ESTKL
                 A_IS_TOSL = FALSE
@@ -241,7 +246,7 @@ def compiler(defptr)#0
             // CN,CN,CN,CN,CN,CN,CN,CN                                 ; 00 02 04 06 08 0A 0C 0E
             // CN,CN,CN,CN,CN,CN,CN,CN                                 ; 10 12 14 16 18 1A 1C 1E
             //puts("CN $"); putb(^(bytecode+i)/2)
-            if A_IS_TOSL
+            if A_IS_TOSL & TOSL_DIRTY
                 ^codeptr = $95;    codeptr++ // STA zp,X
                 ^codeptr = $D0+VX; codeptr++ // ESTKL
             fin
@@ -256,13 +261,13 @@ def compiler(defptr)#0
             ^codeptr = $C0+VX; codeptr++ // ESTKH
             //^codeptr = $95;    codeptr++ // STA zp,X
             //^codeptr = $D0+VX; codeptr++ // ESTKL
-            A_IS_TOSL = TRUE
+            A_IS_TOSL = TOSL_DIRTY
         else
             when opcode
                 // MINUS1,BREQ,BRNE,LA,LLA,CB,CW,CS                        ; 20 22 24 26 28 2A 2C 2E
                 is $20
                     //puts("MINUS_ONE")
-                    if A_IS_TOSL
+                    if A_IS_TOSL & TOSL_DIRTY
                         ^codeptr = $95;    codeptr++ // STA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
                     fin
@@ -273,7 +278,7 @@ def compiler(defptr)#0
                     ^codeptr = $C0+VX; codeptr++ // ESTKH
                     //^codeptr = $95;    codeptr++ // STA zp,X
                     //^codeptr = $D0+VX; codeptr++ // ESTKL
-                    A_IS_TOSL = TRUE
+                    A_IS_TOSL = TOSL_DIRTY
                     break
                 is $22
                     i++
@@ -338,7 +343,7 @@ def compiler(defptr)#0
                 is $26
                     i++
                     //puts("LA $"); puth(*(bytecode+i))
-                    if A_IS_TOSL
+                    if A_IS_TOSL & TOSL_DIRTY
                         ^codeptr = $95;    codeptr++ // STA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
                     fin
@@ -351,13 +356,13 @@ def compiler(defptr)#0
                     ^codeptr = ^(bytecode+i); codeptr++
                     //^codeptr = $95;    codeptr++ // STA zp,X
                     //^codeptr = $D0+VX; codeptr++ // ESTKL
-                    A_IS_TOSL = TRUE
+                    A_IS_TOSL = TOSL_DIRTY
                     i++
                     break
                 is $28
                     i++
                     //puts("LLA "); puti(^(bytecode+i))
-                    if A_IS_TOSL
+                    if A_IS_TOSL & TOSL_DIRTY
                         ^codeptr = $95;    codeptr++ // STA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
                     fin
@@ -383,7 +388,7 @@ def compiler(defptr)#0
                 is $2A
                     i++
                     //puts("CB $"); putb(^(bytecode+i))
-                    if A_IS_TOSL
+                    if A_IS_TOSL & TOSL_DIRTY
                         ^codeptr = $95;    codeptr++ // STA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
                     fin
@@ -394,12 +399,12 @@ def compiler(defptr)#0
                     ^codeptr = $C0+VX; codeptr++ // ESTKH
                     //^codeptr = $95;    codeptr++ // STA zp,X
                     //^codeptr = $D0+VX; codeptr++ // ESTKL
-                    A_IS_TOSL = TRUE
+                    A_IS_TOSL = TOSL_DIRTY
                     break
                 is $2C
                     i++
                     //puts("CW $"); puth(*(bytecode+i))
-                    if A_IS_TOSL
+                    if A_IS_TOSL & TOSL_DIRTY
                         ^codeptr = $95;    codeptr++ // STA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
                     fin
@@ -416,7 +421,7 @@ def compiler(defptr)#0
                     fin
                     //^codeptr = $95;    codeptr++ // STA zp,X
                     //^codeptr = $D0+VX; codeptr++ // ESTKL
-                    A_IS_TOSL = TRUE
+                    A_IS_TOSL = TOSL_DIRTY
                     i++
                     break
                 is $2E
@@ -425,7 +430,7 @@ def compiler(defptr)#0
                     dest = i + j + 1
                     //puts("CS "); //puts(bytecode+i); //puts("-->"); puti(dest)
                     if isule(codeptr + 12 + j, codemax)
-                        if A_IS_TOSL
+                        if A_IS_TOSL & TOSL_DIRTY
                             ^codeptr = $95;    codeptr++ // STA zp,X
                             ^codeptr = $D0+VX; codeptr++ // ESTKL
                         fin
@@ -467,7 +472,7 @@ def compiler(defptr)#0
                     break
                 is $34
                     //puts("DUP")
-                    if A_IS_TOSL
+                    if A_IS_TOSL & TOSL_DIRTY
                         ^codeptr = $95;    codeptr++ // STA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
                     else
@@ -485,7 +490,7 @@ def compiler(defptr)#0
                     //^codeptr = $D0+1+VX; codeptr++ // ESTKL+1
                     //^codeptr = $95;      codeptr++ // STA zp,X
                     //^codeptr = $D0+VX;   codeptr++ // ESTKL
-                    A_IS_TOSL = TRUE
+                    A_IS_TOSL = TOSL_DIRTY
                     break
                 is $36
                     //puts("DIVMOD")
@@ -509,7 +514,7 @@ def compiler(defptr)#0
                     ^codeptr = $C0+VX; codeptr++ // ESTKH
                     //^codeptr = $95;    codeptr++ // STA zp,X
                     //^codeptr = $D0+VX; codeptr++ // ESTKL
-                    A_IS_TOSL = TRUE
+                    A_IS_TOSL = TOSL_DIRTY
                     break
                 is $3A
                     i++
@@ -527,7 +532,7 @@ def compiler(defptr)#0
                     ^codeptr = $C0+VX; codeptr++ // ESTKH
                     //^codeptr = $95;    codeptr++ // STA zp,X
                     //^codeptr = $D0+VX; codeptr++ // ESTKL
-                    A_IS_TOSL = TRUE
+                    A_IS_TOSL = TOSL_DIRTY
                     break
                 is $3C
                     i++
@@ -542,7 +547,7 @@ def compiler(defptr)#0
                     ^codeptr = $C0+VX; codeptr++ // ESTKH
                     //^codeptr = $95;    codeptr++ // STA zp,X
                     //^codeptr = $D0+VX; codeptr++ // ESTKL
-                    A_IS_TOSL = TRUE
+                    A_IS_TOSL = TOSL_DIRTY
                     break
                 is $3E
                     i++
@@ -555,7 +560,7 @@ def compiler(defptr)#0
                     ^codeptr = ^(bytecode+i); codeptr++
                     //^codeptr = $95;    codeptr++ // STA zp,X
                     //^codeptr = $D0+VX; codeptr++ // ESTKL
-                    A_IS_TOSL = TRUE
+                    A_IS_TOSL = TOSL_DIRTY
                     break
                 // ISEQ,ISNE,ISGT,ISLT,ISGE,ISLE,BRFLS,BRTRU               ; 40 42 44 46 48 4A 4C 4E
                 is $40
@@ -583,7 +588,7 @@ def compiler(defptr)#0
                     VX++ //^codeptr = $E8;      codeptr++ // INX
                     //^codeptr = $95;    codeptr++ // STA zp,X
                     //^codeptr = $D0+VX; codeptr++ // ESTKL
-                    A_IS_TOSL = TRUE
+                    A_IS_TOSL = TOSL_DIRTY
                     break
                 is $42
                     //puts("ISNE")
@@ -610,7 +615,7 @@ def compiler(defptr)#0
                     VX++ //^codeptr = $E8;      codeptr++ // INX
                     //^codeptr = $95;    codeptr++ // STA zp,X
                     //^codeptr = $D0+VX; codeptr++ // ESTKL
-                    A_IS_TOSL = TRUE
+                    A_IS_TOSL = TOSL_DIRTY
                     break
                 is $44
                     //puts("ISGT")
@@ -639,11 +644,11 @@ def compiler(defptr)#0
                     VX++ //^codeptr = $E8;      codeptr++ // INX
                     //^codeptr = $95;    codeptr++ // STA zp,X
                     //^codeptr = $D0+VX; codeptr++ // ESTKL
-                    A_IS_TOSL = TRUE
+                    A_IS_TOSL = TOSL_DIRTY
                     break
                 is $46
                     //puts("ISLT")
-                    if A_IS_TOSL
+                    if A_IS_TOSL & TOSL_DIRTY
                         ^codeptr = $95;    codeptr++ // STA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
                     fin
@@ -670,11 +675,11 @@ def compiler(defptr)#0
                     VX++ //^codeptr = $E8;      codeptr++ // INX
                     //^codeptr = $95;    codeptr++ // STA zp,X
                     //^codeptr = $D0+VX; codeptr++ // ESTKL
-                    A_IS_TOSL = TRUE
+                    A_IS_TOSL = TOSL_DIRTY
                     break
                 is $48
                     //puts("ISGE")
-                    if A_IS_TOSL
+                    if A_IS_TOSL & TOSL_DIRTY
                         ^codeptr = $95;    codeptr++ // STA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
                     fin
@@ -701,11 +706,11 @@ def compiler(defptr)#0
                     VX++ //^codeptr = $E8;      codeptr++ // INX
                     //^codeptr = $95;    codeptr++ // STA zp,X
                     //^codeptr = $D0+VX; codeptr++ // ESTKL
-                    A_IS_TOSL = TRUE
+                    A_IS_TOSL = TOSL_DIRTY
                     break
                 is $4A
                     //puts("ISLE")
-                    if A_IS_TOSL
+                    if A_IS_TOSL & TOSL_DIRTY
                         ^codeptr = $95;    codeptr++ // STA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
                     fin
@@ -730,7 +735,7 @@ def compiler(defptr)#0
                     VX++ //^codeptr = $E8;      codeptr++ // INX
                     //^codeptr = $95;    codeptr++ // STA zp,X
                     //^codeptr = $D0+VX; codeptr++ // ESTKL
-                    A_IS_TOSL = TRUE
+                    A_IS_TOSL = TOSL_DIRTY
                     break
                 is $4C
                     i++
@@ -785,7 +790,7 @@ def compiler(defptr)#0
                     i++
                     //puts("BRNCH "); puti(dest)
                     codeptr, VX = resolveX(codeptr, VX)
-                    if A_IS_TOSL
+                    if A_IS_TOSL & TOSL_DIRTY
                         ^codeptr = $95;    codeptr++ // STA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
                     fin
@@ -860,7 +865,7 @@ def compiler(defptr)#0
                     //
                     // Call address
                     //
-                    if A_IS_TOSL
+                    if A_IS_TOSL & TOSL_DIRTY
                         ^codeptr = $95;    codeptr++ // STA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
                     fin
@@ -905,7 +910,7 @@ def compiler(defptr)#0
                     //
                     // Call into VM
                     //
-                    if A_IS_TOSL
+                    if A_IS_TOSL & TOSL_DIRTY
                         ^codeptr = $95;    codeptr++ // STA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
                     fin
@@ -918,7 +923,7 @@ def compiler(defptr)#0
                     break
                 is $5C
                     //puts("RET")
-                    if A_IS_TOSL
+                    if A_IS_TOSL & TOSL_DIRTY
                         ^codeptr = $95;    codeptr++ // STA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
                     fin
@@ -929,7 +934,7 @@ def compiler(defptr)#0
                 is $5E
                     i++
                     //puts("CFFB $FF"); putb(^(bytecode+i))
-                    if A_IS_TOSL
+                    if A_IS_TOSL & TOSL_DIRTY
                         ^codeptr = $95;    codeptr++ // STA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
                     fin
@@ -942,7 +947,7 @@ def compiler(defptr)#0
                     ^codeptr = ^(bytecode+i); codeptr++
                     //^codeptr = $95;    codeptr++ // STA zp,X
                     //^codeptr = $D0+VX; codeptr++ // ESTKL
-                    A_IS_TOSL = TRUE
+                    A_IS_TOSL = TOSL_DIRTY
                     break
                 // LB,LW,LLB,LLW,LAB,LAW,DLB,DLW                           ; 60 62 64 66 68 6A 6C 6E
                 is $60
@@ -959,7 +964,7 @@ def compiler(defptr)#0
                     ^codeptr = $C0+VX;   codeptr++ // ESTKH
                     //^codeptr = $95;      codeptr++ // STA zp,X
                     //^codeptr = $D0+VX;   codeptr++ // ESTKL                    
-                    A_IS_TOSL = TRUE
+                    A_IS_TOSL = TOSL_DIRTY
                     break
                 is $62
                     //puts("LW")
@@ -988,7 +993,7 @@ def compiler(defptr)#0
                 is $64
                     i++
                     //puts("LLB "); puti(^(bytecode+i))
-                    if A_IS_TOSL
+                    if A_IS_TOSL & TOSL_DIRTY
                         ^codeptr = $95;    codeptr++ // STA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
                     fin
@@ -1007,12 +1012,12 @@ def compiler(defptr)#0
                     ^codeptr = $C0+VX; codeptr++ // ESTKH
                     //^codeptr = $95;    codeptr++ // STA zp,X
                     //^codeptr = $D0+VX; codeptr++ // ESTKL
-                    A_IS_TOSL = TRUE
+                    A_IS_TOSL = TOSL_DIRTY
                     break
                 is $66
                     i++
                     //puts("LLW "); puti(^(bytecode+i))
-                    if A_IS_TOSL
+                    if A_IS_TOSL & TOSL_DIRTY
                         ^codeptr = $95;    codeptr++ // STA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
                     fin
@@ -1041,7 +1046,7 @@ def compiler(defptr)#0
                 is $68
                     i++
                     //puts("LAB $"); puth(*(bytecode+i))
-                    if A_IS_TOSL
+                    if A_IS_TOSL & TOSL_DIRTY
                         ^codeptr = $95;    codeptr++ // STA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
                     fin
@@ -1052,13 +1057,13 @@ def compiler(defptr)#0
                     ^codeptr = $C0+VX; codeptr++ // ESTKH
                     //^codeptr = $95;    codeptr++ // STA zp,X
                     //^codeptr = $D0+VX; codeptr++ // ESTKL
-                    A_IS_TOSL = TRUE
+                    A_IS_TOSL = TOSL_DIRTY
                     i++
                     break
                 is $6A
                     i++
                     //puts("LAW $"); puth(*(bytecode+i))
-                    if A_IS_TOSL
+                    if A_IS_TOSL & TOSL_DIRTY
                         ^codeptr = $95;    codeptr++ // STA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
                     fin
@@ -1071,7 +1076,7 @@ def compiler(defptr)#0
                     *codeptr = *(bytecode+i);   codeptr = codeptr + 2
                     //^codeptr = $95;    codeptr++ // STA zp,X
                     //^codeptr = $D0+VX; codeptr++ // ESTKL
-                    A_IS_TOSL = TRUE
+                    A_IS_TOSL = TOSL_DIRTY
                     i++
                     break
                 is $6C
@@ -1080,6 +1085,7 @@ def compiler(defptr)#0
                     if not A_IS_TOSL
                         ^codeptr = $B5;    codeptr++ // LDA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
+                        A_IS_TOSL = TOSL_CLEAN
                     fin
                     if ^(bytecode+i) <> 0
                         ^codeptr = $A0;    codeptr++ // LDY #imm
@@ -1091,12 +1097,11 @@ def compiler(defptr)#0
                         ^codeptr = $A0;    codeptr++ // LDY #imm
                         ^codeptr = $00;    codeptr++ // $00
                     fin
-                    A_IS_TOSL = TRUE
                     break
                 is $6E
                     i++
                     //puts("DLW "); puti(^(bytecode+i))
-                    if A_IS_TOSL
+                    if A_IS_TOSL & TOSL_DIRTY
                         ^codeptr = $95;    codeptr++ // STA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
                     fin
@@ -1119,7 +1124,7 @@ def compiler(defptr)#0
                         ^codeptr = $A0;    codeptr++ // LDY #imm
                         ^codeptr = $00;    codeptr++ // $00
                     fin
-                    A_IS_TOSL = TRUE
+                    A_IS_TOSL = TOSL_CLEAN
                     break
                 // SB,SW,SLB,SLW,SAB,SAW,DAB,DAW                           ; 70 72 74 76 78 7A 7C 7E
                 is $70
@@ -1249,10 +1254,10 @@ def compiler(defptr)#0
                     if not A_IS_TOSL
                         ^codeptr = $B5;    codeptr++ // LDA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
+                        A_IS_TOSL = TOSL_CLEAN
                     fin
                     ^codeptr = $8D; codeptr++ // STA abs
                     *codeptr = *(bytecode+i); codeptr = codeptr + 2
-                    A_IS_TOSL = TRUE
                     i++
                     break
                 is $7E
@@ -1270,7 +1275,7 @@ def compiler(defptr)#0
                     *codeptr = *(bytecode+i)+1; codeptr = codeptr + 2
                     ^codeptr = $A0;    codeptr++ // LDY #imm
                     ^codeptr = $00;    codeptr++ // $00
-                    A_IS_TOSL = TRUE
+                    A_IS_TOSL = TOSL_CLEAN
                     i++
                     break
                 // LNOT,ADD,SUB,MUL,DIV,MOD,INCR,DECR                      ; 80 82 84 86 88 8A 8C 8E
@@ -1292,7 +1297,7 @@ def compiler(defptr)#0
                     ^codeptr = $C0+VX; codeptr++ // ESTKH
                     //^codeptr = $95;    codeptr++ // STA zp,X
                     //^codeptr = $D0+VX; codeptr++ // ESTKL
-                    A_IS_TOSL = TRUE
+                    A_IS_TOSL = TOSL_DIRTY
                     break
                 is $82
                     //puts("ADD")
@@ -1316,7 +1321,7 @@ def compiler(defptr)#0
                     break
                 is $84
                     //puts("SUB")
-                    if A_IS_TOSL
+                    if A_IS_TOSL & TOSL_DIRTY
                         ^codeptr = $95;    codeptr++ // STA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
                     fin
@@ -1357,7 +1362,7 @@ def compiler(defptr)#0
                     //
                     // Call into VM
                     //
-                    if A_IS_TOSL
+                    if A_IS_TOSL & TOSL_DIRTY
                         ^codeptr = $95;    codeptr++ // STA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
                     fin
@@ -1385,7 +1390,7 @@ def compiler(defptr)#0
                     ^codeptr = $C0+VX; codeptr++ // ESTKH
                     //^codeptr = $95;    codeptr++ // STA zp,X
                     //^codeptr = $D0+VX; codeptr++ // ESTKL
-                    A_IS_TOSL = TRUE
+                    A_IS_TOSL = TOSL_DIRTY
                     break
                 is $8E
                     //puts("DECR")
@@ -1402,12 +1407,12 @@ def compiler(defptr)#0
                     ^codeptr = $C0+VX; codeptr++ // ESTKH
                     //^codeptr = $95;    codeptr++ // STA zp,X
                     //^codeptr = $D0+VX; codeptr++ // ESTKL
-                    A_IS_TOSL = TRUE
+                    A_IS_TOSL = TOSL_DIRTY
                     break
                 // NEG,COMP,BAND,IOR,XOR,SHL,SHR,IDXW                      ; 90 92 94 96 98 9A 9C 9E
                 is $90
                     //puts("NEG")
-                    if A_IS_TOSL
+                    if A_IS_TOSL & TOSL_DIRTY
                         ^codeptr = $95;    codeptr++ // STA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
                     fin
@@ -1529,7 +1534,7 @@ def compiler(defptr)#0
                     //puts("BRGT "); puti(dest)
                     i++
                     codeptr, VX = resolveX(codeptr, VX)
-                    if A_IS_TOSL
+                    if A_IS_TOSL & TOSL_DIRTY
                         ^codeptr = $95;    codeptr++ // STA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
                     fin
@@ -1750,7 +1755,7 @@ def compiler(defptr)#0
                     //
                     // SUB
                     //
-                    if A_IS_TOSL
+                    if A_IS_TOSL & TOSL_DIRTY
                         ^codeptr = $95;    codeptr++ // STA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
                     fin
@@ -1802,7 +1807,7 @@ def compiler(defptr)#0
                     i++
                     //puts("BRAND "); puti(dest)
                     codeptr, VX = resolveX(codeptr, VX)
-                    if A_IS_TOSL
+                    if A_IS_TOSL & TOSL_DIRTY
                         ^codeptr = $95;    codeptr++ // STA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
                     else
@@ -1828,7 +1833,7 @@ def compiler(defptr)#0
                     i++
                     //puts("BROR "); puti(dest)
                     codeptr, VX = resolveX(codeptr, VX)
-                    if A_IS_TOSL
+                    if A_IS_TOSL & TOSL_DIRTY
                         ^codeptr = $95;    codeptr++ // STA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
                     else
@@ -1873,7 +1878,7 @@ def compiler(defptr)#0
                     fin
                     //^codeptr = $95;    codeptr++ // STA zp,X
                     //^codeptr = $D0+VX; codeptr++ // ESTKL
-                    A_IS_TOSL = TRUE
+                    A_IS_TOSL = TOSL_DIRTY
                     break
                 is $B2
                     i++
@@ -1922,7 +1927,7 @@ def compiler(defptr)#0
                     ^codeptr = $C0+VX; codeptr++ // ESTKH
                     //^codeptr = $95;    codeptr++ // STA zp,X
                     //^codeptr = $D0+VX; codeptr++ // ESTKL
-                    A_IS_TOSL = TRUE
+                    A_IS_TOSL = TOSL_DIRTY
                     i++
                     break
                 is $B6
@@ -1949,7 +1954,7 @@ def compiler(defptr)#0
                 is $B8
                     i++
                     //puts("IDXLB "); puti(^(bytecode+i))
-                    if A_IS_TOSL
+                    if A_IS_TOSL & TOSL_DIRTY
                         ^codeptr = $95;    codeptr++ // STA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
                     fin
@@ -1984,7 +1989,7 @@ def compiler(defptr)#0
                 is $BA
                     i++
                     //puts("IDXLW "); puti(^(bytecode+i))
-                    if A_IS_TOSL
+                    if A_IS_TOSL & TOSL_DIRTY
                         ^codeptr = $95;    codeptr++ // STA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
                     fin
@@ -2021,7 +2026,7 @@ def compiler(defptr)#0
                 is $BC
                     i++
                     //puts("IDXAB $"); puth(*(bytecode+i))
-                    if A_IS_TOSL
+                    if A_IS_TOSL & TOSL_DIRTY
                         ^codeptr = $95;    codeptr++ // STA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
                     fin
@@ -2049,7 +2054,7 @@ def compiler(defptr)#0
                 is $BE
                     i++
                     //puts("IDXAW $"); puth(*(bytecode+i))
-                    if A_IS_TOSL
+                    if A_IS_TOSL & TOSL_DIRTY
                         ^codeptr = $95;    codeptr++ // STA zp,X
                         ^codeptr = $D0+VX; codeptr++ // ESTKL
                     fin