public void LSR(OpcodeContainer container, ushort address) { switch (container.AddressingMode) { case AddressingModes.Accumulator: CPU.IsCarry = (CPU.Registers.A & 1) == 1; CPU.Registers.A.Write((byte)(CPU.Registers.A >> 1)); CPU.IsNegative = false; this.HandleZero(CPU.Registers.A); break; default: var value = CPU.ReadByteAt(address); CPU.IsCarry = (value & 1) == 1; byte shiftedValue = (byte)(value >> 1); // Spin cycle for the work above. CPU.CycleFinished(); CPU.WriteByteAt(address, shiftedValue); CPU.IsNegative = false; this.HandleZero(shiftedValue); break; } }
public void BIT(OpcodeContainer container, ushort address) { var value = CPU.ReadByteAt(address); CPU.IsOverflowed = (value & 0x40) != 0; CPU.IsNegative = (value & 0x80) != 0; CPU.IsZero = (value & CPU.Registers.A) == 0; }
public void AND(OpcodeContainer container, ushort address) { var value = CPU.ReadByteAt(address); var newValue = CPU.Registers.A & value; this.WriteByteToRegister(CPU.Registers.A, (byte)newValue, S: true, Z: true); //this.HandlePageBoundaryCrossed(container, isSamePage); }
public void ORA(OpcodeContainer container, ushort address) { var value = CPU.ReadByteAt(address); CPU.Registers.A.Write((byte)(CPU.Registers.A | value)); this.HandleNegative(CPU.Registers.A); this.HandleZero(CPU.Registers.A); // this.HandlePageBoundaryCrossed(container, isSamePage); }
public static string GetAddressAsString(MOS6502 CPU, OpcodeContainer container) { if (container.Name == "RTS") { return(""); } switch (container.AddressingMode) { case AddressingModes.Implied: return(""); case AddressingModes.Accumulator: return("A"); case AddressingModes.Indirect: return($"(${intermediateAddress:X4}) @ ${address:X4}"); case AddressingModes.IndirectYWrite: case AddressingModes.IndirectY: return($"(${intermediateAddress:X2}),Y @ ${address:X4}"); case AddressingModes.IndirectX: return($"(${intermediateAddress:X2},X) @ ${address:X4}"); case AddressingModes.ZeroPage: return($"${address:X2}"); case AddressingModes.ZeroPageX: return($"${intermediateAddress:X2},X @ ${address:X2}"); case AddressingModes.ZeroPageY: return($"${intermediateAddress:X2},Y @ ${address:X2}"); case AddressingModes.AbsoluteY: return($"${intermediateAddress:X4},Y @ ${address:X4}"); case AddressingModes.AbsoluteX: case AddressingModes.AbsoluteXWrite: return($"${intermediateAddress:X4},X @ ${address:X4}"); case AddressingModes.Absolute: return($"${address:X4}"); case AddressingModes.Immediate: return($"#${operandValue:X2}"); default: return($"0x{address:X4}"); } }
public static ushort GetAddressedOperand(MOS6502 CPU, OpcodeContainer container) { operandValue = 0; intermediateAddress = 0; address = 0; switch (container.AddressingMode) { case AddressingModes.Implied: address = 0x0000; CPU.CycleFinished(); break; case AddressingModes.Accumulator: address = 0x0000; CPU.CycleFinished(); break; case AddressingModes.Immediate: address = AddressingMode.GetImmediate(CPU); break; case AddressingModes.Absolute: address = AddressingMode.GetAbsolute(CPU); break; case AddressingModes.AbsoluteX: address = AddressingMode.GetAbsoluteX(CPU); break; case AddressingModes.AbsoluteXWrite: address = AddressingMode.GetAbsoluteXWrite(CPU); break; case AddressingModes.AbsoluteY: address = AddressingMode.GetAbsoluteY(CPU); break; case AddressingModes.Indirect: address = AddressingMode.GetIndirect(CPU); break; case AddressingModes.IndirectX: address = AddressingMode.GetIndirectX(CPU); break; case AddressingModes.IndirectY: address = AddressingMode.GetIndirectY(CPU); break; case AddressingModes.IndirectYWrite: address = AddressingMode.GetIndirectYWrite(CPU); break; case AddressingModes.ZeroPage: address = AddressingMode.GetZeroPage(CPU); break; case AddressingModes.ZeroPageX: address = AddressingMode.GetZeroPageX(CPU); break; case AddressingModes.ZeroPageY: address = AddressingMode.GetZeroPageY(CPU); break; case AddressingModes.Relative: address = AddressingMode.GetRelative(CPU); break; default: throw new InvalidOperationException(); } if (MOS6502.IsDebug) { CPU.LastAccessedAddress = AddressingMode.GetAddressAsString(CPU, container); } return(address); }
public void ROR(OpcodeContainer container, ushort address) { switch (container !.AddressingMode) {