Example #1
0
File: ADC.cs Project: 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);
                }),
            });
        }
Example #2
0
File: AND.cs Project: 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));
                })
            });
        }
Example #3
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)); })
            });
        }
Example #4
0
File: IM.cs Project: 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)); }),
     });
 }
Example #5
0
File: ADD.cs Project: 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); })
                 */
            });
        }
Example #6
0
 protected override void AddOpcodes()
 {
     Opcodes.AddRange(new List <Opcode>
     {
         new Opcode("JR NZ, e", 0x20, Oprand.Any, (z80) => { return(Jump(z80, !z80.F.Zero)); }),
         new Opcode("JR Z, e", 0x28, Oprand.Any, (z80) => { return(Jump(z80, z80.F.Zero)); }),
         new Opcode("JR NC, e", 0x30, Oprand.Any, (z80) => { return(Jump(z80, !z80.F.Carry)); }),
         new Opcode("JR C, e", 0x38, Oprand.Any, (z80) => { return(Jump(z80, z80.F.Carry)); }),
         new Opcode("JR e", 0x18, Oprand.Any, (z80) => { return(Jump(z80, true)); }),
     });
 }
Example #7
0
File: EX.cs Project: chazjn/Z80CPU
        protected override void AddOpcodes()
        {
            Opcodes.AddRange(new List <Opcode>
            {
                new Opcode("EX AF, AF'", 0x08, (z80) => { return(ExchangeRegisters(z80.AF, z80.AF_)); }),
                new Opcode("EX DE, HL", 0xEB, (z80) => { return(ExchangeRegisters(z80.DE, z80.HL)); }),

                new Opcode("EX (SP), HL", 0xE3, (z80) => { return(ExchangeStackPointer(z80, z80.HL)); }),
                new Opcode("EX (SP), IX", 0xDD, 0xE3, (z80) => { return(ExchangeStackPointer(z80, z80.IX)); }),
                new Opcode("EX (SP), IY", 0xFD, 0xE3, (z80) => { return(ExchangeStackPointer(z80, z80.IY)); })
            });
        }
Example #8
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)); }),
     });
 }
Example #9
0
File: IN.cs Project: chazjn/Z80CPU
        protected override void AddOpcodes()
        {
            Opcodes.AddRange(new List <Opcode>
            {
                new Opcode("IN A, (C)", 0xED, 0x78, (z80) => { return(SetRegister(z80, z80.A)); }),
                new Opcode("IN B, (C)", 0xED, 0x40, (z80) => { return(SetRegister(z80, z80.B)); }),
                new Opcode("IN C, (C)", 0xED, 0x48, (z80) => { return(SetRegister(z80, z80.C)); }),
                new Opcode("IN D, (C)", 0xED, 0x50, (z80) => { return(SetRegister(z80, z80.D)); }),
                new Opcode("IN E, (C)", 0xED, 0x58, (z80) => { return(SetRegister(z80, z80.E)); }),
                new Opcode("IN H, (C)", 0xED, 0x60, (z80) => { return(SetRegister(z80, z80.H)); }),
                new Opcode("IN L, (C)", 0xED, 0x68, (z80) => { return(SetRegister(z80, z80.L)); }),

                new Opcode("IN A, (N)", 0xDB, Oprand.Any, (z80) => { return(SetA(z80)); }).SetAllFlagsAffectToNone()
            });
        }
Example #10
0
File: RET.cs Project: 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)); }),
     });
 }
Example #11
0
        protected override void AddOpcodes()
        {
            Opcodes.AddRange(new List <Opcode>
            {
                new Opcode("CALL NZ, pq", 0xC4, Oprand.Any, Oprand.Any, (z80) => { return(Call(z80, !z80.F.Zero)); }),
                new Opcode("CALL Z,  pq", 0xCC, Oprand.Any, Oprand.Any, (z80) => { return(Call(z80, z80.F.Zero)); }),
                new Opcode("CALL NC, pq", 0xD4, Oprand.Any, Oprand.Any, (z80) => { return(Call(z80, !z80.F.Carry)); }),
                new Opcode("CALL C,  pq", 0xE4, Oprand.Any, Oprand.Any, (z80) => { return(Call(z80, z80.F.Carry)); }),
                new Opcode("CALL PO, pq", 0xE4, Oprand.Any, Oprand.Any, (z80) => { return(Call(z80, !z80.F.ParityOrOverflow)); }),
                new Opcode("CALL PE, pq", 0xEC, Oprand.Any, Oprand.Any, (z80) => { return(Call(z80, z80.F.ParityOrOverflow)); }),
                new Opcode("CALL P,  pq", 0xF4, Oprand.Any, Oprand.Any, (z80) => { return(Call(z80, !z80.F.Sign)); }),
                new Opcode("CALL M,  pq", 0xFC, Oprand.Any, Oprand.Any, (z80) => { return(Call(z80, z80.F.Sign)); }),

                new Opcode("CALL pq", 0xCD, Oprand.Any, Oprand.Any, (z80) => { return(Call(z80, true)); }),
            });
        }
Example #12
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(),
            });
        }
Example #13
0
File: JP.cs Project: 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)); })
     });
 }
Example #14
0
File: POP.cs Project: 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));
                })
            });
        }
Example #15
0
File: BIT.cs Project: 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)); }),
            });
        }
Example #16
0
        public void Resolve(HashSet <string> values)
        {
            var finalMaps    = new List <string>();
            var finalOpcodes = new List <string>();

            var sorted = new List <KeyValuePair <LayerEnum, SettingsValues> >(_layers);

            sorted.Sort((left, right) => left.Key.CompareTo(right.Key));

            foreach (var layer in sorted)
            {
                var json = JsonConvert.SerializeObject(layer.Value);
                JsonConvert.PopulateObject(json, this, new JsonSerializerSettings()
                {
                    NullValueHandling = NullValueHandling.Ignore
                }
                                           );

                ApplyRules(values, finalMaps, finalOpcodes);

                if (layer.Value.Maps != null)
                {
                    finalMaps.AddRange(layer.Value.Maps);
                }

                if (layer.Value.Opcodes != null)
                {
                    finalOpcodes.AddRange(layer.Value.Opcodes);
                }
            }

            // todo: remove duplicates

            Maps = Maps ?? new List <string>();
            Maps.Clear();
            Maps.AddRange(finalMaps);

            Opcodes = Opcodes ?? new List <string>();
            Opcodes.Clear();
            Opcodes.AddRange(finalOpcodes);

            Rules = null;


            // validate some settings

            if (string.IsNullOrWhiteSpace(ProjectFolder))
            {
                throw new Exception("Property 'projectFolder' is missing or empty.");
            }

            if (!Directory.Exists(ProjectFolder))
            {
                throw new Exception("Property 'projectFolder' refers to a folder that could not be found.");
            }


            // get temp folder

            TempFolder = Path.Combine(ProjectFolder, ".zxdbg");
            Directory.CreateDirectory(TempFolder);


            var logjson = JsonConvert.SerializeObject(this,
                                                      new JsonSerializerSettings()
            {
                NullValueHandling = NullValueHandling.Ignore
            }
                                                      );

            Logging.Write(Logging.Severity.Debug, "Resolved settings: " + logjson);

            Deserialized();
        }