示例#1
0
        public void XorBitwiseByte(IRegisters registers, IALU.TargetRegister targetRegister, byte value)
        {
            byte result;

            switch (targetRegister)
            {
            case IALU.TargetRegister.A:
                result = registers.A;
                break;

            case IALU.TargetRegister.F:
                result = registers.F;
                break;

            case IALU.TargetRegister.B:
                result = registers.B;
                break;

            case IALU.TargetRegister.C:
                result = registers.C;
                break;

            case IALU.TargetRegister.D:
                result = registers.D;
                break;

            case IALU.TargetRegister.E:
                result = registers.E;
                break;

            case IALU.TargetRegister.H:
                result = registers.H;
                break;

            case IALU.TargetRegister.L:
                result = registers.L;
                break;

            default:
                throw new ArgumentException();
            }
            result ^= value;

            if (result == 0)
            {
                registers.ZeroFlag = true;
            }
            registers.NegativeFlag  = false;
            registers.HalfCarryFlag = false;
            registers.FullCarryFlag = false;

            switch (targetRegister)
            {
            case IALU.TargetRegister.A:
                registers.A = result;
                break;

            case IALU.TargetRegister.F:
                registers.F = result;
                break;

            case IALU.TargetRegister.B:
                registers.B = result;
                break;

            case IALU.TargetRegister.C:
                registers.C = result;
                break;

            case IALU.TargetRegister.D:
                registers.D = result;
                break;

            case IALU.TargetRegister.E:
                registers.E = result;
                break;

            case IALU.TargetRegister.H:
                registers.H = result;
                break;

            case IALU.TargetRegister.L:
                registers.L = result;
                break;
            }
        }
示例#2
0
        public void DecrementRegister(IRegisters registers, IALU.TargetRegister targetRegister)
        {
            int  result;
            bool is16Bit = false;

            switch (targetRegister)
            {
            case IALU.TargetRegister.A:
                result = registers.A;
                break;

            case IALU.TargetRegister.F:
                result = registers.F;
                break;

            case IALU.TargetRegister.AF:
                is16Bit = true;
                result  = registers.AF;
                break;

            case IALU.TargetRegister.B:
                result = registers.B;
                break;

            case IALU.TargetRegister.C:
                result = registers.C;
                break;

            case IALU.TargetRegister.BC:
                is16Bit = true;
                result  = registers.BC;
                break;

            case IALU.TargetRegister.D:
                result = registers.D;
                break;

            case IALU.TargetRegister.E:
                result = registers.E;
                break;

            case IALU.TargetRegister.DE:
                is16Bit = true;
                result  = registers.DE;
                break;

            case IALU.TargetRegister.H:
                result = registers.H;
                break;

            case IALU.TargetRegister.L:
                result = registers.L;
                break;

            case IALU.TargetRegister.HL:
                is16Bit = true;
                result  = registers.HL;
                break;

            case IALU.TargetRegister.SP:
                is16Bit = true;
                result  = registers.SP;
                break;

            default:
                throw new ArgumentException();
            }
            int originalValue = result;

            result -= 1;

            if (!is16Bit)
            {
                registers.NegativeFlag = true;
                if ((result & 0xFF) == 0)
                {
                    registers.ZeroFlag = true;
                }
                if (!(((originalValue & 0x0F) - (1 & 0x0F)) < 0))
                {
                    registers.HalfCarryFlag = true;
                }
                //ignore carry flag
            }

            switch (targetRegister)
            {
            case IALU.TargetRegister.A:
                registers.A = (byte)result;
                break;

            case IALU.TargetRegister.F:
                registers.F = (byte)result;
                break;

            case IALU.TargetRegister.B:
                registers.B = (byte)result;
                break;

            case IALU.TargetRegister.C:
                registers.C = (byte)result;
                break;

            case IALU.TargetRegister.D:
                registers.D = (byte)result;
                break;

            case IALU.TargetRegister.E:
                registers.E = (byte)result;
                break;

            case IALU.TargetRegister.H:
                registers.H = (byte)result;
                break;

            case IALU.TargetRegister.L:
                registers.L = (byte)result;
                break;

            case IALU.TargetRegister.HL:
                registers.HL = (byte)result;
                break;

            case IALU.TargetRegister.SP:
                registers.SP = (byte)result;
                break;
            }
        }
