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