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

📄 cpuops.inc

📁 NES game Emulator in Linux.c and asm codes.
💻 INC
字号:
%if 0

SNEeSe, an Open Source Super NES emulator.


Copyright (c) 1998-2004 Charles Bilyue'.
Portions Copyright (c) 2003-2004 Daniel Horchner.

This is free software.  See 'LICENSE' for details.
You must read and accept the license prior to use.

%endif

;%define TRAP_INVALID_JUMP
;Each opcode is followed by one or more codes which signify
; how it works with the status flags in the Processor status (P) register
; T(x) tests flags M(x) modifies flags R(x) resets flags S(x) sets flags
; flags: ENVMXDIZC
; 65c816 opcodes 0x00-0x0F:
;    00: BRK s       2,8 T(ENVMXDIZC) R(D) S(I)
;    01: ORA (d,x)   2,6 T(EM) M(NZ)
;    02: COP s       2,8 T(ENVMXDIZC) R(D) S(I)
;    03: ORA d,s     2,4 T(M) M(NZ)
;    04: TSB d       2,5 T(EM) M(Z)
;    05: ORA d       2,3 T(EM) M(NZ)
;    06: ASL d       2,5 T(EM) M(NZC)
;    07: ORA [d]     2,6 T(EM) M(NZ)
;    08: PHP s       1,3 T(ENVMXDIZC)
;    09: ORA #       2,2 T(M) M(NZ)
;    0A: ASL A       1,2 T(M) M(NZC)
;    0B: PHD s       1,4 T(E)
;    0C: TSB a       3,6 T(M) M(Z)
;    0D: ORA a       3,4 T(M) M(NZ)
;    0E: ASL a       3,6 T(M) M(NZC)
;    0F: ORA al      4,5 T(M) M(NZ)
;
; 65c816 opcodes 0x10-0x1F:
;    10: BPL r       2,2 T(EN)
;    11: ORA (d),y   2,5 T(EMX) M(NZ)
;    12: ORA (d)     2,5 T(EM) M(NZ)
;    13: ORA (d,s),y 2,7 T(M) M(NZ)
;    14: TRB d       2,5 T(EM) M(Z)
;    15: ORA d,x     2,4 T(EM) M(NZ)
;    16: ASL d,x     2,6 T(EM) M(NZC)
;    17: ORA [d],y   2,6 T(EM) M(NZ)
;    18: CLC i       1,2 R(C)
;    19: ORA a,y     3,4 T(MX) M(NZ)
;    1A: INC A       1,2 T(M) M(NZ)
;    1B: TCS i       1,2 T(E)
;    1C: TRB a       3,6 T(M) M(Z)
;    1D: ORA a,x     3,4 T(MX) M(NZ)
;    1E: ASL a,x     3,7 T(M) M(NZC)
;    1F: ORA al,x    4,5 T(M) M(NZ)
;
; 65c816 opcodes 0x20-0x2F:
;    20: JSR a       3,6 T(E)
;    21: AND (d,x)   2,6 T(EM)
;    22: JSL al      4,8 T(E)
;    23: AND d,s     2,4 T(M) M(NZ)
;    24: BIT d       2,3 T(EM) M(NVZ)
;    25: AND d       2,3 T(EM) M(NZ)
;    26: ROL d       2,5 T(EMC) M(NZC)
;    27: AND [d]     2,6 T(EM) M(NZ)
;    28: PLP s       1,4 T(E) M(NVMXDIZC)
;    29: AND #       2,2 T(M) M(NZ)
;    2A: ROL A       1,2 T(MC) M(NZC)
;    2B: PLD s       1,5 T(E) M(NZ)
;    2C: BIT a       3,4 T(M) M(NVZ)
;    2D: AND a       3,4 T(M) M(NZ)
;    2E: ROL a       3,6 T(MC) M(NZC)
;    2F: AND al      4,5 T(M) M(NZ)
;
; 65c816 opcodes 0x30-0x3F:
;    30: BMI r       2,2 T(EN)
;    31: AND (d),y   2,5 T(EMX) M(NZ)
;    32: AND (d)     2,5 T(EM) M(NZ)
;    33: AND (d,s),y 2,7 T(M) M(NZ)
;    34: BIT d,x     2,4 T(EM) M(NVZ)
;    35: AND d,x     2,4 T(EM) M(NZ)
;    36: ROL d,x     2,6 T(EMC) M(NZC)
;    37: AND [d],y   2,6 T(EM) M(NZ)
;    38: SEC i       1,2 S(C)
;    39: AND a,y     3,4 T(MX) M(NZ)
;    3A: DEC A       1,2 T(M) M(NZ)
;    3B: TSC i       1,2 M(NZ)
;    3C: BIT a,x     3,4 T(MX) M(NVZ)
;    3D: AND a,x     3,4 T(MX) M(NZ)
;    3E: ROL a,x     3,7 T(MC) M(NZC)
;    3F: AND al,x    4,5 T(M) M(NZ)
;
; 65c816 opcodes 0x40-0x4F:
;    40: RTI s       1,7 T(E) M(NVMXDIZC)
;    41: EOR (d,x)   2,6 T(EM) M(NZ)
;    42: WDM         2,2
;    43: EOR d,s     2,4 T(M) M(NZ)
;    44: MVP xya     3,7 T(X)
;    45: EOR d       2,3 T(EM) M(NZ)
;    46: LSR d       2,5 T(EM) M(NZC)
;    47: EOR [d]     2,6 T(EM) M(NZ)
;    48: PHA s       1,3 T(EM)
;    49: EOR #       2,2 T(M) M(NZ)
;    4A: LSR A       1,2 T(M) M(NZC)
;    4B: PHK s       1,3 T(E)
;    4C: JMP a       3,3
;    4D: EOR a       3,4 T(M) M(NZ)
;    4E: LSR a       3,6 T(M) M(NZC)
;    4F: EOR al      4,5 T(M) M(NZ)
;
; 65c816 opcodes 0x50-0x5F:
;    50: BVC r       2,2 T(EV)
;    51: EOR (d),y   2,5 T(EMX) M(NZ)
;    52: EOR (d)     2,5 T(EM) M(NZ)
;    53: EOR (d,s),y 2,7 T(M) M(NZ)
;    54: MVN xya     3,7 T(X)
;    55: EOR d,x     2,4 T(EM) M(NZ)
;    56: LSR d,x     2,6 T(EM) M(NZC)
;    57: EOR [d],y   2,6 T(EM) M(NZ)
;    58: CLI i       1,2 R(I)
;    59: EOR a,y     3,4 T(MX) M(NZ)
;    5A: PHY s       1,2 T(EX)
;    5B: TCD i       1,2 M(NZ)
;    5C: JML al      4,4
;    5D: EOR a,x     3,4 T(MX) M(NZ)
;    5E: LSR a,x     3,7 T(M) M(NZC)
;    5F: EOR al,x    4,5 T(M) M(NZ)
;
; 65c816 opcodes 0x60-0x6F:
;    60: RTS s       1,6 T(E)
;    61: ADC (d,x)   2,6 T(EMDC) M(NVZC)
;    62: PER s       3,6 T(E)
;    63: ADC d,s     2,4 T(MDC) M(NVZC)
;    64: STZ d       2,3 T(EM)
;    65: ADC d       2,3 T(EMDC) M(NVZC)
;    66: ROR d       2,5 T(EMC) M(NZC)
;    67: ADC [d]     2,6 T(EMDC) M(NVZC)
;    68: PLA s       1,4 T(EM) M(NZ)
;    69: ADC #       2,2 T(MDC) M(NVZC)
;    6A: ROR A       1,2 T(MC) M(NZC)
;    6B: RTL s       1,6 T(E)
;    6C: JMP (a)     3,5
;    6D: ADC a       3,4 T(MDC) M(NVZC)
;    6E: ROR a       3,6 T(MC) M(NZC)
;    6F: ADC al      4,5 T(MDC) M(NVZC)
;
; 65c816 opcodes 0x70-0x7F:
;    70: BVS r       2,2 T(EV)
;    71: ADC (d),y   2,5 T(EMXDC) M(NVZC)
;    72: ADC (d)     2,5 T(EMDC) M(NVZC)
;    73: ADC (d,s),y 2,7 T(MDC) M(NVZC)
;    74: STZ d,x     2,4 T(EM)
;    75: ADC d,x     2,4 T(EMDC) M(NVZC)
;    76: ROR d,x     2,6 T(EMC) M(NZC)
;    77: ADC [d],y   2,6 T(EMDC) M(NVZC)
;    78: SEI i       1,2 S(I)
;    79: ADC a,y     3,4 T(MXDC) M(NVZC)
;    7A: PLY s       1,4 T(EX) M(NZ)
;    7B: TDC i       1,2 M(NZ)
;    7C: JMP (a,x)   3,6
;    7D: ADC a,x     3,4 T(MXDC) M(NVZC)
;    7E: ROR a,x     3,7 T(MC) M(NZC)
;    7F: ADC al,x    4,5 T(MDC) M(NVZC)
;
; 65c816 opcodes 0x80-0x8F:
;    80: BRA r       2,2 T(E)
;    81: STA (d,x)   2,6 T(EM)
;    82: BRL rl      3,3
;    83: STA d,s     2,4 T(M)
;    84: STY d       2,3 T(EX)
;    85: STA d       2,3 T(EM)
;    86: STX d       2,3 T(EX)
;    87: STA [d]     2,6 T(EM)
;    88: DEY i       1,2 T(X) M(NZ)
;    89: BIT #       2,2 T(M) M(Z)
;    8A: TXA i       1,2 T(M) M(NZ)
;    8B: PHB s       1,3 T(E)
;    8C: STY a       3,4 T(X)
;    8D: STA a       3,4 T(M)
;    8E: STX a       3,4 T(X)
;    8F: STA al      4,5 T(M)
;
; 65c816 opcodes 0x90-0x9F:
;    90: BCC r       2,2 T(EC)
;    91: STA (d),y   2,6 T(EMX)
;    92: STA (d)     2,5 T(EM)
;    93: STA (d,s),y 2,7 T(M)
;    94: STY d,x     2,4 T(EX)
;    95: STA d,x     2,4 T(EM)
;    96: STX d,y     2,4 T(EX)
;    97: STA [d],y   2,6 T(EM)
;    98: TYA i       1,2 T(M) M(NZ)
;    99: STA a,y     3,5 T(M)
;    9A: TXS i       1,2 T(E)
;    9B: TXY i       1,2 T(X) M(NZ)
;    9C: STZ a       3,4 T(M)
;    9D: STA a,x     3,5 T(M)
;    9E: STZ a,x     3,5 T(M)
;    9F: STA al,x    4,5 T(M)
;
; 65c816 opcodes 0xA0-0xAF:
;    A0: LDY #       2,2 T(X) M(NZ)
;    A1: LDA (d,x)   2,6 T(EM) M(NZ)
;    A2: LDX #       2,2 T(X) M(NZ)
;    A3: LDA d,s     2,4 T(M) M(NZ)
;    A4: LDY d       2,3 T(EX) M(NZ)
;    A5: LDA d       2,3 T(EM) M(NZ)
;    A6: LDX d       2,3 T(EX) M(NZ)
;    A7: LDA [d]     2,6 T(EM) M(NZ)
;    A8: TAY i       1,2 T(X) M(NZ)
;    A9: LDA #       2,2 T(M) M(NZ)
;    AA: TAX i       1,2 T(X) M(NZ)
;    AB: PLB s       1,4 T(E) M(NZ)
;    AC: LDY a       3,4 T(X) M(NZ)
;    AD: LDA a       3,4 T(M) M(NZ)
;    AE: LDX a       3,4 T(X) M(NZ)
;    AF: LDA al      4,5 T(M) M(NZ)
;
; 65c816 opcodes 0xB0-0xBF:
;    B0: BCS r       2,2 T(EC)
;    B1: LDA (d),y   2,5 T(EMX) M(NZ)
;    B2: LDA (d)     2,5 T(EM) M(NZ)
;    B3: LDA (d,s),y 2,7 T(M) M(NZ)
;    B4: LDY d,x     2,4 T(EX) M(NZ)
;    B5: LDA d,x     2,4 T(EM) M(NZ)
;    B6: LDX d,y     2,4 T(EX) M(NZ)
;    B7: LDA [d],y   2,6 T(EM) M(NZ)
;    B8: CLV i       1,2 R(V)
;    B9: LDA a,y     3,4 T(MX) M(NZ)
;    BA: TSX i       1,2 T(X) M(NZ)
;    BB: TYX i       1,2 T(X) M(NZ)
;    BC: LDY a,x     3,4 T(X) M(NZ)
;    BD: LDA a,x     3,4 T(MX) M(NZ)
;    BE: LDX a,y     3,4 T(X) M(NZ)
;    BF: LDA al,x    4,5 T(M) M(NZ)
;
; 65c816 opcodes 0xC0-0xCF:
;    C0: CPY #       2,2 T(X) M(NZC)
;    C1: CMP (d,x)   2,6 T(EM) M(NZC)
;    C2: REP #       2,3 T(E) M(NVMXDIZC)
;    C3: CMP d,s     2,4 T(M) M(NZC)
;    C4: CPY d       2,3 T(EX) M(NZC)
;    C5: CMP d       2,3 T(EM) M(NZC)
;    C6: DEC d       2,5 T(EM) M(NZ)
;    C7: CMP [d]     2,6 T(EM) M(NZC)
;    C8: INY i       1,2 T(X) M(NZ)
;    C9: CMP #       2,2 T(M) M(NZC)
;    CA: DEX i       1,2 T(X) M(NZ)
;    CB: WAI i       1,3
;    CC: CPY a       3,4 T(X) M(NZC)
;    CD: CMP a       3,4 T(M) M(NZC)
;    CE: DEC a       3,6 T(M) M(NZ)
;    CF: CMP al      4,5 T(M) M(NZC)
;
; 65c816 opcodes 0xD0-0xDF:
;    D0: BNE r       2,2 T(EZ)
;    D1: CMP (d),y   2,5 T(EMX) M(NZC)
;    D2: CMP (d)     2,5 T(EM) M(NZC)
;    D3: CMP (d,s),y 2,7 T(M) M(NZC)
;    D4: PEI s       2,6 T(E)
;    D5: CMP d,x     2,4 T(EM) M(NZC)
;    D6: DEC d,x     2,6 T(EM) M(NZ)
;    D7: CMP [d],y   2,6 T(EM) M(NZC)
;    D8: CLD i       1,2 R(D)
;    D9: CMP a,y     3,4 T(MX) M(NZC)
;    DA: PHX s       1,3 T(EX)
;    DB: STP i       1,3
;    DC: JML (a)     3,6
;    DD: CMP a,x     3,4 T(MX) M(NZC)
;    DE: DEC a,x     3,7 T(M) M(NZ)
;    DF: CMP al,x    4,5 T(M) M(NZC)
;
; 65c816 opcodes 0xE0-0xEF:
;    E0: CPX #       2,2 T(X) M(NZC)
;    E1: SBC (d,x)   2,6 T(EMDC) M(NVZC)
;    E2: SEP #       2,3 T(E) M(NVMXDIZC)
;    E3: SBC d,s     2,4 T(MDC) M(NVZC)
;    E4: CPX d       2,3 T(EX) M(NZC)
;    E5: SBC d       2,3 T(EMDC) M(NVZC)
;    E6: INC d       2,5 T(EM) M(NZ)
;    E7: SBC [d]     2,6 T(EMDC) M(NVZC)
;    E8: INX i       1,2 T(X) M(NZ)
;    E9: SBC #       2,2 T(MDC) M(NVZC)
;    EA: NOP i       1,2
;    EB: XBA i       1,3 M(NZ)
;    EC: CPX a       3,4 T(X) M(NZC)
;    ED: SBC a       3,4 T(MDC) M(NVZC)
;    EE: INC a       3,6 T(M) M(NZ)
;    EF: SBC al      4,5 T(MDC) M(NVZC)
;
; 65c816 opcodes 0xF0-0xFF:
;    F0: BEQ r       2,2 T(EZ)
;    F1: SBC (d),y   2,5 T(EMXDC) M(NVZC)
;    F2: SBC (d)     2,5 T(EMDC) M(NVZC)
;    F3: SBC (d,s),y 2,7 T(MDC) M(NVZC)
;    F4: PEA s       3,5 T(E)
;    F5: SBC d,x     2,4 T(EMDC) M(NVZC)
;    F6: INC d,x     2,6 T(EM) M(NZ)
;    F7: SBC [d],y   2,6 T(EMDC) M(NVZC)
;    F8: SED i       1,2 S(D)
;    F9: SBC a,y     3,4 T(MXDC) M(NVZC)
;    FA: PLX s       1,4 T(EX) M(NZ)
;    FB: XCE i       1,2 T(EC) M(EC)
;    FC: JSR (a,x)   3,6 T(E)
;    FD: SBC a,x     3,4 T(MXDC) M(NVZC)
;    FE: INC a,x     3,7 T(M) M(NZ)
;    FF: SBC al,x    4,5 T(MDC) M(NVZC)
;


;S,M,X
%macro Setup_Opcode_Sizes 3
%define S_size %1
%if S_size == 8
%define S_8bit 1
%else
%define S_8bit 0
%endif

%define M_size %2
%if M_size == 8
%define M_8bit 1
%else
%define M_8bit 0
%endif

%define X_size %3
%if X_size == 8
%define X_8bit 1
%else
%define X_8bit 0
%endif
%endmacro


%macro Clear_Opcode_Sizes 0
%undef S_size
%undef S_8bit
%undef M_size
%undef M_8bit
%undef X_size
%undef X_8bit
%endmacro

%macro OPCODE_LABEL 1
ALIGNC
EXPORT_C %1
%endmacro


Setup_Opcode_Sizes 8,8,8
%include "cpu/ops_s.inc"
%include "cpu/ops_sm.inc"
%include "cpu/ops_sx.inc"
%include "cpu/ops_smx.inc"
Clear_Opcode_Sizes

Setup_Opcode_Sizes 16,8,8
%include "cpu/ops_s.inc"
%include "cpu/ops_sm.inc"
%include "cpu/ops_sx.inc"
%include "cpu/ops_smx.inc"
Clear_Opcode_Sizes

Setup_Opcode_Sizes 16,16,16
%include "cpu/ops_sm.inc"
%include "cpu/ops_sx.inc"
%include "cpu/ops_smx.inc"
Clear_Opcode_Sizes

