Virtu/Virtu/Cpu.cs
Sean Fausett 0182641281 Merged machine settings into machine components.
Added save state support to all machine components.
Switched from xml serialization to binary serialization.
Refactored audio service for performance.
Bumped machine version to 0.9.0 for next release.
Miscellaneous cosmetic or minor changes.
2010-11-29 09:08:11 +13:00

3262 lines
87 KiB
C#

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;
}
}