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

📄 cpuops.cpp

📁 著名SFC模拟器Snes9x的源代码。
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    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 + -