Setup_Opcode_Sizes 16,8,16
%include "cpu/ops_smx.inc"
Clear_Opcode_Sizes

Setup_Opcode_Sizes 16,16,8
%include "cpu/ops_smx.inc"
Clear_Opcode_Sizes

Setup_Opcode_Sizes 16,8,8
%include "cpu/ops_m.inc"
%include "cpu/ops_x.inc"
%include "cpu/ops_mx.inc"
Clear_Opcode_Sizes

Setup_Opcode_Sizes 16,16,16
%include "cpu/ops_m.inc"
%include "cpu/ops_x.inc"
%include "cpu/ops_mx.inc"
Clear_Opcode_Sizes

Setup_Opcode_Sizes 16,8,16
%include "cpu/ops_mx.inc"
Clear_Opcode_Sizes

Setup_Opcode_Sizes 16,16,8
%include "cpu/ops_mx.inc"
Clear_Opcode_Sizes


%define OPCODE_PROLOG(op) OPCODE_LABEL Op_ %+ op


OPCODE_PROLOG(0x18) ; CLC i
 _CLx C         ; Clear Carry flag
OPCODE_EPILOG

OPCODE_PROLOG(0x38) ; SEC i
 _SEx C         ; Set Carry flag
OPCODE_EPILOG

OPCODE_PROLOG(0x3B) ; TSC i
 _TxC B_S
