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

fewer and better checks for IP FIXUP

This commit is contained in:
David Schmenk 2018-01-19 17:37:32 -08:00
parent fbcebe9df3
commit f24bb421ec
2 changed files with 198 additions and 134 deletions

View File

@ -55,14 +55,29 @@ INTERP = $03D0
;*
;* INTERPRETER INSTRUCTION POINTER INCREMENT MACRO
;*
!MACRO INC_IP {
INY
BPL +
INC IPH
;!MACRO INC_IP {
; INY
; BPL +
; INC IPH
; TYA
; AND #$7F
; TAY
;+
; }
!MACRO FIX_IP {
INC IPH
TYA
AND #$7F
TAY
+
}
!MACRO FIXJMP_IP .TARGET {
BMI +
JMP .TARGET
+ INC IPH
TYA
AND #$7F
TAY
JMP .TARGET
}
;******************************
;* *
@ -730,19 +745,29 @@ CFFB LDA #$FF
CB LDA #$00
DEX
STA ESTKH,X
+INC_IP
INY
LDA (IP),Y
STA ESTKL,X
JMP NEXTOP
;*
;* LOAD ADDRESS & LOAD CONSTANT WORD (SAME THING, WITH OR WITHOUT FIXUP)
;*
LA = *
CW DEX
INY ;+INC_IP
LA DEX
INY ;+INC_IP
LDA (IP),Y
STA ESTKL,X
+INC_IP
INY
BMI +
- LDA (IP),Y
STA ESTKH,X
JMP NEXTOP
+ +FIX_IP
BPL -
CW DEX
INY ;+INC_IP
LDA (IP),Y
STA ESTKL,X
INY
LDA (IP),Y
STA ESTKH,X
JMP NEXTOP
@ -750,7 +775,7 @@ CW DEX
;* CONSTANT STRING
;*
CS DEX
INY ;+INC_IP
INY ;+INC_IP
TYA ; NORMALIZE IP AND SAVE STRING ADDR ON ESTK
CLC
ADC IPL
@ -766,7 +791,7 @@ CS DEX
JMP NEXTOP
;
CSX DEX
INY ;+INC_IP
INY ;+INC_IP
TYA ; NORMALIZE IP
CLC
ADC IPL
@ -875,7 +900,7 @@ LW LDA ESTKL,X
LDY IPY
JMP NEXTOP
;
!IF SELFMODIFY {
!IF SELFMODIFY {
LBX LDA ESTKL,X
STA LBXLDA+1
LDA ESTKH,X
@ -920,8 +945,9 @@ LWX LDA ESTKL,X
;*
;* LOAD ADDRESS OF LOCAL FRAME OFFSET
;*
LLA +INC_IP
LDA (IP),Y
LLA INY ;+INC_IP
BMI +
- LDA (IP),Y
DEX
CLC
ADC IFPL
@ -930,10 +956,12 @@ LLA +INC_IP
ADC IFPH
STA ESTKH,X
JMP NEXTOP
+ +FIX_IP
BPL -
;*
;* LOAD VALUE FROM LOCAL FRAME OFFSET
;*
LLB +INC_IP
LLB INY ;+INC_IP
LDA (IP),Y
STY IPY
TAY
@ -944,7 +972,7 @@ LLB +INC_IP
STA ESTKH,X
LDY IPY
JMP NEXTOP
LLW +INC_IP
LLW INY ;+INC_IP
LDA (IP),Y
STY IPY
TAY
@ -957,7 +985,7 @@ LLW +INC_IP
LDY IPY
JMP NEXTOP
;
LLBX +INC_IP
LLBX INY ;+INC_IP
LDA (IP),Y
STY IPY
TAY
@ -970,7 +998,7 @@ LLBX +INC_IP
STA ALTRDON
LDY IPY
JMP NEXTOP
LLWX +INC_IP
LLWX INY ;+INC_IP
LDA (IP),Y
STY IPY
TAY
@ -987,11 +1015,11 @@ LLWX +INC_IP
;*
;* LOAD VALUE FROM ABSOLUTE ADDRESS
;*
!IF SELFMODIFY {
LAB INY ;+INC_IP
!IF SELFMODIFY {
LAB INY ;+INC_IP
LDA (IP),Y
STA LABLDA+1
+INC_IP
INY ;+INC_IP
LDA (IP),Y
STA LABLDA+2
LABLDA LDA $FFFF
@ -1001,10 +1029,10 @@ LABLDA LDA $FFFF
STA ESTKH,X
JMP NEXTOP
} ELSE {
LAB INY ;+INC_IP
LAB INY ;+INC_IP
LDA (IP),Y
STA TMPL
+INC_IP
INY ;+INC_IP
LDA (IP),Y
STA TMPH
STY IPY
@ -1016,10 +1044,10 @@ LAB INY ;+INC_IP
LDY IPY
JMP NEXTOP
}
LAW INY ;+INC_IP
LAW INY ;+INC_IP
LDA (IP),Y
STA TMPL
+INC_IP
INY ;+INC_IP
LDA (IP),Y
STA TMPH
STY IPY
@ -1033,11 +1061,11 @@ LAW INY ;+INC_IP
LDY IPY
JMP NEXTOP
;
!IF SELFMODIFY {
LABX INY ;+INC_IP
!IF SELFMODIFY {
LABX INY ;+INC_IP
LDA (IP),Y
STA LABXLDA+1
+INC_IP
INY ;+INC_IP
LDA (IP),Y
STA LABXLDA+2
STA ALTRDOFF
@ -1049,10 +1077,10 @@ LABXLDA LDA $FFFF
STA ALTRDON
JMP NEXTOP
} ELSE {
LABX INY ;+INC_IP
LABX INY ;+INC_IP
LDA (IP),Y
STA TMPL
+INC_IP
INY ;+INC_IP
LDA (IP),Y
STA TMPH
STY IPY
@ -1066,10 +1094,10 @@ LABX INY ;+INC_IP
LDY IPY
JMP NEXTOP
}
LAWX INY ;+INC_IP
LAWX INY ;+INC_IP
LDA (IP),Y
STA TMPL
+INC_IP
INY ;+INC_IP
LDA (IP),Y
STA TMPH
STY IPY
@ -1087,7 +1115,7 @@ LAWX INY ;+INC_IP
;*
;* STORE VALUE TO ADDRESS
;*
!IF SELFMODIFY {
!IF SELFMODIFY {
SB LDA ESTKL,X
STA SBSTA+1
LDA ESTKH,X
@ -1126,17 +1154,15 @@ SW LDA ESTKL,X
;*
;* STORE VALUE TO LOCAL FRAME OFFSET
;*
SLB +INC_IP
SLB INY ;+INC_IP
LDA (IP),Y
STY IPY
TAY
LDA ESTKL,X
STA (IFP),Y
LDY IPY
; INX
; JMP NEXTOP
JMP DROP
SLW +INC_IP
+FIXJMP_IP DROP
SLW INY ;+INC_IP
LDA (IP),Y
STY IPY
TAY
@ -1146,11 +1172,11 @@ SLW +INC_IP
LDA ESTKH,X
STA (IFP),Y
LDY IPY
JMP DROP
+FIXJMP_IP DROP
;*
;* STORE VALUE TO LOCAL FRAME OFFSET WITHOUT POPPING STACK
;*
DLB +INC_IP
DLB INY ;+INC_IP
LDA (IP),Y
STY IPY
TAY
@ -1158,7 +1184,7 @@ DLB +INC_IP
STA (IFP),Y
LDY IPY
JMP NEXTOP
DLW +INC_IP
DLW INY ;+INC_IP
LDA (IP),Y
STY IPY
TAY
@ -1172,23 +1198,24 @@ DLW +INC_IP
;*
;* STORE VALUE TO ABSOLUTE ADDRESS
;*
!IF SELFMODIFY {
SAB INY ;+INC_IP
!IF SELFMODIFY {
SAB INY ;+INC_IP
LDA (IP),Y
STA SABSTA+1
+INC_IP
LDA (IP),Y
INY ;+INC_IP
BMI +
- LDA (IP),Y
STA SABSTA+2
LDA ESTKL,X
SABSTA STA $FFFF
; INX
; JMP NEXTOP
JMP DROP
+ +FIX_IP
BPL -
} ELSE {
SAB INY ;+INC_IP
SAB INY ;+INC_IP
LDA (IP),Y
STA TMPL
+INC_IP
INY ;+INC_IP
LDA (IP),Y
STA TMPH
LDA ESTKL,X
@ -1196,12 +1223,12 @@ SAB INY ;+INC_IP
LDY #$00
STA (TMP),Y
LDY IPY
JMP DROP
+FIXJMP_IP DROP
}
SAW INY ;+INC_IP
SAW INY ;+INC_IP
LDA (IP),Y
STA TMPL
+INC_IP
INY ;+INC_IP
LDA (IP),Y
STA TMPH
STY IPY
@ -1212,25 +1239,25 @@ SAW INY ;+INC_IP
LDA ESTKH,X
STA (TMP),Y
LDY IPY
JMP DROP
+FIXJMP_IP DROP
;*
;* STORE VALUE TO ABSOLUTE ADDRESS WITHOUT POPPING STACK
;*
!IF SELFMODIFY {
DAB INY ;+INC_IP
!IF SELFMODIFY {
DAB INY ;+INC_IP
LDA (IP),Y
STA DABSTA+1
+INC_IP
INY ;+INC_IP
LDA (IP),Y
STA DABSTA+2
LDA ESTKL,X
DABSTA STA $FFFF
JMP NEXTOP
} ELSE {
DAB INY ;+INC_IP
DAB INY ;+INC_IP
LDA (IP),Y
STA TMPL
+INC_IP
INY ;+INC_IP
LDA (IP),Y
STA TMPH
STY IPY
@ -1240,10 +1267,10 @@ DAB INY ;+INC_IP
LDY IPY
JMP NEXTOP
}
DAW INY ;+INC_IP
DAW INY ;+INC_IP
LDA (IP),Y
STA TMPL
+INC_IP
INY ;+INC_IP
LDA (IP),Y
STA TMPH
STY IPY
@ -1322,9 +1349,9 @@ BRTRU INX
LDA ESTKH-1,X
ORA ESTKL-1,X
BNE BRNCH
NOBRNCH INY ;+INC_IP
+INC_IP
JMP NEXTOP
NOBRNCH INY ;+INC_IP
INY ;+INC_IP
+FIXJMP_IP NEXTOP
BRFLS INX
LDA ESTKH-1,X
ORA ESTKL-1,X
@ -1390,10 +1417,10 @@ IBRNCH LDA IPL
;*
;* CALL INTO ABSOLUTE ADDRESS (NATIVE CODE)
;*
CALL INY ;+INC_IP
CALL INY ;+INC_IP
LDA (IP),Y
STA TMPL
INY ;+INC_IP
INY ;+INC_IP
LDA (IP),Y
STA TMPH
TYA
@ -1417,10 +1444,10 @@ CALL INY ;+INC_IP
LDY #$01
JMP FETCHOP
;
CALLX INY ;+INC_IP
CALLX INY ;+INC_IP
LDA (IP),Y
STA TMPL
INY ;+INC_IP
INY ;+INC_IP
LDA (IP),Y
STA TMPH
TYA
@ -1554,7 +1581,7 @@ ENTER LDA IFPH
;*
;* LEAVE FUNCTION
;*
LEAVEX INY ;+INC_IP
LEAVEX INY ;+INC_IP
LDA (IP),Y
CLC
ADC IFPL
@ -1571,7 +1598,7 @@ RETX STA ALTRDOFF
PHA
PLP
RTS
LEAVE INY ;+INC_IP
LEAVE INY ;+INC_IP
LDA (IP),Y
CLC
ADC IFPL

View File

@ -74,14 +74,41 @@ NOS = $03 ; TOS-1
;*
;* INTERPRETER INSTRUCTION POINTER INCREMENT MACRO
;*
!MACRO INC_IP {
INY
BPL +
INC IPH
;!MACRO INC_IP {
; INY
; BPL +
; SEP #$20 ; 8 BIT A/M
; !AS
; INC IPH
; TYA
; AND #$7F
; TAY
; REP #$20 ; 16 BIT A/M
; !AL
;+
; }
!MACRO FIX_IP {
SEP #$20 ; 8 BIT A/M
!AS
INC IPH
TYA
AND #$7F
TAY
+
REP #$20 ; 16 BIT A/M
!AL
}
!MACRO FIXJMP_IP .TARGET {
BMI +
JMP .TARGET
+ SEP #$20 ; 8 BIT A/M
!AS
INC IPH
TYA
AND #$7F
TAY
REP #$20 ; 16 BIT A/M
!AL
JMP .TARGET
}
;*
;* ACCUM/MEM SIZE MACROS
@ -764,12 +791,12 @@ DUP LDA TOS,S
;*
ZERO PEA $0000
JMP NEXTOP
CFFB +INC_IP
CFFB INY ;+INC_IP
LDA (IP),Y
ORA #$FF00
PHA
JMP NEXTOP
CB +INC_IP
CB INY ;+INC_IP
LDA (IP),Y
AND #$00FF
PHA
@ -777,16 +804,20 @@ CB +INC_IP
;*
;* LOAD ADDRESS & LOAD CONSTANT WORD (SAME THING, WITH OR WITHOUT FIXUP)
;*
LA = *
CW INY ;+INC_IP
LA INY ;+INC_IP
LDA (IP),Y
PHA
+INC_IP
INY ;+INC_IP
+FIXJMP_IP NEXTOP
CW INY ;+INC_IP
LDA (IP),Y
PHA
INY ;+INC_IP
JMP NEXTOP
;*
;* CONSTANT STRING
;*
CS INY ;+INC_IP
CS INY ;+INC_IP
TYA ; NORMALIZE IP AND SAVE STRING ADDR ON ESTK
CLC
ADC IP
@ -796,7 +827,7 @@ CS INY ;+INC_IP
TAY
JMP NEXTOP
;
CSX INY ;+INC_IP
CSX INY ;+INC_IP
TYA ; NORMALIZE IP
CLC
ADC IP
@ -911,17 +942,20 @@ LWX TYX
;*
;* LOAD ADDRESS OF LOCAL FRAME OFFSET
;*
LLA +INC_IP
LDA (IP),Y
LLA INY ;+INC_IP
BMI +
- LDA (IP),Y
AND #$00FF
CLC
ADC IFP
PHA
JMP NEXTOP
+ +FIX_IP
BPL -
;*
;* LOAD VALUE FROM LOCAL FRAME OFFSET
;*
LLB +INC_IP
LLB INY ;+INC_IP
TYX
LDA (IP),Y
TAY
@ -930,7 +964,7 @@ LLB +INC_IP
PHA
TXY
JMP NEXTOP
LLW +INC_IP
LLW INY ;+INC_IP
TYX
LDA (IP),Y
TAY
@ -939,7 +973,7 @@ LLW +INC_IP
TXY
JMP NEXTOP
;
LLBX +INC_IP
LLBX INY ;+INC_IP
TYX
LDA (IP),Y
TAY
@ -950,7 +984,7 @@ LLBX +INC_IP
PHA
TXY
JMP NEXTOP
LLWX +INC_IP
LLWX INY ;+INC_IP
TYX
LDA (IP),Y
TAY
@ -964,16 +998,16 @@ LLWX +INC_IP
;* LOAD VALUE FROM ABSOLUTE ADDRESS
;*
!IF SELFMODIFY {
LAB INY ;+INC_IP
LAB INY ;+INC_IP
LDA (IP),Y
STA LABLDX+1
LABLDX LDX $FFFF
TXA
PHA
+INC_IP
INY ;+INC_IP
JMP NEXTOP
} ELSE {
LAB INY ;+INC_IP
LAB INY ;+INC_IP
LDA (IP),Y
STA TMP
TYA ; QUICKY CLEAR OUT MSB
@ -981,19 +1015,19 @@ LAB INY ;+INC_IP
LDA (TMP)
+ACCMEM16 ; 16 BIT A/M
PHA
+INC_IP
INY ;+INC_IP
JMP NEXTOP
}
LAW INY ;+INC_IP
LAW INY ;+INC_IP
LDA (IP),Y
STA TMP
LDA (TMP)
PHA
+INC_IP
INY ;+INC_IP
JMP NEXTOP
;
!IF SELFMODIFY {
LABX INY ;+INC_IP
LABX INY ;+INC_IP
LDA (IP),Y
STA LABXLDX+1
STX ALTRDOFF
@ -1001,10 +1035,10 @@ LABXLDX LDX $FFFF
STX ALTRDON
TXA
PHA
+INC_IP
INY ;+INC_IP
JMP NEXTOP
} ELSE {
LABX INY ;+INC_IP
LABX INY ;+INC_IP
LDA (IP),Y
STA TMP
TYA ; QUICKY CLEAR OUT MSB
@ -1014,17 +1048,17 @@ LABX INY ;+INC_IP
+ACCMEM16 ; 16 BIT A/M
STX ALTRDON
PHA
+INC_IP
INY ;+INC_IP
JMP NEXTOP
}
LAWX INY ;+INC_IP
LAWX INY ;+INC_IP
LDA (IP),Y
STA TMP
STX ALTRDOFF
LDA (TMP)
STX ALTRDON
PHA
+INC_IP
INY ;+INC_IP
JMP NEXTOP
;
;*
@ -1060,8 +1094,9 @@ SW TYX
;* STORE VALUE TO LOCAL FRAME OFFSET
;*
!IF SELFMODIFY {
SLB +INC_IP
LDA (IP),Y
SLB INY ;+INC_IP
BMI +
- LDA (IP),Y
AND #$00FF
CLC
ADC IFP
@ -1070,8 +1105,10 @@ SLB +INC_IP
TAX
SLBSTX STX $FFFF
JMP NEXTOP
+ +FIX_IP
BPL -
} ELSE {
SLB +INC_IP
SLB INY ;+INC_IP
TYX
LDA (IP),Y
TAY
@ -1080,21 +1117,21 @@ SLB +INC_IP
STA (IFP),Y
+ACCMEM16 ; 16 BIT A/M
TXY
JMP NEXTOP
+FIXJMP_IP NEXTOP
}
SLW +INC_IP
SLW INY ;+INC_IP
LDA (IP),Y
TYX
TAY
PLA
STA (IFP),Y
TXY
JMP NEXTOP
+FIXJMP_IP NEXTOP
;*
;* STORE VALUE TO LOCAL FRAME OFFSET WITHOUT POPPING STACK
;*
!IF SELFMODIFY {
DLB +INC_IP
DLB INY ;+INC_IP
LDA (IP),Y
AND #$00FF
CLC
@ -1105,7 +1142,7 @@ DLB +INC_IP
DLBSTX STX $FFFF
JMP NEXTOP
} ELSE {
DLB +INC_IP
DLB INY ;+INC_IP
TYX
+ACCMEM8 ; 8 BIT A/M
LDA (IP),Y
@ -1116,7 +1153,7 @@ DLB +INC_IP
TXY
JMP NEXTOP
}
DLW +INC_IP
DLW INY ;+INC_IP
LDA (IP),Y
TYX
TAY
@ -1128,61 +1165,61 @@ DLW +INC_IP
;* STORE VALUE TO ABSOLUTE ADDRESS
;*
!IF SELFMODIFY {
SAB INY ;+INC_IP
SAB INY ;+INC_IP
LDA (IP),Y
STA SABSTX+1
PLA
TAX
SABSTX STX $FFFF
+INC_IP
JMP NEXTOP
INY ;+INC_IP
+FIXJMP_IP NEXTOP
} ELSE {
SAB INY ;+INC_IP
SAB INY ;+INC_IP
LDA (IP),Y
STA TMP
PLA
+ACCMEM8 ; 8 BIT A/M
STA (TMP)
+ACCMEM16 ; 16 BIT A/M
+INC_IP
JMP NEXTOP
INY ;+INC_IP
+FIXJMP_IP NEXTOP
}
SAW INY ;+INC_IP
SAW INY ;+INC_IP
LDA (IP),Y
STA TMP
PLA
STA (TMP)
+INC_IP
JMP NEXTOP
INY ;+INC_IP
+FIXJMP_IP NEXTOP
;*
;* STORE VALUE TO ABSOLUTE ADDRESS WITHOUT POPPING STACK
;*
!IF SELFMODIFY {
DAB INY ;+INC_IP
DAB INY ;+INC_IP
LDA (IP),Y
STA DABSTX+1
LDA TOS,S
TAX
DABSTX STX $FFFF
+INC_IP
INY ;+INC_IP
JMP NEXTOP
} ELSE {
DAB INY ;+INC_IP
DAB INY ;+INC_IP
LDA (IP),Y
STA TMP
+ACCMEM8 ; 8 BIT A/M
LDA TOS,S
STA (TMP)
+ACCMEM16 ; 16 BIT A/M
+INC_IP
INY ;+INC_IP
JMP NEXTOP
}
DAW INY ;+INC_IP
DAW INY ;+INC_IP
LDA (IP),Y
STA TMP
LDA TOS,S
STA (TMP)
+INC_IP
INY ;+INC_IP
JMP NEXTOP
;*
;* COMPARES
@ -1245,16 +1282,16 @@ ISLT PLA
;*
BRTRU PLA
BNE BRNCH
NOBRNCH INY ;+INC_IP
+INC_IP
JMP NEXTOP
NOBRNCH INY ;+INC_IP
INY ;+INC_IP
+FIXJMP_IP NEXTOP
BRFLS PLA
BNE NOBRNCH
BRNCH TYA ; FLATTEN IP
BRNCH TYA ; FLATTEN IP
CLC
ADC IP
INY ;+INC_IP
CLC ; ADD BRANCH OFFSET
INY ;+INC_IP
CLC ; ADD BRANCH OFFSET
ADC (IP),Y
STA IP
LDY #$01
@ -1293,7 +1330,7 @@ IBRNCH PLA
;*
;* CALL INTO ABSOLUTE ADDRESS (NATIVE CODE)
;*
CALL INY ;+INC_IP
CALL INY ;+INC_IP
LDA (IP),Y
INY
BNE EMUSTK
@ -1409,7 +1446,7 @@ EMUSTK STA TMP
;*
;* CALL INTO ABSOLUTE ADDRESS (NATIVE CODE)
;*
CALLX INY ;+INC_IP
CALLX INY ;+INC_IP
LDA (IP),Y
INY
BNE EMUSTKX
@ -1573,12 +1610,12 @@ ENTER PEI (IFP) ; SAVE ON STACK FOR LEAVE
;*
;* LEAVE FUNCTION
;*
LEAVEX INY ;+INC_IP
LEAVEX INY ;+INC_IP
+ACCMEM8 ; 8 BIT A/M
LDA (IP),Y ; DEALLOCATE POOL + FRAME
STA ALTRDOFF
BRA +
LEAVE INY ;+INC_IP
LEAVE INY ;+INC_IP
+ACCMEM8 ; 8 BIT A/M
LDA (IP),Y ; DEALLOCATE POOL + FRAME
+ STA TMPL