Exemple #1
0
        //execute a bit clear operation
        public override void Execute()
        {
            if (!ShouldExecute())
            {
                return;
            }
            uint val1 = (computer.getReg((int)source.RegNum));

            if (operand2.immNum != uint.MaxValue)
            {
                uint val2   = operand2.immNum;
                int  rotate = (int)operand2.rotateAmt * 2;
                val2 = (val2 >> rotate) | (val2 << (32 - rotate));

                uint result = (uint)(val1 & ~val2);
                uint d      = (uint)(val1 & val2);
                computer.Registers.setRegister((int)dest.RegNum, result);
            }
            else
            {
                uint value     = computer.getReg((int)operand2.RegNum);
                uint shifttype = operand2.shiftNum;
                uint shiftamt  = operand2.shiftAmt;
                //shift amount according to type
                if (operand2.shiftNum == 0)
                {
                    value = BarrelShifter.LogicLeftShift(value, (int)(shiftamt));
                }
                if (operand2.shiftNum == 1)
                {
                    value = BarrelShifter.LogicalRightShift(value, (int)(shiftamt));
                }
                if (operand2.shiftNum == 2)
                {
                    value = BarrelShifter.ArithRightShift(value, (int)(shiftamt));
                }
                uint result = (uint)(val1 & ~value);
                computer.Registers.setRegister((int)dest.RegNum, result);
                return;
            }
        }
        //moves the value from one op to another and stores it
        public override void Execute()
        {
            if (!ShouldExecute())
            {
                return;
            }
            //execute a move for an immediate value
            if (value == 0xe1a00000)
            {
                return;
            }
            if (operand2.immNum != uint.MaxValue)
            {
                uint value  = operand2.immNum;
                int  rotate = (int)operand2.rotateAmt * 2;
                operand2.immNum = (uint)(value >> rotate) | (value << (32 - rotate));
                if (mvn)
                {
                    operand2.immNum = ~operand2.immNum;
                }

                computer.Registers.setRegister((int)dest.RegNum, operand2.immNum);
                if (sinstruct)
                {
                    MovFlags(0, value);
                }
                return;
            }
            //execute a move for a register/shifted register
            else
            {
                uint value     = computer.getReg((int)operand2.RegNum);
                uint shifttype = operand2.shiftNum;
                uint shiftamt  = operand2.shiftAmt;
                //shift amount according to type
                if (operand2.shiftNum == 0)
                {
                    value = BarrelShifter.LogicLeftShift(value, (int)(shiftamt));
                }
                if (operand2.shiftNum == 1)
                {
                    value = BarrelShifter.LogicalRightShift(value, (int)(shiftamt));
                }
                if (operand2.shiftNum == 2)
                {
                    value = BarrelShifter.ArithRightShift(value, (int)(shiftamt));
                }
                if (operand2.shiftNum == 3)
                {
                    value = BarrelShifter.ROR(value, (int)shiftamt);
                }
                if (mvn)
                {
                    value = ~value;
                }
                computer.Registers.setRegister((int)dest.RegNum, value);

                if (sinstruct)
                {
                    MovFlags(0, value);
                }
                return;
            }
            throw new NotImplementedException();
        }
Exemple #3
0
        //perform a comparison operation
        public override void Execute()
        {
            if (!ShouldExecute())
            {
                return;
            }
            uint val1 = 0;

            if (type != 3)
            {
                val1 = computer.getReg((int)source.RegNum);
            }
            else
            {
                val1 = computer.getReg((int)dest.RegNum);
            }
            if (operand2.immNum != uint.MaxValue)
            {
                uint val2   = operand2.immNum;
                int  rotate = (int)operand2.rotateAmt * 2;
                val2 = (uint)(val2 >> rotate) | (val2 << (32 - rotate));
                //perform and cmp
                if (type == 0)
                {
                    uint result = val1 & val2;
                    computer.Registers.setRegister((int)dest.RegNum, result);
                    //ChangeFlags(val1, val2, result);
                }
                //perform or cmp
                else if (type == 1)
                {
                    uint result = val1 | val2;
                    computer.Registers.setRegister((int)dest.RegNum, result);
                    // ChangeFlags(val1, val2, result);
                }
                //perform eor cmp
                else if (type == 2)
                {
                    uint result = val1 ^ val2;
                    computer.Registers.setRegister((int)dest.RegNum, result);
                    //ChangeFlags(val1, val2, result);
                }
                else
                {
                    uint result = computer.getReg((int)dest.RegNum) - val2;
                    ChangeFlags(val1, val2, result);
                }
            }
            else
            {
                uint value     = computer.getReg((int)operand2.RegNum);
                uint shifttype = operand2.shiftNum;
                uint shiftamt  = operand2.shiftAmt;
                //shift amount according to type
                if (operand2.shiftNum == 0)
                {
                    value = BarrelShifter.LogicLeftShift(value, (int)(shiftamt));
                }
                else if (operand2.shiftNum == 1)
                {
                    value = BarrelShifter.LogicalRightShift(value, (int)(shiftamt));
                }
                else if (operand2.shiftNum == 2)
                {
                    value = BarrelShifter.ArithRightShift(value, (int)(shiftamt));
                }
                else
                {
                    value = BarrelShifter.ROR(value, (int)shiftamt);
                }
                //perform and cmp
                if (type == 0)
                {
                    uint result = val1 & value;
                    computer.Registers.setRegister((int)dest.RegNum, result);
                    //ChangeFlags(val1, value, result);
                }
                //perform or cmp
                else if (type == 1)
                {
                    uint result = val1 | value;
                    computer.Registers.setRegister((int)dest.RegNum, result);
                    //ChangeFlags(val1, value, result);
                }
                //perform eor cmp
                else if (type == 2)
                {
                    uint result = val1 ^ value;
                    computer.Registers.setRegister((int)dest.RegNum, result);
                    //ChangeFlags(val1, value, result);
                }
                else
                {
                    uint result = computer.getReg((int)dest.RegNum) - value;
                    ChangeFlags(val1, value, result);
                }

                return;
            }
        }
