Пример #1
0
 public override PICInstruction Decode(ushort uInstr, PICDisassemblerBase dasm)
 {
     if (uInstr == 0x00FFU)
     {
         return(new PICInstructionNoOpnd(opcode));
     }
     return(new PICInstructionNoOpnd(Opcode.invalid));
 }
Пример #2
0
            public override PICInstruction Decode(ushort uInstr, PICDisassemblerBase dasm)
            {
                var adr = uInstr.Extract(0, 8);
                var acc = uInstr.Extract(8, 1);
                var dst = uInstr.Extract(9, 1);

                return(new PICInstructionMemFDA(mnemonic, adr, dst, acc));
            }
Пример #3
0
            public override PICInstruction Decode(ushort uInstr, PICDisassemblerBase dasm)
            {
                var adr   = uInstr.Extract(0, 8);
                var acc   = uInstr.Extract(8, 1);
                var bitno = uInstr.Extract(9, 3);

                return(new PICInstructionMemFBA(opcode, adr, bitno, acc));
            }
Пример #4
0
            public override PICInstruction Decode(ushort uInstr, PICDisassemblerBase dasm)
            {
                var bsrval = uInstr.Extract(0, 8);

                if (bsrval >= 16)
                {
                    return(new PICInstructionNoOpnd(Mnemonic.invalid));
                }
                return(new PICInstructionImmedByte(mnemonic, bsrval));
            }
Пример #5
0
 public static PICRewriter Create(PICArchitecture arch, PICDisassemblerBase dasm, PICProcessorState state, IStorageBinder binder, IRewriterHost host)
 {
     return(new PIC18EggRewriter(
                arch ?? throw new ArgumentNullException(nameof(arch)),
                dasm ?? throw new ArgumentNullException(nameof(dasm)),
                state ?? throw new ArgumentNullException(nameof(state)),
                binder ?? throw new ArgumentNullException(nameof(binder)),
                host ?? throw new ArgumentNullException(nameof(host))
                ));
 }
Пример #6
0
            public override PICInstruction Decode(ushort uInstr, PICDisassemblerBase dasm)
            {
                byte bsrval = (byte)uInstr.Extract(0, 8);

                if (bsrval >= 64)
                {
                    return(new PICInstructionNoOpnd(Opcode.invalid));
                }
                return(new PICInstructionImmedByte(opcode, bsrval));
            }
Пример #7
0
            public override PICInstruction Decode(ushort uInstr, PICDisassemblerBase dasm)
            {
                // This a 2-words instruction.
                if (!GetAddlInstrWord(dasm.rdr, out ushort word2))
                {
                    return(new PICInstructionNoOpnd(Mnemonic.invalid));
                }
                uint dstaddr = (uint)(uInstr.Extract(0, 8) | (word2 << 8));

                return(new PICInstructionProgTarget(opcode, dstaddr));
            }
Пример #8
0
            public override PICInstruction Decode(ushort uInstr, PICDisassemblerBase dasm)
            {
                if (PICMemoryDescriptor.ExecMode != PICExecMode.Extended) // Is PIC running in Extended Execution mode...
                {
                    return(new PICInstructionNoOpnd(Mnemonic.invalid));
                }

                var imm8 = (byte)uInstr.Extract(0, 8);

                return(new PICInstructionImmedByte(mnemonic, imm8));
            }
Пример #9
0
            public override PICInstruction Decode(ushort uInstr, PICDisassemblerBase dasm)
            {
                if (PICMemoryDescriptor.ExecMode != PICExecMode.Extended) // Only supported by PIC18 running in Extended Execution mode.
                {
                    return(new PICInstructionNoOpnd(Mnemonic.invalid));
                }

                var imm6 = uInstr.Extract(0, 6);

                return(new PICInstructionImmedByte(mnemonic, imm6));
            }
