Example #1
0
        /// <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);
        }
Example #2
0
        private Identifier Reg(string name)
        {
            var reg = arch.GetRegister(name);

            return(binder.EnsureRegister(reg));
        }
Example #3
0
        private Identifier Reg(int rn)
        {
            var reg = arch.GetRegister(rn);

            return(binder.EnsureRegister(reg));
        }