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