Пример #10
0
            public override PICInstruction Decode(ushort uInstr, PICDisassemblerBase dasm)
            {
                byte fsrnum = (byte)uInstr.Extract(6, 2);

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

                return(new PICInstructionFSRUArith(opcode, fsrnum, imm6));
            }
Пример #11
0
            public override PICInstruction Decode(ushort uInstr, PICDisassemblerBase dasm)
            {
                // This is a 2-word instruction.
                if (!GetAddlInstrWord(dasm.rdr, out ushort word2))
                {
                    return(new PICInstructionNoOpnd(Opcode.invalid));
                }
                uint   dstaddr = (uint)(uInstr.Extract(0, 8) | (word2 << 8));
                ushort ufast   = uInstr.Extract(8, 1);

                return(new PICInstructionProgTargetFast(opcode, dstaddr, ufast, false));
            }
Пример #12
0
            public override PICInstruction Decode(ushort uInstr, PICDisassemblerBase dasm)
            {
                // This a 2-word instruction.
                if (!GetAddlInstrWord(dasm.rdr, out ushort dst))
                {
                    return(new PICInstructionNoOpnd(Mnemonic.invalid));
                }

                var src = uInstr.Extract(0, 12);

                return(new PICInstructionMem2Mem(opcode, src, dst));
            }
Пример #13
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));
            }
Пример #14
0
 public override PICInstruction Decode(ushort uInstr, PICDisassemblerBase dasm)
 {
     if ((uInstr & 0b11_1111_1111_1100) == 0b00_0001_0000_0000)
     {
         return(new PICInstructionNoOpnd(Mnemonic.CLRW));
     }
     if ((uInstr & 0b11_1111_1100_0000) == 0b00_0001_0100_0000)
     {
         return(new PICInstructionImmedByte(Mnemonic.MOVLB, (byte)uInstr.Extract(0, 6)));
     }
     return(new PICInstructionNoOpnd(Mnemonic.invalid));
 }
Пример #15
0
            public override PICInstruction Decode(ushort uInstr, PICDisassemblerBase dasm)
            {
                switch (uInstr)
                {
                    case 0b00_0001_0000_0000:
                    case 0b00_0001_0000_0001:
                    case 0b00_0001_0000_0010:
                    case 0b00_0001_0000_0011:
                        return new PICInstructionNoOpnd(Mnemonic.CLRW);

                    default:
                        return new PICInstructionNoOpnd(Mnemonic.invalid);
                }
            }
Пример #16
0
            public override PICInstruction Decode(ushort uInstr, PICDisassemblerBase dasm)
            {
                if (!GetAddlInstrWord(dasm.rdr, out ushort lsw))
                {
                    return(new PICInstructionNoOpnd(Mnemonic.invalid));
                }
                if (lsw >= 256)  // second word must be <xxxx 0000 kkkk kkkk>
                {
                    return(new PICInstructionNoOpnd(Mnemonic.invalid));
                }

                var msw   = uInstr.Extract(0, 4);
                var operd = (ushort)((msw << 8) | lsw);

                return(new PICInstructionImmedUShort(opcode, operd));
            }
Пример #17
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));
            }
Пример #18
0
            public override PICInstruction Decode(ushort uInstr, PICDisassemblerBase dasm)
            {
                if (PICMemoryDescriptor.ExecMode != PICExecMode.Extended) // Is PIC running in Extended Execution mode...
                {
                    return(new PICInstructionNoOpnd(Mnemonic.invalid));
                }

                // This is a 2-word instruction.
                if (!GetAddlInstrWord(dasm.rdr, out ushort word2))
                {
                    return(new PICInstructionNoOpnd(Mnemonic.invalid));
                }

                var operzs = (byte)uInstr.Extract(0, 7);
                var operzd = (byte)word2.Extract(0, 7);

                return(new PICInstructionMem2Mem(mnemonic, operzs, operzd));
            }
Пример #19
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(Opcode.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(null);
                }

                return(new PICInstructionMem2Mem(opcode, srcaddr, dstaddr));
            }
