public static void InsertObj(byte[] obj, int replace) { int f = RomUtils.GetFileIndexForWriting(Addresses.ObjTable); int basea = Addresses.ObjTable - RomData.MMFileList[f].Addr; uint replaceaddr = ReadWriteUtils.Arr_ReadU32(RomData.MMFileList[f].Data, basea + (replace * 8)); int objf = RomData.MMFileList.FindIndex(u => u.Addr == replaceaddr); if (objf == -1) { return; } ; if (obj.Length > (RomData.MMFileList[objf].End - RomData.MMFileList[objf].Addr)) { MMFile newfile = new MMFile(); newfile.Addr = RomData.MMFileList[RomData.MMFileList.Count - 1].End; newfile.End = newfile.Addr + obj.Length; newfile.IsCompressed = true; newfile.WasEdited = true; newfile.Data = obj; RomData.MMFileList[objf].Cmp_Addr = -1; RomData.MMFileList[objf].Cmp_End = -1; RomData.MMFileList[objf].Data = null; RomData.MMFileList[objf].IsCompressed = false; RomData.MMFileList.Add(newfile); ReadWriteUtils.Arr_WriteU32(RomData.MMFileList[f].Data, basea + (replace * 8), (uint)newfile.Addr); ReadWriteUtils.Arr_WriteU32(RomData.MMFileList[f].Data, basea + (replace * 8) + 4, (uint)newfile.End); } else { RomData.MMFileList[objf].Data = obj; RomData.MMFileList[objf].WasEdited = true; } }
private static void UpdateFileTable(byte[] ROM) { for (int i = 0; i < RomData.MMFileList.Count; i++) { ReadWriteUtils.Arr_WriteU32(ROM, Addresses.FileTable + (i * 16), (uint)RomData.MMFileList[i].Addr); ReadWriteUtils.Arr_WriteU32(ROM, Addresses.FileTable + (i * 16) + 4, (uint)RomData.MMFileList[i].End); ReadWriteUtils.Arr_WriteU32(ROM, Addresses.FileTable + (i * 16) + 8, (uint)RomData.MMFileList[i].Cmp_Addr); ReadWriteUtils.Arr_WriteU32(ROM, Addresses.FileTable + (i * 16) + 12, (uint)RomData.MMFileList[i].Cmp_End); } }
private static void UpdateFileTable(byte[] ROM) { for (int i = 0; i < RomData.MMFileList.Count; i++) { int offset = FILE_TABLE + (i * 16); ReadWriteUtils.Arr_WriteU32(ROM, offset, (uint)RomData.MMFileList[i].Addr); ReadWriteUtils.Arr_WriteU32(ROM, offset + 4, (uint)RomData.MMFileList[i].End); ReadWriteUtils.Arr_WriteU32(ROM, offset + 8, (uint)RomData.MMFileList[i].Cmp_Addr); ReadWriteUtils.Arr_WriteU32(ROM, offset + 12, (uint)RomData.MMFileList[i].Cmp_End); } }
private static void FixCRC(byte[] ROM) { // reference: http://n64dev.org/n64crc.html uint[] CRC = new uint[2]; uint seed = 0xDF26F436; uint t1, t2, t3, t4, t5, t6, r, d; int i = 0x1000; t1 = t2 = t3 = t4 = t5 = t6 = seed; while (i < 0x101000) { d = ReadWriteUtils.Arr_ReadU32(ROM, i); if ((t6 + d) < t6) { t4++; } t6 += d; t3 ^= d; r = (d << (byte)(d & 0x1F)) | (d >> (byte)(32 - (d & 0x1F))); t5 += r; if (t2 < d) { t2 ^= (t6 ^ d); } else { t2 ^= r; } t1 += (ReadWriteUtils.Arr_ReadU32(ROM, 0x750 + (i & 0xFF)) ^ d); i += 4; } CRC[0] = t6 ^ t4 ^ t3; CRC[1] = t5 ^ t2 ^ t1; ReadWriteUtils.Arr_WriteU32(ROM, 16, CRC[0]); ReadWriteUtils.Arr_WriteU32(ROM, 20, CRC[1]); }
public static void RebuildAudioSeq(List <SequenceInfo> SequenceList) { List <MMSequence> OldSeq = new List <MMSequence>(); int f = RomUtils.GetFileIndexForWriting(Addresses.SeqTable); int basea = RomData.MMFileList[f].Addr; for (int i = 0; i < 128; i++) { MMSequence entry = new MMSequence(); if (i == 0x1E) { entry.Addr = 2; entry.Size = 0; OldSeq.Add(entry); continue; } int entryaddr = Addresses.SeqTable + (i * 16); entry.Addr = (int)ReadWriteUtils.Arr_ReadU32(RomData.MMFileList[f].Data, entryaddr - basea); entry.Size = (int)ReadWriteUtils.Arr_ReadU32(RomData.MMFileList[f].Data, (entryaddr - basea) + 4); if (entry.Size > 0) { entry.Data = new byte[entry.Size]; Array.Copy(RomData.MMFileList[4].Data, entry.Addr, entry.Data, 0, entry.Size); } else { int j = SequenceList.FindIndex(u => u.Replaces == i); if (j != -1) { if ((entry.Addr > 0) && (entry.Addr < 128)) { if (SequenceList[j].Replaces != 0x28) { SequenceList[j].Replaces = entry.Addr; } else { entry.Data = OldSeq[0x18].Data; entry.Size = OldSeq[0x18].Size; } } } } OldSeq.Add(entry); } List <MMSequence> NewSeq = new List <MMSequence>(); int addr = 0; byte[] NewAudioSeq = new byte[0]; for (int i = 0; i < 128; i++) { MMSequence newentry = new MMSequence(); if (OldSeq[i].Size == 0) { newentry.Addr = OldSeq[i].Addr; } else { newentry.Addr = addr; } int j = SequenceList.FindIndex(u => u.Replaces == i); if (j != -1) { if (SequenceList[j].MM_seq != -1) { newentry.Size = OldSeq[SequenceList[j].MM_seq].Size; newentry.Data = OldSeq[SequenceList[j].MM_seq].Data; } else { BinaryReader sequence = new BinaryReader(File.Open(SequenceList[j].Name, FileMode.Open)); int len = (int)sequence.BaseStream.Length; byte[] data = new byte[len]; sequence.Read(data, 0, len); sequence.Close(); if (data[1] != 0x20) { data[1] = 0x20; } newentry.Size = len; newentry.Data = data; } } else { newentry.Size = OldSeq[i].Size; newentry.Data = OldSeq[i].Data; } NewSeq.Add(newentry); if (newentry.Data != null) { NewAudioSeq = NewAudioSeq.Concat(newentry.Data).ToArray(); } addr += newentry.Size; } if (addr > (RomData.MMFileList[4].End - RomData.MMFileList[4].Addr)) { MMFile newa = new MMFile(); newa.Addr = RomData.MMFileList[RomData.MMFileList.Count - 1].End; newa.End = newa.Addr + addr; newa.IsCompressed = false; newa.Data = NewAudioSeq; RomData.MMFileList.Add(newa); ResourceUtils.ApplyHack(Values.ModsDirectory + "reloc-audio"); RelocateSeq(RomData.MMFileList.Count - 1); RomData.MMFileList[4].Data = new byte[0]; RomData.MMFileList[4].Cmp_Addr = -1; RomData.MMFileList[4].Cmp_End = -1; } else { RomData.MMFileList[4].Data = NewAudioSeq; } //update pointer table f = RomUtils.GetFileIndexForWriting(Addresses.SeqTable); for (int i = 0; i < 128; i++) { ReadWriteUtils.Arr_WriteU32(RomData.MMFileList[f].Data, (Addresses.SeqTable + (i * 16)) - basea, (uint)NewSeq[i].Addr); ReadWriteUtils.Arr_WriteU32(RomData.MMFileList[f].Data, 4 + (Addresses.SeqTable + (i * 16)) - basea, (uint)NewSeq[i].Size); } //update inst sets f = RomUtils.GetFileIndexForWriting(Addresses.InstSetMap); basea = RomData.MMFileList[f].Addr; for (int i = 0; i < 128; i++) { int paddr = (Addresses.InstSetMap - basea) + (i * 2) + 2; int j = -1; if (NewSeq[i].Size == 0) { j = SequenceList.FindIndex(u => u.Replaces == NewSeq[i].Addr); } else { j = SequenceList.FindIndex(u => u.Replaces == i); } if (j != -1) { RomData.MMFileList[f].Data[paddr] = (byte)SequenceList[j].Instrument; } } }