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