public NitroOverlay(NitroROM rom, uint id)
        {
            m_ROM = rom;
            m_ID  = id;

            bool autorw = !m_ROM.CanRW();

            if (autorw)
            {
                m_ROM.BeginRW();
            }

            m_OVTEntryAddr = m_ROM.GetOverlayEntryOffset(m_ID);
            m_FileID       = m_ROM.GetFileIDFromOverlayID(m_ID);

            m_RAMAddr = m_ROM.Read32(m_OVTEntryAddr + 0x04);
            Byte flags = m_ROM.Read8(m_OVTEntryAddr + 0x1F);

            m_Data = m_ROM.ExtractFile(m_FileID);
            if ((flags & 0x01) == 0x01)
            {
                Jap77.Decompress(ref m_Data);
            }

            if (autorw)
            {
                m_ROM.EndRW();
            }
        }
Exemple #2
0
        private void Patch_v1(BackgroundWorker lazyman)
        {
            lazyman.ReportProgress(100);

            // read the ARM9 binary, decompress it and write it back
            m_FileStream.Position = 0x2C;
            int oldsize = (int)(m_BinReader.ReadUInt32() - 0x4000);

            m_FileStream.Position = 0x8000;
            byte[] binary = m_BinReader.ReadBytes(oldsize);
            Jap77.Decompress(ref binary);

            lazyman.ReportProgress(150);

            int newsize = (binary.Length + 3) & ~3;
            int delta   = newsize - oldsize;

            MakeRoom((uint)(0x8000 + oldsize), (uint)delta);

            m_FileStream.Position = 0x8000;
            m_BinWriter.Write(binary);

            lazyman.ReportProgress(199);

            // patch the loader code so that it doesn't try to decompress
            // the already decompressed binary
            UInt32 nop = 0xE1A00000;

            m_FileStream.Position = 0x484C;
            m_BinWriter.Write(nop);
            m_BinWriter.Write(nop);
            m_BinWriter.Write(nop);

            int fixstart = 0x8000 + oldsize;

            AutoFix(0xFFFF, (uint)fixstart, delta);

            // fix the ARM9 binary size - important
            uint newarm9size = (uint)(0x4000 + newsize);

            m_FileStream.Position = 0x2C;
            m_BinWriter.Write(newarm9size);
        }
        public NitroOverlay(NitroROM rom, uint id)
        {
            m_ROM = rom;
            m_ID  = id;

            if (Program.m_IsROMFolder)
            {
                List <Ndst.Overlay> overlays = JsonConvert.DeserializeObject <List <Ndst.Overlay> >(NitroROM.GetExtractedLines("__ROM__/arm9Overlays.json"));
                Ndst.Overlay        o        = overlays.Where(x => x.Id == id).ElementAt(0);
                m_FileID  = o.FileId;
                m_RAMAddr = o.RAMAddress;
                m_Data    = NitroROM.GetExtractedBytes("__ROM__/Arm9/" + id + ".bin");
                if ((o.Flags & 0x01000000) > 0)
                {
                    Jap77.Decompress(ref m_Data);
                }
                return;
            }

            bool autorw = !m_ROM.CanRW();

            if (autorw)
            {
                m_ROM.BeginRW();
            }

            m_OVTEntryAddr = m_ROM.GetOverlayEntryOffset(m_ID);
            m_FileID       = m_ROM.GetFileIDFromOverlayID(m_ID);

            m_RAMAddr = m_ROM.Read32(m_OVTEntryAddr + 0x04);
            Byte flags = m_ROM.Read8(m_OVTEntryAddr + 0x1F);

            m_Data = m_ROM.ExtractFile(m_FileID);
            if ((flags & 0x01) == 0x01)
            {
                Jap77.Decompress(ref m_Data);
            }

            if (autorw)
            {
                m_ROM.EndRW();
            }
        }