OPCODE_EPILOG

OPCODE_PROLOG(0x42) ; WDM
 READ8_Immediate
OPCODE_EPILOG

OPCODE_PROLOG(0x4C) ; JMP a
 ADDR_Absolute_JMP
 mov R_PC,ax
OPCODE_EPILOG

OPCODE_PROLOG(0x58) ; CLI i
 mov cl,B_I_flag
 _CLx I         ; Clear Interrupt disable flag

 test cl,cl
 jz .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:
OPCODE_EPILOG

OPCODE_PROLOG(0x5B) ; TCD i
 _TCD
OPCODE_EPILOG

OPCODE_PROLOG(0x5C) ; JML al
 ADDR_Absolute_Long_JMP
 mov R_PBPC,eax
 shr eax,16
 mov B_PB,al
OPCODE_EPILOG

OPCODE_PROLOG(0x6C) ; JMP (a)
 ADDR_Absolute_Indirect_JMP
 mov R_PC,ax
OPCODE_EPILOG

OPCODE_PROLOG(0x78) ; SEI i
 _SEx I         ; Set Interrupt disable flag
OPCODE_EPILOG

OPCODE_PROLOG(0x7B) ; TDC i
 _TxC B_D
OPCODE_EPILOG

OPCODE_PROLOG(0x7C) ; JMP (a,x)
 ADDR_Absolute_Indexed_Indirect
 mov R_PC,ax
OPCODE_EPILOG

OPCODE_PROLOG(0x82) ; BRL rl
; Branch always long (-32768 to 32767)
 READ16_Immediate
 add R_Cycles,_5A22_FAST_CYCLE
 add R_PC,ax
OPCODE_EPILOG

OPCODE_PROLOG(0xB8) ; CLV i
 _CLx V         ; Clear oVerflow flag
OPCODE_EPILOG

; Wait for interrupt
OPCODE_PROLOG(0xCB) ; WAI i
 add R_Cycles,_5A22_FAST_CYCLE * 2

 mov al,[IRQ_pin]
 test al,al
 jnz .irq_active

 ; Put CPU in WAI mode
 mov byte [CPU_Execution_Mode],CEM_Waiting_For_Interrupt
 ; Trigger next event
 test R_Cycles,R_Cycles
 jge HANDLE_EVENT
 xor R_Cycles,R_Cycles
 jmp HANDLE_EVENT
ALIGNC
.irq_active:
 inc R_PC

%ifdef WAI_DELAY
 ; WAI delay after interrupt signal: 2 IO
 add R_Cycles,_5A22_FAST_CYCLE * 2  ;*
%endif
OPCODE_EPILOG

OPCODE_PROLOG(0xD8) ; CLC i
 _CLx D         ; Clear Decimal mode flag
