/// <summary> /// Disassembles a single Full-Featured PIC16 instruction. /// First try for any instruction-set specific decoding. If fail, fall to common decoder. /// </summary> /// <returns> /// A <see cref="PICInstruction"/> instance. /// </returns> /// <exception cref="AddressCorrelatedException">Thrown when the Address Correlated error /// condition occurs.</exception> protected override PICInstruction DecodePICInstruction(ushort uInstr, PICProgAddress addr) { var offset = rdr.Offset; try { var bits = uInstr.Extract(12, 2); instrCur = decoderTable[bits].Decode(uInstr, this); if (instrCur is null) { return(base.DecodePICInstruction(uInstr, addr)); } if (!instrCur.IsValid) { rdr.Offset = offset; } instrCur.Address = addrCur; instrCur.Length = (int)(rdr.Address - addrCur); } catch (AddressCorrelatedException) { throw; } catch (Exception ex) { throw new AddressCorrelatedException(addrCur, ex, $"An exception occurred when disassembling {InstructionSetID.ToString()} binary code 0x{uInstr:X4}."); } return(instrCur); }
protected override PICInstruction DecodeConfigInstruction() { if (!rdr.TryReadUInt16(out ushort uConfigWord)) { return(null); } var cfgAddr = PICProgAddress.Ptr((uint)(addrCur.ToLinear() >> 1)); instrCur = new PICInstructionPseudo(Mnemonic.__CONFIG, new PICOperandConfigBits(arch, cfgAddr, uConfigWord)) { Address = addrCur, Length = (int)(rdr.Address - addrCur) }; return(instrCur); }
/// <summary> /// Disassembles a single PIC16 instruction. /// Only instructions whose binary values are common to all PIC16 families are decoded here. /// This method should be called by derived classes in case the binary instruction they deal /// with can't be decoded for a specific PIC16 instruction-set. /// </summary> /// <param name="addr">The program address of the instruction.</param> /// <param name="uInstr">The instruction binary 16-bit word.</param> /// <returns> /// A <see cref="PICInstruction"/> instance or null. /// </returns> protected override PICInstruction DecodePICInstruction(ushort uInstr, PICProgAddress addr) { try { instrCur = decoderTable[uInstr.Extract(12, 2)].Decode(uInstr, this); } catch (Exception ex) { throw new AddressCorrelatedException(addrCur, ex, $"An exception occurred when disassembling {InstructionSetID.ToString()} binary code 0x{uInstr:X4}."); } // All legal PIC16 instructions are one word long. if (instrCur != null) { instrCur.Address = addrCur; instrCur.Length = 2; } return(instrCur); }