public byte Execute(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2) { var operationAddress = addressingMode.GetAddress(memory, registers, operand1, operand2, out bool pageBoundaryCrossed); registers.PC = operationAddress; return((byte)(opCodeDefinition.ExecutionCycles + (opCodeDefinition.AddExecutionCycleOnPageBoundaryCross && pageBoundaryCrossed ? 1 : 0))); }
public byte Execute(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2) { var operationValue = memory.Stack.Span[++registers.SP]; registers.PS = (byte)((registers.PS & 0x30) | (operationValue & 0xCF)); return(opCodeDefinition.ExecutionCycles); }
public byte Execute(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2) { registers.N_NegativeFlag = (byte)((registers.X & 0x80) >> 7); registers.Z_ZeroFlag = (byte)(registers.X == 0 ? 1 : 0); registers.A = registers.X; return(opCodeDefinition.ExecutionCycles); }
public byte Execute(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2) { var pcLow = (byte)(memory.Stack.Span[++registers.SP] + 1); var pcHigh = memory.Stack.Span[++registers.SP]; registers.PC = (ushort)(pcLow | pcHigh << 0x08); return(opCodeDefinition.ExecutionCycles); }
public byte Execute(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2) { var operationValue = addressingMode.GetValue(memory, registers, operand1, operand2, out bool pageBoundaryCrossed); registers.N_NegativeFlag = (byte)((operationValue & 0x80) >> 7); registers.Z_ZeroFlag = (byte)(operationValue == 0 ? 1 : 0); registers.X = operationValue; return((byte)(opCodeDefinition.ExecutionCycles + (opCodeDefinition.AddExecutionCycleOnPageBoundaryCross && pageBoundaryCrossed ? 1 : 0))); }
public byte Execute(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2) { var pageBoundaryCrossed = false; if (opCodeDefinition.AddExecutionCycleOnPageBoundaryCross) { addressingMode.GetAddress(memory, registers, operand1, operand2, out pageBoundaryCrossed); } return((byte)(opCodeDefinition.ExecutionCycles + (opCodeDefinition.AddExecutionCycleOnPageBoundaryCross && pageBoundaryCrossed ? 1 : 0))); }
public byte Execute(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2) { var operationValue = memory.Stack.Span[++registers.SP]; registers.N_NegativeFlag = (byte)((operationValue & 0x80) >> 7); registers.Z_ZeroFlag = (byte)(operationValue == 0 ? 1 : 0); registers.A = operationValue; return(opCodeDefinition.ExecutionCycles); }
public string GetSyntax(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2) { if (opCodeDefinition.AddressingMode == AddressingMode.IMM) { return(string.Empty); } else { var operationValue = addressingMode.GetValue(memory, registers, operand1, operand2, out _); return($"= {operationValue:X02}"); } }
public byte Execute(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2) { var operationAddress = addressingMode.GetAddress(memory, registers, operand1, operand2, out _); var operationValue = addressingMode.GetValue(memory, registers, operationAddress); var result = operationValue + 1; registers.N_NegativeFlag = (byte)((result & 0x80) >> 7); registers.Z_ZeroFlag = (byte)((byte)result == 0 ? 1 : 0); addressingMode.SetValue(memory, registers, operationAddress, (byte)result); return(opCodeDefinition.ExecutionCycles); }
public byte Execute(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2) { var operationAddress = addressingMode.GetAddress(memory, registers, operand1, operand2, out bool pageBoundaryCrossed); var branchTaken = false; if (registers.N_NegativeFlag == 0) { registers.PC = operationAddress; branchTaken = true; } return((byte)(opCodeDefinition.ExecutionCycles + (opCodeDefinition.AddExecutionCycleOnPageBoundaryCross && pageBoundaryCrossed && branchTaken ? 1 : 0) + (branchTaken ? 1 : 0))); }
public byte Execute(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2) { var operationAddress = addressingMode.GetAddress(memory, registers, operand1, operand2, out bool pageBoundaryCrossed); var operationValue = addressingMode.GetValue(memory, registers, operationAddress); var result = operationValue << 1 | registers.C_CarryFlag; registers.N_NegativeFlag = (byte)((result & 0x80) >> 7); registers.C_CarryFlag = (byte)((operationValue & 0x80) >> 7); registers.Z_ZeroFlag = (byte)((byte)result == 0x00 ? 1 : 0); addressingMode.SetValue(memory, registers, operationAddress, (byte)result); return((byte)(opCodeDefinition.ExecutionCycles + (opCodeDefinition.AddExecutionCycleOnPageBoundaryCross && pageBoundaryCrossed ? 1 : 0))); }
public byte Execute(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2) { var operationValue = addressingMode.GetValue(memory, registers, operand1, operand2, out bool pageBoundaryCrossed); var result = registers.A - operationValue - (1 - registers.C_CarryFlag); registers.N_NegativeFlag = (byte)((result & 0x80) >> 7); registers.Z_ZeroFlag = (byte)((byte)result == 0 ? 1 : 0); registers.C_CarryFlag = (byte)(result >= 0x00 ? 1 : 0); registers.V_OverflowFlag = (byte)((result < 0x80 && registers.A >= 0x80) || (result >= 0x80 && registers.A < 0x80) ? 1 : 0); registers.A = (byte)result; return((byte)(opCodeDefinition.ExecutionCycles + (opCodeDefinition.AddExecutionCycleOnPageBoundaryCross && pageBoundaryCrossed ? 1 : 0))); }
public string GetSyntax(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2) { return(string.Empty); }
public byte Execute(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2) { registers.C_CarryFlag = 0; return(opCodeDefinition.ExecutionCycles); }
public byte Execute(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2) { registers.I_InterruptDisable = 1; return(opCodeDefinition.ExecutionCycles); }
public byte Execute(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2) { memory.Stack.Span[registers.SP--] = (byte)(registers.PS | (1 << 4) | (1 << 5)); return(opCodeDefinition.ExecutionCycles); }