Esempio n. 1
0
File: AND.cs Progetto: chazjn/Z80CPU
        protected override void AddOpcodes()
        {
            Opcodes.AddRange(new List <Opcode>
            {
                new Opcode("AND A", 0xA7, (z80) => { z80.A.Value = (byte)(z80.A.Value & z80.A.Value);  return(TStates.Count(4)); }),
                new Opcode("AND B", 0xA0, (z80) => { z80.A.Value = (byte)(z80.A.Value & z80.B.Value);  return(TStates.Count(4)); }),
                new Opcode("AND C", 0xA1, (z80) => { z80.A.Value = (byte)(z80.A.Value & z80.C.Value);  return(TStates.Count(4)); }),
                new Opcode("AND D", 0xA2, (z80) => { z80.A.Value = (byte)(z80.A.Value & z80.D.Value);  return(TStates.Count(4)); }),
                new Opcode("AND E", 0xA3, (z80) => { z80.A.Value = (byte)(z80.A.Value & z80.E.Value);  return(TStates.Count(4)); }),
                new Opcode("AND H", 0xA4, (z80) => { z80.A.Value = (byte)(z80.A.Value & z80.H.Value);  return(TStates.Count(4)); }),
                new Opcode("AND L", 0xA5, (z80) => { z80.A.Value = (byte)(z80.A.Value & z80.L.Value);  return(TStates.Count(4)); }),

                new Opcode("AND n", 0xE6, Oprand.Any, (z80) => { z80.A.Value = (byte)(z80.A.Value & z80.Buffer[1]);  return(TStates.Count(7)); }),

                new Opcode("AND (HL)", 0xA6, (z80) =>
                {
                    z80.A.Value = (byte)(z80.A.Value & z80.Memory.Get(z80.HL));
                    return(TStates.Count(7));
                }),

                new Opcode("AND (IX + d)", 0xDD, 0xA6, Oprand.Any, (z80) =>
                {
                    var index   = (byte)(z80.IX.Value + z80.Buffer[2]);
                    z80.A.Value = (byte)(z80.A.Value & index);
                    return(TStates.Count(19));
                }),

                new Opcode("AND (IY + d)", 0xFD, 0xA6, Oprand.Any, (z80) =>
                {
                    var index   = (byte)(z80.IY.Value + z80.Buffer[2]);
                    z80.A.Value = (byte)(z80.A.Value & index);
                    return(TStates.Count(19));
                })
            });
        }
Esempio n. 2
0
File: NOP.cs Progetto: chazjn/Z80CPU
 protected override void AddOpcodes()
 {
     Opcodes.Add(new Opcode("NOP", 0x0, (z80) =>
     {
         return(TStates.Count(4));
     }));
 }
Esempio n. 3
0
File: ADC.cs Progetto: chazjn/Z80CPU
        protected override void AddOpcodes()
        {
            Opcodes.AddRange(new List<Opcode>
            {
                new Opcode("ADC A, A", 0x8F, z80 =>
                {
                    return TStates.Count(4);
                }),

                new Opcode("ADC A, B", 0x88, z80 =>
                {
                    return TStates.Count(4);
                }),

                new Opcode("ADC A, C", 0x89, z80 =>
                {
                    return TStates.Count(4);
                }),

                new Opcode("ADC A, D", 0x8A, z80 =>
                {
                    return TStates.Count(4);
                }),

                new Opcode("ADC A, E", 0x8B, z80 =>
                {
                    return TStates.Count(4);
                }),

                new Opcode("ADC A, H", 0x8C, z80 =>
                {
                    return TStates.Count(4);
                }),

                new Opcode("ADC A, L", 0x8D, z80 =>
                {
                    return TStates.Count(4);
                }),

                new Opcode("ADC A, n", 0xCE, Oprand.Any, z80 =>
                {
                    return TStates.Count(7);
                }),

                new Opcode("ADC A, (HL)", 0x8E, z80 =>
                {
                    return TStates.Count(7);
                }),

                new Opcode("ADC A, (IX + d)", 0xDD, 0x8E, Oprand.Any, z80 =>
                {
                    return TStates.Count(19);
                }),

                new Opcode("ADC A, (IY + d)", 0xFD, 0x8E, Oprand.Any, z80 =>
                {
                    return TStates.Count(19);
                }),
            });
        }
Esempio n. 4
0
File: IN.cs Progetto: chazjn/Z80CPU
        public TStates SetRegister(Z80 z80, Register8 register)
        {
            var address = ByteHelper.CreateUShort(z80.B.Value, z80.C.Value);

            register.Value = z80.Ports.GetByte(address);
            return(TStates.Count(12));
        }
Esempio n. 5
0
File: IN.cs Progetto: chazjn/Z80CPU
        public TStates SetA(Z80 z80)
        {
            var low     = z80.Buffer[1];
            var address = ByteHelper.CreateUShort(z80.A.Value, low);

            z80.A.Value = z80.Ports.GetByte(address);
            return(TStates.Count(11));
        }
Esempio n. 6
0
 protected override void AddOpcodes()
 {
     Opcodes.Add(new Opcode("EI", 0xFB, (z80) =>
     {
         z80.InteruptsEnabled = true;
         return(TStates.Count(4));
     }));
 }
Esempio n. 7
0
File: EX.cs Progetto: chazjn/Z80CPU
        private TStates ExchangeRegisters(Register16 register1, Register16 register2)
        {
            var register1Value = register1.Value;

            register1.Value = register2.Value;
            register2.Value = register1Value;
            return(TStates.Count(4));
        }
