Пример #1
0
            public override PICInstruction Decode(ushort uInstr, PICDisassemblerBase dasm)
            {
                byte fsrnum = (byte)uInstr.Extract(6, 2);

                if (fsrnum >= 3)
                {
                    return(dasm.CreateInvalidInstruction());
                }
                var imm6 = (byte)uInstr.Extract(0, 6);

                return(new PICInstructionFSRUArith(mnemonic, fsrnum, imm6));
            }
Пример #2
0
            public override PICInstruction Decode(ushort uInstr, PICDisassemblerBase dasm)
            {
                if (PICMemoryDescriptor.ExecMode != PICExecMode.Extended)
                {
                    return(new PICInstructionNoOpnd(Mnemonic.invalid));
                }
                byte fsrnum = (byte)uInstr.Extract(6, 2);

                if (fsrnum >= 3)
                {
                    return(dasm.CreateInvalidInstruction());
                }
                var imm6 = (byte)uInstr.Extract(0, 6);

                return(new PICInstructionFSRUArith(mnemonic, fsrnum, imm6));
            }
Пример #3
0
            public override PICInstruction Decode(ushort uInstr, PICDisassemblerBase dasm)
            {
                // This is a 3-word instruction.
                if (!GetAddlInstrWord(dasm.rdr, out ushort word2) || !GetAddlInstrWord(dasm.rdr, out ushort word3))
                {
                    return(new PICInstructionNoOpnd(Mnemonic.invalid));
                }
                ushort srcaddr = (ushort)((uInstr.Extract(0, 4) << 10) | word2.Extract(2, 10));
                ushort dstaddr = (ushort)(word3.Extract(0, 12) | (word2.Extract(0, 2) << 12));

                // PCL, TOSL, TOSH, TOSU are invalid destinations.
                if (PICRegisters.NotAllowedDest(dstaddr))
                {
                    return(dasm.CreateInvalidInstruction());
                }

                return(new PICInstructionMem2Mem(mnemonic, srcaddr, dstaddr));
            }
Пример #4
0
            public override PICInstruction Decode(ushort uInstr, PICDisassemblerBase dasm)
            {
                byte fsrnum = (byte)uInstr.Extract(4, 4);

                if (fsrnum >= 3)
                {
                    return(dasm.CreateInvalidInstruction());
                }

                // This is a 2-word instruction.
                if (!GetAddlInstrWord(dasm.rdr, out ushort word2))
                {
                    return(new PICInstructionNoOpnd(Mnemonic.invalid));
                }
                if (word2 > 0x3FF) // Second word must be 'xxxx-00kk-kkkk-kkkk'
                {
                    return(new PICInstructionNoOpnd(Mnemonic.invalid));
                }

                var imm14 = ((ushort)((uInstr.Extract(0, 4) << 10) | word2));

                return(new PICInstructionLFSRLoad(mnemonic, fsrnum, imm14));
            }