📄 cpuops.cpp
字号:
STX8 ();}static void Op96X0 (void){ DirectIndexedY (WRITE); STX16 ();}static void Op8EX1 (void){ Absolute (WRITE); STX8 ();}static void Op8EX0 (void){ Absolute (WRITE); STX16 ();}/**********************************************************************************************//* STY *************************************************************************************** */static void Op84X1 (void){ Direct (WRITE); STY8 ();}static void Op84X0 (void){ Direct (WRITE); STY16 ();}static void Op94X1 (void){ DirectIndexedX (WRITE); STY8 ();}static void Op94X0 (void){ DirectIndexedX (WRITE); STY16 ();}static void Op8CX1 (void){ Absolute (WRITE); STY8 ();}static void Op8CX0 (void){ Absolute (WRITE); STY16 ();}/**********************************************************************************************//* STZ *************************************************************************************** */static void Op64M1 (void){ Direct (WRITE); STZ8 ();}static void Op64M0 (void){ Direct (WRITE); STZ16 ();}static void Op74M1 (void){ DirectIndexedX (WRITE); STZ8 ();}static void Op74M0 (void){ DirectIndexedX (WRITE); STZ16 ();}static void Op9CM1 (void){ Absolute (WRITE); STZ8 ();}static void Op9CM0 (void){ Absolute (WRITE); STZ16 ();}static void Op9EM1 (void){ AbsoluteIndexedX (WRITE); STZ8 ();}static void Op9EM0 (void){ AbsoluteIndexedX (WRITE); STZ16 ();}/**********************************************************************************************//* TRB *************************************************************************************** */static void Op14M1 (void){ Direct (MODIFY); TRB8 ();}static void Op14M0 (void){ Direct (MODIFY); TRB16 ();}static void Op1CM1 (void){ Absolute (MODIFY); TRB8 ();}static void Op1CM0 (void){ Absolute (MODIFY); TRB16 ();}/**********************************************************************************************//* TSB *************************************************************************************** */static void Op04M1 (void){ Direct (MODIFY); TSB8 ();}static void Op04M0 (void){ Direct (MODIFY); TSB16 ();}static void Op0CM1 (void){ Absolute (MODIFY); TSB8 ();}static void Op0CM0 (void){ Absolute (MODIFY); TSB16 ();}/**********************************************************************************************//* Branch Instructions *********************************************************************** */#ifndef SA1_OPCODES#define BranchCheck0()\ if( CPU.BranchSkip)\ {\ CPU.BranchSkip = FALSE;\ if (!Settings.SoundSkipMethod)\ if( CPU.PC - CPU.PCBase > OpAddress)\ return;\ }#define BranchCheck1()\ if( CPU.BranchSkip)\ {\ CPU.BranchSkip = FALSE;\ if (!Settings.SoundSkipMethod) {\ if( CPU.PC - CPU.PCBase > OpAddress)\ return;\ } else \ if (Settings.SoundSkipMethod == 1)\ return;\ if (Settings.SoundSkipMethod == 3)\ if( CPU.PC - CPU.PCBase > OpAddress)\ return;\ else\ CPU.PC = CPU.PCBase + OpAddress;\ }#define BranchCheck2()\ if( CPU.BranchSkip)\ {\ CPU.BranchSkip = FALSE;\ if (!Settings.SoundSkipMethod) {\ if( CPU.PC - CPU.PCBase > OpAddress)\ return;\ } else \ if (Settings.SoundSkipMethod == 1)\ CPU.PC = CPU.PCBase + OpAddress;\ if (Settings.SoundSkipMethod == 3)\ if (CPU.PC - CPU.PCBase > OpAddress)\ return;\ else\ CPU.PC = CPU.PCBase + OpAddress;\ }#else#define BranchCheck0()#define BranchCheck1()#define BranchCheck2()#endif#ifdef CPU_SHUTDOWN#ifndef SA1_OPCODESinline void CPUShutdown(){ if (Settings.Shutdown && CPU.PC == CPU.WaitAddress) { // Don't skip cycles with a pending NMI or IRQ - could cause delayed // interrupt. Interrupts are delayed for a few cycles already, but // the delay could allow the shutdown code to cycle skip again. // Was causing screen flashing on Top Gear 3000. if (CPU.WaitCounter == 0 && !(CPU.Flags & (IRQ_PENDING_FLAG | NMI_FLAG))) { CPU.WaitAddress = NULL; if (Settings.SA1) S9xSA1ExecuteDuringSleep (); CPU.Cycles = CPU.NextEvent; S9xUpdateAPUTimer(); if (IAPU.APUExecuting) { ICPU.CPUExecuting = FALSE; do { APU_EXECUTE1(); } while (APU.Cycles < CPU.NextEvent); ICPU.CPUExecuting = TRUE; } } else if (CPU.WaitCounter >= 2) CPU.WaitCounter = 1; else CPU.WaitCounter--; }}#elseinline void CPUShutdown(){ if (Settings.Shutdown && CPU.PC == CPU.WaitAddress) { if (CPU.WaitCounter >= 1) { SA1.Executing = FALSE; SA1.CPUExecuting = FALSE; } else CPU.WaitCounter++; }}#endif#else#define CPUShutdown()#endif/* BCC */static void Op90 (void){ Relative (JUMP); BranchCheck0 (); if (!CheckCarry ()) { CPU.PC = CPU.PCBase + OpAddress;#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif CPUShutdown (); }}/* BCS */static void OpB0 (void){ Relative (JUMP); BranchCheck0 (); if (CheckCarry ()) { CPU.PC = CPU.PCBase + OpAddress;#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif CPUShutdown (); }}/* BEQ */static void OpF0 (void){ Relative (JUMP); BranchCheck2 (); if (CheckZero ()) { CPU.PC = CPU.PCBase + OpAddress;#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif CPUShutdown (); }}/* BMI */static void Op30 (void){ Relative (JUMP); BranchCheck1 (); if (CheckNegative ()) { CPU.PC = CPU.PCBase + OpAddress;#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif CPUShutdown (); }}/* BNE */static void OpD0 (void){ Relative (JUMP); BranchCheck1 (); if (!CheckZero ()) { CPU.PC = CPU.PCBase + OpAddress;#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif CPUShutdown (); }}/* BPL */static void Op10 (void){ Relative (JUMP); BranchCheck1 (); if (!CheckNegative ()) { CPU.PC = CPU.PCBase + OpAddress;#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif CPUShutdown (); }}/* BRA */static void Op80 (void){ Relative (JUMP); CPU.PC = CPU.PCBase + OpAddress;#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif CPUShutdown ();}/* BVC */static void Op50 (void){ Relative (JUMP); BranchCheck0 (); if (!CheckOverflow ()) { CPU.PC = CPU.PCBase + OpAddress;#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif CPUShutdown (); }}/* BVS */static void Op70 (void){ Relative (JUMP); BranchCheck0 (); if (CheckOverflow ()) { CPU.PC = CPU.PCBase + OpAddress;#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif CPUShutdown (); }}/**********************************************************************************************//* ClearFlag Instructions ******************************************************************** *//* CLC */static void Op18 (void){ ClearCarry ();#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif}/* CLD */static void OpD8 (void){ ClearDecimal ();#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif}/* CLI */static void Op58 (void){ ClearIRQ ();#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif/* CHECK_FOR_IRQ(); */}/* CLV */static void OpB8 (void){ ClearOverflow ();#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif}/**********************************************************************************************//* DEX/DEY *********************************************************************************** */static void OpCAX1 (void){#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif#ifdef CPU_SHUTDOWN CPU.WaitAddress = NULL;#endif Registers.XL--; SetZN8 (Registers.XL);}static void OpCAX0 (void){#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif#ifdef CPU_SHUTDOWN CPU.WaitAddress = NULL;#endif Registers.X.W--; SetZN16 (Registers.X.W);}static void Op88X1 (void){#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif#ifdef CPU_SHUTDOWN CPU.WaitAddress = NULL;#endif Registers.YL--; SetZN8 (Registers.YL);}static void Op88X0 (void){#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif#ifdef CPU_SHUTDOWN CPU.WaitAddress = NULL;#endif Registers.Y.W--; SetZN16 (Registers.Y.W);}/**********************************************************************************************//* INX/INY *********************************************************************************** */static void OpE8X1 (void){#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif#ifdef CPU_SHUTDOWN CPU.WaitAddress = NULL;#endif Registers.XL++; SetZN8 (Registers.XL);}static void OpE8X0 (void){#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif#ifdef CPU_SHUTDOWN CPU.WaitAddress = NULL;#endif Registers.X.W++; SetZN16 (Registers.X.W);}static void OpC8X1 (void){#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif#ifdef CPU_SHUTDOWN CPU.WaitAddress = NULL;#endif Registers.YL++; SetZN8 (Registers.YL);}static void OpC8X0 (void){#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif#ifdef CPU_SHUTDOWN CPU.WaitAddress = NULL;#endif Registers.Y.W++; SetZN16 (Registers.Y.W);}/**********************************************************************************************//* NOP *************************************************************************************** */static void OpEA (void){#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif}/**********************************************************************************************//* PUSH Instructions ************************************************************************* *//* #define PushW(w) \ * S9xSetWord (w, Registers.S.W - 1);\ * Registers.S.W -= 2; */#define PushB(b)\ S9xSetByte (b, Registers.S.W--);#define PushBE(b)\ S9xSetByte (b, Registers.S.W--);\ Registers.SH=0x01;#define PushW(w) \ S9xSetByte ((w)>>8, Registers.S.W);\ S9xSetByte ((w)&0xff, (Registers.S.W - 1)&0xFFFF);\ Registers.S.W -= 2;#define PushWE(w) \ S9xSetByte ((w)>>8, Registers.S.W--);\ Registers.SH=0x01;\ S9xSetByte ((w)&0xff, (Registers.S.W--)&0xFFFF);\ Registers.SH = 0x01;#define PushWENew(w) \ S9xSetByte ((w)>>8, Registers.S.W--);\ S9xSetByte ((w)&0xff, (Registers.S.W--)&0xFFFF);\ Registers.SH = 0x01;//PEA NLstatic void OpF4E1 (void){ Absolute (NONE); PushWENew ((unsigned short)OpAddress);}static void OpF4 (void){ Absolute (NONE); PushW ((unsigned short)OpAddress);}//PEI NLstatic void OpD4E1 (void){ DirectIndirect (NONE); PushWENew ((unsigned short)OpAddress);}static void OpD4 (void){ DirectIndirect (NONE); PushW ((unsigned short)OpAddress);}//PER NLstatic void Op62E1 (void){ RelativeLong (NONE); PushWENew ((unsigned short)OpAddress);}static void Op62 (void){ RelativeLong (NONE); PushW ((unsigned short)OpAddress);}//PHAstatic void Op48E1 (void){ PushBE (Registers.AL);#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif}static void Op48M1 (void){ PushB (Registers.AL);#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif}static void Op48M0 (void){ PushW (Registers.A.W);#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif}//PHBstatic void Op8BE1 (void){ PushBE (Registers.DB);#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif}static void Op8B (void){ PushB (Registers.DB);#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif}//PHD NLstatic void Op0BE1 (void){ PushWENew (Registers.D.W);#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif}static void Op0B (void){ PushW (Registers.D.W);#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif}//PHKstatic void Op4BE1 (void){ PushBE (Registers.PB);#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif}static void Op4B (void){ PushB (Registers.PB);#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif}//PHPstatic void Op08E1 (void){ S9xPackStatus (); PushBE (Registers.PL);#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif}static void Op08 (void){ S9xPackStatus (); PushB (Registers.PL);#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif}//PHXstatic void OpDAE1 (void){ PushBE (Registers.XL);#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif}static void OpDAX1 (void){ PushB (Registers.XL);#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif}static void OpDAX0 (void){ PushW (Registers.X.W);#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif}//PHYstatic void Op5AE1 (void){ PushBE (Registers.YL);#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif}static void Op5AX1 (void){ PushB (Registers.YL);#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif}static void Op5AX0 (void){ PushW (Registers.Y.W);#ifndef SA1_OPCODES CPU.Cycles += ONE_CYCLE;#endif}/**********************************************************************************************//* PULL Instructions ************************************************************************* */#define PullW(w) \ w = S9xGetByte (++Registers.S.W); \ w |= (S9xGetByte (++Registers.S.W)<<8);/* w = S9xGetWord (Registers.S.W + 1); \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -