Ejemplo n.º 1
0
        public EditRomInfo(Nitro.Estructuras.ROMHeader header, Nitro.Estructuras.Banner banner)
        {
            InitializeComponent();
            ReadLanguage();

            this.header = header;
            this.banner = banner;
            LoadValues();
            comboBanTitles.SelectedIndex = 0;
        }
Ejemplo n.º 2
0
        public EditRomInfo(Nitro.Estructuras.ROMHeader header, Nitro.Estructuras.Banner banner)
        {
            InitializeComponent();
            ReadLanguage();

            this.header = header;
            this.banner = banner;
            LoadValues();
            comboBanTitles.SelectedIndex = 0;
        }
Ejemplo n.º 3
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);
        }
Ejemplo n.º 4
0
        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();
        }
Ejemplo n.º 5
0
        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
        }
Ejemplo n.º 6
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);
        }
Ejemplo n.º 7
0
        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
        }
Ejemplo n.º 8
0
Archivo: NDS.cs Proyecto: MetLob/tinke
        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;
        }
Ejemplo n.º 9
0
        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);
        }
Ejemplo n.º 10
0
        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);
        }
Ejemplo n.º 11
0
        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;
        }