Esempio n. 8
0
        protected override void AddOpcodes()
        {
            Opcodes.AddRange(new List <Opcode>
            {
                new Opcode("LD BC, (nn)", 0xED, 0x4B, Oprand.Any, Oprand.Any, (z80) => { return(LoadFromMemoryIntoRegister(z80, z80.BC)); }),
                new Opcode("LD DE, (nn)", 0xED, 0x5B, Oprand.Any, Oprand.Any, (z80) => { return(LoadFromMemoryIntoRegister(z80, z80.DE)); }),
                new Opcode("LD HL, (nn)", 0xED, 0x6B, Oprand.Any, Oprand.Any, (z80) => { return(LoadFromMemoryIntoRegister(z80, z80.HL)); }),
                new Opcode("LD SP, (nn)", 0xED, 0x7B, Oprand.Any, Oprand.Any, (z80) => { return(LoadFromMemoryIntoRegister(z80, z80.SP)); }),

                new Opcode("LD A, n", 0x3E, Oprand.Any, (z80) => { z80.A.Value = z80.Buffer[1]; return(TStates.Count(7)); }),
                new Opcode("LD B, n", 0x06, Oprand.Any, (z80) => { z80.B.Value = z80.Buffer[1]; return(TStates.Count(7)); }),
                new Opcode("LD C, n", 0x0E, Oprand.Any, (z80) => { z80.C.Value = z80.Buffer[1]; return(TStates.Count(7)); }),
                new Opcode("LD D, n", 0x16, Oprand.Any, (z80) => { z80.D.Value = z80.Buffer[1]; return(TStates.Count(7)); }),
                new Opcode("LD E, n", 0x1E, Oprand.Any, (z80) => { z80.E.Value = z80.Buffer[1]; return(TStates.Count(7)); }),
                new Opcode("LD H, n", 0x26, Oprand.Any, (z80) => { z80.H.Value = z80.Buffer[1]; return(TStates.Count(7)); }),
                new Opcode("LD L, n", 0x2E, Oprand.Any, (z80) => { z80.L.Value = z80.Buffer[1]; return(TStates.Count(7)); }),

                new Opcode("LD BC, nn", 0x01, Oprand.Any, Oprand.Any, (z80) => { return(LoadIntoRegister(z80, z80.BC)); }),
                new Opcode("LD DE, nn", 0x11, Oprand.Any, Oprand.Any, (z80) => { return(LoadIntoRegister(z80, z80.DE)); }),
                new Opcode("LD HL, nn", 0x21, Oprand.Any, Oprand.Any, (z80) => { return(LoadIntoRegister(z80, z80.HL)); }),
                new Opcode("LD SP, nn", 0x31, Oprand.Any, Oprand.Any, (z80) => { return(LoadIntoRegister(z80, z80.SP)); }),

                //page 295


                new Opcode("LD (BC), A", 0x02, (z80) =>
                {
                    var bc = z80.BC.Value;
                    var a  = z80.A.Value;
                    z80.Memory.Set(bc, a);
                    return(TStates.Count(7));
                }),

                new Opcode("LD (DE), A", 0x12, (z80) =>
                {
                    var de = z80.DE.Value;
                    var a  = z80.A.Value;
                    z80.Memory.Set(de, a);
                    return(TStates.Count(7));
                }),

                new Opcode("LD (HL), n", 0x36, Oprand.Any, (z80) =>
                {
                    var hl    = z80.HL.Value;
                    var value = z80.Buffer[1];
                    z80.Memory.Set(hl, value);
                    return(TStates.Count(10));
                }),

                new Opcode("LD (HL), A", 0x77, (z80) => { z80.Memory.Set(z80.HL, z80.A.Value); return(TStates.Count(7)); }),
                new Opcode("LD (HL), B", 0x70, (z80) => { z80.Memory.Set(z80.HL, z80.B.Value); return(TStates.Count(7)); }),
                new Opcode("LD (HL), C", 0x71, (z80) => { z80.Memory.Set(z80.HL, z80.C.Value); return(TStates.Count(7)); }),
                new Opcode("LD (HL), D", 0x72, (z80) => { z80.Memory.Set(z80.HL, z80.D.Value); return(TStates.Count(7)); }),
                new Opcode("LD (HL), E", 0x73, (z80) => { z80.Memory.Set(z80.HL, z80.E.Value); return(TStates.Count(7)); }),
                new Opcode("LD (HL), H", 0x74, (z80) => { z80.Memory.Set(z80.HL, z80.H.Value); return(TStates.Count(7)); }),
                new Opcode("LD (HL), L", 0x75, (z80) => { z80.Memory.Set(z80.HL, z80.L.Value); return(TStates.Count(7)); })
            });
        }
Esempio n. 9
0
        private TStates LoadFromMemoryIntoRegister(Z80 z80, Register16 register)
        {
            var address = ByteHelper.CreateUShort(z80.Buffer[3], z80.Buffer[2]);
            var low     = z80.Memory.Get(address);
            var high    = z80.Memory.Get(++address);

            register.Value = ByteHelper.CreateUShort(high, low);
            return(TStates.Count(20));
        }
