VM02/src/dvm.inc

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