📄 emu65816.asm
字号:
or cl, ch ; right bit into carry
; never negative flag
endm shr8_a
shr16_a macro
mov ebx, dword [_reg.A]
and cl, 0FFh-FZERO-FNEGATIVE-FCARRY; clear affected flags
shr ebx, 1
setc ch
jnz @F
or cl, FZERO
@@: mov dword [_reg.A], ebx
or cl, ch ; right bit into carry
endm shr16_a
ora8 macro imm
ifb <imm>
trapandread8 ebx
endif
movzx eax, byte [_reg.A]
and cl, 0FFh-FZERO-FNEGATIVE ; clear affected flags
or al, bl
mov byte [_reg.A], al
or cl, [nz_8bit + eax]
endm ora8
ora16 macro imm
ifb <imm>
trapandread16 ebx
endif
mov eax, dword [_reg.A]
and cl, 0FFh-FZERO-FNEGATIVE ; clear affected flags
or ax, bx
mov dword [_reg.A], eax
nzflag_xfer
endm ora16
rol8 macro
mov edi, ebx ; save pointer to data
trapandread8 ebx
mov ch, cl
and cl, 0FFh-FZERO-FNEGATIVE-FCARRY; clear affected flags
movzx ebx, bl ; pad with zeros for indexing
shr ch, 1 ; 65816 carry->x86 carry
rcl bl, 1 ; rotate left memory
jnc @F
or cl, FCARRY ; get new carry flag
@@: or cl, [nz_8bit + ebx]
trapandwrite8 edi, bl
endm rol8
rol16 macro
mov edi, ebx ; save pointer to data
trapandread16 ebx
mov ch, cl
and cl, 0FFh-FZERO-FNEGATIVE-FCARRY; clear affected flags
shr ch, 1 ; 65816 carry->x86 carry
rcl bx, 1 ; rotate left memory
jnc @F
or cl, FCARRY
@@: test bh, 80h
jz @F
or cl, FNEGATIVE
@@: test ebx, 0000FFFFh
jnz @F
or cl, FZERO
@@: trapandwrite16 edi, bl, bh
endm rol16
rol8_a macro
mov ch, cl
and cl, 0FFh-FZERO-FNEGATIVE-FCARRY; clear affected flags
movzx ebx, byte [_reg.A]
shr ch, 1 ; 65816 carry->x86 carry
rcl bl, 1 ; rotate left memory
jnc @F
or cl, FCARRY
@@: mov byte [_reg.A], bl
or cl, [nz_8bit + ebx]
endm rol8_a
rol16_a macro
mov ch, cl
and cl, 0FFh-FZERO-FNEGATIVE-FCARRY; clear affected flags
mov ebx, dword [_reg.A]
shr ch, 1 ; 65816 carry->x86 carry
rcl bx, 1 ; rotate left memory [NB: x86 rotate doesn't affect SF/ZF]
jnc @F
or cl, FCARRY
@@: test bh, 80h
jz @F
or cl, FNEGATIVE
@@: test ebx, ebx
jnz @F
or cl, FZERO
@@: mov dword [_reg.A], ebx
endm rol16_a
ror8 macro
local notcarry
mov edi, ebx ; save pointer to data
trapandread8 ebx
mov ch, cl
and cl, 0FFh-FZERO-FNEGATIVE-FCARRY; clear affected flags
movzx ebx, bl ; pad with zeros for indexing
shr ch, 1 ; 65816 carry->x86 carry
rcr bl, 1 ; rotate right memory [NB: x86 rotate doesn't affect SF/ZF]
jnc notcarry
or cl, FCARRY ; get new carry flag
notcarry:
or cl, [nz_8bit + ebx]
trapandwrite8 edi, bl
endm ror8
ror16 macro
mov edi, ebx ; save pointer to data
trapandread16 ebx
mov ch, cl
and cl, 0FFh-FZERO-FNEGATIVE-FCARRY; clear affected flags
shr ch, 1 ; 65816 carry->x86 carry
rcr bx, 1 ; rotate right memory [NB: x86 rotate doesn't affect SF/ZF]
jnc @F
or cl, FCARRY
@@: test bh, 80h
jz @F
or cl, FNEGATIVE
@@: test ebx, 0000FFFFh
jnz @F
or cl, FZERO
@@: trapandwrite16 edi, bl, bh
endm ror16
ror8_a macro
local notcarry
movzx ebx, byte [_reg.A] ; pad with zeros for indexing
mov ch, cl
and cl, 0FFh-FZERO-FNEGATIVE-FCARRY; clear affected flags
shr ch, 1 ; 65816 carry->x86 carry
rcr bl, 1 ; rotate right accum
jnc notcarry
or cl, FCARRY ; get new carry flag
notcarry:
mov byte [_reg.A], bl
or cl, [nz_8bit + ebx]
endm ror8_a
ror16_a macro
mov ebx, dword [_reg.A]
mov ch, cl
and cl, 0FFh-FZERO-FNEGATIVE-FCARRY; clear affected flags
shr ch, 1 ; 65816 carry->x86 carry
rcr bx, 1 ; rotate right accum
jnc @F
or cl, FCARRY
@@: test bh, 80h
jz @F
or cl, FNEGATIVE
@@: test ebx, ebx
jnz @F
or cl, FZERO
@@: mov dword [_reg.A], ebx
endm ror16_a
sbc8 macro imm
local dobcd, notoverflow, notoverflowbcd, alldone
ifb <imm>
trapandread8 ebx
endif
mov ch, cl ; ch==cl==P
movzx eax, byte [_reg.A]
and cl, 0FFh-FOVERFLOW-FZERO-FCARRY-FNEGATIVE ; clear affected flags
test cl, FDECIMAL
jnz dobcd
shr ch, 1 ; get 65816 carry flag
cmc ; complement carry to do it right on an x86 machine...
sbb al, bl ; subtract and save accumulator
mov byte [_reg.A], al
setnc ch ; get carry flag state 0=carry, 1=not carry.
; would use adc cl,0 but that changes the overflow flag
jno notoverflow
or cl, FOVERFLOW
notoverflow:
or cl, ch ; save carry flag state
or cl, [nz_8bit + eax] ; get zero/negative flags
jmp alldone
dobcd:
shr ch,1 ; Move 65816 Carry to 80x86's
cmc ; complement carry to do it right on an x86 machine...
sbb al, bl
das ; change al according to BCD adjust rules
mov byte [_reg.A], al
setnc ch ; get carry flag state 1=not carry.
jno notoverflow
or cl, FOVERFLOW
notoverflowbcd:
or cl, ch ; save carry flag state
or cl, [nz_8bit + eax] ; get zero/negative flags
alldone:
endm sbc8
sbc16 macro imm
local dobcd, notoverflow, notoverflowbcd, alldone
ifb <imm>
trapandread16 ebx
endif
mov ch, cl ; ch==cl==P
mov eax, dword [_reg.A]
and cl, 0FFh-FOVERFLOW-FZERO-FCARRY-FNEGATIVE ; clear affected flags
test cl, FDECIMAL
jnz dobcd
shr ch, 1 ; get 65816 carry flag
cmc ; complement carry to do it right on an x86 machine...
sbb ax, bx ; subtract and save accumulator
mov dword [_reg.A], eax
setnc ch ; get carry flag state 0=carry, 1=not carry.
setz al
sets ah
jno notoverflow
or cl, FOVERFLOW
notoverflow:
shl ah, 7
or cl, ch ; save carry flag state
shl al, 1
or cl, ah
or cl, al
jmp alldone
dobcd:
shr ch, 1 ; get 65816 carry flag
cmc ; complement carry to do it right on an x86 machine...
sbb al, bl ; subtract, one byte at a time...
das
mov byte [_reg.A], al
sbb ah, bh
mov al, ah
das
setnc ch ; get carry flag state 1=not carry.
sets ah
mov byte [_reg.A + 1], al
setz al
jno notoverflow
or cl, FOVERFLOW
notoverflowbcd:
shl ah, 7
or cl, ch ; save carry flag state
shl al, 1
or cl, ah ; negative flag
or cl, al ; zero flag
alldone:
endm sbc16
sta8 macro
mov al, byte [_reg.A]
trapandwrite8 ebx, al
endm sta8
sta16 macro
mov eax, dword [_reg.A]
trapandwrite16 ebx, al, ah
endm sta16
stx8 macro
mov al, byte [_reg.X]
trapandwrite8 ebx, al
endm stx8
stx16 macro
mov eax, dword [_reg.X]
trapandwrite16 ebx, al, ah
endm stx16
sty8 macro
mov al, byte [_reg.Y]
trapandwrite8 ebx, al
endm sty8
sty16 macro
mov eax, dword [_reg.Y]
trapandwrite16 ebx, al, ah
endm sty16
clr8 macro
xor ch, ch
trapandwrite8 ebx, ch
endm clr8
clr16 macro
xor ch, ch
trapandwrite16 ebx, ch, ch
endm clr16
trb8 macro
mov edi, ebx
trapandread8 ebx
mov al, byte [_reg.A]
and cl, 0FFh-FZERO
test bl, al
jnz @F
or cl, FZERO
@@: not al
and bl, al
trapandwrite8 edi, bl
endm trb8
trb16 macro
mov edi, ebx
trapandread16 ebx
and ebx, 0000FFFFh
mov eax, dword [_reg.A]
and cl, 0FFh-FZERO
test ebx, eax
jnz @F
or cl, FZERO
@@: not eax
and ebx, eax
trapandwrite16 edi, bl, bh
endm trb16
tsb8 macro
mov edi, ebx
trapandread8 ebx
and cl, 0FFh-FZERO
test bl, byte [_reg.A]
jnz @F
or cl, FZERO
@@: or bl, byte [_reg.A]
trapandwrite8 edi, bl
endm tsb8
tsb16 macro
mov edi, ebx
trapandread16 ebx
and cl, 0FFh-FZERO
test ebx, dword [_reg.A]
jnz @F
or cl, FZERO
@@: or ebx, dword [_reg.A]
trapandwrite16 edi, bl, bh
endm tsb16
transfer_16to16 macro from, to
mov ebx, dword [_reg.from]
and cl, 0FFh-FNEGATIVE-FZERO
mov dword [_reg.to], ebx ; transfer 16-bit
test ebx, ebx ; get zero
jnz @F
or cl, FZERO
@@: test ebx, 00008000h
jz @F
or cl, FNEGATIVE
@@:
endm transfer_16to16
transfer_8to16 macro from, to
mov ebx, dword [_reg.from]
and cl, 0FFh-FNEGATIVE-FZERO
mov dword [_reg.to], ebx ; transfer 16-bit
test ebx, ebx ; get zero
jnz @F
or cl, FZERO
@@: test ebx, 00008000h
jz @F
or cl, FNEGATIVE
@@: ; For behaviour compatibility with zSNES, transfer all 16 bits
; movzx ebx, byte [_reg.from]
; and cl, 0FFh-FNEGATIVE-FZERO
; mov dword [_reg.to], ebx ; transfer 16-bit
; test ebx, ebx ; get zero
; jnz @F
; or cl, FZERO
;@@: ; negative flag never set
endm transfer_8to16
transfer_8to8 macro from, to
mov bl, byte [_reg.from]
and ecx, 000000FFh-FNEGATIVE-FZERO ; clear ch too
mov byte [_reg.to], bl ; transfer 8-bit
test bl, bl ; get zero/negative
jnz @F
mov ch, FZERO
@@: jns @F
or cl, FNEGATIVE
@@: or cl, ch
endm transfer_8to8
;****************************************************************************
; OPCODE EMULATION JUMP TABLE
;****************************************************************************
opcodetable_m0x0 dd offset op00m0x0, op01m0x0, op02m0x0, op03m0x0, op04m0x0, op05m0x0, op06m0x0, op07m0x0, op08m0x0, op09m0x0, op0Am0x0, op0Bm0x0, op0Cm0x0, op0Dm0x0, op0Em0x0, op0Fm0x0
dd op10m0x0, op11m0x0, op12m0x0, op13m0x0, op14m0x0, op15m0x0, op16m0x0, op17m0x0, op18m0x0, op19m0x0, op1Am0x0, op1Bm0x0, op1Cm0x0, op1Dm0x0, op1Em0x0, op1Fm0x0
dd op20m0x0, op21m0x0, op22m0x0, op23m0x0, op24m0x0, op25m0x0, op26m0x0, op27m0x0, op28m0x0, op29m0x0, op2Am0x0, op2Bm0x0, op2Cm0x0, op2Dm0x0, op2Em0x0, op2Fm0x0
dd op30m0x0, op31m0x0, op32m0x0, op33m0x0, op34m0x0, op35m0x0, op36m0x0, op37m0x0, op38m0x0, op39m0x0, op3Am0x0, op3Bm0x0, op3Cm0x0, op3Dm0x0, op3Em0x0, op3Fm0x0
dd op40m0x0, op41m0x0, op42m0x0, op43m0x0, op44m0x0, op45m0x0, op46m0x0, op47m0x0, op48m0x0, op49m0x0, op4Am0x0, op4Bm0x0, op4Cm0x0, op4Dm0x0, op4Em0x0, op4Fm0x0
dd op50m0x0, op51m0x0, op52m0x0, op53m0x0, op54m0x0, op55m0x0, op56m0x0, op57m0x0, op58m0x0, op59m0x0, op5Am0x0, op5Bm0x0, op5Cm0x0, op5Dm0x0, op5Em0x0, op5Fm0x0
dd op60m0x0, op61m0x0, op62m0x0, op63m0x0, op64m0x0, op65m0x0, op66m0x0, op67m0x0, op68m0x0, op69m0x0, op6Am0x0, op6Bm0x0, op6Cm0x0, op6Dm0x0, op6Em0x0, op6Fm0x0
dd op70m0x0, op71m0x0, op72m0x0, op73m0x0, op74m0x0, op75m0x0, op76m0x0, op77m0x0, op78m0x0, op79m0x0, op7Am0x0, op7Bm0x0, op7Cm0x0, op7Dm0x0, op7Em0x0, op7Fm0x0
dd op80m0x0, op81m0x0, op82m0x0, op83m0x0, op84m0x0, op85m0x0, op86m0x0, op87m0x0, op88m0x0, op89m0x0, op8Am0x0, op8Bm0x0, op8Cm0x0, op8Dm0x0, op8Em0x0, op8Fm0x0
dd op90m0x0, op91m0x0, op92m0x0, op93m0x0, op94m0x0, op95m0x0, op96m0x0, op97m0x0, op98m0x0, op99m0x0, op9Am0x0, op9Bm0x0, op9Cm0x0, op9Dm0x0, op9Em0x0, op9Fm0x0
dd opA0m0x0, opA1m0x0, opA2m0x0, opA3m0x0, opA4m0x0, opA5m0x0, opA6m0x0, opA7m0x0, opA8m0x0, opA9m0x0, opAAm0x0, opABm0x0, opACm0x0, opADm0x0, opAEm0x0, opAFm0x0
dd opB0m0x0, opB1m0x0, opB2m0x0, opB3m0x0, opB4m0x0, opB5m0x0, opB6m0x0, opB7m0x0, opB8m0x0, opB9m0x0, opBAm0x0, opBBm0x0, opBCm0x0, opBDm0x0, opBEm0x0, opBFm0x0
dd opC0m0x0, opC1m0x0, opC2m0x0, opC3m0x0, opC4m0x0, opC5m0x0, opC6m0x0, opC7m0x0, opC8m0x0, opC9m0x0, opCAm0x0, opCBm0x0, opCCm0x0, opCDm0x0, opCEm0x0, opCFm0x0
dd opD0m0x0, opD1m0x0, opD2m0x0, opD3m0x0, opD4m0x0, opD5m0x0, opD6m0x0, opD7m0x0, opD8m0x0, opD9m0x0, opDAm0x0, opDBm0x0, opDCm0x0, opDDm0x0, opDEm0x0, opDFm0x0
dd opE0m0x0, opE1m0x0, opE2m0x0, opE3m0x0, opE4m0x0, opE5m0x0, opE6m0x0, opE7m0x0, opE8m0x0, opE9m0x0, opEAm0x0, opEBm0x0, opECm0x0, opEDm0x0, opEEm0x0, opEFm0x0
dd opF0m0x0, opF1m0x0, opF2m0x0, opF3m0x0, opF4m0x0, opF5m0x0, opF6m0x0, opF7m0x0, opF8m0x0, opF9m0x0, opFAm0x0, opFBm0x0, opFCm0x0, opFDm0x0, opFEm0x0, opFFm0x0
opcodetable_m0x1 dd op00m0x1, op01m0x1, op02m0x1, op03m0x1, op04m0x1, op05m0x1, op06m0x1, op07m0x1, op08m0x1, op09m0x1, op0Am0x1, op0Bm0x1, op0Cm0x1, op0Dm0x1, op0Em0x1, op0Fm0x1
dd op10m0x1, op11m0x1, op12m0x1, op13m0x1, op14m0x1, op15m0x1, op16m0x1, op17m0x1, op18m0x1, op19m0x1, op1Am0x1, op1Bm0x1, op1Cm0x1, op1Dm0x1, op1Em0x1, op1Fm0x1
dd op20m0x1, op21m0x1, op22m0x1, op23m0x1, op24m0x1, op25m0x1, op26m0x1, op27m0x1, op28m0x1, op29m0x1, op2Am0x1, op2Bm0x1, op2Cm0x1, op2Dm0x1, op2Em0x1, op2Fm0x1
dd op30m0x1, op31m0x1, op32m0x1, op33m0x1, op34m0x1, op35m0x1, op36m0x1, op37m0x1, op38m0x1, op39m0x1, op3Am0x1, op3Bm0x1, op3Cm0x1, op3Dm0x1, op3Em0x1, op3Fm0x1
dd op40m0x1, op41m0x1, op42m0x1, op43m0x1, op44m0x1, op45m0x1, op46m0x1, op47m0x1, op48m0x1, op49m0x1, op4Am0x1, op4Bm0x1, op4Cm0x1, op4Dm0x1, op4Em0x1, op4Fm0x1
dd op50m0x1, op51m0x1, op52m0x1, op53m0x1, op54m0x1, op55m0x1, op56m0x1, op57m0x1, op58m0x1, op59m0x1, op5Am0x1, op5Bm0x1, op5Cm0x1, op5Dm0x1, op5Em0x1, op5Fm0x1
dd op60m0x1, op61m0x1, op62m0x1, op63m0x1, op64m0x1, op65m0x1, op66m0x1, op67m0x1, op68m0x1, op69m0x1, op6Am0x1, op6Bm0x1, op6Cm0x1, op6Dm0x1, op6Em0x1, op6Fm0x1
dd op70m0x1, op71m0x1, op72m0x1, op73m0x1, op74m0x1, op75m0x1, op76m0x1, op77m0x1, op78m0x1, op79m0x1, op7Am0x1, op7Bm0x1, op7Cm0x1, op7Dm0x1, op7Em0x1, op7Fm0x1
dd op80m0x1, op81m0x1, op82m0x1, op83m0x1, op84m0x1, op85m0x1, op86m0x1, op87m0x1, op88m0x1, op89m0x1, op8Am0x1, op8Bm0x1, op8Cm0x1, op8Dm0x1, op8Em0x1, op8Fm0x1
dd op90m0x1, op91m0x1, op92m0x1, op93m0x1, op94m0x1, op95m0x1, op96m0x1, op97m0x1, op98m0x1, op99m0x1, op9Am0x1, op9Bm0x1, op9Cm0x1, op9Dm0x1, op9Em0x1, op9Fm0x1
dd opA0m0x1, opA1m0x1, opA2m0x1, opA3m0x1, opA4m0x1, opA5m0x1, opA6m0x1, opA7m0x1, opA8m0x1, opA9m0x1, opAAm0x1, opABm0x1, opACm0x1, opADm0x1, opAEm0x1, opAFm0x1
dd opB0m0x1, opB1m0x1, opB2m0x1, opB3m0x1, opB4m0x1, opB5m0x1, opB6m0x1, opB7m0x1, opB8m0x1, opB9m0x1, opBAm0x1, opBBm0x1, opBCm0x1, opBDm0x1, opBEm0x1, opBFm0x1
dd opC0m0x1, opC1m0x1, opC2m0x1, opC3m0x1, opC4m0x1, opC5m0x1, opC6m0x1, opC7m0x1, opC8m0x1, opC9m0x1, opCAm0x1, opCBm0x1, opCCm0x1, opCDm0x1, opCEm0x1, opCFm0x1
dd opD0m0x1, opD1m0x1, opD2m0x1, opD3m0x1, opD4m0x1, opD5m0x1, opD6m0x1, opD7m0x1, opD8m0x1, opD9m0x1, opDAm0x1, opDBm0x1, opDCm0x1, opDDm0x1, opDEm0x1, opDFm0x1
dd opE0m0x1, opE1m0x1, opE2m0x1, opE3m0x1, opE4m0x1, opE5m0x1, opE6m0x1, opE7m0x1, opE8m0x1, opE9m0x1, opEAm0x1, opEBm0x1, opECm0x1, opEDm0x1, opEEm0x1, opEFm0x1
dd opF0m0x1, opF1m0x1, opF2m0x1, opF3m0x1, opF4m0x1, opF5m0x1, opF6m0x1, opF7m0x1, opF8m0x1, opF9m0x1, opFAm0x1, opFBm0x1, opFCm0x1, opFDm0x1, opFEm0x1, opFFm0x1
opcodetable_m1x0 dd op00m1x0, op01m1x0, op02m1x0, op03m1x0, op04m1x0, op05m1x0, op06m1x0, op07m1x0, op08m1x0, op09m1x0, op0Am1x0, op0Bm1x0, op0Cm1x0, op0Dm1x0, op0Em1x0, op0Fm1x0
dd op10m1x0, op11m1x0, op12m1x0, op13m1x0, op14m1x0, op15m1x0, op16m1x0, op17m1x0, op18m1x0, op19m1x0, op1Am1x0, op1Bm1x0, op1Cm1x0, op1Dm1x0, op1Em1x0, op1Fm1x0
dd op20m1x0, op21m1x0, op22m1x0, op23m1x0, op24m1x0, op25m1x0, op26m1x0, op27m1x0, op28m1x0, op29m1x0, op2Am1x0, op2Bm1x0, op2Cm1x0, op2Dm1x0, op2Em1x0, op2Fm1x0
dd op30m1x0, op31m1x0, op32m1x0, op33m1x0, op34m1x0, op35m1x0, op36m1x0, op37m1x0, op38m1x0, op39m1x0, op3Am1x0, op3Bm1x0, op3Cm1x0, op3Dm1x0, op3Em1x0, op3Fm1x0
dd op40m1x0, op41m1x0, op42m1x0, op43m1x0, op44m1x0, op45m1x0, op46m1x0, op47m1x0, op48m1x0, op49m1x0, op4Am1x0, op4Bm1x0, op4Cm1x0, op4Dm1x0, op4Em1x0, op4Fm1x0
dd op50m1x0, op51m1x0, op52m1x0, op53m1x0, op54m1x0, op55m1x0, op56m1x0, op57m1x0, op58m1x0, op59m1x0, op5Am1x0, op5Bm1x0, op5Cm1x0, op5Dm1x0, op5Em1x0, op5Fm1x0
dd op60m1x0, op61m1x0, op62m1x0, op63m1x0, op64m1x0, op65m1x0, op66m1x0, op67m1x0, op68m1x0, op69m1x0, op6Am1x0, op6Bm1x0, op6Cm1x0, op6Dm1x0, op6Em1x0, op6Fm1x0
dd op70m1x0, op71m1x0, op72m1x0, op73m1x0, op74m1x0, op75m1x0, op76m1x0, op77m1x0, op78m1x0, op79m1x0, op7Am1x0, op7Bm1x0, op7Cm1x0, op7Dm1x0, op7Em1x0, op7Fm1x0
dd op80m1x0, op81m1x0, op82m1x0, op83m1x0, op84m1x0, op85m1x0, op86m1x0, op87m1x0, op88m1x0, op89m1x0, op8Am1x0, op8Bm1x0, op8Cm1x0, op8Dm1x0, op8Em1x0, op8Fm1x0
dd op90m1x0, op91m1x0, op92m1x0, op93m1x0, op94m1x0, op95m1x0, op96m1x0, op97m1x0, op98m1x0, op99m1x0, op9Am1x0, op9Bm1x0, op9Cm1x0, op9Dm1x0, op9Em1x0, op9Fm1x0
dd opA0m1x0, opA1m1x0, opA2m1x0, opA3m1x0, opA4m1x0, opA5m1x0, opA6m1x0, opA7m1x0, opA8m1x0, opA9m1x0, opAAm1x0, opABm1x0, opACm1x0, opADm1x0, opAEm1x0, opAFm1x0
dd opB0m1x0, opB1m1x0, opB2m1x0, opB3m1x0, opB4m1x0, opB5m1x0, opB6m1x0, opB7m1x0, opB8m1x0, opB9m1x0, opBAm1x0, opBBm1x0, opBCm1x0, opBDm1x0, opBEm1x0, opBFm1x0
dd opC0m1x0, opC1m1x0, opC2m1x0, opC3m1x0, opC4m1x0, opC5m1x0, opC6m1x0, opC7m1x0, opC8m1x0, opC9m1x0, opCAm1x0, opCBm1x0, opCCm1x0, opCDm1x0, opCEm1x0, opCFm1x0
dd opD0m1x0, opD1m1x0, opD2m1x0, opD3m1x0, opD4m1x0, opD5m1x0, opD6m1x0, opD7m1x0, opD8m1x0, opD9m1x0, opDAm1x0, opDBm1x0, opDCm1x0, opDDm1x0, opDEm1x0, opDFm1x0
dd opE0m1x0, opE1m1x0, opE2m1x0, opE3m1x0, opE4m1x0, opE5m1x0, opE6m1x0, opE7m1x0, opE8m1x0, opE9m1x0, opEAm1x0, opEBm1x0, opECm1x0, opEDm1x0, opEEm1x0, opEFm1x0
dd opF0m1x0, opF1m1x0, opF2m1x0, opF3m1x0, opF4m1x0, opF5m1x0, opF6m1x0, opF7m1x0, opF8m1x0, opF9m1x0, opFAm1x0, opFBm1x0, opFCm1x0, opFDm1x0, opFEm1x0, opFFm1x0
opcodetable_m1x1 dd op00m1x1, op01m1x1, op02m1x1, op03m1x1, op04m1x1, op05m1x1, op06m1x1, op07m1x1, op08m1x1, op09m1x1, op0Am1x1, op0Bm1x1, op0Cm1x1, op0Dm1x1, op0Em1x1, op0Fm1x1
dd op10m1x1, op11m1x1, op12m1x1, op13m1x1, op14m1x1, op15m1x1, op16m1x1, op17m1x1, op18m1x1, op19m1x1, op1Am1x1, op1Bm1x1, op1Cm1x1, op1Dm1x1, op1Em1x1, op1Fm1x1
dd op20m1x1, op21m1x1, op22m1x1, op23m1x1, op24m1x1, op25m1x1, op26m1x1, op27m1x1, op28m1x1, op29m1x1, op2Am1x1, op2Bm1x1, op2Cm1x1, op2Dm1x1, op2Em1x1, op2Fm1x1
dd op30m1x1, op31m1x1, op32m1x1, op33m1x1, op34m1x1, op35m1x1, op36m1x1, op37m1x1, op38m1x1, op39m1x1, op3Am1x1, op3Bm1x1, op3Cm1x1, op3Dm1x1, op3Em1x1, op3Fm1x1
dd op40m1x1, op41m1x1, op42m1x1, op43m1x1, op44m1x1, op45m1x1, op46m1x1, op47m1x1, op48m1x1, op49m1x1, op4Am1x1, op4Bm1x1, op4Cm1x1, op4Dm1x1, op4Em1x1, op4Fm1x1
dd op50m1x1, op51m1x1, op52m1x1, op53m1x1, op54m1x1, op55m1x1, op56m1x1, op57m1x1, op58m1x1, op59m1x1, op5Am1x1, op5Bm1x1, op5Cm1x1, op5Dm1x1, op5Em1x1, op5Fm1x1
dd op60m1x1, op61m1x1, op62m1x1, op63m1x1, op64m1x1, op65m1x1, op66m1x1, op67m1x1, op68m1x1, op69m1x1, op6Am1x1, op6Bm1x1, op6Cm1x1, op6Dm1x1, op6Em1x1, op6Fm1x1
dd op70m1x1, op71m1x1, op72m1x1, op73m1x1, op74m1x1, op75m1x1, op76m1x1, op77m1x1, op78m1x1, op79m1x1, op7Am1x1, op7Bm1x1, op7Cm1x1, op7Dm1x1, op7Em1x1, op7Fm1x1
dd op80m1x1, op81m1x1, op82m1x1, op83m1x1, op84m1x1, op85m1x1, op86m1x1, op87m1x1, op88m1x1, op89m1x1, op8Am1x1, op8Bm1x1, op8Cm1x1, op8Dm1x1, op8Em1x1, op8Fm1x1
dd op90m1x1, op91m1x1, op92m1x1, op93m1x1, op94m1x1, op95m1x1, op96m1x1, op97m1x1, op98m1x1, op99m1x1, op9Am1x1, op9Bm1x1, op9Cm1x1, op9Dm1x1, op9Em1x1, op9Fm1x1
dd opA0m1x1, opA1m1x1, opA2m1x1, opA3m1x1, opA4m1x1, opA5m1x1, opA6m1x1, opA7m1x1, opA8m1x1, opA9m1x1, opAAm1x1, opABm1x1, opACm1x1, opADm1x1, opAEm1x1, opAFm1x1
dd opB0m1x1, opB1m1x1, opB2m1x1, opB3m1x1, opB4m1x1, opB5m1x1, opB6m1x1, opB7m1x1, opB8m1x1, opB9m1x1, opBAm1x1, opBBm1x1, opBCm1x1, opBDm1x1, opBEm1x1, opBFm1x1
dd opC0m1x1, opC1m1x1, opC2m1x1, opC3m1x1, opC4m1x1, opC5m1x1, opC6m1x1, opC7m1x1, opC8m1x1, opC9m1x1, opCAm1x1, opCBm1x1, opCCm1x1, opCDm1x1, opCEm1x1, opCFm1x1
dd opD0m1x1, opD1m1x1, opD2m1x1, opD3m1x1, opD4m1x1, opD5m1x1, opD6m1x1, opD7m1x1, opD8m1x1, opD9m1x1, opDAm1x1, opDBm1x1, opDCm1x1, opDDm1x1, opDEm1x1, opDFm1x1
dd opE0m1x1, opE1m1x1, opE2m1x1, opE3m1x1, opE4m1x1, opE5m1x1, opE6m1x1, opE7m1x1, opE8m1x1, opE9m1x1, opEAm1x1, opEBm1x1, opECm1x1, opEDm1x1, opEEm1x1, opEFm1x1
dd opF0m1x1, opF1m1x1, opF2m1x1, opF3m1x1, opF4m1x1, opF5m1x1, opF6m1x1, opF7m1x1, opF8m1x1, opF9m1x1, opFAm1x1, opFBm1x1, opFCm1x1, opFDm1x1, opFEm1x1, opFFm1x1
_temp dd ?
;_DATA ENDS
;_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
; ASSUME CS:_TEXT, DS:_DATA
.code
extrn _trapregread:near
extrn _trapregwrite:near
public _doemulate
; Register Usage
; EAX: Anything
; EBX: Starts off containing opdata (BL=opcode)
; ECX: CL: Processor Status (P)
; EDX: Program Counter
; ESI: Cycles until routine exit
; EDI: Anything
; EBP: Temporary storage
; Carry: set if M/X changed at end of instruction execution
_doemulate proc near C
push eax
push ebx
push ecx
push edx
push esi
push edi
push ebp
mov edx, [_reg.PC]
mov cl, [_reg.P]
mov esi, [_scan_cycles]
looptop_check:
test esi, 80000000h ; Negative number?
jnz exitroutine
looptop:
test cl, 10h ; Index
jz indexis16 ; x0=16bit
indexis8:
test cl, 20h ; Memory
jz loop_m0x1 ; m0=16bit
jmp loop_m1x1
indexis16:
test cl, 20h ; Memory
jnz loop_m1x0 ; m1=8bit
loop_m0x0:
mainloop opcodetable_m0x0
loop_m0x1:
mainloop opcodetable_m0x1
loop_m1x0:
mainloop opcodetable_m1x0
loop_m1x1:
mainloop opcodetable_m1x1
exitroutine:
mov byte [_reg.P], cl
mov dword [_reg.PC], edx
mov dword [_scan_cycles], esi
pop ebp
pop edi
pop esi
pop edx
pop ecx
pop ebx
pop eax
ret
;****************************************************************************
; START OF EMULATION ROUTINES
;****************************************************************************
op00m0x0: ; "BRK", 2, 8,
op00m0x1:
op00m1x0:
op00m1x1:
docount 2, 8
vectorcall 00FFFEh, 00FFE6h
dobreak
op01m0x0: ; "ORA (<%b,X)", 2, 6,
load_dir_index_indir_x16
docount 2, 6+1
ora16
dobreak
op01m0x1:
load_dir_index_indir_x8
docount 2, 6+1
ora16
dobreak
op01m1x0:
load_dir_index_indir_x16
docount 2, 6
ora8
dobreak
op01m1x1:
load_dir_index_indir_x8
docount 2, 6
ora8
dobreak
op02m0x0: ; "CSP", 2, 8,
op02m0x1:
op02m1x0:
op02m1x1:
or cl, FINTERRUPT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -