Exemplo n.º 1
0
        public void Should_SerializeUInt6()
        {
            UInt6 value = UInt6.MaxValue; // range 0 to 63

            Assert.AreEqual(1, value.GetBit(0));
            Assert.AreEqual(1, value.GetBit(1));
            Assert.AreEqual(1, value.GetBit(2));
            Assert.AreEqual(1, value.GetBit(3));
            Assert.AreEqual(1, value.GetBit(4));
            Assert.AreEqual(1, value.GetBit(5));
            Assert.AreEqual(new Bit[] { 1, 1, 1, 1, 1, 1 }, value.GetBits());

            value = (UInt6)2;
            Assert.AreEqual(0, value.GetBit(0));
            Assert.AreEqual(1, value.GetBit(1));
            Assert.AreEqual(0, value.GetBit(2));
            Assert.AreEqual(0, value.GetBit(3));
            Assert.AreEqual(0, value.GetBit(4));
            Assert.AreEqual(0, value.GetBit(5));
            Assert.AreEqual(new Bit[] { 0, 1, 0, 0, 0, 0 }, value.GetBits());

            // test overflow
            value = (UInt6)76;
            Assert.AreEqual(12, value);
            Assert.AreEqual(0, value.GetBit(0));
            Assert.AreEqual(0, value.GetBit(1));
            Assert.AreEqual(1, value.GetBit(2));
            Assert.AreEqual(1, value.GetBit(3));
            Assert.AreEqual(0, value.GetBit(4));
            Assert.AreEqual(0, value.GetBit(5));
            Assert.AreEqual(new Bit[] { 0, 0, 1, 1, 0, 0 }, value.GetBits());
        }
Exemplo n.º 2
0
        protected override void OnTick() // TODO mere manuel
        {
            switch (format.val)
            {
            case InstructionFormat.i: imm.val = (int)imm12.val; break;

            case InstructionFormat.s: imm.val = (int)((imm7.val << 5) | (imm5.val)); break;

            case InstructionFormat.b: {
                int   eleven  = imm5.val & 1;
                UInt5 fourone = (UInt5)(imm5.val & 0b11110);
                int   twelve  = imm7.val >> 6 & 1;
                UInt6 tenfive = (UInt6)(imm7.val & 0b0111111);
                imm.val = (int)((twelve == 1 ? 0 : unchecked ((int)0xFFFFF000)) |
                                (eleven << 11) |
                                (tenfive << 5) |
                                fourone);
            }; break;

            case InstructionFormat.u: imm.val = (int)(imm20.val << 12); break;

            case InstructionFormat.j: {
                int twenty         = (int)((imm20.val >> 19) & 1);
                int tenone         = (int)((imm20.val >> 9) & 0x1FF);
                int eleven         = (int)((imm20.val >> 8) & 1);
                int nineteentwelve = (int)((imm20.val) & 0b11111111);
                imm.val = (int)((twenty == 1 ? 0 : unchecked ((int)0xFFF00000)) |
                                (nineteentwelve << 12) |
                                (eleven << 11) |
                                (tenone << 1)
                                );
            }; break;

            default: imm.val = 0; break;
            }
        }