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)); }
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)); }
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; } } } }