1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2024-07-23 02:29:02 +00:00

Better TOSL cache checks

This commit is contained in:
David Schmenk 2018-03-23 12:31:17 -07:00
parent 36c2506a24
commit 3c72bb9df3

View File

@ -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