📄 cpuops.cpp
字号:
DirectIndexedX (); STZ8 ();}static void Op74M0 (void){ DirectIndexedX (); STZ16 ();}static void Op9CM1 (void){ Absolute (); STZ8 ();}static void Op9CM0 (void){ Absolute (); STZ16 ();}static void Op9EM1 (void){ AbsoluteIndexedX (); STZ8 ();}static void Op9EM0 (void){ AbsoluteIndexedX (); STZ16 ();}/**********************************************************************************************//* TRB *************************************************************************************** */static void Op14M1 (void){ Direct (); TRB8 ();}static void Op14M0 (void){ Direct (); TRB16 ();}static void Op1CM1 (void){ Absolute (); TRB8 ();}static void Op1CM0 (void){ Absolute (); TRB16 ();}/**********************************************************************************************//* TSB *************************************************************************************** */static void Op04M1 (void){ Direct (); TSB8 ();}static void Op04M0 (void){ Direct (); TSB16 ();}static void Op0CM1 (void){ Absolute (); TSB8 ();}static void Op0CM0 (void){ Absolute (); 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) { if (CPU.WaitCounter == 0) { CPU.WaitAddress = NULL; if (Settings.SA1) S9xSA1ExecuteDuringSleep (); CPU.Cycles = CPU.NextEvent; 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 (); BranchCheck0 (); if (!CheckCarry ()) { CPU.PC = CPU.PCBase + OpAddress;#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#else#ifndef SA1_OPCODES CPU.Cycles++;#endif#endif CPUShutdown (); }}/* BCS */static void OpB0 (void){ Relative (); BranchCheck0 (); if (CheckCarry ()) { CPU.PC = CPU.PCBase + OpAddress;#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#else#ifndef SA1_OPCODES CPU.Cycles++;#endif#endif CPUShutdown (); }}/* BEQ */static void OpF0 (void){ Relative (); BranchCheck2 (); if (CheckZero ()) { CPU.PC = CPU.PCBase + OpAddress;#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#else#ifndef SA1_OPCODES CPU.Cycles++;#endif#endif CPUShutdown (); }}/* BMI */static void Op30 (void){ Relative (); BranchCheck1 (); if (CheckNegative ()) { CPU.PC = CPU.PCBase + OpAddress;#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#else#ifndef SA1_OPCODES CPU.Cycles++;#endif#endif CPUShutdown (); }}/* BNE */static void OpD0 (void){ Relative (); BranchCheck1 (); if (!CheckZero ()) { CPU.PC = CPU.PCBase + OpAddress;#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#else#ifndef SA1_OPCODES CPU.Cycles++;#endif#endif CPUShutdown (); }}/* BPL */static void Op10 (void){ Relative (); BranchCheck1 (); if (!CheckNegative ()) { CPU.PC = CPU.PCBase + OpAddress;#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#else#ifndef SA1_OPCODES CPU.Cycles++;#endif#endif CPUShutdown (); }}/* BRA */static void Op80 (void){ Relative (); CPU.PC = CPU.PCBase + OpAddress;#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#else#ifndef SA1_OPCODES CPU.Cycles++;#endif#endif CPUShutdown ();}/* BVC */static void Op50 (void){ Relative (); BranchCheck0 (); if (!CheckOverflow ()) { CPU.PC = CPU.PCBase + OpAddress;#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#else#ifndef SA1_OPCODES CPU.Cycles++;#endif#endif CPUShutdown (); }}/* BVS */static void Op70 (void){ Relative (); BranchCheck0 (); if (CheckOverflow ()) { CPU.PC = CPU.PCBase + OpAddress;#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#else#ifndef SA1_OPCODES CPU.Cycles++;#endif#endif CPUShutdown (); }}/**********************************************************************************************//* ClearFlag Instructions ******************************************************************** */static void Op18 (void){ ClearCarry ();#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif}static void OpD8 (void){ ClearDecimal ();#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif}static void Op58 (void){ ClearIRQ ();#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif CHECK_FOR_IRQ();}static void OpB8 (void){ ClearOverflow ();#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif}/**********************************************************************************************//* DEX/DEY *********************************************************************************** */static void OpCAX1 (void){#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif#ifdef CPU_SHUTDOWN CPU.WaitAddress = NULL;#endif Registers.XL--; SetZN8 (Registers.XL);}static void OpCAX0 (void){#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif#ifdef CPU_SHUTDOWN CPU.WaitAddress = NULL;#endif Registers.X.W--; SetZN16 (Registers.X.W);}static void Op88X1 (void){#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif#ifdef CPU_SHUTDOWN CPU.WaitAddress = NULL;#endif Registers.YL--; SetZN8 (Registers.YL);}static void Op88X0 (void){#ifdef VAR_CYCLES 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){#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif#ifdef CPU_SHUTDOWN CPU.WaitAddress = NULL;#endif Registers.XL++; SetZN8 (Registers.XL);}static void OpE8X0 (void){#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif#ifdef CPU_SHUTDOWN CPU.WaitAddress = NULL;#endif Registers.X.W++; SetZN16 (Registers.X.W);}static void OpC8X1 (void){#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif#ifdef CPU_SHUTDOWN CPU.WaitAddress = NULL;#endif Registers.YL++; SetZN8 (Registers.YL);}static void OpC8X0 (void){#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif#ifdef CPU_SHUTDOWN CPU.WaitAddress = NULL;#endif Registers.Y.W++; SetZN16 (Registers.Y.W);}/**********************************************************************************************//* NOP *************************************************************************************** */static void OpEA (void){#ifdef VAR_CYCLES 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--);static void OpF4 (void){ Absolute (); PushW (OpAddress);}static void OpD4 (void){ DirectIndirect (); PushW (OpAddress);}static void Op62 (void){ RelativeLong (); PushW (OpAddress);}static void Op48M1 (void){ PushB (Registers.AL);#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif}static void Op48M0 (void){ PushW (Registers.A.W);#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif}static void Op8B (void){ PushB (Registers.DB);#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif}static void Op0B (void){ PushW (Registers.D.W);#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif}static void Op4B (void){ PushB (Registers.PB);#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif}static void Op08 (void){ S9xPackStatus (); PushB (Registers.PL);#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif}static void OpDAX1 (void){ PushB (Registers.XL);#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif}static void OpDAX0 (void){ PushW (Registers.X.W);#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif}static void Op5AX1 (void){ PushB (Registers.YL);#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif}static void Op5AX0 (void){ PushW (Registers.Y.W);#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif}/**********************************************************************************************//* PULL Instructions ************************************************************************* */#define PullW(w) \ w = S9xGetWord (Registers.S.W + 1); \ Registers.S.W += 2;#define PullB(b)\ b = S9xGetByte (++Registers.S.W);static void Op68M1 (void){#ifdef VAR_CYCLES CPU.Cycles += TWO_CYCLES;#endif PullB (Registers.AL); SetZN8 (Registers.AL);}static void Op68M0 (void){#ifdef VAR_CYCLES CPU.Cycles += TWO_CYCLES;#endif PullW (Registers.A.W); SetZN16 (Registers.A.W);}static void OpAB (void){#ifdef VAR_CYCLES CPU.Cycles += TWO_CYCLES;#endif PullB (Registers.DB); SetZN8 (Registers.DB); ICPU.ShiftedDB = Registers.DB << 16;}static void Op2B (void){#ifdef VAR_CYCLES CPU.Cycles += TWO_CYCLES;#endif PullW (Registers.D.W); SetZN16 (Registers.D.W);}static void Op28 (void){#ifdef VAR_CYCLES CPU.Cycles += TWO_CYCLES;#endif PullB (Registers.PL); S9xUnpackStatus (); if (CheckIndex ()) { Registers.XH = 0; Registers.YH = 0; } S9xFixCycles(); CHECK_FOR_IRQ();}static void OpFAX1 (void){#ifdef VAR_CYCLES CPU.Cycles += TWO_CYCLES;#endif PullB (Registers.XL); SetZN8 (Registers.XL);}static void OpFAX0 (void){#ifdef VAR_CYCLES CPU.Cycles += TWO_CYCLES;#endif PullW (Registers.X.W); SetZN16 (Registers.X.W);}static void Op7AX1 (void){#ifdef VAR_CYCLES CPU.Cycles += TWO_CYCLES;#endif PullB (Registers.YL); SetZN8 (Registers.YL);}static void Op7AX0 (void){#ifdef VAR_CYCLES CPU.Cycles += TWO_CYCLES;#endif PullW (Registers.Y.W); SetZN16 (Registers.Y.W);}/**********************************************************************************************//* SetFlag Instructions ********************************************************************** */static void Op38 (void){ SetCarry ();#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif}static void OpF8 (void){ SetDecimal ();#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif missing.decimal_mode = 1;}static void Op78 (void){ SetIRQ ();#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif}/**********************************************************************************************//* Transfer Instructions ********************************************************************* *//* TAX8 */static void OpAAX1 (void){#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif Registers.XL = Registers.AL; SetZN8 (Registers.XL);}/* TAX16 */static void OpAAX0 (void){#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif Registers.X.W = Registers.A.W; SetZN16 (Registers.X.W);}/* TAY8 */static void OpA8X1 (void){#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif Registers.YL = Registers.AL; SetZN8 (Registers.YL);}/* TAY16 */static void OpA8X0 (void){#ifdef VAR_CYCLES CPU.Cycles += ONE_CYCLE;#endif Registers.Y.W = Registers.A.W; SetZN16 (Registers.Y.W);}static void Op5B (void){#ifdef VAR_CYCLES
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -