public void DecimalAdjust(ref byte register, ref byte flags) { bool subtract = FlagUtils.GetFlag(Flag.N, flags); bool carry = FlagUtils.GetFlag(Flag.C, flags); bool halfCarry = FlagUtils.GetFlag(Flag.H, flags); if (subtract) { if (carry) { register -= 0x60; } if (halfCarry) { register -= 0x6; } } else { if (register > 0x99 || carry) { register += 0x60; FlagUtils.SetFlag(Flag.C, true, ref flags); } if ((register & 0xF) > 0x9 || halfCarry) { register += 0x6; } } FlagUtils.SetFlag(Flag.Z, register == 0x00, ref flags); FlagUtils.SetFlag(Flag.H, false, ref flags); }
public void Decrement(ref byte target, ref byte flags) { byte origValue = target; target--; FlagUtils.SetFlag(Flag.Z, target == 0, ref flags); FlagUtils.SetFlag(Flag.N, true, ref flags); FlagUtils.SetFlag(Flag.H, (origValue & 0x0F) < 1, ref flags); }
public void Increment(ref byte target, ref byte flags) { byte origValue = target; target++; FlagUtils.SetFlag(Flag.Z, target == 0, ref flags); FlagUtils.SetFlag(Flag.N, false, ref flags); FlagUtils.SetFlag(Flag.H, (origValue & 0x0F) + 1 > 0x0F, ref flags); }
public void DecrementInMemory(byte addrHigh, byte addrLow, ref byte flags) { ushort address = BitUtils.BytesToUshort(addrHigh, addrLow); byte origValue = memory.ReadByte(address); TickEvent?.Invoke(); memory.WriteByte(address, (byte)(origValue - 1)); FlagUtils.SetFlag(Flag.Z, (byte)(origValue - 1) == 0, ref flags); FlagUtils.SetFlag(Flag.N, true, ref flags); FlagUtils.SetFlag(Flag.H, (origValue & 0x0F) < 1, ref flags); TickEvent?.Invoke(); }
public void AddSigned(ref ushort to, byte value, ref byte flags) { ushort originalValue = to; sbyte valueSigned = unchecked ((sbyte)value); to = (ushort)(to + valueSigned); FlagUtils.SetFlag(Flag.Z, false, ref flags); FlagUtils.SetFlag(Flag.N, false, ref flags); FlagUtils.SetFlag(Flag.H, (originalValue & 0x0F) + (value & 0x0F) > 0x0F, ref flags); FlagUtils.SetFlag(Flag.C, (originalValue & 0xFF) + value > 0xFF, ref flags); TickEvent?.Invoke(); TickEvent?.Invoke(); }
public void Add(ref byte toHigh, ref byte toLow, byte valueHigh, byte valueLow, ref byte flags) { ushort to = BitUtils.BytesToUshort(toHigh, toLow); ushort value = BitUtils.BytesToUshort(valueHigh, valueLow); ushort result = (ushort)((to + value) & 0xFFFF); toHigh = BitUtils.MostSignificantByte(result); toLow = BitUtils.LeastSignificantByte(result); // Zero flag is not affected FlagUtils.SetFlag(Flag.N, false, ref flags); FlagUtils.SetFlag(Flag.H, (to & 0xFFF) + (value & 0xFFF) > 0xFFF, ref flags); FlagUtils.SetFlag(Flag.C, to + value > 0xFFFF, ref flags); TickEvent?.Invoke(); }
public void LoadAdjusted(ref byte destHigh, ref byte destLow, ushort value, byte addValue, ref byte flags) { ushort originalValue = value; sbyte signed = unchecked ((sbyte)addValue); FlagUtils.SetFlag(Flag.C, ((originalValue & 0xFF) + addValue) > 0xFF, ref flags); FlagUtils.SetFlag(Flag.H, (originalValue & 0x0F) + (addValue & 0x0F) > 0xF, ref flags); ushort result = (ushort)(value + signed); destHigh = BitUtils.MostSignificantByte(result); destLow = BitUtils.LeastSignificantByte(result); FlagUtils.SetFlag(Flag.Z, false, ref flags); FlagUtils.SetFlag(Flag.N, false, ref flags); TickEvent?.Invoke(); }
public void RotateLeftThroughCarry(ref byte register, ref byte flags, bool alwaysResetZero) { bool setCarry = register.IsBitSet(7); RotateLeft(ref register, FlagUtils.GetFlag(Flag.C, flags)); if (alwaysResetZero) { FlagUtils.SetFlag(Flag.Z, false, ref flags); } else { FlagUtils.SetFlag(Flag.Z, register == 0, ref flags); } FlagUtils.SetFlag(Flag.N, false, ref flags); FlagUtils.SetFlag(Flag.H, false, ref flags); FlagUtils.SetFlag(Flag.C, setCarry, ref flags); }
public void TestBit(byte register, int index, ref byte flags) { FlagUtils.SetFlag(Flag.Z, register.IsBitSet(index) == false, ref flags); FlagUtils.SetFlag(Flag.N, false, ref flags); FlagUtils.SetFlag(Flag.H, true, ref flags); }
public void ComplementCarry(ref byte flags) { FlagUtils.SetFlag(Flag.C, !FlagUtils.GetFlag(Flag.C, flags), ref flags); FlagUtils.SetFlag(Flag.H, false, ref flags); FlagUtils.SetFlag(Flag.N, false, ref flags); }
public void Complement(ref byte value, ref byte flags) { value = (byte)~value; FlagUtils.SetFlag(Flag.N, true, ref flags); FlagUtils.SetFlag(Flag.H, true, ref flags); }
public void SetCarry(ref byte flags) { FlagUtils.SetFlag(Flag.C, true, ref flags); FlagUtils.SetFlag(Flag.N, false, ref flags); FlagUtils.SetFlag(Flag.H, false, ref flags); }