Beispiel #1
0
        // Register.
        private static bool r1(uint uInstr, XCore200Disassembler dasm)
        {
            var iReg = uInstr & 0xF;

            dasm.ops.Add(new RegisterOperand(Registers.GpRegs[iReg]));
            return(true);
        }
Beispiel #2
0
        // Register with immediate.
        private static bool rus(uint uInstr, XCore200Disassembler dasm)
        {
            var base3 = (uInstr >> 6) & 0x1F;

            if (base3 < 27)
            {
                return(false);
            }
            if (Bits.IsBitSet(uInstr, 5))
            {
                if (base3 == 31)
                {
                    return(false);
                }
                base3 += 5;
            }
            base3 -= 27;
            var imm  = uInstr & 0x03;
            var iReg = (uInstr >> 2) & 0x03;

            imm  += (base3 % 3) << 2;
            base3 = base3 / 3;
            iReg += (base3 % 3) << 2;
            if (iReg >= 12)
            {
                return(false);
            }
            dasm.ops.Add(new RegisterOperand(Registers.GpRegs[iReg]));
            dasm.ops.Add(new RegisterOperand(Registers.GpRegs[imm]));
            return(true);
        }
Beispiel #3
0
        // Register with immediate.
        private static bool rus_bitp(uint uInstr, XCore200Disassembler dasm)
        {
            var base3 = (uInstr >> 6) & 0x1F;

            if (base3 < 27)
            {
                return(false);
            }
            if (Bits.IsBitSet(uInstr, 5))
            {
                if (base3 == 31)
                {
                    return(false);
                }
                base3 += 5;
            }
            base3 -= 27;
            var imm  = uInstr & 0x03;
            var iReg = (uInstr >> 2) & 0x03;

            imm  += (base3 % 3) << 2;
            base3 = base3 / 3;
            iReg += (base3 % 3) << 2;
            if (iReg >= 12 || imm >= bitpos32.Length)
            {
                return(false);
            }
            imm = bitpos32[imm];
            dasm.ops.Add(new RegisterOperand(Registers.GpRegs[iReg]));
            dasm.ops.Add(ImmediateOperand.Word32(imm));
            return(true);
        }
Beispiel #4
0
        // 6-bit immediate
        private static bool u6(uint uInstr, XCore200Disassembler dasm)
        {
            var u = uInstr & 0x3F;

            dasm.ops.Add(ImmediateOperand.Word32(u));
            return(false);
        }
Beispiel #5
0
        private static bool r2us_bitp(uint uInstr, XCore200Disassembler dasm)
        {
            // Get low bits first.
            var imm3  = uInstr & 0x03;
            var iReg2 = (uInstr >> 2) & 0x03;
            var iReg1 = (uInstr >> 4) & 0x03;
            // Extract base3 field.

            var base3 = (uInstr >> 6) & 0x1F;

            imm3  += (base3 % 3) << 2;
            base3  = base3 / 3;
            iReg2 += (base3 % 3) << 2;
            base3  = base3 / 3;
            iReg1 += (base3 % 3) << 2;
            if (iReg1 >= 12)
            {
                return(false);
            }
            imm3 = bitpos32[imm3];
            dasm.ops.Add(new RegisterOperand(Registers.GpRegs[iReg1]));
            dasm.ops.Add(new RegisterOperand(Registers.GpRegs[iReg2]));
            dasm.ops.Add(ImmediateOperand.Word32(imm3));
            return(true);
        }
Beispiel #6
0
        private static bool PcRel11_2(uint uInstr, XCore200Disassembler dasm)
        {
            var offset = pcRe11Field.ReadSigned(uInstr);
            var addr   = dasm.addr + 2 * offset;

            dasm.ops.Add(AddressOperand.Create(addr));
            return(true);
        }
Beispiel #7
0
        // 10-bit pc-relative negative displacement
        private static bool u10_m_pc(uint uInstr, XCore200Disassembler dasm)
        {
            var displacement = (int)(uInstr & Bits.Mask(0, 10)) << 1;
            var addr         = dasm.addr - displacement;

            dasm.ops.Add(AddressOperand.Create(addr));
            return(true);
        }
Beispiel #8
0
 public override XCoreInstruction Decode(uint wInstr, XCore200Disassembler dasm)
 {
     if (!dasm.rdr.TryReadLeUInt16(out ushort u2))
     {
         return(dasm.CreateInvalidInstruction());
     }
     wInstr = (wInstr << 16) | u2;
     return(subDecoder.Decode(wInstr, dasm));
 }
Beispiel #9
0
        //Register with 6-bit immediate
        private static bool ru6(uint uInstr, XCore200Disassembler dasm)
        {
            var iReg = (uInstr >> 6) & 0xF;
            var imm  = (uInstr & 0x3F);

            dasm.ops.Add(new RegisterOperand(Registers.GpRegs[iReg]));
            dasm.ops.Add(ImmediateOperand.Word32(imm));
            return(true);
        }
Beispiel #10
0
        //Register with 6-bit immediate added to PC
        private static bool ru6_p_pc(uint uInstr, XCore200Disassembler dasm)
        {
            var iReg = (uInstr >> 6) & 0xF;
            var imm  = (uInstr & 0x3F) << 1;
            var addr = dasm.addr + imm;

            dasm.ops.Add(new RegisterOperand(Registers.GpRegs[iReg]));
            dasm.ops.Add(AddressOperand.Create(addr));
            return(true);
        }
Beispiel #11
0
        //Register with 6-bit immediate subtracted from PC
        private static bool ru6_m_pc(uint uInstr, XCore200Disassembler dasm)
        {
            var iReg = (uInstr >> 6) & 0xF;
            var imm  = uInstr & 0x3F;

            if ((imm & 1) != 0)
            {
                return(false);       // Illegal address.
            }
            var addr = dasm.addr - imm;

            dasm.ops.Add(new RegisterOperand(Registers.GpRegs[iReg]));
            dasm.ops.Add(AddressOperand.Create(addr));
            return(true);
        }
Beispiel #12
0
            public override XCoreInstruction Decode(uint wInstr, XCore200Disassembler dasm)
            {
                foreach (var m in mutators)
                {
                    if (!m(wInstr, dasm))
                    {
                        return(dasm.CreateInvalidInstruction());
                    }
                }
                var instr = new XCoreInstruction
                {
                    InstructionClass = iclass,
                    Mnemonic         = mnemonic,
                    Operands         = dasm.ops.ToArray()
                };

                return(instr);
            }
Beispiel #13
0
 // Six registers long.
 private static bool l6r(uint uInstr, XCore200Disassembler dasm)
 {
     return(false);
 }