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(); } }
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(); } }
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(); }
/* * This method takes the first Address and Data from the patch and tests if the current values in the * ROM match the values of the patch - if they match the patch is already applied. This doesn't test * all values to speed things up. */ public bool CheckIsApplied(NitroROM rom) { if (m_DecompressAllOverlays && Helper.CheckAllOverlaysDecompressed() == false) { m_IsApplied = false; return false; } INitroROMBlock fileToPatch = null; if (m_FileToPatch != null) fileToPatch = Program.m_ROM.GetFileFromName(m_FileToPatch); else if (m_OverlayID != null) fileToPatch = new NitroOverlay(Program.m_ROM, uint.Parse(m_OverlayID)); AddressDataPair testAddressDataPair = null; switch (rom.m_Version) { case NitroROM.Version.EUR: testAddressDataPair = (m_EURPatch.Count == 0) ? null : m_EURPatch.ElementAt(0); break; case NitroROM.Version.USA_v1: testAddressDataPair = (m_USv1Patch.Count == 0) ? null : m_USv1Patch.ElementAt(0); break; case NitroROM.Version.USA_v2: testAddressDataPair = (m_USv2Patch.Count == 0) ? null : m_USv2Patch.ElementAt(0); break; case NitroROM.Version.JAP: testAddressDataPair = (m_JAPPatch.Count == 0) ? null : m_JAPPatch.ElementAt(0); break; } if (testAddressDataPair == null || testAddressDataPair.m_Data == null || testAddressDataPair.m_Data.Length == 0) { m_IsApplied = false; return false; } for (int i = 0; i < testAddressDataPair.m_Data.Length; i++) { if (fileToPatch == null && rom.Read8(testAddressDataPair.m_Address + (uint)i) != testAddressDataPair.m_Data[i]) { m_IsApplied = false; return false; } else if (fileToPatch != null && fileToPatch.Read8(testAddressDataPair.m_Address + (uint)i) != testAddressDataPair.m_Data[i]) { m_IsApplied = false; return false; } } //If it reaches here, the patch has already been applied m_IsApplied = true; return true; }
/* * This method takes the first Address and Data from the patch and tests if the current values in the * ROM match the values of the patch - if they match the patch is already applied. This doesn't test * all values to speed things up. */ public bool CheckIsApplied(NitroROM rom) { if (m_DecompressAllOverlays && Helper.CheckAllOverlaysDecompressed() == false) { m_IsApplied = false; return(false); } INitroROMBlock fileToPatch = null; if (m_FileToPatch != null) { fileToPatch = Program.m_ROM.GetFileFromName(m_FileToPatch); } else if (m_OverlayID != null) { fileToPatch = new NitroOverlay(Program.m_ROM, uint.Parse(m_OverlayID)); } AddressDataPair testAddressDataPair = null; switch (rom.m_Version) { case NitroROM.Version.EUR: testAddressDataPair = (m_EURPatch.Count == 0) ? null : m_EURPatch.ElementAt(0); break; case NitroROM.Version.USA_v1: testAddressDataPair = (m_USv1Patch.Count == 0) ? null : m_USv1Patch.ElementAt(0); break; case NitroROM.Version.USA_v2: testAddressDataPair = (m_USv2Patch.Count == 0) ? null : m_USv2Patch.ElementAt(0); break; case NitroROM.Version.JAP: testAddressDataPair = (m_JAPPatch.Count == 0) ? null : m_JAPPatch.ElementAt(0); break; } if (testAddressDataPair == null || testAddressDataPair.m_Data == null || testAddressDataPair.m_Data.Length == 0) { m_IsApplied = false; return(false); } for (int i = 0; i < testAddressDataPair.m_Data.Length; i++) { if (fileToPatch == null) { if (Program.m_IsROMFolder) { Program.m_ROM.arm9R.BaseStream.Position = testAddressDataPair.m_Address + (uint)i - Program.m_ROM.headerSize; if (Program.m_ROM.arm9R.ReadByte() != testAddressDataPair.m_Data[i]) { m_IsApplied = false; return(false); } } else { if (rom.Read8(testAddressDataPair.m_Address + (uint)i) != testAddressDataPair.m_Data[i]) { m_IsApplied = false; return(false); } } } else if (fileToPatch != null && fileToPatch.Read8(testAddressDataPair.m_Address + (uint)i) != testAddressDataPair.m_Data[i]) { m_IsApplied = false; return(false); } } //If it reaches here, the patch has already been applied m_IsApplied = true; return(true); }