1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2025-02-10 10:30:58 +00:00

Weird accum size switching bug

This commit is contained in:
David Schmenk 2017-12-02 22:47:07 -08:00
parent 4c168fe377
commit 02129d49b9

View File

@ -75,13 +75,38 @@ NOS = $03 ; TOS-1
;* ;*
!MACRO INC_IP { !MACRO INC_IP {
INY INY
BNE * + 8 BNE +
SEP #$20 ; SET 8 BIT MODE LDX IPH
!AS INX
INC IPH STX IPH
!AL +
REP #$20 ; SET 16 BIT MODE
} }
;*
;* ACCUM/MEM SIZE MACROS
;*
!MACRO ACCMEM8 {
SEP #$20 ; 8 BIT A/M
!AS
}
!MACRO ACCMEM16 {
REP #$20 ; 16 BIT A/M
!AL
}
;*
;* SIZE SWITCHING HACK
;*
!IF DEBUG {
!MACRO HACK816 {
}
} ELSE {
!MACRO HACK816 {
SEP #$20 ; 8 BIT A/M
!AS
BIT TMPH
REP #$20 ; 16 BIT A/M
!AL
}
}
;****************************** ;******************************
;* * ;* *
;* INTERPRETER INITIALIZATION * ;* INTERPRETER INITIALIZATION *
@ -219,13 +244,12 @@ DINTRP PHP
SEI SEI
CLC ; SWITCH TO NATIVE MODE CLC ; SWITCH TO NATIVE MODE
XCE XCE
REP #$20 ; 16 BIT A/M +ACCMEM16 ; 16 BIT A/M
!AL +HACK816
PLA PLA
INC INC
STA IP STA IP
LDA IFP PEI (IFP) ; SAVE ON STACK FOR LEAVE/RET
PHA ; SAVE ON STACK FOR LEAVE/RET
LDA PP ; SET FP TO PP LDA PP ; SET FP TO PP
STA IFP STA IFP
STX ESP STX ESP
@ -246,8 +270,8 @@ IINTRP PHP
SEI SEI
CLC ; SWITCH TO NATIVE MODE CLC ; SWITCH TO NATIVE MODE
XCE XCE
REP #$20 ; 16 BIT A/M +ACCMEM16 ; 16 BIT A/M
!AL +HACK816
LDY #$01 LDY #$01
LDA (TOS,S),Y LDA (TOS,S),Y
DEY DEY
@ -273,8 +297,8 @@ IINTRPX PHP
SEI SEI
CLC ; SWITCH TO NATIVE MODE CLC ; SWITCH TO NATIVE MODE
XCE XCE
REP #$20 ; 16 BIT A/M +ACCMEM16 ; 16 BIT A/M
!AL +HACK816
LDY #$01 LDY #$01
LDA (TOS,S),Y LDA (TOS,S),Y
DEY DEY
@ -292,6 +316,7 @@ IINTRPX PHP
SETDBG LDY LCRWEN+LCBNK2 SETDBG LDY LCRWEN+LCBNK2
LDY LCRWEN+LCBNK2 LDY LCRWEN+LCBNK2
STX DBG_OP+2 STX DBG_OP+2
LDY LCRDEN+LCBNK2
LDX #>DBGTBL LDX #>DBGTBL
LDY #$00 LDY #$00
} }
@ -770,8 +795,7 @@ CSX +INC_IP
_CMPPSX STA TMP _CMPPSX STA TMP
CMP IFP ; CHECK FOR END OF POOL CMP IFP ; CHECK FOR END OF POOL
BCS _CPYSX ; AT OR BEYOND END OF POOL, COPY STRING OVER BCS _CPYSX ; AT OR BEYOND END OF POOL, COPY STRING OVER
_CMPSX SEP #$20 ; 8 BIT A/M _CMPSX +ACCMEM8 ; 8 BIT A/M
!AS
STX ALTRDOFF ; CHECK FOR MATCHING STRING STX ALTRDOFF ; CHECK FOR MATCHING STRING
LDA (TMP) ; COMPARE STRINGS FROM AUX MEM TO STRINGS IN MAIN MEM LDA (TMP) ; COMPARE STRINGS FROM AUX MEM TO STRINGS IN MAIN MEM
STX ALTRDON STX ALTRDON
@ -793,8 +817,7 @@ _CMPSX SEP #$20 ; 8 BIT A/M
_CNXTSX STX ALTRDOFF _CNXTSX STX ALTRDOFF
LDA (TMP) LDA (TMP)
STX ALTRDON STX ALTRDON
_CNXTSX1 REP #$20 ; 16 BIT A/M _CNXTSX1 +ACCMEM16 ; 16 BIT A/M
!AL
AND #$00FF AND #$00FF
SEC ; SKIP OVER STRING+LEN BYTE SEC ; SKIP OVER STRING+LEN BYTE
ADC TMP ADC TMP
@ -807,8 +830,7 @@ _CPYSX LDA (IP) ; COPY STRING FROM AUX TO MAIN MEM POOL
ADC PP ADC PP
STA PP STA PP
PHA ; SAVE ADDRESS ON ESTK PHA ; SAVE ADDRESS ON ESTK
SEP #$20 ; 8 BIT A/M +ACCMEM8 ; 8 BIT A/M
!AS
- LDA (IP),Y ; ALTRD IS ON, NO NEED TO CHANGE IT HERE - LDA (IP),Y ; ALTRD IS ON, NO NEED TO CHANGE IT HERE
STA (PP),Y ; ALTWR IS OFF, NO NEED TO CHANGE IT HERE STA (PP),Y ; ALTWR IS OFF, NO NEED TO CHANGE IT HERE
DEY DEY
@ -816,20 +838,17 @@ _CPYSX LDA (IP) ; COPY STRING FROM AUX TO MAIN MEM POOL
BNE - BNE -
_CEXSX LDA (IP) ; SKIP TO NEXT OP ADDR AFTER STRING _CEXSX LDA (IP) ; SKIP TO NEXT OP ADDR AFTER STRING
TAY TAY
REP #$20 ; 16 BIT A/M +ACCMEM16 ; 16 BIT A/M
!AL
JMP NEXTOP JMP NEXTOP
;* ;*
;* LOAD VALUE FROM ADDRESS TAG ;* LOAD VALUE FROM ADDRESS TAG
;* ;*
LB TYX LB TYX
LDY #$00 LDY #$00
SEP #$20 ; 8 BIT A/M TYA ; QUICKY CLEAR OUT MSB
!AS +ACCMEM8 ; 8 BIT A/M
LDA (TOS,S),Y LDA (TOS,S),Y
REP #$20 ; 16 BIT A/M +ACCMEM16 ; 16 BIT A/M
!AL
AND #$00FF
STA TOS,S STA TOS,S
TXY TXY
JMP NEXTOP JMP NEXTOP
@ -842,14 +861,12 @@ LW TYX
; ;
LBX TYX LBX TYX
LDY #$00 LDY #$00
TYA ; QUICKY CLEAR OUT MSB
STX ALTRDOFF STX ALTRDOFF
SEP #$20 ; 8 BIT A/M +ACCMEM8 ; 8 BIT A/M
!AS
LDA (TOS,S),Y LDA (TOS,S),Y
REP #$20 ; 16 BIT A/M +ACCMEM16 ; 16 BIT A/M
!AL
STX ALTRDON STX ALTRDON
AND #$00FF
STA TOS,S STA TOS,S
TXY TXY
JMP NEXTOP JMP NEXTOP
@ -875,8 +892,8 @@ LLA +INC_IP
;* LOAD VALUE FROM LOCAL FRAME OFFSET ;* LOAD VALUE FROM LOCAL FRAME OFFSET
;* ;*
LLB +INC_IP LLB +INC_IP
LDA (IP),Y
TYX TYX
LDA (IP),Y
TAY TAY
LDA (IFP),Y LDA (IFP),Y
AND #$00FF AND #$00FF
@ -884,8 +901,8 @@ LLB +INC_IP
TXY TXY
JMP NEXTOP JMP NEXTOP
LLW +INC_IP LLW +INC_IP
LDA (IP),Y
TYX TYX
LDA (IP),Y
TAY TAY
LDA (IFP),Y LDA (IFP),Y
PHA PHA
@ -893,8 +910,8 @@ LLW +INC_IP
JMP NEXTOP JMP NEXTOP
; ;
LLBX +INC_IP LLBX +INC_IP
LDA (IP),Y
TYX TYX
LDA (IP),Y
TAY TAY
STX ALTRDOFF STX ALTRDOFF
LDA (IFP),Y LDA (IFP),Y
@ -904,8 +921,8 @@ LLBX +INC_IP
TXY TXY
JMP NEXTOP JMP NEXTOP
LLWX +INC_IP LLWX +INC_IP
LDA (IP),Y
TYX TYX
LDA (IP),Y
TAY TAY
STX ALTRDOFF STX ALTRDOFF
LDA (IFP),Y LDA (IFP),Y
@ -920,12 +937,10 @@ LAB +INC_IP
LDA (IP),Y LDA (IP),Y
+INC_IP +INC_IP
STA TMP STA TMP
SEP #$20 ; 8 BIT A/M TYA ; QUICKY CLEAR OUT MSB
!AS +ACCMEM8 ; 8 BIT A/M
LDA (TMP) LDA (TMP)
REP #$20 ; 16 BIT A/M +ACCMEM16 ; 16 BIT A/M
!AL
AND #$00FF
PHA PHA
JMP NEXTOP JMP NEXTOP
LAW +INC_IP LAW +INC_IP
@ -940,14 +955,12 @@ LABX +INC_IP
LDA (IP),Y LDA (IP),Y
+INC_IP +INC_IP
STA TMP STA TMP
SEP #$20 ; 8 BIT A/M TYA ; QUICKY CLEAR OUT MSB
!AS
STX ALTRDOFF STX ALTRDOFF
+ACCMEM8 ; 8 BIT A/M
LDA (TMP) LDA (TMP)
+ACCMEM16 ; 16 BIT A/M
STX ALTRDON STX ALTRDON
REP #$20 ; 16 BIT A/M
!AL
AND #$00FF
PHA PHA
JMP NEXTOP JMP NEXTOP
LAWX +INC_IP LAWX +INC_IP
@ -965,12 +978,10 @@ LAWX +INC_IP
;* ;*
SB TYX SB TYX
LDY #$00 LDY #$00
SEP #$20 ; 8 BIT A/M +ACCMEM8 ; 8 BIT A/M
!AS
LDA NOS,S LDA NOS,S
STA (TOS,S),Y STA (TOS,S),Y
REP #$20 ; 16 BIT A/M +ACCMEM16 ; 16 BIT A/M
!AL
TXY TXY
PLA PLA
JMP DROP JMP DROP
@ -989,11 +1000,9 @@ SLB +INC_IP
LDA (IP),Y LDA (IP),Y
TAY TAY
PLA PLA
SEP #$20 ; 8 BIT A/M +ACCMEM8 ; 8 BIT A/M
!AS
STA (IFP),Y STA (IFP),Y
REP #$20 ; 16 BIT A/M +ACCMEM16 ; 16 BIT A/M
!AL
TXY TXY
JMP NEXTOP JMP NEXTOP
SLW +INC_IP SLW +INC_IP
@ -1009,14 +1018,12 @@ SLW +INC_IP
;* ;*
DLB +INC_IP DLB +INC_IP
TYX TYX
SEP #$20 ; 8 BIT A/M +ACCMEM8 ; 8 BIT A/M
!AS
LDA (IP),Y LDA (IP),Y
TAY TAY
LDA TOS,S LDA TOS,S
STA (IFP),Y STA (IFP),Y
REP #$20 ; 16 BIT A/M +ACCMEM16 ; 16 BIT A/M
!AL
TXY TXY
JMP NEXTOP JMP NEXTOP
DLW +INC_IP DLW +INC_IP
@ -1035,11 +1042,9 @@ SAB +INC_IP
+INC_IP +INC_IP
STA TMP STA TMP
PLA PLA
SEP #$20 ; 8 BIT A/M +ACCMEM8 ; 8 BIT A/M
!AS
STA (TMP) STA (TMP)
REP #$20 ; 16 BIT A/M +ACCMEM16 ; 16 BIT A/M
!AL
JMP NEXTOP JMP NEXTOP
SAW +INC_IP SAW +INC_IP
LDA (IP),Y LDA (IP),Y
@ -1055,12 +1060,10 @@ DAB +INC_IP
LDA (IP),Y LDA (IP),Y
+INC_IP +INC_IP
STA TMP STA TMP
SEP #$20 ; 8 BIT A/M +ACCMEM8 ; 8 BIT A/M
!AS
LDA TOS,S LDA TOS,S
STA (TMP) STA (TMP)
REP #$20 ; 16 BIT A/M +ACCMEM16 ; 16 BIT A/M
!AL
JMP NEXTOP JMP NEXTOP
DAW +INC_IP DAW +INC_IP
LDA (IP),Y LDA (IP),Y
@ -1227,10 +1230,7 @@ EMUSTK STA TMP
LDX $C010 LDX $C010
+ TAX + TAX
} }
LDA IPH PEI (IP) ; SAVE INSTRUCTION POINTER
PHA
LDA IPL
PHA
PHX ; SAVE BASELINE ESP PHX ; SAVE BASELINE ESP
TYX TYX
LDA PSR LDA PSR
@ -1270,17 +1270,18 @@ EMUSTK STA TMP
BNE - BNE -
CLC ; SWITCH BACK TO NATIVE MODE CLC ; SWITCH BACK TO NATIVE MODE
XCE XCE
REP #$20 ; 16 BIT A/M +ACCMEM16 ; 16 BIT A/M
!AL
LDX #>OPTBL ; MAKE SURE WE'RE INDEXING THE RIGHT TABLE LDX #>OPTBL ; MAKE SURE WE'RE INDEXING THE RIGHT TABLE
!IF DEBUG { !IF DEBUG {
LDY LCRWEN+LCBNK2 LDY LCRWEN+LCBNK2
LDY LCRWEN+LCBNK2 LDY LCRWEN+LCBNK2
STX DBG_OP+2 STX DBG_OP+2
LDY LCRDEN+LCBNK2
LDX #>DBGTBL LDX #>DBGTBL
} }
STX OPPAGE STX OPPAGE
LDY #$00 LDY #$00
+HACK816
JMP NEXTOP JMP NEXTOP
;* ;*
;* CALL INTO ABSOLUTE ADDRESS (NATIVE CODE) ;* CALL INTO ABSOLUTE ADDRESS (NATIVE CODE)
@ -1342,10 +1343,7 @@ EMUSTKX STA TMP
LDX $C010 LDX $C010
+ TAX + TAX
} }
LDA IPH PEI (IP) ; SAVE INSTRUCTION POINTER
PHA
LDA IPL
PHA
PHX ; SAVE BASELINE ESP PHX ; SAVE BASELINE ESP
TYX TYX
STX ALTRDOFF STX ALTRDOFF
@ -1387,17 +1385,18 @@ EMUSTKX STA TMP
BNE - BNE -
CLC ; SWITCH BACK TO NATIVE MODE CLC ; SWITCH BACK TO NATIVE MODE
XCE XCE
REP #$20 ; 16 BIT A/M +ACCMEM16 ; 16 BIT A/M
!AL LDX #>OPXTBL ; MAKE SURE WE'RE INDEXING THE RIGHT TABLE
LDX #>OPXTBL ; MAKE SURE WE'RE INDEXING THE RIGHT TABLE
!IF DEBUG { !IF DEBUG {
LDY LCRWEN+LCBNK2 LDY LCRWEN+LCBNK2
LDY LCRWEN+LCBNK2 LDY LCRWEN+LCBNK2
STX DBG_OP+2 STX DBG_OP+2
LDY LCRDEN+LCBNK2
LDX #>DBGTBL LDX #>DBGTBL
} }
STX OPPAGE STX OPPAGE
LDY #$00 LDY #$00
+HACK816
JMP NEXTOP JMP NEXTOP
;* ;*
;* JUMP INDIRECT THROUGH TMP ;* JUMP INDIRECT THROUGH TMP
@ -1407,8 +1406,8 @@ JMPTMP JMP (TMP)
;* ENTER FUNCTION WITH FRAME SIZE AND PARAM COUNT ;* ENTER FUNCTION WITH FRAME SIZE AND PARAM COUNT
;* ;*
ENTER INY ENTER INY
SEP #$20 ; 8 BIT A/M TYA ; QUICKY CLEAR OUT MSB
!AS +ACCMEM8 ; 8 BIT A/M
LDA (IP),Y LDA (IP),Y
!IF DEBUG { !IF DEBUG {
PHA PHA
@ -1419,16 +1418,14 @@ ENTER INY
} }
PHA ; SAVE ON STACK FOR LEAVE PHA ; SAVE ON STACK FOR LEAVE
DEC HWSP ; UPDATE HWSP TO SKIP FRAME SIZE DEC HWSP ; UPDATE HWSP TO SKIP FRAME SIZE
REP #$20 ; 16 BIT A/M +ACCMEM16 ; 16 BIT A/M
!AL ; AND #$00FF
AND #$00FF
EOR #$FFFF ; ALLOCATE FRAME EOR #$FFFF ; ALLOCATE FRAME
SEC SEC
ADC PP ADC PP
STA PP STA PP
STA IFP STA IFP
SEP #$20 ; 8 BIT A/M +ACCMEM8 ; 8 BIT A/M
!AS
INY INY
LDA (IP),Y LDA (IP),Y
BEQ + BEQ +
@ -1444,16 +1441,14 @@ ENTER INY
STA (IFP),Y STA (IFP),Y
BNE - BNE -
STX ESP STX ESP
+ REP #$20 ; 16 BIT A/M + +ACCMEM16 ; 16 BIT A/M
!AL
LDY #$02 LDY #$02
JMP NEXTOP JMP NEXTOP
;* ;*
;* LEAVE FUNCTION ;* LEAVE FUNCTION
;* ;*
LEAVEX STX ALTRDOFF LEAVEX STX ALTRDOFF
LEAVE SEP #$20 ; 8 BIT A/M LEAVE +ACCMEM8 ; 8 BIT A/M
!AS
TSC ; MOVE HW EVAL STACK TO ZP EVAL STACK TSC ; MOVE HW EVAL STACK TO ZP EVAL STACK
EOR #$FF EOR #$FF
SEC SEC
@ -1479,7 +1474,7 @@ LEAVE SEP #$20 ; 8 BIT A/M
INX INX
+ CPX ESP + CPX ESP
BNE - BNE -
!IF DEBUG { !IF DEBUG {
STX TMPL STX TMPL
TSX TSX
CPX HWSP CPX HWSP
@ -1493,8 +1488,7 @@ LEAVE SEP #$20 ; 8 BIT A/M
} }
TYX ; RESTORE NEW ESP TYX ; RESTORE NEW ESP
PLA ; DEALLOCATE POOL + FRAME PLA ; DEALLOCATE POOL + FRAME
REP #$20 ; 16 BIT A/M +ACCMEM16 ; 16 BIT A/M
!AL
AND #$00FF AND #$00FF
CLC CLC
ADC IFP ADC IFP
@ -1509,8 +1503,7 @@ LEAVE SEP #$20 ; 8 BIT A/M
RTS RTS
; ;
RETX STX ALTRDOFF RETX STX ALTRDOFF
RET SEP #$20 ; 8 BIT A/M RET +ACCMEM8 ; 8 BIT A/M
!AS
TSC ; MOVE HW EVAL STACK TO ZP EVAL STACK TSC ; MOVE HW EVAL STACK TO ZP EVAL STACK
EOR #$FF EOR #$FF
SEC SEC
@ -1549,8 +1542,7 @@ RET SEP #$20 ; 8 BIT A/M
+ LDX TMPL + LDX TMPL
} }
TYX TYX
REP #$20 ; 16 BIT A/M +ACCMEM16 ; 16 BIT A/M
!AL
LDA IFP ; DEALLOCATE POOL LDA IFP ; DEALLOCATE POOL
STA PP STA PP
PLA ; RESTORE PREVIOUS FRAME PLA ; RESTORE PREVIOUS FRAME
@ -1621,15 +1613,37 @@ PRWORD PHA
PLA PLA
JMP PRHEX JMP PRHEX
!AL !AL
; MESSAGES
BADEMU !TEXT "IN EMULATION MODE!", 0
BADMODE !TEXT "IN 8 BIT A/M MODE!", 0
;* ;*
;* DEBUG STEP ROUTINE ;* DEBUG STEP ROUTINE
;* ;*
STEP STX TMPL STEP STX TMPL
LDX $C013 ; SAVE RAMRD PHP ; VALIDATE MODES
SEC ; SWITCH TO EMULATED MODE
XCE
+ACCMEM8 ; 8 BIT A/M
BCC +
LDX #$00
-- LDA BADEMU,X
- BEQ -
JSR PRCHR
BRA --
+ XCE ; SWITCH BACK TO NATIVE MODE
PLX
TXA
AND #$20
BEQ ++
LDX #$00
- LDA BADMODE,X
BNE +
JMP DBGKEY
+ JSR PRCHR
BRA -
++ LDX $C013 ; SAVE RAMRD
STX $C002 STX $C002
STX TMPH STX TMPH
SEP #$20 ; 8 BIT A/M
!AS
LDX #39 ; SCROLL PREVIOUS LINES UP LDX #39 ; SCROLL PREVIOUS LINES UP
- LDA $6D0,X - LDA $6D0,X
STA $650,X STA $650,X
@ -1639,28 +1653,27 @@ STEP STX TMPL
STA $750,X STA $750,X
DEX DEX
BPL - BPL -
LDA #' '
BIT TMPH ; RAMRD SET? BIT TMPH ; RAMRD SET?
BPL + BPL +
STA $C003 STX $C003
LDA #'X'
+ LDX #$00 + LDX #$00
REP #$20 ; 16 BIT A/M JSR PRCHR
!AL +ACCMEM16 ; 16 BIT A/M
TYA TYA
CLC CLC
ADC IP ADC IP
SEP #$20 ; 8 BIT A/M +ACCMEM8 ; 8 BIT A/M
!AS
JSR PRWORD JSR PRWORD
LDA #':' LDA #':'
JSR PRCHR JSR PRCHR
LDA (IP),Y LDA (IP),Y
JSR PRBYTE JSR PRBYTE
INX INX
REP #$20 ; 16 BIT A/M +ACCMEM16 ; 16 BIT A/M
!AL
TSC TSC
SEP #$20 ; 8 BIT A/M +ACCMEM8 ; 8 BIT A/M
!AS
JSR PRWORD JSR PRWORD
LDA #$80+'[' LDA #$80+'['
JSR PRCHR JSR PRCHR
@ -1740,8 +1753,7 @@ DBGKEY STX $C010
LDA #$04 LDA #$04
STA $29 STA $29
BRK BRK
+ REP #$20 ; 16 BIT A/M + +ACCMEM16 ; 16 BIT A/M
!AL
LDX TMPL LDX TMPL
DBG_OP JMP (OPTBL,X) DBG_OP JMP (OPTBL,X)
} }