public EditRomInfo(Nitro.Estructuras.ROMHeader header, Nitro.Estructuras.Banner banner) { InitializeComponent(); ReadLanguage(); this.header = header; this.banner = banner; LoadValues(); comboBanTitles.SelectedIndex = 0; }
void editor_FormClosed(object sender, FormClosedEventArgs e) { EditRomInfo editor = (EditRomInfo)sender; if (editor.DialogResult != System.Windows.Forms.DialogResult.OK) { return; } cabecera = editor.Header; banner = editor.Banner; Mostrar_Informacion(cabecera, banner); }
public RomInfo(string archivo) { InitializeComponent(); this.btnBannerGuardar.Image = Properties.Resources.picture_save; try { Nitro.Estructuras.ROMHeader cabecera = Nitro.NDS.LeerCabecera(archivo); Nitro.Estructuras.Banner banner = Nitro.NDS.LeerBanner(archivo, cabecera.bannerOffset); Mostrar_Informacion(cabecera, banner); this.checkTrans.Checked = true; } catch { MessageBox.Show(Tools.Helper.GetTranslation("Messages", "S02"), Tools.Helper.GetTranslation("Messages", "S01"), MessageBoxButtons.OK, MessageBoxIcon.Error); Console.WriteLine(Tools.Helper.GetTranslation("Messages", "S02") + ": " + archivo); return; } LeerIdioma(); }
private void Mostrar_Informacion(Nitro.Estructuras.ROMHeader cabecera, Nitro.Estructuras.Banner banner) { this.cabecera = cabecera; this.banner = banner; // Remove older values if (listInfo.Items[0].SubItems.Count == 3) for (int i = 0; i < listInfo.Items.Count; i++) listInfo.Items[i].SubItems.RemoveAt(2); #region Muestra la información de la cabecera listInfo.Items[0].SubItems.Add(new String(cabecera.gameTitle)); listInfo.Items[1].SubItems.Add(new string(cabecera.gameCode)); try { listInfo.Items[2].SubItems.Add(new String(cabecera.makerCode) + " (" + Nitro.Estructuras.makerCode[new String(cabecera.makerCode)] + ')'); } catch { listInfo.Items[2].SubItems.Add(new String(cabecera.makerCode) + " (Desconocido)"); } try { listInfo.Items[3].SubItems.Add("0x" + String.Format("{0:X}", cabecera.unitCode) + " (" + Nitro.Estructuras.unitCode[cabecera.unitCode] + ')'); } catch { listInfo.Items[3].SubItems.Add("0x" + String.Format("{0:X}", cabecera.unitCode) + " (Desconocido)"); } listInfo.Items[4].SubItems.Add(Convert.ToString(cabecera.encryptionSeed)); listInfo.Items[5].SubItems.Add((cabecera.tamaño / Math.Pow(2, 20)).ToString() + " MB"); listInfo.Items[6].SubItems.Add(BitsConverter.BytesToHexString(cabecera.reserved)); listInfo.Items[7].SubItems.Add(Convert.ToString(cabecera.ROMversion)); listInfo.Items[8].SubItems.Add(Convert.ToString(cabecera.internalFlags)); listInfo.Items[9].SubItems.Add("0x" + String.Format("{0:X}", cabecera.ARM9romOffset)); listInfo.Items[10].SubItems.Add("0x" + String.Format("{0:X}", cabecera.ARM9entryAddress)); listInfo.Items[11].SubItems.Add("0x" + String.Format("{0:X}", cabecera.ARM9ramAddress)); listInfo.Items[12].SubItems.Add("0x" + String.Format("{0:X}", cabecera.ARM9size) + " bytes"); listInfo.Items[13].SubItems.Add("0x" + String.Format("{0:X}", cabecera.ARM7romOffset)); listInfo.Items[14].SubItems.Add("0x" + String.Format("{0:X}", cabecera.ARM7entryAddress)); listInfo.Items[15].SubItems.Add("0x" + String.Format("{0:X}", cabecera.ARM7ramAddress)); listInfo.Items[16].SubItems.Add("0x" + String.Format("{0:X}", cabecera.ARM7size) + " bytes"); listInfo.Items[17].SubItems.Add("0x" + String.Format("{0:X}", cabecera.fileNameTableOffset)); listInfo.Items[18].SubItems.Add("0x" + String.Format("{0:X}", cabecera.fileNameTableSize) + " bytes"); listInfo.Items[19].SubItems.Add("0x" + String.Format("{0:X}", cabecera.FAToffset)); listInfo.Items[20].SubItems.Add("0x" + String.Format("{0:X}", cabecera.FATsize) + " bytes"); listInfo.Items[21].SubItems.Add("0x" + String.Format("{0:X}", cabecera.ARM9overlayOffset)); listInfo.Items[22].SubItems.Add("0x" + String.Format("{0:X}", cabecera.ARM9overlaySize) + " bytes"); listInfo.Items[23].SubItems.Add("0x" + String.Format("{0:X}", cabecera.ARM7overlayOffset)); listInfo.Items[24].SubItems.Add("0x" + String.Format("{0:X}", cabecera.ARM7overlaySize) + " bytes"); listInfo.Items[25].SubItems.Add(Convert.ToString(cabecera.flagsRead, 2)); listInfo.Items[26].SubItems.Add(Convert.ToString(cabecera.flagsInit, 2)); listInfo.Items[27].SubItems.Add("0x" + String.Format("{0:X}", cabecera.bannerOffset)); listInfo.Items[28].SubItems.Add(cabecera.secureCRC16.ToString() + " (" + Convert.ToString(cabecera.secureCRC) + ")"); listInfo.Items[29].SubItems.Add(cabecera.ROMtimeout.ToString()); listInfo.Items[30].SubItems.Add("0x" + String.Format("{0:X}", cabecera.ARM9autoload)); listInfo.Items[31].SubItems.Add("0x" + String.Format("{0:X}", cabecera.ARM7autoload)); listInfo.Items[32].SubItems.Add(cabecera.secureDisable.ToString()); listInfo.Items[33].SubItems.Add("0x" + String.Format("{0:X}", cabecera.ROMsize) + " bytes"); listInfo.Items[34].SubItems.Add("0x" + String.Format("{0:X}", cabecera.headerSize) + " bytes"); listInfo.Items[35].SubItems.Add(BitsConverter.BytesToHexString(cabecera.reserved2)); listInfo.Items[36].SubItems.Add(cabecera.logoCRC16.ToString() + " (" + Convert.ToString(cabecera.logoCRC) + ")"); listInfo.Items[37].SubItems.Add(cabecera.headerCRC16.ToString() + " (" + Convert.ToString(cabecera.headerCRC) + ")"); listInfo.Items[38].SubItems.Add("0x" + String.Format("{0:X}", cabecera.debug_romOffset)); listInfo.Items[39].SubItems.Add("0x" + String.Format("{0:X}", cabecera.debug_size) + " bytes"); listInfo.Items[40].SubItems.Add("0x" + String.Format("{0:X}", cabecera.debug_ramAddress)); listInfo.Items[41].SubItems.Add("0x" + String.Format("{0:X}", cabecera.reserved3)); #endregion #region Muestra la información del banner picIcon.BorderStyle = BorderStyle.None; picBanner = Nitro.NDS.IconoToBitmap(banner.tileData, banner.palette); picIcon.Image = picBanner; txtBannerVer.Text = banner.version.ToString(); txtBannerCRC.Text = String.Format("{0:X}", banner.CRC16) + " (" + (banner.checkCRC ? "OK)" : Tools.Helper.GetTranslation("RomInfo", "S39") + ')'); txtBannerReserved.Text = BitsConverter.BytesToHexString(banner.reserved); titulos = new string[] { banner.japaneseTitle, banner.englishTitle, banner.frenchTitle, banner.germanTitle, banner.italianTitle, banner.spanishTitle }; txtBannerTitle.Text = titulos[0]; comboBannerLang.SelectedIndex = 0; #endregion }
void editor_FormClosed(object sender, FormClosedEventArgs e) { EditRomInfo editor = (EditRomInfo)sender; if (editor.DialogResult != System.Windows.Forms.DialogResult.OK) return; cabecera = editor.Header; banner = editor.Banner; Mostrar_Informacion(cabecera, banner); }
private void Mostrar_Informacion(Nitro.Estructuras.ROMHeader cabecera, Nitro.Estructuras.Banner banner) { this.cabecera = cabecera; this.banner = banner; // Remove older values if (listInfo.Items[0].SubItems.Count == 3) { for (int i = 0; i < listInfo.Items.Count; i++) { listInfo.Items[i].SubItems.RemoveAt(2); } } #region Muestra la información de la cabecera listInfo.Items[0].SubItems.Add(new String(cabecera.gameTitle)); listInfo.Items[1].SubItems.Add(new string(cabecera.gameCode)); try { listInfo.Items[2].SubItems.Add(new String(cabecera.makerCode) + " (" + Nitro.Estructuras.makerCode[new String(cabecera.makerCode)] + ')'); } catch { listInfo.Items[2].SubItems.Add(new String(cabecera.makerCode) + " (Desconocido)"); } try { listInfo.Items[3].SubItems.Add("0x" + String.Format("{0:X}", cabecera.unitCode) + " (" + Nitro.Estructuras.unitCode[cabecera.unitCode] + ')'); } catch { listInfo.Items[3].SubItems.Add("0x" + String.Format("{0:X}", cabecera.unitCode) + " (Desconocido)"); } listInfo.Items[4].SubItems.Add(Convert.ToString(cabecera.encryptionSeed)); listInfo.Items[5].SubItems.Add((cabecera.tamaño / Math.Pow(2, 20)).ToString() + " MB"); listInfo.Items[6].SubItems.Add(BitsConverter.BytesToHexString(cabecera.reserved)); listInfo.Items[7].SubItems.Add(Convert.ToString(cabecera.ROMversion)); listInfo.Items[8].SubItems.Add(Convert.ToString(cabecera.internalFlags)); listInfo.Items[9].SubItems.Add("0x" + String.Format("{0:X}", cabecera.ARM9romOffset)); listInfo.Items[10].SubItems.Add("0x" + String.Format("{0:X}", cabecera.ARM9entryAddress)); listInfo.Items[11].SubItems.Add("0x" + String.Format("{0:X}", cabecera.ARM9ramAddress)); listInfo.Items[12].SubItems.Add("0x" + String.Format("{0:X}", cabecera.ARM9size) + " bytes"); listInfo.Items[13].SubItems.Add("0x" + String.Format("{0:X}", cabecera.ARM7romOffset)); listInfo.Items[14].SubItems.Add("0x" + String.Format("{0:X}", cabecera.ARM7entryAddress)); listInfo.Items[15].SubItems.Add("0x" + String.Format("{0:X}", cabecera.ARM7ramAddress)); listInfo.Items[16].SubItems.Add("0x" + String.Format("{0:X}", cabecera.ARM7size) + " bytes"); listInfo.Items[17].SubItems.Add("0x" + String.Format("{0:X}", cabecera.fileNameTableOffset)); listInfo.Items[18].SubItems.Add("0x" + String.Format("{0:X}", cabecera.fileNameTableSize) + " bytes"); listInfo.Items[19].SubItems.Add("0x" + String.Format("{0:X}", cabecera.FAToffset)); listInfo.Items[20].SubItems.Add("0x" + String.Format("{0:X}", cabecera.FATsize) + " bytes"); listInfo.Items[21].SubItems.Add("0x" + String.Format("{0:X}", cabecera.ARM9overlayOffset)); listInfo.Items[22].SubItems.Add("0x" + String.Format("{0:X}", cabecera.ARM9overlaySize) + " bytes"); listInfo.Items[23].SubItems.Add("0x" + String.Format("{0:X}", cabecera.ARM7overlayOffset)); listInfo.Items[24].SubItems.Add("0x" + String.Format("{0:X}", cabecera.ARM7overlaySize) + " bytes"); listInfo.Items[25].SubItems.Add(Convert.ToString(cabecera.flagsRead, 2)); listInfo.Items[26].SubItems.Add(Convert.ToString(cabecera.flagsInit, 2)); listInfo.Items[27].SubItems.Add("0x" + String.Format("{0:X}", cabecera.bannerOffset)); listInfo.Items[28].SubItems.Add(cabecera.secureCRC16.ToString() + " (" + Convert.ToString(cabecera.secureCRC) + ")"); listInfo.Items[29].SubItems.Add(cabecera.ROMtimeout.ToString()); listInfo.Items[30].SubItems.Add("0x" + String.Format("{0:X}", cabecera.ARM9autoload)); listInfo.Items[31].SubItems.Add("0x" + String.Format("{0:X}", cabecera.ARM7autoload)); listInfo.Items[32].SubItems.Add(cabecera.secureDisable.ToString()); listInfo.Items[33].SubItems.Add("0x" + String.Format("{0:X}", cabecera.ROMsize) + " bytes"); listInfo.Items[34].SubItems.Add("0x" + String.Format("{0:X}", cabecera.headerSize) + " bytes"); listInfo.Items[35].SubItems.Add(BitsConverter.BytesToHexString(cabecera.reserved2)); listInfo.Items[36].SubItems.Add(cabecera.logoCRC16.ToString() + " (" + Convert.ToString(cabecera.logoCRC) + ")"); listInfo.Items[37].SubItems.Add(cabecera.headerCRC16.ToString() + " (" + Convert.ToString(cabecera.headerCRC) + ")"); listInfo.Items[38].SubItems.Add("0x" + String.Format("{0:X}", cabecera.debug_romOffset)); listInfo.Items[39].SubItems.Add("0x" + String.Format("{0:X}", cabecera.debug_size) + " bytes"); listInfo.Items[40].SubItems.Add("0x" + String.Format("{0:X}", cabecera.debug_ramAddress)); listInfo.Items[41].SubItems.Add("0x" + String.Format("{0:X}", cabecera.reserved3)); #endregion #region Muestra la información del banner picIcon.BorderStyle = BorderStyle.None; picBanner = Nitro.NDS.IconoToBitmap(banner.tileData, banner.palette); picIcon.Image = picBanner; txtBannerVer.Text = banner.version.ToString(); txtBannerCRC.Text = String.Format("{0:X}", banner.CRC16) + " (" + (banner.checkCRC ? "OK)" : Tools.Helper.GetTranslation("RomInfo", "S39") + ')'); txtBannerReserved.Text = BitsConverter.BytesToHexString(banner.reserved); titulos = new string[] { banner.japaneseTitle, banner.englishTitle, banner.frenchTitle, banner.germanTitle, banner.italianTitle, banner.spanishTitle }; txtBannerTitle.Text = titulos[0]; comboBannerLang.SelectedIndex = 0; #endregion }
public static Estructuras.ROMHeader LeerCabecera(string file) { Estructuras.ROMHeader nds = new Estructuras.ROMHeader(); BinaryReader br = new BinaryReader(File.OpenRead(file)); Console.WriteLine("<b>" + Tools.Helper.GetTranslation("Messages", "S03") + "</b> " + new FileInfo(file).Name); Rellenar_MakerCodes(); Rellenar_UnitCodes(); nds.gameTitle = br.ReadChars(12); nds.gameCode = br.ReadChars(4); nds.makerCode = br.ReadChars(2); nds.unitCode = br.ReadByte(); nds.encryptionSeed = br.ReadByte(); nds.tamaño = (UInt32)Math.Pow(2, 17 + br.ReadByte()); nds.reserved = br.ReadBytes(9); nds.ROMversion = br.ReadByte(); nds.internalFlags = br.ReadByte(); nds.ARM9romOffset = br.ReadUInt32(); nds.ARM9entryAddress = br.ReadUInt32(); nds.ARM9ramAddress = br.ReadUInt32(); nds.ARM9size = br.ReadUInt32(); nds.ARM7romOffset = br.ReadUInt32(); nds.ARM7entryAddress = br.ReadUInt32(); nds.ARM7ramAddress = br.ReadUInt32(); nds.ARM7size = br.ReadUInt32(); nds.fileNameTableOffset = br.ReadUInt32(); nds.fileNameTableSize = br.ReadUInt32(); nds.FAToffset = br.ReadUInt32(); nds.FATsize = br.ReadUInt32(); nds.ARM9overlayOffset = br.ReadUInt32(); nds.ARM9overlaySize = br.ReadUInt32(); nds.ARM7overlayOffset = br.ReadUInt32(); nds.ARM7overlaySize = br.ReadUInt32(); nds.flagsRead = br.ReadUInt32(); nds.flagsInit = br.ReadUInt32(); nds.bannerOffset = br.ReadUInt32(); nds.secureCRC16 = br.ReadUInt16(); nds.ROMtimeout = br.ReadUInt16(); nds.ARM9autoload = br.ReadUInt32(); nds.ARM7autoload = br.ReadUInt32(); nds.secureDisable = br.ReadUInt64(); nds.ROMsize = br.ReadUInt32(); nds.headerSize = br.ReadUInt32(); nds.reserved2 = br.ReadBytes(56); br.BaseStream.Seek(156, SeekOrigin.Current); //nds.logo = br.ReadBytes(156); Logo de Nintendo utilizado para comprobaciones nds.logoCRC16 = br.ReadUInt16(); nds.headerCRC16 = br.ReadUInt16(); nds.debug_romOffset = br.ReadUInt32(); nds.debug_size = br.ReadUInt32(); nds.debug_ramAddress = br.ReadUInt32(); nds.reserved3 = br.ReadUInt32(); br.BaseStream.Position = 0x4000; nds.secureCRC = (CRC16.Calculate(br.ReadBytes(0x4000)) == nds.secureCRC16) ? true : false; br.BaseStream.Position = 0xC0; nds.logoCRC = (CRC16.Calculate(br.ReadBytes(156)) == nds.logoCRC16) ? true : false; br.BaseStream.Position = 0x0; nds.headerCRC = (CRC16.Calculate(br.ReadBytes(0x15E)) == nds.headerCRC16) ? true : false; br.Close(); Console.WriteLine("<b>" + Tools.Helper.GetTranslation("Messages", "S04") + "</b><br>" + new String(nds.gameTitle).Replace("\0", "") + " (" + new String(nds.gameCode).Replace("\0", "") + ')'); return nds; }
public static Estructuras.ROMHeader LeerCabecera(string file) { Estructuras.ROMHeader nds = new Estructuras.ROMHeader(); BinaryReader br = new BinaryReader(File.OpenRead(file)); Console.WriteLine("<b>" + Tools.Helper.GetTranslation("Messages", "S03") + "</b> " + new FileInfo(file).Name); Rellenar_MakerCodes(); Rellenar_UnitCodes(); nds.gameTitle = br.ReadChars(12); nds.gameCode = br.ReadChars(4); nds.makerCode = br.ReadChars(2); nds.unitCode = br.ReadByte(); nds.encryptionSeed = br.ReadByte(); nds.tamaño = (UInt32)Math.Pow(2, 17 + br.ReadByte()); nds.reserved = br.ReadBytes(9); nds.ROMversion = br.ReadByte(); nds.internalFlags = br.ReadByte(); nds.ARM9romOffset = br.ReadUInt32(); nds.ARM9entryAddress = br.ReadUInt32(); nds.ARM9ramAddress = br.ReadUInt32(); nds.ARM9size = br.ReadUInt32(); nds.ARM7romOffset = br.ReadUInt32(); nds.ARM7entryAddress = br.ReadUInt32(); nds.ARM7ramAddress = br.ReadUInt32(); nds.ARM7size = br.ReadUInt32(); nds.fileNameTableOffset = br.ReadUInt32(); nds.fileNameTableSize = br.ReadUInt32(); nds.FAToffset = br.ReadUInt32(); nds.FATsize = br.ReadUInt32(); nds.ARM9overlayOffset = br.ReadUInt32(); nds.ARM9overlaySize = br.ReadUInt32(); nds.ARM7overlayOffset = br.ReadUInt32(); nds.ARM7overlaySize = br.ReadUInt32(); nds.flagsRead = br.ReadUInt32(); nds.flagsInit = br.ReadUInt32(); nds.bannerOffset = br.ReadUInt32(); nds.secureCRC16 = br.ReadUInt16(); nds.ROMtimeout = br.ReadUInt16(); nds.ARM9autoload = br.ReadUInt32(); nds.ARM7autoload = br.ReadUInt32(); nds.secureDisable = br.ReadUInt64(); nds.ROMsize = br.ReadUInt32(); nds.headerSize = br.ReadUInt32(); nds.reserved2 = br.ReadBytes(56); br.BaseStream.Seek(156, SeekOrigin.Current); //nds.logo = br.ReadBytes(156); Logo de Nintendo utilizado para comprobaciones nds.logoCRC16 = br.ReadUInt16(); nds.headerCRC16 = br.ReadUInt16(); nds.debug_romOffset = br.ReadUInt32(); nds.debug_size = br.ReadUInt32(); nds.debug_ramAddress = br.ReadUInt32(); nds.reserved3 = br.ReadUInt32(); br.BaseStream.Position = 0x4000; nds.secureCRC = (CRC16.Calculate(br.ReadBytes(0x4000)) == nds.secureCRC16) ? true : false; br.BaseStream.Position = 0xC0; nds.logoCRC = (CRC16.Calculate(br.ReadBytes(156)) == nds.logoCRC16) ? true : false; br.BaseStream.Position = 0x0; nds.headerCRC = (CRC16.Calculate(br.ReadBytes(0x15E)) == nds.headerCRC16) ? true : false; br.Close(); Console.WriteLine("<b>" + Tools.Helper.GetTranslation("Messages", "S04") + "</b><br>" + new String(nds.gameTitle).Replace("\0", "") + " (" + new String(nds.gameCode).Replace("\0", "") + ')'); return(nds); }
public static void EscribirCabecera(string salida, Estructuras.ROMHeader cabecera, byte[] nintendoLogo) { BinaryWriter bw = new BinaryWriter(File.OpenWrite(salida)); Console.Write(Tools.Helper.GetTranslation("Messages", "S0A")); bw.Write(cabecera.gameTitle); bw.Write(cabecera.gameCode); bw.Write(cabecera.makerCode); bw.Write(cabecera.unitCode); bw.Write(cabecera.encryptionSeed); bw.Write((byte)(Math.Log(cabecera.tamaño, 2) - 17)); bw.Write(cabecera.reserved); bw.Write(cabecera.ROMversion); bw.Write(cabecera.internalFlags); bw.Write(cabecera.ARM9romOffset); bw.Write(cabecera.ARM9entryAddress); bw.Write(cabecera.ARM9ramAddress); bw.Write(cabecera.ARM9size); bw.Write(cabecera.ARM7romOffset); bw.Write(cabecera.ARM7entryAddress); bw.Write(cabecera.ARM7ramAddress); bw.Write(cabecera.ARM7size); bw.Write(cabecera.fileNameTableOffset); bw.Write(cabecera.fileNameTableSize); bw.Write(cabecera.FAToffset); bw.Write(cabecera.FATsize); bw.Write(cabecera.ARM9overlayOffset); bw.Write(cabecera.ARM9overlaySize); bw.Write(cabecera.ARM7overlayOffset); bw.Write(cabecera.ARM7overlaySize); bw.Write(cabecera.flagsRead); bw.Write(cabecera.flagsInit); bw.Write(cabecera.bannerOffset); bw.Write(cabecera.secureCRC16); bw.Write(cabecera.ROMtimeout); bw.Write(cabecera.ARM9autoload); bw.Write(cabecera.ARM7autoload); bw.Write(cabecera.secureDisable); bw.Write(cabecera.ROMsize); bw.Write(cabecera.headerSize); bw.Write(cabecera.reserved2); bw.Write(nintendoLogo); bw.Write(cabecera.logoCRC16); bw.Write(cabecera.headerCRC16); bw.Write(cabecera.debug_romOffset); bw.Write(cabecera.debug_size); bw.Write(cabecera.debug_ramAddress); bw.Write(cabecera.reserved3); bw.Flush(); int relleno = (int)(cabecera.headerSize - bw.BaseStream.Length); for (int i = 0; i < relleno; i++) { bw.Write((byte)0x00); } bw.Flush(); bw.Close(); Console.WriteLine(Tools.Helper.GetTranslation("Messages", "S09"), new FileInfo(salida).Length); }
private void btnSaveROM_Click(object sender, EventArgs e) { /* ROM sections: * * Header (0x0000-0x4000) * ARM9 Binary * |_ARM9 * |_ARM9 Overlays Tables * |_ARM9 Overlays * ARM7 Binary * |_ARM7 * |_ARM7 Overlays Tables * |_ARM7 Overlays * FNT (File Name Table) * |_Main tables * |_Subtables (names) * FAT (File Allocation Table) * |_Files offset * |_Start offset * |_End offset * Banner * |_Header 0x20 * |_Icon (Bitmap + palette) 0x200 + 0x20 * |_Game titles (Japanese, English, French, German, Italian, Spanish) 6 * 0x100 * Files... */ Thread espera = new Thread(ThreadEspera); if (!isMono) { espera.Start("S05"); } // Get special files sFolder ftc = accion.Search_Folder("ftc"); sFile fnt = ftc.files.Find(sFile => sFile.name == "fnt.bin"); sFile fat = ftc.files.Find(sFile => sFile.name == "fat.bin"); sFile arm9 = ftc.files.Find(sFile => sFile.name == "arm9.bin"); sFile arm7 = ftc.files.Find(sFile => sFile.name == "arm7.bin"); int index = ftc.files.FindIndex(sFile => sFile.name == "y9.bin"); sFile y9 = new sFile(); List <sFile> ov9 = new List <sFile>(); if (index != -1) { y9 = ftc.files[index]; ov9 = ftc.files.FindAll(sFile => sFile.name.StartsWith("overlay9_")); } index = ftc.files.FindIndex(sFile => sFile.name == "y7.bin"); List <sFile> ov7 = new List <sFile>(); sFile y7 = new sFile(); if (index != -1) { y7 = ftc.files[index]; ov7 = ftc.files.FindAll(sFile => sFile.name.StartsWith("overlay7_")); } #region Get ROM sections BinaryReader br; Console.WriteLine(Tools.Helper.GetTranslation("Messages", "S08")); Nitro.Estructuras.ROMHeader header = romInfo.Cabecera; uint currPos = header.headerSize; // Write ARM9 string arm9Binary = Path.GetTempFileName(); string overlays9 = Path.GetTempFileName(); Console.Write("\tARM9 Binary..."); br = new BinaryReader(File.OpenRead(arm9.path)); br.BaseStream.Position = arm9.offset; BinaryWriter bw = new BinaryWriter(File.OpenWrite(arm9Binary)); bw.Write(br.ReadBytes((int)arm9.size)); bw.Flush(); br.Close(); header.ARM9romOffset = currPos; header.ARM9size = arm9.size; header.ARM9overlayOffset = 0; uint arm9overlayOffset = 0; currPos += arm9.size; // Write the Nitrocode br = new BinaryReader(File.OpenRead(accion.ROMFile)); br.BaseStream.Position = romInfo.Cabecera.ARM9romOffset + romInfo.Cabecera.ARM9size; if (br.ReadUInt32() == 0xDEC00621) { // Nitrocode found bw.Write(0xDEC00621); bw.Write(br.ReadUInt32()); bw.Write(br.ReadUInt32()); currPos += 0x0C; bw.Flush(); } br.Close(); uint rem = currPos % 0x200; if (rem != 0) { while (rem < 0x200) { bw.Write((byte)0xFF); rem++; currPos++; } } if (header.ARM9overlaySize != 0) { // ARM9 Overlays Tables br = new BinaryReader(File.OpenRead(y9.path)); br.BaseStream.Position = y9.offset; Nitro.Overlay.Write_Y9(bw, br, ov9.ToArray()); bw.Flush(); br.Close(); header.ARM9overlayOffset = currPos; header.ARM9overlaySize = y9.size; currPos += y9.size; rem = currPos % 0x200; if (rem != 0) { while (rem < 0x200) { bw.Write((byte)0xFF); rem++; currPos++; } } Nitro.Overlay.EscribirOverlays(overlays9, ov9, accion.ROMFile); bw.Write(File.ReadAllBytes(overlays9)); // ARM9 Overlays arm9overlayOffset = currPos; currPos += (uint)new FileInfo(overlays9).Length; } bw.Flush(); bw.Close(); Console.WriteLine(Tools.Helper.GetTranslation("Messages", "S09"), new FileInfo(arm9Binary).Length); string seedStr = seedTxt.Text; if (seedStr == "") { seedStr = DateTime.Now.ToString("s"); } String seed = "MiUSlRDz" + seedStr; GameRandomizer rando = null; string gameCode = new string(romInfo.Cabecera.gameCode); if (gameCode == "A5FP") { rando = new CuriousVillagePALRandomizer(accion.Root, seed, accion); } if (rando != null) { rando.enforceMaxPuzzles = this.enforceMaxPuzzlesBox.Checked; rando.removePuzzleCounterChecks = this.disablePuzzleCheckBox.Checked; rando.removeRiddleHutChecks = this.disableRiddleHutBox.Checked; rando.seedPuzzles(); rando.Write(); } // Escribismo el ARM7 Binary string arm7Binary = Path.GetTempFileName(); string overlays7 = Path.GetTempFileName(); Console.Write("\tARM7 Binary..."); br = new BinaryReader(File.OpenRead(arm7.path)); br.BaseStream.Position = arm7.offset; bw = new BinaryWriter(File.OpenWrite(arm7Binary)); bw.Write(br.ReadBytes((int)arm7.size)); bw.Flush(); br.Close(); header.ARM7romOffset = currPos; header.ARM7size = arm7.size; header.ARM7overlayOffset = 0x00; uint arm7overlayOffset = 0x00; currPos += arm7.size; rem = currPos % 0x200; if (rem != 0) { while (rem < 0x200) { bw.Write((byte)0xFF); rem++; currPos++; } } if (romInfo.Cabecera.ARM7overlaySize != 0x00) { // ARM7 Overlays Tables br = new BinaryReader(File.OpenRead(y7.path)); br.BaseStream.Position = y7.offset; bw.Write(br.ReadBytes((int)y7.size)); bw.Flush(); br.Close(); header.ARM7overlayOffset = currPos; header.ARM7overlaySize = y7.size; currPos += y7.size; rem = currPos % 0x200; if (rem != 0) { while (rem < 0x200) { bw.Write((byte)0xFF); rem++; currPos++; } } Nitro.Overlay.EscribirOverlays(overlays7, ov7, accion.ROMFile); bw.Write(File.ReadAllBytes(overlays7)); // ARM7 Overlays arm7overlayOffset = currPos; currPos += (uint)new FileInfo(overlays7).Length; } bw.Flush(); bw.Close(); Console.WriteLine(Tools.Helper.GetTranslation("Messages", "S09"), new FileInfo(arm7Binary).Length); // Escribimos el FNT (File Name Table) string fileFNT = Path.GetTempFileName(); Console.Write("\tFile Name Table (FNT)..."); bw = new BinaryWriter(File.OpenWrite(fileFNT)); br = new BinaryReader(File.OpenRead(fnt.path)); br.BaseStream.Position = fnt.offset; bw.Write(br.ReadBytes((int)fnt.size)); bw.Flush(); br.Close(); header.fileNameTableSize = fnt.size; header.fileNameTableOffset = currPos; currPos += fnt.size; rem = currPos % 0x200; if (rem != 0) { while (rem < 0x200) { bw.Write((byte)0xFF); rem++; currPos++; } } bw.Flush(); bw.Close(); Console.WriteLine(Tools.Helper.GetTranslation("Messages", "S09"), new FileInfo(fileFNT).Length); // Escribimos el FAT (File Allocation Table) string fileFAT = Path.GetTempFileName(); header.FAToffset = currPos; Nitro.FAT.Write(fileFAT, accion.Root, header.FAToffset, accion.SortedIDs, arm9overlayOffset, arm7overlayOffset); currPos += (uint)new FileInfo(fileFAT).Length; // Escribimos el banner string banner = Path.GetTempFileName(); Nitro.NDS.EscribirBanner(banner, romInfo.Banner); header.bannerOffset = currPos; currPos += (uint)new FileInfo(banner).Length; // Escribimos los archivos string files = Path.GetTempFileName(); Nitro.NDS.Write_Files(files, accion.ROMFile, accion.Root, accion.SortedIDs); currPos += (uint)new FileInfo(files).Length; // Update the ROM size values of the header header.ROMsize = currPos; header.tamaño = (uint)Math.Ceiling(Math.Log(currPos, 2)); header.tamaño = (uint)Math.Pow(2, header.tamaño); // Get Header CRC string tempHeader = Path.GetTempFileName(); Nitro.NDS.EscribirCabecera(tempHeader, header, accion.ROMFile); BinaryReader brHeader = new BinaryReader(File.OpenRead(tempHeader)); header.headerCRC16 = (ushort)Ekona.Helper.CRC16.Calculate(brHeader.ReadBytes(0x15E)); brHeader.Close(); File.Delete(tempHeader); // Write header string header_file = Path.GetTempFileName(); Nitro.NDS.EscribirCabecera(header_file, header, accion.ROMFile); Console.Write("<br>"); #endregion if (!isMono) { espera.Abort(); } // Obtenemos el nuevo archivo para guardar SaveFileDialog o = new SaveFileDialog(); o.AddExtension = true; o.DefaultExt = ".nds"; o.Filter = "Nintendo DS ROM (*.nds)|*.nds"; o.OverwritePrompt = true; Open_Dialog: if (o.ShowDialog() == System.Windows.Forms.DialogResult.OK) { if (o.FileName == accion.ROMFile) { MessageBox.Show(Tools.Helper.GetTranslation("Sistema", "S44")); goto Open_Dialog; } espera = new Thread(ThreadEspera); if (!isMono) { espera.Start("S06"); } Console.WriteLine(Tools.Helper.GetTranslation("Messages", "S0D"), o.FileName); bw = new BinaryWriter(new FileStream(o.FileName, FileMode.Create)); Ekona.Helper.IOutil.Append(ref bw, header_file); Ekona.Helper.IOutil.Append(ref bw, arm9Binary); Ekona.Helper.IOutil.Append(ref bw, arm7Binary); Ekona.Helper.IOutil.Append(ref bw, fileFNT); Ekona.Helper.IOutil.Append(ref bw, fileFAT); Ekona.Helper.IOutil.Append(ref bw, banner); Ekona.Helper.IOutil.Append(ref bw, files); rem = header.tamaño - (uint)bw.BaseStream.Position; while (rem > 0) { bw.Write((byte)0xFF); rem--; } bw.Flush(); bw.Close(); Console.WriteLine("<b>" + Tools.Helper.GetTranslation("Messages", "S09") + "</b>", new FileInfo(o.FileName).Length); accion.IsNewRom = false; } // Borramos archivos ya innecesarios File.Delete(header_file); File.Delete(arm9Binary); File.Delete(overlays9); File.Delete(arm7Binary); File.Delete(overlays7); File.Delete(fileFNT); File.Delete(fileFAT); File.Delete(banner); File.Delete(files); if (!isMono) { espera.Abort(); } sb.Length = 0; }