📄 65c816.asm
字号:
dd C_LABEL(OpE0M1_0x74) ,C_LABEL(OpE0M1_0x75)
dd C_LABEL(OpE0M1_0x76) ,C_LABEL(OpE0M1_0x77)
dd C_LABEL(Op_0x78) ,C_LABEL(OpM1X1_0x79)
dd C_LABEL(OpE0X1_0x7A) ,C_LABEL(Op_0x7B)
dd C_LABEL(Op_0x7C) ,C_LABEL(OpM1X1_0x7D)
dd C_LABEL(OpM1_0x7E) ,C_LABEL(OpM1_0x7F)
dd C_LABEL(OpE0_0x80) ,C_LABEL(OpE0M1_0x81) ; 80
dd C_LABEL(Op_0x82) ,C_LABEL(OpM1_0x83)
dd C_LABEL(OpE0X1_0x84) ,C_LABEL(OpE0M1_0x85)
dd C_LABEL(OpE0X1_0x86) ,C_LABEL(OpE0M1_0x87)
dd C_LABEL(OpX1_0x88) ,C_LABEL(OpM1_0x89)
dd C_LABEL(OpM1_0x8A) ,C_LABEL(OpE0_0x8B)
dd C_LABEL(OpX1_0x8C) ,C_LABEL(OpM1_0x8D)
dd C_LABEL(OpX1_0x8E) ,C_LABEL(OpM1_0x8F)
dd C_LABEL(OpE0_0x90) ,C_LABEL(OpE0M1X1_0x91) ; 90
dd C_LABEL(OpE0M1_0x92) ,C_LABEL(OpM1_0x93)
dd C_LABEL(OpE0X1_0x94) ,C_LABEL(OpE0M1_0x95)
dd C_LABEL(OpE0X1_0x96) ,C_LABEL(OpE0M1_0x97)
dd C_LABEL(OpM1_0x98) ,C_LABEL(OpM1_0x99)
dd C_LABEL(OpE0_0x9A) ,C_LABEL(OpX1_0x9B)
dd C_LABEL(OpM1_0x9C) ,C_LABEL(OpM1_0x9D)
dd C_LABEL(OpM1_0x9E) ,C_LABEL(OpM1_0x9F)
dd C_LABEL(OpX1_0xA0) ,C_LABEL(OpE0M1_0xA1) ; A0
dd C_LABEL(OpX1_0xA2) ,C_LABEL(OpM1_0xA3)
dd C_LABEL(OpE0X1_0xA4) ,C_LABEL(OpE0M1_0xA5)
dd C_LABEL(OpE0X1_0xA6) ,C_LABEL(OpE0M1_0xA7)
dd C_LABEL(OpX1_0xA8) ,C_LABEL(OpM1_0xA9)
dd C_LABEL(OpX1_0xAA) ,C_LABEL(OpE0_0xAB)
dd C_LABEL(OpX1_0xAC) ,C_LABEL(OpM1_0xAD)
dd C_LABEL(OpX1_0xAE) ,C_LABEL(OpM1_0xAF)
dd C_LABEL(OpE0_0xB0) ,C_LABEL(OpE0M1X1_0xB1) ; B0
dd C_LABEL(OpE0M1_0xB2) ,C_LABEL(OpM1_0xB3)
dd C_LABEL(OpE0X1_0xB4) ,C_LABEL(OpE0M1_0xB5)
dd C_LABEL(OpE0X1_0xB6) ,C_LABEL(OpE0M1_0xB7)
dd C_LABEL(Op_0xB8) ,C_LABEL(OpM1X1_0xB9)
dd C_LABEL(OpX1_0xBA) ,C_LABEL(OpX1_0xBB)
dd C_LABEL(OpX1_0xBC) ,C_LABEL(OpM1X1_0xBD)
dd C_LABEL(OpX1_0xBE) ,C_LABEL(OpM1_0xBF)
dd C_LABEL(OpX1_0xC0) ,C_LABEL(OpE0M1_0xC1) ; C0
dd C_LABEL(OpE0_0xC2) ,C_LABEL(OpM1_0xC3)
dd C_LABEL(OpE0X1_0xC4) ,C_LABEL(OpE0M1_0xC5)
dd C_LABEL(OpE0M1_0xC6) ,C_LABEL(OpE0M1_0xC7)
dd C_LABEL(OpX1_0xC8) ,C_LABEL(OpM1_0xC9)
dd C_LABEL(OpX1_0xCA) ,C_LABEL(Op_0xCB)
dd C_LABEL(OpX1_0xCC) ,C_LABEL(OpM1_0xCD)
dd C_LABEL(OpM1_0xCE) ,C_LABEL(OpM1_0xCF)
dd C_LABEL(OpE0_0xD0) ,C_LABEL(OpE0M1X1_0xD1) ; D0
dd C_LABEL(OpE0M1_0xD2) ,C_LABEL(OpM1_0xD3)
dd C_LABEL(OpE0_0xD4) ,C_LABEL(OpE0M1_0xD5)
dd C_LABEL(OpE0M1_0xD6) ,C_LABEL(OpE0M1_0xD7)
dd C_LABEL(Op_0xD8) ,C_LABEL(OpM1X1_0xD9)
dd C_LABEL(OpE0X1_0xDA) ,C_LABEL(ALL_INVALID)
dd C_LABEL(Op_0xDC) ,C_LABEL(OpM1X1_0xDD)
dd C_LABEL(OpM1_0xDE) ,C_LABEL(OpM1_0xDF)
dd C_LABEL(OpX1_0xE0) ,C_LABEL(OpE0M1_0xE1) ; E0
dd C_LABEL(OpE0_0xE2) ,C_LABEL(OpM1_0xE3)
dd C_LABEL(OpE0X1_0xE4) ,C_LABEL(OpE0M1_0xE5)
dd C_LABEL(OpE0M1_0xE6) ,C_LABEL(OpE0M1_0xE7)
dd C_LABEL(OpX1_0xE8) ,C_LABEL(OpM1_0xE9)
dd C_LABEL(Op_0xEA) ,C_LABEL(Op_0xEB)
dd C_LABEL(OpX1_0xEC) ,C_LABEL(OpM1_0xED)
dd C_LABEL(OpM1_0xEE) ,C_LABEL(OpM1_0xEF)
dd C_LABEL(OpE0_0xF0) ,C_LABEL(OpE0M1X1_0xF1) ; F0
dd C_LABEL(OpE0M1_0xF2) ,C_LABEL(OpM1_0xF3)
dd C_LABEL(OpE0_0xF4) ,C_LABEL(OpE0M1_0xF5)
dd C_LABEL(OpE0M1_0xF6) ,C_LABEL(OpE0M1_0xF7)
dd C_LABEL(Op_0xF8) ,C_LABEL(OpM1X1_0xF9)
dd C_LABEL(OpE0X1_0xFA) ,C_LABEL(OpE0_0xFB)
dd C_LABEL(OpE0_0xFC) ,C_LABEL(OpM1X1_0xFD)
dd C_LABEL(OpM1_0xFE) ,C_LABEL(OpM1_0xFF)
OpTableE1:
dd C_LABEL(OpE1_0x00) ,C_LABEL(OpE1_0x01) ; 00
dd C_LABEL(OpE1_0x02) ,C_LABEL(OpM1_0x03)
dd C_LABEL(OpE1_0x04) ,C_LABEL(OpE1_0x05)
dd C_LABEL(OpE1_0x06) ,C_LABEL(OpE1_0x07)
dd C_LABEL(OpE1_0x08) ,C_LABEL(OpM1_0x09)
dd C_LABEL(OpM1_0x0A) ,C_LABEL(OpE1_0x0B)
dd C_LABEL(OpM1_0x0C) ,C_LABEL(OpM1_0x0D)
dd C_LABEL(OpM1_0x0E) ,C_LABEL(OpM1_0x0F)
dd C_LABEL(OpE1_0x10) ,C_LABEL(OpE1_0x11) ; 10
dd C_LABEL(OpE1_0x12) ,C_LABEL(OpM1_0x13)
dd C_LABEL(OpE1_0x14) ,C_LABEL(OpE1_0x15)
dd C_LABEL(OpE1_0x16) ,C_LABEL(OpE1_0x17)
dd C_LABEL(Op_0x18) ,C_LABEL(OpM1X1_0x19)
dd C_LABEL(OpM1_0x1A) ,C_LABEL(OpE1_0x1B)
dd C_LABEL(OpM1_0x1C) ,C_LABEL(OpM1X1_0x1D)
dd C_LABEL(OpM1_0x1E) ,C_LABEL(OpM1_0x1F)
dd C_LABEL(OpE1_0x20) ,C_LABEL(OpE1_0x21) ; 20
dd C_LABEL(OpE1_0x22) ,C_LABEL(OpM1_0x23)
dd C_LABEL(OpE1_0x24) ,C_LABEL(OpE1_0x25)
dd C_LABEL(OpE1_0x26) ,C_LABEL(OpE1_0x27)
dd C_LABEL(OpE1_0x28) ,C_LABEL(OpM1_0x29)
dd C_LABEL(OpM1_0x2A) ,C_LABEL(OpE1_0x2B)
dd C_LABEL(OpM1_0x2C) ,C_LABEL(OpM1_0x2D)
dd C_LABEL(OpM1_0x2E) ,C_LABEL(OpM1_0x2F)
dd C_LABEL(OpE1_0x30) ,C_LABEL(OpE1_0x31) ; 30
dd C_LABEL(OpE1_0x32) ,C_LABEL(OpM1_0x33)
dd C_LABEL(OpE1_0x34) ,C_LABEL(OpE1_0x35)
dd C_LABEL(OpE1_0x36) ,C_LABEL(OpE1_0x37)
dd C_LABEL(Op_0x38) ,C_LABEL(OpM1X1_0x39)
dd C_LABEL(OpM1_0x3A) ,C_LABEL(Op_0x3B)
dd C_LABEL(OpM1X1_0x3C) ,C_LABEL(OpM1X1_0x3D)
dd C_LABEL(OpM1_0x3E) ,C_LABEL(OpM1_0x3F)
dd C_LABEL(OpE1_0x40) ,C_LABEL(OpE1_0x41) ; 40
dd C_LABEL(ALL_INVALID) ,C_LABEL(OpM1_0x43)
dd C_LABEL(OpX1_0x44) ,C_LABEL(OpE1_0x45)
dd C_LABEL(OpE1_0x46) ,C_LABEL(OpE1_0x47)
dd C_LABEL(OpE1_0x48) ,C_LABEL(OpM1_0x49)
dd C_LABEL(OpM1_0x4A) ,C_LABEL(OpE1_0x4B)
dd C_LABEL(Op_0x4C) ,C_LABEL(OpM1_0x4D)
dd C_LABEL(OpM1_0x4E) ,C_LABEL(OpM1_0x4F)
dd C_LABEL(OpE1_0x50) ,C_LABEL(OpE1_0x51) ; 50
dd C_LABEL(OpE1_0x52) ,C_LABEL(OpM1_0x53)
dd C_LABEL(OpX1_0x54) ,C_LABEL(OpE1_0x55)
dd C_LABEL(OpE1_0x56) ,C_LABEL(OpE1_0x57)
dd C_LABEL(Op_0x58) ,C_LABEL(OpM1X1_0x59)
dd C_LABEL(OpE1_0x5A) ,C_LABEL(Op_0x5B)
dd C_LABEL(Op_0x5C) ,C_LABEL(OpM1X1_0x5D)
dd C_LABEL(OpM1_0x5E) ,C_LABEL(OpM1_0x5F)
dd C_LABEL(OpE1_0x60) ,C_LABEL(OpE1_0x61) ; 60
dd C_LABEL(OpE1_0x62) ,C_LABEL(OpM1_0x63)
dd C_LABEL(OpE1_0x64) ,C_LABEL(OpE1_0x65)
dd C_LABEL(OpE1_0x66) ,C_LABEL(OpE1_0x67)
dd C_LABEL(OpE1_0x68) ,C_LABEL(OpM1_0x69)
dd C_LABEL(OpM1_0x6A) ,C_LABEL(OpE1_0x6B)
dd C_LABEL(Op_0x6C) ,C_LABEL(OpM1_0x6D)
dd C_LABEL(OpM1_0x6E) ,C_LABEL(OpM1_0x6F)
dd C_LABEL(OpE1_0x70) ,C_LABEL(OpE1_0x71) ; 70
dd C_LABEL(OpE1_0x72) ,C_LABEL(OpM1_0x73)
dd C_LABEL(OpE1_0x74) ,C_LABEL(OpE1_0x75)
dd C_LABEL(OpE1_0x76) ,C_LABEL(OpE1_0x77)
dd C_LABEL(Op_0x78) ,C_LABEL(OpM1X1_0x79)
dd C_LABEL(OpE1_0x7A) ,C_LABEL(Op_0x7B)
dd C_LABEL(Op_0x7C) ,C_LABEL(OpM1X1_0x7D)
dd C_LABEL(OpM1_0x7E) ,C_LABEL(OpM1_0x7F)
dd C_LABEL(OpE1_0x80) ,C_LABEL(OpE1_0x81) ; 80
dd C_LABEL(Op_0x82) ,C_LABEL(OpM1_0x83)
dd C_LABEL(OpE1_0x84) ,C_LABEL(OpE1_0x85)
dd C_LABEL(OpE1_0x86) ,C_LABEL(OpE1_0x87)
dd C_LABEL(OpX1_0x88) ,C_LABEL(OpM1_0x89)
dd C_LABEL(OpM1_0x8A) ,C_LABEL(OpE1_0x8B)
dd C_LABEL(OpX1_0x8C) ,C_LABEL(OpM1_0x8D)
dd C_LABEL(OpX1_0x8E) ,C_LABEL(OpM1_0x8F)
dd C_LABEL(OpE1_0x90) ,C_LABEL(OpE1_0x91) ; 90
dd C_LABEL(OpE1_0x92) ,C_LABEL(OpM1_0x93)
dd C_LABEL(OpE1_0x94) ,C_LABEL(OpE1_0x95)
dd C_LABEL(OpE1_0x96) ,C_LABEL(OpE1_0x97)
dd C_LABEL(OpM1_0x98) ,C_LABEL(OpM1_0x99)
dd C_LABEL(OpE1_0x9A) ,C_LABEL(OpX1_0x9B)
dd C_LABEL(OpM1_0x9C) ,C_LABEL(OpM1_0x9D)
dd C_LABEL(OpM1_0x9E) ,C_LABEL(OpM1_0x9F)
dd C_LABEL(OpX1_0xA0) ,C_LABEL(OpE1_0xA1) ; A0
dd C_LABEL(OpX1_0xA2) ,C_LABEL(OpM1_0xA3)
dd C_LABEL(OpE1_0xA4) ,C_LABEL(OpE1_0xA5)
dd C_LABEL(OpE1_0xA6) ,C_LABEL(OpE1_0xA7)
dd C_LABEL(OpX1_0xA8) ,C_LABEL(OpM1_0xA9)
dd C_LABEL(OpX1_0xAA) ,C_LABEL(OpE1_0xAB)
dd C_LABEL(OpX1_0xAC) ,C_LABEL(OpM1_0xAD)
dd C_LABEL(OpX1_0xAE) ,C_LABEL(OpM1_0xAF)
dd C_LABEL(OpE1_0xB0) ,C_LABEL(OpE1_0xB1) ; B0
dd C_LABEL(OpE1_0xB2) ,C_LABEL(OpM1_0xB3)
dd C_LABEL(OpE1_0xB4) ,C_LABEL(OpE1_0xB5)
dd C_LABEL(OpE1_0xB6) ,C_LABEL(OpE1_0xB7)
dd C_LABEL(Op_0xB8) ,C_LABEL(OpM1X1_0xB9)
dd C_LABEL(OpX1_0xBA) ,C_LABEL(OpX1_0xBB)
dd C_LABEL(OpX1_0xBC) ,C_LABEL(OpM1X1_0xBD)
dd C_LABEL(OpX1_0xBE) ,C_LABEL(OpM1_0xBF)
dd C_LABEL(OpX1_0xC0) ,C_LABEL(OpE1_0xC1) ; C0
dd C_LABEL(OpE1_0xC2) ,C_LABEL(OpM1_0xC3)
dd C_LABEL(OpE1_0xC4) ,C_LABEL(OpE1_0xC5)
dd C_LABEL(OpE1_0xC6) ,C_LABEL(OpE1_0xC7)
dd C_LABEL(OpX1_0xC8) ,C_LABEL(OpM1_0xC9)
dd C_LABEL(OpX1_0xCA) ,C_LABEL(Op_0xCB)
dd C_LABEL(OpX1_0xCC) ,C_LABEL(OpM1_0xCD)
dd C_LABEL(OpM1_0xCE) ,C_LABEL(OpM1_0xCF)
dd C_LABEL(OpE1_0xD0) ,C_LABEL(OpE1_0xD1) ; D0
dd C_LABEL(OpE1_0xD2) ,C_LABEL(OpM1_0xD3)
dd C_LABEL(OpE1_0xD4) ,C_LABEL(OpE1_0xD5)
dd C_LABEL(OpE1_0xD6) ,C_LABEL(OpE1_0xD7)
dd C_LABEL(Op_0xD8) ,C_LABEL(OpM1X1_0xD9)
dd C_LABEL(OpE1_0xDA) ,C_LABEL(ALL_INVALID)
dd C_LABEL(Op_0xDC) ,C_LABEL(OpM1X1_0xDD)
dd C_LABEL(OpM1_0xDE) ,C_LABEL(OpM1_0xDF)
dd C_LABEL(OpX1_0xE0) ,C_LABEL(OpE1_0xE1) ; E0
dd C_LABEL(OpE1_0xE2) ,C_LABEL(OpM1_0xE3)
dd C_LABEL(OpE1_0xE4) ,C_LABEL(OpE1_0xE5)
dd C_LABEL(OpE1_0xE6) ,C_LABEL(OpE1_0xE7)
dd C_LABEL(OpX1_0xE8) ,C_LABEL(OpM1_0xE9)
dd C_LABEL(Op_0xEA) ,C_LABEL(Op_0xEB)
dd C_LABEL(OpX1_0xEC) ,C_LABEL(OpM1_0xED)
dd C_LABEL(OpM1_0xEE) ,C_LABEL(OpM1_0xEF)
dd C_LABEL(OpE1_0xF0) ,C_LABEL(OpE1_0xF1) ; F0
dd C_LABEL(OpE1_0xF2) ,C_LABEL(OpM1_0xF3)
dd C_LABEL(OpE1_0xF4) ,C_LABEL(OpE1_0xF5)
dd C_LABEL(OpE1_0xF6) ,C_LABEL(OpE1_0xF7)
dd C_LABEL(Op_0xF8) ,C_LABEL(OpM1X1_0xF9)
dd C_LABEL(OpE1_0xFA) ,C_LABEL(OpE1_0xFB)
dd C_LABEL(OpE1_0xFC) ,C_LABEL(OpM1X1_0xFD)
dd C_LABEL(OpM1_0xFE) ,C_LABEL(OpM1_0xFF)
ALIGND
CPU_OpTables:
dd OpTableE0
dd OpTablePm
dd OpTablePx
dd OpTableMX
%ifdef Abort_at_op_num
MaxOps:dd Abort_at_op_num
%endif
%ifdef SINGLE_STEP
_waitcount:dd 256*256*1024 ;14100
_debug:db 0
%endif
section .text
%macro OPCODE_EPILOG 0
%if 0
xor eax,eax ; Zero for table offset
test R_Cycles,R_Cycles
jl C_LABEL(CPU_START_NEXT)
jmp HANDLE_EVENT
%else
;mov cl,0
jmp C_LABEL(CPU_RETURN)
%endif
%endmacro
;%1 = flag, %2 = wheretogo
%macro JUMP_FLAG 2
%if %1 == SNES_FLAG_E
mov ch,B_E_flag
test ch,ch
jnz %2
%elif %1 == SNES_FLAG_N
mov ch,B_N_flag
test ch,ch
js %2
%elif %1 == SNES_FLAG_V
mov ch,B_V_flag
test ch,ch
jnz %2
%elif %1 == SNES_FLAG_M
mov ch,B_M1_flag
test ch,ch
jnz %2
%elif %1 == SNES_FLAG_X
mov ch,B_XB_flag
test ch,ch
jnz %2
%elif %1 == SNES_FLAG_D
mov ch,B_D_flag
test ch,ch
jnz %2
%elif %1 == SNES_FLAG_I
mov ch,B_I_flag
test ch,ch
jnz %2
%elif %1 == SNES_FLAG_Z
mov ch,B_Z_flag
test ch,ch
jz %2
%elif %1 == SNES_FLAG_C
mov ch,B_C_flag
test ch,ch
jnz %2
%else
%error Unhandled flag in JUMP_FLAG
%endif
%endmacro
;%1 = flag, %2 = wheretogo
%macro JUMP_NOT_FLAG 2
%if %1 == SNES_FLAG_E
mov ch,B_E_flag
test ch,ch
jz %2
%elif %1 == SNES_FLAG_N
mov ch,B_N_flag
test ch,ch
jns %2
%elif %1 == SNES_FLAG_V
mov ch,B_V_flag
test ch,ch
jz %2
%elif %1 == SNES_FLAG_M
mov ch,B_M1_flag
test ch,ch
jz %2
%elif %1 == SNES_FLAG_X
mov ch,B_XB_flag
test ch,ch
jz %2
%elif %1 == SNES_FLAG_D
mov ch,B_D_flag
test ch,ch
jz %2
%elif %1 == SNES_FLAG_I
mov ch,B_I_flag
test ch,ch
jz %2
%elif %1 == SNES_FLAG_Z
mov ch,B_Z_flag
test ch,ch
jnz %2
%elif %1 == SNES_FLAG_C
mov ch,B_C_flag
test ch,ch
jz %2
%else
%error Unhandled flag in JUMP_NOT_FLAG
%endif
%endmacro
%macro STORE_FLAGS_E 1
mov byte B_E_flag,%1
%endmacro
%macro STORE_FLAGS_N 1
mov byte B_N_flag,%1
%endmacro
%macro STORE_FLAGS_V 1
mov byte B_V_flag,%1
%endmacro
%macro STORE_FLAGS_M 1
mov byte B_M1_flag,%1
%endmacro
%macro STORE_FLAGS_1 1
mov byte B_M1_flag,%1
%endmacro
%macro STORE_FLAGS_X 1
mov byte B_XB_flag,%1
%endmacro
%macro STORE_FLAGS_B 1
mov byte B_XB_flag,%1
%endmacro
%macro STORE_FLAGS_D 1
mov byte B_D_flag,%1
%endmacro
%macro STORE_FLAGS_I 1
mov byte B_I_flag,%1
%endmacro
%macro STORE_FLAGS_Z 1
mov byte B_Z_flag,%1
%endmacro
%macro STORE_FLAGS_C 1
mov byte B_C_flag,%1
%endmacro
%macro STORE_FLAGS_NZ 1
STORE_FLAGS_N %1
STORE_FLAGS_Z %1
%endmacro
%macro STORE_FLAGS_NZC 2
STORE_FLAGS_N %1
STORE_FLAGS_Z %1
STORE_FLAGS_C %2
%endmacro
; Load cycle counter to register R_Cycles
%macro LOAD_CYCLES 0-1 eax
mov %1,[C_LABEL(EventTrip)]
mov dword R_Cycles,[C_LABEL(SNES_Cycles)]
sub dword R_Cycles,%1
%endmacro
; Get cycle counter to register argument
%macro GET_CYCLES 1
mov dword %1,[C_LABEL(EventTrip)]
add dword %1,R_Cycles
%endmacro
; Save register R_Cycles to cycle counter
%macro SAVE_CYCLES 0-1 eax
GET_CYCLES %1
mov [C_LABEL(SNES_Cycles)],%1
%endmacro
; Load base pointer to CPU register set
%macro LOAD_BASE 0
mov dword R_Base,CPU_Register_Base
%endmacro
; Load register R_PBPC with PB:PC
%macro LOAD_PC 0
mov dword R_PBPC,[CPU_LABEL(PB_Shifted)]
add dword R_PBPC,[CPU_LABEL(PC)]
%endmacro
; Get PC from register R_PBPC
;%1 = with
%macro GET_PC 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -