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

📄 ops_s.inc

📁 NES game Emulator in Linux.c and asm codes.
💻 INC
字号:
%define OPCODE_PROLOG(op) OPCODE_LABEL OpE %+ S_8bit %+ _ %+ op


OPCODE_PROLOG(0x00) ; BRK #
 SoftwareInterrupt 0xFFFE,0xFFE6
OPCODE_EPILOG

OPCODE_PROLOG(0x02) ; COP #
 SoftwareInterrupt 0xFFF4,0xFFE4
OPCODE_EPILOG

OPCODE_PROLOG(0x08) ; PHP s
 ADDR_Implied
 SETUPFLAGS
 PUSH_B
OPCODE_EPILOG

OPCODE_PROLOG(0x0B) ; PHD s
 _PHD
OPCODE_EPILOG

OPCODE_PROLOG(0x10) ; BPL r
 _BFC SNES_FLAG_N
OPCODE_EPILOG

OPCODE_PROLOG(0x1B) ; TCS i
 _TxS B_A
OPCODE_EPILOG

OPCODE_PROLOG(0x20) ; JSR a
 ADDR_Absolute_JSR
 push eax
 GET_PBPC eax        ; last instruction byte PC in ax
 PUSH_W              ; Address of last byte, not next instruction
 pop eax
 mov R_PC,ax
OPCODE_EPILOG

OPCODE_PROLOG(0x22) ; JSL al
 ADDR_Absolute_Long_JSR
 mov R_PBPC,eax
 shr eax,16
 mov B_PB,al
OPCODE_EPILOG

OPCODE_PROLOG(0x28) ; PLP s
 ADDR_Implied
 PULL_B
 mov bl,B_I_flag
 RESTOREFLAGS

 test bl,bl
%if S_8bit
 jz C_LABEL(CPU_RETURN)
 JUMP_FLAG SNES_FLAG_I,C_LABEL(CPU_RETURN)
%else
 jz .no_irq_enable
 JUMP_FLAG SNES_FLAG_I,.no_irq_enable
%endif
 xor edx,edx
 SAVE_CYCLES
 mov [C_LABEL(EventTrip)],edx
 mov edx,Enabling_IRQ_Event
 LOAD_CYCLES
 mov [Event_Handler],edx

%if S_8bit == 0
.no_irq_enable:
 SET_TABLE_MX
%endif
OPCODE_EPILOG

OPCODE_PROLOG(0x2B) ; PLD s
 _PLD
OPCODE_EPILOG

OPCODE_PROLOG(0x30) ; BMI r
 _BFS SNES_FLAG_N
OPCODE_EPILOG

OPCODE_PROLOG(0x40) ; RTI s
 add R_Cycles,_5A22_FAST_CYCLE * 2
 PULL_B
 mov bl,B_I_flag
 push ebx

 RESTOREFLAGS
%if S_8bit
 PULL_W
 mov R_PC,ax
%else
 PULL_L
 mov R_PBPC,eax
 shr eax,16
 mov B_PB,al
%endif

 pop ebx

 test bl,bl
 jz .no_irq_enable
 JUMP_FLAG SNES_FLAG_I,.no_irq_enable
 xor edx,edx
 SAVE_CYCLES
 mov [C_LABEL(EventTrip)],edx
 mov edx,Enabling_IRQ_Event
 LOAD_CYCLES
 mov [Event_Handler],edx

.no_irq_enable:
%if S_8bit == 0
 SET_TABLE_MX
%endif
OPCODE_EPILOG

; Push PB(K) onto stack
OPCODE_PROLOG(0x4B) ; PHK s
 _PHK
OPCODE_EPILOG

OPCODE_PROLOG(0x50) ; BVC r
 _BFC SNES_FLAG_V
OPCODE_EPILOG

OPCODE_PROLOG(0x60) ; RTS s
 add R_Cycles,_5A22_FAST_CYCLE * 2
 PULL_W
 add R_Cycles,_5A22_FAST_CYCLE
 inc ax
 mov R_PC,ax
OPCODE_EPILOG

OPCODE_PROLOG(0x62) ; PER s
 READ16_Immediate
 add R_Cycles,_5A22_FAST_CYCLE
 GET_PBPC ebx
 add eax,ebx
 PUSH_W New
OPCODE_EPILOG

OPCODE_PROLOG(0x6B) ; RTL s
 add R_Cycles,_5A22_FAST_CYCLE * 2
 E0_PULL_L
 Stack_Fixup
 mov R_PBPC,eax
 shr eax,16
 inc R_PC
 mov B_PB,al
OPCODE_EPILOG

OPCODE_PROLOG(0x70) ; BVS r
 _BFS SNES_FLAG_V
OPCODE_EPILOG

OPCODE_PROLOG(0x80) ; BRA r
 _BRA
OPCODE_EPILOG

; Push DB(B) onto stack
OPCODE_PROLOG(0x8B) ; PHB s
 _PHB
OPCODE_EPILOG

OPCODE_PROLOG(0x90) ; BCC r
 _BFC SNES_FLAG_C
OPCODE_EPILOG

OPCODE_PROLOG(0x9A) ; TXS i
 _TxS B_X
OPCODE_EPILOG

; Pull DB(B) from stack
OPCODE_PROLOG(0xAB) ; PLB s
 _PLB
OPCODE_EPILOG

OPCODE_PROLOG(0xB0) ; BCS r
 _BFS SNES_FLAG_C
OPCODE_EPILOG

OPCODE_PROLOG(0xC2) ; REP #
 READ8_Immediate
 add R_Cycles,_5A22_FAST_CYCLE

 mov bl,B_I_flag

 test al,REAL_SNES_FLAG_C
 jz .no_change_carry
 STORE_FLAGS_C ah
.no_change_carry:

 test al,REAL_SNES_FLAG_Z
 jz .no_change_zero
 STORE_FLAGS_Z al
.no_change_zero:

 test al,REAL_SNES_FLAG_I
 jz .no_change_interrupt_disable
 STORE_FLAGS_I ah
.no_change_interrupt_disable:

 test al,REAL_SNES_FLAG_D
 jz .no_change_decimal_mode
 STORE_FLAGS_D ah
.no_change_decimal_mode:

%if S_8bit == 0
 test al,REAL_SNES_FLAG_X
 jz .no_change_index_size
 STORE_FLAGS_X ah
.no_change_index_size:

 test al,REAL_SNES_FLAG_M
 jz .no_change_memory_size
 STORE_FLAGS_M ah
.no_change_memory_size:
%endif

 test al,REAL_SNES_FLAG_V
 jz .no_change_overflow
 STORE_FLAGS_V ah
.no_change_overflow:

 test al,REAL_SNES_FLAG_N
 jz .no_change_negative
 STORE_FLAGS_N ah
.no_change_negative:

 test bl,bl
%if S_8bit
 jz C_LABEL(CPU_RETURN)
 JUMP_FLAG SNES_FLAG_I,C_LABEL(CPU_RETURN)
%else
 jz .no_irq_enable
 JUMP_FLAG SNES_FLAG_I,.no_irq_enable
%endif
 xor edx,edx
 SAVE_CYCLES
 mov [C_LABEL(EventTrip)],edx
 mov edx,Enabling_IRQ_Event
 LOAD_CYCLES
 mov [Event_Handler],edx

%if S_8bit == 0
.no_irq_enable:
 SET_TABLE_MX
%endif
OPCODE_EPILOG

OPCODE_PROLOG(0xD0) ; BNE r
 _BFC SNES_FLAG_Z
OPCODE_EPILOG

OPCODE_PROLOG(0xD4) ; PEI s
 READ16_Direct
 PUSH_W New
OPCODE_EPILOG

OPCODE_PROLOG(0xE2) ; SEP #
 READ8_Immediate
 add R_Cycles,_5A22_FAST_CYCLE

 test al,REAL_SNES_FLAG_C
 jz .no_change_carry
 STORE_FLAGS_C al
.no_change_carry:

 test al,REAL_SNES_FLAG_Z
 jz .no_change_zero
 STORE_FLAGS_Z ah
.no_change_zero:

 test al,REAL_SNES_FLAG_I
 jz .no_change_interrupt_disable
 STORE_FLAGS_I al
.no_change_interrupt_disable:

 test al,REAL_SNES_FLAG_D
 jz .no_change_decimal_mode
 STORE_FLAGS_D al
.no_change_decimal_mode:

%if S_8bit == 0
 test al,REAL_SNES_FLAG_X
 jz .no_change_index_size
 STORE_FLAGS_X al
.no_change_index_size:

 test al,REAL_SNES_FLAG_M
 jz .no_change_memory_size
 STORE_FLAGS_M al
.no_change_memory_size:
%endif

 test al,REAL_SNES_FLAG_V
 jz .no_change_overflow
 STORE_FLAGS_V al
.no_change_overflow:

 test al,REAL_SNES_FLAG_N
 jz .no_change_negative
 STORE_FLAGS_N al
.no_change_negative:

%if S_8bit == 0
 SET_TABLE_MX
%endif
OPCODE_EPILOG

OPCODE_PROLOG(0xF0) ; BEQ r
 _BFS SNES_FLAG_Z
OPCODE_EPILOG

OPCODE_PROLOG(0xF4) ; PEA s
 READ16_Immediate
 PUSH_W New
OPCODE_EPILOG

OPCODE_PROLOG(0xFB) ; XCE i
 ADDR_Implied
%if S_8bit
 JUMP_FLAG SNES_FLAG_C,C_LABEL(CPU_RETURN)
 STORE_FLAGS_E ah
 mov al,1
 STORE_FLAGS_C al
 STORE_FLAGS_M al
 STORE_FLAGS_X al
 mov dword [OpTable],OpTableMX  ; Set current opcode emulation table
%else
 JUMP_NOT_FLAG SNES_FLAG_C,C_LABEL(CPU_RETURN)
 mov B_XH,ah
 mov B_YH,ah
 STORE_FLAGS_C ah
 mov al,1
 STORE_FLAGS_E al
 STORE_FLAGS_B al
 STORE_FLAGS_1 al
 mov B_SH,al
 mov dword [OpTable],OpTableE1  ; Set current opcode emulation table
%endif
OPCODE_EPILOG

OPCODE_PROLOG(0xFC) ; JSR (a,x)
 ADDR_Absolute_Indexed_Indirect JSR
 mov R_PC,ax
OPCODE_EPILOG

%undef OPCODE_PROLOG

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -