Firmware: Initializing the fake firmware and applying the firmware settings from an internal firmware config struct are now split into separate operations. This allows the user to freely choose between using internal firmware config or using an external firmware.dfc file for their firmware settings, regardless of whether or not they are booting from external firmware. Fixes #259.
- Also fixes a compiling issue with compilers that are not MSVC 2015 or later. (Regression from commit ac94244.)
This commit is contained in:
parent
175a471e5e
commit
c6269ca7ff
|
@ -100,7 +100,7 @@ int LagFrameFlag;
|
||||||
int lastLag;
|
int lastLag;
|
||||||
int TotalLagFrames;
|
int TotalLagFrames;
|
||||||
u8 MicSampleSelection = 0;
|
u8 MicSampleSelection = 0;
|
||||||
std::vector<std::vector<u8>> micSamples;
|
std::vector< std::vector<u8> > micSamples;
|
||||||
|
|
||||||
TSCalInfo TSCal;
|
TSCalInfo TSCal;
|
||||||
|
|
||||||
|
@ -2643,7 +2643,7 @@ void NDS_Reset()
|
||||||
}
|
}
|
||||||
|
|
||||||
bool didLoadExtFirmware = false;
|
bool didLoadExtFirmware = false;
|
||||||
bool canBootFromFirmware = false;
|
bool willBootFromFirmware = false;
|
||||||
bool bootResult = false;
|
bool bootResult = false;
|
||||||
|
|
||||||
extFirmwareObj = new CFIRMWARE();
|
extFirmwareObj = new CFIRMWARE();
|
||||||
|
@ -2653,15 +2653,15 @@ void NDS_Reset()
|
||||||
{
|
{
|
||||||
didLoadExtFirmware = extFirmwareObj->load(CommonSettings.ExtFirmwarePath);
|
didLoadExtFirmware = extFirmwareObj->load(CommonSettings.ExtFirmwarePath);
|
||||||
|
|
||||||
//we will allow a proper firmware boot, if:
|
// We will allow a proper firmware boot, if:
|
||||||
//1. we have the ARM7 and ARM9 bioses (its doubtful that our HLE bios implement the necessary functions)
|
// 1. we have the ARM7 and ARM9 bioses (its doubtful that our HLE bios implement the necessary functions)
|
||||||
//2. firmware is available
|
// 2. firmware is available
|
||||||
//3. user has requested booting from firmware
|
// 3. user has requested booting from firmware
|
||||||
canBootFromFirmware = (CommonSettings.BootFromFirmware && didLoadExtFirmware);
|
willBootFromFirmware = (CommonSettings.BootFromFirmware && didLoadExtFirmware);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we're doing a fake boot, then we must ensure that this value gets set before any firmware settings are changed.
|
// If we're doing a fake boot, then we must ensure that this value gets set before any firmware settings are changed.
|
||||||
if (!canBootFromFirmware)
|
if (!willBootFromFirmware)
|
||||||
{
|
{
|
||||||
//bios (or firmware) sets this default, which is generally not important for retail games but some homebrews are depending on
|
//bios (or firmware) sets this default, which is generally not important for retail games but some homebrews are depending on
|
||||||
_MMU_write08<ARMCPU_ARM9>(REG_WRAMCNT,3);
|
_MMU_write08<ARMCPU_ARM9>(REG_WRAMCNT,3);
|
||||||
|
@ -2672,6 +2672,12 @@ void NDS_Reset()
|
||||||
// what is the purpose of unpack?
|
// what is the purpose of unpack?
|
||||||
extFirmwareObj->unpack();
|
extFirmwareObj->unpack();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// If we didn't successfully load firmware from somewhere, then we need to use
|
||||||
|
// our own internal firmware as a stand-in.
|
||||||
|
NDS_InitDefaultFirmware(&MMU.fw.data);
|
||||||
|
}
|
||||||
|
|
||||||
// Load the firmware settings.
|
// Load the firmware settings.
|
||||||
if (CommonSettings.UseExtFirmwareSettings && didLoadExtFirmware)
|
if (CommonSettings.UseExtFirmwareSettings && didLoadExtFirmware)
|
||||||
|
@ -2685,11 +2691,11 @@ void NDS_Reset()
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Otherwise, just use our version of the firmware config.
|
// Otherwise, just use our version of the firmware config.
|
||||||
NDS_InitFirmwareWithConfig(CommonSettings.fwConfig);
|
NDS_ApplyFirmwareSettingsWithConfig(&MMU.fw.data, CommonSettings.fwConfig);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Finally, boot the firmware.
|
// Finally, boot the firmware.
|
||||||
if (canBootFromFirmware)
|
if (willBootFromFirmware)
|
||||||
{
|
{
|
||||||
bootResult = NDS_LegitBoot();
|
bootResult = NDS_LegitBoot();
|
||||||
}
|
}
|
||||||
|
@ -2707,7 +2713,7 @@ void NDS_Reset()
|
||||||
wifiHandler->CommStart();
|
wifiHandler->CommStart();
|
||||||
|
|
||||||
SPU_DeInit();
|
SPU_DeInit();
|
||||||
SPU_ReInit(!canBootFromFirmware && bootResult);
|
SPU_ReInit(!willBootFromFirmware && bootResult);
|
||||||
|
|
||||||
//this needs to happen last, pretty much, since it establishes the correct scheduling state based on all of the above initialization
|
//this needs to happen last, pretty much, since it establishes the correct scheduling state based on all of the above initialization
|
||||||
initSchedule();
|
initSchedule();
|
||||||
|
|
|
@ -686,7 +686,7 @@ extern std::string InputDisplayString;
|
||||||
extern int LagFrameFlag;
|
extern int LagFrameFlag;
|
||||||
extern int lastLag, TotalLagFrames;
|
extern int lastLag, TotalLagFrames;
|
||||||
extern u8 MicSampleSelection;
|
extern u8 MicSampleSelection;
|
||||||
extern std::vector<std::vector<u8>> micSamples;
|
extern std::vector< std::vector<u8> > micSamples;
|
||||||
|
|
||||||
void MovieSRAM();
|
void MovieSRAM();
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright (C) 2009-2018 DeSmuME Team
|
Copyright (C) 2009-2019 DeSmuME Team
|
||||||
|
|
||||||
This file is free software: you can redistribute it and/or modify
|
This file is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -470,46 +470,7 @@ bool CFIRMWARE::unpack()
|
||||||
|
|
||||||
bool CFIRMWARE::loadSettings(const char *firmwareUserSettingsFilePath)
|
bool CFIRMWARE::loadSettings(const char *firmwareUserSettingsFilePath)
|
||||||
{
|
{
|
||||||
if ( (firmwareUserSettingsFilePath == NULL) || (strlen(firmwareUserSettingsFilePath) == 0) )
|
return NDS_ApplyFirmwareSettingsWithFile(&MMU.fw.data, firmwareUserSettingsFilePath);
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
FILE *fp = fopen(firmwareUserSettingsFilePath, "rb");
|
|
||||||
if (fp)
|
|
||||||
{
|
|
||||||
fseek(fp, 0, SEEK_END);
|
|
||||||
if (ftell(fp) == DFC_FILE_SIZE)
|
|
||||||
{
|
|
||||||
fseek(fp, 0, SEEK_SET);
|
|
||||||
u8 *usr = new u8[SETTINGS_SIZE];
|
|
||||||
if (usr)
|
|
||||||
{
|
|
||||||
if (fread(usr, 1, DFC_ID_SIZE, fp) == DFC_ID_SIZE)
|
|
||||||
{
|
|
||||||
if (memcmp(usr, DFC_ID_CODE, DFC_ID_SIZE) == 0)
|
|
||||||
{
|
|
||||||
if (fread(usr, 1, SETTINGS_SIZE, fp) == SETTINGS_SIZE)
|
|
||||||
{
|
|
||||||
memcpy(&MMU.fw.data.userSettings0, usr, sizeof(FWUserSettings));
|
|
||||||
memcpy(&MMU.fw.data.userSettings1, usr, sizeof(FWUserSettings));
|
|
||||||
memcpy(&MMU.fw.data.wifiInfo, usr + sizeof(FWUserSettings), WIFI_SETTINGS_SIZE);
|
|
||||||
memcpy(&MMU.fw.data.wifiAP1, usr + sizeof(FWUserSettings) + WIFI_SETTINGS_SIZE, sizeof(FWAccessPointSettings));
|
|
||||||
printf("Loaded user settings from %s\n", firmwareUserSettingsFilePath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
delete [] usr;
|
|
||||||
usr = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
printf("Failed loading firmware config from %s (wrong file size)\n", firmwareUserSettingsFilePath);
|
|
||||||
|
|
||||||
fclose(fp);
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CFIRMWARE::saveSettings(const char *firmwareUserSettingsFilePath)
|
bool CFIRMWARE::saveSettings(const char *firmwareUserSettingsFilePath)
|
||||||
|
@ -726,7 +687,16 @@ void NDS_GetDefaultFirmwareConfig(FirmwareConfig &outConfig)
|
||||||
|
|
||||||
// The length of the default strings, ignoring the null-terminating character.
|
// The length of the default strings, ignoring the null-terminating character.
|
||||||
outConfig.nicknameLength = strlen(defaultNickname);
|
outConfig.nicknameLength = strlen(defaultNickname);
|
||||||
|
if (outConfig.nicknameLength > MAX_FW_NICKNAME_LENGTH)
|
||||||
|
{
|
||||||
|
outConfig.nicknameLength = MAX_FW_NICKNAME_LENGTH;
|
||||||
|
}
|
||||||
|
|
||||||
outConfig.messageLength = strlen(defaultMessage);
|
outConfig.messageLength = strlen(defaultMessage);
|
||||||
|
if (outConfig.messageLength > MAX_FW_MESSAGE_LENGTH)
|
||||||
|
{
|
||||||
|
outConfig.messageLength = MAX_FW_MESSAGE_LENGTH;
|
||||||
|
}
|
||||||
|
|
||||||
// Copy the default char buffers into the UTF-16 string buffers.
|
// Copy the default char buffers into the UTF-16 string buffers.
|
||||||
for (size_t i = 0; i < outConfig.nicknameLength; i++)
|
for (size_t i = 0; i < outConfig.nicknameLength; i++)
|
||||||
|
@ -807,258 +777,419 @@ void NDS_GetCurrentWFCUserID(u8 *outMAC, u8 *outUserID)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void NDS_InitFirmwareWithConfig(const FirmwareConfig &inConfig)
|
void NDS_ApplyFirmwareSettings(NDSFirmwareData *outFirmware,
|
||||||
|
const FW_HEADER_KEY *headerKey,
|
||||||
|
const FWUserSettings *userSettings0,
|
||||||
|
const FWUserSettings *userSettings1,
|
||||||
|
const FWWifiInfo *wifiInfo,
|
||||||
|
const FWAccessPointSettings *wifiAP1,
|
||||||
|
const FWAccessPointSettings *wifiAP2,
|
||||||
|
const FWAccessPointSettings *wifiAP3)
|
||||||
{
|
{
|
||||||
// Create the firmware header
|
if (outFirmware == NULL)
|
||||||
NDSFirmwareData &fw = MMU.fw.data;
|
|
||||||
memset(&fw, 0, sizeof(NDSFirmwareData));
|
|
||||||
|
|
||||||
// Firmware identifier
|
|
||||||
fw.header.identifier[0] = 'M';
|
|
||||||
fw.header.identifier[1] = 'A';
|
|
||||||
fw.header.identifier[2] = 'C';
|
|
||||||
fw.header.identifier[3] = 'P';
|
|
||||||
|
|
||||||
// User Settings offset 0x3fe00 / 8
|
|
||||||
fw.header.userSettingsOffset = LOCAL_TO_LE_16( (u16)(offsetof(NDSFirmwareData, userSettings0) / 8) );
|
|
||||||
|
|
||||||
// NDS type
|
|
||||||
if (inConfig.consoleType == NDS_CONSOLE_TYPE_DSI)
|
|
||||||
{
|
{
|
||||||
fw.header.key.consoleType = NDS_CONSOLE_TYPE_FAT;
|
return;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
fw.header.key.consoleType = inConfig.consoleType;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// User settings (at 0x3FE00 and 0x3FF00)
|
if (headerKey != NULL)
|
||||||
fw.userSettings0.version = 5;
|
|
||||||
fw.userSettings0.favoriteColor = inConfig.favoriteColor;
|
|
||||||
fw.userSettings0.birthdayMonth = inConfig.birthdayMonth;
|
|
||||||
fw.userSettings0.birthdayDay = inConfig.birthdayDay;
|
|
||||||
|
|
||||||
// Copy the default char buffers into the UTF-16 string buffers.
|
|
||||||
fw.userSettings0.nicknameLength = LOCAL_TO_LE_16((u16)inConfig.nicknameLength);
|
|
||||||
fw.userSettings0.messageLength = LOCAL_TO_LE_16((u16)inConfig.messageLength);
|
|
||||||
|
|
||||||
for (size_t i = 0; i < inConfig.nicknameLength; i++)
|
|
||||||
{
|
{
|
||||||
fw.userSettings0.nickname[i] = LOCAL_TO_LE_16(inConfig.nickname[i]);
|
memcpy(&outFirmware->header.key, headerKey, sizeof(FW_HEADER_KEY));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i = 0; i < inConfig.messageLength; i++)
|
if (userSettings0 != NULL)
|
||||||
{
|
{
|
||||||
fw.userSettings0.message[i] = LOCAL_TO_LE_16(inConfig.message[i]);
|
memcpy(&outFirmware->userSettings0, userSettings0, sizeof(FWUserSettings));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Default touch-screen calibration settings.
|
if (userSettings1 != NULL)
|
||||||
fw.userSettings0.tscADC_x1 = LOCAL_TO_LE_16(inConfig.tscADC_x1);
|
|
||||||
fw.userSettings0.tscADC_y1 = LOCAL_TO_LE_16(inConfig.tscADC_y1);
|
|
||||||
fw.userSettings0.tscPixel_x1 = inConfig.tscPixel_x1;
|
|
||||||
fw.userSettings0.tscPixel_y1 = inConfig.tscPixel_y1;
|
|
||||||
fw.userSettings0.tscADC_x2 = LOCAL_TO_LE_16(inConfig.tscADC_x2);
|
|
||||||
fw.userSettings0.tscADC_y2 = LOCAL_TO_LE_16(inConfig.tscADC_y2);
|
|
||||||
fw.userSettings0.tscPixel_x2 = inConfig.tscPixel_x2;
|
|
||||||
fw.userSettings0.tscPixel_y2 = inConfig.tscPixel_y2;
|
|
||||||
|
|
||||||
// Default language and flags.
|
|
||||||
fw.userSettings0.languageFlags.value = 0xFC00;
|
|
||||||
fw.userSettings0.languageFlags.language = inConfig.language; // English
|
|
||||||
fw.userSettings0.languageFlags.gbaModeScreenSelection = 0;
|
|
||||||
fw.userSettings0.languageFlags.backlightLevel = inConfig.backlightLevel; // Max brightness
|
|
||||||
fw.userSettings0.languageFlags.bootmenuDisable = 0;
|
|
||||||
|
|
||||||
// Since we don't support DSi at the moment, we just fill this area with the default
|
|
||||||
// NDS data of 0xFF.
|
|
||||||
memset(fw.userSettings0.nds.unused5, 0xFF, sizeof(fw.userSettings0.nds.unused5));
|
|
||||||
|
|
||||||
// Copy the default config for userSettings0 into userSettings1.
|
|
||||||
fw.userSettings1 = fw.userSettings0;
|
|
||||||
|
|
||||||
fw.userSettings0.updateCounter = 0x0000;
|
|
||||||
fw.userSettings1.updateCounter = 0x0001;
|
|
||||||
fw.userSettings0.crc16 = LOCAL_TO_LE_16( (u16)calc_CRC16(0xFFFF, &fw.userSettings0, 0x70) );
|
|
||||||
fw.userSettings1.crc16 = LOCAL_TO_LE_16( (u16)calc_CRC16(0xFFFF, &fw.userSettings1, 0x70) );
|
|
||||||
|
|
||||||
// Begin setting up the WiFi info.
|
|
||||||
fw.wifiInfo.length = 0x0138;
|
|
||||||
fw.wifiInfo.version = 0;
|
|
||||||
fw.wifiInfo.channels = 0x3FFE;
|
|
||||||
fw.wifiInfo.flags = 0xFFFF;
|
|
||||||
|
|
||||||
// RF related
|
|
||||||
fw.wifiInfo.rfType = 2;
|
|
||||||
fw.wifiInfo.rfBits = 0x18;
|
|
||||||
fw.wifiInfo.rfEntries = 0x0C;
|
|
||||||
fw.wifiInfo.UNKNOWN1 = 0x01;
|
|
||||||
|
|
||||||
// Wifi I/O init values
|
|
||||||
fw.wifiInfo.wifiConfig146 = 0x0002; // 0x0044
|
|
||||||
fw.wifiInfo.wifiConfig148 = 0x0017; // 0x0046
|
|
||||||
fw.wifiInfo.wifiConfig14A = 0x0026; // 0x0048
|
|
||||||
fw.wifiInfo.wifiConfig14C = 0x1818; // 0x004A
|
|
||||||
fw.wifiInfo.wifiConfig120 = 0x0048; // 0x004C
|
|
||||||
fw.wifiInfo.wifiConfig122 = 0x4840; // 0x004E
|
|
||||||
fw.wifiInfo.wifiConfig154 = 0x0058; // 0x0050
|
|
||||||
fw.wifiInfo.wifiConfig144 = 0x0042; // 0x0052
|
|
||||||
fw.wifiInfo.wifiConfig130 = 0x0140; // 0x0054
|
|
||||||
fw.wifiInfo.wifiConfig132 = 0x8064; // 0x0056
|
|
||||||
fw.wifiInfo.wifiConfig140 = 0xE0E0; // 0x0058
|
|
||||||
fw.wifiInfo.wifiConfig142 = 0x2443; // 0x005A
|
|
||||||
fw.wifiInfo.wifiConfigPowerTX = 0x000E; // 0x005C
|
|
||||||
fw.wifiInfo.wifiConfig124 = 0x0032; // 0x005E
|
|
||||||
fw.wifiInfo.wifiConfig128 = 0x01F4; // 0x0060
|
|
||||||
fw.wifiInfo.wifiConfig150 = 0x0101; // 0x0062
|
|
||||||
|
|
||||||
// Wifi BB init values
|
|
||||||
memcpy(fw.wifiInfo.bbData, FW_BBInit, sizeof(FW_BBInit));
|
|
||||||
|
|
||||||
// Wifi RF init values
|
|
||||||
memcpy(fw.wifiInfo.Type2.rfValue, FW_RFInit, sizeof(FW_RFInit));
|
|
||||||
|
|
||||||
// Wifi channel-related init values
|
|
||||||
memcpy(fw.wifiInfo.Type2.rfChannelValue24, FW_RFChannel, sizeof(FW_RFChannel));
|
|
||||||
memcpy(fw.wifiInfo.Type2.bbChannelValue8, FW_BBChannel, sizeof(FW_BBChannel));
|
|
||||||
memset(fw.wifiInfo.Type2.rfChannelValue8, 0x10, 14);
|
|
||||||
|
|
||||||
fw.wifiInfo.UNKNOWN2 = 0x19;
|
|
||||||
fw.wifiInfo.unused4 = 0xFF;
|
|
||||||
memset(fw.wifiInfo.unused5, 0xFF, sizeof(fw.wifiInfo.unused5));
|
|
||||||
|
|
||||||
// MAC address
|
|
||||||
fw.wifiInfo.MACAddr[0] = inConfig.MACAddress[0];
|
|
||||||
fw.wifiInfo.MACAddr[1] = inConfig.MACAddress[1];
|
|
||||||
fw.wifiInfo.MACAddr[2] = inConfig.MACAddress[2];
|
|
||||||
fw.wifiInfo.MACAddr[3] = inConfig.MACAddress[3];
|
|
||||||
fw.wifiInfo.MACAddr[4] = inConfig.MACAddress[4];
|
|
||||||
fw.wifiInfo.MACAddr[5] = inConfig.MACAddress[5];
|
|
||||||
|
|
||||||
// Wifi settings CRC16
|
|
||||||
fw.wifiInfo.crc16 = LOCAL_TO_LE_16( (u16)calc_CRC16(0, &fw.wifiInfo.length, fw.wifiInfo.length) );
|
|
||||||
|
|
||||||
// WFC User ID, uniquely located on the first WiFi profile and no other
|
|
||||||
fw.wifiAP1.wfcUserID[0] = inConfig.WFCUserID[0];
|
|
||||||
fw.wifiAP1.wfcUserID[1] = inConfig.WFCUserID[1];
|
|
||||||
fw.wifiAP1.wfcUserID[2] = inConfig.WFCUserID[2];
|
|
||||||
fw.wifiAP1.wfcUserID[3] = inConfig.WFCUserID[3];
|
|
||||||
fw.wifiAP1.wfcUserID[4] = inConfig.WFCUserID[4];
|
|
||||||
fw.wifiAP1.wfcUserID[5] = inConfig.WFCUserID[5];
|
|
||||||
|
|
||||||
// WiFi profiles
|
|
||||||
if ( ((*(u32 *)inConfig.ipv4Address_AP1 != 0) && (*(u32 *)inConfig.ipv4Gateway_AP1 != 0) && (inConfig.subnetMask_AP1 != 0)) ||
|
|
||||||
(*(u32 *)inConfig.ipv4PrimaryDNS_AP1 != 0) ||
|
|
||||||
(*(u32 *)inConfig.ipv4SecondaryDNS_AP1 != 0) )
|
|
||||||
{
|
{
|
||||||
fw.wifiAP1.SSID[0] = 'S';
|
memcpy(&outFirmware->userSettings1, userSettings1, sizeof(FWUserSettings));
|
||||||
fw.wifiAP1.SSID[1] = 'o';
|
|
||||||
fw.wifiAP1.SSID[2] = 'f';
|
|
||||||
fw.wifiAP1.SSID[3] = 't';
|
|
||||||
fw.wifiAP1.SSID[4] = 'A';
|
|
||||||
fw.wifiAP1.SSID[5] = 'P';
|
|
||||||
fw.wifiAP1.ipv4Address[0] = inConfig.ipv4Address_AP1[0];
|
|
||||||
fw.wifiAP1.ipv4Address[1] = inConfig.ipv4Address_AP1[1];
|
|
||||||
fw.wifiAP1.ipv4Address[2] = inConfig.ipv4Address_AP1[2];
|
|
||||||
fw.wifiAP1.ipv4Address[3] = inConfig.ipv4Address_AP1[3];
|
|
||||||
fw.wifiAP1.ipv4Gateway[0] = inConfig.ipv4Gateway_AP1[0];
|
|
||||||
fw.wifiAP1.ipv4Gateway[1] = inConfig.ipv4Gateway_AP1[1];
|
|
||||||
fw.wifiAP1.ipv4Gateway[2] = inConfig.ipv4Gateway_AP1[2];
|
|
||||||
fw.wifiAP1.ipv4Gateway[3] = inConfig.ipv4Gateway_AP1[3];
|
|
||||||
fw.wifiAP1.ipv4PrimaryDNS[0] = inConfig.ipv4PrimaryDNS_AP1[0];
|
|
||||||
fw.wifiAP1.ipv4PrimaryDNS[1] = inConfig.ipv4PrimaryDNS_AP1[1];
|
|
||||||
fw.wifiAP1.ipv4PrimaryDNS[2] = inConfig.ipv4PrimaryDNS_AP1[2];
|
|
||||||
fw.wifiAP1.ipv4PrimaryDNS[3] = inConfig.ipv4PrimaryDNS_AP1[3];
|
|
||||||
fw.wifiAP1.ipv4SecondaryDNS[0] = inConfig.ipv4SecondaryDNS_AP1[0];
|
|
||||||
fw.wifiAP1.ipv4SecondaryDNS[1] = inConfig.ipv4SecondaryDNS_AP1[1];
|
|
||||||
fw.wifiAP1.ipv4SecondaryDNS[2] = inConfig.ipv4SecondaryDNS_AP1[2];
|
|
||||||
fw.wifiAP1.ipv4SecondaryDNS[3] = inConfig.ipv4SecondaryDNS_AP1[3];
|
|
||||||
fw.wifiAP1.subnetMask = inConfig.subnetMask_AP1;
|
|
||||||
fw.wifiAP1.configureMode = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
fw.wifiAP1.configureMode = 0xFF;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ((*(u32 *)inConfig.ipv4Address_AP2 != 0) && (*(u32 *)inConfig.ipv4Gateway_AP2 != 0) && (inConfig.subnetMask_AP2 != 0)) ||
|
if (wifiInfo != NULL)
|
||||||
(*(u32 *)inConfig.ipv4PrimaryDNS_AP2 != 0) ||
|
|
||||||
(*(u32 *)inConfig.ipv4SecondaryDNS_AP2 != 0) )
|
|
||||||
{
|
{
|
||||||
fw.wifiAP2.SSID[0] = 'S';
|
memcpy(&outFirmware->wifiInfo, wifiInfo, sizeof(FWWifiInfo));
|
||||||
fw.wifiAP2.SSID[1] = 'o';
|
|
||||||
fw.wifiAP2.SSID[2] = 'f';
|
|
||||||
fw.wifiAP2.SSID[3] = 't';
|
|
||||||
fw.wifiAP2.SSID[4] = 'A';
|
|
||||||
fw.wifiAP2.SSID[5] = 'P';
|
|
||||||
fw.wifiAP2.ipv4Address[0] = inConfig.ipv4Address_AP2[0];
|
|
||||||
fw.wifiAP2.ipv4Address[1] = inConfig.ipv4Address_AP2[1];
|
|
||||||
fw.wifiAP2.ipv4Address[2] = inConfig.ipv4Address_AP2[2];
|
|
||||||
fw.wifiAP2.ipv4Address[3] = inConfig.ipv4Address_AP2[3];
|
|
||||||
fw.wifiAP2.ipv4Gateway[0] = inConfig.ipv4Gateway_AP2[0];
|
|
||||||
fw.wifiAP2.ipv4Gateway[1] = inConfig.ipv4Gateway_AP2[1];
|
|
||||||
fw.wifiAP2.ipv4Gateway[2] = inConfig.ipv4Gateway_AP2[2];
|
|
||||||
fw.wifiAP2.ipv4Gateway[3] = inConfig.ipv4Gateway_AP2[3];
|
|
||||||
fw.wifiAP2.ipv4PrimaryDNS[0] = inConfig.ipv4PrimaryDNS_AP2[0];
|
|
||||||
fw.wifiAP2.ipv4PrimaryDNS[1] = inConfig.ipv4PrimaryDNS_AP2[1];
|
|
||||||
fw.wifiAP2.ipv4PrimaryDNS[2] = inConfig.ipv4PrimaryDNS_AP2[2];
|
|
||||||
fw.wifiAP2.ipv4PrimaryDNS[3] = inConfig.ipv4PrimaryDNS_AP2[3];
|
|
||||||
fw.wifiAP2.ipv4SecondaryDNS[0] = inConfig.ipv4SecondaryDNS_AP2[0];
|
|
||||||
fw.wifiAP2.ipv4SecondaryDNS[1] = inConfig.ipv4SecondaryDNS_AP2[1];
|
|
||||||
fw.wifiAP2.ipv4SecondaryDNS[2] = inConfig.ipv4SecondaryDNS_AP2[2];
|
|
||||||
fw.wifiAP2.ipv4SecondaryDNS[3] = inConfig.ipv4SecondaryDNS_AP2[3];
|
|
||||||
fw.wifiAP2.subnetMask = inConfig.subnetMask_AP2;
|
|
||||||
fw.wifiAP2.configureMode = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
fw.wifiAP2.configureMode = 0xFF;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ((*(u32 *)inConfig.ipv4Address_AP3 != 0) && (*(u32 *)inConfig.ipv4Gateway_AP3 != 0) && (inConfig.subnetMask_AP3 != 0)) ||
|
if (wifiAP1 != NULL)
|
||||||
(*(u32 *)inConfig.ipv4PrimaryDNS_AP3 != 0) ||
|
|
||||||
(*(u32 *)inConfig.ipv4SecondaryDNS_AP3 != 0) )
|
|
||||||
{
|
{
|
||||||
fw.wifiAP3.SSID[0] = 'S';
|
memcpy(&outFirmware->wifiAP1, wifiAP1, sizeof(FWAccessPointSettings));
|
||||||
fw.wifiAP3.SSID[1] = 'o';
|
|
||||||
fw.wifiAP3.SSID[2] = 'f';
|
|
||||||
fw.wifiAP3.SSID[3] = 't';
|
|
||||||
fw.wifiAP3.SSID[4] = 'A';
|
|
||||||
fw.wifiAP3.SSID[5] = 'P';
|
|
||||||
fw.wifiAP3.ipv4Address[0] = inConfig.ipv4Address_AP3[0];
|
|
||||||
fw.wifiAP3.ipv4Address[1] = inConfig.ipv4Address_AP3[1];
|
|
||||||
fw.wifiAP3.ipv4Address[2] = inConfig.ipv4Address_AP3[2];
|
|
||||||
fw.wifiAP3.ipv4Address[3] = inConfig.ipv4Address_AP3[3];
|
|
||||||
fw.wifiAP3.ipv4Gateway[0] = inConfig.ipv4Gateway_AP3[0];
|
|
||||||
fw.wifiAP3.ipv4Gateway[1] = inConfig.ipv4Gateway_AP3[1];
|
|
||||||
fw.wifiAP3.ipv4Gateway[2] = inConfig.ipv4Gateway_AP3[2];
|
|
||||||
fw.wifiAP3.ipv4Gateway[3] = inConfig.ipv4Gateway_AP3[3];
|
|
||||||
fw.wifiAP3.ipv4PrimaryDNS[0] = inConfig.ipv4PrimaryDNS_AP3[0];
|
|
||||||
fw.wifiAP3.ipv4PrimaryDNS[1] = inConfig.ipv4PrimaryDNS_AP3[1];
|
|
||||||
fw.wifiAP3.ipv4PrimaryDNS[2] = inConfig.ipv4PrimaryDNS_AP3[2];
|
|
||||||
fw.wifiAP3.ipv4PrimaryDNS[3] = inConfig.ipv4PrimaryDNS_AP3[3];
|
|
||||||
fw.wifiAP3.ipv4SecondaryDNS[0] = inConfig.ipv4SecondaryDNS_AP3[0];
|
|
||||||
fw.wifiAP3.ipv4SecondaryDNS[1] = inConfig.ipv4SecondaryDNS_AP3[1];
|
|
||||||
fw.wifiAP3.ipv4SecondaryDNS[2] = inConfig.ipv4SecondaryDNS_AP3[2];
|
|
||||||
fw.wifiAP3.ipv4SecondaryDNS[3] = inConfig.ipv4SecondaryDNS_AP3[3];
|
|
||||||
fw.wifiAP3.subnetMask = inConfig.subnetMask_AP3;
|
|
||||||
fw.wifiAP3.configureMode = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
fw.wifiAP3.configureMode = 0xFF;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fw.wifiAP1.crc16 = LOCAL_TO_LE_16( (u16)calc_CRC16(0, &fw.wifiAP1, 254) );
|
if (wifiAP2 != NULL)
|
||||||
fw.wifiAP2.crc16 = LOCAL_TO_LE_16( (u16)calc_CRC16(0, &fw.wifiAP2, 254) );
|
|
||||||
fw.wifiAP3.crc16 = LOCAL_TO_LE_16( (u16)calc_CRC16(0, &fw.wifiAP3, 254) );
|
|
||||||
|
|
||||||
if (&inConfig != &CommonSettings.fwConfig)
|
|
||||||
{
|
{
|
||||||
memcpy(&CommonSettings.fwConfig, &inConfig, sizeof(FirmwareConfig));
|
memcpy(&outFirmware->wifiAP2, wifiAP2, sizeof(FWAccessPointSettings));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wifiAP3 != NULL)
|
||||||
|
{
|
||||||
|
memcpy(&outFirmware->wifiAP3, wifiAP3, sizeof(FWAccessPointSettings));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NDS_ReadFirmwareDataFromFile(const char *fileName, NDSFirmwareData *outFirmwareData, size_t *outFileSize, int *outConsoleType, u8 *outMACAddr)
|
bool NDS_ApplyFirmwareSettingsWithFile(NDSFirmwareData *outFirmware, const char *inFileName)
|
||||||
|
{
|
||||||
|
bool didReadExtFirmwareData = false;
|
||||||
|
u8 *extFirmwareData = NULL;
|
||||||
|
size_t fileSize = 0;
|
||||||
|
|
||||||
|
if ( (outFirmware == NULL) || (inFileName == NULL) || (strlen(inFileName) == 0) )
|
||||||
|
{
|
||||||
|
return didReadExtFirmwareData;
|
||||||
|
}
|
||||||
|
|
||||||
|
FILE *fp = fopen(inFileName, "rb");
|
||||||
|
if (fp == NULL)
|
||||||
|
{
|
||||||
|
printf("Ext. Firmware: Failed loading config from %s\n Could not open file.\n", inFileName);
|
||||||
|
return didReadExtFirmwareData;
|
||||||
|
}
|
||||||
|
|
||||||
|
fseek(fp, 0, SEEK_END);
|
||||||
|
fileSize = (size_t)ftell(fp);
|
||||||
|
if (fileSize != DFC_FILE_SIZE)
|
||||||
|
{
|
||||||
|
printf("Ext. Firmware: Failed loading config from %s\n Actual file size was %zu bytes, expected %zu bytes.\n", inFileName, fileSize, DFC_FILE_SIZE);
|
||||||
|
fclose(fp);
|
||||||
|
return didReadExtFirmwareData;
|
||||||
|
}
|
||||||
|
fseek(fp, 0, SEEK_SET);
|
||||||
|
|
||||||
|
extFirmwareData = (u8 *)malloc(SETTINGS_SIZE);
|
||||||
|
if (extFirmwareData == NULL)
|
||||||
|
{
|
||||||
|
return didReadExtFirmwareData;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fread(extFirmwareData, 1, DFC_ID_SIZE, fp) == DFC_ID_SIZE)
|
||||||
|
{
|
||||||
|
if (memcmp(extFirmwareData, DFC_ID_CODE, DFC_ID_SIZE) == 0)
|
||||||
|
{
|
||||||
|
const size_t readSettingsSize = fread(extFirmwareData, 1, SETTINGS_SIZE, fp);
|
||||||
|
didReadExtFirmwareData = (readSettingsSize == SETTINGS_SIZE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
if (didReadExtFirmwareData)
|
||||||
|
{
|
||||||
|
// Need a temp struct here because WIFI_SETTINGS_SIZE is smaller than sizeof(FWWifiInfo).
|
||||||
|
FWWifiInfo wifiInfo = outFirmware->wifiInfo;
|
||||||
|
memcpy(&wifiInfo, extFirmwareData + sizeof(FWUserSettings), WIFI_SETTINGS_SIZE);
|
||||||
|
|
||||||
|
NDS_ApplyFirmwareSettings(outFirmware,
|
||||||
|
NULL,
|
||||||
|
(FWUserSettings *)extFirmwareData,
|
||||||
|
(FWUserSettings *)extFirmwareData,
|
||||||
|
&wifiInfo,
|
||||||
|
(FWAccessPointSettings *)(extFirmwareData + sizeof(FWUserSettings) + WIFI_SETTINGS_SIZE),
|
||||||
|
NULL,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
printf("Ext. Firmware: Successfully loaded config from %s\n", inFileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(extFirmwareData);
|
||||||
|
|
||||||
|
return didReadExtFirmwareData;
|
||||||
|
}
|
||||||
|
|
||||||
|
void NDS_ApplyFirmwareSettingsWithConfig(NDSFirmwareData *outFirmware, const FirmwareConfig &inConfig)
|
||||||
|
{
|
||||||
|
if (outFirmware == NULL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
FW_HEADER_KEY headerKey = outFirmware->header.key;
|
||||||
|
FWUserSettings userSettings0 = outFirmware->userSettings0;
|
||||||
|
FWUserSettings userSettings1 = outFirmware->userSettings1;
|
||||||
|
FWWifiInfo wifiInfo = outFirmware->wifiInfo;
|
||||||
|
FWAccessPointSettings wifiAP1 = outFirmware->wifiAP1;
|
||||||
|
FWAccessPointSettings wifiAP2 = outFirmware->wifiAP2;
|
||||||
|
FWAccessPointSettings wifiAP3 = outFirmware->wifiAP3;
|
||||||
|
|
||||||
|
// NDS type
|
||||||
|
headerKey.consoleType = inConfig.consoleType;
|
||||||
|
|
||||||
|
// User settings (at 0x3FE00 and 0x3FF00)
|
||||||
|
userSettings0.favoriteColor = inConfig.favoriteColor;
|
||||||
|
userSettings0.birthdayMonth = inConfig.birthdayMonth;
|
||||||
|
userSettings0.birthdayDay = inConfig.birthdayDay;
|
||||||
|
|
||||||
|
// Copy the default char buffers into the UTF-16 string buffers.
|
||||||
|
u16 nicknameLength = inConfig.nicknameLength;
|
||||||
|
if (nicknameLength > MAX_FW_NICKNAME_LENGTH)
|
||||||
|
{
|
||||||
|
nicknameLength = MAX_FW_NICKNAME_LENGTH;
|
||||||
|
}
|
||||||
|
|
||||||
|
u16 messageLength = inConfig.messageLength;
|
||||||
|
if (messageLength > MAX_FW_MESSAGE_LENGTH)
|
||||||
|
{
|
||||||
|
messageLength = MAX_FW_MESSAGE_LENGTH;
|
||||||
|
}
|
||||||
|
|
||||||
|
userSettings0.nicknameLength = LOCAL_TO_LE_16(nicknameLength);
|
||||||
|
userSettings0.messageLength = LOCAL_TO_LE_16(messageLength);
|
||||||
|
|
||||||
|
memset(userSettings0.nickname, 0, MAX_FW_NICKNAME_LENGTH * sizeof(u16));
|
||||||
|
for (size_t i = 0; i < nicknameLength; i++)
|
||||||
|
{
|
||||||
|
userSettings0.nickname[i] = LOCAL_TO_LE_16(inConfig.nickname[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(userSettings0.message, 0, MAX_FW_MESSAGE_LENGTH * sizeof(u16));
|
||||||
|
for (size_t i = 0; i < messageLength; i++)
|
||||||
|
{
|
||||||
|
userSettings0.message[i] = LOCAL_TO_LE_16(inConfig.message[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Default touch-screen calibration settings.
|
||||||
|
userSettings0.tscADC_x1 = LOCAL_TO_LE_16(inConfig.tscADC_x1);
|
||||||
|
userSettings0.tscADC_y1 = LOCAL_TO_LE_16(inConfig.tscADC_y1);
|
||||||
|
userSettings0.tscPixel_x1 = inConfig.tscPixel_x1;
|
||||||
|
userSettings0.tscPixel_y1 = inConfig.tscPixel_y1;
|
||||||
|
userSettings0.tscADC_x2 = LOCAL_TO_LE_16(inConfig.tscADC_x2);
|
||||||
|
userSettings0.tscADC_y2 = LOCAL_TO_LE_16(inConfig.tscADC_y2);
|
||||||
|
userSettings0.tscPixel_x2 = inConfig.tscPixel_x2;
|
||||||
|
userSettings0.tscPixel_y2 = inConfig.tscPixel_y2;
|
||||||
|
|
||||||
|
// Default language and flags.
|
||||||
|
userSettings0.languageFlags.language = inConfig.language;
|
||||||
|
userSettings0.languageFlags.backlightLevel = inConfig.backlightLevel;
|
||||||
|
|
||||||
|
// Copy the default config for userSettings0 into userSettings1.
|
||||||
|
userSettings1 = userSettings0;
|
||||||
|
|
||||||
|
userSettings0.updateCounter = 0x0000;
|
||||||
|
userSettings1.updateCounter = 0x0001;
|
||||||
|
userSettings0.crc16 = LOCAL_TO_LE_16( (u16)calc_CRC16(0xFFFF, &userSettings0, 0x70) );
|
||||||
|
userSettings1.crc16 = LOCAL_TO_LE_16( (u16)calc_CRC16(0xFFFF, &userSettings1, 0x70) );
|
||||||
|
|
||||||
|
// MAC address
|
||||||
|
wifiInfo.MACAddr[0] = inConfig.MACAddress[0];
|
||||||
|
wifiInfo.MACAddr[1] = inConfig.MACAddress[1];
|
||||||
|
wifiInfo.MACAddr[2] = inConfig.MACAddress[2];
|
||||||
|
wifiInfo.MACAddr[3] = inConfig.MACAddress[3];
|
||||||
|
wifiInfo.MACAddr[4] = inConfig.MACAddress[4];
|
||||||
|
wifiInfo.MACAddr[5] = inConfig.MACAddress[5];
|
||||||
|
|
||||||
|
// Wifi settings CRC16
|
||||||
|
wifiInfo.crc16 = LOCAL_TO_LE_16( (u16)calc_CRC16(0, &wifiInfo.length, wifiInfo.length) );
|
||||||
|
|
||||||
|
// WFC User ID, uniquely located on the first WiFi profile and no other
|
||||||
|
wifiAP1.wfcUserID[0] = inConfig.WFCUserID[0];
|
||||||
|
wifiAP1.wfcUserID[1] = inConfig.WFCUserID[1];
|
||||||
|
wifiAP1.wfcUserID[2] = inConfig.WFCUserID[2];
|
||||||
|
wifiAP1.wfcUserID[3] = inConfig.WFCUserID[3];
|
||||||
|
wifiAP1.wfcUserID[4] = inConfig.WFCUserID[4];
|
||||||
|
wifiAP1.wfcUserID[5] = inConfig.WFCUserID[5];
|
||||||
|
|
||||||
|
// WiFi profiles
|
||||||
|
if ( ((*(u32 *)inConfig.ipv4Address_AP1 != 0) && (*(u32 *)inConfig.ipv4Gateway_AP1 != 0) && (inConfig.subnetMask_AP1 != 0)) ||
|
||||||
|
(*(u32 *)inConfig.ipv4PrimaryDNS_AP1 != 0) ||
|
||||||
|
(*(u32 *)inConfig.ipv4SecondaryDNS_AP1 != 0) )
|
||||||
|
{
|
||||||
|
wifiAP1.SSID[0] = 'S';
|
||||||
|
wifiAP1.SSID[1] = 'o';
|
||||||
|
wifiAP1.SSID[2] = 'f';
|
||||||
|
wifiAP1.SSID[3] = 't';
|
||||||
|
wifiAP1.SSID[4] = 'A';
|
||||||
|
wifiAP1.SSID[5] = 'P';
|
||||||
|
wifiAP1.ipv4Address[0] = inConfig.ipv4Address_AP1[0];
|
||||||
|
wifiAP1.ipv4Address[1] = inConfig.ipv4Address_AP1[1];
|
||||||
|
wifiAP1.ipv4Address[2] = inConfig.ipv4Address_AP1[2];
|
||||||
|
wifiAP1.ipv4Address[3] = inConfig.ipv4Address_AP1[3];
|
||||||
|
wifiAP1.ipv4Gateway[0] = inConfig.ipv4Gateway_AP1[0];
|
||||||
|
wifiAP1.ipv4Gateway[1] = inConfig.ipv4Gateway_AP1[1];
|
||||||
|
wifiAP1.ipv4Gateway[2] = inConfig.ipv4Gateway_AP1[2];
|
||||||
|
wifiAP1.ipv4Gateway[3] = inConfig.ipv4Gateway_AP1[3];
|
||||||
|
wifiAP1.ipv4PrimaryDNS[0] = inConfig.ipv4PrimaryDNS_AP1[0];
|
||||||
|
wifiAP1.ipv4PrimaryDNS[1] = inConfig.ipv4PrimaryDNS_AP1[1];
|
||||||
|
wifiAP1.ipv4PrimaryDNS[2] = inConfig.ipv4PrimaryDNS_AP1[2];
|
||||||
|
wifiAP1.ipv4PrimaryDNS[3] = inConfig.ipv4PrimaryDNS_AP1[3];
|
||||||
|
wifiAP1.ipv4SecondaryDNS[0] = inConfig.ipv4SecondaryDNS_AP1[0];
|
||||||
|
wifiAP1.ipv4SecondaryDNS[1] = inConfig.ipv4SecondaryDNS_AP1[1];
|
||||||
|
wifiAP1.ipv4SecondaryDNS[2] = inConfig.ipv4SecondaryDNS_AP1[2];
|
||||||
|
wifiAP1.ipv4SecondaryDNS[3] = inConfig.ipv4SecondaryDNS_AP1[3];
|
||||||
|
wifiAP1.subnetMask = inConfig.subnetMask_AP1;
|
||||||
|
wifiAP1.configureMode = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wifiAP1.configureMode = 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ((*(u32 *)inConfig.ipv4Address_AP2 != 0) && (*(u32 *)inConfig.ipv4Gateway_AP2 != 0) && (inConfig.subnetMask_AP2 != 0)) ||
|
||||||
|
(*(u32 *)inConfig.ipv4PrimaryDNS_AP2 != 0) ||
|
||||||
|
(*(u32 *)inConfig.ipv4SecondaryDNS_AP2 != 0) )
|
||||||
|
{
|
||||||
|
wifiAP2.SSID[0] = 'S';
|
||||||
|
wifiAP2.SSID[1] = 'o';
|
||||||
|
wifiAP2.SSID[2] = 'f';
|
||||||
|
wifiAP2.SSID[3] = 't';
|
||||||
|
wifiAP2.SSID[4] = 'A';
|
||||||
|
wifiAP2.SSID[5] = 'P';
|
||||||
|
wifiAP2.ipv4Address[0] = inConfig.ipv4Address_AP2[0];
|
||||||
|
wifiAP2.ipv4Address[1] = inConfig.ipv4Address_AP2[1];
|
||||||
|
wifiAP2.ipv4Address[2] = inConfig.ipv4Address_AP2[2];
|
||||||
|
wifiAP2.ipv4Address[3] = inConfig.ipv4Address_AP2[3];
|
||||||
|
wifiAP2.ipv4Gateway[0] = inConfig.ipv4Gateway_AP2[0];
|
||||||
|
wifiAP2.ipv4Gateway[1] = inConfig.ipv4Gateway_AP2[1];
|
||||||
|
wifiAP2.ipv4Gateway[2] = inConfig.ipv4Gateway_AP2[2];
|
||||||
|
wifiAP2.ipv4Gateway[3] = inConfig.ipv4Gateway_AP2[3];
|
||||||
|
wifiAP2.ipv4PrimaryDNS[0] = inConfig.ipv4PrimaryDNS_AP2[0];
|
||||||
|
wifiAP2.ipv4PrimaryDNS[1] = inConfig.ipv4PrimaryDNS_AP2[1];
|
||||||
|
wifiAP2.ipv4PrimaryDNS[2] = inConfig.ipv4PrimaryDNS_AP2[2];
|
||||||
|
wifiAP2.ipv4PrimaryDNS[3] = inConfig.ipv4PrimaryDNS_AP2[3];
|
||||||
|
wifiAP2.ipv4SecondaryDNS[0] = inConfig.ipv4SecondaryDNS_AP2[0];
|
||||||
|
wifiAP2.ipv4SecondaryDNS[1] = inConfig.ipv4SecondaryDNS_AP2[1];
|
||||||
|
wifiAP2.ipv4SecondaryDNS[2] = inConfig.ipv4SecondaryDNS_AP2[2];
|
||||||
|
wifiAP2.ipv4SecondaryDNS[3] = inConfig.ipv4SecondaryDNS_AP2[3];
|
||||||
|
wifiAP2.subnetMask = inConfig.subnetMask_AP2;
|
||||||
|
wifiAP2.configureMode = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wifiAP2.configureMode = 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ((*(u32 *)inConfig.ipv4Address_AP3 != 0) && (*(u32 *)inConfig.ipv4Gateway_AP3 != 0) && (inConfig.subnetMask_AP3 != 0)) ||
|
||||||
|
(*(u32 *)inConfig.ipv4PrimaryDNS_AP3 != 0) ||
|
||||||
|
(*(u32 *)inConfig.ipv4SecondaryDNS_AP3 != 0) )
|
||||||
|
{
|
||||||
|
wifiAP3.SSID[0] = 'S';
|
||||||
|
wifiAP3.SSID[1] = 'o';
|
||||||
|
wifiAP3.SSID[2] = 'f';
|
||||||
|
wifiAP3.SSID[3] = 't';
|
||||||
|
wifiAP3.SSID[4] = 'A';
|
||||||
|
wifiAP3.SSID[5] = 'P';
|
||||||
|
wifiAP3.ipv4Address[0] = inConfig.ipv4Address_AP3[0];
|
||||||
|
wifiAP3.ipv4Address[1] = inConfig.ipv4Address_AP3[1];
|
||||||
|
wifiAP3.ipv4Address[2] = inConfig.ipv4Address_AP3[2];
|
||||||
|
wifiAP3.ipv4Address[3] = inConfig.ipv4Address_AP3[3];
|
||||||
|
wifiAP3.ipv4Gateway[0] = inConfig.ipv4Gateway_AP3[0];
|
||||||
|
wifiAP3.ipv4Gateway[1] = inConfig.ipv4Gateway_AP3[1];
|
||||||
|
wifiAP3.ipv4Gateway[2] = inConfig.ipv4Gateway_AP3[2];
|
||||||
|
wifiAP3.ipv4Gateway[3] = inConfig.ipv4Gateway_AP3[3];
|
||||||
|
wifiAP3.ipv4PrimaryDNS[0] = inConfig.ipv4PrimaryDNS_AP3[0];
|
||||||
|
wifiAP3.ipv4PrimaryDNS[1] = inConfig.ipv4PrimaryDNS_AP3[1];
|
||||||
|
wifiAP3.ipv4PrimaryDNS[2] = inConfig.ipv4PrimaryDNS_AP3[2];
|
||||||
|
wifiAP3.ipv4PrimaryDNS[3] = inConfig.ipv4PrimaryDNS_AP3[3];
|
||||||
|
wifiAP3.ipv4SecondaryDNS[0] = inConfig.ipv4SecondaryDNS_AP3[0];
|
||||||
|
wifiAP3.ipv4SecondaryDNS[1] = inConfig.ipv4SecondaryDNS_AP3[1];
|
||||||
|
wifiAP3.ipv4SecondaryDNS[2] = inConfig.ipv4SecondaryDNS_AP3[2];
|
||||||
|
wifiAP3.ipv4SecondaryDNS[3] = inConfig.ipv4SecondaryDNS_AP3[3];
|
||||||
|
wifiAP3.subnetMask = inConfig.subnetMask_AP3;
|
||||||
|
wifiAP3.configureMode = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wifiAP3.configureMode = 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
wifiAP1.crc16 = LOCAL_TO_LE_16( (u16)calc_CRC16(0, &wifiAP1, 254) );
|
||||||
|
wifiAP2.crc16 = LOCAL_TO_LE_16( (u16)calc_CRC16(0, &wifiAP2, 254) );
|
||||||
|
wifiAP3.crc16 = LOCAL_TO_LE_16( (u16)calc_CRC16(0, &wifiAP3, 254) );
|
||||||
|
|
||||||
|
NDS_ApplyFirmwareSettings(outFirmware,
|
||||||
|
&headerKey,
|
||||||
|
&userSettings0,
|
||||||
|
&userSettings1,
|
||||||
|
&wifiInfo,
|
||||||
|
&wifiAP1,
|
||||||
|
&wifiAP2,
|
||||||
|
&wifiAP3);
|
||||||
|
}
|
||||||
|
|
||||||
|
void NDS_InitDefaultFirmware(NDSFirmwareData *outFirmware)
|
||||||
|
{
|
||||||
|
if (outFirmware == NULL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// First, clear the firmware data with all zeroes
|
||||||
|
memset(outFirmware, 0, sizeof(NDSFirmwareData));
|
||||||
|
|
||||||
|
FirmwareConfig defaultConfig;
|
||||||
|
NDS_GetDefaultFirmwareConfig(defaultConfig);
|
||||||
|
|
||||||
|
// Firmware identifier
|
||||||
|
outFirmware->header.identifier[0] = 'M';
|
||||||
|
outFirmware->header.identifier[1] = 'A';
|
||||||
|
outFirmware->header.identifier[2] = 'C';
|
||||||
|
outFirmware->header.identifier[3] = 'P';
|
||||||
|
|
||||||
|
// User Settings offset 0x3fe00 / 8
|
||||||
|
outFirmware->header.userSettingsOffset = LOCAL_TO_LE_16( (u16)(offsetof(NDSFirmwareData, userSettings0) / 8) );
|
||||||
|
|
||||||
|
// User settings (at 0x3FE00 and 0x3FF00)
|
||||||
|
outFirmware->userSettings0.version = 5;
|
||||||
|
|
||||||
|
// Default language and flags.
|
||||||
|
outFirmware->userSettings0.languageFlags.value = 0xFC00;
|
||||||
|
outFirmware->userSettings0.languageFlags.gbaModeScreenSelection = 0;
|
||||||
|
outFirmware->userSettings0.languageFlags.bootmenuDisable = 0;
|
||||||
|
|
||||||
|
// Since we don't support DSi at the moment, we just fill this area with the default
|
||||||
|
// NDS data of 0xFF.
|
||||||
|
memset(outFirmware->userSettings0.nds.unused5, 0xFF, sizeof(outFirmware->userSettings0.nds.unused5));
|
||||||
|
|
||||||
|
// Copy the default config for userSettings0 into userSettings1.
|
||||||
|
outFirmware->userSettings1 = outFirmware->userSettings0;
|
||||||
|
|
||||||
|
// Begin setting up the WiFi info.
|
||||||
|
outFirmware->wifiInfo.length = 0x0138;
|
||||||
|
outFirmware->wifiInfo.version = 0;
|
||||||
|
outFirmware->wifiInfo.channels = 0x3FFE;
|
||||||
|
outFirmware->wifiInfo.flags = 0xFFFF;
|
||||||
|
|
||||||
|
// RF related
|
||||||
|
outFirmware->wifiInfo.rfType = 2;
|
||||||
|
outFirmware->wifiInfo.rfBits = 0x18;
|
||||||
|
outFirmware->wifiInfo.rfEntries = 0x0C;
|
||||||
|
outFirmware->wifiInfo.UNKNOWN1 = 0x01;
|
||||||
|
|
||||||
|
// Wifi I/O init values
|
||||||
|
outFirmware->wifiInfo.wifiConfig146 = 0x0002; // 0x0044
|
||||||
|
outFirmware->wifiInfo.wifiConfig148 = 0x0017; // 0x0046
|
||||||
|
outFirmware->wifiInfo.wifiConfig14A = 0x0026; // 0x0048
|
||||||
|
outFirmware->wifiInfo.wifiConfig14C = 0x1818; // 0x004A
|
||||||
|
outFirmware->wifiInfo.wifiConfig120 = 0x0048; // 0x004C
|
||||||
|
outFirmware->wifiInfo.wifiConfig122 = 0x4840; // 0x004E
|
||||||
|
outFirmware->wifiInfo.wifiConfig154 = 0x0058; // 0x0050
|
||||||
|
outFirmware->wifiInfo.wifiConfig144 = 0x0042; // 0x0052
|
||||||
|
outFirmware->wifiInfo.wifiConfig130 = 0x0140; // 0x0054
|
||||||
|
outFirmware->wifiInfo.wifiConfig132 = 0x8064; // 0x0056
|
||||||
|
outFirmware->wifiInfo.wifiConfig140 = 0xE0E0; // 0x0058
|
||||||
|
outFirmware->wifiInfo.wifiConfig142 = 0x2443; // 0x005A
|
||||||
|
outFirmware->wifiInfo.wifiConfigPowerTX = 0x000E; // 0x005C
|
||||||
|
outFirmware->wifiInfo.wifiConfig124 = 0x0032; // 0x005E
|
||||||
|
outFirmware->wifiInfo.wifiConfig128 = 0x01F4; // 0x0060
|
||||||
|
outFirmware->wifiInfo.wifiConfig150 = 0x0101; // 0x0062
|
||||||
|
|
||||||
|
// Wifi BB init values
|
||||||
|
memcpy(outFirmware->wifiInfo.bbData, FW_BBInit, sizeof(FW_BBInit));
|
||||||
|
|
||||||
|
// Wifi RF init values
|
||||||
|
memcpy(outFirmware->wifiInfo.Type2.rfValue, FW_RFInit, sizeof(FW_RFInit));
|
||||||
|
|
||||||
|
// Wifi channel-related init values
|
||||||
|
memcpy(outFirmware->wifiInfo.Type2.rfChannelValue24, FW_RFChannel, sizeof(FW_RFChannel));
|
||||||
|
memcpy(outFirmware->wifiInfo.Type2.bbChannelValue8, FW_BBChannel, sizeof(FW_BBChannel));
|
||||||
|
memset(outFirmware->wifiInfo.Type2.rfChannelValue8, 0x10, 14);
|
||||||
|
|
||||||
|
outFirmware->wifiInfo.UNKNOWN2 = 0x19;
|
||||||
|
outFirmware->wifiInfo.unused4 = 0xFF;
|
||||||
|
memset(outFirmware->wifiInfo.unused5, 0xFF, sizeof(outFirmware->wifiInfo.unused5));
|
||||||
|
|
||||||
|
NDS_ApplyFirmwareSettingsWithConfig(outFirmware, defaultConfig);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool NDS_ReadFirmwareDataFromFile(const char *fileName, NDSFirmwareData *outFirmware, size_t *outFileSize, int *outConsoleType, u8 *outMACAddr)
|
||||||
{
|
{
|
||||||
bool result = false;
|
bool result = false;
|
||||||
|
|
||||||
|
@ -1104,26 +1235,26 @@ bool NDS_ReadFirmwareDataFromFile(const char *fileName, NDSFirmwareData *outFirm
|
||||||
// pieces of data that the caller has requested.
|
// pieces of data that the caller has requested.
|
||||||
result = true;
|
result = true;
|
||||||
|
|
||||||
if (outFirmwareData != NULL)
|
if (outFirmware != NULL)
|
||||||
{
|
{
|
||||||
fseek(fp, 0, SEEK_SET);
|
fseek(fp, 0, SEEK_SET);
|
||||||
readBytes = fread(outFirmwareData, 1, sizeof(NDSFirmwareData), fp);
|
readBytes = fread(outFirmware, 1, sizeof(NDSFirmwareData), fp);
|
||||||
|
|
||||||
if ( readBytes == sizeof(NDSFirmwareData) )
|
if ( readBytes == sizeof(NDSFirmwareData) )
|
||||||
{
|
{
|
||||||
if (outConsoleType != NULL)
|
if (outConsoleType != NULL)
|
||||||
{
|
{
|
||||||
*outConsoleType = (int)outFirmwareData->header.key.consoleType;
|
*outConsoleType = (int)outFirmware->header.key.consoleType;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (outMACAddr != NULL)
|
if (outMACAddr != NULL)
|
||||||
{
|
{
|
||||||
outMACAddr[0] = outFirmwareData->wifiInfo.MACAddr[0];
|
outMACAddr[0] = outFirmware->wifiInfo.MACAddr[0];
|
||||||
outMACAddr[1] = outFirmwareData->wifiInfo.MACAddr[1];
|
outMACAddr[1] = outFirmware->wifiInfo.MACAddr[1];
|
||||||
outMACAddr[2] = outFirmwareData->wifiInfo.MACAddr[2];
|
outMACAddr[2] = outFirmware->wifiInfo.MACAddr[2];
|
||||||
outMACAddr[3] = outFirmwareData->wifiInfo.MACAddr[3];
|
outMACAddr[3] = outFirmware->wifiInfo.MACAddr[3];
|
||||||
outMACAddr[4] = outFirmwareData->wifiInfo.MACAddr[4];
|
outMACAddr[4] = outFirmware->wifiInfo.MACAddr[4];
|
||||||
outMACAddr[5] = outFirmwareData->wifiInfo.MACAddr[5];
|
outMACAddr[5] = outFirmware->wifiInfo.MACAddr[5];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright (C) 2009-2018 DeSmuME Team
|
Copyright (C) 2009-2019 DeSmuME Team
|
||||||
|
|
||||||
This file is free software: you can redistribute it and/or modify
|
This file is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -446,8 +446,18 @@ int copy_firmware_user_data( u8 *dest_buffer, const u8 *fw_data);
|
||||||
|
|
||||||
void NDS_GetDefaultFirmwareConfig(FirmwareConfig &outConfig);
|
void NDS_GetDefaultFirmwareConfig(FirmwareConfig &outConfig);
|
||||||
void NDS_GetCurrentWFCUserID(u8 *outMAC, u8 *outUserID);
|
void NDS_GetCurrentWFCUserID(u8 *outMAC, u8 *outUserID);
|
||||||
void NDS_InitFirmwareWithConfig(const FirmwareConfig &inConfig);
|
void NDS_ApplyFirmwareSettings(NDSFirmwareData *outFirmware,
|
||||||
bool NDS_ReadFirmwareDataFromFile(const char *fileName, NDSFirmwareData *outFirmwareData, size_t *outFileSize, int *outConsoleType, u8 *outMACAddr);
|
const FW_HEADER_KEY *headerKey,
|
||||||
|
const FWUserSettings *userSettings0,
|
||||||
|
const FWUserSettings *userSettings1,
|
||||||
|
const FWWifiInfo *wifiInfo,
|
||||||
|
const FWAccessPointSettings *wifiAP1,
|
||||||
|
const FWAccessPointSettings *wifiAP2,
|
||||||
|
const FWAccessPointSettings *wifiAP3);
|
||||||
|
bool NDS_ApplyFirmwareSettingsWithFile(NDSFirmwareData *outFirmware, const char *inFileName);
|
||||||
|
void NDS_ApplyFirmwareSettingsWithConfig(NDSFirmwareData *outFirmware, const FirmwareConfig &inConfig);
|
||||||
|
void NDS_InitDefaultFirmware(NDSFirmwareData *outFirmware);
|
||||||
|
bool NDS_ReadFirmwareDataFromFile(const char *fileName, NDSFirmwareData *outFirmware, size_t *outFileSize, int *outConsoleType, u8 *outMACAddr);
|
||||||
|
|
||||||
struct fw_memory_chip
|
struct fw_memory_chip
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* main.c - this file is part of DeSmuME
|
/* main.c - this file is part of DeSmuME
|
||||||
*
|
*
|
||||||
* Copyright (C) 2006-2017 DeSmuME Team
|
* Copyright (C) 2006-2019 DeSmuME Team
|
||||||
* Copyright (C) 2007 Pascal Giard (evilynux)
|
* Copyright (C) 2007 Pascal Giard (evilynux)
|
||||||
*
|
*
|
||||||
* This file is free software; you can redistribute it and/or modify
|
* This file is free software; you can redistribute it and/or modify
|
||||||
|
@ -500,14 +500,8 @@ int main(int argc, char ** argv) {
|
||||||
/* this holds some info about our display */
|
/* this holds some info about our display */
|
||||||
const SDL_VideoInfo *videoInfo;
|
const SDL_VideoInfo *videoInfo;
|
||||||
|
|
||||||
/* the firmware settings */
|
|
||||||
FirmwareConfig fw_config;
|
|
||||||
|
|
||||||
NDS_Init();
|
NDS_Init();
|
||||||
|
|
||||||
/* default the firmware settings, they may get changed later */
|
|
||||||
NDS_GetDefaultFirmwareConfig(fw_config);
|
|
||||||
|
|
||||||
init_config( &my_config);
|
init_config( &my_config);
|
||||||
|
|
||||||
if ( !fill_config( &my_config, argc, argv)) {
|
if ( !fill_config( &my_config, argc, argv)) {
|
||||||
|
@ -516,7 +510,7 @@ int main(int argc, char ** argv) {
|
||||||
|
|
||||||
/* use any language set on the command line */
|
/* use any language set on the command line */
|
||||||
if ( my_config.firmware_language != -1) {
|
if ( my_config.firmware_language != -1) {
|
||||||
fw_config.language = my_config.firmware_language;
|
CommonSettings.fwConfig.language = my_config.firmware_language;
|
||||||
}
|
}
|
||||||
|
|
||||||
my_config.process_addonCommands();
|
my_config.process_addonCommands();
|
||||||
|
@ -620,9 +614,6 @@ int main(int argc, char ** argv) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Create the dummy firmware */
|
|
||||||
NDS_InitFirmwareWithConfig(fw_config);
|
|
||||||
|
|
||||||
if ( !my_config.disable_sound) {
|
if ( !my_config.disable_sound) {
|
||||||
SPU_ChangeSoundCore(SNDCORE_SDL, 735 * 4);
|
SPU_ChangeSoundCore(SNDCORE_SDL, 735 * 4);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* main.c - this file is part of DeSmuME
|
/* main.c - this file is part of DeSmuME
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007-2015 DeSmuME Team
|
* Copyright (C) 2007-2019 DeSmuME Team
|
||||||
* Copyright (C) 2007 Damien Nozay (damdoum)
|
* Copyright (C) 2007 Damien Nozay (damdoum)
|
||||||
* Copyright (C) 2007 Pascal Giard (evilynux)
|
* Copyright (C) 2007 Pascal Giard (evilynux)
|
||||||
* Author: damdoum at users.sourceforge.net
|
* Author: damdoum at users.sourceforge.net
|
||||||
|
@ -353,17 +353,12 @@ joinThread_gdb( void *thread_handle) {
|
||||||
|
|
||||||
static int
|
static int
|
||||||
common_gtk_glade_main( struct configured_features *my_config) {
|
common_gtk_glade_main( struct configured_features *my_config) {
|
||||||
/* the firmware settings */
|
|
||||||
FirmwareConfig fw_config;
|
|
||||||
gchar *uifile;
|
gchar *uifile;
|
||||||
GKeyFile *keyfile;
|
GKeyFile *keyfile;
|
||||||
|
|
||||||
/* default the firmware settings, they may get changed later */
|
|
||||||
NDS_GetDefaultFirmwareConfig(fw_config);
|
|
||||||
|
|
||||||
/* use any language set on the command line */
|
/* use any language set on the command line */
|
||||||
if ( my_config->firmware_language != -1) {
|
if ( my_config->firmware_language != -1) {
|
||||||
fw_config.language = my_config->firmware_language;
|
CommonSettings.fwConfig.language = my_config->firmware_language;
|
||||||
}
|
}
|
||||||
desmume_savetype(my_config->savetype);
|
desmume_savetype(my_config->savetype);
|
||||||
|
|
||||||
|
@ -383,9 +378,6 @@ common_gtk_glade_main( struct configured_features *my_config) {
|
||||||
|
|
||||||
desmume_init();
|
desmume_init();
|
||||||
|
|
||||||
/* Create the dummy firmware */
|
|
||||||
NDS_InitFirmwareWithConfig(fw_config);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Activate the GDB stubs
|
* Activate the GDB stubs
|
||||||
* This has to come after the NDS_Init (called in desmume_init)
|
* This has to come after the NDS_Init (called in desmume_init)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
Copyright (C) 2007 Pascal Giard (evilynux)
|
Copyright (C) 2007 Pascal Giard (evilynux)
|
||||||
Copyright (C) 2006-2018 DeSmuME team
|
Copyright (C) 2006-2019 DeSmuME team
|
||||||
|
|
||||||
This file is free software: you can redistribute it and/or modify
|
This file is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -3018,18 +3018,11 @@ common_gtk_main( class configured_features *my_config)
|
||||||
GtkWidget *pMenuBar;
|
GtkWidget *pMenuBar;
|
||||||
GtkWidget *pToolBar;
|
GtkWidget *pToolBar;
|
||||||
|
|
||||||
/* the firmware settings */
|
|
||||||
FirmwareConfig fw_config;
|
|
||||||
|
|
||||||
/* default the firmware settings, they may get changed later */
|
|
||||||
NDS_GetDefaultFirmwareConfig(fw_config);
|
|
||||||
|
|
||||||
/* use any language set on the command line */
|
/* use any language set on the command line */
|
||||||
if ( my_config->firmware_language != -1) {
|
if ( my_config->firmware_language != -1) {
|
||||||
fw_config.language = my_config->firmware_language;
|
CommonSettings.fwConfig.language = my_config->firmware_language;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//------------------addons----------
|
//------------------addons----------
|
||||||
my_config->process_addonCommands();
|
my_config->process_addonCommands();
|
||||||
|
|
||||||
|
@ -3143,9 +3136,6 @@ common_gtk_main( class configured_features *my_config)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Create the dummy firmware */
|
|
||||||
NDS_InitFirmwareWithConfig(fw_config);
|
|
||||||
|
|
||||||
/* Initialize joysticks */
|
/* Initialize joysticks */
|
||||||
if(!init_joy()) return 1;
|
if(!init_joy()) return 1;
|
||||||
|
|
||||||
|
|
|
@ -2424,9 +2424,6 @@ int _main()
|
||||||
|
|
||||||
video.setfilter(GetPrivateProfileInt("Video", "Filter", video.NONE, IniName));
|
video.setfilter(GetPrivateProfileInt("Video", "Filter", video.NONE, IniName));
|
||||||
FilterUpdate(MainWindow->getHWnd(),false);
|
FilterUpdate(MainWindow->getHWnd(),false);
|
||||||
|
|
||||||
//default the firmware settings, they may get changed later
|
|
||||||
NDS_GetDefaultFirmwareConfig(CommonSettings.fwConfig);
|
|
||||||
|
|
||||||
// Generate the unique MAC address.
|
// Generate the unique MAC address.
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright 2008-2018 DeSmuME team
|
Copyright 2008-2019 DeSmuME team
|
||||||
|
|
||||||
This file is free software: you can redistribute it and/or modify
|
This file is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -630,7 +630,8 @@ static void LoadSettingsFromMovie(MovieData movieData)
|
||||||
CommonSettings.fwConfig.language = movieData.firmLanguage;
|
CommonSettings.fwConfig.language = movieData.firmLanguage;
|
||||||
|
|
||||||
// reset firmware (some games can write to it)
|
// reset firmware (some games can write to it)
|
||||||
NDS_InitFirmwareWithConfig(CommonSettings.fwConfig);
|
NDS_InitDefaultFirmware(&MMU.fw.data);
|
||||||
|
NDS_ApplyFirmwareSettingsWithConfig(&MMU.fw.data, CommonSettings.fwConfig);
|
||||||
}
|
}
|
||||||
if (movieData.advancedTiming != -1)
|
if (movieData.advancedTiming != -1)
|
||||||
CommonSettings.advanced_timing = movieData.advancedTiming;
|
CommonSettings.advanced_timing = movieData.advancedTiming;
|
||||||
|
@ -822,10 +823,10 @@ void FCEUI_SaveMovie(const char *fname, std::wstring author, START_FROM startFro
|
||||||
// reset firmware (some games can write to it)
|
// reset firmware (some games can write to it)
|
||||||
if (!CommonSettings.UseExtFirmware)
|
if (!CommonSettings.UseExtFirmware)
|
||||||
{
|
{
|
||||||
NDS_InitFirmwareWithConfig(CommonSettings.fwConfig);
|
NDS_InitDefaultFirmware(&MMU.fw.data);
|
||||||
|
NDS_ApplyFirmwareSettingsWithConfig(&MMU.fw.data, CommonSettings.fwConfig);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (startFrom == START_SAVESTATE)
|
if (startFrom == START_SAVESTATE)
|
||||||
{
|
{
|
||||||
// SS file name should be the same as the movie file name, except for extension
|
// SS file name should be the same as the movie file name, except for extension
|
||||||
|
|
Loading…
Reference in New Issue