示例#3
0
        public void SubtractUshort(IRegisters registers, IALU.TargetRegister targetRegister, ushort value, bool useCarry)
        {
            int result;

            switch (targetRegister)
            {
            case IALU.TargetRegister.AF:
                result = registers.AF;
                break;

            case IALU.TargetRegister.F:
                result = registers.F;
                break;

            case IALU.TargetRegister.BC:
                result = registers.BC;
                break;

            case IALU.TargetRegister.DE:
                result = registers.DE;
                break;

            case IALU.TargetRegister.HL:
                result = registers.HL;
                break;

            default:
                throw new ArgumentException();
            }
            int originalValue = result;

            result -= value + (useCarry && registers.FullCarryFlag ? 1 : 0);

            //Zero flag is ignored
            registers.NegativeFlag = true;
            if (!(((originalValue & 0x0FFF) - (value & 0x0FFF)) < 0))
            {
                registers.HalfCarryFlag = true;
            }
            if (result < 0)
            {
                registers.FullCarryFlag = true;
            }

            switch (targetRegister)
            {
            case IALU.TargetRegister.AF:
                registers.AF = (ushort)result;
                break;

            case IALU.TargetRegister.BC:
                registers.BC = (ushort)result;
                break;

            case IALU.TargetRegister.DE:
                registers.DE = (ushort)result;
                break;

            case IALU.TargetRegister.HL:
                registers.HL = (ushort)result;
                break;
            }
        }
示例#4
0
        public void SubtractSbyte(IRegisters registers, IALU.TargetRegister targetRegister, sbyte value, bool useCarry)
        {
            int result;

            switch (targetRegister)
            {
            case IALU.TargetRegister.A:
                result = registers.A;
                break;

            case IALU.TargetRegister.F:
                result = registers.F;
                break;

            case IALU.TargetRegister.B:
                result = registers.B;
                break;

            case IALU.TargetRegister.C:
                result = registers.C;
                break;

            case IALU.TargetRegister.D:
                result = registers.D;
                break;

            case IALU.TargetRegister.E:
                result = registers.E;
                break;

            case IALU.TargetRegister.H:
                result = registers.H;
                break;

            case IALU.TargetRegister.L:
                result = registers.L;
                break;

            default:
                throw new ArgumentException();
            }
            int originalValue = result;

            result -= value + (useCarry && registers.FullCarryFlag ? 1 : 0);

            registers.NegativeFlag = true;
            registers.ZeroFlag     = false;
            if (!(((originalValue & 0x0F) - (value & 0x0F)) < 0))
            {
                registers.HalfCarryFlag = true;
            }
            if (result < 0)
            {
                registers.FullCarryFlag = true;
            }

            switch (targetRegister)
            {
            case IALU.TargetRegister.A:
                registers.A = (byte)result;
                break;

            case IALU.TargetRegister.F:
                registers.F = (byte)result;
                break;

            case IALU.TargetRegister.B:
                registers.B = (byte)result;
                break;

            case IALU.TargetRegister.C:
                registers.C = (byte)result;
                break;

            case IALU.TargetRegister.D:
                registers.D = (byte)result;
                break;

            case IALU.TargetRegister.E:
                registers.E = (byte)result;
                break;

            case IALU.TargetRegister.H:
                registers.H = (byte)result;
                break;

            case IALU.TargetRegister.L:
                registers.L = (byte)result;
                break;
            }
        }
