public ExecutionResult Execute(Processor cpu, InstructionPackage package) { Instruction instruction = package.Instruction; InstructionData data = package.Data; Registers r = cpu.Registers; Flags flags = cpu.Flags; int result = 0x00 - r.A; flags = FlagLookup.ByteArithmeticFlags(0x00, r.A, false, true); flags.ParityOverflow = r.A == 0x80; flags.Carry = r.A != 0x00; r.A = (byte)result; return(new ExecutionResult(package, flags)); }
public ExecutionResult Execute(Processor cpu, InstructionPackage package) { Instruction instruction = package.Instruction; InstructionData data = package.Data; Registers r = cpu.Registers; byte offset = data.Argument1; Flags flags = cpu.Flags; if (instruction.TargetsWordRegister) { // inc 16-bit WordRegister register = instruction.Target.AsWordRegister(); ushort value = r[register]; r[register] = (ushort)(value + 1); } else { byte value = 0; if (instruction.TargetsByteInMemory) { // inc byte in memory if (instruction.IsIndexed) { cpu.Timing.InternalOperationCycle(5); } value = instruction.MarshalSourceByte(data, cpu, out ushort address, out ByteRegister source); cpu.Memory.Timed.WriteByteAt(address, (byte)(value + 1)); } else { // it's an 8-bit inc ByteRegister register = instruction.Target.AsByteRegister(); value = r[register]; r[register] = (byte)(value + 1); } bool carry = flags.Carry; flags = FlagLookup.ByteArithmeticFlags(value, 1, false, false); flags.ParityOverflow = (value == 0x7F); flags.Carry = carry; // always unaffected flags.Subtract = false; } return(new ExecutionResult(package, flags)); }
public static (byte Result, Flags Flags) Add(byte left, byte right, bool carry) { Flags flags = FlagLookup.ByteArithmeticFlags(left, right, carry, false); return((byte)(left + right + (carry ? 1 : 0)), flags); }
public static (byte Result, Flags Flags) Subtract(byte left, byte right, bool carry) { Flags flags = FlagLookup.ByteArithmeticFlags(left, right, carry, true); return((byte)(left - right - (carry ? 1 : 0)), flags); }