Пример #20
0
            public override PICInstruction Decode(ushort uInstr, PICDisassemblerBase dasm)
            {
                switch (uInstr)
                {
                case 0b00_0000_0110_0011:
                    return(new PICInstructionNoOpnd(Mnemonic.SLEEP));

                case 0b00_0000_0110_0100:
                    return(new PICInstructionNoOpnd(Mnemonic.CLRWDT));

                case 0b00_0000_0110_0101:
                case 0b00_0000_0110_0110:
                case 0b00_0000_0110_0111:
                    return(new PICInstructionTris(Mnemonic.TRIS, (byte)uInstr.Extract(0, 3)));

                default:
                    return(new PICInstructionNoOpnd(Mnemonic.invalid));
                }
            }
Пример #21
0
            public override PICInstruction Decode(ushort uInstr, PICDisassemblerBase dasm)
            {
                if (PICMemoryDescriptor.ExecMode != PICExecMode.Extended) // PIC not running in Extended Execution mode?
                {
                    return(new PICInstructionNoOpnd(Mnemonic.invalid));
                }

                // This is a 2-word instruction.
                if (!GetAddlInstrWord(dasm.rdr, out ushort fd))
                {
                    return(new PICInstructionNoOpnd(Mnemonic.invalid));
                }

                // PCL, TOSL, TOSH, TOSU are invalid destinations.
                if (PICRegisters.NotAllowedDest(fd))
                {
                    return(new PICInstructionNoOpnd(Mnemonic.invalid));
                }

                var operzs = (byte)uInstr.Extract(0, 7);

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

                if (fsrnum >= 3)
                {
                    return(new PICInstructionNoOpnd(Mnemonic.invalid));
                }

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

                var imm12 = (ushort)(((uInstr.Extract(0, 4) << 8) | word2));

                return(new PICInstructionLFSRLoad(mnemonic, fsrnum, imm12));
            }
Пример #23
0
        protected Identifier Fsr2;    // cached FSR2 register identifier

        protected PIC18RewriterBase(PICArchitecture arch, PICDisassemblerBase disasm, PICProcessorState state, IStorageBinder binder, IRewriterHost host)
            : base(arch, disasm, state, binder, host)
        {
            Fsr2 = binder.EnsureRegister(PIC18Registers.FSR2);
        }
Пример #24
0
            public override PICInstruction Decode(ushort uInstr, PICDisassemblerBase dasm)
            {
                var mode = uInstr.Extract(0, 2);

                return(new PICInstructionTbl(opcode, mode));
            }
Пример #25
0
 private PIC18EggRewriter(PICArchitecture arch, PICDisassemblerBase dasm, PICProcessorState state, IStorageBinder binder, IRewriterHost host)
     : base(arch, dasm, state, binder, host)
 {
 }
Пример #26
0
            public override PICInstruction Decode(ushort uInstr, PICDisassemblerBase dasm)
            {
                var off = uInstr.ExtractSignExtend(0, 11);

                return(new PICInstructionProgTarget(opcode, off, dasm.addrCur));
            }
Пример #27
0
            public override PICInstruction Decode(ushort uInstr, PICDisassemblerBase dasm)
            {
                var ufast = uInstr.Extract(0, 1);

                return(new PICInstructionFast(opcode, ufast, true));
            }
Пример #28
0
 protected PIC16RewriterBase(PICArchitecture arch, PICDisassemblerBase disasm, PICProcessorState state, IStorageBinder binder, IRewriterHost host)
     : base(arch, disasm, state, binder, host)
 {
 }
Пример #29
0
            public override PICInstruction Decode(ushort uInstr, PICDisassemblerBase dasm)
            {
                var imm8 = uInstr.Extract(0, 8);

                return(new PICInstructionImmedByte(opcode, imm8));
            }
Пример #30
0
 public override PICInstruction Decode(ushort uInstr, PICDisassemblerBase dasm)
 {
     return(new PICInstructionNoOpnd(opcode));
 }