private void RelocateSegmentReferences(MemoryArea image) { foreach (var seg in segments) { foreach (var reloc in seg.Relocations) { image.WriteLeUInt16((uint)((reloc.Segment.Selector - addrBase.Selector.Value) * 16u + reloc.Offset), seg.Selector); } } }
// Unpacks the relocation entries in a LzExe 0.91 binary private SegmentMap Relocate91(byte [] abUncompressed, ushort segReloc, MemoryArea pgmImgNew) { const int CompressedRelocationTableAddress = 0x0158; var relocations = pgmImgNew.Relocations; int ifile = lzHdrOffset + CompressedRelocationTableAddress; int rel_off=0; for (;;) { ushort span = abUncompressed[ifile++]; if (span == 0) { span = abUncompressed[ifile++]; span |= (ushort) (abUncompressed[ifile++] << 8); if (span == 0) { rel_off += 0x0FFF0; continue; } else if (span == 1) { break; } } rel_off += span; ushort seg = (ushort) (pgmImgNew.ReadLeUInt16((uint)rel_off) + segReloc); pgmImgNew.WriteLeUInt16((uint)rel_off, seg); relocations.AddSegmentReference((uint)rel_off, seg); segmentMap.AddSegment( new ImageSegment( seg.ToString("X4"), Address.SegPtr(seg, 0), this.imgLoaded, AccessMode.ReadWriteExecute)); } return segmentMap; }