Esempio n. 10
0
File: ADD.cs Progetto: chazjn/Z80CPU
        protected override void AddOpcodes()
        {
            Opcodes.AddRange(new List <Opcode>
            {
                new Opcode("ADD A, (HL)", 0x86, (z80) => {
                    var value = z80.Memory.Get(z80.HL);
                    z80.A.Add(value);
                    return(TStates.Count(7));
                }),

                new Opcode("ADD A, (IX + d)", 0xDD, 0x86, Oprand.Any, (z80) =>
                {
                    var offset    = z80.Buffer[2];
                    var ix_offset = z80.IX.Value + offset;
                    var value     = z80.Memory.Get((ushort)ix_offset);
                    z80.A.Add(value);
                    return(TStates.Count(17));
                }),

                new Opcode("ADD A, (IY + d)", 0xFD, 0x86, Oprand.Any, (z80) =>
                {
                    var offset    = z80.Buffer[2];
                    var iy_offset = z80.IY.Value + offset;
                    var value     = z80.Memory.Get((ushort)iy_offset);
                    z80.A.Add(value);
                    return(TStates.Count(17));
                }),

                new Opcode("ADD A, n", 0xC6, Oprand.Any, (z80) => { z80.A.Add(z80.Buffer[1]); return(TStates.Count(7)); }),
                new Opcode("ADD A, A", 0x87, (z80) => { z80.A.Add(z80.A.Value); return(TStates.Count(4)); }),
                new Opcode("ADD A, B", 0x80, (z80) => { z80.A.Add(z80.B.Value); return(TStates.Count(4)); }),
                new Opcode("ADD A, C", 0x81, (z80) => { z80.A.Add(z80.C.Value); return(TStates.Count(4)); }),
                new Opcode("ADD A, D", 0x82, (z80) => { z80.A.Add(z80.D.Value); return(TStates.Count(4)); }),
                new Opcode("ADD A, E", 0x83, (z80) => { z80.A.Add(z80.E.Value); return(TStates.Count(4)); }),
                new Opcode("ADD A, H", 0x84, (z80) => { z80.A.Add(z80.H.Value); return(TStates.Count(4)); }),
                new Opcode("ADD A, L", 0x85, (z80) => { z80.A.Add(z80.L.Value); return(TStates.Count(4)); }),

                /*
                 * new Opcode("ADD HL, BC", 0x09, (z80) => { AddToRegister(z80, z80.HL, z80.BC.Value); }),
                 * new Opcode("ADD HL, DE", 0x19, (z80) => { AddToRegister(z80, z80.HL, z80.DE.Value); }),
                 * new Opcode("ADD HL, HL", 0x29, (z80) => { AddToRegister(z80, z80.HL, z80.HL.Value); }),
                 * new Opcode("ADD HL, SP", 0x39, (z80) => { AddToRegister(z80, z80.HL, z80.SP.Value); }),
                 *
                 * new Opcode("ADD IX, BC", 0xDD, 0x09, (z80) => { AddToRegister(z80, z80.IX, z80.BC.Value); }),
                 * new Opcode("ADD IX, DE", 0xDD, 0x19, (z80) => { AddToRegister(z80, z80.IX, z80.DE.Value); }),
                 * new Opcode("ADD IX, IX", 0xDD, 0x29, (z80) => { AddToRegister(z80, z80.IX, z80.IX.Value); }),
                 * new Opcode("ADD IX, SP", 0xDD, 0x39, (z80) => { AddToRegister(z80, z80.IX, z80.SP.Value); }),
                 *
                 * new Opcode("ADD IY, BC", 0xFD, 0x09, (z80) => { AddToRegister(z80, z80.IY, z80.BC.Value); }),
                 * new Opcode("ADD IY, DE", 0xFD, 0x19, (z80) => { AddToRegister(z80, z80.IY, z80.DE.Value); }),
                 * new Opcode("ADD IY, IY", 0xFD, 0x29, (z80) => { AddToRegister(z80, z80.IY, z80.IY.Value); }),
                 * new Opcode("ADD IY, SP", 0xFD, 0x39, (z80) => { AddToRegister(z80, z80.IY, z80.SP.Value); })
                 */
            });
        }
Esempio n. 11
0
        private TStates Jump(Z80 z80, bool performJump)
        {
            if (!performJump)
            {
                return(TStates.Count(7));
            }

            //TODO: test 2s-complement arithmitic
            z80.PC.Value = (ushort)(z80.PC.Value + z80.Buffer[1]);
            return(TStates.Count(12));
        }
Esempio n. 12
0
 protected override void AddOpcodes()
 {
     Opcodes.AddRange(new List <Opcode>
     {
         new Opcode("PUSH BC", 0xC5, (z80) => { Push(z80, z80.BC); return(TStates.Count(11)); }),
         new Opcode("PUSH DE", 0xD5, (z80) => { Push(z80, z80.DE); return(TStates.Count(11)); }),
         new Opcode("PUSH HL", 0xE5, (z80) => { Push(z80, z80.HL); return(TStates.Count(11)); }),
         new Opcode("PUSH AF", 0xF5, (z80) => { Push(z80, z80.AF); return(TStates.Count(11)); }),
         new Opcode("PUSH IX", 0xDD, 0xE5, (z80) => { Push(z80, z80.IX); return(TStates.Count(15)); }),
         new Opcode("PUSH IY", 0xFD, 0xE5, (z80) => { Push(z80, z80.IY); return(TStates.Count(15)); }),
     });
 }
Esempio n. 13
0
File: EX.cs Progetto: chazjn/Z80CPU
        private TStates ExchangeStackPointer(Z80 z80, Register16 register)
        {
            var low  = register.Low.Value;
            var high = register.High.Value;
            var sp   = z80.SP.Value;

            register.Low.Value  = z80.Memory.Get(sp);
            register.High.Value = z80.Memory.Get((ushort)(sp + 1));

            z80.Memory.Set(sp, low);
            z80.Memory.Set((ushort)(sp + 1), high);

            return(TStates.Count(19));
        }
