⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 emu65816.asm

📁 SNES game emulator. C and asm files.
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	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 + -