예제 #1
0
        /// <summary>
        /// The LDIR instruction.
        /// </summary>
        byte LDIR()
        {
            FetchFinished();

            var sourceAddress = Registers.HL;
            var destAddress   = Registers.DE;
            var counter       = Registers.BC;
            var value         = ProcessorAgent.ReadFromMemory(sourceAddress.ToUShort());

            ProcessorAgent.WriteToMemory(destAddress.ToUShort(), value);

            Registers.HL = sourceAddress.Inc();
            Registers.DE = destAddress.Inc();
            counter      = counter.Dec();
            Registers.BC = counter;

            Registers.HF = 0;
            Registers.NF = 0;
            Registers.PF = (counter != 0);

            var valuePlusA = value.Add(Registers.A).GetLowByte();

            Registers.Flag3 = valuePlusA.GetBit(3);
            Registers.Flag5 = valuePlusA.GetBit(1);

            if (counter != 0)
            {
                Registers.PC = Registers.PC.Sub(2);
                return(21);
            }

            return(16);
        }
예제 #2
0
        /// <summary>
        /// The INDR instruction.
        /// </summary>
        byte INDR()
        {
            FetchFinished();

            var portNumber = Registers.C;
            var address    = Registers.HL;
            var value      = ProcessorAgent.ReadFromPort(portNumber);

            ProcessorAgent.WriteToMemory((ushort)address, value);

            Registers.HL--;
            var counter = Registers.B;

            counter      = (byte)(counter - 1);
            Registers.B  = counter;
            Registers.ZF = (counter == 0);
            Registers.NF = 1;
            Registers.SF = counter.GetBit(7);
            SetFlags3and5From(counter);

            if (counter != 0)
            {
                Registers.PC = (ushort)(Registers.PC - 2);
                return(21);
            }

            return(16);
        }
예제 #3
0
        /// <summary>
        /// The INDR instruction.
        /// </summary>
        byte INDR()
        {
            FetchFinished();

            var portNumber = Registers.C;
            var address    = Registers.HL;
            var value      = ProcessorAgent.ReadFromPort(portNumber);

            ProcessorAgent.WriteToMemory(address.ToUShort(), value);

            Registers.HL = address.Dec();
            var counter = Registers.B;

            counter      = counter.Dec();
            Registers.B  = counter;
            Registers.ZF = (counter == 0);
            Registers.NF = 1;
            Registers.SF = counter.GetBit(7);
            SetFlags3and5From(counter);

            if (counter != 0)
            {
                Registers.PC = Registers.PC.Sub(2);
                return(21);
            }

            return(16);
        }
예제 #4
0
        /// <summary>
        /// The LDIR instruction.
        /// </summary>
        byte LDIR()
        {
            FetchFinished();

            var sourceAddress = Registers.HL;
            var destAddress   = Registers.DE;
            var counter       = Registers.BC;
            var value         = ProcessorAgent.ReadFromMemory((ushort)sourceAddress);

            ProcessorAgent.WriteToMemory((ushort)destAddress, value);

            Registers.HL = (short)(sourceAddress + 1);
            Registers.DE = (short)(destAddress + 1);
            counter--;
            Registers.BC = counter;

            Registers.HF = 0;
            Registers.NF = 0;
            Registers.PF = (counter != 0);

            var valuePlusA = (byte)(value + Registers.A);

            Registers.Flag3 = valuePlusA.GetBit(3);
            Registers.Flag5 = valuePlusA.GetBit(1);

            if (counter != 0)
            {
                Registers.PC = (ushort)(Registers.PC - 2);
                return(21);
            }

            return(16);
        }
예제 #5
0
        /// <summary>
        /// The LD (nn),A instruction.
        /// </summary>
        private byte LD_aa_A()
        {
            var address = FetchWord().ToUShort();

            FetchFinished();

            ProcessorAgent.WriteToMemory(address, Registers.A);

            return(13);
        }
예제 #6
0
        /// <summary>
        /// The LD (DE),A instruction.
        /// </summary>
        byte LD_aDE_A()
        {
            FetchFinished();

            var newValue = Registers.A;
            var address  = Registers.DE.ToUShort();

            ProcessorAgent.WriteToMemory(address, newValue);

            return(7);
        }
