using System; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.IO; namespace Jellyfish.Virtu { public sealed partial class Cpu : MachineComponent { public Cpu(Machine machine) : base(machine) { ExecuteOpCode65N02 = new Action[OpCodeCount] { Execute65X02Brk00, Execute65X02Ora01, Execute65N02Nop02, Execute65N02Nop03, Execute65N02Nop04, Execute65X02Ora05, Execute65X02Asl06, Execute65N02Nop07, Execute65X02Php08, Execute65X02Ora09, Execute65X02Asl0A, Execute65N02Nop0B, Execute65N02Nop0C, Execute65X02Ora0D, Execute65X02Asl0E, Execute65N02Nop0F, Execute65X02Bpl10, Execute65X02Ora11, Execute65N02Nop12, Execute65N02Nop13, Execute65N02Nop14, Execute65X02Ora15, Execute65X02Asl16, Execute65N02Nop17, Execute65X02Clc18, Execute65X02Ora19, Execute65N02Nop1A, Execute65N02Nop1B, Execute65N02Nop1C, Execute65X02Ora1D, Execute65N02Asl1E, Execute65N02Nop1F, Execute65X02Jsr20, Execute65X02And21, Execute65N02Nop22, Execute65N02Nop23, Execute65X02Bit24, Execute65X02And25, Execute65X02Rol26, Execute65N02Nop27, Execute65X02Plp28, Execute65X02And29, Execute65X02Rol2A, Execute65N02Nop2B, Execute65X02Bit2C, Execute65X02And2D, Execute65X02Rol2E, Execute65N02Nop2F, Execute65X02Bmi30, Execute65X02And31, Execute65N02Nop32, Execute65N02Nop33, Execute65N02Nop34, Execute65X02And35, Execute65X02Rol36, Execute65N02Nop37, Execute65X02Sec38, Execute65X02And39, Execute65N02Nop3A, Execute65N02Nop3B, Execute65N02Nop3C, Execute65X02And3D, Execute65N02Rol3E, Execute65N02Nop3F, Execute65X02Rti40, Execute65X02Eor41, Execute65N02Nop42, Execute65N02Nop43, Execute65N02Nop44, Execute65X02Eor45, Execute65X02Lsr46, Execute65N02Nop47, Execute65X02Pha48, Execute65X02Eor49, Execute65X02Lsr4A, Execute65N02Nop4B, Execute65X02Jmp4C, Execute65X02Eor4D, Execute65X02Lsr4E, Execute65N02Nop4F, Execute65X02Bvc50, Execute65X02Eor51, Execute65N02Nop52, Execute65N02Nop53, Execute65N02Nop54, Execute65X02Eor55, Execute65X02Lsr56, Execute65N02Nop57, Execute65X02Cli58, Execute65X02Eor59, Execute65N02Nop5A, Execute65N02Nop5B, Execute65N02Nop5C, Execute65X02Eor5D, Execute65N02Lsr5E, Execute65N02Nop5F, Execute65X02Rts60, Execute65N02Adc61, Execute65N02Nop62, Execute65N02Nop63, Execute65N02Nop64, Execute65N02Adc65, Execute65X02Ror66, Execute65N02Nop67, Execute65X02Pla68, Execute65N02Adc69, Execute65X02Ror6A, Execute65N02Nop6B, Execute65N02Jmp6C, Execute65N02Adc6D, Execute65X02Ror6E, Execute65N02Nop6F, Execute65X02Bvs70, Execute65N02Adc71, Execute65N02Nop72, Execute65N02Nop73, Execute65N02Nop74, Execute65N02Adc75, Execute65X02Ror76, Execute65N02Nop77, Execute65X02Sei78, Execute65N02Adc79, Execute65N02Nop7A, Execute65N02Nop7B, Execute65N02Nop7C, Execute65N02Adc7D, Execute65N02Ror7E, Execute65N02Nop7F, Execute65N02Nop80, Execute65X02Sta81, Execute65N02Nop82, Execute65N02Nop83, Execute65X02Sty84, Execute65X02Sta85, Execute65X02Stx86, Execute65N02Nop87, Execute65X02Dey88, Execute65N02Nop89, Execute65X02Txa8A, Execute65N02Nop8B, Execute65X02Sty8C, Execute65X02Sta8D, Execute65X02Stx8E, Execute65N02Nop8F, Execute65X02Bcc90, Execute65X02Sta91, Execute65N02Nop92, Execute65N02Nop93, Execute65X02Sty94, Execute65X02Sta95, Execute65X02Stx96, Execute65N02Nop97, Execute65X02Tya98, Execute65X02Sta99, Execute65X02Txs9A, Execute65N02Nop9B, Execute65N02Nop9C, Execute65X02Sta9D, Execute65N02Nop9E, Execute65N02Nop9F, Execute65X02LdyA0, Execute65X02LdaA1, Execute65X02LdxA2, Execute65N02NopA3, Execute65X02LdyA4, Execute65X02LdaA5, Execute65X02LdxA6, Execute65N02NopA7, Execute65X02TayA8, Execute65X02LdaA9, Execute65X02TaxAA, Execute65N02NopAB, Execute65X02LdyAC, Execute65X02LdaAD, Execute65X02LdxAE, Execute65N02NopAF, Execute65X02BcsB0, Execute65X02LdaB1, Execute65N02NopB2, Execute65N02NopB3, Execute65X02LdyB4, Execute65X02LdaB5, Execute65X02LdxB6, Execute65N02NopB7, Execute65X02ClvB8, Execute65X02LdaB9, Execute65X02TsxBA, Execute65N02NopBB, Execute65X02LdyBC, Execute65X02LdaBD, Execute65X02LdxBE, Execute65N02NopBF, Execute65X02CpyC0, Execute65X02CmpC1, Execute65N02NopC2, Execute65N02NopC3, Execute65X02CpyC4, Execute65X02CmpC5, Execute65X02DecC6, Execute65N02NopC7, Execute65X02InyC8, Execute65X02CmpC9, Execute65X02DexCA, Execute65N02NopCB, Execute65X02CpyCC, Execute65X02CmpCD, Execute65X02DecCE, Execute65N02NopCF, Execute65X02BneD0, Execute65X02CmpD1, Execute65N02NopD2, Execute65N02NopD3, Execute65N02NopD4, Execute65X02CmpD5, Execute65X02DecD6, Execute65N02NopD7, Execute65X02CldD8, Execute65X02CmpD9, Execute65N02NopDA, Execute65N02NopDB, Execute65N02NopDC, Execute65X02CmpDD, Execute65N02DecDE, Execute65N02NopDF, Execute65X02CpxE0, Execute65N02SbcE1, Execute65N02NopE2, Execute65N02NopE3, Execute65X02CpxE4, Execute65N02SbcE5, Execute65X02IncE6, Execute65N02NopE7, Execute65X02InxE8, Execute65N02SbcE9, Execute65X02NopEA, Execute65N02NopEB, Execute65X02CpxEC, Execute65N02SbcED, Execute65X02IncEE, Execute65N02NopEF, Execute65X02BeqF0, Execute65N02SbcF1, Execute65N02NopF2, Execute65N02NopF3, Execute65N02NopF4, Execute65N02SbcF5, Execute65X02IncF6, Execute65N02NopF7, Execute65X02SedF8, Execute65N02SbcF9, Execute65N02NopFA, Execute65N02NopFB, Execute65N02NopFC, Execute65N02SbcFD, Execute65N02IncFE, Execute65N02NopFF }; ExecuteOpCode65C02 = new Action[OpCodeCount] { Execute65X02Brk00, Execute65X02Ora01, Execute65C02Nop02, Execute65C02Nop03, Execute65C02Tsb04, Execute65X02Ora05, Execute65X02Asl06, Execute65C02Nop07, Execute65X02Php08, Execute65X02Ora09, Execute65X02Asl0A, Execute65C02Nop0B, Execute65C02Tsb0C, Execute65X02Ora0D, Execute65X02Asl0E, Execute65C02Nop0F, Execute65X02Bpl10, Execute65X02Ora11, Execute65C02Ora12, Execute65C02Nop13, Execute65C02Trb14, Execute65X02Ora15, Execute65X02Asl16, Execute65C02Nop17, Execute65X02Clc18, Execute65X02Ora19, Execute65C02Ina1A, Execute65C02Nop1B, Execute65C02Trb1C, Execute65X02Ora1D, Execute65C02Asl1E, Execute65C02Nop1F, Execute65X02Jsr20, Execute65X02And21, Execute65C02Nop22, Execute65C02Nop23, Execute65X02Bit24, Execute65X02And25, Execute65X02Rol26, Execute65C02Nop27, Execute65X02Plp28, Execute65X02And29, Execute65X02Rol2A, Execute65C02Nop2B, Execute65X02Bit2C, Execute65X02And2D, Execute65X02Rol2E, Execute65C02Nop2F, Execute65X02Bmi30, Execute65X02And31, Execute65C02And32, Execute65C02Nop33, Execute65C02Bit34, Execute65X02And35, Execute65X02Rol36, Execute65C02Nop37, Execute65X02Sec38, Execute65X02And39, Execute65C02Dea3A, Execute65C02Nop3B, Execute65C02Bit3C, Execute65X02And3D, Execute65C02Rol3E, Execute65C02Nop3F, Execute65X02Rti40, Execute65X02Eor41, Execute65C02Nop42, Execute65C02Nop43, Execute65C02Nop44, Execute65X02Eor45, Execute65X02Lsr46, Execute65C02Nop47, Execute65X02Pha48, Execute65X02Eor49, Execute65X02Lsr4A, Execute65C02Nop4B, Execute65X02Jmp4C, Execute65X02Eor4D, Execute65X02Lsr4E, Execute65C02Nop4F, Execute65X02Bvc50, Execute65X02Eor51, Execute65C02Eor52, Execute65C02Nop53, Execute65C02Nop54, Execute65X02Eor55, Execute65X02Lsr56, Execute65C02Nop57, Execute65X02Cli58, Execute65X02Eor59, Execute65C02Phy5A, Execute65C02Nop5B, Execute65C02Nop5C, Execute65X02Eor5D, Execute65C02Lsr5E, Execute65C02Nop5F, Execute65X02Rts60, Execute65C02Adc61, Execute65C02Nop62, Execute65C02Nop63, Execute65C02Stz64, Execute65C02Adc65, Execute65X02Ror66, Execute65C02Nop67, Execute65X02Pla68, Execute65C02Adc69, Execute65X02Ror6A, Execute65C02Nop6B, Execute65C02Jmp6C, Execute65C02Adc6D, Execute65X02Ror6E, Execute65C02Nop6F, Execute65X02Bvs70, Execute65C02Adc71, Execute65C02Adc72, Execute65C02Nop73, Execute65C02Stz74, Execute65C02Adc75, Execute65X02Ror76, Execute65C02Nop77, Execute65X02Sei78, Execute65C02Adc79, Execute65C02Ply7A, Execute65C02Nop7B, Execute65C02Jmp7C, Execute65C02Adc7D, Execute65C02Ror7E, Execute65C02Nop7F, Execute65C02Bra80, Execute65X02Sta81, Execute65C02Nop82, Execute65C02Nop83, Execute65X02Sty84, Execute65X02Sta85, Execute65X02Stx86, Execute65C02Nop87, Execute65X02Dey88, Execute65C02Bit89, Execute65X02Txa8A, Execute65C02Nop8B, Execute65X02Sty8C, Execute65X02Sta8D, Execute65X02Stx8E, Execute65C02Nop8F, Execute65X02Bcc90, Execute65X02Sta91, Execute65C02Sta92, Execute65C02Nop93, Execute65X02Sty94, Execute65X02Sta95, Execute65X02Stx96, Execute65C02Nop97, Execute65X02Tya98, Execute65X02Sta99, Execute65X02Txs9A, Execute65C02Nop9B, Execute65C02Stz9C, Execute65X02Sta9D, Execute65C02Stz9E, Execute65C02Nop9F, Execute65X02LdyA0, Execute65X02LdaA1, Execute65X02LdxA2, Execute65C02NopA3, Execute65X02LdyA4, Execute65X02LdaA5, Execute65X02LdxA6, Execute65C02NopA7, Execute65X02TayA8, Execute65X02LdaA9, Execute65X02TaxAA, Execute65C02NopAB, Execute65X02LdyAC, Execute65X02LdaAD, Execute65X02LdxAE, Execute65C02NopAF, Execute65X02BcsB0, Execute65X02LdaB1, Execute65C02LdaB2, Execute65C02NopB3, Execute65X02LdyB4, Execute65X02LdaB5, Execute65X02LdxB6, Execute65C02NopB7, Execute65X02ClvB8, Execute65X02LdaB9, Execute65X02TsxBA, Execute65C02NopBB, Execute65X02LdyBC, Execute65X02LdaBD, Execute65X02LdxBE, Execute65C02NopBF, Execute65X02CpyC0, Execute65X02CmpC1, Execute65C02NopC2, Execute65C02NopC3, Execute65X02CpyC4, Execute65X02CmpC5, Execute65X02DecC6, Execute65C02NopC7, Execute65X02InyC8, Execute65X02CmpC9, Execute65X02DexCA, Execute65C02NopCB, Execute65X02CpyCC, Execute65X02CmpCD, Execute65X02DecCE, Execute65C02NopCF, Execute65X02BneD0, Execute65X02CmpD1, Execute65C02CmpD2, Execute65C02NopD3, Execute65C02NopD4, Execute65X02CmpD5, Execute65X02DecD6, Execute65C02NopD7, Execute65X02CldD8, Execute65X02CmpD9, Execute65C02PhxDA, Execute65C02NopDB, Execute65C02NopDC, Execute65X02CmpDD, Execute65C02DecDE, Execute65C02NopDF, Execute65X02CpxE0, Execute65C02SbcE1, Execute65C02NopE2, Execute65C02NopE3, Execute65X02CpxE4, Execute65C02SbcE5, Execute65X02IncE6, Execute65C02NopE7, Execute65X02InxE8, Execute65C02SbcE9, Execute65X02NopEA, Execute65C02NopEB, Execute65X02CpxEC, Execute65C02SbcED, Execute65X02IncEE, Execute65C02NopEF, Execute65X02BeqF0, Execute65C02SbcF1, Execute65C02SbcF2, Execute65C02NopF3, Execute65C02NopF4, Execute65C02SbcF5, Execute65X02IncF6, Execute65C02NopF7, Execute65X02SedF8, Execute65C02SbcF9, Execute65C02PlxFA, Execute65C02NopFB, Execute65C02NopFC, Execute65C02SbcFD, Execute65C02IncFE, Execute65C02NopFF }; } public override void Initialize() { _memory = Machine.Memory; Is65C02 = true; IsThrottled = true; Multiplier = 1; RS = 0xFF; } public override void Reset() { RS = (RS - 3) & 0xFF; // [4-14] RPC = _memory.ReadRomRegionE0FF(0xFFFC) | (_memory.ReadRomRegionE0FF(0xFFFD) << 8); RP |= (PB | PI); if (Is65C02) // [C-10] { RP &= ~PD; } } public override void LoadState(BinaryReader reader, Version version) { if (reader == null) { throw new ArgumentNullException("reader"); } Is65C02 = reader.ReadBoolean(); IsThrottled = reader.ReadBoolean(); Multiplier = reader.ReadInt32(); RA = reader.ReadInt32(); RX = reader.ReadInt32(); RY = reader.ReadInt32(); RS = reader.ReadInt32(); RP = reader.ReadInt32(); RPC = reader.ReadInt32(); } public override void SaveState(BinaryWriter writer) { if (writer == null) { throw new ArgumentNullException("writer"); } writer.Write(Is65C02); writer.Write(IsThrottled); writer.Write(Multiplier); writer.Write(RA); writer.Write(RX); writer.Write(RY); writer.Write(RS); writer.Write(RP); writer.Write(RPC); } public override string ToString() { return string.Format(CultureInfo.InvariantCulture, "A = 0x{0:X2} X = 0x{1:X2} Y = 0x{2:X2} P = 0x{3:X2} S = 0x01{4:X2} PC = 0x{5:X4} EA = 0x{6:X4} CC = {7}", RA, RX, RY, RP, RS, RPC, EA, CC); } public int Execute() { CC = 0; OpCode = _memory.Read(RPC); RPC = (RPC + 1) & 0xFFFF; _executeOpCode[OpCode](); Cycles += CC; return CC; } #region Core Operand Actions private void GetAddressAbs() // abs { EA = _memory.Read(RPC) | (_memory.Read(RPC + 1) << 8); RPC = (RPC + 2) & 0xFFFF; } private void GetAddressAbsX() // abs, x { EA = (_memory.Read(RPC) + RX + (_memory.Read(RPC + 1) << 8)) & 0xFFFF; RPC = (RPC + 2) & 0xFFFF; } private void GetAddressAbsXCC() // abs, x { int ea = _memory.Read(RPC) + RX; EA = (ea + (_memory.Read(RPC + 1) << 8)) & 0xFFFF; RPC = (RPC + 2) & 0xFFFF; CC += (ea >> 8); } private void GetAddressAbsY() // abs, y { EA = (_memory.Read(RPC) + RY + (_memory.Read(RPC + 1) << 8)) & 0xFFFF; RPC = (RPC + 2) & 0xFFFF; } private void GetAddressAbsYCC() // abs, y { int ea = _memory.Read(RPC) + RY; EA = (ea + (_memory.Read(RPC + 1) << 8)) & 0xFFFF; RPC = (RPC + 2) & 0xFFFF; CC += (ea >> 8); } private void GetAddressZpg() // zpg { EA = _memory.Read(RPC); RPC = (RPC + 1) & 0xFFFF; } private void GetAddressZpgInd() // (zpg) { int zp = _memory.Read(RPC); EA = _memory.ReadZeroPage(zp) | (_memory.ReadZeroPage((zp + 1) & 0xFF) << 8); RPC = (RPC + 1) & 0xFFFF; } private void GetAddressZpgIndX() // (zpg, x) { int zp = (_memory.Read(RPC) + RX) & 0xFF; EA = _memory.ReadZeroPage(zp) | (_memory.ReadZeroPage((zp + 1) & 0xFF) << 8); RPC = (RPC + 1) & 0xFFFF; } private void GetAddressZpgIndY() // (zpg), y { int zp = _memory.Read(RPC); EA = (_memory.ReadZeroPage(zp) + RY + (_memory.ReadZeroPage((zp + 1) & 0xFF) << 8)) & 0xFFFF; RPC = (RPC + 1) & 0xFFFF; } private void GetAddressZpgIndYCC() // (zpg), y { int zp = _memory.Read(RPC); int ea = _memory.ReadZeroPage(zp) + RY; EA = (ea + (_memory.ReadZeroPage((zp + 1) & 0xFF) << 8)) & 0xFFFF; RPC = (RPC + 1) & 0xFFFF; CC += (ea >> 8); } private void GetAddressZpgX() // zpg, x { EA = (_memory.Read(RPC) + RX) & 0xFF; RPC = (RPC + 1) & 0xFFFF; } private void GetAddressZpgY() // zpg, y { EA = (_memory.Read(RPC) + RY) & 0xFF; RPC = (RPC + 1) & 0xFFFF; } private int Pull() { RS = (RS + 1) & 0xFF; return _memory.ReadZeroPage(0x0100 + RS); } private void Push(int data) { _memory.WriteZeroPage(0x0100 + RS, data); RS = (RS - 1) & 0xFF; } private int ReadAbs() // abs { return _memory.Read(EA); } private int ReadAbsX() // abs, x { return _memory.Read(EA); } private int ReadAbsY() // abs, y { return _memory.Read(EA); } private int ReadImm() // imm { int data = _memory.Read(RPC); RPC = (RPC + 1) & 0xFFFF; return data; } private int ReadZpg() // zpg { return _memory.ReadZeroPage(EA); } private int ReadZpgInd() // (zpg) { return _memory.Read(EA); } private int ReadZpgIndX() // (zpg, x) { return _memory.Read(EA); } private int ReadZpgIndY() // (zpg), y { return _memory.Read(EA); } private int ReadZpgX() // zpg, x { return _memory.ReadZeroPage(EA); } private int ReadZpgY() // zpg, y { return _memory.ReadZeroPage(EA); } private void WriteAbs(int data) // abs { _memory.Write(EA, data); } private void WriteAbsX(int data) // abs, x { _memory.Write(EA, data); } private void WriteAbsY(int data) // abs, y { _memory.Write(EA, data); } private void WriteZpg(int data) // zpg { _memory.WriteZeroPage(EA, data); } private void WriteZpgInd(int data) // (zpg) { _memory.Write(EA, data); } private void WriteZpgIndX(int data) // (zpg, x) { _memory.Write(EA, data); } private void WriteZpgIndY(int data) // (zpg), y { _memory.Write(EA, data); } private void WriteZpgX(int data) // zpg, x { _memory.WriteZeroPage(EA, data); } private void WriteZpgY(int data) // zpg, y { _memory.WriteZeroPage(EA, data); } #endregion #region Core OpCode Actions private void ExecuteAdc65N02(int data, int cc) { if ((RP & PD) == 0x0) { int ra = RA + data + (RP & PC); RP = RP & ~(PC | PN | PV | PZ) | ((ra >> 8) & PC) | DataPNZ[ra & 0xFF] | (((~(RA ^ data) & (RA ^ (ra & 0xFF))) >> 1) & PV); RA = ra & 0xFF; CC += cc; } else // decimal { int ral = (RA & 0x0F) + (data & 0x0F) + (RP & PC); int rah = (RA >> 4) + (data >> 4); if (ral >= 10) { ral -= 10; rah++; } int ra = (ral | (rah << 4)) & 0xFF; RP = RP & ~(PC | PN | PV | PZ) | DataPN[ra] | (((~(RA ^ data) & (RA ^ ra)) >> 1) & PV) | DataPZ[(RA + data + (RP & PC)) & 0xFF]; if (rah >= 10) { rah -= 10; RP |= PC; } RA = (ral | (rah << 4)) & 0xFF; CC += cc; } } private void ExecuteAdc65C02(int data, int cc) { if ((RP & PD) == 0x0) { int ra = RA + data + (RP & PC); RP = RP & ~(PC | PN | PV | PZ) | ((ra >> 8) & PC) | DataPNZ[ra & 0xFF] | (((~(RA ^ data) & (RA ^ (ra & 0xFF))) >> 1) & PV); RA = ra & 0xFF; CC += cc; } else // decimal { int ral = (RA & 0x0F) + (data & 0x0F) + (RP & PC); int rah = (RA >> 4) + (data >> 4); if (ral >= 10) { ral -= 10; rah++; } RP &= ~PC; if (rah >= 10) { rah -= 10; RP |= PC; } int ra = (ral | (rah << 4)) & 0xFF; RP = RP & ~(PN | PV | PZ) | DataPNZ[ra] | (((~(RA ^ data) & (RA ^ ra)) >> 1) & PV); RA = ra; CC += cc + 1; } } private void ExecuteAnd(int data, int cc) { RA &= data; RP = RP & ~(PN | PZ) | DataPNZ[RA]; CC += cc; } private int ExecuteAsl(int data, int cc) { RP = RP & ~PC | ((data >> 7) & PC); data = (data << 1) & 0xFF; RP = RP & ~(PN | PZ) | DataPNZ[data]; CC += cc; return data; } private void ExecuteAslImp(int cc) { RP = RP & ~PC | ((RA >> 7) & PC); RA = (RA << 1) & 0xFF; RP = RP & ~(PN | PZ) | DataPNZ[RA]; CC += cc; } private void ExecuteBcc(int cc) { if ((RP & PC) == 0x0) { int rpc = (RPC + 1) & 0xFFFF; RPC = (RPC + 1 + (sbyte)_memory.Read(RPC)) & 0xFFFF; CC += cc + 1 + (((RPC ^ rpc) >> 8) & 0x01); } else { RPC = (RPC + 1) & 0xFFFF; CC += cc; } } private void ExecuteBcs(int cc) { if ((RP & PC) != 0x0) { int rpc = (RPC + 1) & 0xFFFF; RPC = (RPC + 1 + (sbyte)_memory.Read(RPC)) & 0xFFFF; CC += cc + 1 + (((RPC ^ rpc) >> 8) & 0x01); } else { RPC = (RPC + 1) & 0xFFFF; CC += cc; } } private void ExecuteBeq(int cc) { if ((RP & PZ) != 0x0) { int rpc = (RPC + 1) & 0xFFFF; RPC = (RPC + 1 + (sbyte)_memory.Read(RPC)) & 0xFFFF; CC += cc + 1 + (((RPC ^ rpc) >> 8) & 0x01); } else { RPC = (RPC + 1) & 0xFFFF; CC += cc; } } private void ExecuteBit(int data, int cc) { RP = RP & ~(PN | PV | PZ) | (data & (PN | PV)) | DataPZ[RA & data]; CC += cc; } private void ExecuteBitImm(int data, int cc) { RP = RP & ~PZ | DataPZ[RA & data]; CC += cc; } private void ExecuteBmi(int cc) { if ((RP & PN) != 0x0) { int rpc = (RPC + 1) & 0xFFFF; RPC = (RPC + 1 + (sbyte)_memory.Read(RPC)) & 0xFFFF; CC += cc + 1 + (((RPC ^ rpc) >> 8) & 0x01); } else { RPC = (RPC + 1) & 0xFFFF; CC += cc; } } private void ExecuteBne(int cc) { if ((RP & PZ) == 0x0) { int rpc = (RPC + 1) & 0xFFFF; RPC = (RPC + 1 + (sbyte)_memory.Read(RPC)) & 0xFFFF; CC += cc + 1 + (((RPC ^ rpc) >> 8) & 0x01); } else { RPC = (RPC + 1) & 0xFFFF; CC += cc; } } private void ExecuteBpl(int cc) { if ((RP & PN) == 0x0) { int rpc = (RPC + 1) & 0xFFFF; RPC = (RPC + 1 + (sbyte)_memory.Read(RPC)) & 0xFFFF; CC += cc + 1 + (((RPC ^ rpc) >> 8) & 0x01); } else { RPC = (RPC + 1) & 0xFFFF; CC += cc; } } private void ExecuteBra(int cc) { int rpc = (RPC + 1) & 0xFFFF; RPC = (RPC + 1 + (sbyte)_memory.Read(RPC)) & 0xFFFF; CC += cc + 1 + (((RPC ^ rpc) >> 8) & 0x01); } private void ExecuteBrk(int cc) { int rpc = (RPC + 1) & 0xFFFF; // [4-18] Push(rpc >> 8); Push(rpc & 0xFF); Push(RP | PB); RP |= PI; RPC = _memory.Read(0xFFFE) | (_memory.Read(0xFFFF) << 8); CC += cc; } private void ExecuteBvc(int cc) { if ((RP & PV) == 0x0) { int rpc = (RPC + 1) & 0xFFFF; RPC = (RPC + 1 + (sbyte)_memory.Read(RPC)) & 0xFFFF; CC += cc + 1 + (((RPC ^ rpc) >> 8) & 0x01); } else { RPC = (RPC + 1) & 0xFFFF; CC += cc; } } private void ExecuteBvs(int cc) { if ((RP & PV) != 0x0) { int rpc = (RPC + 1) & 0xFFFF; RPC = (RPC + 1 + (sbyte)_memory.Read(RPC)) & 0xFFFF; CC += cc + 1 + (((RPC ^ rpc) >> 8) & 0x01); } else { RPC = (RPC + 1) & 0xFFFF; CC += cc; } } private void ExecuteClc(int cc) { RP &= ~PC; CC += cc; } private void ExecuteCld(int cc) { RP &= ~PD; CC += cc; } private void ExecuteCli(int cc) { RP &= ~PI; CC += cc; } private void ExecuteClv(int cc) { RP &= ~PV; CC += cc; } private void ExecuteCmp(int data, int cc) { int diff = RA - data; RP = RP & ~(PC | PN | PZ) | ((~diff >> 8) & PC) | DataPNZ[diff & 0xFF]; CC += cc; } private void ExecuteCpx(int data, int cc) { int diff = RX - data; RP = RP & ~(PC | PN | PZ) | ((~diff >> 8) & PC) | DataPNZ[diff & 0xFF]; CC += cc; } private void ExecuteCpy(int data, int cc) { int diff = RY - data; RP = RP & ~(PC | PN | PZ) | ((~diff >> 8) & PC) | DataPNZ[diff & 0xFF]; CC += cc; } private void ExecuteDea(int cc) { RA = (RA - 1) & 0xFF; RP = RP & ~(PN | PZ) | DataPNZ[RA]; CC += cc; } private int ExecuteDec(int data, int cc) { data = (data - 1) & 0xFF; RP = RP & ~(PN | PZ) | DataPNZ[data]; CC += cc; return data; } private void ExecuteDex(int cc) { RX = (RX - 1) & 0xFF; RP = RP & ~(PN | PZ) | DataPNZ[RX]; CC += cc; } private void ExecuteDey(int cc) { RY = (RY - 1) & 0xFF; RP = RP & ~(PN | PZ) | DataPNZ[RY]; CC += cc; } private void ExecuteEor(int data, int cc) { RA ^= data; RP = RP & ~(PN | PZ) | DataPNZ[RA]; CC += cc; } private void ExecuteIna(int cc) { RA = (RA + 1) & 0xFF; RP = RP & ~(PN | PZ) | DataPNZ[RA]; CC += cc; } private int ExecuteInc(int data, int cc) { data = (data + 1) & 0xFF; RP = RP & ~(PN | PZ) | DataPNZ[data]; CC += cc; return data; } private void ExecuteInx(int cc) { RX = (RX + 1) & 0xFF; RP = RP & ~(PN | PZ) | DataPNZ[RX]; CC += cc; } private void ExecuteIny(int cc) { RY = (RY + 1) & 0xFF; RP = RP & ~(PN | PZ) | DataPNZ[RY]; CC += cc; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] private void ExecuteIrq(int cc) { Push(RPC >> 8); Push(RPC & 0xFF); Push(RP & ~PB); RP |= PI; if (Is65C02) // [C-10] { RP &= ~PD; } RPC = _memory.Read(0xFFFE) | (_memory.Read(0xFFFF) << 8); CC += cc; } private void ExecuteJmpAbs(int cc) // jmp abs { RPC = _memory.Read(RPC) | (_memory.Read(RPC + 1) << 8); CC += cc; } private void ExecuteJmpAbsInd65N02(int cc) // jmp (abs) { int ea = _memory.Read(RPC) | (_memory.Read(RPC + 1) << 8); RPC = _memory.Read(ea) | (_memory.Read((ea & 0xFF00) | ((ea + 1) & 0x00FF)) << 8); CC += cc; } private void ExecuteJmpAbsInd65C02(int cc) // jmp (abs) { int ea = _memory.Read(RPC) | (_memory.Read(RPC + 1) << 8); RPC = _memory.Read(ea) | (_memory.Read(ea + 1) << 8); CC += cc; } private void ExecuteJmpAbsIndX(int cc) // jmp (abs, x) { int ea = (_memory.Read(RPC) + RX + (_memory.Read(RPC + 1) << 8)) & 0xFFFF; RPC = _memory.Read(ea) | (_memory.Read(ea + 1) << 8); CC += cc; } private void ExecuteJsr(int cc) // jsr abs { int rpc = (RPC + 1) & 0xFFFF; RPC = _memory.Read(RPC) | (_memory.Read(RPC + 1) << 8); Push(rpc >> 8); Push(rpc & 0xFF); CC += cc; } private void ExecuteLda(int data, int cc) { RA = data; RP = RP & ~(PN | PZ) | DataPNZ[RA]; CC += cc; } private void ExecuteLdx(int data, int cc) { RX = data; RP = RP & ~(PN | PZ) | DataPNZ[RX]; CC += cc; } private void ExecuteLdy(int data, int cc) { RY = data; RP = RP & ~(PN | PZ) | DataPNZ[RY]; CC += cc; } private int ExecuteLsr(int data, int cc) { RP = RP & ~PC | (data & PC); data >>= 1; RP = RP & ~(PN | PZ) | DataPNZ[data]; CC += cc; return data; } private void ExecuteLsrImp(int cc) { RP = RP & ~PC | (RA & PC); RA >>= 1; RP = RP & ~(PN | PZ) | DataPNZ[RA]; CC += cc; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] private void ExecuteNmi(int cc) { Push(RPC >> 8); Push(RPC & 0xFF); Push(RP & ~PB); RP |= PI; if (Is65C02) // [C-10] { RP &= ~PD; } RPC = _memory.Read(0xFFFA) | (_memory.Read(0xFFFB) << 8); CC += cc; } private void ExecuteNop(int cc) { CC += cc; } private void ExecuteNop(int data, int cc) { RPC = (RPC + data) & 0xFFFF; CC += cc; } private void ExecuteOra(int data, int cc) { RA |= data; RP = RP & ~(PN | PZ) | DataPNZ[RA]; CC += cc; } private void ExecutePha(int cc) { Push(RA); CC += cc; } private void ExecutePhp(int cc) { Push(RP | PB); // [4-18] CC += cc; } private void ExecutePhx(int cc) { Push(RX); CC += cc; } private void ExecutePhy(int cc) { Push(RY); CC += cc; } private void ExecutePla(int cc) { RA = Pull(); RP = RP & ~(PN | PZ) | DataPNZ[RA]; CC += cc; } private void ExecutePlp(int cc) { RP = Pull(); CC += cc; } private void ExecutePlx(int cc) { RX = Pull(); RP = RP & ~(PN | PZ) | DataPNZ[RX]; CC += cc; } private void ExecutePly(int cc) { RY = Pull(); RP = RP & ~(PN | PZ) | DataPNZ[RY]; CC += cc; } private int ExecuteRol(int data, int cc) { int c = RP & PC; RP = RP & ~PC | ((data >> 7) & PC); data = ((data << 1) | c) & 0xFF; RP = RP & ~(PN | PZ) | DataPNZ[data]; CC += cc; return data; } private void ExecuteRolImp(int cc) { int c = RP & PC; RP = RP & ~PC | ((RA >> 7) & PC); RA = ((RA << 1) | c) & 0xFF; RP = RP & ~(PN | PZ) | DataPNZ[RA]; CC += cc; } private int ExecuteRor(int data, int cc) { int c = RP & PC; RP = RP & ~PC | (data & PC); data = (c << 7) | (data >> 1); RP = RP & ~(PN | PZ) | DataPNZ[data]; CC += cc; return data; } private void ExecuteRorImp(int cc) { int c = RP & PC; RP = RP & ~PC | (RA & PC); RA = (c << 7) | (RA >> 1); RP = RP & ~(PN | PZ) | DataPNZ[RA]; CC += cc; } private void ExecuteRti(int cc) { RP = Pull(); int rpc = Pull(); RPC = rpc | (Pull() << 8); CC += cc; } private void ExecuteRts(int cc) { int rpc = Pull(); RPC = (rpc + 1 + (Pull() << 8)) & 0xFFFF; CC += cc; } private void ExecuteSbc65N02(int data, int cc) { if ((RP & PD) == 0x0) { int ra = RA - data - (~RP & PC); RP = RP & ~(PC | PN | PV | PZ) | ((~ra >> 8) & PC) | DataPNZ[ra & 0xFF] | ((((RA ^ data) & (RA ^ (ra & 0xFF))) >> 1) & PV); RA = ra & 0xFF; CC += cc; } else // decimal { int ral = (RA & 0x0F) - (data & 0x0F) - (~RP & PC); int rah = (RA >> 4) - (data >> 4); if (ral < 0) { ral += 10; rah--; } int ra = (ral | (rah << 4)) & 0xFF; RP = RP & ~(PN | PV | PZ) | PC | DataPN[ra] | ((((RA ^ data) & (RA ^ ra)) >> 1) & PV) | DataPZ[(RA - data - (~RP & PC)) & 0xFF]; if (rah < 0) { rah += 10; RP &= ~PC; } RA = (ral | (rah << 4)) & 0xFF; CC += cc; } } private void ExecuteSbc65C02(int data, int cc) { if ((RP & PD) == 0x0) { int ra = RA - data - (~RP & PC); RP = RP & ~(PC | PN | PV | PZ) | ((~ra >> 8) & PC) | DataPNZ[ra & 0xFF] | ((((RA ^ data) & (RA ^ (ra & 0xFF))) >> 1) & PV); RA = ra & 0xFF; CC += cc; } else // decimal { int ral = (RA & 0x0F) - (data & 0x0F) - (~RP & PC); int rah = (RA >> 4) - (data >> 4); if (ral < 0) { ral += 10; rah--; } RP |= PC; if (rah < 0) { rah += 10; RP &= ~PC; } int ra = (ral | (rah << 4)) & 0xFF; RP = RP & ~(PN | PV | PZ) | DataPNZ[ra] | ((((RA ^ data) & (RA ^ ra)) >> 1) & PV); RA = ra; CC += cc + 1; } } private void ExecuteSec(int cc) { RP |= PC; CC += cc; } private void ExecuteSed(int cc) { RP |= PD; CC += cc; } private void ExecuteSei(int cc) { RP |= PI; CC += cc; } private void ExecuteSta(int cc) { CC += cc; } private void ExecuteStx(int cc) { CC += cc; } private void ExecuteSty(int cc) { CC += cc; } private void ExecuteStz(int cc) { CC += cc; } private void ExecuteTax(int cc) { RX = RA; RP = RP & ~(PN | PZ) | DataPNZ[RX]; CC += cc; } private void ExecuteTay(int cc) { RY = RA; RP = RP & ~(PN | PZ) | DataPNZ[RY]; CC += cc; } private int ExecuteTrb(int data, int cc) { RP = RP & ~PZ | DataPZ[RA & data]; data &= ~RA; CC += cc; return data; } private int ExecuteTsb(int data, int cc) { RP = RP & ~PZ | DataPZ[RA & data]; data |= RA; CC += cc; return data; } private void ExecuteTsx(int cc) { RX = RS; RP = RP & ~(PN | PZ) | DataPNZ[RX]; CC += cc; } private void ExecuteTxa(int cc) { RA = RX; RP = RP & ~(PN | PZ) | DataPNZ[RA]; CC += cc; } private void ExecuteTxs(int cc) { RS = RX; CC += cc; } private void ExecuteTya(int cc) { RA = RY; RP = RP & ~(PN | PZ) | DataPNZ[RA]; CC += cc; } #endregion #region 6502 OpCode Actions private void Execute65X02And21() // and (zpg, x) { GetAddressZpgIndX(); ExecuteAnd(ReadZpgIndX(), 6); } private void Execute65X02And25() // and zpg { GetAddressZpg(); ExecuteAnd(ReadZpg(), 3); } private void Execute65X02And29() // and imm { ExecuteAnd(ReadImm(), 2); } private void Execute65X02And2D() // and abs { GetAddressAbs(); ExecuteAnd(ReadAbs(), 4); } private void Execute65X02And31() // and (zpg), y { GetAddressZpgIndYCC(); ExecuteAnd(ReadZpgIndY(), 5); } private void Execute65X02And35() // and zpg, x { GetAddressZpgX(); ExecuteAnd(ReadZpgX(), 4); } private void Execute65X02And39() // and abs, y { GetAddressAbsYCC(); ExecuteAnd(ReadAbsY(), 4); } private void Execute65X02And3D() // and abs, x { GetAddressAbsXCC(); ExecuteAnd(ReadAbsX(), 4); } private void Execute65X02Asl06() // asl zpg { GetAddressZpg(); WriteZpg(ExecuteAsl(ReadZpg(), 5)); } private void Execute65X02Asl0A() // asl imp { ExecuteAslImp(2); } private void Execute65X02Asl0E() // asl abs { GetAddressAbs(); WriteAbs(ExecuteAsl(ReadAbs(), 6)); } private void Execute65X02Asl16() // asl zpg, x { GetAddressZpgX(); WriteZpgX(ExecuteAsl(ReadZpgX(), 6)); } private void Execute65X02Bcc90() // bcc rel { ExecuteBcc(2); } private void Execute65X02BcsB0() // bcs rel { ExecuteBcs(2); } private void Execute65X02BeqF0() // beq rel { ExecuteBeq(2); } private void Execute65X02Bit24() // bit zpg { GetAddressZpg(); ExecuteBit(ReadZpg(), 3); } private void Execute65X02Bit2C() // bit abs { GetAddressAbs(); ExecuteBit(ReadAbs(), 4); } private void Execute65X02Bmi30() // bmi rel { ExecuteBmi(2); } private void Execute65X02BneD0() // bne rel { ExecuteBne(2); } private void Execute65X02Bpl10() // bpl rel { ExecuteBpl(2); } private void Execute65X02Brk00() // brk imp { ExecuteBrk(7); } private void Execute65X02Bvc50() // bvc rel { ExecuteBvc(2); } private void Execute65X02Bvs70() // bvs rel { ExecuteBvs(2); } private void Execute65X02Clc18() // clc imp { ExecuteClc(2); } private void Execute65X02CldD8() // cld imp { ExecuteCld(2); } private void Execute65X02Cli58() // cli imp { ExecuteCli(2); } private void Execute65X02ClvB8() // clv imp { ExecuteClv(2); } private void Execute65X02CmpC1() // cmp (zpg, x) { GetAddressZpgIndX(); ExecuteCmp(ReadZpgIndX(), 6); } private void Execute65X02CmpC5() // cmp zpg { GetAddressZpg(); ExecuteCmp(ReadZpg(), 3); } private void Execute65X02CmpC9() // cmp imm { ExecuteCmp(ReadImm(), 2); } private void Execute65X02CmpCD() // cmp abs { GetAddressAbs(); ExecuteCmp(ReadAbs(), 4); } private void Execute65X02CmpD1() // cmp (zpg), y { GetAddressZpgIndYCC(); ExecuteCmp(ReadZpgIndY(), 5); } private void Execute65X02CmpD5() // cmp zpg, x { GetAddressZpgX(); ExecuteCmp(ReadZpgX(), 4); } private void Execute65X02CmpD9() // cmp abs, y { GetAddressAbsYCC(); ExecuteCmp(ReadAbsY(), 4); } private void Execute65X02CmpDD() // cmp abs, x { GetAddressAbsXCC(); ExecuteCmp(ReadAbsX(), 4); } private void Execute65X02CpxE0() // cpx imm { ExecuteCpx(ReadImm(), 2); } private void Execute65X02CpxE4() // cpx zpg { GetAddressZpg(); ExecuteCpx(ReadZpg(), 3); } private void Execute65X02CpxEC() // cpx abs { GetAddressAbs(); ExecuteCpx(ReadAbs(), 4); } private void Execute65X02CpyC0() // cpy imm { ExecuteCpy(ReadImm(), 2); } private void Execute65X02CpyC4() // cpy zpg { GetAddressZpg(); ExecuteCpy(ReadZpg(), 3); } private void Execute65X02CpyCC() // cpy abs { GetAddressAbs(); ExecuteCpy(ReadAbs(), 4); } private void Execute65X02DecC6() // dec zpg { GetAddressZpg(); WriteZpg(ExecuteDec(ReadZpg(), 5)); } private void Execute65X02DecCE() // dec abs { GetAddressAbs(); WriteAbs(ExecuteDec(ReadAbs(), 6)); } private void Execute65X02DecD6() // dec zpg, x { GetAddressZpgX(); WriteZpgX(ExecuteDec(ReadZpgX(), 6)); } private void Execute65X02DexCA() // dex imp { ExecuteDex(2); } private void Execute65X02Dey88() // dey imp { ExecuteDey(2); } private void Execute65X02Eor41() // eor (zpg, x) { GetAddressZpgIndX(); ExecuteEor(ReadZpgIndX(), 6); } private void Execute65X02Eor45() // eor zpg { GetAddressZpg(); ExecuteEor(ReadZpg(), 3); } private void Execute65X02Eor49() // eor imm { ExecuteEor(ReadImm(), 2); } private void Execute65X02Eor4D() // eor abs { GetAddressAbs(); ExecuteEor(ReadAbs(), 4); } private void Execute65X02Eor51() // eor (zpg), y { GetAddressZpgIndYCC(); ExecuteEor(ReadZpgIndY(), 5); } private void Execute65X02Eor55() // eor zpg, x { GetAddressZpgX(); ExecuteEor(ReadZpgX(), 4); } private void Execute65X02Eor59() // eor abs, y { GetAddressAbsYCC(); ExecuteEor(ReadAbsY(), 4); } private void Execute65X02Eor5D() // eor abs, x { GetAddressAbsXCC(); ExecuteEor(ReadAbsX(), 4); } private void Execute65X02IncE6() // inc zpg { GetAddressZpg(); WriteZpg(ExecuteInc(ReadZpg(), 5)); } private void Execute65X02IncEE() // inc abs { GetAddressAbs(); WriteAbs(ExecuteInc(ReadAbs(), 6)); } private void Execute65X02IncF6() // inc zpg, x { GetAddressZpgX(); WriteZpgX(ExecuteInc(ReadZpgX(), 6)); } private void Execute65X02InxE8() // inx imp { ExecuteInx(2); } private void Execute65X02InyC8() // iny imp { ExecuteIny(2); } private void Execute65X02Jmp4C() // jmp abs { ExecuteJmpAbs(3); } private void Execute65X02Jsr20() // jsr abs { ExecuteJsr(6); } private void Execute65X02LdaA1() // lda (zpg, x) { GetAddressZpgIndX(); ExecuteLda(ReadZpgIndX(), 6); } private void Execute65X02LdaA5() // lda zpg { GetAddressZpg(); ExecuteLda(ReadZpg(), 3); } private void Execute65X02LdaA9() // lda imm { ExecuteLda(ReadImm(), 2); } private void Execute65X02LdaAD() // lda abs { GetAddressAbs(); ExecuteLda(ReadAbs(), 4); } private void Execute65X02LdaB1() // lda (zpg), y { GetAddressZpgIndYCC(); ExecuteLda(ReadZpgIndY(), 5); } private void Execute65X02LdaB5() // lda zpg, x { GetAddressZpgX(); ExecuteLda(ReadZpgX(), 4); } private void Execute65X02LdaB9() // lda abs, y { GetAddressAbsYCC(); ExecuteLda(ReadAbsY(), 4); } private void Execute65X02LdaBD() // lda abs, x { GetAddressAbsXCC(); ExecuteLda(ReadAbsX(), 4); } private void Execute65X02LdxA2() // ldx imm { ExecuteLdx(ReadImm(), 2); } private void Execute65X02LdxA6() // ldx zpg { GetAddressZpg(); ExecuteLdx(ReadZpg(), 3); } private void Execute65X02LdxAE() // ldx abs { GetAddressAbs(); ExecuteLdx(ReadAbs(), 4); } private void Execute65X02LdxB6() // ldx zpg, y { GetAddressZpgY(); ExecuteLdx(ReadZpgY(), 4); } private void Execute65X02LdxBE() // ldx abs, y { GetAddressAbsYCC(); ExecuteLdx(ReadAbsY(), 4); } private void Execute65X02LdyA0() // ldy imm { ExecuteLdy(ReadImm(), 2); } private void Execute65X02LdyA4() // ldy zpg { GetAddressZpg(); ExecuteLdy(ReadZpg(), 3); } private void Execute65X02LdyAC() // ldy abs { GetAddressAbs(); ExecuteLdy(ReadAbs(), 4); } private void Execute65X02LdyB4() // ldy zpg, x { GetAddressZpgX(); ExecuteLdy(ReadZpgX(), 4); } private void Execute65X02LdyBC() // ldy abs, x { GetAddressAbsXCC(); ExecuteLdy(ReadAbsX(), 4); } private void Execute65X02Lsr46() // lsr zpg { GetAddressZpg(); WriteZpg(ExecuteLsr(ReadZpg(), 5)); } private void Execute65X02Lsr4A() // lsr imp { ExecuteLsrImp(2); } private void Execute65X02Lsr4E() // lsr abs { GetAddressAbs(); WriteAbs(ExecuteLsr(ReadAbs(), 6)); } private void Execute65X02Lsr56() // lsr zpg, x { GetAddressZpgX(); WriteZpgX(ExecuteLsr(ReadZpgX(), 6)); } private void Execute65X02NopEA() // nop imp { ExecuteNop(2); } private void Execute65X02Ora01() // ora (zpg, x) { GetAddressZpgIndX(); ExecuteOra(ReadZpgIndX(), 6); } private void Execute65X02Ora05() // ora zpg { GetAddressZpg(); ExecuteOra(ReadZpg(), 3); } private void Execute65X02Ora09() // ora imm { ExecuteOra(ReadImm(), 2); } private void Execute65X02Ora0D() // ora abs { GetAddressAbs(); ExecuteOra(ReadAbs(), 4); } private void Execute65X02Ora11() // ora (zpg), y { GetAddressZpgIndYCC(); ExecuteOra(ReadZpgIndY(), 5); } private void Execute65X02Ora15() // ora zpg, x { GetAddressZpgX(); ExecuteOra(ReadZpgX(), 4); } private void Execute65X02Ora19() // ora abs, y { GetAddressAbsYCC(); ExecuteOra(ReadAbsY(), 4); } private void Execute65X02Ora1D() // ora abs, x { GetAddressAbsXCC(); ExecuteOra(ReadAbsX(), 4); } private void Execute65X02Pha48() // pha imp { ExecutePha(3); } private void Execute65X02Php08() // php imp { ExecutePhp(3); } private void Execute65X02Pla68() // pla imp { ExecutePla(4); } private void Execute65X02Plp28() // plp imp { ExecutePlp(4); } private void Execute65X02Rol26() // rol zpg { GetAddressZpg(); WriteZpg(ExecuteRol(ReadZpg(), 5)); } private void Execute65X02Rol2A() // rol imp { ExecuteRolImp(2); } private void Execute65X02Rol2E() // rol abs { GetAddressAbs(); WriteAbs(ExecuteRol(ReadAbs(), 6)); } private void Execute65X02Rol36() // rol zpg, x { GetAddressZpgX(); WriteZpgX(ExecuteRol(ReadZpgX(), 6)); } private void Execute65X02Ror66() // ror zpg { GetAddressZpg(); WriteZpg(ExecuteRor(ReadZpg(), 5)); } private void Execute65X02Ror6A() // ror imp { ExecuteRorImp(2); } private void Execute65X02Ror6E() // ror abs { GetAddressAbs(); WriteAbs(ExecuteRor(ReadAbs(), 6)); } private void Execute65X02Ror76() // ror zpg, x { GetAddressZpgX(); WriteZpgX(ExecuteRor(ReadZpgX(), 6)); } private void Execute65X02Rti40() // rti imp { ExecuteRti(6); } private void Execute65X02Rts60() // rts imp { ExecuteRts(6); } private void Execute65X02Sec38() // sec imp { ExecuteSec(2); } private void Execute65X02SedF8() // sed imp { ExecuteSed(2); } private void Execute65X02Sei78() // sei imp { ExecuteSei(2); } private void Execute65X02Sta81() // sta (zpg, x) { GetAddressZpgIndX(); WriteZpgIndX(RA); ExecuteSta(6); } private void Execute65X02Sta85() // sta zpg { GetAddressZpg(); WriteZpg(RA); ExecuteSta(3); } private void Execute65X02Sta8D() // sta abs { GetAddressAbs(); WriteAbs(RA); ExecuteSta(4); } private void Execute65X02Sta91() // sta (zpg), y { GetAddressZpgIndY(); WriteZpgIndY(RA); ExecuteSta(6); } private void Execute65X02Sta95() // sta zpg, x { GetAddressZpgX(); WriteZpgX(RA); ExecuteSta(4); } private void Execute65X02Sta99() // sta abs, y { GetAddressAbsY(); WriteAbsY(RA); ExecuteSta(5); } private void Execute65X02Sta9D() // sta abs, x { GetAddressAbsX(); WriteAbsX(RA); ExecuteSta(5); } private void Execute65X02Stx86() // stx zpg { GetAddressZpg(); WriteZpg(RX); ExecuteStx(3); } private void Execute65X02Stx8E() // stx abs { GetAddressAbs(); WriteAbs(RX); ExecuteStx(4); } private void Execute65X02Stx96() // stx zpg, y { GetAddressZpgY(); WriteZpgY(RX); ExecuteStx(4); } private void Execute65X02Sty84() // sty zpg { GetAddressZpg(); WriteZpg(RY); ExecuteSty(3); } private void Execute65X02Sty8C() // sty abs { GetAddressAbs(); WriteAbs(RY); ExecuteSty(4); } private void Execute65X02Sty94() // sty zpg, x { GetAddressZpgX(); WriteZpgX(RY); ExecuteSty(4); } private void Execute65X02TaxAA() // tax imp { ExecuteTax(2); } private void Execute65X02TayA8() // tay imp { ExecuteTay(2); } private void Execute65X02TsxBA() // tsx imp { ExecuteTsx(2); } private void Execute65X02Txa8A() // txa imp { ExecuteTxa(2); } private void Execute65X02Txs9A() // txs imp { ExecuteTxs(2); } private void Execute65X02Tya98() // tya imp { ExecuteTya(2); } #endregion #region 65N02 OpCode Actions private void Execute65N02Adc61() // adc (zpg, x) { GetAddressZpgIndX(); ExecuteAdc65N02(ReadZpgIndX(), 6); } private void Execute65N02Adc65() // adc zpg { GetAddressZpg(); ExecuteAdc65N02(ReadZpg(), 3); } private void Execute65N02Adc69() // adc imm { ExecuteAdc65N02(ReadImm(), 2); } private void Execute65N02Adc6D() // adc abs { GetAddressAbs(); ExecuteAdc65N02(ReadAbs(), 4); } private void Execute65N02Adc71() // adc (zpg), y { GetAddressZpgIndYCC(); ExecuteAdc65N02(ReadZpgIndY(), 5); } private void Execute65N02Adc75() // adc zpg, x { GetAddressZpgX(); ExecuteAdc65N02(ReadZpgX(), 4); } private void Execute65N02Adc79() // adc abs, y { GetAddressAbsYCC(); ExecuteAdc65N02(ReadAbsY(), 4); } private void Execute65N02Adc7D() // adc abs, x { GetAddressAbsXCC(); ExecuteAdc65N02(ReadAbsX(), 4); } private void Execute65N02Asl1E() // asl abs, x { GetAddressAbsX(); WriteAbsX(ExecuteAsl(ReadAbsX(), 7)); } private void Execute65N02DecDE() // dec abs, x { GetAddressAbsX(); WriteAbsX(ExecuteDec(ReadAbsX(), 7)); } private void Execute65N02IncFE() // inc abs, x { GetAddressAbsX(); WriteAbsX(ExecuteInc(ReadAbsX(), 7)); } private void Execute65N02Jmp6C() // jmp (abs) { ExecuteJmpAbsInd65N02(5); } private void Execute65N02Lsr5E() // lsr abs, x { GetAddressAbsX(); WriteAbsX(ExecuteLsr(ReadAbsX(), 7)); } private void Execute65N02Nop02() // nop imp0 { ExecuteNop(0, 2); } private void Execute65N02Nop03() // nop imp1 { ExecuteNop(1, 6); } private void Execute65N02Nop04() // nop imp1 { ExecuteNop(1, 2); } private void Execute65N02Nop07() // nop imp1 { ExecuteNop(1, 5); } private void Execute65N02Nop0B() // nop imp1 { ExecuteNop(1, 2); } private void Execute65N02Nop0C() // nop imp2 { ExecuteNop(2, 4); } private void Execute65N02Nop0F() // nop imp2 { ExecuteNop(2, 6); } private void Execute65N02Nop12() // nop imp0 { ExecuteNop(0, 2); } private void Execute65N02Nop13() // nop imp1 { ExecuteNop(1, 6); } private void Execute65N02Nop14() // nop imp1 { ExecuteNop(1, 2); } private void Execute65N02Nop17() // nop imp1 { ExecuteNop(1, 6); } private void Execute65N02Nop1A() // nop imp0 { ExecuteNop(0, 2); } private void Execute65N02Nop1B() // nop imp2 { ExecuteNop(2, 6); } private void Execute65N02Nop1C() // nop imp2 { ExecuteNop(2, 4); } private void Execute65N02Nop1F() // nop imp2 { ExecuteNop(2, 6); } private void Execute65N02Nop22() // nop imp0 { ExecuteNop(0, 2); } private void Execute65N02Nop23() // nop imp1 { ExecuteNop(1, 6); } private void Execute65N02Nop27() // nop imp1 { ExecuteNop(1, 3); } private void Execute65N02Nop2B() // nop imp1 { ExecuteNop(1, 2); } private void Execute65N02Nop2F() // nop imp2 { ExecuteNop(2, 4); } private void Execute65N02Nop32() // nop imp0 { ExecuteNop(0, 2); } private void Execute65N02Nop33() // nop imp1 { ExecuteNop(1, 5); } private void Execute65N02Nop34() // nop imp1 { ExecuteNop(1, 2); } private void Execute65N02Nop37() // nop imp1 { ExecuteNop(1, 4); } private void Execute65N02Nop3A() // nop imp0 { ExecuteNop(0, 2); } private void Execute65N02Nop3B() // nop imp2 { ExecuteNop(2, 4); } private void Execute65N02Nop3C() // nop imp2 { ExecuteNop(2, 4); } private void Execute65N02Nop3F() // nop imp2 { ExecuteNop(2, 4); } private void Execute65N02Nop42() // nop imp0 { ExecuteNop(0, 2); } private void Execute65N02Nop43() // nop imp1 { ExecuteNop(1, 6); } private void Execute65N02Nop44() // nop imp1 { ExecuteNop(1, 2); } private void Execute65N02Nop47() // nop imp1 { ExecuteNop(1, 3); } private void Execute65N02Nop4B() // nop imp1 { ExecuteNop(1, 2); } private void Execute65N02Nop4F() // nop imp2 { ExecuteNop(2, 4); } private void Execute65N02Nop52() // nop imp0 { ExecuteNop(0, 2); } private void Execute65N02Nop53() // nop imp1 { ExecuteNop(1, 5); } private void Execute65N02Nop54() // nop imp1 { ExecuteNop(1, 2); } private void Execute65N02Nop57() // nop imp1 { ExecuteNop(1, 4); } private void Execute65N02Nop5A() // nop imp0 { ExecuteNop(0, 2); } private void Execute65N02Nop5B() // nop imp2 { ExecuteNop(2, 4); } private void Execute65N02Nop5C() // nop imp2 { ExecuteNop(2, 4); } private void Execute65N02Nop5F() // nop imp2 { ExecuteNop(2, 4); } private void Execute65N02Nop62() // nop imp0 { ExecuteNop(0, 2); } private void Execute65N02Nop63() // nop imp1 { ExecuteNop(1, 6); } private void Execute65N02Nop64() // nop imp1 { ExecuteNop(1, 2); } private void Execute65N02Nop67() // nop imp1 { ExecuteNop(1, 3); } private void Execute65N02Nop6B() // nop imp1 { ExecuteNop(1, 2); } private void Execute65N02Nop6F() // nop imp2 { ExecuteNop(2, 4); } private void Execute65N02Nop72() // nop imp0 { ExecuteNop(0, 2); } private void Execute65N02Nop73() // nop imp1 { ExecuteNop(1, 5); } private void Execute65N02Nop74() // nop imp1 { ExecuteNop(1, 2); } private void Execute65N02Nop77() // nop imp1 { ExecuteNop(1, 4); } private void Execute65N02Nop7A() // nop imp0 { ExecuteNop(0, 2); } private void Execute65N02Nop7B() // nop imp2 { ExecuteNop(2, 4); } private void Execute65N02Nop7C() // nop imp2 { ExecuteNop(2, 4); } private void Execute65N02Nop7F() // nop imp2 { ExecuteNop(2, 4); } private void Execute65N02Nop80() // nop imp1 { ExecuteNop(1, 2); } private void Execute65N02Nop82() // nop imp1 { ExecuteNop(1, 2); } private void Execute65N02Nop83() // nop imp1 { ExecuteNop(1, 4); } private void Execute65N02Nop87() // nop imp1 { ExecuteNop(1, 3); } private void Execute65N02Nop89() // nop imp1 { ExecuteNop(1, 2); } private void Execute65N02Nop8B() // nop imp1 { ExecuteNop(1, 2); } private void Execute65N02Nop8F() // nop imp2 { ExecuteNop(2, 4); } private void Execute65N02Nop92() // nop imp0 { ExecuteNop(0, 2); } private void Execute65N02Nop93() // nop imp1 { ExecuteNop(1, 6); } private void Execute65N02Nop97() // nop imp1 { ExecuteNop(1, 4); } private void Execute65N02Nop9B() // nop imp2 { ExecuteNop(2, 5); } private void Execute65N02Nop9C() // nop imp2 { ExecuteNop(2, 5); } private void Execute65N02Nop9E() // nop imp2 { ExecuteNop(2, 5); } private void Execute65N02Nop9F() // nop imp2 { ExecuteNop(2, 5); } private void Execute65N02NopA3() // nop imp1 { ExecuteNop(1, 6); } private void Execute65N02NopA7() // nop imp1 { ExecuteNop(1, 3); } private void Execute65N02NopAB() // nop imp1 { ExecuteNop(1, 2); } private void Execute65N02NopAF() // nop imp2 { ExecuteNop(2, 4); } private void Execute65N02NopB2() // nop imp0 { ExecuteNop(0, 2); } private void Execute65N02NopB3() // nop imp1 { ExecuteNop(1, 5); } private void Execute65N02NopB7() // nop imp1 { ExecuteNop(1, 4); } private void Execute65N02NopBB() // nop imp2 { ExecuteNop(2, 4); } private void Execute65N02NopBF() // nop imp2 { ExecuteNop(2, 4); } private void Execute65N02NopC2() // nop imp1 { ExecuteNop(1, 2); } private void Execute65N02NopC3() // nop imp1 { ExecuteNop(1, 6); } private void Execute65N02NopC7() // nop imp1 { ExecuteNop(1, 5); } private void Execute65N02NopCB() // nop imp1 { ExecuteNop(1, 2); } private void Execute65N02NopCF() // nop imp2 { ExecuteNop(2, 6); } private void Execute65N02NopD2() // nop imp0 { ExecuteNop(0, 2); } private void Execute65N02NopD3() // nop imp1 { ExecuteNop(1, 6); } private void Execute65N02NopD4() // nop imp1 { ExecuteNop(1, 2); } private void Execute65N02NopD7() // nop imp1 { ExecuteNop(1, 6); } private void Execute65N02NopDA() // nop imp0 { ExecuteNop(0, 2); } private void Execute65N02NopDB() // nop imp2 { ExecuteNop(2, 6); } private void Execute65N02NopDC() // nop imp2 { ExecuteNop(2, 4); } private void Execute65N02NopDF() // nop imp2 { ExecuteNop(2, 6); } private void Execute65N02NopE2() // nop imp1 { ExecuteNop(1, 2); } private void Execute65N02NopE3() // nop imp1 { ExecuteNop(1, 6); } private void Execute65N02NopE7() // nop imp1 { ExecuteNop(1, 5); } private void Execute65N02NopEB() // nop imp1 { ExecuteNop(1, 2); } private void Execute65N02NopEF() // nop imp2 { ExecuteNop(2, 6); } private void Execute65N02NopF2() // nop imp0 { ExecuteNop(0, 2); } private void Execute65N02NopF3() // nop imp1 { ExecuteNop(1, 6); } private void Execute65N02NopF4() // nop imp1 { ExecuteNop(1, 2); } private void Execute65N02NopF7() // nop imp1 { ExecuteNop(1, 6); } private void Execute65N02NopFA() // nop imp0 { ExecuteNop(0, 2); } private void Execute65N02NopFB() // nop imp2 { ExecuteNop(2, 6); } private void Execute65N02NopFC() // nop imp2 { ExecuteNop(2, 4); } private void Execute65N02NopFF() // nop imp2 { ExecuteNop(2, 6); } private void Execute65N02Rol3E() // rol abs, x { GetAddressAbsX(); WriteAbsX(ExecuteRol(ReadAbsX(), 7)); } private void Execute65N02Ror7E() // ror abs, x { GetAddressAbsX(); WriteAbsX(ExecuteRor(ReadAbsX(), 7)); } private void Execute65N02SbcE1() // sbc (zpg, x) { GetAddressZpgIndX(); ExecuteSbc65N02(ReadZpgIndX(), 6); } private void Execute65N02SbcE5() // sbc zpg { GetAddressZpg(); ExecuteSbc65N02(ReadZpg(), 3); } private void Execute65N02SbcE9() // sbc imm { ExecuteSbc65N02(ReadImm(), 2); } private void Execute65N02SbcED() // sbc abs { GetAddressAbs(); ExecuteSbc65N02(ReadAbs(), 4); } private void Execute65N02SbcF1() // sbc (zpg), y { GetAddressZpgIndYCC(); ExecuteSbc65N02(ReadZpgIndY(), 5); } private void Execute65N02SbcF5() // sbc zpg, x { GetAddressZpgX(); ExecuteSbc65N02(ReadZpgX(), 4); } private void Execute65N02SbcF9() // sbc abs, y { GetAddressAbsYCC(); ExecuteSbc65N02(ReadAbsY(), 4); } private void Execute65N02SbcFD() // sbc abs, x { GetAddressAbsXCC(); ExecuteSbc65N02(ReadAbsX(), 4); } #endregion #region 65C02 OpCode Actions private void Execute65C02Adc61() // adc (zpg, x) { GetAddressZpgIndX(); ExecuteAdc65C02(ReadZpgIndX(), 6); } private void Execute65C02Adc65() // adc zpg { GetAddressZpg(); ExecuteAdc65C02(ReadZpg(), 3); } private void Execute65C02Adc69() // adc imm { ExecuteAdc65C02(ReadImm(), 2); } private void Execute65C02Adc6D() // adc abs { GetAddressAbs(); ExecuteAdc65C02(ReadAbs(), 4); } private void Execute65C02Adc71() // adc (zpg), y { GetAddressZpgIndYCC(); ExecuteAdc65C02(ReadZpgIndY(), 5); } private void Execute65C02Adc72() // adc (zpg) { GetAddressZpgInd(); ExecuteAdc65C02(ReadZpgInd(), 5); } private void Execute65C02Adc75() // adc zpg, x { GetAddressZpgX(); ExecuteAdc65C02(ReadZpgX(), 4); } private void Execute65C02Adc79() // adc abs, y { GetAddressAbsYCC(); ExecuteAdc65C02(ReadAbsY(), 4); } private void Execute65C02Adc7D() // adc abs, x { GetAddressAbsXCC(); ExecuteAdc65C02(ReadAbsX(), 4); } private void Execute65C02And32() // and (zpg) { GetAddressZpgInd(); ExecuteAnd(ReadZpgInd(), 5); } private void Execute65C02Asl1E() // asl abs, x { GetAddressAbsXCC(); WriteAbsX(ExecuteAsl(ReadAbsX(), 6)); } private void Execute65C02Bit34() // bit zpg, x { GetAddressZpgX(); ExecuteBit(ReadZpgX(), 4); } private void Execute65C02Bit3C() // bit abs, x { GetAddressAbsXCC(); ExecuteBit(ReadAbsX(), 4); } private void Execute65C02Bit89() // bit imm { ExecuteBitImm(ReadImm(), 2); } private void Execute65C02Bra80() // bra rel { ExecuteBra(2); } private void Execute65C02CmpD2() // cmp (zpg) { GetAddressZpgInd(); ExecuteCmp(ReadZpgInd(), 5); } private void Execute65C02Dea3A() // dea imp { ExecuteDea(2); } private void Execute65C02DecDE() // dec abs, x { GetAddressAbsXCC(); WriteAbsX(ExecuteDec(ReadAbsX(), 6)); } private void Execute65C02Eor52() // eor (zpg) { GetAddressZpgInd(); ExecuteEor(ReadZpgInd(), 5); } private void Execute65C02Ina1A() // ina imp { ExecuteIna(2); } private void Execute65C02IncFE() // inc abs, x { GetAddressAbsXCC(); WriteAbsX(ExecuteInc(ReadAbsX(), 6)); } private void Execute65C02Jmp6C() // jmp (abs) { ExecuteJmpAbsInd65C02(6); } private void Execute65C02Jmp7C() // jmp (abs, x) { ExecuteJmpAbsIndX(6); } private void Execute65C02LdaB2() // lda (zpg) { GetAddressZpgInd(); ExecuteLda(ReadZpgInd(), 5); } private void Execute65C02Lsr5E() // lsr abs, x { GetAddressAbsXCC(); WriteAbsX(ExecuteLsr(ReadAbsX(), 6)); } private void Execute65C02Nop02() // nop imp1 { ExecuteNop(1, 2); } private void Execute65C02Nop03() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop07() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop0B() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop0F() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop13() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop17() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop1B() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop1F() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop22() // nop imp1 { ExecuteNop(1, 2); } private void Execute65C02Nop23() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop27() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop2B() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop2F() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop33() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop37() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop3B() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop3F() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop42() // nop imp1 { ExecuteNop(1, 2); } private void Execute65C02Nop43() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop44() // nop imp1 { ExecuteNop(1, 3); } private void Execute65C02Nop47() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop4B() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop4F() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop53() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop54() // nop imp1 { ExecuteNop(1, 4); } private void Execute65C02Nop57() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop5B() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop5C() // nop imp2 { ExecuteNop(2, 8); } private void Execute65C02Nop5F() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop62() // nop imp1 { ExecuteNop(1, 2); } private void Execute65C02Nop63() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop67() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop6B() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop6F() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop73() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop77() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop7B() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop7F() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop82() // nop imp1 { ExecuteNop(1, 2); } private void Execute65C02Nop83() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop87() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop8B() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop8F() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop93() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop97() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop9B() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Nop9F() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02NopA3() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02NopA7() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02NopAB() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02NopAF() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02NopB3() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02NopB7() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02NopBB() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02NopBF() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02NopC2() // nop imp1 { ExecuteNop(1, 2); } private void Execute65C02NopC3() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02NopC7() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02NopCB() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02NopCF() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02NopD3() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02NopD4() // nop imp1 { ExecuteNop(1, 4); } private void Execute65C02NopD7() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02NopDB() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02NopDC() // nop imp2 { ExecuteNop(2, 4); } private void Execute65C02NopDF() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02NopE2() // nop imp1 { ExecuteNop(1, 2); } private void Execute65C02NopE3() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02NopE7() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02NopEB() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02NopEF() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02NopF3() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02NopF4() // nop imp1 { ExecuteNop(1, 4); } private void Execute65C02NopF7() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02NopFB() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02NopFC() // nop imp2 { ExecuteNop(2, 4); } private void Execute65C02NopFF() // nop imp0 { ExecuteNop(0, 1); } private void Execute65C02Ora12() // ora (zpg) { GetAddressZpgInd(); ExecuteOra(ReadZpgInd(), 5); } private void Execute65C02PhxDA() // phx imp { ExecutePhx(3); } private void Execute65C02Phy5A() // phy imp { ExecutePhy(3); } private void Execute65C02PlxFA() // plx imp { ExecutePlx(4); } private void Execute65C02Ply7A() // ply imp { ExecutePly(4); } private void Execute65C02Rol3E() // rol abs, x { GetAddressAbsXCC(); WriteAbsX(ExecuteRol(ReadAbsX(), 6)); } private void Execute65C02Ror7E() // ror abs, x { GetAddressAbsXCC(); WriteAbsX(ExecuteRor(ReadAbsX(), 6)); } private void Execute65C02SbcE1() // sbc (zpg, x) { GetAddressZpgIndX(); ExecuteSbc65C02(ReadZpgIndX(), 6); } private void Execute65C02SbcE5() // sbc zpg { GetAddressZpg(); ExecuteSbc65C02(ReadZpg(), 3); } private void Execute65C02SbcE9() // sbc imm { ExecuteSbc65C02(ReadImm(), 2); } private void Execute65C02SbcED() // sbc abs { GetAddressAbs(); ExecuteSbc65C02(ReadAbs(), 4); } private void Execute65C02SbcF1() // sbc (zpg), y { GetAddressZpgIndYCC(); ExecuteSbc65C02(ReadZpgIndY(), 5); } private void Execute65C02SbcF2() // sbc (zpg) { GetAddressZpgInd(); ExecuteSbc65C02(ReadZpgInd(), 5); } private void Execute65C02SbcF5() // sbc zpg, x { GetAddressZpgX(); ExecuteSbc65C02(ReadZpgX(), 4); } private void Execute65C02SbcF9() // sbc abs, y { GetAddressAbsYCC(); ExecuteSbc65C02(ReadAbsY(), 4); } private void Execute65C02SbcFD() // sbc abs, x { GetAddressAbsXCC(); ExecuteSbc65C02(ReadAbsX(), 4); } private void Execute65C02Sta92() // sta (zpg) { GetAddressZpgInd(); WriteZpgInd(RA); ExecuteSta(5); } private void Execute65C02Stz64() // stz zpg { GetAddressZpg(); WriteZpg(0x00); ExecuteStz(3); } private void Execute65C02Stz74() // stz zpg, x { GetAddressZpgX(); WriteZpgX(0x00); ExecuteStz(4); } private void Execute65C02Stz9C() // stz abs { GetAddressAbs(); WriteAbs(0x00); ExecuteStz(4); } private void Execute65C02Stz9E() // stz abs, x { GetAddressAbsX(); WriteAbsX(0x00); ExecuteStz(5); } private void Execute65C02Trb14() // trb zpg { GetAddressZpg(); WriteZpg(ExecuteTrb(ReadZpg(), 5)); } private void Execute65C02Trb1C() // trb abs { GetAddressAbs(); WriteAbs(ExecuteTrb(ReadAbs(), 6)); } private void Execute65C02Tsb04() // tsb zpg { GetAddressZpg(); WriteZpg(ExecuteTsb(ReadZpg(), 5)); } private void Execute65C02Tsb0C() // tsb abs { GetAddressAbs(); WriteAbs(ExecuteTsb(ReadAbs(), 6)); } #endregion public bool Is65C02 { get { return _is65C02; } set { _is65C02 = value; _executeOpCode = _is65C02 ? ExecuteOpCode65C02 : ExecuteOpCode65N02; } } public bool IsThrottled { get; set; } public int Multiplier { get; set; } public int RA { get; private set; } public int RX { get; private set; } public int RY { get; private set; } public int RS { get; private set; } public int RP { get; private set; } public int RPC { get; private set; } public int EA { get; private set; } public int CC { get; private set; } public int OpCode { get; private set; } public long Cycles { get; private set; } private Memory _memory; private bool _is65C02; private Action[] _executeOpCode; } }