;* ;* 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