コード例 #1
0
ファイル: MiscUnit.cs プロジェクト: jarkkopa/GeemuBoy
        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);
        }
コード例 #2
0
ファイル: ALU.cs プロジェクト: jarkkopa/GeemuBoy
        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);
        }
コード例 #3
0
ファイル: ALU.cs プロジェクト: jarkkopa/GeemuBoy
        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);
        }
コード例 #4
0
ファイル: ALU.cs プロジェクト: jarkkopa/GeemuBoy
        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();
        }
コード例 #5
0
ファイル: ALU.cs プロジェクト: jarkkopa/GeemuBoy
        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();
        }
コード例 #6
0
ファイル: ALU.cs プロジェクト: jarkkopa/GeemuBoy
        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();
        }
コード例 #7
0
ファイル: LoadUnit.cs プロジェクト: jarkkopa/GeemuBoy
        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();
        }
コード例 #8
0
        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);
        }
コード例 #9
0
 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);
 }
コード例 #10
0
 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);
 }
コード例 #11
0
 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);
 }
コード例 #12
0
ファイル: MiscUnit.cs プロジェクト: jarkkopa/GeemuBoy
 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);
 }