示例#5
0
        public void RotateRegister(IRegisters registers, IALU.TargetRegister targetRegister, IALU.RotateDirection direction, bool useCarry)
        {
            int result;

            switch (targetRegister)
            {
            case IALU.TargetRegister.A:
                result = registers.A;
                break;

            case IALU.TargetRegister.F:
                result = registers.F;
                break;

            case IALU.TargetRegister.B:
                result = registers.B;
                break;

            case IALU.TargetRegister.C:
                result = registers.C;
                break;

            case IALU.TargetRegister.D:
                result = registers.D;
                break;

            case IALU.TargetRegister.E:
                result = registers.E;
                break;

            case IALU.TargetRegister.H:
                result = registers.H;
                break;

            case IALU.TargetRegister.L:
                result = registers.L;
                break;

            default:
                throw new ArgumentException();
            }

            if (direction == IALU.RotateDirection.Left)
            {
                if (!useCarry)
                {
                    if ((result & 0x80) > 0)
                    {
                        registers.FullCarryFlag = true;
                    }
                    result = (result << 1) | ((result & 0x80) > 0 ? 0x01 : 0x00);
                }
                else
                {
                    bool currentCarry = registers.FullCarryFlag;
                    if ((result & 0x80) > 0)
                    {
                        registers.FullCarryFlag = true;
                    }
                    result = (result << 1) | (currentCarry ? 0x01 : 0x00);
                }
            }
            else
            {
                if (!useCarry)
                {
                    if ((result & 0x01) > 0)
                    {
                        registers.FullCarryFlag = true;
                    }
                    result = (result >> 1) | ((result & 0x01) > 0 ? 0x80 : 0x00);
                }
                else
                {
                    bool currentCarry = registers.FullCarryFlag;
                    if ((result & 0x10) > 0)
                    {
                        registers.FullCarryFlag = true;
                    }
                    result = (result >> 1) | (currentCarry ? 0x80 : 0x00);
                }
            }

            registers.NegativeFlag  = false;
            registers.ZeroFlag      = false;
            registers.HalfCarryFlag = false;

            switch (targetRegister)
            {
            case IALU.TargetRegister.A:
                registers.A = (byte)result;
                break;

            case IALU.TargetRegister.F:
                registers.F = (byte)result;
                break;

            case IALU.TargetRegister.B:
                registers.B = (byte)result;
                break;

            case IALU.TargetRegister.C:
                registers.C = (byte)result;
                break;

            case IALU.TargetRegister.D:
                registers.D = (byte)result;
                break;

            case IALU.TargetRegister.E:
                registers.E = (byte)result;
                break;

            case IALU.TargetRegister.H:
                registers.H = (byte)result;
                break;

            case IALU.TargetRegister.L:
                registers.L = (byte)result;
                break;
            }
        }
示例#6
0
        public void CompareByte(IRegisters registers, IALU.TargetRegister targetRegister, byte value)
        {
            int result;

            switch (targetRegister)
            {
            case IALU.TargetRegister.A:
                result = registers.A;
                break;

            case IALU.TargetRegister.F:
                result = registers.F;
                break;

            case IALU.TargetRegister.B:
                result = registers.B;
                break;

            case IALU.TargetRegister.C:
                result = registers.C;
                break;

            case IALU.TargetRegister.D:
                result = registers.D;
                break;

            case IALU.TargetRegister.E:
                result = registers.E;
                break;

            case IALU.TargetRegister.H:
                result = registers.H;
                break;

            case IALU.TargetRegister.L:
                result = registers.L;
                break;

            default:
                throw new ArgumentException();
            }
            int originalValue = result;

            result -= value;

            registers.NegativeFlag = true;
            if ((result & 0xFF) == 0)
            {
                registers.ZeroFlag = true;
            }
            if (!(((originalValue & 0x0F) - (value & 0x0F)) < 0))
            {
                registers.HalfCarryFlag = true;
            }
            if (result < 0)
            {
                registers.FullCarryFlag = true;
            }

            //don't register
        }