📄 cpuops.cpp
字号:
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 + -