Esempio n. 14
0
File: RET.cs Progetto: chazjn/Z80CPU
 protected override void AddOpcodes()
 {
     Opcodes.AddRange(new List <Opcode>
     {
         new Opcode("RET", 0xC9, z80 => { Ret(z80, true); return(TStates.Count(10)); }),
         new Opcode("RET NZ", 0xC0, z80 => { return(Ret(z80, !z80.F.Zero)); }),
         new Opcode("RET Z", 0xC8, z80 => { return(Ret(z80, z80.F.Zero)); }),
         new Opcode("RET NC", 0xD0, z80 => { return(Ret(z80, !z80.F.Carry)); }),
         new Opcode("RET C", 0xD8, z80 => { return(Ret(z80, z80.F.Carry)); }),
         new Opcode("RET PO", 0xE0, z80 => { return(Ret(z80, !z80.F.ParityOrOverflow)); }),
         new Opcode("RET PE", 0xE8, z80 => { return(Ret(z80, z80.F.ParityOrOverflow)); }),
         new Opcode("RET P", 0xF0, z80 => { return(Ret(z80, !z80.F.Sign)); }),
         new Opcode("RET M", 0xF8, z80 => { return(Ret(z80, z80.F.Sign)); }),
     });
 }
Esempio n. 15
0
File: IND.cs Progetto: chazjn/Z80CPU
        protected override void AddOpcodes()
        {
            Opcodes.Add(new Opcode("IND", 0xED, 0xAA, (z80) =>
            {
                var value = z80.Ports.GetByte(z80.C.Value);
                z80.Memory.Set(z80.HL.Value, value);

                z80.HL.Value--;
                z80.B.Value--;

                z80.F.Zero = z80.B.Value.IsZero();

                return(TStates.Count(16));
            }));
        }
Esempio n. 16
0
File: LDI.cs Progetto: chazjn/Z80CPU
        protected override void AddOpcodes()
        {
            Opcodes.Add(new Opcode("LDI", 0xED, 0xA0, (z80) =>
            {
                var value = z80.Memory.Get(z80.HL.Value);
                z80.Memory.Set(z80.DE.Value, value);

                z80.DE.Value++;
                z80.HL.Value++;
                z80.BC.Value--;

                z80.F.ParityOrOverflow = !z80.BC.Value.IsZero();
                return(TStates.Count(16));
            }));
        }
Esempio n. 17
0
File: RET.cs Progetto: chazjn/Z80CPU
        private TStates Ret(Z80 z80, bool invokeReturn)
        {
            if (invokeReturn)
            {
                z80.PC.Low.Value  = z80.Memory.Get(z80.SP);
                z80.PC.High.Value = z80.Memory.Get((ushort)(z80.SP.Value + 1));

                z80.SP.Increment();
                z80.SP.Increment();

                return(TStates.Count(11));
            }

            return(TStates.Count(5));
        }
Esempio n. 18
0
        public TStates Call(Z80 z80, bool performCall)
        {
            if (!performCall)
            {
                return(TStates.Count(10));
            }

            z80.SP.Decrement();
            z80.Memory.Set(z80.SP.Value, z80.PC.High.Value);
            z80.SP.Decrement();
            z80.Memory.Set(z80.SP.Value, z80.PC.Low.Value);

            z80.PC.Low.Value  = z80.Memory.Get((ushort)(z80.PC.Value - 1));
            z80.PC.High.Value = z80.Memory.Get((ushort)(z80.PC.Value - 2));

            return(TStates.Count(17));
        }
Esempio n. 19
0
        protected override void AddOpcodes()
        {
            Opcodes.AddRange(new List <Opcode>
            {
                new Opcode("INC A", 0x3C, (z80) => { z80.A.Increment(); return(TStates.Count(4)); }),
                new Opcode("INC B", 0x04, (z80) => { z80.B.Increment(); return(TStates.Count(4)); }),
                new Opcode("INC C", 0x0C, (z80) => { z80.C.Increment(); return(TStates.Count(4)); }),
                new Opcode("INC D", 0x14, (z80) => { z80.D.Increment(); return(TStates.Count(4)); }),
                new Opcode("INC E", 0x1C, (z80) => { z80.E.Increment(); return(TStates.Count(4)); }),
                new Opcode("INC H", 0x24, (z80) => { z80.H.Increment(); return(TStates.Count(4)); }),
                new Opcode("INC L", 0x2C, (z80) => { z80.L.Increment(); return(TStates.Count(4)); }),

                new Opcode("INC BC", 0x03, (z80) => { z80.BC.Increment(); return(TStates.Count(11)); }).SetAllFlagsAffectToNone(),
                new Opcode("INC DE", 0x13, (z80) => { z80.DE.Increment(); return(TStates.Count(11)); }).SetAllFlagsAffectToNone(),
                new Opcode("INC HL", 0x23, (z80) => { z80.HL.Increment(); return(TStates.Count(11)); }).SetAllFlagsAffectToNone(),
                new Opcode("INC SP", 0x33, (z80) => { z80.SP.Increment(); return(TStates.Count(11)); }).SetAllFlagsAffectToNone(),

                new Opcode("INC (HL)", 0x34, (z80) =>
                {
                    var value = z80.Memory.Get(z80.HL);
                    z80.Memory.Set(z80.HL, ++value);
                    return(TStates.Count(11));
                }).SetAllFlagsAffectToNone(),

                new Opcode("INC (IX + d)", 0xDD, 0x34, (z80) =>
                {
                    var offset = z80.GetByte();
                    var index  = (ushort)(z80.IX.Value + offset);
                    var value  = z80.Memory.Get(index);
                    z80.Memory.Set(index, ++value);
                    return(TStates.Count(23));
                }).SetAllFlagsAffectToNone(),

                new Opcode("INC (IY + d)", 0xFD, 0x34, (z80) =>
                {
                    var offset = z80.GetByte();
                    var index  = (ushort)(z80.IY.Value + offset);
                    var value  = z80.Memory.Get(index);
                    z80.Memory.Set(index, ++value);
                    return(TStates.Count(23));
                }).SetAllFlagsAffectToNone(),

                new Opcode("INC IX", 0xDD, 0x23, (z80) => { z80.IX.Increment(); return(TStates.Count(10)); }).SetAllFlagsAffectToNone(),
                new Opcode("INC IY", 0xFD, 0x23, (z80) => { z80.IY.Increment(); return(TStates.Count(10)); }).SetAllFlagsAffectToNone(),
            });
        }
Esempio n. 20
0
        protected override void AddOpcodes()
        {
            Opcodes.Add(new Opcode("HALT", 0x76, z80 =>
            {
                var nop = new NOP().Opcodes.First();
                while (true)
                {
                    // excute nop
                    nop.Execute(z80);

                    //check if reset has been received

                    //check if interupt has been received
                    break;
                }
                return(TStates.Count(0));
            }));
        }
Esempio n. 21
0
File: EXX.cs Progetto: chazjn/Z80CPU
        protected override void AddOpcodes()
        {
            Opcodes.Add(new Opcode("EXX", 0xD9, (z80) =>
            {
                var bc = z80.BC.Value;
                var de = z80.DE.Value;
                var hl = z80.HL.Value;

                z80.BC.Value = z80.BC_.Value;
                z80.DE.Value = z80.DE_.Value;
                z80.HL.Value = z80.HL_.Value;

                z80.BC_.Value = bc;
                z80.DE_.Value = de;
                z80.HL_.Value = hl;

                return(TStates.Count(4));
            }));
        }
Esempio n. 22
0
File: POP.cs Progetto: chazjn/Z80CPU
        //TODO: check low/high byte orders
        protected override void AddOpcodes()
        {
            Opcodes.AddRange(new List <Opcode>
            {
                new Opcode("POP BC", 0xC1, (z80) =>
                {
                    Pop(z80, z80.BC);
                    return(TStates.Count(10));
                }),

                new Opcode("POP DE", 0xD1, (z80) =>
                {
                    Pop(z80, z80.DE);
                    return(TStates.Count(10));
                }),

                new Opcode("POP HL", 0xE1, (z80) =>
                {
                    Pop(z80, z80.HL);
                    return(TStates.Count(10));
                }),

                new Opcode("POP AF", 0x11, (z80) =>
                {
                    Pop(z80, z80.AF);
                    return(TStates.Count(10));
                }),

                new Opcode("POP IX", 0xDD, 0xE1, (z80) =>
                {
                    Pop(z80, z80.IX);
                    return(TStates.Count(14));
                }),

                new Opcode("POP IY", 0xDD, 0xE1, (z80) =>
                {
                    Pop(z80, z80.IY);
                    return(TStates.Count(14));
                })
            });
        }
Esempio n. 23
0
        protected override void AddOpcodes()
        {
            Opcodes.Add(new Opcode("LDDR", 0xED, 0xB8, (z80) =>
            {
                var value = z80.Memory.Get(z80.HL);
                z80.Memory.Set(z80.DE, value);

                z80.DE.Decrement();
                z80.HL.Decrement();
                z80.BC.Decrement();

                if (z80.BC.IsNotZero)
                {
                    z80.PC.Decrement();
                    z80.PC.Decrement();
                    return(TStates.Count(21));
                }

                return(TStates.Count(16));
            }));
        }
Esempio n. 24
0
        protected override void AddOpcodes()
        {
            Opcodes.Add(new Opcode("DJNZ e", 0x10, (z80) =>
            {
                z80.B.Value--;

                if (z80.B.Value.IsZero())
                {
                    var offset   = z80.Memory.Get(z80.PC.Value);
                    var pc       = z80.PC.Value + (sbyte)offset;
                    z80.PC.Value = (ushort)pc;
                    return(TStates.Count(8));
                }
                else
                {
                    //increment PC to skip the offset
                    z80.PC.Increment();
                    return(TStates.Count(13));
                }
            }));
        }
Esempio n. 25
0
        protected override void AddOpcodes()
        {
            Opcodes.Add(new Opcode("LDIR", 0xED, 0xB0, (z80) =>
            {
                var value = z80.Memory.Get(z80.HL.Value);
                z80.Memory.Set(z80.DE.Value, value);

                z80.DE.Value++;
                z80.HL.Value++;
                z80.BC.Value--;

                if (z80.BC.Value.IsZero())
                {
                    return(TStates.Count(16));
                }
                else
                {
                    z80.PC.Value--;
                    z80.PC.Value--;
                    return(TStates.Count(21));
                }
            }));
        }
Esempio n. 26
0
 private TStates LoadIntoRegister(Z80 z80, Register16 register)
 {
     register.Value = ByteHelper.CreateUShort(z80.Buffer[2], z80.Buffer[1]);
     return(TStates.Count(10));
 }
Esempio n. 27
0
File: IM.cs Progetto: chazjn/Z80CPU
 protected override void AddOpcodes()
 {
     Opcodes.AddRange(new List <Opcode>
     {
         new Opcode("IM 0", 0xED, 0x46, (z80) => { z80.InteruptMode = InterruptMode.Mode0; return(TStates.Count(8)); }),
         new Opcode("IM 1", 0xED, 0x56, (z80) => { z80.InteruptMode = InterruptMode.Mode1; return(TStates.Count(8)); }),
         new Opcode("IM 2", 0xED, 0x5E, (z80) => { z80.InteruptMode = InterruptMode.Mode2; return(TStates.Count(8)); }),
     });
 }
Esempio n. 28
0
File: BIT.cs Progetto: chazjn/Z80CPU
        protected override void AddOpcodes()
        {
            Opcodes.AddRange(new List <Opcode>
            {
                new Opcode("BIT 0, (HL)", 0xCB, 0x46, (z80) => { z80.F.Zero = z80.Memory.Get(z80.HL.Value).GetBit(0).IsZero(); return(TStates.Count(12)); }),
                new Opcode("BIT 1, (HL)", 0xCB, 0x4E, (z80) => { z80.F.Zero = z80.Memory.Get(z80.HL.Value).GetBit(1).IsZero(); return(TStates.Count(12)); }),
                new Opcode("BIT 2, (HL)", 0xCB, 0x56, (z80) => { z80.F.Zero = z80.Memory.Get(z80.HL.Value).GetBit(2).IsZero(); return(TStates.Count(12)); }),
                new Opcode("BIT 3, (HL)", 0xCB, 0x5E, (z80) => { z80.F.Zero = z80.Memory.Get(z80.HL.Value).GetBit(3).IsZero(); return(TStates.Count(12)); }),
                new Opcode("BIT 4, (HL)", 0xCB, 0x66, (z80) => { z80.F.Zero = z80.Memory.Get(z80.HL.Value).GetBit(4).IsZero(); return(TStates.Count(12)); }),
                new Opcode("BIT 5, (HL)", 0xCB, 0x6E, (z80) => { z80.F.Zero = z80.Memory.Get(z80.HL.Value).GetBit(5).IsZero(); return(TStates.Count(12)); }),
                new Opcode("BIT 6, (HL)", 0xCB, 0x76, (z80) => { z80.F.Zero = z80.Memory.Get(z80.HL.Value).GetBit(6).IsZero(); return(TStates.Count(12)); }),
                new Opcode("BIT 7, (HL)", 0xCB, 0x7E, (z80) => { z80.F.Zero = z80.Memory.Get(z80.HL.Value).GetBit(7).IsZero(); return(TStates.Count(12)); }),


                new Opcode("BIT 0, (IX + d)", 0xDD, 0xCB, Oprand.Any, 0x46, (z80) => { z80.F.Zero = z80.Memory.Get((ushort)(z80.IX.Value + z80.Buffer[2])).GetBit(0).IsZero(); return(TStates.Count(20)); }),
                new Opcode("BIT 1, (IX + d)", 0xDD, 0xCB, Oprand.Any, 0x4E, (z80) => { z80.F.Zero = z80.Memory.Get((ushort)(z80.IX.Value + z80.Buffer[2])).GetBit(1).IsZero(); return(TStates.Count(20)); }),
                new Opcode("BIT 2, (IX + d)", 0xDD, 0xCB, Oprand.Any, 0x56, (z80) => { z80.F.Zero = z80.Memory.Get((ushort)(z80.IX.Value + z80.Buffer[2])).GetBit(2).IsZero(); return(TStates.Count(20)); }),
                new Opcode("BIT 3, (IX + d)", 0xDD, 0xCB, Oprand.Any, 0x5E, (z80) => { z80.F.Zero = z80.Memory.Get((ushort)(z80.IX.Value + z80.Buffer[2])).GetBit(3).IsZero(); return(TStates.Count(20)); }),
                new Opcode("BIT 4, (IX + d)", 0xDD, 0xCB, Oprand.Any, 0x66, (z80) => { z80.F.Zero = z80.Memory.Get((ushort)(z80.IX.Value + z80.Buffer[2])).GetBit(4).IsZero(); return(TStates.Count(20)); }),
                new Opcode("BIT 5, (IX + d)", 0xDD, 0xCB, Oprand.Any, 0x6E, (z80) => { z80.F.Zero = z80.Memory.Get((ushort)(z80.IX.Value + z80.Buffer[2])).GetBit(5).IsZero(); return(TStates.Count(20)); }),
                new Opcode("BIT 6, (IX + d)", 0xDD, 0xCB, Oprand.Any, 0x76, (z80) => { z80.F.Zero = z80.Memory.Get((ushort)(z80.IX.Value + z80.Buffer[2])).GetBit(6).IsZero(); return(TStates.Count(20)); }),
                new Opcode("BIT 7, (IX + d)", 0xDD, 0xCB, Oprand.Any, 0x7E, (z80) => { z80.F.Zero = z80.Memory.Get((ushort)(z80.IX.Value + z80.Buffer[2])).GetBit(7).IsZero(); return(TStates.Count(20)); }),

                new Opcode("BIT 0, (IY + d)", 0xFD, 0xCB, Oprand.Any, 0x46, (z80) => { z80.F.Zero = z80.Memory.Get((ushort)(z80.IY.Value + z80.Buffer[2])).GetBit(0).IsZero(); return(TStates.Count(20)); }),
                new Opcode("BIT 1, (IY + d)", 0xFD, 0xCB, Oprand.Any, 0x4E, (z80) => { z80.F.Zero = z80.Memory.Get((ushort)(z80.IY.Value + z80.Buffer[2])).GetBit(1).IsZero(); return(TStates.Count(20)); }),
                new Opcode("BIT 2, (IY + d)", 0xFD, 0xCB, Oprand.Any, 0x56, (z80) => { z80.F.Zero = z80.Memory.Get((ushort)(z80.IY.Value + z80.Buffer[2])).GetBit(2).IsZero(); return(TStates.Count(20)); }),
                new Opcode("BIT 3, (IY + d)", 0xFD, 0xCB, Oprand.Any, 0x5E, (z80) => { z80.F.Zero = z80.Memory.Get((ushort)(z80.IY.Value + z80.Buffer[2])).GetBit(3).IsZero(); return(TStates.Count(20)); }),
                new Opcode("BIT 4, (IY + d)", 0xFD, 0xCB, Oprand.Any, 0x66, (z80) => { z80.F.Zero = z80.Memory.Get((ushort)(z80.IY.Value + z80.Buffer[2])).GetBit(4).IsZero(); return(TStates.Count(20)); }),
                new Opcode("BIT 5, (IY + d)", 0xFD, 0xCB, Oprand.Any, 0x6E, (z80) => { z80.F.Zero = z80.Memory.Get((ushort)(z80.IY.Value + z80.Buffer[2])).GetBit(5).IsZero(); return(TStates.Count(20)); }),
                new Opcode("BIT 6, (IY + d)", 0xFD, 0xCB, Oprand.Any, 0x76, (z80) => { z80.F.Zero = z80.Memory.Get((ushort)(z80.IY.Value + z80.Buffer[2])).GetBit(6).IsZero(); return(TStates.Count(20)); }),
                new Opcode("BIT 7, (IY + d)", 0xFD, 0xCB, Oprand.Any, 0x7E, (z80) => { z80.F.Zero = z80.Memory.Get((ushort)(z80.IY.Value + z80.Buffer[2])).GetBit(7).IsZero(); return(TStates.Count(20)); }),

                new Opcode("BIT 0, A", 0x47, (z80) => { z80.F.Zero = z80.A.Value.GetBit(0).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 0, B", 0x40, (z80) => { z80.F.Zero = z80.B.Value.GetBit(0).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 0, C", 0x41, (z80) => { z80.F.Zero = z80.C.Value.GetBit(0).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 0, D", 0x42, (z80) => { z80.F.Zero = z80.D.Value.GetBit(0).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 0, E", 0x43, (z80) => { z80.F.Zero = z80.E.Value.GetBit(0).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 0, H", 0x47, (z80) => { z80.F.Zero = z80.H.Value.GetBit(0).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 0, L", 0x45, (z80) => { z80.F.Zero = z80.L.Value.GetBit(0).IsZero(); return(TStates.Count(8)); }),

                new Opcode("BIT 1, A", 0x4F, (z80) => { z80.F.Zero = z80.A.Value.GetBit(1).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 1, B", 0x48, (z80) => { z80.F.Zero = z80.B.Value.GetBit(1).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 1, C", 0x49, (z80) => { z80.F.Zero = z80.C.Value.GetBit(1).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 1, D", 0x4A, (z80) => { z80.F.Zero = z80.D.Value.GetBit(1).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 1, E", 0x4B, (z80) => { z80.F.Zero = z80.E.Value.GetBit(1).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 1, H", 0x4C, (z80) => { z80.F.Zero = z80.H.Value.GetBit(1).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 1, L", 0x4D, (z80) => { z80.F.Zero = z80.L.Value.GetBit(1).IsZero(); return(TStates.Count(8)); }),

                new Opcode("BIT 2, A", 0x57, (z80) => { z80.F.Zero = z80.A.Value.GetBit(2).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 2, B", 0x50, (z80) => { z80.F.Zero = z80.B.Value.GetBit(2).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 2, C", 0x51, (z80) => { z80.F.Zero = z80.C.Value.GetBit(2).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 2, D", 0x52, (z80) => { z80.F.Zero = z80.D.Value.GetBit(2).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 2, E", 0x53, (z80) => { z80.F.Zero = z80.E.Value.GetBit(2).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 2, H", 0x54, (z80) => { z80.F.Zero = z80.H.Value.GetBit(2).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 2, L", 0x55, (z80) => { z80.F.Zero = z80.L.Value.GetBit(2).IsZero(); return(TStates.Count(8)); }),

                new Opcode("BIT 3, A", 0x5F, (z80) => { z80.F.Zero = z80.A.Value.GetBit(3).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 3, B", 0x58, (z80) => { z80.F.Zero = z80.B.Value.GetBit(3).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 3, C", 0x59, (z80) => { z80.F.Zero = z80.C.Value.GetBit(3).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 3, D", 0x5A, (z80) => { z80.F.Zero = z80.D.Value.GetBit(3).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 3, E", 0x5B, (z80) => { z80.F.Zero = z80.E.Value.GetBit(3).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 3, H", 0x5C, (z80) => { z80.F.Zero = z80.H.Value.GetBit(3).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 3, L", 0x5D, (z80) => { z80.F.Zero = z80.L.Value.GetBit(3).IsZero(); return(TStates.Count(8)); }),

                new Opcode("BIT 4, A", 0x67, (z80) => { z80.F.Zero = z80.A.Value.GetBit(4).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 4, B", 0x60, (z80) => { z80.F.Zero = z80.B.Value.GetBit(4).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 4, C", 0x61, (z80) => { z80.F.Zero = z80.C.Value.GetBit(4).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 4, D", 0x62, (z80) => { z80.F.Zero = z80.D.Value.GetBit(4).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 4, E", 0x63, (z80) => { z80.F.Zero = z80.E.Value.GetBit(4).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 4, H", 0x64, (z80) => { z80.F.Zero = z80.H.Value.GetBit(4).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 4, L", 0x65, (z80) => { z80.F.Zero = z80.L.Value.GetBit(4).IsZero(); return(TStates.Count(8)); }),

                new Opcode("BIT 5, A", 0x6F, (z80) => { z80.F.Zero = z80.A.Value.GetBit(5).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 5, B", 0x68, (z80) => { z80.F.Zero = z80.B.Value.GetBit(5).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 5, C", 0x69, (z80) => { z80.F.Zero = z80.C.Value.GetBit(5).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 5, D", 0x6A, (z80) => { z80.F.Zero = z80.D.Value.GetBit(5).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 5, E", 0x6B, (z80) => { z80.F.Zero = z80.E.Value.GetBit(5).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 5, H", 0x6C, (z80) => { z80.F.Zero = z80.H.Value.GetBit(5).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 5, L", 0x6D, (z80) => { z80.F.Zero = z80.L.Value.GetBit(5).IsZero(); return(TStates.Count(8)); }),

                new Opcode("BIT 6, A", 0x77, (z80) => { z80.F.Zero = z80.A.Value.GetBit(6).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 6, B", 0x70, (z80) => { z80.F.Zero = z80.B.Value.GetBit(6).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 6, C", 0x71, (z80) => { z80.F.Zero = z80.C.Value.GetBit(6).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 6, D", 0x72, (z80) => { z80.F.Zero = z80.D.Value.GetBit(6).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 6, E", 0x73, (z80) => { z80.F.Zero = z80.E.Value.GetBit(6).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 6, H", 0x74, (z80) => { z80.F.Zero = z80.H.Value.GetBit(6).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 6, L", 0x75, (z80) => { z80.F.Zero = z80.L.Value.GetBit(6).IsZero(); return(TStates.Count(8)); }),

                new Opcode("BIT 7, A", 0x7F, (z80) => { z80.F.Zero = z80.A.Value.GetBit(7).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 7, B", 0x78, (z80) => { z80.F.Zero = z80.B.Value.GetBit(7).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 7, C", 0x79, (z80) => { z80.F.Zero = z80.C.Value.GetBit(7).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 7, D", 0x7A, (z80) => { z80.F.Zero = z80.D.Value.GetBit(7).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 7, E", 0x7B, (z80) => { z80.F.Zero = z80.E.Value.GetBit(7).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 7, H", 0x7C, (z80) => { z80.F.Zero = z80.H.Value.GetBit(7).IsZero(); return(TStates.Count(8)); }),
                new Opcode("BIT 7, L", 0x7D, (z80) => { z80.F.Zero = z80.L.Value.GetBit(7).IsZero(); return(TStates.Count(8)); }),
            });
        }
Esempio n. 29
0
File: JP.cs Progetto: chazjn/Z80CPU
 protected override void AddOpcodes()
 {
     Opcodes.AddRange(new List <Opcode>
     {
         new Opcode("JP NZ, pq", 0xC2, Oprand.Any, Oprand.Any, (z80) => { Jump(z80, !z80.F.Zero); return(TStates.Count(10)); }),
         new Opcode("JP Z, pq", 0xCA, Oprand.Any, Oprand.Any, (z80) => { Jump(z80, z80.F.Zero); return(TStates.Count(10)); }),
         new Opcode("JP NC, pq", 0xD2, Oprand.Any, Oprand.Any, (z80) => { Jump(z80, !z80.F.Carry); return(TStates.Count(10)); }),
         new Opcode("JP C, pq", 0xDA, Oprand.Any, Oprand.Any, (z80) => { Jump(z80, z80.F.Carry); return(TStates.Count(10)); }),
         new Opcode("JP PO, pq", 0xE2, Oprand.Any, Oprand.Any, (z80) => { Jump(z80, !z80.F.ParityOrOverflow); return(TStates.Count(10)); }),
         new Opcode("JP PE, pq", 0xEA, Oprand.Any, Oprand.Any, (z80) => { Jump(z80, z80.F.ParityOrOverflow); return(TStates.Count(10)); }),
         new Opcode("JP P, pq", 0xF2, Oprand.Any, Oprand.Any, (z80) => { Jump(z80, !z80.F.Sign); return(TStates.Count(10)); }),
         new Opcode("JP M, pq", 0xFA, Oprand.Any, Oprand.Any, (z80) => { Jump(z80, z80.F.Sign); return(TStates.Count(10)); }),
         new Opcode("JP pq", 0xC3, Oprand.Any, Oprand.Any, (z80) => { Jump(z80, true); return(TStates.Count(10)); }),
         new Opcode("JP (HL)", 0xE9, (z80) => { z80.PC.Value = z80.HL.Value; return(TStates.Count(4)); }),
         new Opcode("JP (IX)", 0xDD, 0xE9, (z80) => { z80.PC.Value = z80.IX.Value; return(TStates.Count(8)); }),
         new Opcode("JP (IY)", 0xFD, 0xE9, (z80) => { z80.PC.Value = z80.IY.Value; return(TStates.Count(8)); })
     });
 }