VM02/plasma2/plstub.s

334 lines
4.6 KiB
ArmAsm
Executable File

.PC02
.DEFINE EQU =
.DEFINE DB .BYTE
.DEFINE DW .WORD
.DEFINE DS .RES
;*
;* LANGUAGE CARD CONTROL
;*
LCBNK2 EQU $C080
ROMIN EQU $C081
;**********************************************************
;*
;* VM ZERO PAGE LOCATIONS
;*
;**********************************************************
ESTKSZ EQU $20
ESTK EQU $C0
ESTKL EQU ESTK
ESTKH EQU ESTK+ESTKSZ/2
VMZP EQU ESTK+ESTKSZ
FRMP EQU VMZP+$00
FRMPL EQU FRMP
FRMPH EQU FRMP+1
PC EQU VMZP+$02
PCL EQU PC
PCH EQU PC+1
JSROP EQU VMZP+$0D
;*
;* PAGE 3 ENTRYPOINTS TO INTERNAL ROUTINES
;*
INTERP EQU $03D0
INTERPX EQU $03D6
LEAVE EQU $03DC
ENTER EQU $03E2
;*
;* INTERNAL OPCODE ADDRESS ADDRESSES (FROM OPTBL)
;*
_ZERO EQU $D000
_ADD EQU $D002
_SUB EQU $D004
_MUL EQU $D006
_DIV EQU $D008
_DIVMOD EQU $D00A
_INCR EQU $D00C
_DECR EQU $D00E
_NEG EQU $D010
_COMP EQU $D012
_BAND EQU $D014
_IOR EQU $D016
_XOR EQU $D018
_SHL EQU $D01A
_SHR EQU $D01C
_IDXW EQU $D01E
_NOT EQU $D020
_LOR EQU $D022
_LAND EQU $D024
_LA EQU $D026
_LLA EQU $D028
_CB EQU $D02A
_CW EQU $D02C
_SWAP EQU $D02E
_DROP EQU $D030
_DUP EQU $D032
_PUSH EQU $D034
_PULL EQU $D036
_SKPLT EQU $D038
_SKPGT EQU $D03A
_SKPEQ EQU $D03C
_SKPNE EQU $D03E
_ISEQ EQU $D040
_ISNE EQU $D042
_ISGT EQU $D044
_ISLT EQU $D046
_ISGE EQU $D048
_ISLE EQU $D04A
_SKPFLS EQU $D04C
_SKPTRU EQU $D04E
_SKIP EQU $D050
_ISKIP EQU $D052
_CALL EQU $D054
_ICAL EQU $D056
_ENTER EQU $D058
_LEAVE EQU $D05A
_RET EQU $D05C
_INT EQU $D05E
_LB EQU $D060
_LW EQU $D062
_LLB EQU $D064
_LLW EQU $D066
_LAB EQU $D068
_LAW EQU $D06A
_DLB EQU $D06C
_DLW EQU $D06E
_SB EQU $D070
_SW EQU $D072
_SLB EQU $D074
_SLW EQU $D076
_SAB EQU $D078
_SAW EQU $D07A
_DAB EQU $D07C
_DAW EQU $D07E
JMP _ENTRY
DB $EE,$EE
DB 65,00
DS 64
NOPLASMA: DB 39, " PLASMA VM NOT LOADED. PRESS ANY KEY..."
_ENTRY: BIT LCBNK2
LDA $D101
CMP #$B8 ; CLV
BEQ _JMPSTART
BIT ROMIN
LDY #$00
: INY
LDA NOPLASMA,Y
ORA #$80
JSR $FDED
CPY NOPLASMA
BNE :-
JSR $FD0C
JMP _EXIT
_JMPSTART: LDX #$FE ; LEAVE $1FF AVAIL FOR RDSTR()
TXS
LDX #$00
LDA #$BF
STX FRMPL
STA FRMPH
LDY #>START
LDA #<START
JSR $D104
;*
;* EXIT TO PRODOS
;*
_EXIT: JSR $BF00
DB $65
DW _EXITPARMS
_EXITPARMS:
DB 4
DB 0
;*
;* ENTER INTO INLINE BYTECODE
;* USING FAST INTERPRETER WITHOUT CHECKS
;*
_INTERP: BIT $C080
PLA
STA PCL
PLA
STA PCH
LDA #$00
INC
CMP #$01
BEQ NEXTOPC
LDY #$00
BEQ NEXTOP
FETCHOP:
LDA (PC),Y
STA JSROP+1
JSR JSROP
NEXTOP:
INC PCL
BNE FETCHOP
INC PCH
BNE FETCHOP
FETCHOPC:
LDA (PC)
STA JSROP+1
JSR JSROP
NEXTOPC:
INC PCL
BNE FETCHOPC
INC PCH
BNE FETCHOPC
;*
;* INDIRECT CALLS TO VM OPS
;*
;ZERO: JMP (_ZERO)
ADD: ;JMP (_ADD)
LDY #$02
BNE FIXUP
SUB: ;JMP (_SUB)
LDY #$04
BNE FIXUP
MUL: ;JMP (_MUL)
LDY #$06
BNE FIXUP
DIV: ;JMP (_DIV)
LDY #$08
BNE FIXUP
DIVMOD: ;JMP (_DIVMOD)
LDY #$0A
BNE FIXUP
;INCR: JMP (_INCR)
;DECR: JMP (_DECR)
NEG: ;JMP (_NEG)
LDY #$10
BNE FIXUP
COMP: ;JMP (_COMP)
LDY #$12
BNE FIXUP
BAND: ;JMP (_BAND)
LDY #$14
BNE FIXUP
IOR: ;JMP (_IOR)
LDY #$16
BNE FIXUP
XOR: ;JMP (_XOR)
LDY #$18
BNE FIXUP
SHL: ;JMP (_SHL)
LDY #$1A
BNE FIXUP
SHR: ;JMP (_SHR)
LDY #$1C
BNE FIXUP
IDXW: ;JMP (_IDXW)
LDY #$1E
BNE FIXUP
NOT: ;JMP (_NOT)
LDY #$20
BNE FIXUP
LOR: ;JMP (_LOR)
LDY #$22
BNE FIXUP
LAND: ;JMP (_LAND)
LDY #$24
BNE FIXUP
LA: ;JMP (_LA)
LDY #$26
BNE FIXUP
LLA: ;JMP (_LLA)
LDY #$28
BNE FIXUP
;CB: JMP (_CB)
;CW: JMP (_CW)
SWAP: ;JMP (_SWAP)
LDY #$2E
BNE FIXUP
;DROP: JMP (_DROP)
;DUP: JMP (_DUP)
;PUSH: JMP (_PUSH)
;PULL: JMP (_PULL)
;SKLT: JMP (_SKPLT)
;SKGT: JMP (_SKPGT)
;SKEQ: JMP (_SKPEQ)
;SKNE: JMP (_SKPNE)
ISEQ: ;JMP (_ISEQ)
LDY #$40
BNE FIXUP
ISNE: ;JMP (_ISNE)
LDY #$42
BNE FIXUP
ISGT: ;JMP (_ISGT)
LDY #$44
BNE FIXUP
ISLT: ;JMP (_ISLT)
LDY #$46
BNE FIXUP
ISGE: ;JMP (_ISGE)
LDY #$48
BNE FIXUP
ISLE: ;JMP (_ISLE)
LDY #$4A
BNE FIXUP
;SKFLS: JMP (_SKPFLS)
;SKTRU: JMP (_SKPTRU)
;SKIP: JMP (_SKPIP)
;ISKIP: JMP (_ISKIP)
;CALL: JMP (_CALL)
ICAL: ;JMP (_ICAL)
LDY #$56
BNE FIXUP
;ENTER: JMP (_ENTER)
;LEAVE: JMP (_LEAVE)
;RET: JMP (_RET)
;INT: ;JMP (_INT)
; LDY #$5E
; BNE FIXUP
LB: ;JMP (_LB)
LDY #$60
BNE FIXUP
LW: ;JMP (_LW)
LDY #$62
BNE FIXUP
;LLB: JMP (_LLB)
;LLW: JMP (_LLW)
;LAB: JMP (_LAB)
;LAW: JMP (_LAW)
;DLB: JMP (_DLB)
;DLW: JMP (_DLW)
SB: ;JMP (_SB)
LDY #$70
BNE FIXUP
SW: ;JMP (_SW)
LDY #$72
; BNE FIXUP
;SLB: JMP (_SLB)
;SLW: JMP (_SLW)
;SAB: JMP (_SAB)
;SAW: JMP (_SAW)
;DAB: JMP (_DAB)
;DAW: JMP (_DAW)
FIXUP: PLA
STA $06
SEC
SBC #$01
STA $08
PLA
STA $07
SBC #$00
STA $9
LDA $D000,Y
PHA
LDA $D001,Y
LDY #$01
STA ($08),Y
STA $0B
DEY
PLA
STA ($08),Y
STA $0A
LDA $07
PHA
LDA $06
PHA
JMP ($0A)