private void Read_GetStream(ref SegmentedBank curSegBank, ref Stream s, ref BinaryReader br, ref FileStream fs, ref BinaryReader brfs, RomManager rommgr, int scriptStartInBank, Dictionary <byte, BinaryReader> dicBankBinaryReaders, Dictionary <byte, SegmentedBank> segDic) { byte bankID = Conversions.ToByte(scriptStartInBank >> 24); curSegBank = rommgr.GetSegBank(bankID); if (curSegBank is null && segDic?.ContainsKey(bankID) == true) { curSegBank = segDic[bankID]; } if (curSegBank?.Data is object) { s = curSegBank.Data; if (dicBankBinaryReaders.ContainsKey(curSegBank.BankID)) { br = dicBankBinaryReaders[curSegBank.BankID]; } else { br = new BinaryReader(curSegBank.Data); dicBankBinaryReaders.Add(curSegBank.BankID, br); } } else { if (fs is null) { fs = new FileStream(rommgr.RomFile, FileMode.Open, FileAccess.Read); } if (brfs is null) { brfs = new BinaryReader(fs); } s = fs; br = brfs; } if (curSegBank is object) { s.Position = s == fs?curSegBank.SegToRomAddr(scriptStartInBank) : curSegBank.BankOffsetFromSegAddr(scriptStartInBank); } }
public void FromStream(object input, int segAddress, byte?AreaID) { Close(); var rommgr = input as RomManager; var data = input as BinaryData; var lastPositions = new Stack <int>(); SegmentedBank curSeg = null; void getSegBank(int segAddr) { if (rommgr is object) { curSeg = FromStream_GetSegBank(rommgr, segAddress, AreaID); data = new BinaryStreamData(curSeg.Data); } } getSegBank(segAddress); data.Position = curSeg is object?curSeg.BankOffsetFromSegAddr(segAddress) : segAddress & 0xffffff; bool continueDo = true; while (data.Position < curSeg.Length && continueDo) { // Read Command var cmdbytes = new byte[8]; data.Read(cmdbytes); // Create & Add Command var cmd = new DisplayListCommand(cmdbytes) { RomAddress = (int)(curSeg?.RomStart ?? 0 + data.Position), BankAddress = (int)(curSeg?.BankAddress ?? 0 + data.Position) }; Add(cmd); switch (cmd.CommandType) { case CommandTypes.NOOP: { cmd.Position = 0; int checkVal = cmd.ReadInt32(); cmd.Position = 0; if (checkVal != 0) { break; } break; } case CommandTypes.DisplayList: { cmd.Position = 4; int segAddr = cmd.ReadInt32(); cmd.Position = 0; getSegBank(segAddr); if (curSeg is object) { if (cmdbytes[1] != 1) { lastPositions.Push(Conversions.ToInteger(data.Position)); } else { lastPositions.Clear(); } data.Position = curSeg.BankOffsetFromSegAddr(segAddr); } else { break; } break; } case CommandTypes.EndDisplaylist: { if (lastPositions.Count > 0) { curSeg.Data.Position = lastPositions.Pop(); } else { continueDo = false; } break; } } } }