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); }), }); }
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)); }) }); }
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)); }) }); }
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)); }), }); }
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); }) */ }); }
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)); }), }); }
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)); }) }); }
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)); }), }); }
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() }); }
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)); }), }); }
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)); }), }); }
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(), }); }
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)); }) }); }
//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)); }) }); }
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)); }), }); }
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(); }