private void SaveToStream(Stream stream, uint destType, uint destAddr)
{
if (stream == null)
{
return;
}
Quetzal quetzal = new Quetzal();
// 'IFhd' identifies the first 128 bytes of the game file
quetzal["IFhd"] = image.GetOriginalIFHD();
// 'CMem' or 'UMem' are the compressed/uncompressed contents of RAM
byte[] origRam = image.GetOriginalRAM();
byte[] newRomRam = image.GetMemory();
int ramSize = (int)(image.EndMem - image.RamStart);
#if !SAVE_UNCOMPRESSED
quetzal["CMem"] = Quetzal.CompressMemory(
origRam, 0, origRam.Length,
newRomRam, (int)image.RamStart, ramSize);
#else
byte[] umem = new byte[ramSize + 4];
BigEndian.WriteInt32(umem, 0, (uint)ramSize);
Array.Copy(newRomRam, (int)image.RamStart, umem, 4, ramSize);
quetzal["UMem"] = umem;
#endif
// 'Stks' is the contents of the stack, with a stub on top
// identifying the destination of the save opcode.
PushCallStub(new CallStub(destType, destAddr, pc, fp));
byte[] trimmed = new byte[sp];
Array.Copy(stack, trimmed, (int)sp);
quetzal["Stks"] = trimmed;
PopCallStub();
// 'MAll' is the list of heap blocks
if (heap != null)
quetzal["MAll"] = heap.Save();
else
{
}
quetzal.WriteToStream(stream);
}