Exemple #4
0
        //perform an addition/subtraction operation
        public override void Execute()
        {
            if (!ShouldExecute())
            {
                return;
            }
            uint val1 = computer.getReg((int)source.RegNum);

            if (operand2.immNum != uint.MaxValue)
            {
                uint val2   = operand2.immNum;
                int  rotate = (int)operand2.rotateAmt * 2;
                val2 = (uint)(val2 >> rotate) | (val2 << (32 - rotate));
                //perform addition operation
                if (type == 0)
                {
                    uint result = val2 + val1;
                    computer.Registers.setRegister((int)dest.RegNum, result);
                }
                //perform subtraction operation
                else if (type == 1)
                {
                    uint result = val1 - val2;
                    computer.Registers.setRegister((int)dest.RegNum, result);
                }
                //rsb operation
                else
                {
                    uint result = val2 - val1;
                    computer.Registers.setRegister((int)dest.RegNum, result);
                }
            }
            else
            {
                uint value     = computer.getReg((int)operand2.RegNum);
                uint shifttype = operand2.shiftNum;
                uint shiftamt  = operand2.shiftAmt;
                //shift amount according to type
                if (operand2.shiftNum == 0)
                {
                    value = BarrelShifter.LogicLeftShift(value, (int)(shiftamt));
                }
                if (operand2.shiftNum == 1)
                {
                    value = BarrelShifter.LogicalRightShift(value, (int)(shiftamt));
                }
                if (operand2.shiftNum == 2)
                {
                    value = BarrelShifter.ArithRightShift(value, (int)(shiftamt));
                }
                else if (operand2.shiftNum == 3)
                {
                    value = BarrelShifter.ROR(value, (int)shiftamt);
                }
                //add with shifted register
                if (type == 0)
                {
                    uint result = value + val1;
                    computer.Registers.setRegister((int)dest.RegNum, result);
                }
                //subtract with shifted register
                else if (type == 1)
                {
                    uint result = val1 - value;
                    computer.Registers.setRegister((int)dest.RegNum, result);
                }
                //rsb with shifted register
                else
                {
                    uint result = value - val1;
                    computer.Registers.setRegister((int)dest.RegNum, result);
                }
                return;
            }
        }
        //execute a load/store
        public override void Execute()
        {
            if (!ShouldExecute())
            {
                return;
            }
            uint writeval;
            uint noffset = 0;

            if (operand2.immNum != uint.MaxValue)
            {
                uint memval;
                uint offset = computer.Registers.getRegister((int)source.RegNum);
                if (type)
                {
                    if (updown)
                    {
                        noffset = offset + operand2.immNum;
                    }
                    else
                    {
                        noffset = offset - operand2.immNum;
                    }

                    if (noffset == 0x100001)
                    {
                        memval = computer.getChar();
                    }
                    else
                    {
                        if (preindex == true)
                        {
                            if (!size)
                            {
                                memval = computer.RAM.ReadWord(noffset);
                            }
                            else
                            {
                                memval = computer.RAM.ReadByte(noffset);
                            }
                        }
                        else
                        {
                            if (!size)
                            {
                                memval = computer.RAM.ReadWord(offset);
                            }
                            else
                            {
                                memval = computer.RAM.ReadByte(offset);
                            }
                        }
                    }
                    computer.Registers.setRegister((int)dest.RegNum, memval);
                }
                else
                {
                    uint nuval = computer.Registers.getRegister((int)dest.RegNum);

                    if (updown)
                    {
                        noffset = offset + operand2.immNum;
                    }
                    else
                    {
                        noffset = offset - operand2.immNum;
                    }

                    if (!size)
                    {
                        if (preindex == true)
                        {
                            computer.RAM.WriteWord(noffset, nuval);
                        }
                        else
                        {
                            computer.RAM.WriteWord(offset, nuval);
                        }
                    }
                    else
                    {
                        if (noffset == 0x100000)
                        {
                            char c = (char)computer.getReg(0);
                            computer.SendChar(c);
                        }
                        else
                        {
                            if (preindex == true)
                            {
                                computer.RAM.WriteByte(noffset, (byte)Memory.ExtractBits(nuval, 0, 7));
                            }
                            else
                            {
                                computer.RAM.WriteByte(offset, (byte)Memory.ExtractBits(nuval, 0, 7));
                            }
                        }
                    }
                }

                writeval = noffset;
            }
            else
            {
                uint memval;

                uint offset1 = computer.Registers.getRegister((int)source.RegNum);
                uint off3    = offset1;
                uint offset2 = computer.Registers.getRegister((int)operand2.RegNum);
                if (operand2.shiftAmt > 0)
                {
                    if (operand2.shiftNum == 0)
                    {
                        offset2 = BarrelShifter.LogicLeftShift(offset2, (int)operand2.shiftAmt);
                    }
                    else if (operand2.shiftNum == 1)
                    {
                        offset2 = BarrelShifter.LogicalRightShift(offset2, (int)operand2.shiftAmt);
                    }
                    else if (operand2.shiftNum == 2)
                    {
                        offset2 = BarrelShifter.ArithRightShift(offset2, (int)operand2.shiftAmt);
                    }
                    else
                    {
                        offset2 = BarrelShifter.ROR(offset2, (int)operand2.shiftAmt);
                    }
                }
                if (updown)
                {
                    offset1 = offset1 + offset2;
                }
                else
                {
                    offset1 = offset1 - offset2;
                }

                if (type)
                {
                    if (offset1 == 0x100001)
                    {
                        memval = computer.getChar();
                    }
                    else
                    {
                        if (preindex == true)
                        {
                            if (!size)
                            {
                                memval = computer.RAM.ReadWord(offset1);
                            }
                            else
                            {
                                memval = computer.RAM.ReadByte(offset1);
                            }
                        }
                        else
                        {
                            if (!size)
                            {
                                memval = computer.RAM.ReadWord(off3);
                            }
                            else
                            {
                                memval = computer.RAM.ReadByte(off3);
                            }
                        }
                    }
                    computer.Registers.setRegister((int)dest.RegNum, memval);
                }
                else
                {
                    uint nuval = computer.Registers.getRegister((int)dest.RegNum);
                    if (preindex == true)
                    {
                        if (!size)
                        {
                            computer.RAM.WriteWord(offset1, nuval);
                        }
                        else
                        {
                            computer.RAM.WriteByte(offset1, (byte)Memory.ExtractBits(nuval, 0, 7));
                        }
                    }
                    else
                    {
                        if (!size)
                        {
                            computer.RAM.WriteWord(off3, nuval);
                        }
                        else
                        {
                            computer.RAM.WriteByte(off3, (byte)Memory.ExtractBits(nuval, 0, 7));
                        }
                    }
                }
                writeval = offset1;
            }
            if (writeBack || !preindex)
            {
                computer.Registers.setRegister((int)source.RegNum, writeval);
            }
        }