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

📄 cpuops.cpp

📁 SFC游戏模拟器 snes9x 1.43 的原代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	Registers.S.W += 2;*/#define PullB(b)\	b = S9xGetByte (++Registers.S.W);#define PullBE(b)\	Registers.S.W++;\	Registers.SH=0x01;\	b = S9xGetByte (Registers.S.W);#define PullWE(w) \	Registers.S.W++;\	Registers.SH=0x01;\	w = S9xGetByte (Registers.S.W); \	Registers.S.W++; \	Registers.SH=0x01;\	w |= (S9xGetByte (Registers.S.W)<<8);#define PullWENew(w) \	PullW(w);\	Registers.SH=0x01;	//PLAstatic void Op68E1 (void){#ifndef SA1_OPCODES    CPU.Cycles += TWO_CYCLES;#endif    PullBE (Registers.AL);    SetZN8 (Registers.AL);}static void Op68M1 (void){#ifndef SA1_OPCODES    CPU.Cycles += TWO_CYCLES;#endif    PullB (Registers.AL);    SetZN8 (Registers.AL);}static void Op68M0 (void){#ifndef SA1_OPCODES    CPU.Cycles += TWO_CYCLES;#endif    PullW (Registers.A.W);    SetZN16 (Registers.A.W);}//PLBstatic void OpABE1 (void){#ifndef SA1_OPCODES    CPU.Cycles += TWO_CYCLES;#endif    PullBE (Registers.DB);    SetZN8 (Registers.DB);    ICPU.ShiftedDB = Registers.DB << 16;}static void OpAB (void){#ifndef SA1_OPCODES    CPU.Cycles += TWO_CYCLES;#endif    PullB (Registers.DB);    SetZN8 (Registers.DB);    ICPU.ShiftedDB = Registers.DB << 16;}/* PHP *///PLD NLstatic void Op2BE1 (void){#ifndef SA1_OPCODES    CPU.Cycles += TWO_CYCLES;#endif    PullWENew (Registers.D.W);    SetZN16 (Registers.D.W);}static void Op2B (void){#ifndef SA1_OPCODES    CPU.Cycles += TWO_CYCLES;#endif    PullW (Registers.D.W);    SetZN16 (Registers.D.W);}/* PLP */static void Op28E1 (void){#ifndef SA1_OPCODES    CPU.Cycles += TWO_CYCLES;#endif    PullBE (Registers.PL);    S9xUnpackStatus ();    if (CheckIndex ())    {	Registers.XH = 0;	Registers.YH = 0;    }    S9xFixCycles();/*     CHECK_FOR_IRQ();*/}static void Op28 (void){#ifndef SA1_OPCODES    CPU.Cycles += TWO_CYCLES;#endif    PullB (Registers.PL);    S9xUnpackStatus ();    if (CheckIndex ())    {	Registers.XH = 0;	Registers.YH = 0;    }    S9xFixCycles();/*     CHECK_FOR_IRQ();*/}//PLXstatic void OpFAE1 (void){#ifndef SA1_OPCODES    CPU.Cycles += TWO_CYCLES;#endif    PullBE (Registers.XL);    SetZN8 (Registers.XL);}static void OpFAX1 (void){#ifndef SA1_OPCODES    CPU.Cycles += TWO_CYCLES;#endif    PullB (Registers.XL);    SetZN8 (Registers.XL);}static void OpFAX0 (void){#ifndef SA1_OPCODES    CPU.Cycles += TWO_CYCLES;#endif    PullW (Registers.X.W);    SetZN16 (Registers.X.W);}//PLYstatic void Op7AE1 (void){#ifndef SA1_OPCODES    CPU.Cycles += TWO_CYCLES;#endif    PullBE (Registers.YL);    SetZN8 (Registers.YL);}static void Op7AX1 (void){#ifndef SA1_OPCODES    CPU.Cycles += TWO_CYCLES;#endif    PullB (Registers.YL);    SetZN8 (Registers.YL);}static void Op7AX0 (void){#ifndef SA1_OPCODES    CPU.Cycles += TWO_CYCLES;#endif    PullW (Registers.Y.W);    SetZN16 (Registers.Y.W);}/**********************************************************************************************//* SetFlag Instructions ********************************************************************** *//* SEC */static void Op38 (void){    SetCarry ();#ifndef SA1_OPCODES    CPU.Cycles += ONE_CYCLE;#endif}/* SED */static void OpF8 (void){    SetDecimal ();#ifndef SA1_OPCODES    CPU.Cycles += ONE_CYCLE;#endif    missing.decimal_mode = 1;}/* SEI */static void Op78 (void){    SetIRQ ();#ifndef SA1_OPCODES    CPU.Cycles += ONE_CYCLE;#endif}/**********************************************************************************************//* Transfer Instructions ********************************************************************* *//* TAX8 */static void OpAAX1 (void){#ifndef SA1_OPCODES    CPU.Cycles += ONE_CYCLE;#endif    Registers.XL = Registers.AL;    SetZN8 (Registers.XL);}/* TAX16 */static void OpAAX0 (void){#ifndef SA1_OPCODES    CPU.Cycles += ONE_CYCLE;#endif    Registers.X.W = Registers.A.W;    SetZN16 (Registers.X.W);}/* TAY8 */static void OpA8X1 (void){#ifndef SA1_OPCODES    CPU.Cycles += ONE_CYCLE;#endif    Registers.YL = Registers.AL;    SetZN8 (Registers.YL);}/* TAY16 */static void OpA8X0 (void){#ifndef SA1_OPCODES    CPU.Cycles += ONE_CYCLE;#endif    Registers.Y.W = Registers.A.W;    SetZN16 (Registers.Y.W);}static void Op5B (void){#ifndef SA1_OPCODES    CPU.Cycles += ONE_CYCLE;#endif    Registers.D.W = Registers.A.W;    SetZN16 (Registers.D.W);}static void Op1B (void){#ifndef SA1_OPCODES    CPU.Cycles += ONE_CYCLE;#endif    Registers.S.W = Registers.A.W;    if (CheckEmulation())	Registers.SH = 1;}static void Op7B (void){#ifndef SA1_OPCODES    CPU.Cycles += ONE_CYCLE;#endif    Registers.A.W = Registers.D.W;    SetZN16 (Registers.A.W);}static void Op3B (void){#ifndef SA1_OPCODES    CPU.Cycles += ONE_CYCLE;#endif    Registers.A.W = Registers.S.W;    SetZN16 (Registers.A.W);}static void OpBAX1 (void){#ifndef SA1_OPCODES    CPU.Cycles += ONE_CYCLE;#endif    Registers.XL = Registers.SL;    SetZN8 (Registers.XL);}static void OpBAX0 (void){#ifndef SA1_OPCODES    CPU.Cycles += ONE_CYCLE;#endif    Registers.X.W = Registers.S.W;    SetZN16 (Registers.X.W);}static void Op8AM1 (void){#ifndef SA1_OPCODES    CPU.Cycles += ONE_CYCLE;#endif    Registers.AL = Registers.XL;    SetZN8 (Registers.AL);}static void Op8AM0 (void){#ifndef SA1_OPCODES    CPU.Cycles += ONE_CYCLE;#endif    Registers.A.W = Registers.X.W;    SetZN16 (Registers.A.W);}static void Op9A (void){#ifndef SA1_OPCODES    CPU.Cycles += ONE_CYCLE;#endif    Registers.S.W = Registers.X.W;    if (CheckEmulation())	Registers.SH = 1;}static void Op9BX1 (void){#ifndef SA1_OPCODES    CPU.Cycles += ONE_CYCLE;#endif    Registers.YL = Registers.XL;    SetZN8 (Registers.YL);}static void Op9BX0 (void){#ifndef SA1_OPCODES    CPU.Cycles += ONE_CYCLE;#endif    Registers.Y.W = Registers.X.W;    SetZN16 (Registers.Y.W);}static void Op98M1 (void){#ifndef SA1_OPCODES    CPU.Cycles += ONE_CYCLE;#endif    Registers.AL = Registers.YL;    SetZN8 (Registers.AL);}static void Op98M0 (void){#ifndef SA1_OPCODES    CPU.Cycles += ONE_CYCLE;#endif    Registers.A.W = Registers.Y.W;    SetZN16 (Registers.A.W);}static void OpBBX1 (void){#ifndef SA1_OPCODES    CPU.Cycles += ONE_CYCLE;#endif    Registers.XL = Registers.YL;    SetZN8 (Registers.XL);}static void OpBBX0 (void){#ifndef SA1_OPCODES    CPU.Cycles += ONE_CYCLE;#endif    Registers.X.W = Registers.Y.W;    SetZN16 (Registers.X.W);}/**********************************************************************************************//* XCE *************************************************************************************** */static void OpFB (void){#ifndef SA1_OPCODES    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);	OpenBus = Registers.PL;	ClearDecimal ();	SetIRQ ();	Registers.PB = 0;	ICPU.ShiftedPB = 0;	S9xSetPCBase (S9xGetWord (0xFFE6));#ifndef SA1_OPCODES        CPU.Cycles += TWO_CYCLES;#endif    }    else    {	PushW (CPU.PC - CPU.PCBase);	S9xPackStatus ();	PushB (Registers.PL);	OpenBus = Registers.PL;	ClearDecimal ();	SetIRQ ();	Registers.PB = 0;	ICPU.ShiftedPB = 0;	S9xSetPCBase (S9xGetWord (0xFFFE));#ifndef SA1_OPCODES	CPU.Cycles += ONE_CYCLE;#endif    }}/**********************************************************************************************//* BRL ************************************************************************************** */static void Op82 (void){    RelativeLong (JUMP);    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);	OpenBus = 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#ifndef SA1_OPCODES        CPU.Cycles += TWO_CYCLES;#endif    }    else    {	PushW (CPU.PC - CPU.PCBase);	S9xPackStatus ();	PushB (Registers.PL);	OpenBus = 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#ifndef SA1_OPCODES	CPU.Cycles += ONE_CYCLE;#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);	OpenBus = 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#ifndef SA1_OPCODES	CPU.Cycles += TWO_CYCLES;#endif    }    else    {	PushW (CPU.PC - CPU.PCBase);	S9xPackStatus ();	PushB (Registers.PL);	OpenBus = 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#ifndef SA1_OPCODES	CPU.Cycles += ONE_CYCLE;#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);	OpenBus = Registers.PL;	ClearDecimal ();	SetIRQ ();	Registers.PB = 0;	ICPU.ShiftedPB = 0;	S9xSetPCBase (S9xGetWord (0xFFE4));#ifndef SA1_OPCODES        CPU.Cycles += TWO_CYCLES;#endif    }    else    {	PushW (CPU.PC - CPU.PCBase);	S9xPackStatus ();	PushB (Registers.PL);	OpenBus = Registers.PL;	ClearDecimal ();	SetIRQ ();	Registers.PB = 0;	ICPU.ShiftedPB = 0;	S9xSetPCBase (S9xGetWord (0xFFF4));#ifndef SA1_OPCODES	CPU.Cycles += ONE_CYCLE;#endif    }}/**********************************************************************************************//* JML *************************************************************************************** */static void OpDC (void){    AbsoluteIndirectLong (JUMP);    Registers.PB = (uint8) (OpAddress >> 16);    ICPU.ShiftedPB = OpAddress & 0xff0000;    S9xSetPCBase (OpAddress);#ifndef SA1_OPCODES    CPU.Cycles += TWO_CYCLES;#endif}static void Op5C (void){    AbsoluteLong (JUMP);    Registers.PB = (uint8) (OpAddress >> 16);    ICPU.ShiftedPB = OpAddress & 0xff0000;    S9xSetPCBase (OpAddress);}/**********************************************************************************************//* JMP *************************************************************************************** */static void Op4C (void){    Absolute (JUMP);    S9xSetPCBase (ICPU.ShiftedPB + (OpAddress & 0xffff));#if defined(CPU_SHUTDOWN) && defined(SA1_OPCODES)    CPUShutdown ();#endif}static void Op6C (void){    AbsoluteIndirect (JUMP);    S9xSetPCBase (ICPU.ShiftedPB + (OpAddress & 0xffff));}static void Op7C (void){    AbsoluteIndexedIndirect (JUMP);    S9xSetPCBase (ICPU.ShiftedPB + OpAddress);#ifndef SA1_OPCODES    CPU.Cycles += ONE_CYCLE;#endif}/**********************************************************************************************//* JSL/RTL *********************************************************************************** */static void Op22E1 (void){    AbsoluteLong (JUMP);    PushB (Registers.PB);    PushWENew (CPU.PC - CPU.PCBase - 1);    Registers.PB = (uint8) (OpAddress >> 16);    ICPU.ShiftedPB = OpAddress & 0xff0000;    S9xSetPCBase (OpAddress);}static void Op22 (void){    AbsoluteLong (JUMP);    PushB (Registers.PB);    PushW (CPU.PC - CPU.PCBase - 1);    Registers.PB = (uint8) (OpAddress >> 16);    ICPU.ShiftedPB = OpAddress & 0xff0000;    S9xSetPCBase (OpAddress);}static void Op6BE1 (void){    PullWENew (Registers.PC);    PullB (Registers.PB);    ICPU.ShiftedPB = Registers.PB << 16;    S9xSetPCBase (ICPU.ShiftedPB + ((Registers.PC + 1) & 0xffff));#ifndef SA1_OPCODES    CPU.Cycles += TWO_CYCLES;#endif}static void Op6B (void){    PullW (Registers.PC);    PullB (Registers.PB);    ICPU.ShiftedPB = Registers.PB << 16;    S9xSetPCBase (ICPU.ShiftedPB + ((Registers.PC + 1) & 0xffff));#ifndef SA1_OPCODES    CPU.Cycles += TWO_CYCLES;#endif}/**********************************************************************************************//* JSR/RTS *********************************************************************************** */static void Op20 (void){    Absolute (JUMP);    PushW (CPU.PC - CPU.PCBase - 1);    S9xSetPCBase (ICPU.ShiftedPB + (OpAddress & 0xffff));#ifndef SA1_OPCODES    CPU.Cycles += ONE_CYCLE;#endif}//JSR a,xstatic void OpFCE1 (void){    AbsoluteIndexedIndirect (JUMP);    PushWENew (CPU.PC - CPU.PCBase - 1);    S9xSetPCBase (ICPU.ShiftedPB + OpAddress);#ifndef SA1_OPCODES    CPU.Cycles += ONE_CYCLE;#endif}static void OpFC (void){    AbsoluteIndexedIndirect (JUMP);    PushW (CPU.PC - CPU.PCBase - 1);    S9xSetPCBase (ICPU.ShiftedPB + OpAddress);#ifndef SA1_OPCODES    CPU.Cycles += ONE_CYCLE;#endif}static void Op60 (void){    PullW (Registers.PC);    S9xSetPCBase (ICPU.ShiftedPB + ((Registers.PC + 1) & 0xffff));#ifndef SA1_OPCODES    CPU.Cycles += ONE_CYCLE * 3;#endif}/**********************************

⌨️ 快捷键说明

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