mirror of https://github.com/dschmenk/VM02.git
334 lines
4.6 KiB
ArmAsm
Executable File
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)
|