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

📄 cpuops.cpp

📁 著名SFC模拟器Snes9x的源代码。
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    CPU.Cycles += ONE_CYCLE;#endif    Registers.D.W = Registers.A.W;    SetZN16 (Registers.D.W);}static void Op1B (void){#ifdef VAR_CYCLES    CPU.Cycles += ONE_CYCLE;#endif    Registers.S.W = Registers.A.W;    if (CheckEmulation())	Registers.SH = 1;}static void Op7B (void){#ifdef VAR_CYCLES    CPU.Cycles += ONE_CYCLE;#endif    Registers.A.W = Registers.D.W;    SetZN16 (Registers.A.W);}static void Op3B (void){#ifdef VAR_CYCLES    CPU.Cycles += ONE_CYCLE;#endif    Registers.A.W = Registers.S.W;    SetZN16 (Registers.A.W);}static void OpBAX1 (void){#ifdef VAR_CYCLES    CPU.Cycles += ONE_CYCLE;#endif    Registers.XL = Registers.SL;    SetZN8 (Registers.XL);}static void OpBAX0 (void){#ifdef VAR_CYCLES    CPU.Cycles += ONE_CYCLE;#endif    Registers.X.W = Registers.S.W;    SetZN16 (Registers.X.W);}static void Op8AM1 (void){#ifdef VAR_CYCLES    CPU.Cycles += ONE_CYCLE;#endif    Registers.AL = Registers.XL;    SetZN8 (Registers.AL);}static void Op8AM0 (void){#ifdef VAR_CYCLES    CPU.Cycles += ONE_CYCLE;#endif    Registers.A.W = Registers.X.W;    SetZN16 (Registers.A.W);}static void Op9A (void){#ifdef VAR_CYCLES    CPU.Cycles += ONE_CYCLE;#endif    Registers.S.W = Registers.X.W;    if (CheckEmulation())	Registers.SH = 1;}static void Op9BX1 (void){#ifdef VAR_CYCLES    CPU.Cycles += ONE_CYCLE;#endif    Registers.YL = Registers.XL;    SetZN8 (Registers.YL);}static void Op9BX0 (void){#ifdef VAR_CYCLES    CPU.Cycles += ONE_CYCLE;#endif    Registers.Y.W = Registers.X.W;    SetZN16 (Registers.Y.W);}static void Op98M1 (void){#ifdef VAR_CYCLES    CPU.Cycles += ONE_CYCLE;#endif    Registers.AL = Registers.YL;    SetZN8 (Registers.AL);}static void Op98M0 (void){#ifdef VAR_CYCLES    CPU.Cycles += ONE_CYCLE;#endif    Registers.A.W = Registers.Y.W;    SetZN16 (Registers.A.W);}static void OpBBX1 (void){#ifdef VAR_CYCLES    CPU.Cycles += ONE_CYCLE;#endif    Registers.XL = Registers.YL;    SetZN8 (Registers.XL);}static void OpBBX0 (void){#ifdef VAR_CYCLES    CPU.Cycles += ONE_CYCLE;#endif    Registers.X.W = Registers.Y.W;    SetZN16 (Registers.X.W);}/**********************************************************************************************//* XCE *************************************************************************************** */static void OpFB (void){#ifdef VAR_CYCLES    CPU.Cycles += ONE_CYCLE;#endif    A1 = ICPU._Carry;    A2 = Registers.PH;    ICPU._Carry = A2 & 1;    Registers.PH = A1;    if (CheckEmulation())    {	SetFlags (MemoryFlag | IndexFlag);	Registers.SH = 1;	missing.emulate6502 = 1;    }    if (CheckIndex ())    {	Registers.XH = 0;	Registers.YH = 0;    }    S9xFixCycles();}/**********************************************************************************************//* BRK *************************************************************************************** */static void Op00 (void){#ifdef DEBUGGER    if (CPU.Flags & TRACE_FLAG)	S9xTraceMessage ("*** BRK");#endif#ifndef SA1_OPCODES    CPU.BRKTriggered = TRUE;#endif    if (!CheckEmulation())    {	PushB (Registers.PB);	PushW (CPU.PC - CPU.PCBase + 1);	S9xPackStatus ();	PushB (Registers.PL);	ClearDecimal ();	SetIRQ ();	Registers.PB = 0;	ICPU.ShiftedPB = 0;	S9xSetPCBase (S9xGetWord (0xFFE6));#ifdef VAR_CYCLES        CPU.Cycles += TWO_CYCLES;#else#ifndef SA1_OPCODES	CPU.Cycles += 8;#endif#endif    }    else    {	PushW (CPU.PC - CPU.PCBase);	S9xPackStatus ();	PushB (Registers.PL);	ClearDecimal ();	SetIRQ ();	Registers.PB = 0;	ICPU.ShiftedPB = 0;	S9xSetPCBase (S9xGetWord (0xFFFE));#ifdef VAR_CYCLES	CPU.Cycles += ONE_CYCLE;#else#ifndef SA1_OPCODES	CPU.Cycles += 6;#endif#endif    }}/**********************************************************************************************//* BRL ************************************************************************************** */static void Op82 (void){    RelativeLong ();    S9xSetPCBase (ICPU.ShiftedPB + OpAddress);}/**********************************************************************************************//* IRQ *************************************************************************************** */void S9xOpcode_IRQ (void){#ifdef DEBUGGER    if (CPU.Flags & TRACE_FLAG)	S9xTraceMessage ("*** IRQ");#endif    if (!CheckEmulation())    {	PushB (Registers.PB);	PushW (CPU.PC - CPU.PCBase);	S9xPackStatus ();	PushB (Registers.PL);	ClearDecimal ();	SetIRQ ();	Registers.PB = 0;	ICPU.ShiftedPB = 0;#ifdef SA1_OPCODES	S9xSA1SetPCBase (Memory.FillRAM [0x2207] |			 (Memory.FillRAM [0x2208] << 8));#else	if (Settings.SA1 && (Memory.FillRAM [0x2209] & 0x40))	    S9xSetPCBase (Memory.FillRAM [0x220e] | 			  (Memory.FillRAM [0x220f] << 8));	else	    S9xSetPCBase (S9xGetWord (0xFFEE));#endif#ifdef VAR_CYCLES        CPU.Cycles += TWO_CYCLES;#else#ifndef SA1_OPCODES	CPU.Cycles += 8;#endif#endif    }    else    {	PushW (CPU.PC - CPU.PCBase);	S9xPackStatus ();	PushB (Registers.PL);	ClearDecimal ();	SetIRQ ();	Registers.PB = 0;	ICPU.ShiftedPB = 0;#ifdef SA1_OPCODES	S9xSA1SetPCBase (Memory.FillRAM [0x2207] |			 (Memory.FillRAM [0x2208] << 8));#else	if (Settings.SA1 && (Memory.FillRAM [0x2209] & 0x40))	    S9xSetPCBase (Memory.FillRAM [0x220e] | 			  (Memory.FillRAM [0x220f] << 8));	else	    S9xSetPCBase (S9xGetWord (0xFFFE));#endif#ifdef VAR_CYCLES	CPU.Cycles += ONE_CYCLE;#else#ifndef SA1_OPCODES	CPU.Cycles += 6;#endif#endif    }}/**********************************************************************************************//* NMI *************************************************************************************** */void S9xOpcode_NMI (void){#ifdef DEBUGGER    if (CPU.Flags & TRACE_FLAG)	S9xTraceMessage ("*** NMI");#endif    if (!CheckEmulation())    {	PushB (Registers.PB);	PushW (CPU.PC - CPU.PCBase);	S9xPackStatus ();	PushB (Registers.PL);	ClearDecimal ();	SetIRQ ();	Registers.PB = 0;	ICPU.ShiftedPB = 0;#ifdef SA1_OPCODES	S9xSA1SetPCBase (Memory.FillRAM [0x2205] |			 (Memory.FillRAM [0x2206] << 8));#else	if (Settings.SA1 && (Memory.FillRAM [0x2209] & 0x20))	    S9xSetPCBase (Memory.FillRAM [0x220c] |			  (Memory.FillRAM [0x220d] << 8));	else	    S9xSetPCBase (S9xGetWord (0xFFEA));#endif#ifdef VAR_CYCLES	CPU.Cycles += TWO_CYCLES;#else#ifndef SA1_OPCODES	CPU.Cycles += 8;#endif#endif    }    else    {	PushW (CPU.PC - CPU.PCBase);	S9xPackStatus ();	PushB (Registers.PL);	ClearDecimal ();	SetIRQ ();	Registers.PB = 0;	ICPU.ShiftedPB = 0;#ifdef SA1_OPCODES	S9xSA1SetPCBase (Memory.FillRAM [0x2205] |			 (Memory.FillRAM [0x2206] << 8));#else	if (Settings.SA1 && (Memory.FillRAM [0x2209] & 0x20))	    S9xSetPCBase (Memory.FillRAM [0x220c] |			  (Memory.FillRAM [0x220d] << 8));	else	    S9xSetPCBase (S9xGetWord (0xFFFA));#endif#ifdef VAR_CYCLES	CPU.Cycles += ONE_CYCLE;#else#ifndef SA1_OPCODES	CPU.Cycles += 6;#endif#endif    }}/**********************************************************************************************//* COP *************************************************************************************** */static void Op02 (void){#ifdef DEBUGGER    if (CPU.Flags & TRACE_FLAG)	S9xTraceMessage ("*** COP");#endif	    if (!CheckEmulation())    {	PushB (Registers.PB);	PushW (CPU.PC - CPU.PCBase + 1);	S9xPackStatus ();	PushB (Registers.PL);	ClearDecimal ();	SetIRQ ();	Registers.PB = 0;	ICPU.ShiftedPB = 0;	S9xSetPCBase (S9xGetWord (0xFFE4));#ifdef VAR_CYCLES        CPU.Cycles += TWO_CYCLES;#else#ifndef SA1_OPCODES	CPU.Cycles += 8;#endif#endif    }    else    {	PushW (CPU.PC - CPU.PCBase);	S9xPackStatus ();	PushB (Registers.PL);	ClearDecimal ();	SetIRQ ();	Registers.PB = 0;	ICPU.ShiftedPB = 0;	S9xSetPCBase (S9xGetWord (0xFFF4));#ifdef VAR_CYCLES	CPU.Cycles += ONE_CYCLE;#else#ifndef SA1_OPCODES	CPU.Cycles += 6;#endif#endif    }}/**********************************************************************************************//* JML *************************************************************************************** */static void OpDC (void){    AbsoluteIndirectLong ();    Registers.PB = (uint8) (OpAddress >> 16);    ICPU.ShiftedPB = OpAddress & 0xff0000;    S9xSetPCBase (OpAddress);#ifdef VAR_CYCLES    CPU.Cycles += TWO_CYCLES;#endif}static void Op5C (void){    AbsoluteLong ();    Registers.PB = (uint8) (OpAddress >> 16);    ICPU.ShiftedPB = OpAddress & 0xff0000;    S9xSetPCBase (OpAddress);}/**********************************************************************************************//* JMP *************************************************************************************** */static void Op4C (void){    Absolute ();    S9xSetPCBase (ICPU.ShiftedPB + (OpAddress & 0xffff));#if defined(CPU_SHUTDOWN) && defined(SA1_OPCODES)    CPUShutdown ();#endif}static void Op6C (void){    AbsoluteIndirect ();    S9xSetPCBase (ICPU.ShiftedPB + (OpAddress & 0xffff));}static void Op7C (void){    AbsoluteIndexedIndirect ();    S9xSetPCBase (ICPU.ShiftedPB + OpAddress);#ifdef VAR_CYCLES    CPU.Cycles += ONE_CYCLE;#endif}/**********************************************************************************************//* JSL/RTL *********************************************************************************** */static void Op22 (void){    AbsoluteLong ();    PushB (Registers.PB);    PushW (CPU.PC - CPU.PCBase - 1);    Registers.PB = (uint8) (OpAddress >> 16);    ICPU.ShiftedPB = OpAddress & 0xff0000;    S9xSetPCBase (OpAddress);}static void Op6B (void){    PullW (Registers.PC);    PullB (Registers.PB);    ICPU.ShiftedPB = Registers.PB << 16;    S9xSetPCBase (ICPU.ShiftedPB + ((Registers.PC + 1) & 0xffff));#ifdef VAR_CYCLES    CPU.Cycles += TWO_CYCLES;#endif}/**********************************************************************************************//* JSR/RTS *********************************************************************************** */static void Op20 (void){    Absolute ();    PushW (CPU.PC - CPU.PCBase - 1);    S9xSetPCBase (ICPU.ShiftedPB + (OpAddress & 0xffff));#ifdef VAR_CYCLES    CPU.Cycles += ONE_CYCLE;#endif}static void OpFC (void){    AbsoluteIndexedIndirect ();    PushW (CPU.PC - CPU.PCBase - 1);    S9xSetPCBase (ICPU.ShiftedPB + OpAddress);#ifdef VAR_CYCLES    CPU.Cycles += ONE_CYCLE;#endif}static void Op60 (void){    PullW (Registers.PC);    S9xSetPCBase (ICPU.ShiftedPB + ((Registers.PC + 1) & 0xffff));#ifdef VAR_CYCLES    CPU.Cycles += ONE_CYCLE * 3;#endif}/**********************************************************************************************//* MVN/MVP *********************************************************************************** */static void Op54X1 (void){    uint32 SrcBank;#ifdef VAR_CYCLES    CPU.Cycles += CPU.MemSpeedx2 + TWO_CYCLES;#endif        Registers.DB = *CPU.PC++;    ICPU.ShiftedDB = Registers.DB << 16;    SrcBank = *CPU.PC++;    S9xSetByte (S9xGetByte ((SrcBank << 16) + Registers.X.W), 	     ICPU.ShiftedDB + Registers.Y.W);    Registers.XL++;    Registers.YL++;    Registers.A.W--;    if (Registers.A.W != 0xffff)	CPU.PC -= 3;}static void Op54X0 (void){    uint32 SrcBank;#ifdef VAR_CYCLES    CPU.Cycles += CPU.MemSpeedx2 + TWO_CYCLES;#endif        Registers.DB = *CPU.PC++;    ICPU.ShiftedDB = Registers.DB << 16;    SrcBank = *CPU.PC++;    S9xSetByte (S9xGetByte ((SrcBank << 16) + Registers.X.W), 	     ICPU.ShiftedDB + Registers.Y.W);    Registers.X.W++;    Registers.Y.W++;    Registers.A.W--;    if (Registers.A.W != 0xffff)	CPU.PC -= 3;}static void Op44X1 (void){    uint32 SrcBank;#ifdef VAR_CYCLES    CPU.Cycles += CPU.MemSpeedx2 + TWO_CYCLES;#endif        Registers.DB = *CPU.PC++;    ICPU.ShiftedDB = Registers.DB << 16;    SrcBank = *CPU.PC++;    S9xSetByte (S9xGetByte ((SrcBank << 16) + Registers.X.W), 	     ICPU.ShiftedDB + Registers.Y.W);    Registers.XL--;    Registers.YL--;    Registers.A.W--;    if (Registers.A.W != 0xffff)	CPU.PC -= 3;}static void Op44X0 (void){    uint32 SrcBank;#ifdef VAR_CYCLES    CPU.Cycles += CPU.MemSpeedx2 + TWO_CYCLES;#endif        Registers.DB = *CPU.PC++;    ICPU.ShiftedDB = Registers.DB << 16;    SrcBank = *CPU.PC++;    S9xSetByte (S9xGetByte ((SrcBank << 16) + Registers.X.W), 	     ICPU.ShiftedDB + Registers.Y.W);    Registers.X.W--;    Registers.Y.W--;    Registers.A.W--;    if (Registers.A.W != 0xffff)	CPU.PC -= 3;}/**********************************************************************************************//* REP/SEP *********************************************************************************** */static void OpC2 (void){    Work8 = ~*CPU.PC++;    Registers.PL &= Work8;    ICPU._Carry &= Work8;    ICPU._Overflow &= (Work8 >> 6);    ICPU._Negative &= Work8;    ICPU._Zero |= ~Work8 & Zero;#ifdef VAR_CYCLES    CPU.Cycles += CPU.MemSpeed + ONE_CYCLE;#endif    if (CheckEmulation())    {	SetFlags (MemoryFlag | IndexFlag);	missing.emulate6502 = 1;    }    if (CheckIndex ())    {	Registers.XH = 0;	Registers.YH = 0;    }    S9xFixCycles();    CHECK_FOR_IRQ();}static void OpE2 (void){    Work8 = *CPU.PC++;    Registers.PL |= Work8;    ICPU._Carry |= Work8 & 1;    ICPU._Overflow |= (Work8 >> 6) & 1;    ICPU._Negative |= Work8;    if (Work8 & Zero)	ICPU._Zero = 0;#ifdef VAR_CYCLES    CPU.Cycles += CPU.MemSpeed + ONE_CYCLE;#endif    if (CheckEmulation())    {	SetFlags (MemoryFlag | IndexFlag);	missing.emulate6502 = 1;    }    if (CheckIndex ())    {	Registers.XH = 0;	Registers.YH = 0;    }    S9xFixCycles();}/**********************************************************************************************//* XBA *************************************************************************************** */static void OpEB (void){    Work8 = Registers.AL;    Registers.AL = Registers.AH;    Registers.AH = Work8;    SetZN8 (Registers.AL);#ifdef VAR_CYCLES    CPU.Cycles += TWO_CYCLES;#endif}/**********************************************************************************************//* RTI *************************************************************************************** */static void Op40 (void){    PullB (Registers.PL);    S9xUnpackStatus ();    PullW (Registers.PC);    if (!CheckEmulation())    {	PullB (Registers.PB);	ICPU.ShiftedPB = Registers.PB << 16;    }    else    {	SetFlags (MemoryFlag | IndexFlag);	missing.emulate6502 = 1;    }    S9xSetPCBase (ICPU.ShiftedPB + Registers.PC);        if (CheckIndex ())    {	Registers.XH = 0;	Registers.YH = 0;    }#ifdef VAR_CYCLES    CPU.Cycles += TWO_CYCLES;#endif    S9xFixCycles();    CHECK_FOR_IRQ();}/**********************************************************************************************//* STP/WAI/DB ******************************************************************************** */// WAIstatic void OpCB (void){    if (CPU.IRQActive)    {#ifdef VAR_CYCLES	CPU.Cycles += TWO_CYCLES;#else#ifndef SA1_OPCODES	CPU.Cycles += 2;#endif#endif    }    else    {	CPU.WaitingForInterrupt = TRUE;	CPU.PC--;#ifdef CPU_SHUTDOWN#ifndef SA1_OPCODES	if (Settings.Shutdown)	{	    CPU.Cycles = CPU.NextEvent;	    if (IAPU.APUExecuting)	    {		ICPU.CPUExecuting = FALSE;		do		{		    APU_EXECUTE1 ();		} while (APU.Cycles < CPU.NextEvent);		ICPU.CPUExecuting = TRUE;	    }	}#else	if (Settings.Shutdown)	{	    SA1.CPUExecuting = FALSE;	    SA1.Executing = FALSE;	}#endif#endif    }}// STPstatic void OpDB (void){    CPU.PC--;    CPU.Flags |= DEBUG_MODE_FLAG;}// Reserved S9xOpcodestatic void Op42 (void){}/**********************************************************************************************//**********************************************************************************************//* CPU-S9xOpcodes Definitions                                                                    *//**********************************************************************************************/struct SOpcodes S9xOpcodesM1X1[256] ={    {Op00},	 {Op01M1},    {Op02},      {Op03M1},    {Op04M1},    {Op05M1},    {Op06M1},    {Op07M1},    {Op08},      {Op09M1},    {Op0AM1},    {Op0B},      {Op0CM1},    {Op0DM1},    {Op0EM1},    {Op0FM1},    {Op10},      {Op11M1},    {Op12M1},    {Op13M1},    {Op14M1},    {Op15M1},    {Op16M1},    {Op17M1},    {Op18},    {Op19M1},    {Op1AM1},    {Op1B},      {Op1CM1},    {Op1DM1},    {Op1EM1},    {Op1FM1},    {Op20},      {Op21M1},    {Op22},    {Op23M1},    {Op24M1},    {Op25M1},    {Op26M1},    {Op27M1},    {Op28},      {Op29M1},    {Op2AM1},    {Op2B},      {Op2CM1},    {Op2DM1},    {Op2EM1},    {Op2FM1},    {Op30},      {Op31M1},    {Op32M1},    {Op33M1},    {Op34M1},    {Op35M1},    {Op36M1},    {Op37M1},    {Op38},      {Op39M1},    {Op3AM1},    {Op3B},    {Op3CM1},    {Op3DM1},    {Op3EM1},    {Op3FM1},    {Op40},    {Op41M1},    {Op42},      {Op43M1},    {Op44X1},    {Op45M1},    {Op46M1},    {Op47M1},    {Op48M1},    {Op49M1},    {Op4AM1},    {Op4B},      {Op4C},      {Op4DM1},    {Op4EM1},    {Op4FM1},    {Op50},      {Op51M1},    {Op52M1},    {Op53M1},    {Op54X1},    {Op55M1},    {Op56M1},    {Op57M1},    {Op58},      {Op59M1},    {Op5AX1},    {Op5B},      {Op5C},      {Op5DM1},    {Op5EM1},    {Op5FM1},    {Op60},      {Op61M1},    {Op62},      {Op63M1},    {Op64M1},    {Op65M1},    {Op66M1},    {Op67M1},    {Op68M1},    {Op69M1},    {Op6AM1},    {Op6B},      {Op6C},      {Op6DM1},    {Op6EM1},    {Op6FM1},    {Op70},      {Op71M1},    {Op72M1},    {Op73M1},    {Op74M1},    {Op75M1},    {Op76M1},    {Op77M1},    {Op78},      {Op79M1},    {Op7AX1},    {Op7B},      {Op7C},    {Op7DM1},    {Op7EM1},    {Op7FM1},    {Op80},      {Op81M1},    {Op82},      {Op83M1},    {Op84X1},    {Op85M1},    {Op86X1},    {Op87M1},    {Op88X1},    {Op89M1},    {Op8AM1},    {Op

⌨️ 快捷键说明

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