public static byte[] CreateExePackedImage() { var egaCmn = Resource.Load("EGA.CMN"); var mcgaCod = Resource.Load("MCGA.COD"); var mcgaDif = Resource.Load("MCGA.DIF"); var mcgaHdr = Resource.Load("MCGA.HDR"); var bytesInLastPage = ReadUshortAt(mcgaHdr, 2); var pagesInExecutable = ReadUshortAt(mcgaHdr, 4); var paragraphsInHeader = ReadUshortAt(mcgaHdr, 8); int executableSize = pagesInExecutable << 9; if (bytesInLastPage > 0) { executableSize += bytesInLastPage - 0x1f0; } int headerSize = paragraphsInHeader << 4; var executableImage = new byte[executableSize]; mcgaHdr.CopyTo(executableImage, 0); egaCmn.CopyTo(executableImage, headerSize); mcgaCod.CopyTo(executableImage, headerSize + egaCmn.Length); var difStream = new ReadStream(mcgaDif); int writeOffset = headerSize - 1; while (true) { var jump = (ushort)difStream.ReadShort(); if (jump == 0) { break; } writeOffset += jump & 0x7fff; executableImage[writeOffset] = difStream.ReadByte(); executableImage[writeOffset + 1] = difStream.ReadByte(); if ((jump & 0x8000) != 0) { executableImage[writeOffset + 2] = difStream.ReadByte(); executableImage[writeOffset + 3] = difStream.ReadByte(); } } return(executableImage); }
public static Dictionary <string, byte[]> ReadResourceMap(byte[] rawResource) { var result = new Dictionary <string, byte[]>(); var input = new ReadStream(rawResource); input.Skip(4); var resourceCount = input.ReadShort(); var ids = new string[resourceCount]; for (int i = 0; i < resourceCount; i++) { ids[i] = input.ReadFixedLengthString(4); } var sortedIds = new SortedDictionary <int, string>(); for (int i = 0; i < resourceCount; i++) { sortedIds[input.ReadInt()] = ids[i]; } var data = new ReadBuffer(rawResource).Drop(6 + 8 * resourceCount); var sortedOffsets = new List <int>(sortedIds.Keys); sortedOffsets.Add(data.Length); for (int i = 0; i < resourceCount; i++) { var startOffset = sortedOffsets[i]; var endOffset = sortedOffsets[i + 1]; result[sortedIds[startOffset]] = data.Slice(startOffset, endOffset - startOffset).ToArray(); } return(result); }