Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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));
        }
Exemplo n.º 3
0
        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));
        }
Exemplo n.º 4
0
        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));
        }
Exemplo n.º 5
0
        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));
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
        public static RegisterFile Pop(RegisterFile registerFile, byte d, AvrSim.Stack stack)
        {
            registerFile = stack.Pop(registerFile, out var value);

            return(registerFile.WithRegister(d, value));
        }
Exemplo n.º 8
0
 public static RegisterFile Mov(RegisterFile registerFile, byte r, byte d)
 {
     return(registerFile.WithRegister(d, registerFile[r]));
 }
Exemplo n.º 9
0
        public static RegisterFile Ldi(RegisterFile registerFile, byte d, byte K)
        {
            d = (byte)(16 + d);

            return(registerFile.WithRegister(d, K));
        }
Exemplo n.º 10
0
        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))));
        }
Exemplo n.º 11
0
 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))));
 }