/// <summary> /// The LDIR instruction. /// </summary> byte LDIR() { FetchFinished(); var sourceAddress = Registers.HL; var destAddress = Registers.DE; var counter = Registers.BC; var value = ProcessorAgent.ReadFromMemory(sourceAddress.ToUShort()); ProcessorAgent.WriteToMemory(destAddress.ToUShort(), value); Registers.HL = sourceAddress.Inc(); Registers.DE = destAddress.Inc(); counter = counter.Dec(); Registers.BC = counter; Registers.HF = 0; Registers.NF = 0; Registers.PF = (counter != 0); var valuePlusA = value.Add(Registers.A).GetLowByte(); Registers.Flag3 = valuePlusA.GetBit(3); Registers.Flag5 = valuePlusA.GetBit(1); if (counter != 0) { Registers.PC = Registers.PC.Sub(2); return(21); } return(16); }
/// <summary> /// The INDR instruction. /// </summary> byte INDR() { FetchFinished(); var portNumber = Registers.C; var address = Registers.HL; var value = ProcessorAgent.ReadFromPort(portNumber); ProcessorAgent.WriteToMemory((ushort)address, value); Registers.HL--; var counter = Registers.B; counter = (byte)(counter - 1); Registers.B = counter; Registers.ZF = (counter == 0); Registers.NF = 1; Registers.SF = counter.GetBit(7); SetFlags3and5From(counter); if (counter != 0) { Registers.PC = (ushort)(Registers.PC - 2); return(21); } return(16); }
/// <summary> /// The INDR instruction. /// </summary> byte INDR() { FetchFinished(); var portNumber = Registers.C; var address = Registers.HL; var value = ProcessorAgent.ReadFromPort(portNumber); ProcessorAgent.WriteToMemory(address.ToUShort(), value); Registers.HL = address.Dec(); var counter = Registers.B; counter = counter.Dec(); Registers.B = counter; Registers.ZF = (counter == 0); Registers.NF = 1; Registers.SF = counter.GetBit(7); SetFlags3and5From(counter); if (counter != 0) { Registers.PC = Registers.PC.Sub(2); return(21); } return(16); }
/// <summary> /// The LDIR instruction. /// </summary> byte LDIR() { FetchFinished(); var sourceAddress = Registers.HL; var destAddress = Registers.DE; var counter = Registers.BC; var value = ProcessorAgent.ReadFromMemory((ushort)sourceAddress); ProcessorAgent.WriteToMemory((ushort)destAddress, value); Registers.HL = (short)(sourceAddress + 1); Registers.DE = (short)(destAddress + 1); counter--; Registers.BC = counter; Registers.HF = 0; Registers.NF = 0; Registers.PF = (counter != 0); var valuePlusA = (byte)(value + Registers.A); Registers.Flag3 = valuePlusA.GetBit(3); Registers.Flag5 = valuePlusA.GetBit(1); if (counter != 0) { Registers.PC = (ushort)(Registers.PC - 2); return(21); } return(16); }
/// <summary> /// The LD (nn),A instruction. /// </summary> private byte LD_aa_A() { var address = FetchWord().ToUShort(); FetchFinished(); ProcessorAgent.WriteToMemory(address, Registers.A); return(13); }
/// <summary> /// The LD (DE),A instruction. /// </summary> byte LD_aDE_A() { FetchFinished(); var newValue = Registers.A; var address = Registers.DE.ToUShort(); ProcessorAgent.WriteToMemory(address, newValue); return(7); }
/// <summary> /// The LD (HL),A instruction. /// </summary> byte LD_aHL_A() { FetchFinished(); var newValue = Registers.A; var address = (ushort)Registers.HL; ProcessorAgent.WriteToMemory(address, newValue); return(7); }
/// <summary> /// The LD (HL),n instruction. /// </summary> private byte LD_aHL_N() { var newValue = ProcessorAgent.FetchNextOpcode(); FetchFinished(); var address = (ushort)Registers.HL; ProcessorAgent.WriteToMemory(address, newValue); return(10); }
/// <summary> /// The LD (IY+n),L instruction. /// </summary> byte LD_aIY_plus_n_L() { var offset = ProcessorAgent.FetchNextOpcode(); FetchFinished(); var newValue = Registers.L; var address = Registers.IY.ToUShort().Add(offset.ToSignedByte()); ProcessorAgent.WriteToMemory(address, newValue); return(19); }
/// <summary> /// The LD (IY+n),L instruction. /// </summary> byte LD_aIY_plus_n_L() { var offset = ProcessorAgent.FetchNextOpcode(); FetchFinished(); var newValue = Registers.L; var address = (ushort)(Registers.IY + (SByte)offset); ProcessorAgent.WriteToMemory(address, newValue); return(19); }
/// <summary> /// The PUSH DE instruction. /// </summary> private byte PUSH_DE() { FetchFinished(); var valueToPush = Registers.DE; var sp = Registers.SP.Dec(); ProcessorAgent.WriteToMemory(sp.ToUShort(), valueToPush.GetHighByte()); sp = sp.Dec(); ProcessorAgent.WriteToMemory(sp.ToUShort(), valueToPush.GetLowByte()); Registers.SP = sp; return(11); }
/// <summary> /// The PUSH DE instruction. /// </summary> private byte PUSH_DE() { FetchFinished(); var valueToPush = Registers.DE; var sp = (ushort)(Registers.SP - 1); ProcessorAgent.WriteToMemory(sp, valueToPush.GetHighByte()); sp--; ProcessorAgent.WriteToMemory(sp, valueToPush.GetLowByte()); Registers.SP = (short)sp; return(11); }
/// <summary> /// The RST 20h instruction. /// </summary> private byte RST_20() { FetchFinished(); var valueToPush = (short)Registers.PC; var sp = (ushort)(Registers.SP - 1); ProcessorAgent.WriteToMemory(sp, valueToPush.GetHighByte()); sp--; ProcessorAgent.WriteToMemory(sp, valueToPush.GetLowByte()); Registers.SP = (short)sp; Registers.PC = 0x20; return(11); }
/// <summary> /// The CALL instruction. /// </summary> private byte CALL_nn() { var newAddress = FetchWord().ToUShort(); FetchFinished(); var valueToPush = Registers.PC.ToShort(); var sp = Registers.SP.Dec(); ProcessorAgent.WriteToMemory(sp.ToUShort(), valueToPush.GetHighByte()); sp = sp.Dec(); ProcessorAgent.WriteToMemory(sp.ToUShort(), valueToPush.GetLowByte()); Registers.SP = sp; Registers.PC = newAddress; return(17); }
/// <summary> /// The CALL instruction. /// </summary> private byte CALL_nn() { var newAddress = (ushort)FetchWord(); FetchFinished(); var valueToPush = (short)Registers.PC; var sp = (ushort)(Registers.SP - 1); ProcessorAgent.WriteToMemory(sp, valueToPush.GetHighByte()); sp--; ProcessorAgent.WriteToMemory(sp, valueToPush.GetLowByte()); Registers.SP = (short)sp; Registers.PC = newAddress; return(17); }
/// <summary> /// The DEC (HL) instruction. /// </summary> private byte DEC_aHL() { FetchFinished(); var address = Registers.HL.ToUShort(); var oldValue = ProcessorAgent.ReadFromMemory(address); var newValue = oldValue.Dec(); ProcessorAgent.WriteToMemory(address, newValue); Registers.SF = newValue.GetBit(7); Registers.ZF = (newValue == 0); Registers.HF = ((newValue & 0x0F) == 0x0F); Registers.PF = (newValue == 0x7F); Registers.NF = 1; SetFlags3and5From(newValue); return(11); }
/// <summary> /// The INC (HL) instruction. /// </summary> private byte INC_aHL() { FetchFinished(); var address = (ushort)Registers.HL; var oldValue = ProcessorAgent.ReadFromMemory(address); var newValue = (byte)(oldValue + 1); ProcessorAgent.WriteToMemory(address, newValue); Registers.SF = newValue.GetBit(7); Registers.ZF = (newValue == 0); Registers.HF = ((newValue & 0x0F) == 0x00); Registers.PF = (newValue == 0x80); Registers.NF = 0; SetFlags3and5From(newValue); return(11); }
/// <summary> /// The DEC (IY+n) instruction. /// </summary> private byte DEC_aIY_plus_n() { var offset = ProcessorAgent.FetchNextOpcode(); FetchFinished(); var address = Registers.IY.ToUShort().Add(offset.ToSignedByte()); var oldValue = ProcessorAgent.ReadFromMemory(address); var newValue = oldValue.Dec(); ProcessorAgent.WriteToMemory(address, newValue); Registers.SF = newValue.GetBit(7); Registers.ZF = (newValue == 0); Registers.HF = ((newValue & 0x0F) == 0x0F); Registers.PF = (newValue == 0x7F); Registers.NF = 1; SetFlags3and5From(newValue); return(23); }
/// <summary> /// The DEC (IY+n) instruction. /// </summary> private byte DEC_aIY_plus_n() { var offset = ProcessorAgent.FetchNextOpcode(); FetchFinished(); var address = (ushort)(Registers.IY + (SByte)offset); var oldValue = ProcessorAgent.ReadFromMemory(address); var newValue = (byte)(oldValue - 1); ProcessorAgent.WriteToMemory(address, newValue); Registers.SF = newValue.GetBit(7); Registers.ZF = (newValue == 0); Registers.HF = ((newValue & 0x0F) == 0x0F); Registers.PF = (newValue == 0x7F); Registers.NF = 1; SetFlags3and5From(newValue); return(23); }
/// <summary> /// The RLD instruction. /// </summary> byte RLD() { FetchFinished(); var memoryAddress = Registers.HL.ToUShort(); var Avalue = Registers.A; var HLcontents = ProcessorAgent.ReadFromMemory(memoryAddress); var newAvalue = (byte)((Avalue & 0xF0) | ((HLcontents >> 4) & 0x0F)); var newHLcontents = (byte)(((HLcontents << 4) & 0xF0) | (Avalue & 0x0F)); Registers.A = newAvalue; ProcessorAgent.WriteToMemory(memoryAddress, newHLcontents); Registers.SF = newAvalue.GetBit(7); Registers.ZF = (newAvalue == 0); Registers.HF = 0; Registers.PF = Parity[newAvalue]; Registers.NF = 0; SetFlags3and5From(newAvalue); return(18); }