1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2025-03-20 03:31:27 +00:00

VM cleanup and PLASMA16 bugfixes

This commit is contained in:
David Schmenk 2017-12-01 18:27:50 -08:00
parent 944905e965
commit 858023fd87
2 changed files with 241 additions and 184 deletions

@ -40,6 +40,7 @@ ALTRDON = $C003
ALTWROFF= $C004
ALTWRON = $C005
!SOURCE "vmsrc/plvmzp.inc"
PSR = TMPH+1
DROP = $EF
NEXTOP = $F0
FETCHOP = NEXTOP+3
@ -233,11 +234,15 @@ IINTRP PLA
+ LDA #>OPTBL
STA OPPAGE
!IF SELFMODIFY {
BIT LCRWEN+LCBNK2
BIT LCRWEN+LCBNK2
BIT LCRWEN+LCBNK2
}
JMP FETCHOP
IINTRPX PLA
IINTRPX PHP
PLA
STA PSR
SEI
PLA
STA TMPL
PLA
STA TMPH
@ -258,10 +263,9 @@ IINTRPX PLA
STA IFPH
LDA #>OPXTBL
STA OPPAGE
;SEI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
STA ALTRDON
!IF SELFMODIFY {
BIT LCRWEN+LCBNK2
BIT LCRWEN+LCBNK2
BIT LCRWEN+LCBNK2
}
JMP FETCHOP
@ -425,8 +429,6 @@ ADD LDA ESTKL,X
LDA ESTKH,X
ADC ESTKH+1,X
STA ESTKH+1,X
; INX
; JMP NEXTOP
JMP DROP
;*
;* SUB TOS FROM TOS-1
@ -438,8 +440,6 @@ SUB LDA ESTKL+1,X
LDA ESTKH+1,X
SBC ESTKH,X
STA ESTKH+1,X
; INX
; JMP NEXTOP
JMP DROP
;*
;* SHIFT TOS LEFT BY 1, ADD TO TOS-1
@ -453,8 +453,6 @@ IDXW LDA ESTKL,X
LDA ESTKH,X
ADC ESTKH+1,X
STA ESTKH+1,X
; INX
; JMP NEXTOP
JMP DROP
;*
;* MUL TOS-1 BY TOS
@ -485,8 +483,6 @@ MULLP LSR TMPH ; MULTPLRH
BNE MULLP
STA ESTKH+1,X ; PRODH
LDY IPY
; INX
; JMP NEXTOP
JMP DROP
;*
;* INTERNAL DIVIDE ALGORITHM
@ -605,8 +601,6 @@ BAND LDA ESTKL+1,X
LDA ESTKH+1,X
AND ESTKH,X
STA ESTKH+1,X
; INX
; JMP NEXTOP
JMP DROP
;*
;* INCLUSIVE OR TOS TO TOS-1
@ -617,8 +611,6 @@ IOR LDA ESTKL+1,X
LDA ESTKH+1,X
ORA ESTKH,X
STA ESTKH+1,X
; INX
; JMP NEXTOP
JMP DROP
;*
;* EXLUSIVE OR TOS TO TOS-1
@ -629,8 +621,6 @@ XOR LDA ESTKL+1,X
LDA ESTKH+1,X
EOR ESTKH,X
STA ESTKH+1,X
; INX
; JMP NEXTOP
JMP DROP
;*
;* SHIFT TOS-1 LEFT BY TOS
@ -651,8 +641,6 @@ SHL2 ASL ESTKL+1,X
DEY
BNE SHL2
SHL3 LDY IPY
; INX
; JMP NEXTOP
JMP DROP
;*
;* SHIFT TOS-1 RIGHT BY TOS
@ -680,8 +668,6 @@ SHR3 CMP #$80
BNE SHR3
STA ESTKH+1,X
SHR4 LDY IPY
; INX
; JMP NEXTOP
JMP DROP
;*
;* LOGICAL NOT
@ -706,8 +692,6 @@ LAND LDA ESTKL+1,X
LDA #$FF
LAND1 STA ESTKL+1,X
STA ESTKH+1,X
;LAND2 INX
; JMP NEXTOP
LAND2 JMP DROP
;*
;* LOGICAL OR
@ -720,8 +704,6 @@ LOR LDA ESTKL,X
LDA #$FF
STA ESTKL+1,X
STA ESTKH+1,X
;LOR1 INX
; JMP NEXTOP
LOR1 JMP DROP
;*
;* DUPLICATE TOS
@ -753,7 +735,7 @@ ZERO DEX
STA ESTKH,X
JMP NEXTOP
CFFB LDA #$FF
!BYTE $2C ; BIT $00A9 - effectively skips LDA #$00, no harm in reading this address
!BYTE $2C ; BIT $00A9 - effectively skips LDA #$00, no harm in reading this address
CB LDA #$00
DEX
STA ESTKH,X
@ -870,9 +852,9 @@ LB LDA ESTKL,X
STA LBLDA+1
LDA ESTKH,X
STA LBLDA+2
LBLDA LDA $FFFF
LBLDA LDA $FFFF
STA ESTKL,X
LDA #$00
LDA #$00
STA ESTKH,X
JMP NEXTOP
} ELSE {
@ -910,7 +892,7 @@ LBX LDA ESTKL,X
STA ALTRDOFF
LBXLDA LDA $FFFF
STA ESTKL,X
LDA #$00
LDA #$00
STA ESTKH,X
STA ALTRDON
JMP NEXTOP
@ -1024,7 +1006,7 @@ LAB +INC_IP
LABLDA LDA $FFFF
DEX
STA ESTKL,X
LDA #$00
LDA #$00
STA ESTKH,X
JMP NEXTOP
} ELSE {
@ -1071,7 +1053,7 @@ LABX +INC_IP
LABXLDA LDA $FFFF
DEX
STA ESTKL,X
LDA #$00
LDA #$00
STA ESTKH,X
STA ALTRDON
JMP NEXTOP
@ -1122,8 +1104,6 @@ SB LDA ESTKL,X
LDA ESTKL+1,X
SBSTA STA $FFFF
INX
; INX
; JMP NEXTOP
JMP DROP
} ELSE {
SB LDA ESTKL,X
@ -1136,8 +1116,6 @@ SB LDA ESTKL,X
STA (TMP),Y
LDY IPY
INX
; INX
; JMP NEXTOP
JMP DROP
}
SW LDA ESTKL,X
@ -1153,8 +1131,6 @@ SW LDA ESTKL,X
STA (TMP),Y
LDY IPY
INX
; INX
; JMP NEXTOP
JMP DROP
;*
;* STORE VALUE TO LOCAL FRAME OFFSET
@ -1179,8 +1155,6 @@ SLW +INC_IP
LDA ESTKH,X
STA (IFP),Y
LDY IPY
; INX
; JMP NEXTOP
JMP DROP
;*
;* STORE VALUE TO LOCAL FRAME OFFSET WITHOUT POPPING STACK
@ -1231,8 +1205,6 @@ SAB +INC_IP
LDY #$00
STA (TMP),Y
LDY IPY
; INX
; JMP NEXTOP
JMP DROP
}
SAW +INC_IP
@ -1249,8 +1221,6 @@ SAW +INC_IP
LDA ESTKH,X
STA (TMP),Y
LDY IPY
; INX
; JMP NEXTOP
JMP DROP
;*
;* STORE VALUE TO ABSOLUTE ADDRESS WITHOUT POPPING STACK
@ -1306,8 +1276,6 @@ ISEQ LDA ESTKL,X
ISTRU LDA #$FF
STA ESTKL+1,X
STA ESTKH+1,X
; INX
; JMP NEXTOP
JMP DROP
;
ISNE LDA ESTKL,X
@ -1319,8 +1287,6 @@ ISNE LDA ESTKL,X
ISFLS LDA #$00
STA ESTKL+1,X
STA ESTKH+1,X
; INX
; JMP NEXTOP
JMP DROP
;
ISGE LDA ESTKL+1,X
@ -1425,8 +1391,6 @@ IBRNCH LDA IPL
LDA IPH
ADC ESTKH,X
STA IPH
; INX
; JMP NEXTOP
JMP DROP
;*
;* CALL INTO ABSOLUTE ADDRESS (NATIVE CODE)
@ -1437,25 +1401,25 @@ CALL +INC_IP
+INC_IP
LDA (IP),Y
STA TMPH
TYA
CLC
ADC IPL
PHA
TYA
CLC
ADC IPL
PHA
LDA IPH
ADC #$00
ADC #$00
PHA
JSR JMPTMP
PLA
PLA
STA IPH
PLA
STA IPL
LDA #>OPTBL ; MAKE SURE WE'RE INDEXING THE RIGHT TABLE
STA OPPAGE
!IF SELFMODIFY {
BIT LCRWEN+LCBNK2
BIT LCRWEN+LCBNK2
BIT LCRWEN+LCBNK2
}
LDY #$00
LDY #$00
JMP NEXTOP
;
CALLX +INC_IP
@ -1464,29 +1428,34 @@ CALLX +INC_IP
+INC_IP
LDA (IP),Y
STA TMPH
TYA
CLC
ADC IPL
PHA
TYA
CLC
ADC IPL
PHA
LDA IPH
ADC #$00
ADC #$00
PHA
STA ALTRDOFF
;CLI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
LDA PSR
PHA
PLP
JSR JMPTMP
;SEI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
PHP
PLA
STA PSR
SEI
STA ALTRDON
PLA
PLA
STA IPH
PLA
STA IPL
LDA #>OPXTBL ; MAKE SURE WE'RE INDEXING THE RIGHT TABLE
STA OPPAGE
!IF SELFMODIFY {
BIT LCRWEN+LCBNK2
BIT LCRWEN+LCBNK2
BIT LCRWEN+LCBNK2
}
LDY #$00
LDY #$00
JMP NEXTOP
;*
;* INDIRECT CALL TO ADDRESS (NATIVE CODE)
@ -1496,25 +1465,25 @@ ICAL LDA ESTKL,X
LDA ESTKH,X
STA TMPH
INX
TYA
CLC
ADC IPL
PHA
TYA
CLC
ADC IPL
PHA
LDA IPH
ADC #$00
ADC #$00
PHA
JSR JMPTMP
PLA
PLA
STA IPH
PLA
STA IPL
LDA #>OPTBL ; MAKE SURE WE'RE INDEXING THE RIGHT TABLE
STA OPPAGE
!IF SELFMODIFY {
BIT LCRWEN+LCBNK2
BIT LCRWEN+LCBNK2
BIT LCRWEN+LCBNK2
}
LDY #$00
LDY #$00
JMP NEXTOP
;
ICALX LDA ESTKL,X
@ -1522,17 +1491,21 @@ ICALX LDA ESTKL,X
LDA ESTKH,X
STA TMPH
INX
TYA
CLC
ADC IPL
PHA
TYA
CLC
ADC IPL
PHA
LDA IPH
ADC #$00
ADC #$00
PHA
STA ALTRDOFF
;CLI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
LDA PSR
PHA
PLP
JSR JMPTMP
;SEI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
PHP
PLA
STA PSR
STA ALTRDON
PLA
STA IPH
@ -1541,10 +1514,10 @@ ICALX LDA ESTKL,X
LDA #>OPXTBL ; MAKE SURE WE'RE INDEXING THE RIGHT TABLE
STA OPPAGE
!IF SELFMODIFY {
BIT LCRWEN+LCBNK2
BIT LCRWEN+LCBNK2
BIT LCRWEN+LCBNK2
}
LDY #$00
LDY #$00
JMP NEXTOP
;*
;* JUMP INDIRECT TRHOUGH TMP
@ -1567,7 +1540,7 @@ ENTER INY
STA IFPH
INY
LDA (IP),Y
BEQ +
BEQ +
ASL
TAY
- LDA ESTKH,X
@ -1577,14 +1550,16 @@ ENTER INY
INX
DEY
STA (IFP),Y
BNE -
BNE -
+ LDY #$02
JMP NEXTOP
;*
;* LEAVE FUNCTION
;*
LEAVEX STA ALTRDOFF
;CLI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
LDA PSR
PHA
PLP
LEAVE PLA ; DEALLOCATE POOL + FRAME
CLC
ADC IFPL
@ -1599,7 +1574,9 @@ LEAVE PLA ; DEALLOCATE POOL + FRAME
RTS
;
RETX STA ALTRDOFF
;CLI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
LDA PSR
PHA
PLP
RET LDA IFPL ; DEALLOCATE POOL
STA PPL
LDA IFPH

