mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-07-23 06:10:03 -06:00
actually hook this up
This commit is contained in:
@ -28,6 +28,10 @@ namespace Config
|
|||||||
|
|
||||||
const char* kConfigFile = "melonDS.ini";
|
const char* kConfigFile = "melonDS.ini";
|
||||||
|
|
||||||
|
char BIOS9Path[1024];
|
||||||
|
char BIOS7Path[1024];
|
||||||
|
char FirmwarePath[1024];
|
||||||
|
|
||||||
int _3DRenderer;
|
int _3DRenderer;
|
||||||
int Threaded3D;
|
int Threaded3D;
|
||||||
|
|
||||||
@ -36,6 +40,10 @@ int GL_Antialias;
|
|||||||
|
|
||||||
ConfigEntry ConfigFile[] =
|
ConfigEntry ConfigFile[] =
|
||||||
{
|
{
|
||||||
|
{"BIOS9Path", 1, BIOS9Path, 0, "", 1023},
|
||||||
|
{"BIOS7Path", 1, BIOS7Path, 0, "", 1023},
|
||||||
|
{"FirmwarePath", 1, FirmwarePath, 0, "", 1023},
|
||||||
|
|
||||||
{"3DRenderer", 0, &_3DRenderer, 1, NULL, 0},
|
{"3DRenderer", 0, &_3DRenderer, 1, NULL, 0},
|
||||||
{"Threaded3D", 0, &Threaded3D, 1, NULL, 0},
|
{"Threaded3D", 0, &Threaded3D, 1, NULL, 0},
|
||||||
|
|
||||||
|
@ -42,6 +42,10 @@ bool HasConfigFile(const char* fileName);
|
|||||||
void Load();
|
void Load();
|
||||||
void Save();
|
void Save();
|
||||||
|
|
||||||
|
extern char BIOS9Path[1024];
|
||||||
|
extern char BIOS7Path[1024];
|
||||||
|
extern char FirmwarePath[1024];
|
||||||
|
|
||||||
extern int _3DRenderer;
|
extern int _3DRenderer;
|
||||||
extern int Threaded3D;
|
extern int Threaded3D;
|
||||||
|
|
||||||
|
@ -416,7 +416,7 @@ void Reset()
|
|||||||
RunningGame = false;
|
RunningGame = false;
|
||||||
LastSysClockCycles = 0;
|
LastSysClockCycles = 0;
|
||||||
|
|
||||||
f = Platform::OpenLocalFile("bios9.bin", "rb");
|
f = Platform::OpenLocalFile(Config::BIOS9Path, "rb");
|
||||||
if (!f)
|
if (!f)
|
||||||
{
|
{
|
||||||
printf("ARM9 BIOS not found\n");
|
printf("ARM9 BIOS not found\n");
|
||||||
@ -433,7 +433,7 @@ void Reset()
|
|||||||
fclose(f);
|
fclose(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
f = Platform::OpenLocalFile("bios7.bin", "rb");
|
f = Platform::OpenLocalFile(Config::BIOS7Path, "rb");
|
||||||
if (!f)
|
if (!f)
|
||||||
{
|
{
|
||||||
printf("ARM7 BIOS not found\n");
|
printf("ARM7 BIOS not found\n");
|
||||||
|
16
src/SPI.cpp
16
src/SPI.cpp
@ -28,6 +28,7 @@
|
|||||||
namespace SPI_Firmware
|
namespace SPI_Firmware
|
||||||
{
|
{
|
||||||
|
|
||||||
|
char FirmwarePath[1024];
|
||||||
u8* Firmware;
|
u8* Firmware;
|
||||||
u32 FirmwareLength;
|
u32 FirmwareLength;
|
||||||
u32 FirmwareMask;
|
u32 FirmwareMask;
|
||||||
@ -76,6 +77,7 @@ bool VerifyCRC16(u32 start, u32 offset, u32 len, u32 crcoffset)
|
|||||||
|
|
||||||
bool Init()
|
bool Init()
|
||||||
{
|
{
|
||||||
|
memset(FirmwarePath, 0, sizeof(FirmwarePath));
|
||||||
Firmware = NULL;
|
Firmware = NULL;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -90,10 +92,12 @@ void Reset()
|
|||||||
if (Firmware) delete[] Firmware;
|
if (Firmware) delete[] Firmware;
|
||||||
Firmware = NULL;
|
Firmware = NULL;
|
||||||
|
|
||||||
FILE* f = Platform::OpenLocalFile("firmware.bin", "rb");
|
strncpy(FirmwarePath, Config::FirmwarePath, 1023);
|
||||||
|
|
||||||
|
FILE* f = Platform::OpenLocalFile(FirmwarePath, "rb");
|
||||||
if (!f)
|
if (!f)
|
||||||
{
|
{
|
||||||
printf("firmware.bin not found\n");
|
printf("Firmware not found\n");
|
||||||
|
|
||||||
// TODO: generate default firmware
|
// TODO: generate default firmware
|
||||||
return;
|
return;
|
||||||
@ -129,7 +133,11 @@ void Reset()
|
|||||||
fclose(f);
|
fclose(f);
|
||||||
|
|
||||||
// take a backup
|
// take a backup
|
||||||
const char* firmbkp = "firmware.bin.bak";
|
char firmbkp[1028];
|
||||||
|
int fplen = strlen(FirmwarePath);
|
||||||
|
strncpy(&firmbkp[0], FirmwarePath, fplen);
|
||||||
|
strncpy(&firmbkp[fplen], ".bak", 1028-fplen);
|
||||||
|
firmbkp[fplen+4] = '\0';
|
||||||
f = Platform::OpenLocalFile(firmbkp, "rb");
|
f = Platform::OpenLocalFile(firmbkp, "rb");
|
||||||
if (f) fclose(f);
|
if (f) fclose(f);
|
||||||
else
|
else
|
||||||
@ -325,7 +333,7 @@ void Write(u8 val, u32 hold)
|
|||||||
|
|
||||||
if (!hold && (CurCmd == 0x02 || CurCmd == 0x0A))
|
if (!hold && (CurCmd == 0x02 || CurCmd == 0x0A))
|
||||||
{
|
{
|
||||||
FILE* f = Platform::OpenLocalFile("firmware.bin", "r+b");
|
FILE* f = Platform::OpenLocalFile(FirmwarePath, "r+b");
|
||||||
if (f)
|
if (f)
|
||||||
{
|
{
|
||||||
u32 cutoff = 0x7FA00 & FirmwareMask;
|
u32 cutoff = 0x7FA00 & FirmwareMask;
|
||||||
|
@ -16,9 +16,12 @@
|
|||||||
with melonDS. If not, see http://www.gnu.org/licenses/.
|
with melonDS. If not, see http://www.gnu.org/licenses/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
#include <QFileDialog>
|
#include <QFileDialog>
|
||||||
|
#include <QMessageBox>
|
||||||
|
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
#include "Platform.h"
|
||||||
#include "Config.h"
|
#include "Config.h"
|
||||||
#include "PlatformConfig.h"
|
#include "PlatformConfig.h"
|
||||||
|
|
||||||
@ -47,8 +50,52 @@ EmuSettingsDialog::~EmuSettingsDialog()
|
|||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EmuSettingsDialog::verifyFirmware()
|
||||||
|
{
|
||||||
|
// verify the firmware
|
||||||
|
//
|
||||||
|
// there are dumps of an old hacked firmware floating around on the internet
|
||||||
|
// and those are problematic
|
||||||
|
// the hack predates WFC, and, due to this, any game that alters the WFC
|
||||||
|
// access point data will brick that firmware due to it having critical
|
||||||
|
// data in the same area. it has the same problem on hardware.
|
||||||
|
//
|
||||||
|
// but this should help stop users from reporting that issue over and over
|
||||||
|
// again, when the issue is not from melonDS but from their firmware dump.
|
||||||
|
//
|
||||||
|
// I don't know about all the firmware hacks in existence, but the one I
|
||||||
|
// looked at has 0x180 bytes from the header repeated at 0x3FC80, but
|
||||||
|
// bytes 0x0C-0x14 are different.
|
||||||
|
|
||||||
|
char filename[1024];
|
||||||
|
strncpy(filename, ui->txtFirmwarePath->text().toStdString().c_str(), 1023); filename[1023] = '\0';
|
||||||
|
FILE* f = Platform::OpenLocalFile(filename, "rb");
|
||||||
|
u8 chk1[0x180], chk2[0x180];
|
||||||
|
|
||||||
|
fseek(f, 0, SEEK_SET);
|
||||||
|
fread(chk1, 1, 0x180, f);
|
||||||
|
fseek(f, -0x380, SEEK_END);
|
||||||
|
fread(chk2, 1, 0x180, f);
|
||||||
|
|
||||||
|
memset(&chk1[0x0C], 0, 8);
|
||||||
|
memset(&chk2[0x0C], 0, 8);
|
||||||
|
|
||||||
|
fclose(f);
|
||||||
|
|
||||||
|
if (!memcmp(chk1, chk2, 0x180))
|
||||||
|
{
|
||||||
|
QMessageBox::warning(this,
|
||||||
|
"Problematic firmware dump",
|
||||||
|
"You are using an old hacked firmware dump.\n"
|
||||||
|
"Firmware boot will stop working if you run any game that alters WFC settings.\n\n"
|
||||||
|
"Note that the issue is not from melonDS, it would also happen on an actual DS.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void EmuSettingsDialog::on_EmuSettingsDialog_accepted()
|
void EmuSettingsDialog::on_EmuSettingsDialog_accepted()
|
||||||
{
|
{
|
||||||
|
verifyFirmware();
|
||||||
|
|
||||||
strncpy(Config::BIOS9Path, ui->txtBIOS9Path->text().toStdString().c_str(), 1023); Config::BIOS9Path[1023] = '\0';
|
strncpy(Config::BIOS9Path, ui->txtBIOS9Path->text().toStdString().c_str(), 1023); Config::BIOS9Path[1023] = '\0';
|
||||||
strncpy(Config::BIOS7Path, ui->txtBIOS7Path->text().toStdString().c_str(), 1023); Config::BIOS7Path[1023] = '\0';
|
strncpy(Config::BIOS7Path, ui->txtBIOS7Path->text().toStdString().c_str(), 1023); Config::BIOS7Path[1023] = '\0';
|
||||||
strncpy(Config::FirmwarePath, ui->txtFirmwarePath->text().toStdString().c_str(), 1023); Config::FirmwarePath[1023] = '\0';
|
strncpy(Config::FirmwarePath, ui->txtFirmwarePath->text().toStdString().c_str(), 1023); Config::FirmwarePath[1023] = '\0';
|
||||||
@ -95,7 +142,5 @@ void EmuSettingsDialog::on_btnFirmwareBrowse_clicked()
|
|||||||
|
|
||||||
if (file.isEmpty()) return;
|
if (file.isEmpty()) return;
|
||||||
|
|
||||||
// TODO: check for shitty hacked firmware here?
|
|
||||||
|
|
||||||
ui->txtFirmwarePath->setText(file);
|
ui->txtFirmwarePath->setText(file);
|
||||||
}
|
}
|
||||||
|
@ -58,6 +58,8 @@ private slots:
|
|||||||
void on_btnFirmwareBrowse_clicked();
|
void on_btnFirmwareBrowse_clicked();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void verifyFirmware();
|
||||||
|
|
||||||
Ui::EmuSettingsDialog* ui;
|
Ui::EmuSettingsDialog* ui;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -64,10 +64,6 @@ char MicWavPath[1024];
|
|||||||
|
|
||||||
char LastROMFolder[1024];
|
char LastROMFolder[1024];
|
||||||
|
|
||||||
char BIOS9Path[1024];
|
|
||||||
char BIOS7Path[1024];
|
|
||||||
char FirmwarePath[1024];
|
|
||||||
|
|
||||||
|
|
||||||
ConfigEntry PlatformConfigFile[] =
|
ConfigEntry PlatformConfigFile[] =
|
||||||
{
|
{
|
||||||
@ -149,10 +145,6 @@ ConfigEntry PlatformConfigFile[] =
|
|||||||
|
|
||||||
{"LastROMFolder", 1, LastROMFolder, 0, "", 1023},
|
{"LastROMFolder", 1, LastROMFolder, 0, "", 1023},
|
||||||
|
|
||||||
{"BIOS9Path", 1, BIOS9Path, 0, "", 1023},
|
|
||||||
{"BIOS7Path", 1, BIOS7Path, 0, "", 1023},
|
|
||||||
{"FirmwarePath", 1, FirmwarePath, 0, "", 1023},
|
|
||||||
|
|
||||||
{"", -1, NULL, 0, NULL, 0}
|
{"", -1, NULL, 0, NULL, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -77,10 +77,6 @@ extern char MicWavPath[1024];
|
|||||||
|
|
||||||
extern char LastROMFolder[1024];
|
extern char LastROMFolder[1024];
|
||||||
|
|
||||||
extern char BIOS9Path[1024];
|
|
||||||
extern char BIOS7Path[1024];
|
|
||||||
extern char FirmwarePath[1024];
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // PLATFORMCONFIG_H
|
#endif // PLATFORMCONFIG_H
|
||||||
|
Reference in New Issue
Block a user