mirror of https://github.com/dschmenk/VM02.git
503 lines
8.7 KiB
PHP
Executable File
503 lines
8.7 KiB
PHP
Executable File
;*
|
|
;* DVM STACK BASED OPCODE INTERPRETER FOR 6502
|
|
;* MACROS FOR MNEMONI CS
|
|
;*
|
|
;
|
|
; ENTRY/EXIT
|
|
;
|
|
.IMPORT DVM
|
|
|
|
.MACRO DVM_BEGIN
|
|
JSR DVM
|
|
.ENDMACRO
|
|
.MACRO DVM_END
|
|
.BYTE $30
|
|
.ENDMACRO
|
|
.MACRO DVM_ENTER
|
|
JSR ENTER_DVM
|
|
.ENDMACRO
|
|
.MACRO DVM_EXIT
|
|
.BYTE $30
|
|
.ENDMACRO
|
|
;
|
|
; LOAD OPS
|
|
;
|
|
.MACRO LD0B
|
|
.BYTE $00
|
|
.ENDMACRO
|
|
.MACRO LD0W
|
|
.BYTE $80
|
|
.ENDMACRO
|
|
.MACRO LD1B
|
|
.BYTE $01
|
|
.ENDMACRO
|
|
.MACRO LD1W
|
|
.BYTE $81
|
|
.ENDMACRO
|
|
.MACRO LD2B
|
|
.BYTE $02
|
|
.ENDMACRO
|
|
.MACRO LD2W
|
|
.BYTE $82
|
|
.ENDMACRO
|
|
.MACRO LD3B
|
|
.BYTE $03
|
|
.ENDMACRO
|
|
.MACRO LD3W
|
|
.BYTE $83
|
|
.ENDMACRO
|
|
.MACRO LD4B
|
|
.BYTE $04
|
|
.ENDMACRO
|
|
.MACRO LD4W
|
|
.BYTE $84
|
|
.ENDMACRO
|
|
.MACRO LD5B
|
|
.BYTE $05
|
|
.ENDMACRO
|
|
.MACRO LD5W
|
|
.BYTE $85
|
|
.ENDMACRO
|
|
.MACRO DUPB
|
|
.BYTE $06
|
|
.ENDMACRO
|
|
.MACRO DUPW
|
|
.BYTE $86
|
|
.ENDMACRO
|
|
.MACRO DUP2B
|
|
.BYTE $07
|
|
.ENDMACRO
|
|
.MACRO DUP2W
|
|
.BYTE $87
|
|
.ENDMACRO
|
|
.MACRO SWAPB
|
|
.BYTE $08
|
|
.ENDMACRO
|
|
.MACRO SWAPW
|
|
.BYTE $88
|
|
.ENDMACRO
|
|
.MACRO LDCB LIT8
|
|
.BYTE $09, LIT8
|
|
.ENDMACRO
|
|
.MACRO LDCW LIT16
|
|
.BYTE $89, >(LIT16), <(LIT16)
|
|
.ENDMACRO
|
|
.MACRO LDZPB ZP
|
|
.BYTE $0A, ZP
|
|
.ENDMACRO
|
|
.MACRO LDZPW ZP
|
|
.BYTE $8A, ZP
|
|
.ENDMACRO
|
|
.MACRO LDB MEM
|
|
.BYTE $0B
|
|
.ADDR MEM
|
|
.ENDMACRO
|
|
.MACRO LDW MEM
|
|
.BYTE $8B
|
|
.ADDR MEM
|
|
.ENDMACRO
|
|
.MACRO LDPB ZP, OFST8
|
|
.BYTE $0C, ZP, OFST8
|
|
.ENDMACRO
|
|
.MACRO LDPW ZP, OFST8
|
|
.BYTE $8C, ZP, OFST8
|
|
.ENDMACRO
|
|
.MACRO LDPINCB ZP
|
|
.BYTE $0D, ZP
|
|
.ENDMACRO
|
|
.MACRO LDPINCW ZP
|
|
.BYTE $8D, ZP
|
|
.ENDMACRO
|
|
.MACRO LDPDECB ZP
|
|
.BYTE $0E, ZP
|
|
.ENDMACRO
|
|
.MACRO LDPDECW ZP
|
|
.BYTE $8E, ZP
|
|
.ENDMACRO
|
|
.MACRO LDINDB
|
|
.BYTE $0F
|
|
.ENDMACRO
|
|
.MACRO LDINDW
|
|
.BYTE $8F
|
|
.ENDMACRO
|
|
;
|
|
; STORE OPS
|
|
;
|
|
.MACRO STZPB ZP
|
|
.BYTE $12, ZP
|
|
.ENDMACRO
|
|
.MACRO STZPW ZP
|
|
.BYTE $92, ZP
|
|
.ENDMACRO
|
|
.MACRO STB MEM
|
|
.BYTE $13
|
|
.ADDR MEM
|
|
.ENDMACRO
|
|
.MACRO STW MEM
|
|
.BYTE $93
|
|
.ADDR MEM
|
|
.ENDMACRO
|
|
.MACRO STPB ZP, OFST8
|
|
.BYTE $14, ZP, OFST8
|
|
.ENDMACRO
|
|
.MACRO STPW ZP, OFST8
|
|
.BYTE $94, ZP, OFST8
|
|
.ENDMACRO
|
|
.MACRO STPINCB ZP
|
|
.BYTE $15, ZP
|
|
.ENDMACRO
|
|
.MACRO STPINCW ZP
|
|
.BYTE $95, ZP
|
|
.ENDMACRO
|
|
.MACRO STPDECB ZP
|
|
.BYTE $16, ZP
|
|
.ENDMACRO
|
|
.MACRO STPDECW ZP
|
|
.BYTE $96, ZP
|
|
.ENDMACRO
|
|
.MACRO STINDB
|
|
.BYTE $17
|
|
.ENDMACRO
|
|
.MACRO STINDW
|
|
.BYTE $97
|
|
.ENDMACRO
|
|
;
|
|
; POP
|
|
;
|
|
.MACRO POPB
|
|
.BYTE $10
|
|
.ENDMACRO
|
|
.MACRO POPW
|
|
.BYTE $90
|
|
.ENDMACRO
|
|
.MACRO POP2B
|
|
.BYTE $11
|
|
.ENDMACRO
|
|
.MACRO POP2W
|
|
.BYTE $91
|
|
.ENDMACRO
|
|
;
|
|
; MATH OPS
|
|
;
|
|
.MACRO ZEXTB
|
|
.BYTE $18
|
|
.ENDMACRO
|
|
.MACRO SEXTB
|
|
.BYTE $98
|
|
.ENDMACRO
|
|
.MACRO NEGB
|
|
.BYTE $19
|
|
.ENDMACRO
|
|
.MACRO NEGW
|
|
.BYTE $99
|
|
.ENDMACRO
|
|
.MACRO NOTB
|
|
.BYTE $1A
|
|
.ENDMACRO
|
|
.MACRO NOTW
|
|
.BYTE $9A
|
|
.ENDMACRO
|
|
.MACRO ADDB
|
|
.BYTE $1B
|
|
.ENDMACRO
|
|
.MACRO ADDW
|
|
.BYTE $9B
|
|
.ENDMACRO
|
|
.MACRO SUBB
|
|
.BYTE $1C
|
|
.ENDMACRO
|
|
.MACRO SUBW
|
|
.BYTE $9C
|
|
.ENDMACRO
|
|
.MACRO ANDB
|
|
.BYTE $1D
|
|
.ENDMACRO
|
|
.MACRO ANDW
|
|
.BYTE $9D
|
|
.ENDMACRO
|
|
.MACRO ORB
|
|
.BYTE $1E
|
|
.ENDMACRO
|
|
.MACRO ORW
|
|
.BYTE $9E
|
|
.ENDMACRO
|
|
.MACRO XORB
|
|
.BYTE $1F
|
|
.ENDMACRO
|
|
.MACRO XORW
|
|
.BYTE $9F
|
|
.ENDMACRO
|
|
;
|
|
; BRANCH OPS
|
|
;
|
|
.MACRO BRZB DST
|
|
.BYTE $20
|
|
.ASSERT (1+DST-*) < 128, ERROR, "BRANCH > 127"
|
|
.ASSERT (1+DST-*) > -129, ERROR, "BRANCH < -128"
|
|
.BYTE 1+DST-*
|
|
.ENDMACRO
|
|
.MACRO BRZW DST
|
|
.BYTE $A0
|
|
.ASSERT (1+DST-*) < 128, ERROR, "BRANCH > 127"
|
|
.ASSERT (1+DST-*) > -129, ERROR, "BRANCH < -128"
|
|
.BYTE 1+DST-*
|
|
.ENDMACRO
|
|
.MACRO BRNZB DST
|
|
.BYTE $21
|
|
.ASSERT (1+DST-*) < 128, ERROR, "BRANCH > 127"
|
|
.ASSERT (1+DST-*) > -129, ERROR, "BRANCH < -128"
|
|
.BYTE 1+DST-*
|
|
.ENDMACRO
|
|
.MACRO BRNZW DST
|
|
.BYTE $A1
|
|
.ASSERT (1+DST-*) < 128, ERROR, "BRANCH > 127"
|
|
.ASSERT (1+DST-*) > -129, ERROR, "BRANCH < -128"
|
|
.BYTE 1+DST-*
|
|
.ENDMACRO
|
|
.MACRO BRPOSB DST
|
|
.BYTE $22
|
|
.ASSERT (1+DST-*) < 128, ERROR, "BRANCH > 127"
|
|
.ASSERT (1+DST-*) > -129, ERROR, "BRANCH < -128"
|
|
.BYTE 1+DST-*
|
|
.ENDMACRO
|
|
.MACRO BRPOSW DST
|
|
.BYTE $A2
|
|
.ASSERT (1+DST-*) < 128, ERROR, "BRANCH > 127"
|
|
.ASSERT (1+DST-*) > -129, ERROR, "BRANCH < -128"
|
|
.BYTE 1+DST-*
|
|
.ENDMACRO
|
|
.MACRO BRNEGB DST
|
|
.BYTE $23
|
|
.ASSERT (1+DST-*) < 128, ERROR, "BRANCH > 127"
|
|
.ASSERT (1+DST-*) > -129, ERROR, "BRANCH < -128"
|
|
.BYTE 1+DST-*
|
|
.ENDMACRO
|
|
.MACRO BRNEGW DST
|
|
.BYTE $A3
|
|
.ASSERT (1+DST-*) < 128, ERROR, "BRANCH > 127"
|
|
.ASSERT (1+DST-*) > -129, ERROR, "BRANCH < -128"
|
|
.BYTE 1+DST-*
|
|
.ENDMACRO
|
|
.MACRO BREQUB DST
|
|
.BYTE $24
|
|
.ASSERT (1+DST-*) < 128, ERROR, "BRANCH > 127"
|
|
.ASSERT (1+DST-*) > -129, ERROR, "BRANCH < -128"
|
|
.BYTE 1+DST-*
|
|
.ENDMACRO
|
|
.MACRO BREQUW DST
|
|
.BYTE $A4
|
|
.ASSERT (1+DST-*) < 128, ERROR, "BRANCH > 127"
|
|
.ASSERT (1+DST-*) > -129, ERROR, "BRANCH < -128"
|
|
.BYTE 1+DST-*
|
|
.ENDMACRO
|
|
.MACRO BRNEQB DST
|
|
.BYTE $25
|
|
.ASSERT (1+DST-*) < 128, ERROR, "BRANCH > 127"
|
|
.ASSERT (1+DST-*) > -129, ERROR, "BRANCH < -128"
|
|
.BYTE 1+DST-*
|
|
.ENDMACRO
|
|
.MACRO BRNEQW DST
|
|
.BYTE $A5
|
|
.ASSERT (1+DST-*) < 128, ERROR, "BRANCH > 127"
|
|
.ASSERT (1+DST-*) > -129, ERROR, "BRANCH < -128"
|
|
.BYTE 1+DST-*
|
|
.ENDMACRO
|
|
.MACRO BRGTB DST
|
|
.BYTE $26
|
|
.ASSERT (1+DST-*) < 128, ERROR, "BRANCH > 127"
|
|
.ASSERT (1+DST-*) > -129, ERROR, "BRANCH < -128"
|
|
.BYTE 1+DST-*
|
|
.ENDMACRO
|
|
.MACRO BRGTW DST
|
|
.BYTE $A6
|
|
.ASSERT (1+DST-*) < 128, ERROR, "BRANCH > 127"
|
|
.ASSERT (1+DST-*) > -129, ERROR, "BRANCH < -128"
|
|
.BYTE 1+DST-*
|
|
.ENDMACRO
|
|
.MACRO BRLEB DST
|
|
.BYTE $27
|
|
.ASSERT (1+DST-*) < 128, ERROR, "BRANCH > 127"
|
|
.ASSERT (1+DST-*) > -129, ERROR, "BRANCH < -128"
|
|
.BYTE 1+DST-*
|
|
.ENDMACRO
|
|
.MACRO BRLEW DST
|
|
.BYTE $A7
|
|
.ASSERT (1+DST-*) < 128, ERROR, "BRANCH > 127"
|
|
.ASSERT (1+DST-*) > -129, ERROR, "BRANCH < -128"
|
|
.BYTE 1+DST-*
|
|
.ENDMACRO
|
|
.MACRO BRGEB DST
|
|
.BYTE $11, $27 ; SWAPB, BRLEB
|
|
.ASSERT (1+DST-*) < 128, ERROR, "BRANCH > 127"
|
|
.ASSERT (1+DST-*) > -129, ERROR, "BRANCH < -128"
|
|
.BYTE 1+DST-*
|
|
.ENDMACRO
|
|
.MACRO BRGEW DST
|
|
.BYTE $91, $A7 ; SWAPW, BRLEW
|
|
.ASSERT (1+DST-*) < 128, ERROR, "BRANCH > 127"
|
|
.ASSERT (1+DST-*) > -129, ERROR, "BRANCH < -128"
|
|
.BYTE 1+DST-*
|
|
.ENDMACRO
|
|
.MACRO BRLTB DST
|
|
.BYTE $11, $26 ; SWAPB, BRGTB
|
|
.ASSERT (1+DST-*) < 128, ERROR, "BRANCH > 127"
|
|
.ASSERT (1+DST-*) > -129, ERROR, "BRANCH < -128"
|
|
.BYTE 1+DST-*
|
|
.ENDMACRO
|
|
.MACRO BRLTW DST
|
|
.BYTE $91, $A6 ; SWAPW, BRGTW
|
|
.ASSERT (1+DST-*) < 128, ERROR, "BRANCH > 127"
|
|
.ASSERT (1+DST-*) > -129, ERROR, "BRANCH < -128"
|
|
.BYTE 1+DST-*
|
|
.ENDMACRO
|
|
.MACRO BRAB DST
|
|
.BYTE $28
|
|
.ASSERT (1+DST-*) < 128, ERROR, "BRANCH > 127"
|
|
.ASSERT (1+DST-*) > -129, ERROR, "BRANCH < -128"
|
|
.BYTE 1+DST-*
|
|
.ENDMACRO
|
|
.MACRO BRAW DST
|
|
.BYTE $A8
|
|
.ASSERT (1+DST-*) < 128, ERROR, "BRANCH > 127"
|
|
.ASSERT (1+DST-*) > -129, ERROR, "BRANCH < -128"
|
|
.BYTE 1+DST-*
|
|
.ENDMACRO
|
|
.MACRO BRBEB DST
|
|
.BYTE $29
|
|
.ASSERT (1+DST-*) < 128, ERROR, "BRANCH > 127"
|
|
.ASSERT (1+DST-*) > -129, ERROR, "BRANCH < -128"
|
|
.BYTE 1+DST-*
|
|
.ENDMACRO
|
|
.MACRO BRBEW DST
|
|
.BYTE $A9
|
|
.ASSERT (1+DST-*) < 128, ERROR, "BRANCH > 127"
|
|
.ASSERT (1+DST-*) > -129, ERROR, "BRANCH < -128"
|
|
.BYTE 1+DST-*
|
|
.ENDMACRO
|
|
.MACRO BRAEB DST
|
|
.BYTE $08, $29 ; SWAPB, BRBEB
|
|
.ASSERT (1+DST-*) < 128, ERROR, "BRANCH > 127"
|
|
.ASSERT (1+DST-*) > -129, ERROR, "BRANCH < -128"
|
|
.BYTE 1+DST-*
|
|
.ENDMACRO
|
|
.MACRO BRAEW DST
|
|
.BYTE $88, $A9 ; SWAPW, BRBEW
|
|
.ASSERT (1+DST-*) < 128, ERROR, "BRANCH > 127"
|
|
.ASSERT (1+DST-*) > -129, ERROR, "BRANCH < -128"
|
|
.BYTE 1+DST-*
|
|
.ENDMACRO
|
|
.MACRO BRBB DST
|
|
.BYTE $08, $28 ; SWAPB, BRAB
|
|
.ASSERT (1+DST-*) < 128, ERROR, "BRANCH > 127"
|
|
.ASSERT (1+DST-*) > -129, ERROR, "BRANCH < -128"
|
|
.BYTE 1+DST-*
|
|
.ENDMACRO
|
|
.MACRO BRBW DST
|
|
.BYTE $88, $A8 ; SWAPW, BRAW
|
|
.ASSERT (1+DST-*) < 128, ERROR, "BRANCH > 127"
|
|
.ASSERT (1+DST-*) > -129, ERROR, "BRANCH < -128"
|
|
.BYTE 1+DST-*
|
|
.ENDMACRO
|
|
.MACRO BRNCH DST
|
|
.BYTE $2A
|
|
.ASSERT (1+DST-*) < 128, ERROR, "BRANCH > 127"
|
|
.ASSERT (1+DST-*) > -129, ERROR, "BRANCH < -128"
|
|
.BYTE 1+DST-*
|
|
.ENDMACRO
|
|
.MACRO DECJNZB MEM, DST
|
|
.BYTE $2B
|
|
.ADDR MEM
|
|
.ASSERT (3+DST-*) < 32768, ERROR, "JUMP > 32768"
|
|
.ASSERT (3+DST-*) > -32768, ERROR, "JUMP < -32768"
|
|
.WORD 3+DST-*
|
|
.ENDMACRO
|
|
.MACRO DECJNZW MEM, DST
|
|
.BYTE $AB
|
|
.ADDR MEM
|
|
.ASSERT (3+DST-*) < 32768, ERROR, "JUMP > 32768"
|
|
.ASSERT (3+DST-*) > -32768, ERROR, "JUMP < -32768"
|
|
.WORD 3+DST-*
|
|
.ENDMACRO
|
|
;
|
|
; SHIFT OPERATIONS
|
|
;
|
|
.MACRO SHLB
|
|
.BYTE $2C
|
|
.ENDMACRO
|
|
.MACRO SHLW
|
|
.BYTE $AC
|
|
.ENDMACRO
|
|
.MACRO SHRB
|
|
.BYTE $2D
|
|
.ENDMACRO
|
|
.MACRO SHRW
|
|
.BYTE $AD
|
|
.ENDMACRO
|
|
;
|
|
; INC/DEC OPERATIONS
|
|
;
|
|
.MACRO INCRB
|
|
.BYTE $2E
|
|
.ENDMACRO
|
|
.MACRO INCRW
|
|
.BYTE $AE
|
|
.ENDMACRO
|
|
.MACRO DECRB
|
|
.BYTE $2F
|
|
.ENDMACRO
|
|
.MACRO DECRW
|
|
.BYTE $AF
|
|
.ENDMACRO
|
|
;
|
|
; CONTROL FLOW OPERATIONS
|
|
;
|
|
;.MACRO EXIT
|
|
; .BYTE $30
|
|
;.ENDMACRO
|
|
.MACRO JUMP DST
|
|
.BYTE $31
|
|
.ASSERT (1+DST-*) < 32768, ERROR, "JUMP > 32767"
|
|
.ASSERT (1+DST-*) > -32769, ERROR, "JUMP < -32768"
|
|
.WORD 1+DST-*
|
|
.ENDMACRO
|
|
.MACRO JUMPIND
|
|
.BYTE $B1
|
|
.ENDMACRO
|
|
.MACRO CALL DST
|
|
.BYTE $32
|
|
.ASSERT (1+DST-*) < 32768, ERROR, "CALL > 32767"
|
|
.ASSERT (1+DST-*) > -32769, ERROR, "CALL < -32768"
|
|
.WORD 1+DST-*
|
|
.ENDMACRO
|
|
.MACRO CALLIND
|
|
.BYTE $B2
|
|
.ENDMACRO
|
|
.MACRO RET
|
|
.BYTE $33
|
|
.ENDMACRO
|
|
.MACRO CALL_02 DST
|
|
.BYTE $34
|
|
.ADDR DST
|
|
.ENDMACRO
|
|
.MACRO CALLIND_02
|
|
.BYTE $B4
|
|
.ENDMACRO
|
|
.MACRO SWTCHB CNT
|
|
.BYTE $35, CNT
|
|
.ENDMACRO
|
|
.MACRO SWTCHW CNT
|
|
.BYTE $B5, CNT
|
|
.ENDMACRO
|
|
.MACRO CASEB LIT8, DST
|
|
.BYTE LIT8
|
|
.ASSERT (DST-*) < 32768, ERROR, "CASE > 32767"
|
|
.ASSERT (DST-*) > -32769, ERROR, "CASE < -32768"
|
|
.WORD DST-*
|
|
.ENDMACRO
|
|
.MACRO CASEW LIT16, DST
|
|
.WORD LIT16
|
|
.ASSERT (DST-*) < 32768, ERROR, "CASE > 32767"
|
|
.ASSERT (DST-*) > -32769, ERROR, "CASE < -32768"
|
|
.WORD DST-*
|
|
.ENDMACRO
|