public static RegisterFile Lpm(RegisterFile registerFile, byte d, AvrSim.Flash programMemory, object[] arguments) { var postIncrement = (bool)arguments[0]; var word = (uint)(registerFile.GetWide(Core.R_Z) >> 1); var MSB = (registerFile.GetWide(Core.R_Z) & 1) != 0; var data = programMemory.GetInstruction(word); byte value; if (MSB) { value = (byte)(data >> 8); } else { value = (byte)(data & 0xff); } registerFile = registerFile.WithRegister(d, value); if (postIncrement) { registerFile = registerFile.WithWide(Core.R_Z, z => (ushort)(z + 1)); } return(registerFile); }
public static RegisterFile And(RegisterFile registerFile, byte r, byte d) { var R = (byte)(registerFile[d] & registerFile[r]); var statusRegister = registerFile.StatusRegister .WithTwosComplementOverflow(false) .WithNegative(r.BitIsSet(7)) .WithZero(R == 0); statusRegister = statusRegister.WithSigned(statusRegister.N & statusRegister.V); return(registerFile.WithRegister(d, R).WithStatusRegister(statusRegister)); }
public static RegisterFile Lpm(RegisterFile registerFile, AvrSim.Flash programMemory) { var word = (uint)(registerFile.GetWide(Core.R_Z) >> 1); var MSB = (registerFile.GetWide(Core.R_Z) & 1) != 0; var data = programMemory.GetInstruction(word); byte value; if (MSB) { value = (byte)(data >> 8); } else { value = (byte)(data & 0xff); } return(registerFile.WithRegister(0, value)); }
public static RegisterFile Add(RegisterFile registerFile, byte d, byte r, object[] arguments) { var carry = (bool)arguments[0]; var Rd = registerFile[d]; var Rr = registerFile[r]; var R = (byte)(Rd + Rr + (byte)((carry && registerFile.StatusRegister.C) ? 1 : 0)); var statusRegister = registerFile.StatusRegister .WithHalfCarry((Rd.BitIsSet(3) & Rr.BitIsSet(3)) | (Rr.BitIsSet(3) & R.BitIsCleared(3)) | (R.BitIsCleared(3) & Rd.BitIsSet(3))) .WithTwosComplementOverflow((Rd.BitIsSet(7) & Rr.BitIsSet(7) & R.BitIsCleared(7)) | (Rd.BitIsCleared(7) & Rr.BitIsCleared(7) & R.BitIsSet(7))) .WithNegative(R.BitIsSet(7)) .WithZero(R == 0) .WithCarry((Rd.BitIsSet(7) & Rr.BitIsSet(7)) | (Rr.BitIsSet(7) & R.BitIsCleared(7)) | (R.BitIsCleared(7) & Rd.BitIsSet(7))); statusRegister = statusRegister.WithSigned(statusRegister.N ^ statusRegister.V); return(registerFile.WithRegister(d, R).WithStatusRegister(statusRegister)); }
public static RegisterFile Subi(RegisterFile registerFile, byte K, byte d, object[] arguments) { var carry = (bool)arguments[0]; d = (byte)(d + 16); var Rd = registerFile[d]; var R = (byte)(Rd - K - (carry && registerFile.StatusRegister.C ? 1 : 0)); var statusRegister = registerFile.StatusRegister .WithHalfCarry((Rd.BitIsCleared(3) & K.BitIsSet(3)) | (K.BitIsSet(3) & R.BitIsSet(3)) | (R.BitIsSet(3) & Rd.BitIsCleared(3))) .WithTwosComplementOverflow((Rd.BitIsSet(7) & K.BitIsCleared(7) & R.BitIsCleared(7)) | (Rd.BitIsCleared(7) & K.BitIsSet(7) & R.BitIsSet(7))) .WithNegative(R.BitIsSet(7)) .WithZero(R == 0 & (registerFile.StatusRegister.Z | !carry)) .WithCarry((Rd.BitIsCleared(7) & K.BitIsSet(7)) | (K.BitIsSet(7) & R.BitIsSet(7)) | (R.BitIsSet(7) & Rd.BitIsCleared(7))); statusRegister = statusRegister.WithSigned(statusRegister.N ^ statusRegister.V); return(registerFile.WithRegister(d, R).WithStatusRegister(statusRegister)); }
public static RegisterFile Ld(RegisterFile registerFile, byte d, MemoryBus memoryBus, object[] arguments) { var register = (byte)arguments[0]; var change = (int)arguments[1]; var preDecrement = change == -1; var postIncrement = change == 1; if (preDecrement) { registerFile = registerFile.WithWide(register, v => (ushort)(v - 1)); } registerFile = registerFile.WithRegister(d, memoryBus.Load(registerFile.GetWide(register))); if (postIncrement) { registerFile = registerFile.WithWide(register, v => (ushort)(v + 1)); } return(registerFile); }
public static RegisterFile Pop(RegisterFile registerFile, byte d, AvrSim.Stack stack) { registerFile = stack.Pop(registerFile, out var value); return(registerFile.WithRegister(d, value)); }
public static RegisterFile Mov(RegisterFile registerFile, byte r, byte d) { return(registerFile.WithRegister(d, registerFile[r])); }
public static RegisterFile Ldi(RegisterFile registerFile, byte d, byte K) { d = (byte)(16 + d); return(registerFile.WithRegister(d, K)); }
public static RegisterFile Ldd(RegisterFile registerFile, byte d, byte q, MemoryBus memoryBus, object[] arguments) { var register = (byte)arguments[0]; return(registerFile.WithRegister(d, memoryBus.Load((ushort)(registerFile.GetWide(register) + q)))); }
public static RegisterFile In(RegisterFile registerFile, byte A, byte d, MemoryBus memoryBus) { // I/O Addresses are offset 0x20 on the memory bus. return(registerFile.WithRegister(d, memoryBus.Load((ushort)(A + 0x20)))); }