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);
        }
Ejemplo n.º 2
0
        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);
        }