예제 #7
0
        /// <summary>
        /// The LD (HL),A instruction.
        /// </summary>
        byte LD_aHL_A()
        {
            FetchFinished();

            var newValue = Registers.A;
            var address  = (ushort)Registers.HL;

            ProcessorAgent.WriteToMemory(address, newValue);

            return(7);
        }
예제 #8
0
        /// <summary>
        /// The LD (HL),n instruction.
        /// </summary>
        private byte LD_aHL_N()
        {
            var newValue = ProcessorAgent.FetchNextOpcode();

            FetchFinished();

            var address = (ushort)Registers.HL;

            ProcessorAgent.WriteToMemory(address, newValue);

            return(10);
        }
예제 #9
0
        /// <summary>
        /// The LD (IY+n),L instruction.
        /// </summary>
        byte LD_aIY_plus_n_L()
        {
            var offset = ProcessorAgent.FetchNextOpcode();

            FetchFinished();

            var newValue = Registers.L;
            var address  = Registers.IY.ToUShort().Add(offset.ToSignedByte());

            ProcessorAgent.WriteToMemory(address, newValue);

            return(19);
        }
예제 #10
0
        /// <summary>
        /// The LD (IY+n),L instruction.
        /// </summary>
        byte LD_aIY_plus_n_L()
        {
            var offset = ProcessorAgent.FetchNextOpcode();

            FetchFinished();

            var newValue = Registers.L;
            var address  = (ushort)(Registers.IY + (SByte)offset);

            ProcessorAgent.WriteToMemory(address, newValue);

            return(19);
        }
예제 #11
0
        /// <summary>
        /// The PUSH DE instruction.
        /// </summary>
        private byte PUSH_DE()
        {
            FetchFinished();

            var valueToPush = Registers.DE;
            var sp          = Registers.SP.Dec();

            ProcessorAgent.WriteToMemory(sp.ToUShort(), valueToPush.GetHighByte());
            sp = sp.Dec();
            ProcessorAgent.WriteToMemory(sp.ToUShort(), valueToPush.GetLowByte());
            Registers.SP = sp;

            return(11);
        }
예제 #12
0
        /// <summary>
        /// The PUSH DE instruction.
        /// </summary>
        private byte PUSH_DE()
        {
            FetchFinished();

            var valueToPush = Registers.DE;
            var sp          = (ushort)(Registers.SP - 1);

            ProcessorAgent.WriteToMemory(sp, valueToPush.GetHighByte());
            sp--;
            ProcessorAgent.WriteToMemory(sp, valueToPush.GetLowByte());
            Registers.SP = (short)sp;

            return(11);
        }
예제 #13
0
파일: RST .cs 프로젝트: rholdorf/Z80dotNet
        /// <summary>
        /// The RST 20h instruction.
        /// </summary>
        private byte RST_20()
        {
            FetchFinished();

            var valueToPush = (short)Registers.PC;
            var sp          = (ushort)(Registers.SP - 1);

            ProcessorAgent.WriteToMemory(sp, valueToPush.GetHighByte());
            sp--;
            ProcessorAgent.WriteToMemory(sp, valueToPush.GetLowByte());
            Registers.SP = (short)sp;
            Registers.PC = 0x20;

            return(11);
        }
예제 #14
0
        /// <summary>
        /// The CALL instruction.
        /// </summary>
        private byte CALL_nn()
        {
            var newAddress = FetchWord().ToUShort();

            FetchFinished();

            var valueToPush = Registers.PC.ToShort();
            var sp          = Registers.SP.Dec();

            ProcessorAgent.WriteToMemory(sp.ToUShort(), valueToPush.GetHighByte());
            sp = sp.Dec();
            ProcessorAgent.WriteToMemory(sp.ToUShort(), valueToPush.GetLowByte());
            Registers.SP = sp;
            Registers.PC = newAddress;

            return(17);
        }
예제 #15
0
        /// <summary>
        /// The CALL instruction.
        /// </summary>
        private byte CALL_nn()
        {
            var newAddress = (ushort)FetchWord();

            FetchFinished();

            var valueToPush = (short)Registers.PC;
            var sp          = (ushort)(Registers.SP - 1);

            ProcessorAgent.WriteToMemory(sp, valueToPush.GetHighByte());
            sp--;
            ProcessorAgent.WriteToMemory(sp, valueToPush.GetLowByte());
            Registers.SP = (short)sp;
            Registers.PC = newAddress;

            return(17);
        }
