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(); } }
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(); } }