OPCODE_EPILOG

; Stop the clock
OPCODE_PROLOG(0xDB) ; STP i
 add R_Cycles,_5A22_FAST_CYCLE * 2

 ; Put CPU in STP mode
 mov byte [CPU_Execution_Mode],CEM_Clock_Stopped
 ; Trigger next event
 test R_Cycles,R_Cycles
 jge HANDLE_EVENT
 xor R_Cycles,R_Cycles
 jmp HANDLE_EVENT
OPCODE_EPILOG

OPCODE_PROLOG(0xDC) ; JML [a]
 ADDR_Absolute_Indirect_Long_JMP
 mov R_PBPC,eax
 shr eax,16
 mov B_PB,al
OPCODE_EPILOG

OPCODE_PROLOG(0xEA) ; NOP i
 ADDR_Implied
OPCODE_EPILOG

OPCODE_PROLOG(0xEB) ; XBA i
 ADDR_Implied
 mov ah,B_A
 add R_Cycles,_5A22_FAST_CYCLE
 mov al,B_B
 STORE_FLAGS_NZ al
 mov B_A,eax
OPCODE_EPILOG

OPCODE_PROLOG(0xF8) ; SED i
 _SEx D         ; Set Decimal mode flag
OPCODE_EPILOG

⌨️ 快捷键说明

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