예제 #16
0
        /// <summary>
        /// The DEC (HL) instruction.
        /// </summary>
        private byte DEC_aHL()
        {
            FetchFinished();

            var address  = Registers.HL.ToUShort();
            var oldValue = ProcessorAgent.ReadFromMemory(address);
            var newValue = oldValue.Dec();

            ProcessorAgent.WriteToMemory(address, newValue);

            Registers.SF = newValue.GetBit(7);
            Registers.ZF = (newValue == 0);
            Registers.HF = ((newValue & 0x0F) == 0x0F);
            Registers.PF = (newValue == 0x7F);
            Registers.NF = 1;
            SetFlags3and5From(newValue);

            return(11);
        }
예제 #17
0
        /// <summary>
        /// The INC (HL) instruction.
        /// </summary>
        private byte INC_aHL()
        {
            FetchFinished();

            var address  = (ushort)Registers.HL;
            var oldValue = ProcessorAgent.ReadFromMemory(address);
            var newValue = (byte)(oldValue + 1);

            ProcessorAgent.WriteToMemory(address, newValue);

            Registers.SF = newValue.GetBit(7);
            Registers.ZF = (newValue == 0);
            Registers.HF = ((newValue & 0x0F) == 0x00);
            Registers.PF = (newValue == 0x80);
            Registers.NF = 0;
            SetFlags3and5From(newValue);

            return(11);
        }
예제 #18
0
        /// <summary>
        /// The DEC (IY+n) instruction.
        /// </summary>
        private byte DEC_aIY_plus_n()
        {
            var offset = ProcessorAgent.FetchNextOpcode();

            FetchFinished();

            var address  = Registers.IY.ToUShort().Add(offset.ToSignedByte());
            var oldValue = ProcessorAgent.ReadFromMemory(address);
            var newValue = oldValue.Dec();

            ProcessorAgent.WriteToMemory(address, newValue);

            Registers.SF = newValue.GetBit(7);
            Registers.ZF = (newValue == 0);
            Registers.HF = ((newValue & 0x0F) == 0x0F);
            Registers.PF = (newValue == 0x7F);
            Registers.NF = 1;
            SetFlags3and5From(newValue);

            return(23);
        }
예제 #19
0
        /// <summary>
        /// The DEC (IY+n) instruction.
        /// </summary>
        private byte DEC_aIY_plus_n()
        {
            var offset = ProcessorAgent.FetchNextOpcode();

            FetchFinished();

            var address  = (ushort)(Registers.IY + (SByte)offset);
            var oldValue = ProcessorAgent.ReadFromMemory(address);
            var newValue = (byte)(oldValue - 1);

            ProcessorAgent.WriteToMemory(address, newValue);

            Registers.SF = newValue.GetBit(7);
            Registers.ZF = (newValue == 0);
            Registers.HF = ((newValue & 0x0F) == 0x0F);
            Registers.PF = (newValue == 0x7F);
            Registers.NF = 1;
            SetFlags3and5From(newValue);

            return(23);
        }
예제 #20
0
        /// <summary>
        /// The RLD instruction.
        /// </summary>
        byte RLD()
        {
            FetchFinished();

            var memoryAddress = Registers.HL.ToUShort();

            var Avalue     = Registers.A;
            var HLcontents = ProcessorAgent.ReadFromMemory(memoryAddress);

            var newAvalue     = (byte)((Avalue & 0xF0) | ((HLcontents >> 4) & 0x0F));
            var newHLcontents = (byte)(((HLcontents << 4) & 0xF0) | (Avalue & 0x0F));

            Registers.A = newAvalue;
            ProcessorAgent.WriteToMemory(memoryAddress, newHLcontents);

            Registers.SF = newAvalue.GetBit(7);
            Registers.ZF = (newAvalue == 0);
            Registers.HF = 0;
            Registers.PF = Parity[newAvalue];
            Registers.NF = 0;
            SetFlags3and5From(newAvalue);

            return(18);
        }