Beispiel #1
0
        public void relocate32(int hunk_no, byte[] data, uint offset, uint hunk_addr)
        {
            var delta = MemoryArea.ReadBeUInt32(data, offset);
            var addr  = hunk_addr + delta;

            MemoryArea.WriteBeUInt32(data, offset, addr);
            Debug.WriteIf(Trace.TraceVerbose, string.Format("#{0,2} + {1:X8}: {2:X6} (delta) + {3:X6} (hunk_addr) -> {4:X6}", hunk_no, offset, delta, hunk_addr, addr));
        }
Beispiel #2
0
        private PowerPcInstruction DisassembleX(uint op, uint rs, uint ra, uint rb, uint xo, uint rc)
        {
            uint w =
                (op << 26) |
                (rs << 21) |
                (ra << 16) |
                (rb << 11) |
                (xo << 1) |
                rc;
            MemoryArea img = new MemoryArea(Address.Ptr32(0x00100000), new byte[4]);

            img.WriteBeUInt32(0, w);
            return(Disassemble(img));
        }
Beispiel #3
0
        bool PerformRelocations(MemoryArea mem, ImageReader rdr)
        {
            uint fixup;

            if (!rdr.TryReadBeUInt32(out fixup))
            {
                return(false);
            }
            if (fixup == 0)
            {
                return(true);    // no relocations to do.
            }
            uint offset = fixup;

            for (;;)
            {
                var  dst = mem.BaseAddress + offset;
                uint l   = mem.ReadBeUInt32(offset);
                l += mem.BaseAddress.ToUInt32();
                mem.WriteBeUInt32(offset, l);
                mem.Relocations.AddPointerReference(mem.BaseAddress.ToLinear() + offset, l);

                byte b;
                for (;;)
                {
                    if (!rdr.TryReadByte(out b))
                    {
                        return(false);
                    }
                    if (b == 0)
                    {
                        return(true);
                    }
                    else if (b == 1)
                    {
                        offset += 254;
                    }
                    else
                    {
                        offset += b;
                        break;
                    }
                }
            }
        }