/// <summary> /// Given an image reader positioned at a Keil sparse switch table, generates /// an <see cref="RtlInstructionCluster" /> that implements the table as a /// sequence of RTL if-instructions. /// </summary> private RtlInstructionCluster MakeCluster(Address addrPatch, ImageReader rdr) { var binder = new StorageBinder(); var areg = binder.EnsureRegister(Registers.A); var m = new RtlEmitter(new List <RtlInstruction>()); while (rdr.TryReadBeUInt16(out ushort uAddrDst)) { if (uAddrDst == 0) { if (!rdr.TryReadBeUInt16(out uAddrDst)) { break; } m.Goto(Address.Ptr16(uAddrDst)); break; } if (!rdr.TryReadByte(out byte bValue)) { break; } var addrDst = Address.Ptr16(uAddrDst); m.BranchInMiddleOfInstruction(m.Eq(areg, bValue), addrDst, InstrClass.ConditionalTransfer); } int length = (int)(rdr.Address - addrPatch); var cluster = m.MakeCluster(addrPatch, length, InstrClass.Transfer); return(cluster); }
private Identifier Reg(string name) { var reg = arch.GetRegister(name); return(binder.EnsureRegister(reg)); }
private Identifier Reg(int rn) { var reg = arch.GetRegister(rn); return(binder.EnsureRegister(reg)); }