@ -51,6 +51,7 @@ ALTWROFF= $C004
ALTWRON = $C005
!SOURCE "vmsrc/plvmzp.inc"
HWSP = TMPH+1
PSR = HWSP+1
DROP = $EF
NEXTOP = DROP+1
FETCHOP = NEXTOP+3
@ -212,7 +213,10 @@ OPTBL !WORD ZERO,ADD,SUB,MUL,DIV,MOD,INCR,DECR ; 00 02 04 06 08
;* ENTER INTO BYTECODE INTERPRETER - IMMEDIATELY SWITCH TO NATIVE
;*
!AS
DINTRP SEI
DINTRP PHP
PLA
STA PSR
SEI
CLC ; SWITCH TO NATIVE MODE
XCE
REP #$20 ; 16 BIT A/M
@ -236,19 +240,20 @@ DINTRP SEI
JMP FETCHOP
}
!AS
IINTRP SEI
IINTRP PHP
PLA
STA PSR
SEI
CLC ; SWITCH TO NATIVE MODE
XCE
REP #$20 ; 16 BIT A/M
!AL
PLA
STA TMP
LDY #$01
LDA (TMP),Y
LDA (TOS,S),Y
DEY
STA IP
LDA IFP
PHA ; SAVE ON STACK FOR LEAVE/RET
STA TOS,S ; SAVE ON STACK FOR LEAVE/RET
LDA PP ; SET FP TO PP
STA IFP
STX ESP
@ -262,19 +267,20 @@ IINTRP SEI
JMP FETCHOP
}
!AS
IINTRPX SEI
IINTRPX PHP
PLA
STA PSR
SEI
CLC ; SWITCH TO NATIVE MODE
XCE
REP #$20 ; 16 BIT A/M
!AL
PLA
STA TMP
LDY #$01
LDA (TMP),Y
STA IP
LDA (TOS,S),Y
DEY
STA IP
LDA IFP
PHA ; SAVE ON STACK FOR LEAVE/RET
STA TOS,S ; SAVE ON STACK FOR LEAVE/RET
LDA PP ; SET FP TO PP
STA IFP
STX ESP
@ -285,9 +291,9 @@ IINTRPX SEI
!IF DEBUG {
SETDBG LDY LCRWEN+LCBNK2
LDY LCRWEN+LCBNK2
LDY #$00
STX DBG_OP+2
LDX #>DBGTBL
LDY #$00
}
STX OPPAGE
JMP FETCHOP
@ -324,6 +330,9 @@ CMDENTRY = *
!IF DEBUG {
LDA #20 ; SET TEXT WINDOW ABOVE DEBUG OUTPUT
STA $23
; LDA $BF98 ; FORCE 64K
; AND #$CF
; STA $BF98
}
;
; INSTALL PAGE 0 FETCHOP ROUTINE
@ -449,13 +458,16 @@ LCDEFCMD = *-28 ; DEFCMD IN LC MEMORY
!ALIGN 255,0
OPXTBL !WORD ZERO,ADD,SUB,MUL,DIV,MOD,INCR,DECR ; 00 02 04 06 08 0A 0C 0E
!WORD NEG,COMP,BAND,IOR,XOR,SHL,SHR,IDXW ; 10 12 14 16 18 1A 1C 1E
!WORD LNOT,LOR,LAND,LA,LLA,CB,CW,CS ; 20 22 24 26 28 2A 2C 2E
!WORD LNOT,LOR,LAND,LA,LLA,CB,CW,CSX ; 20 22 24 26 28 2A 2C 2E
!WORD DROP,DUP,PUSHEP,PULLEP,BRGT,BRLT,BREQ,BRNE ; 30 32 34 36 38 3A 3C 3E
!WORD ISEQ,ISNE,ISGT,ISLT,ISGE,ISLE,BRFLS,BRTRU ; 40 42 44 46 48 4A 4C 4E
!WORD BRNCH,IBRNCH,CALLX,ICALX,ENTER,LEAVEX,RETX,CFFB ; 50 52 54 56 58 5A 5C 5E
!WORD LBX,LWX,LLBX,LLWX,LABX,LAWX,DLB,DLW ; 60 62 64 66 68 6A 6C 6E
!WORD SB,SW,SLB,SLW,SAB,SAW,DAB,DAW ; 70 72 74 76 78 7A 7C 7E
!IF DEBUG {
;*
;* DEBUG PRINT ROUTINES
;*
!AS
PRHEX PHA
LSR
@ -496,7 +508,6 @@ PRWORD PHA
JSR PRHEX
PLA
JMP PRHEX
;*****************
;* *
;* DEBUG TABLE *
@ -553,6 +564,21 @@ STEP STX TMPL
SEP #$20 ; 8 BIT A/M
!AS
JSR PRWORD
LDA #$80+'['
JSR PRCHR
STX TMPH
TSX
TXA
EOR #$FF
SEC
ADC HWSP
LSR
CLC
ADC #$80+'0'
LDX TMPH
JSR PRCHR
LDA #$80+']'
JSR PRCHR
LDA #':'
JSR PRCHR
STX TMPH
@ -583,31 +609,42 @@ STEP STX TMPL
JSR PRCHR
JSR PRCHR
JSR PRCHR
+++ ;LDX $C010
LDA #' '
+++ LDA #' '
- JSR PRCHR
CPX #40
BNE -
; LDX TMPL
; CPX #$48 ; FORCE PAUSE AT 'IS_GE'
; CPX #$56 ; FORCE PAUSE AT 'ICAL'
; BEQ DBGKEY
- LDX $C000
CPX #$9B
BNE ++
BNE +
DBGKEY STX $C010
- LDX $C000
BPL -
CPX #$9B
BEQ ++
BEQ +
STX $C010
CPX #$80+'Q'
BNE ++
BNE +
SEC ; SWITCH TO EMU MODE
XCE
BIT $C054 ; SET TEXT MODE
BIT $C051
BIT $C05F
LDA #20 ; SET TEXT WINDOW ABOVE DEBUG OUTPUT
STA $23
STZ $20
STZ $22
STZ $24
STZ $25
STZ $28
LDA #$04
STA $29
BRK
++ REP #$20 ; 16 BIT A/M
+ REP #$20 ; 16 BIT A/M
!AL
+ LDX TMPL
LDX TMPL
DBG_OP JMP (OPTBL,X)
}
;*********************************************************************
@ -644,8 +681,7 @@ IDXW PLA
;*
;* MUL TOS-1 BY TOS
;*
MUL ;STY IPY
;LDY #$10
MUL LDX #$10
LDA NOS,S
EOR #$FFFF
STA TMP
@ -654,10 +690,9 @@ MULLP ASL TMP ;LSR TMP ; MULTPLR
BCS +
ADC TOS,S ; MULTPLD
+ ASL ;ASL TOS,S ; MULTPLD
;DEY
DEX
BNE MULLP
STA NOS,S ; PROD
;LDY IPY
JMP DROP
;*
;* INTERNAL DIVIDE ALGORITHM
@ -769,26 +804,26 @@ XOR PLA
;*
SHL PLA
TAX
BEQ SHL2
BEQ SHLEX
LDA TOS,S
SHL1 ASL
- ASL
DEX
BNE SHL1
BNE -
STA TOS,S
SHL2 JMP NEXTOP
SHLEX JMP NEXTOP
;*
;* SHIFT TOS-1 RIGHT BY TOS
;*
SHR PLA
TAX
BEQ SHR2
BEQ SHREX
LDA TOS,S
SHR1 CMP #$8000
- CMP #$8000
ROR
DEX
BNE SHR1
BNE -
STA TOS,S
SHR2 JMP NEXTOP
SHREX JMP NEXTOP
;*
;* LOGICAL NOT
;*
@ -844,6 +879,7 @@ PUSHEP LDX LCRWEN+LCBNK2 ; RWEN LC MEM
BCC +
LDX #$80+'>'
STX $7D0+30
- BRA -
LDX #$32
+
}
@ -862,6 +898,7 @@ PULLEP LDX LCRWEN+LCBNK2 ; RWEN LC MEM
BPL +
LDX #$80+'<'
STX $7D0+30
- BRA -
LDX #$00
+
}
@ -873,8 +910,7 @@ PULLEP LDX LCRWEN+LCBNK2 ; RWEN LC MEM
;*
;* CONSTANT
;*
ZERO LDA #$0000
PHA
ZERO PEA $0000
JMP NEXTOP
CFFB +INC_IP
LDA (IP),Y
@ -903,9 +939,8 @@ CS +INC_IP
CLC
ADC IP
STA IP
LDY #$00
PHA
LDA (IP),Y
LDA (IP)
TAY
JMP NEXTOP
;
@ -914,63 +949,55 @@ CSX +INC_IP
CLC
ADC IP
STA IP
LDY #$00
LDA PP ; SCAN POOL FOR STRING ALREADY THERE
STA TMP
_CMPPSX CMP IFP ; CHECK FOR END OF POOL
BCC _CMPSX ; CHECK FOR MATCHING STRING
_CMPPSX STA TMP
CMP IFP ; CHECK FOR END OF POOL
BCS _CPYSX ; AT OR BEYOND END OF POOL, COPY STRING OVER
_CMPSX SEP #$20 ; 8 BIT A/M
!AS
STX ALTRDOFF
LDA (TMP),Y ; COMPARE STRINGS FROM AUX MEM TO STRINGS IN MAIN MEM
STX ALTRDOFF ; CHECK FOR MATCHING STRING
LDA (TMP) ; COMPARE STRINGS FROM AUX MEM TO STRINGS IN MAIN MEM
STX ALTRDON
CMP (IP),Y ; COMPARE STRING LENGTHS
CMP (IP) ; COMPARE STRING LENGTHS
BNE _CNXTSX1
TAY
_CMPCSX STX ALTRDOFF
- STX ALTRDOFF
LDA (TMP),Y ; COMPARE STRING CHARS FROM END
STX ALTRDON
CMP (IP),Y
BNE _CNXTSX
DEY
BNE _CMPCSX
BNE -
LDA TMPH ; MATCH - SAVE EXISTING ADDR ON ESTK AND MOVE ON
PHA
LDA TMPL
PHA
BRA _CEXSX
_CNXTSX LDY #$00
STX ALTRDOFF
LDA (TMP),Y
_CNXTSX STX ALTRDOFF
LDA (TMP)
STX ALTRDON
_CNXTSX1 REP #$20 ; 16 BIT A/M
_CNXTSX1 REP #$20 ; 16 BIT A/M
!AL
AND #$00FF
SEC
SEC ; SKIP OVER STRING+LEN BYTE
ADC TMP
STA TMP
BNE _CMPPSX
!AS
_CPYSX LDA (IP),Y ; COPY STRING FROM AUX TO MAIN MEM POOL
BRA _CMPPSX
_CPYSX LDA (IP) ; COPY STRING FROM AUX TO MAIN MEM POOL
TAY ; MAKE ROOM IN POOL AND SAVE ADDR ON ESTK
EOR #$FF
AND #$00FF
EOR #$FFFF
CLC
ADC PPL
STA PPL
TAX
LDA #$FF
ADC PPH
STA PPH
ADC PP
STA PP
PHA ; SAVE ADDRESS ON ESTK
PHX
_CPYSX1 LDA (IP),Y ; ALTRD IS ON, NO NEED TO CHANGE IT HERE
SEP #$20 ; 8 BIT A/M
!AS
- LDA (IP),Y ; ALTRD IS ON, NO NEED TO CHANGE IT HERE
STA (PP),Y ; ALTWR IS OFF, NO NEED TO CHANGE IT HERE
DEY
CPY #$FF
BNE _CPYSX1
INY
_CEXSX LDA (IP),Y ; SKIP TO NEXT OP ADDR AFTER STRING
BNE -
_CEXSX LDA (IP) ; SKIP TO NEXT OP ADDR AFTER STRING
TAY
REP #$20 ; 16 BIT A/M
!AL
@ -1330,10 +1357,13 @@ CALL +INC_IP
LDA (IP),Y
+INC_IP
STA TMP
EMUSTK SEC ; SWITCH TO EMULATED MODE
EMUSTK TYA ; FLATTEN IP
CLC
ADC IP
STA IP
SEC ; SWITCH TO EMULATED MODE
XCE
!AS
STY IPY
TSC ; MOVE HW EVAL STACK TO ZP EVAL STACK
EOR #$FF
SEC
@ -1371,25 +1401,36 @@ EMUSTK SEC ; SWITCH TO EMULATED MODE
LDX $C010
+ TAX
}
LDA IPY
CLC
ADC IPL
PHA
LDA IPH
ADC #$00
PHA
LDA IPL
PHA
PHX ; SAVE BASELINE ESP
TYX
;CLI
LDA PSR
PHA
PLP
JSR JMPTMP
;SEI
PHP
PLA
STA PSR
SEI
PLY ; MOVE RETURN VALUES TO HW EVAL STACK
STY ESP ; RESTORE BASELINE ESP
PLA
STA IPH
PLA
STA IPL
PLA
STA IPH
STX TMPL
!IF DEBUG {
TXA
EOR #$FF
SEC
ADC ESP
CLC
ADC #$80+'0'
STA $7D0+32
}
TSX ; RESTORE BASELINE HWSP
STX HWSP
TYX
@ -1420,10 +1461,13 @@ CALLX +INC_IP
LDA (IP),Y
+INC_IP
STA TMP
EMUSTKX SEC ; SWITCH TO EMULATED MODE
EMUSTKX TYA ; FLATTEN IP
CLC
ADC IP
STA IP
SEC ; SWITCH TO EMULATED MODE
XCE
!AS
STY IPY
TSC ; MOVE HW EVAL STACK TO ZP EVAL STACK
EOR #$FF
SEC
@ -1455,33 +1499,44 @@ EMUSTKX SEC ; SWITCH TO EMULATED MODE
CPX HWSP
BEQ +
LDX #$80+'X'
STX $480+30
- LDX $C000
STX $7D0+30
- LDX $C000
BPL -
LDX $C010
+ TAX
}
LDA IPY
CLC
ADC IPL
PHA
LDA IPH
ADC #$00
PHA
LDA IPL
PHA
PHX ; SAVE BASELINE ESP
TYX
STX ALTRDOFF
;CLI
LDA PSR
PHA
PLP
JSR JMPTMP
;SEI
PHP
PLA
STA PSR
SEI
STX ALTRDON
PLY ; MOVE RETURN VALUES TO HW EVAL STACK
STY ESP ; RESTORE BASELINE ESP
PLA
STA IPH
PLA
STA IPL
PLA
STA IPH
STX TMPL
!IF DEBUG {
TXA
EOR #$FF
SEC
ADC ESP
CLC
ADC #$80+'0'
STA $7D0+32
}
TSX ; RESTORE BASELINE HWSP
STX HWSP
TYX
@ -1528,6 +1583,13 @@ ENTER INY
SEP #$20 ; 8 BIT A/M
!AS
LDA (IP),Y
!IF DEBUG {
PHA
CLC
ADC #$80+'0'
STA $7D0+31
PLA
}
PHA ; SAVE ON STACK FOR LEAVE
DEC HWSP ; UPDATE HWSP TO SKIP FRAME SIZE
REP #$20 ; 16 BIT A/M
@ -1570,6 +1632,13 @@ LEAVE SEP #$20 ; 8 BIT A/M
SEC
ADC HWSP ; STACK DEPTH = (HWSP - SP)/2
LSR
!IF DEBUG {
PHA
CLC
ADC #$80+'0'
STA $7D0+31
PLA
}
EOR #$FF
SEC
ADC ESP ; ESP - STACK DEPTH
@ -1607,7 +1676,9 @@ LEAVE SEP #$20 ; 8 BIT A/M
STA IFP
SEC ; SWITCH TO EMULATED MODE
XCE
;CLI
LDA PSR
PHA
PLP
RTS
;
RETX STX ALTRDOFF
@ -1618,6 +1689,13 @@ RET SEP #$20 ; 8 BIT A/M
SEC
ADC HWSP ; STACK DEPTH = (HWSP - SP)/2
LSR
!IF DEBUG {
PHA
CLC
ADC #$80+'0'
STA $7D0+31
PLA
}
EOR #$FF
SEC
ADC ESP ; ESP - STACK DEPTH
@ -1653,7 +1731,9 @@ RET SEP #$20 ; 8 BIT A/M
SEC ; SWITCH TO EMULATED MODE
XCE
!AS
;CLI
LDA PSR
PHA
PLP
RTS
VMEND = *