Firmware: Standardize how the firmware configuration is set.

- Now, the only two methods for changing any firmware setting is by modifying CommonSettings.fwConfig or by loading an external NDS firmware binary file.
- All methods for changing the firmware MAC address through the WifiHandler class have been removed.
- The FirmwareConfig struct can now handle the WFC User ID.
- Clients can now retrieve the current MAC address and WFC User ID using NDS_GetCurrentWFCUserID(). It is also possible to retrieve the WFC User ID from CommonSettings.fwConfig.
- Setting up the firmware in NDS_Reset() should now be more consistent. However, this does change some of the loading/unpacking order previously set by NDS_FakeBoot(). This will need additional testing.
- Do a whole bunch of code refactoring and cleanup.
This commit is contained in:
rogerman 2018-11-15 00:18:22 -08:00
parent 5d85ac2e23
commit e27cc87bdf
24 changed files with 101459 additions and 103204 deletions

View File

@ -923,7 +923,6 @@ void MMU_Init(void)
mc_init(&MMU.fw, MC_TYPE_FLASH); /* init fw device */
mc_alloc(&MMU.fw, NDS_FW_SIZE_V1);
MMU.fw.fp = NULL;
MMU.fw.isFirmware = true;
rtcInit();
@ -939,9 +938,7 @@ void MMU_Init(void)
void MMU_DeInit(void) {
LOG("MMU deinit\n");
if (MMU.fw.fp)
fclose(MMU.fw.fp);
mc_free(&MMU.fw);
mc_free(&MMU.fw);
slot1_Shutdown();
slot2_Shutdown();
@ -5216,7 +5213,7 @@ void FASTCALL _MMU_ARM7_write08(u32 adr, u8 val)
if (NDS_ARM7.instruct_adr > 0x3FFF) return;
#ifdef HAVE_JIT
// hack for firmware boot in JIT mode
if (CommonSettings.UseExtFirmware && CommonSettings.BootFromFirmware && firmware->loaded() && val == 1)
if (CommonSettings.UseExtFirmware && CommonSettings.BootFromFirmware && extFirmwareObj->loaded() && val == 1)
CommonSettings.jit_max_block_size = saveBlockSizeJIT;
#endif
break;
@ -5324,8 +5321,9 @@ void FASTCALL _MMU_ARM7_write16(u32 adr, u16 val)
if (val != nds.VCount)
{
printf("VCOUNT set to %i (previous value %i)\n", val, nds.VCount);
nds.VCount = val;
}
nds.VCount = val;
}
else
printf("Attempt to set VCOUNT while not within 202-212 (%i), ignored\n", nds.VCount);

View File

@ -88,7 +88,7 @@ static NDSError _lastNDSError;
GameInfo gameInfo;
NDSSystem nds;
CFIRMWARE *firmware = NULL;
CFIRMWARE *extFirmwareObj = NULL;
using std::min;
using std::max;
@ -2387,10 +2387,7 @@ bool NDS_LegitBoot()
//CRAZYMAX: is it safe to accept anything smaller than 12?
CommonSettings.jit_max_block_size = std::min(CommonSettings.jit_max_block_size,12U);
#endif
//partially clobber the loaded firmware with the user settings from DFC
firmware->loadSettings();
//since firmware only boots encrypted roms, we have to make sure it's encrypted first
//this has not been validated on big endian systems. it almost positively doesn't work.
if (gameInfo.header.CRC16 != 0)
@ -2428,19 +2425,6 @@ bool NDS_FakeBoot()
//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);
//EDIT - whats this firmware and how is it relating to the dummy firmware below
//how do these even get used? what is the purpose of unpack and why is it not used by the firmware boot process?
if (CommonSettings.UseExtFirmware && firmware->loaded())
{
firmware->unpack();
firmware->loadSettings();
}
// Create the dummy firmware
//EDIT - whats dummy firmware and how is relating to the above?
//it seems to be emplacing basic firmware data into MMU.fw.data
NDS_InitFirmwareWithConfig(CommonSettings.fwConfig);
//firmware loads the game card arm9 and arm7 programs as specified in rom header
{
@ -2652,28 +2636,57 @@ void NDS_Reset()
PrepareBiosARM7();
PrepareBiosARM9();
if (firmware)
if (extFirmwareObj)
{
delete firmware;
firmware = NULL;
delete extFirmwareObj;
extFirmwareObj = NULL;
}
firmware = new CFIRMWARE();
firmware->load();
bool didLoadExtFirmware = false;
extFirmwareObj = new CFIRMWARE();
if (CommonSettings.UseExtFirmware)
{
didLoadExtFirmware = extFirmwareObj->load(CommonSettings.ExtFirmwarePath);
}
if (didLoadExtFirmware)
{
// what is the purpose of unpack?
extFirmwareObj->unpack();
std::string extFWUserSettingsString = CFIRMWARE::GetUserSettingsFilePath(CommonSettings.ExtFirmwarePath);
strncpy(CommonSettings.ExtFirmwareUserSettingsPath, extFWUserSettingsString.c_str(), MAX_PATH);
//partially clobber the loaded firmware with the user settings from DFC
if (CommonSettings.UseExtFirmwareSettings)
{
extFirmwareObj->loadSettings(CommonSettings.ExtFirmwareUserSettingsPath);
}
}
else
{
NDS_InitFirmwareWithConfig(CommonSettings.fwConfig);
}
//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)
//2. firmware is available
//3. user has requested booting from firmware
bool canBootFromFirmware = (NDS_ARM7.BIOS_loaded && NDS_ARM9.BIOS_loaded && CommonSettings.BootFromFirmware && firmware->loaded());
bool canBootFromFirmware = (NDS_ARM7.BIOS_loaded && NDS_ARM9.BIOS_loaded && CommonSettings.BootFromFirmware && didLoadExtFirmware);
bool bootResult = false;
if(canBootFromFirmware)
if (canBootFromFirmware)
{
bootResult = NDS_LegitBoot();
}
else
{
bootResult = NDS_FakeBoot();
}
// Init calibration info
memcpy(&TSCal, firmware->getTouchCalibrate(), sizeof(TSCalInfo));
memcpy(&TSCal, extFirmwareObj->getTouchCalibrate(), sizeof(TSCalInfo));
GPU->Reset();

View File

@ -73,7 +73,7 @@ extern BOOL click;
#define NDS_FW_LANG_CHI 6
#define NDS_FW_LANG_RES 7
extern CFIRMWARE *firmware;
extern CFIRMWARE *extFirmwareObj;
#define DSGBA_LOADER_SIZE 512
enum
@ -528,13 +528,11 @@ extern struct TCommonSettings
, backupSave(false)
, SPU_sync_mode(1)
, SPU_sync_method(0)
, WifiBridgeDeviceID(0)
{
strcpy(ARM9BIOS, "biosnds9.bin");
strcpy(ARM7BIOS, "biosnds7.bin");
strcpy(Firmware, "firmware.bin");
wifi.mode = WifiCommInterfaceID_Infrastructure;
wifi.infraBridgeAdapter = 0;
strcpy(ExtFirmwarePath, "firmware.bin");
for(int i=0;i<16;i++)
spu_muteChannels[i] = false;
@ -567,14 +565,15 @@ extern struct TCommonSettings
bool loadToMemory;
bool UseExtBIOS;
char ARM9BIOS[256];
char ARM7BIOS[256];
char ARM9BIOS[MAX_PATH];
char ARM7BIOS[MAX_PATH];
bool SWIFromBIOS;
bool PatchSWI3;
bool UseExtFirmware;
bool UseExtFirmwareSettings;
char Firmware[256];
char ExtFirmwarePath[MAX_PATH];
char ExtFirmwareUserSettingsPath[MAX_PATH];
bool BootFromFirmware;
FirmwareConfig fwConfig;
@ -614,10 +613,7 @@ extern struct TCommonSettings
bool use_jit;
u32 jit_max_block_size;
struct _Wifi {
WifiCommInterfaceID mode;
int infraBridgeAdapter;
} wifi;
int WifiBridgeDeviceID;
enum MicMode
{

View File

@ -429,7 +429,7 @@ bool CommandLine::parse(int argc,char **argv)
if(_bios_arm9) { CommonSettings.UseExtBIOS = true; strcpy(CommonSettings.ARM9BIOS,_bios_arm9); }
if(_bios_arm7) { CommonSettings.UseExtBIOS = true; strcpy(CommonSettings.ARM7BIOS,_bios_arm7); }
#ifndef HOST_WINDOWS
if(_fw_path) { CommonSettings.UseExtFirmware = true; CommonSettings.UseExtFirmwareSettings = true; strcpy(CommonSettings.Firmware,_fw_path); }
if(_fw_path) { CommonSettings.UseExtFirmware = true; CommonSettings.UseExtFirmwareSettings = true; strcpy(CommonSettings.ExtFirmwarePath,_fw_path); }
#endif
if(_fw_boot) CommonSettings.BootFromFirmware = true;
if(_bios_swi) CommonSettings.SWIFromBIOS = true;

View File

@ -244,45 +244,38 @@ u32 CFIRMWARE::_decompress(const u8 *in, u8* &out)
return (blockSize);
}
//================================================================================
bool CFIRMWARE::load()
bool CFIRMWARE::load(const char *firmwareFilePath)
{
if (!CommonSettings.UseExtFirmware)
return false;
if (strlen(CommonSettings.Firmware) == 0)
return false;
size_t fileSize = 0;
NDSFirmwareData newFirmwareData;
NDSFirmwareData *newFirmwareData = new NDSFirmwareData;
bool isFirmwareFileRead = NDS_ReadFirmwareDataFromFile(CommonSettings.Firmware, &newFirmwareData, &fileSize, NULL, NULL);
if (!isFirmwareFileRead)
this->_isLoaded = NDS_ReadFirmwareDataFromFile(firmwareFilePath, newFirmwareData, &fileSize, NULL, NULL);
if (!this->_isLoaded)
{
return false;
return this->_isLoaded;
}
this->_header = newFirmwareData.header;
this->_fwFilePath = firmwareFilePath;
this->_header = newFirmwareData->header;
if (MMU.fw.size != fileSize) // reallocate
mc_alloc(&MMU.fw, fileSize);
this->_userDataAddr = LE_TO_LOCAL_16(newFirmwareData.header.userSettingsOffset) * 8;
this->_userDataAddr = LE_TO_LOCAL_16(newFirmwareData->header.userSettingsOffset) * 8;
// fix bad dump of firmware? (wrong DS type)
// fix mario kart touch screen calibration
if ( (newFirmwareData.header.key.unused != 0xFFFF) && (newFirmwareData.header.key.consoleType == NDS_CONSOLE_TYPE_IQUE_LITE) )
if ( (newFirmwareData->header.key.unused != 0xFFFF) && (newFirmwareData->header.key.consoleType == NDS_CONSOLE_TYPE_IQUE_LITE) )
{
newFirmwareData.header.key.consoleType = NDS_CONSOLE_TYPE_FAT;
newFirmwareData.header.key.unused = 0xFFFF;
newFirmwareData->header.key.consoleType = NDS_CONSOLE_TYPE_FAT;
newFirmwareData->header.key.unused = 0xFFFF;
}
memcpy(&MMU.fw.data, &newFirmwareData, fileSize);
memcpy(&MMU.fw.data, newFirmwareData, fileSize);
delete newFirmwareData;
// Generate the path for the external firmware config file.
std::string extFilePath = CFIRMWARE::GetExternalFilePath();
strncpy(MMU.fw.userfile, extFilePath.c_str(), MAX_PATH);
this->_isLoaded = true;
return true;
return this->_isLoaded;
}
bool CFIRMWARE::unpack()
@ -299,8 +292,8 @@ bool CFIRMWARE::unpack()
return false;
}
NDSFirmwareData workingFirmwareData;
memcpy(&workingFirmwareData, &MMU.fw.data, size);
NDSFirmwareData *workingFirmwareData = new NDSFirmwareData;
memcpy(workingFirmwareData, &MMU.fw.data, sizeof(NDSFirmwareData));
shift1 = ((this->_header.shift >> 0) & 0x07);
shift2 = ((this->_header.shift >> 3) & 0x07);
@ -325,9 +318,9 @@ bool CFIRMWARE::unpack()
enc.applyKeycode((u32*)&data[0x18]);
#else
// fix touch coords
workingFirmwareData.header.key.timestamp = 0;
workingFirmwareData.header.key.consoleType = NDS_CONSOLE_TYPE_FAT;
workingFirmwareData.header.key.unused = 0xFFFF;
workingFirmwareData->header.key.timestamp = 0;
workingFirmwareData->header.key.consoleType = NDS_CONSOLE_TYPE_FAT;
workingFirmwareData->header.key.unused = 0xFFFF;
#endif
enc.init(this->_header.identifierValue, 2, 0xC);
@ -337,13 +330,13 @@ bool CFIRMWARE::unpack()
u32 arm9Size = 0;
u32 arm7Size = 0;
arm9Size = this->_decrypt((u8 *)&workingFirmwareData + part1addr, tmp_data9);
arm9Size = this->_decrypt(&workingFirmwareData->_raw[part1addr], tmp_data9);
if (tmp_data9 == NULL)
{
return false;
}
arm7Size = this->_decrypt((u8 *)&workingFirmwareData + part2addr, tmp_data7);
arm7Size = this->_decrypt(&workingFirmwareData->_raw[part2addr], tmp_data7);
if (tmp_data7 == NULL)
{
delete [] tmp_data9;
@ -381,10 +374,10 @@ bool CFIRMWARE::unpack()
delete [] tmp_data9;
tmp_data9 = NULL;
const bool isPatched = (workingFirmwareData._raw[0x17C] != 0xFF);
const bool isPatched = (workingFirmwareData->_raw[0x17C] != 0xFF);
INFO("Firmware:\n");
INFO("- path: %s\n", CommonSettings.Firmware);
INFO("- path: %s\n", this->_fwFilePath.c_str());
INFO("- size: %i bytes (%i Mbit)\n", size, size/1024/8);
INFO("- CRC : 0x%04X\n", this->_header.part12_boot_crc16);
INFO("- header: \n");
@ -404,10 +397,10 @@ bool CFIRMWARE::unpack()
if (isPatched)
{
u32 patch_offset = 0x3FC80;
if (workingFirmwareData._raw[0x17C] > 1)
if (workingFirmwareData->_raw[0x17C] > 1)
patch_offset = 0x3F680;
memcpy(&this->_header, &workingFirmwareData._raw[patch_offset], sizeof(this->_header));
memcpy(&this->_header, &workingFirmwareData->_raw[patch_offset], sizeof(this->_header));
shift1 = ((this->_header.shift >> 0) & 0x07);
shift2 = ((this->_header.shift >> 3) & 0x07);
@ -423,13 +416,13 @@ bool CFIRMWARE::unpack()
ARM9bootAddr = part1ram;
ARM7bootAddr = part2ram;
arm9Size = this->_decompress(&workingFirmwareData._raw[part1addr], tmp_data9);
arm9Size = this->_decompress(&workingFirmwareData->_raw[part1addr], tmp_data9);
if (tmp_data9 == NULL)
{
return false;
}
arm7Size = this->_decompress(&workingFirmwareData._raw[part2addr], tmp_data7);
arm7Size = this->_decompress(&workingFirmwareData->_raw[part2addr], tmp_data7);
if (tmp_data7 == NULL)
{
delete [] tmp_data9;
@ -463,18 +456,20 @@ bool CFIRMWARE::unpack()
INFO(" * ARM7 unpacked size: 0x%08X (%i) bytes\n", arm7Size, arm7Size);
}
memcpy(&MMU.fw.data, &workingFirmwareData, size);
MMU.fw.fp = NULL;
memcpy(&MMU.fw.data, workingFirmwareData, size);
delete workingFirmwareData;
return true;
}
bool CFIRMWARE::loadSettings()
{
if (!CommonSettings.UseExtFirmware) return false;
if (!CommonSettings.UseExtFirmwareSettings) return false;
FILE *fp = fopen(MMU.fw.userfile, "rb");
bool CFIRMWARE::loadSettings(const char *firmwareUserSettingsFilePath)
{
if ( (firmwareUserSettingsFilePath == NULL) || (strlen(firmwareUserSettingsFilePath) == 0) )
{
return false;
}
FILE *fp = fopen(firmwareUserSettingsFilePath, "rb");
if (fp)
{
fseek(fp, 0, SEEK_END);
@ -494,7 +489,7 @@ bool CFIRMWARE::loadSettings()
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", MMU.fw.userfile);
printf("Loaded user settings from %s\n", firmwareUserSettingsFilePath);
}
}
}
@ -503,7 +498,7 @@ bool CFIRMWARE::loadSettings()
}
}
else
printf("Failed loading firmware config from %s (wrong file size)\n", MMU.fw.userfile);
printf("Failed loading firmware config from %s (wrong file size)\n", firmwareUserSettingsFilePath);
fclose(fp);
}
@ -511,10 +506,12 @@ bool CFIRMWARE::loadSettings()
return false;
}
bool CFIRMWARE::saveSettings()
{
if (!CommonSettings.UseExtFirmware) return false;
if (!CommonSettings.UseExtFirmwareSettings) return false;
bool CFIRMWARE::saveSettings(const char *firmwareUserSettingsFilePath)
{
if ( (firmwareUserSettingsFilePath == NULL) || (strlen(firmwareUserSettingsFilePath) == 0) )
{
return false;
}
FWUserSettings &userSettings0 = MMU.fw.data.userSettings0;
FWUserSettings &userSettings1 = MMU.fw.data.userSettings1;
@ -529,7 +526,7 @@ bool CFIRMWARE::saveSettings()
}
printf("Firmware: saving config");
FILE *fp = fopen(MMU.fw.userfile, "wb");
FILE *fp = fopen(firmwareUserSettingsFilePath, "wb");
if (fp)
{
u8 *usr = new u8[DFC_FILE_SIZE];
@ -555,9 +552,9 @@ bool CFIRMWARE::saveSettings()
return true;
}
std::string CFIRMWARE::GetExternalFilePath()
std::string CFIRMWARE::GetUserSettingsFilePath(const char *firmwareFilePath)
{
std::string fwPath = CommonSettings.Firmware;
std::string fwPath = firmwareFilePath;
std::string fwFileName = Path::GetFileNameFromPathWithoutExt(fwPath);
std::string configPath = path.getpath(path.BATTERY);
@ -743,6 +740,13 @@ void NDS_GetDefaultFirmwareConfig(FirmwareConfig &outConfig)
outConfig.MACAddress[4] = 0x34;
outConfig.MACAddress[5] = 0x56;
outConfig.WFCUserID[0] = 0x00;
outConfig.WFCUserID[1] = 0x00;
outConfig.WFCUserID[2] = 0x00;
outConfig.WFCUserID[3] = 0x00;
outConfig.WFCUserID[4] = 0x00;
outConfig.WFCUserID[5] = 0x00;
// default touchscreen calibration
//ANCIENT DESMUME VALUES
@ -772,6 +776,31 @@ void NDS_GetDefaultFirmwareConfig(FirmwareConfig &outConfig)
outConfig.subnetMask_AP3 = 24;
}
void NDS_GetCurrentWFCUserID(u8 *outMAC, u8 *outUserID)
{
const NDSFirmwareData &fw = MMU.fw.data;
if (outMAC != NULL)
{
outMAC[0] = fw.wifiInfo.MACAddr[0];
outMAC[1] = fw.wifiInfo.MACAddr[1];
outMAC[2] = fw.wifiInfo.MACAddr[2];
outMAC[3] = fw.wifiInfo.MACAddr[3];
outMAC[4] = fw.wifiInfo.MACAddr[4];
outMAC[5] = fw.wifiInfo.MACAddr[5];
}
if (outUserID != NULL)
{
outUserID[0] = fw.wifiAP1.wfcUserID[0];
outUserID[1] = fw.wifiAP1.wfcUserID[1];
outUserID[2] = fw.wifiAP1.wfcUserID[2];
outUserID[3] = fw.wifiAP1.wfcUserID[3];
outUserID[4] = fw.wifiAP1.wfcUserID[4];
outUserID[5] = fw.wifiAP1.wfcUserID[5];
}
}
void NDS_InitFirmwareWithConfig(const FirmwareConfig &inConfig)
{
// Create the firmware header
@ -902,6 +931,14 @@ void NDS_InitFirmwareWithConfig(const FirmwareConfig &inConfig)
// Wifi settings CRC16
fw.wifiInfo.crc16 = 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) ||
@ -1009,27 +1046,17 @@ void NDS_InitFirmwareWithConfig(const FirmwareConfig &inConfig)
fw.wifiAP2.crc16 = (u16)calc_CRC16(0, &fw.wifiAP2, 254);
fw.wifiAP3.crc16 = (u16)calc_CRC16(0, &fw.wifiAP3, 254);
memcpy(&CommonSettings.fwConfig, &inConfig, sizeof(FirmwareConfig));
}
void NDS_OverrideFirmwareMAC(const u8 inMAC[6])
{
NDSFirmwareData &fw = MMU.fw.data;
fw.wifiInfo.MACAddr[0] = inMAC[0];
fw.wifiInfo.MACAddr[1] = inMAC[1];
fw.wifiInfo.MACAddr[2] = inMAC[2];
fw.wifiInfo.MACAddr[3] = inMAC[3];
fw.wifiInfo.MACAddr[4] = inMAC[4];
fw.wifiInfo.MACAddr[5] = inMAC[5];
fw.wifiInfo.crc16 = calc_CRC16(0, &fw.wifiInfo.length, fw.wifiInfo.length);
if (&inConfig != &CommonSettings.fwConfig)
{
memcpy(&CommonSettings.fwConfig, &inConfig, sizeof(FirmwareConfig));
}
}
bool NDS_ReadFirmwareDataFromFile(const char *fileName, NDSFirmwareData *outFirmwareData, size_t *outFileSize, int *outConsoleType, u8 *outMACAddr)
{
bool result = false;
if (fileName == NULL)
if ( (fileName == NULL) || (strlen(fileName) == 0) )
{
return result;
}
@ -1156,15 +1183,9 @@ void fw_reset_com(fw_memory_chip *mc)
{
if(mc->com == FW_CMD_PAGEWRITE)
{
if (mc->fp)
if (mc->isFirmware && CommonSettings.UseExtFirmware && CommonSettings.UseExtFirmwareSettings && (extFirmwareObj != NULL))
{
fseek(mc->fp, 0, SEEK_SET);
fwrite(mc->data._raw, mc->size, 1, mc->fp);
}
if (mc->isFirmware && CommonSettings.UseExtFirmware && CommonSettings.UseExtFirmwareSettings && firmware)
{
firmware->saveSettings();
extFirmwareObj->saveSettings(CommonSettings.ExtFirmwareUserSettingsPath);
}
mc->write_enable = FALSE;
}
@ -1196,6 +1217,11 @@ u8 fw_transfer(fw_memory_chip *mc, u8 data)
case FW_CMD_PAGEWRITE:
if(mc->addr < mc->size)
{
if ( (mc->addr >= offsetof(NDSFirmwareData, wifiAP1.wfcUserID[0])) && (mc->addr <= offsetof(NDSFirmwareData, wifiAP1.wfcUserID[5])) )
{
CommonSettings.fwConfig.WFCUserID[mc->addr - offsetof(NDSFirmwareData, wifiAP1.wfcUserID[0])] = data;
}
mc->data._raw[mc->addr] = data; /* write byte */
mc->addr++;
}

View File

@ -61,6 +61,7 @@ struct FirmwareConfig
u8 tscPixel_y2;
u8 MACAddress[6];
u8 WFCUserID[6];
u8 ipv4Address_AP1[4];
u8 ipv4Gateway_AP1[4];
@ -402,8 +403,9 @@ class CFIRMWARE
{
private:
FWHeader _header;
bool _isLoaded;
u32 _userDataAddr;
std::string _fwFilePath;
bool _isLoaded;
u32 _userDataAddr;
u16 _getBootCodeCRC16(const u8 *arm9Data, const u32 arm9Size, const u8 *arm7Data, const u32 arm7Size);
u32 _decrypt(const u8 *in, u8* &out);
@ -412,22 +414,22 @@ private:
public:
CFIRMWARE(): _userDataAddr(0x3FE00), _isLoaded(false) {};
bool load();
bool load(const char *firmwareFilePath);
bool unpack();
bool loadSettings();
bool saveSettings();
static std::string GetExternalFilePath();
bool loadSettings(const char *firmwareUserSettingsFilePath);
bool saveSettings(const char *firmwareUserSettingsFilePath);
bool loaded();
void* getTouchCalibrate();
void* getTouchCalibrate();
static std::string GetUserSettingsFilePath(const char *firmwareFilePath);
};
int copy_firmware_user_data( u8 *dest_buffer, const u8 *fw_data);
void NDS_GetDefaultFirmwareConfig(FirmwareConfig &outConfig);
void NDS_GetCurrentWFCUserID(u8 *outMAC, u8 *outUserID);
void NDS_InitFirmwareWithConfig(const FirmwareConfig &inConfig);
void NDS_OverrideFirmwareMAC(const u8 inMAC[6]);
bool NDS_ReadFirmwareDataFromFile(const char *fileName, NDSFirmwareData *outFirmwareData, size_t *outFileSize, int *outConsoleType, u8 *outMACAddr);
struct fw_memory_chip
@ -444,12 +446,9 @@ struct fw_memory_chip
u32 size; //memory size
BOOL writeable_buffer; //is "data" writeable ?
int type; //type of Memory
char *filename;
FILE *fp;
// needs only for firmware
bool isFirmware;
char userfile[MAX_PATH];
};

View File

@ -72,6 +72,9 @@ ClientExecutionControl::ClientExecutionControl()
_settingsPending.cpuEngineID = CPUEmulationEngineID_Interpreter;
_settingsPending.JITMaxBlockSize = 12;
_settingsPending.slot1DeviceType = NDS_SLOT1_RETAIL_AUTO;
memset(&_settingsPending.fwConfig, 0, sizeof(FirmwareConfig));
_settingsPending.filePathARM9BIOS = std::string();
_settingsPending.filePathARM7BIOS = std::string();
_settingsPending.filePathFirmware = std::string();
@ -352,7 +355,7 @@ void ClientExecutionControl::SetFirmwareImagePath(const char *filePath)
}
else
{
this->_settingsPending.filePathFirmware = std::string(filePath, sizeof(CommonSettings.Firmware));
this->_settingsPending.filePathFirmware = std::string(filePath, sizeof(CommonSettings.ExtFirmwarePath));
}
this->_newSettingsPendingOnReset = true;
@ -493,6 +496,29 @@ void ClientExecutionControl::SetEnableBIOSPatchDelayLoop(bool enable)
pthread_mutex_unlock(&this->_mutexSettingsPendingOnNDSExec);
}
FirmwareConfig ClientExecutionControl::GetFirmwareConfig()
{
pthread_mutex_lock(&this->_mutexSettingsPendingOnReset);
const FirmwareConfig outConfig = this->_settingsPending.fwConfig;
pthread_mutex_unlock(&this->_mutexSettingsPendingOnReset);
return outConfig;
}
FirmwareConfig ClientExecutionControl::GetFirmwareConfigApplied()
{
return this->_settingsApplied.fwConfig;
}
void ClientExecutionControl::SetFirmwareConfig(const FirmwareConfig &inConfig)
{
pthread_mutex_lock(&this->_mutexSettingsPendingOnReset);
this->_settingsPending.fwConfig = inConfig;
this->_newSettingsPendingOnReset = true;
pthread_mutex_unlock(&this->_mutexSettingsPendingOnReset);
}
bool ClientExecutionControl::GetEnableExternalFirmware()
{
pthread_mutex_lock(&this->_mutexSettingsPendingOnReset);
@ -959,6 +985,8 @@ void ClientExecutionControl::ApplySettingsOnReset()
this->_settingsApplied.enableExternalFirmware = this->_settingsPending.enableExternalFirmware;
this->_settingsApplied.enableFirmwareBoot = this->_settingsPending.enableFirmwareBoot;
this->_settingsApplied.fwConfig = this->_settingsPending.fwConfig;
this->_settingsApplied.wifiEmulationMode = this->_settingsPending.wifiEmulationMode;
this->_settingsApplied.wifiBridgeDeviceIndex = this->_settingsPending.wifiBridgeDeviceIndex;
@ -980,10 +1008,10 @@ void ClientExecutionControl::ApplySettingsOnReset()
CommonSettings.jit_max_block_size = this->_settingsApplied.JITMaxBlockSize;
CommonSettings.UseExtBIOS = this->_settingsApplied.enableExternalBIOS;
CommonSettings.UseExtFirmware = this->_settingsApplied.enableExternalFirmware;
//CommonSettings.UseExtFirmwareSettings = this->_settingsApplied.enableExternalFirmware;
CommonSettings.UseExtFirmwareSettings = false;
CommonSettings.UseExtFirmwareSettings = this->_settingsApplied.enableExternalFirmware;
CommonSettings.BootFromFirmware = this->_settingsApplied.enableFirmwareBoot;
CommonSettings.wifi.infraBridgeAdapter = this->_settingsApplied.wifiBridgeDeviceIndex;
CommonSettings.WifiBridgeDeviceID = this->_settingsApplied.wifiBridgeDeviceIndex;
CommonSettings.fwConfig = this->_settingsApplied.fwConfig;
wifiHandler->SetEmulationLevel((WifiEmulationLevel)this->_settingsApplied.wifiEmulationMode);
wifiHandler->SetBridgeDeviceIndex(this->_settingsApplied.wifiBridgeDeviceIndex);
@ -1008,11 +1036,11 @@ void ClientExecutionControl::ApplySettingsOnReset()
if (this->_settingsApplied.filePathFirmware.length() == 0)
{
memset(CommonSettings.Firmware, 0, sizeof(CommonSettings.Firmware));
memset(CommonSettings.ExtFirmwarePath, 0, sizeof(CommonSettings.ExtFirmwarePath));
}
else
{
strlcpy(CommonSettings.Firmware, this->_settingsApplied.filePathFirmware.c_str(), sizeof(CommonSettings.Firmware));
strlcpy(CommonSettings.ExtFirmwarePath, this->_settingsApplied.filePathFirmware.c_str(), sizeof(CommonSettings.ExtFirmwarePath));
}
if (this->_settingsApplied.filePathSlot1R4.length() > 0)

View File

@ -81,6 +81,8 @@ struct ClientExecutionControlSettings
std::string filePathFirmware;
std::string filePathSlot1R4;
FirmwareConfig fwConfig;
std::string cpuEmulationEngineName;
std::string slot1DeviceName;
@ -292,6 +294,10 @@ public:
bool GetEnableBIOSPatchDelayLoop();
void SetEnableBIOSPatchDelayLoop(bool enable);
FirmwareConfig GetFirmwareConfig();
FirmwareConfig GetFirmwareConfigApplied();
void SetFirmwareConfig(const FirmwareConfig &inConfig);
bool GetEnableExternalFirmware();
void SetEnableExternalFirmware(bool enable);

View File

@ -80,8 +80,14 @@
<true/>
<key>EmulationSlot1_DeviceType</key>
<integer>1</integer>
<key>FirmwareConfig_MACAddress</key>
<key>FirmwareConfig_AddressSelection</key>
<integer>0</integer>
<key>FirmwareConfig_FirmwareMACAddress</key>
<integer>0</integer>
<key>FirmwareConfig_CustomMACAddress</key>
<integer>0</integer>
<key>FirmwareConfig_WFCUserID</key>
<dict/>
<key>FirmwareConfig_IPv4Address_AP1_1</key>
<integer>0</integer>
<key>FirmwareConfig_IPv4Address_AP1_2</key>
@ -934,13 +940,9 @@
<integer>1</integer>
<key>Wifi_EmulationMode</key>
<integer>0</integer>
<key>Wifi_AddressSelection</key>
<integer>0</integer>
<key>Wifi_BridgeDeviceSelectionIndex</key>
<integer>0</integer>
<key>Wifi_BridgeDeviceSelectionName</key>
<string></string>
<key>Wifi_MyMACAddress</key>
<integer>0</integer>
</dict>
</plist>

View File

@ -749,7 +749,7 @@ volatile bool execute = true;
}
else
{
[self setFirmwareMACAddressSelectionString:[NSString stringWithFormat:@"Firmware %@", [[self cdsFirmware] MACAddressString]]];
[self setFirmwareMACAddressSelectionString:[NSString stringWithFormat:@"Firmware %@", [[self cdsFirmware] firmwareMACAddressString]]];
}
}
@ -775,7 +775,7 @@ volatile bool execute = true;
- (void) generateFirmwareMACAddress
{
[[self cdsFirmware] generateRandomMACAddress];
[[self cdsFirmware] generateRandomFirmwareMACAddress];
[self updateFirmwareMACAddressString];
}
@ -854,6 +854,12 @@ volatile bool execute = true;
{
[self setCoreState:ExecutionBehavior_Pause];
if (![self emuFlagUseExternalFirmware])
{
[[self cdsFirmware] writeUserDefaultWFCUserID];
[[self cdsFirmware] updateFirmwareConfigSessionValues];
}
pthread_mutex_lock(&threadParam.mutexThreadExecute);
execControl->ApplySettingsOnReset();
NDS_Reset();

View File

@ -19,8 +19,30 @@
#import <Cocoa/Cocoa.h>
#include <pthread.h>
class ClientExecutionControl;
class FirmwareConfigInterface;
struct FirmwareConfig;
enum FirmwareCfgAPID
{
FirmwareCfgAPID_AP1 = 0,
FirmwareCfgAPID_AP2 = 1,
FirmwareCfgAPID_AP3 = 2
};
enum FirmwareCfgMACAddrSetID
{
FirmwareCfgMACAddrSetID_Firmware = 0,
FirmwareCfgMACAddrSetID_Custom1 = 1,
FirmwareCfgMACAddrSetID_Custom2 = 2,
FirmwareCfgMACAddrSetID_Custom3 = 3,
FirmwareCfgMACAddrSetID_Custom4 = 4,
FirmwareCfgMACAddrSetID_Custom5 = 5,
FirmwareCfgMACAddrSetID_Custom6 = 6,
FirmwareCfgMACAddrSetID_Custom7 = 7,
FirmwareCfgMACAddrSetID_Custom8 = 8
};
/********************************************************************************************
CocoaDSFirmware - OBJECTIVE-C CLASS
@ -31,89 +53,200 @@ struct FirmwareConfig;
********************************************************************************************/
@interface CocoaDSFirmware : NSObject
{
FirmwareConfig *_internalData;
ClientExecutionControl *execControl;
FirmwareConfigInterface *_fwConfigInterface;
FirmwareConfig *_appliedFWConfig;
NSUInteger _birth_year;
NSString *MACAddressString;
NSString *firmwareMACAddressString;
NSString *firmwareMACAddressPendingString;
NSString *customMACAddress1String;
NSString *customMACAddress2String;
NSString *customMACAddress3String;
NSString *customMACAddress4String;
NSString *subnetMaskString_AP1;
NSString *subnetMaskString_AP2;
NSString *subnetMaskString_AP3;
pthread_mutex_t mutex;
}
@property (assign, nonatomic) ClientExecutionControl *execControl;
// WiFi Info
@property (assign) uint32_t MACAddressValue;
@property (retain) NSString *MACAddressString;
@property (assign, nonatomic) NSInteger addressSelection;
@property (assign, nonatomic) uint32_t firmwareMACAddressPendingValue;
@property (readonly, nonatomic) uint32_t firmwareMACAddressValue;
@property (retain) NSString *firmwareMACAddressPendingString;
@property (retain) NSString *firmwareMACAddressString;
@property (assign, nonatomic) uint32_t customMACAddressValue;
@property (retain) NSString *customMACAddress1String;
@property (retain) NSString *customMACAddress2String;
@property (retain) NSString *customMACAddress3String;
@property (retain) NSString *customMACAddress4String;
// Access Point Settings
@property (assign) NSInteger ipv4Address_AP1_1;
@property (assign) NSInteger ipv4Address_AP1_2;
@property (assign) NSInteger ipv4Address_AP1_3;
@property (assign) NSInteger ipv4Address_AP1_4;
@property (assign) NSInteger ipv4Gateway_AP1_1;
@property (assign) NSInteger ipv4Gateway_AP1_2;
@property (assign) NSInteger ipv4Gateway_AP1_3;
@property (assign) NSInteger ipv4Gateway_AP1_4;
@property (assign) NSInteger ipv4PrimaryDNS_AP1_1;
@property (assign) NSInteger ipv4PrimaryDNS_AP1_2;
@property (assign) NSInteger ipv4PrimaryDNS_AP1_3;
@property (assign) NSInteger ipv4PrimaryDNS_AP1_4;
@property (assign) NSInteger ipv4SecondaryDNS_AP1_1;
@property (assign) NSInteger ipv4SecondaryDNS_AP1_2;
@property (assign) NSInteger ipv4SecondaryDNS_AP1_3;
@property (assign) NSInteger ipv4SecondaryDNS_AP1_4;
@property (assign) NSInteger subnetMask_AP1;
@property (assign, nonatomic) NSInteger ipv4Address_AP1_1;
@property (assign, nonatomic) NSInteger ipv4Address_AP1_2;
@property (assign, nonatomic) NSInteger ipv4Address_AP1_3;
@property (assign, nonatomic) NSInteger ipv4Address_AP1_4;
@property (assign, nonatomic) NSInteger ipv4Gateway_AP1_1;
@property (assign, nonatomic) NSInteger ipv4Gateway_AP1_2;
@property (assign, nonatomic) NSInteger ipv4Gateway_AP1_3;
@property (assign, nonatomic) NSInteger ipv4Gateway_AP1_4;
@property (assign, nonatomic) NSInteger ipv4PrimaryDNS_AP1_1;
@property (assign, nonatomic) NSInteger ipv4PrimaryDNS_AP1_2;
@property (assign, nonatomic) NSInteger ipv4PrimaryDNS_AP1_3;
@property (assign, nonatomic) NSInteger ipv4PrimaryDNS_AP1_4;
@property (assign, nonatomic) NSInteger ipv4SecondaryDNS_AP1_1;
@property (assign, nonatomic) NSInteger ipv4SecondaryDNS_AP1_2;
@property (assign, nonatomic) NSInteger ipv4SecondaryDNS_AP1_3;
@property (assign, nonatomic) NSInteger ipv4SecondaryDNS_AP1_4;
@property (assign, nonatomic) NSInteger subnetMask_AP1;
@property (retain) NSString *subnetMaskString_AP1;
@property (assign) NSInteger ipv4Address_AP2_1;
@property (assign) NSInteger ipv4Address_AP2_2;
@property (assign) NSInteger ipv4Address_AP2_3;
@property (assign) NSInteger ipv4Address_AP2_4;
@property (assign) NSInteger ipv4Gateway_AP2_1;
@property (assign) NSInteger ipv4Gateway_AP2_2;
@property (assign) NSInteger ipv4Gateway_AP2_3;
@property (assign) NSInteger ipv4Gateway_AP2_4;
@property (assign) NSInteger ipv4PrimaryDNS_AP2_1;
@property (assign) NSInteger ipv4PrimaryDNS_AP2_2;
@property (assign) NSInteger ipv4PrimaryDNS_AP2_3;
@property (assign) NSInteger ipv4PrimaryDNS_AP2_4;
@property (assign) NSInteger ipv4SecondaryDNS_AP2_1;
@property (assign) NSInteger ipv4SecondaryDNS_AP2_2;
@property (assign) NSInteger ipv4SecondaryDNS_AP2_3;
@property (assign) NSInteger ipv4SecondaryDNS_AP2_4;
@property (assign) NSInteger subnetMask_AP2;
@property (assign, nonatomic) NSInteger ipv4Address_AP2_1;
@property (assign, nonatomic) NSInteger ipv4Address_AP2_2;
@property (assign, nonatomic) NSInteger ipv4Address_AP2_3;
@property (assign, nonatomic) NSInteger ipv4Address_AP2_4;
@property (assign, nonatomic) NSInteger ipv4Gateway_AP2_1;
@property (assign, nonatomic) NSInteger ipv4Gateway_AP2_2;
@property (assign, nonatomic) NSInteger ipv4Gateway_AP2_3;
@property (assign, nonatomic) NSInteger ipv4Gateway_AP2_4;
@property (assign, nonatomic) NSInteger ipv4PrimaryDNS_AP2_1;
@property (assign, nonatomic) NSInteger ipv4PrimaryDNS_AP2_2;
@property (assign, nonatomic) NSInteger ipv4PrimaryDNS_AP2_3;
@property (assign, nonatomic) NSInteger ipv4PrimaryDNS_AP2_4;
@property (assign, nonatomic) NSInteger ipv4SecondaryDNS_AP2_1;
@property (assign, nonatomic) NSInteger ipv4SecondaryDNS_AP2_2;
@property (assign, nonatomic) NSInteger ipv4SecondaryDNS_AP2_3;
@property (assign, nonatomic) NSInteger ipv4SecondaryDNS_AP2_4;
@property (assign, nonatomic) NSInteger subnetMask_AP2;
@property (retain) NSString *subnetMaskString_AP2;
@property (assign) NSInteger ipv4Address_AP3_1;
@property (assign) NSInteger ipv4Address_AP3_2;
@property (assign) NSInteger ipv4Address_AP3_3;
@property (assign) NSInteger ipv4Address_AP3_4;
@property (assign) NSInteger ipv4Gateway_AP3_1;
@property (assign) NSInteger ipv4Gateway_AP3_2;
@property (assign) NSInteger ipv4Gateway_AP3_3;
@property (assign) NSInteger ipv4Gateway_AP3_4;
@property (assign) NSInteger ipv4PrimaryDNS_AP3_1;
@property (assign) NSInteger ipv4PrimaryDNS_AP3_2;
@property (assign) NSInteger ipv4PrimaryDNS_AP3_3;
@property (assign) NSInteger ipv4PrimaryDNS_AP3_4;
@property (assign) NSInteger ipv4SecondaryDNS_AP3_1;
@property (assign) NSInteger ipv4SecondaryDNS_AP3_2;
@property (assign) NSInteger ipv4SecondaryDNS_AP3_3;
@property (assign) NSInteger ipv4SecondaryDNS_AP3_4;
@property (assign) NSInteger subnetMask_AP3;
@property (assign, nonatomic) NSInteger ipv4Address_AP3_1;
@property (assign, nonatomic) NSInteger ipv4Address_AP3_2;
@property (assign, nonatomic) NSInteger ipv4Address_AP3_3;
@property (assign, nonatomic) NSInteger ipv4Address_AP3_4;
@property (assign, nonatomic) NSInteger ipv4Gateway_AP3_1;
@property (assign, nonatomic) NSInteger ipv4Gateway_AP3_2;
@property (assign, nonatomic) NSInteger ipv4Gateway_AP3_3;
@property (assign, nonatomic) NSInteger ipv4Gateway_AP3_4;
@property (assign, nonatomic) NSInteger ipv4PrimaryDNS_AP3_1;
@property (assign, nonatomic) NSInteger ipv4PrimaryDNS_AP3_2;
@property (assign, nonatomic) NSInteger ipv4PrimaryDNS_AP3_3;
@property (assign, nonatomic) NSInteger ipv4PrimaryDNS_AP3_4;
@property (assign, nonatomic) NSInteger ipv4SecondaryDNS_AP3_1;
@property (assign, nonatomic) NSInteger ipv4SecondaryDNS_AP3_2;
@property (assign, nonatomic) NSInteger ipv4SecondaryDNS_AP3_3;
@property (assign, nonatomic) NSInteger ipv4SecondaryDNS_AP3_4;
@property (assign, nonatomic) NSInteger subnetMask_AP3;
@property (retain) NSString *subnetMaskString_AP3;
// User Settings
@property (assign) NSInteger consoleType;
@property (copy) NSString *nickname;
@property (copy) NSString *message;
@property (assign) NSInteger favoriteColor;
@property (assign) NSDate *birthday;
@property (assign) NSInteger language;
@property (assign) NSInteger backlightLevel;
@property (assign, nonatomic) NSInteger consoleType;
@property (copy, nonatomic) NSString *nickname;
@property (copy, nonatomic) NSString *message;
@property (assign, nonatomic) NSInteger favoriteColor;
@property (assign, nonatomic) NSDate *birthday;
@property (assign, nonatomic) NSInteger language;
@property (assign, nonatomic) NSInteger backlightLevel;
- (void) update;
- (uint32_t) generateRandomMACAddress;
- (void) applySettings;
- (void) updateFirmwareConfigSessionValues;
- (uint32_t) generateRandomFirmwareMACAddress;
- (uint32_t) generateRandomCustomMACAddress;
- (void) writeUserDefaultWFCUserID;
@end
class FirmwareConfigInterface
{
protected:
FirmwareConfig *_internalData;
FirmwareCfgMACAddrSetID _macAddressSelection;
uint32_t _firmwareMACAddressValue;
uint32_t _customMACAddressValue;
char _macAddressString[(1 + 8) * 18];
char _wfcUserIDString[20];
char _subnetMaskString[3 * 16];
public:
FirmwareConfigInterface();
~FirmwareConfigInterface();
static void WriteMACAddressStringToBuffer(const uint8_t mac4, const uint8_t mac5, const uint8_t mac6, char *stringBuffer);
static void WriteMACAddressStringToBuffer(const uint32_t macAddressValue, char *stringBuffer);
static void WriteWFCUserIDStringToBuffer(const uint64_t wfcUserIDValue, char *stringBuffer);
const FirmwareConfig& GetFirmwareConfig();
uint32_t GenerateRandomMACValue();
FirmwareCfgMACAddrSetID GetMACAddressSelection();
void SetMACAddressSelection(FirmwareCfgMACAddrSetID addressSetID);
uint32_t GetMACAddressValue(FirmwareCfgMACAddrSetID addressSetID);
const char* GetMACAddressString(FirmwareCfgMACAddrSetID addressSetID);
uint32_t GetSelectedMACAddressValue();
uint64_t GetSelectedWFCUserID64();
const char* GetSelectedMACAddressString();
void SetFirmwareMACAddressValue(uint32_t macAddressValue);
void SetFirmwareMACAddressValue(uint8_t mac4, uint8_t mac5, uint8_t mac6);
void SetCustomMACAddressValue(uint32_t macAddressValue);
void SetCustomMACAddressValue(uint8_t mac4, uint8_t mac5, uint8_t mac6);
uint8_t* GetWFCUserID();
void SetWFCUserID(uint8_t *wfcUserID);
uint64_t GetWFCUserID64();
void SetWFCUserID64(uint64_t wfcUserIDValue);
const char* GetWFCUserIDString();
uint8_t GetIPv4AddressPart(FirmwareCfgAPID apid, uint8_t addrPart);
void SetIPv4AddressPart(FirmwareCfgAPID apid, uint8_t addrPart, uint8_t addrValue);
uint8_t GetIPv4GatewayPart(FirmwareCfgAPID apid, uint8_t addrPart);
void SetIPv4GatewayPart(FirmwareCfgAPID apid, uint8_t addrPart, uint8_t addrValue);
uint8_t GetIPv4PrimaryDNSPart(FirmwareCfgAPID apid, uint8_t addrPart);
void SetIPv4PrimaryDNSPart(FirmwareCfgAPID apid, uint8_t addrPart, uint8_t addrValue);
uint8_t GetIPv4SecondaryDNSPart(FirmwareCfgAPID apid, uint8_t addrPart);
void SetIPv4SecondaryDNSPart(FirmwareCfgAPID apid, uint8_t addrPart, uint8_t addrValue);
uint8_t GetSubnetMask(FirmwareCfgAPID apid);
const char* GetSubnetMaskString(FirmwareCfgAPID apid);
void SetSubnetMask(FirmwareCfgAPID apid, uint8_t subnetMaskShift);
int GetConsoleType();
void SetConsoleType(int type);
uint16_t* GetNicknameStringBuffer();
void SetNicknameWithStringBuffer(uint16_t *buffer, size_t charLength);
size_t GetNicknameStringLength();
void SetNicknameStringLength(size_t charLength);
uint16_t* GetMessageStringBuffer();
void SetMessageWithStringBuffer(uint16_t *buffer, size_t charLength);
size_t GetMessageStringLength();
void SetMessageStringLength(size_t charLength);
int GetFavoriteColorByID();
void SetFavoriteColorByID(int colorID);
int GetBirthdayDay();
void SetBirthdayDay(int day);
int GetBirthdayMonth();
void SetBirthdayMonth(int month);
int GetLanguageByID();
void SetLanguageByID(int languageID);
int GetBacklightLevel();
void SetBacklightLevel(int level);
};

File diff suppressed because it is too large Load Diff

View File

@ -98,7 +98,7 @@ volatile bool execute = true;
// Set up the DS firmware using the internal firmware
cdsFirmware = [[[[CocoaDSFirmware alloc] init] retain] autorelease];
[cdsFirmware update];
[cdsFirmware applySettings];
// Set up the sound core
CommonSettings.spu_advanced = true;

File diff suppressed because it is too large Load Diff

View File

@ -815,7 +815,8 @@
[[(NSControl *)sender window] makeFirstResponder:nil];
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
[[cdsCore cdsFirmware] update];
[[cdsCore cdsFirmware] applySettings];
[cdsCore updateFirmwareMACAddressString];
}
- (IBAction) changeHardwareMicGain:(id)sender
@ -971,6 +972,9 @@
// Force end of editing of any text fields.
[[(NSControl *)sender window] makeFirstResponder:nil];
// Saving the user defaults also applies the current firmware settings.
[writeFirmware applySettings];
[[NSUserDefaults standardUserDefaults] setBool:[cdsCore emuFlagAdvancedBusLevelTiming] forKey:@"Emulation_AdvancedBusLevelTiming"];
[[NSUserDefaults standardUserDefaults] setBool:[cdsCore emuFlagRigorousTiming] forKey:@"Emulation_RigorousTiming"];
[[NSUserDefaults standardUserDefaults] setBool:[cdsCore emuFlagUseGameSpecificHacks] forKey:@"Emulation_UseGameSpecificHacks"];
@ -984,7 +988,8 @@
[[NSUserDefaults standardUserDefaults] setBool:[cdsCore emuFlagEmulateEnsata] forKey:@"Emulation_EmulateEnsata"];
[[NSUserDefaults standardUserDefaults] setBool:[cdsCore emuFlagDebugConsole] forKey:@"Emulation_UseDebugConsole"];
[[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware MACAddressValue] forKey:@"FirmwareConfig_MACAddress"];
[[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware firmwareMACAddressValue] forKey:@"FirmwareConfig_FirmwareMACAddress"];
[[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware customMACAddressValue] forKey:@"FirmwareConfig_CustomMACAddress"];
[[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4Address_AP1_1] forKey:@"FirmwareConfig_IPv4Address_AP1_1"];
[[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4Address_AP1_2] forKey:@"FirmwareConfig_IPv4Address_AP1_2"];
@ -1704,6 +1709,11 @@
[self pauseCore];
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
if (![cdsCore emuFlagUseExternalFirmware])
{
[[cdsCore cdsFirmware] updateFirmwareConfigSessionValues];
}
[cdsCore execControl]->ApplySettingsOnReset();
[cdsCore updateSlot1DeviceStatus];
[self writeDefaultsSlot1Settings:nil];
@ -1855,7 +1865,6 @@
[[windowController window] displayIfNeeded];
}
[cdsCore execControl]->ApplySettingsOnReset();
[cdsCore updateCurrentSessionMACAddressString:YES];
[cdsCore setMasterExecute:YES];
@ -1905,6 +1914,11 @@
}
// Unload the ROM.
if (![cdsCore emuFlagUseExternalFirmware])
{
[[cdsCore cdsFirmware] writeUserDefaultWFCUserID];
}
[[self currentRom] release];
[self setCurrentRom:nil];

View File

@ -25,15 +25,12 @@ class ClientExecutionControl;
@interface WifiSettingsPanelDelegate : NSObject
#endif
{
ClientExecutionControl *execControl;
uint32_t _myMACAddressValue;
NSString *_libpcapDeviceSelectionName;
NSInteger addressSelection;
NSObjectController *firmwarePanelController;
NSPopUpButton *bridgeDevicePopUpButton;
ClientExecutionControl *execControl;
NSString *_libpcapDeviceSelectionName;
NSString *myMACAddress1String;
NSString *myMACAddress2String;
NSString *myMACAddress3String;
@ -42,8 +39,10 @@ class ClientExecutionControl;
@property (assign) ClientExecutionControl *execControl;
@property (assign) IBOutlet NSObjectController *firmwarePanelController;
@property (assign) IBOutlet NSPopUpButton *bridgeDevicePopUpButton;
@property (assign) NSInteger wifiEmulationMode;
@property (assign) NSInteger addressSelection;
@property (assign) NSInteger bridgeDeviceSelection;
@property (assign) NSString *myMACAddress1String;
@ -51,11 +50,8 @@ class ClientExecutionControl;
@property (assign) NSString *myMACAddress3String;
@property (assign) NSString *myMACAddress4String;
@property (readonly) IBOutlet NSPopUpButton *bridgeDevicePopUpButton;
- (void) updateMyMACAddressStringsWithValue:(uint32_t)value;
- (void) updateCustomMACAddressStrings;
- (void) fillLibpcapDeviceMenu;
- (void) generateRandomMyMACAddressSet;
- (IBAction) generateNewAddresses:(id)sender;
- (IBAction) writeDefaultsWifiSettings:(id)sender;
- (void) readUserDefaults;

View File

@ -19,6 +19,7 @@
#include <vector>
#import "WifiSettingsPanel.h"
#import "../cocoa_firmware.h"
#include "../ClientExecutionControl.h"
#include "../../../wifi.h"
#undef BOOL
@ -26,14 +27,14 @@
@implementation WifiSettingsPanelDelegate
@synthesize firmwarePanelController;
@synthesize bridgeDevicePopUpButton;
@synthesize execControl;
@dynamic wifiEmulationMode;
@dynamic addressSelection;
@dynamic bridgeDeviceSelection;
@synthesize bridgeDevicePopUpButton;
@synthesize myMACAddress1String;
@synthesize myMACAddress2String;
@synthesize myMACAddress3String;
@ -49,17 +50,15 @@
execControl = NULL;
_myMACAddressValue = 0x503412BF;
const uint8_t myMAC4 = (_myMACAddressValue >> 8) & 0x000000FF;
const uint8_t myMAC5 = (_myMACAddressValue >> 16) & 0x000000FF;
const uint8_t myMAC6 = (_myMACAddressValue >> 24) & 0x000000F0;
const uint8_t myMAC4 = 0x12;
const uint8_t myMAC5 = 0x34;
const uint8_t myMAC6 = 0x50;
myMACAddress1String = [NSString stringWithFormat:@"My Address #1 00:09:BF:%02X:%02X:%02X", myMAC4, myMAC5, myMAC6 + 1];
myMACAddress2String = [NSString stringWithFormat:@"My Address #2 00:09:BF:%02X:%02X:%02X", myMAC4, myMAC5, myMAC6 + 2];
myMACAddress3String = [NSString stringWithFormat:@"My Address #3 00:09:BF:%02X:%02X:%02X", myMAC4, myMAC5, myMAC6 + 3];
myMACAddress4String = [NSString stringWithFormat:@"My Address #4 00:09:BF:%02X:%02X:%02X", myMAC4, myMAC5, myMAC6 + 4];
addressSelection = 0;
_libpcapDeviceSelectionName = @"";
return self;
@ -85,30 +84,6 @@
return (NSInteger)execControl->GetWifiEmulationMode();
}
- (void) setAddressSelection:(NSInteger)theSelection
{
if (theSelection == 0)
{
wifiHandler->SetFirmwareMACMode(FirmwareMACMode_ReadFromFirmware);
}
else if ( (theSelection >= 1) && (theSelection <= 4) )
{
const uint8_t myMAC4 = (_myMACAddressValue >> 8) & 0x000000FF;
const uint8_t myMAC5 = (_myMACAddressValue >> 16) & 0x000000FF;
const uint8_t myMAC6 = (_myMACAddressValue >> 24) & 0x000000F0;
wifiHandler->SetUserMACValues(myMAC4, myMAC5, myMAC6 + theSelection);
wifiHandler->SetFirmwareMACMode(FirmwareMACMode_Manual);
}
addressSelection = theSelection;
}
- (NSInteger) addressSelection
{
return addressSelection;
}
- (void) setBridgeDeviceSelection:(NSInteger)theSelection
{
_libpcapDeviceSelectionName = [bridgeDevicePopUpButton itemTitleAtIndex:theSelection];
@ -125,16 +100,14 @@
return execControl->GetWifiBridgeDeviceIndex();
}
- (void) updateMyMACAddressStringsWithValue:(uint32_t)value
- (void) updateCustomMACAddressStrings
{
const uint8_t myMAC4 = (value >> 8) & 0x000000FF;
const uint8_t myMAC5 = (value >> 16) & 0x000000FF;
const uint8_t myMAC6 = (value >> 24) & 0x000000F0;
CocoaDSFirmware *cdsFirmware = (CocoaDSFirmware *)[firmwarePanelController content];
[self setMyMACAddress1String:[NSString stringWithFormat:@"My Address #1 00:09:BF:%02X:%02X:%02X", myMAC4, myMAC5, myMAC6 + 1]];
[self setMyMACAddress2String:[NSString stringWithFormat:@"My Address #2 00:09:BF:%02X:%02X:%02X", myMAC4, myMAC5, myMAC6 + 2]];
[self setMyMACAddress3String:[NSString stringWithFormat:@"My Address #3 00:09:BF:%02X:%02X:%02X", myMAC4, myMAC5, myMAC6 + 3]];
[self setMyMACAddress4String:[NSString stringWithFormat:@"My Address #4 00:09:BF:%02X:%02X:%02X", myMAC4, myMAC5, myMAC6 + 4]];
[self setMyMACAddress1String:[NSString stringWithFormat:@"My Address #1 %@", [cdsFirmware customMACAddress1String]]];
[self setMyMACAddress2String:[NSString stringWithFormat:@"My Address #2 %@", [cdsFirmware customMACAddress2String]]];
[self setMyMACAddress3String:[NSString stringWithFormat:@"My Address #3 %@", [cdsFirmware customMACAddress3String]]];
[self setMyMACAddress4String:[NSString stringWithFormat:@"My Address #4 %@", [cdsFirmware customMACAddress4String]]];
}
- (void) fillLibpcapDeviceMenu
@ -157,77 +130,31 @@
NSMenuItem *menuItem = [bridgeDevicePopUpButton itemAtIndex:i];
[menuItem setTag:i];
}
if (deviceCount > 0)
{
[self setAddressSelection:0];
}
}
- (void) generateRandomMyMACAddressSet
{
uint32_t randomMACAddressValue = 0;
do
{
randomMACAddressValue = (uint32_t)random() & 0x00FFFFFF;
} while (randomMACAddressValue == 0);
_myMACAddressValue = (randomMACAddressValue << 8) | 0xBF;
[self updateMyMACAddressStringsWithValue:_myMACAddressValue];
const NSInteger currentAddressSelection = [self addressSelection];
if (currentAddressSelection != 0)
{
[self setAddressSelection:currentAddressSelection];
}
}
- (IBAction) generateNewAddresses:(id)sender
{
[self generateRandomMyMACAddressSet];
CocoaDSFirmware *cdsFirmware = (CocoaDSFirmware *)[firmwarePanelController content];
[cdsFirmware generateRandomCustomMACAddress];
[self updateCustomMACAddressStrings];
}
- (IBAction) writeDefaultsWifiSettings:(id)sender
{
CocoaDSFirmware *cdsFirmware = (CocoaDSFirmware *)[firmwarePanelController content];
[[NSUserDefaults standardUserDefaults] setInteger:[self wifiEmulationMode] forKey:@"Wifi_EmulationMode"];
[[NSUserDefaults standardUserDefaults] setInteger:[self addressSelection] forKey:@"Wifi_AddressSelection"];
[[NSUserDefaults standardUserDefaults] setInteger:[cdsFirmware addressSelection] forKey:@"FirmwareConfig_AddressSelection"];
[[NSUserDefaults standardUserDefaults] setInteger:[self bridgeDeviceSelection] forKey:@"Wifi_BridgeDeviceSelectionIndex"];
[[NSUserDefaults standardUserDefaults] setObject:_libpcapDeviceSelectionName forKey:@"Wifi_BridgeDeviceSelectionName"];
[[NSUserDefaults standardUserDefaults] setInteger:_myMACAddressValue forKey:@"Wifi_MyMACAddress"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
- (void) readUserDefaults
{
BOOL needUserDefaultSynchronize = NO;
// Set the user's MAC address set.
// This needs to happen first since the other properties will have a dependency on this.
uint32_t userDefaultMACAddressValue = 0;
if ([[NSUserDefaults standardUserDefaults] objectForKey:@"Wifi_MyMACAddress"] != nil)
{
userDefaultMACAddressValue = (uint32_t)[[NSUserDefaults standardUserDefaults] integerForKey:@"Wifi_MyMACAddress"];
}
if (userDefaultMACAddressValue == 0)
{
// Generate a new random MAC address set if one does not exist.
do
{
userDefaultMACAddressValue = (uint32_t)random() & 0x00FFFFFF;
} while (userDefaultMACAddressValue == 0);
userDefaultMACAddressValue = ((userDefaultMACAddressValue << 8) | 0xBF);
[[NSUserDefaults standardUserDefaults] setInteger:userDefaultMACAddressValue forKey:@"Wifi_MyMACAddress"];
needUserDefaultSynchronize = YES;
}
_myMACAddressValue = userDefaultMACAddressValue;
[self updateMyMACAddressStringsWithValue:_myMACAddressValue];
CocoaDSFirmware *cdsFirmware = (CocoaDSFirmware *)[firmwarePanelController content];
[self updateCustomMACAddressStrings];
// Set the bridge device selection.
NSInteger userDefaultDeviceIndex = [[NSUserDefaults standardUserDefaults] integerForKey:@"Wifi_BridgeDeviceSelectionIndex"];
@ -255,20 +182,14 @@
[[NSUserDefaults standardUserDefaults] setInteger:userDefaultDeviceIndex forKey:@"Wifi_BridgeDeviceSelectionIndex"];
[[NSUserDefaults standardUserDefaults] setObject:userDefaultDeviceName forKey:@"Wifi_BridgeDeviceSelectionName"];
needUserDefaultSynchronize = YES;
[[NSUserDefaults standardUserDefaults] synchronize];
}
[self setBridgeDeviceSelection:userDefaultDeviceIndex];
// Set the remaining user defaults.
[self setWifiEmulationMode:[[NSUserDefaults standardUserDefaults] integerForKey:@"Wifi_EmulationMode"]];
[self setAddressSelection:[[NSUserDefaults standardUserDefaults] integerForKey:@"Wifi_AddressSelection"]];
// If we wrote to user defaults beforehand, then synchronize the write as the final operation here.
if (needUserDefaultSynchronize)
{
[[NSUserDefaults standardUserDefaults] synchronize];
}
[cdsFirmware setAddressSelection:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_AddressSelection"]];
}
@end

View File

@ -138,8 +138,6 @@
return;
}
srandom(time(NULL));
[CocoaDSFile setupAllFilePaths];
// On macOS v10.13 and later, some unwanted menu items will show up in the View menu.
@ -434,6 +432,37 @@
PreferencesWindowDelegate *prefWindowDelegate = [prefWindow delegate];
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
// Setup the ARM7 BIOS, ARM9 BIOS, and firmware image paths per user preferences.
NSString *arm7BiosImagePath = [[NSUserDefaults standardUserDefaults] stringForKey:@"BIOS_ARM7ImagePath"];
if (arm7BiosImagePath != nil)
{
[cdsCore setArm7ImageURL:[NSURL fileURLWithPath:arm7BiosImagePath]];
}
else
{
[cdsCore setArm7ImageURL:nil];
}
NSString *arm9BiosImagePath = [[NSUserDefaults standardUserDefaults] stringForKey:@"BIOS_ARM9ImagePath"];
if (arm9BiosImagePath != nil)
{
[cdsCore setArm9ImageURL:[NSURL fileURLWithPath:arm9BiosImagePath]];
}
else
{
[cdsCore setArm9ImageURL:nil];
}
NSString *firmwareImagePath = [[NSUserDefaults standardUserDefaults] stringForKey:@"Emulation_FirmwareImagePath"];
if (firmwareImagePath != nil)
{
[cdsCore setFirmwareImageURL:[NSURL fileURLWithPath:firmwareImagePath]];
}
else
{
[cdsCore setFirmwareImageURL:nil];
}
// Set the emulation flags.
[cdsCore setEmuFlagAdvancedBusLevelTiming:[[NSUserDefaults standardUserDefaults] boolForKey:@"Emulation_AdvancedBusLevelTiming"]];
[cdsCore setEmuFlagRigorousTiming:[[NSUserDefaults standardUserDefaults] boolForKey:@"Emulation_RigorousTiming"]];
@ -468,28 +497,50 @@
// Set up the firmware per user preferences.
CocoaDSFirmware *newFirmware = [[[CocoaDSFirmware alloc] init] autorelease];
BOOL needUserDefaultSynchronize = NO;
uint32_t defaultMACAddress_u32 = 0;
if ([[NSUserDefaults standardUserDefaults] objectForKey:@"FirmwareConfig_MACAddress"] != nil)
[newFirmware setExecControl:[cdsCore execControl]];
if ([[NSUserDefaults standardUserDefaults] objectForKey:@"FirmwareConfig_FirmwareMACAddress"] != nil)
{
defaultMACAddress_u32 = (uint32_t)[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_MACAddress"];
defaultMACAddress_u32 = (uint32_t)[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_FirmwareMACAddress"];
}
if (defaultMACAddress_u32 == 0)
{
// Generate a new random MAC address set if one does not exist.
do
{
defaultMACAddress_u32 = (uint32_t)random() & 0x00FFFFFF;
} while (defaultMACAddress_u32 == 0);
defaultMACAddress_u32 = ((defaultMACAddress_u32 << 8) | 0xBF);
[[NSUserDefaults standardUserDefaults] setInteger:defaultMACAddress_u32 forKey:@"FirmwareConfig_MACAddress"];
defaultMACAddress_u32 = [newFirmware firmwareMACAddressPendingValue];
[[NSUserDefaults standardUserDefaults] setInteger:defaultMACAddress_u32 forKey:@"FirmwareConfig_FirmwareMACAddress"];
needUserDefaultSynchronize = YES;
}
else
{
[newFirmware setFirmwareMACAddressPendingValue:defaultMACAddress_u32];
}
defaultMACAddress_u32 = 0;
if ([[NSUserDefaults standardUserDefaults] objectForKey:@"FirmwareConfig_CustomMACAddress"] != nil)
{
defaultMACAddress_u32 = (uint32_t)[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_CustomMACAddress"];
}
if (defaultMACAddress_u32 == 0)
{
defaultMACAddress_u32 = [newFirmware customMACAddressValue];
[[NSUserDefaults standardUserDefaults] setInteger:defaultMACAddress_u32 forKey:@"FirmwareConfig_CustomMACAddress"];
needUserDefaultSynchronize = YES;
}
else
{
[newFirmware setCustomMACAddressValue:defaultMACAddress_u32];
}
if (needUserDefaultSynchronize)
{
[[NSUserDefaults standardUserDefaults] synchronize];
}
[newFirmware setMACAddressValue:defaultMACAddress_u32];
[wifiSettingsPanelDelegate updateCustomMACAddressStrings];
[newFirmware setIpv4Address_AP1_1:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4Address_AP1_1"]];
[newFirmware setIpv4Address_AP1_2:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4Address_AP1_2"]];
@ -558,40 +609,10 @@
[prefWindowDelegate updateSubnetMaskString_AP2:nil];
[prefWindowDelegate updateSubnetMaskString_AP3:nil];
[newFirmware update];
[newFirmware applySettings];
[cdsCore updateFirmwareMACAddressString];
[emuControl setCdsFirmware:newFirmware];
// Setup the ARM7 BIOS, ARM9 BIOS, and firmware image paths per user preferences.
NSString *arm7BiosImagePath = [[NSUserDefaults standardUserDefaults] stringForKey:@"BIOS_ARM7ImagePath"];
if (arm7BiosImagePath != nil)
{
[cdsCore setArm7ImageURL:[NSURL fileURLWithPath:arm7BiosImagePath]];
}
else
{
[cdsCore setArm7ImageURL:nil];
}
NSString *arm9BiosImagePath = [[NSUserDefaults standardUserDefaults] stringForKey:@"BIOS_ARM9ImagePath"];
if (arm9BiosImagePath != nil)
{
[cdsCore setArm9ImageURL:[NSURL fileURLWithPath:arm9BiosImagePath]];
}
else
{
[cdsCore setArm9ImageURL:nil];
}
NSString *firmwareImagePath = [[NSUserDefaults standardUserDefaults] stringForKey:@"Emulation_FirmwareImagePath"];
if (firmwareImagePath != nil)
{
[cdsCore setFirmwareImageURL:[NSURL fileURLWithPath:firmwareImagePath]];
}
else
{
[cdsCore setFirmwareImageURL:nil];
}
// Set up GDB stub settings per user preferences.
#ifdef GDB_STUB
[cdsCore setEnableGdbStubARM9:[[NSUserDefaults standardUserDefaults] boolForKey:@"Debug_GDBStubEnableARM9"]];

View File

@ -904,7 +904,7 @@
randomMACAddressValue = (randomMACAddressValue << 8) | 0xBF;
[[NSUserDefaults standardUserDefaults] setInteger:randomMACAddressValue forKey:@"FirmwareConfig_MACAddress"];
[[NSUserDefaults standardUserDefaults] setInteger:randomMACAddressValue forKey:@"FirmwareConfig_FirmwareMACAddress"];
[[NSUserDefaults standardUserDefaults] synchronize];
[self updateFirmwareMACAddressString:nil];
@ -912,7 +912,7 @@
- (IBAction) updateFirmwareMACAddressString:(id)sender
{
const uint32_t defaultMACAddressValue = (uint32_t)[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_MACAddress"];
const uint32_t defaultMACAddressValue = (uint32_t)[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_FirmwareMACAddress"];
const uint8_t mac4 = (defaultMACAddressValue >> 8) & 0x000000FF;
const uint8_t mac5 = (defaultMACAddressValue >> 16) & 0x000000FF;
const uint8_t mac6 = (defaultMACAddressValue >> 24) & 0x000000FF;

View File

@ -2445,7 +2445,7 @@ static void SelectFirmwareFile()
case GTK_RESPONSE_OK:
sPath = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection));
CommonSettings.UseExtFirmware = true;
strncpy(CommonSettings.Firmware, (const char*)sPath, g_utf8_strlen(sPath, -1));
strncpy(CommonSettings.ExtFirmwarePath, (const char*)sPath, g_utf8_strlen(sPath, -1));
g_free(sPath);
break;
default:

View File

@ -144,8 +144,6 @@ BOOL CALLBACK FirmConfig_Proc(HWND dialog,UINT komunikat,WPARAM wparam,LPARAM lp
WriteFirmConfig(fwConfig);
EndDialog(dialog,0);
if (CommonSettings.UseExtFirmware == 0)
NDS_InitFirmwareWithConfig(fwConfig);
return 1;
}
else

View File

@ -2234,7 +2234,7 @@ int _main()
Piano.Enabled = (slot2_device_type == NDS_SLOT2_EASYPIANO)?true:false;
Paddle.Enabled = (slot2_device_type == NDS_SLOT2_PADDLE)?true:false;
CommonSettings.wifi.infraBridgeAdapter = GetPrivateProfileInt("Wifi", "BridgeAdapter", 0, IniName);
CommonSettings.WifiBridgeDeviceID = GetPrivateProfileInt("Wifi", "BridgeAdapter", 0, IniName);
osd = new OSDCLASS(-1);
@ -2245,37 +2245,7 @@ int _main()
WinPCapInterface *winpcapInterface = (isPCapSupported) ? new WinPCapInterface : NULL;
wifiHandler->SetPCapInterface(winpcapInterface);
wifiHandler->SetSocketsSupported(isSocketsSupported);
// Generate the unique MAC address for Ad-hoc mode.
{
// Get the host's IP4 address.
char hostname[256];
if (gethostname(hostname, 256) != 0)
strncpy(hostname, "127.0.0.1", 256);
hostent *he = gethostbyname(hostname);
u32 ipaddr;
if (he == NULL || he->h_addr_list[0] == NULL)
ipaddr = 0x0100007F; // 127.0.0.1
else
ipaddr = *(u32 *)he->h_addr_list[0];
u32 hash = (u32)GetCurrentProcessId();
while ((hash & 0xFF000000) == 0)
{
hash <<= 1;
}
hash >>= 1;
hash += ipaddr >> 8;
hash &= 0x00FFFFFF;
wifiHandler->SetUserMACValues(hash >> 16, (hash >> 8) & 0xFF, hash & 0xFF);
wifiHandler->SetFirmwareMACMode(FirmwareMACMode_Manual);
}
wifiHandler->SetBridgeDeviceIndex(CommonSettings.wifi.infraBridgeAdapter);
wifiHandler->SetBridgeDeviceIndex(CommonSettings.WifiBridgeDeviceID);
if (GetPrivateProfileBool("Wifi", "Enabled", false, IniName))
{
@ -2431,7 +2401,7 @@ int _main()
CommonSettings.UseExtFirmware = GetPrivateProfileBool("Firmware", "UseExtFirmware", false, IniName);
CommonSettings.UseExtFirmwareSettings = GetPrivateProfileBool("Firmware", "UseExtFirmwareSettings", false, IniName);
GetPrivateProfileString("Firmware", "FirmwareFile", "firmware.bin", CommonSettings.Firmware, 256, IniName);
GetPrivateProfileString("Firmware", "FirmwareFile", "firmware.bin", CommonSettings.ExtFirmwarePath, 256, IniName);
CommonSettings.BootFromFirmware = GetPrivateProfileBool("Firmware", "BootFromFirmware", false, IniName);
video.setfilter(GetPrivateProfileInt("Video", "Filter", video.NONE, IniName));
@ -2439,6 +2409,40 @@ int _main()
//default the firmware settings, they may get changed later
NDS_GetDefaultFirmwareConfig(CommonSettings.fwConfig);
// Generate the unique MAC address.
{
// Get the host's IP4 address.
char hostname[256];
if (gethostname(hostname, 256) != 0)
strncpy(hostname, "127.0.0.1", 256);
hostent *he = gethostbyname(hostname);
u32 ipaddr;
if (he == NULL || he->h_addr_list[0] == NULL)
ipaddr = 0x0100007F; // 127.0.0.1
else
ipaddr = *(u32 *)he->h_addr_list[0];
u32 hash = (u32)GetCurrentProcessId();
while ((hash & 0xFF000000) == 0)
{
hash <<= 1;
}
hash >>= 1;
hash += ipaddr >> 8;
hash &= 0x00FFFFFF;
CommonSettings.fwConfig.MACAddress[0] = 0x00;
CommonSettings.fwConfig.MACAddress[1] = 0x09;
CommonSettings.fwConfig.MACAddress[2] = 0xBF;
CommonSettings.fwConfig.MACAddress[3] = hash >> 16;
CommonSettings.fwConfig.MACAddress[4] = (hash >> 8) & 0xFF;
CommonSettings.fwConfig.MACAddress[5] = hash & 0xFF;
}
// Read the firmware settings from the init file
CommonSettings.fwConfig.favoriteColor = GetPrivateProfileInt("Firmware","favColor", 10, IniName);
CommonSettings.fwConfig.birthdayMonth = GetPrivateProfileInt("Firmware","bMonth", 7, IniName);
@ -5893,7 +5897,7 @@ LRESULT CALLBACK EmulationSettingsDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, L
}
CheckDlgButton(hDlg, IDC_USEEXTFIRMWARE, ((CommonSettings.UseExtFirmware == true) ? BST_CHECKED : BST_UNCHECKED));
SetDlgItemText(hDlg, IDC_FIRMWARE, CommonSettings.Firmware);
SetDlgItemText(hDlg, IDC_FIRMWARE, CommonSettings.ExtFirmwarePath);
CheckDlgButton(hDlg, IDC_FIRMWAREBOOT, ((CommonSettings.BootFromFirmware == true) ? BST_CHECKED : BST_UNCHECKED));
CheckDlgButton(hDlg, IDC_FIRMWAREEXTUSER, ((CommonSettings.UseExtFirmwareSettings == true) ? BST_CHECKED : BST_UNCHECKED));
@ -5959,7 +5963,7 @@ LRESULT CALLBACK EmulationSettingsDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, L
CommonSettings.UseExtFirmware = IsDlgCheckboxChecked(hDlg, IDC_USEEXTFIRMWARE);
cur = GetDlgItem(hDlg, IDC_FIRMWARE);
GetWindowText(cur, CommonSettings.Firmware, 256);
GetWindowText(cur, CommonSettings.ExtFirmwarePath, 256);
CommonSettings.BootFromFirmware = IsDlgCheckboxChecked(hDlg, IDC_FIRMWAREBOOT);
CommonSettings.UseExtFirmwareSettings = IsDlgCheckboxChecked(hDlg, IDC_FIRMWAREEXTUSER);
@ -5987,7 +5991,7 @@ LRESULT CALLBACK EmulationSettingsDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, L
WritePrivateProfileInt("BIOS", "PatchSWI3", ((CommonSettings.PatchSWI3 == true) ? 1 : 0), IniName);
WritePrivateProfileInt("Firmware", "UseExtFirmware", ((CommonSettings.UseExtFirmware == true) ? 1 : 0), IniName);
WritePrivateProfileString("Firmware", "FirmwareFile", CommonSettings.Firmware, IniName);
WritePrivateProfileString("Firmware", "FirmwareFile", CommonSettings.ExtFirmwarePath, IniName);
WritePrivateProfileInt("Firmware", "BootFromFirmware", ((CommonSettings.BootFromFirmware == true) ? 1 : 0), IniName);
WritePrivateProfileInt("Firmware", "UseExtFirmwareSettings", ((CommonSettings.UseExtFirmwareSettings == true) ? 1 : 0), IniName);
#ifdef HAVE_JIT
@ -6263,7 +6267,7 @@ LRESULT CALLBACK WifiSettingsDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM
{
ComboBox_AddString(deviceMenu, deviceStringList[i].c_str());
}
curSel = CommonSettings.wifi.infraBridgeAdapter;
curSel = CommonSettings.WifiBridgeDeviceID;
enableWin = TRUE;
}
}
@ -6307,9 +6311,9 @@ LRESULT CALLBACK WifiSettingsDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM
#endif
cur = GetDlgItem(hDlg, IDC_BRIDGEADAPTER);
CommonSettings.wifi.infraBridgeAdapter = ComboBox_GetCurSel(cur);
wifiHandler->SetBridgeDeviceIndex(CommonSettings.wifi.infraBridgeAdapter);
WritePrivateProfileInt("Wifi", "BridgeAdapter", CommonSettings.wifi.infraBridgeAdapter, IniName);
CommonSettings.WifiBridgeDeviceID = ComboBox_GetCurSel(cur);
wifiHandler->SetBridgeDeviceIndex(CommonSettings.WifiBridgeDeviceID);
WritePrivateProfileInt("Wifi", "BridgeAdapter", CommonSettings.WifiBridgeDeviceID, IniName);
if(val == IDYES)
{

View File

@ -3651,7 +3651,6 @@ WifiHandler::WifiHandler()
_softAPCommInterface = new SoftAPCommInterface;
_selectedBridgeDeviceIndex = 0;
_firmwareMACMode = FirmwareMACMode_Automatic;
_workingTXBuffer = NULL;
_workingRXAdhocBuffer = NULL;
@ -4485,35 +4484,18 @@ bool WifiHandler::CommStart()
if (isAdhocCommStarted || isInfrastructureCommStarted)
{
switch (this->_firmwareMACMode)
{
case FirmwareMACMode_Automatic:
this->GenerateRandomMAC(FW_Mac);
NDS_OverrideFirmwareMAC(FW_Mac);
break;
case FirmwareMACMode_Manual:
this->CopyMACFromUserValues(FW_Mac);
NDS_OverrideFirmwareMAC(FW_Mac);
break;
case FirmwareMACMode_ReadFromFirmware:
FW_Mac[0] = MMU.fw.data.wifiInfo.MACAddr[0];
FW_Mac[1] = MMU.fw.data.wifiInfo.MACAddr[1];
FW_Mac[2] = MMU.fw.data.wifiInfo.MACAddr[2];
FW_Mac[3] = MMU.fw.data.wifiInfo.MACAddr[3];
FW_Mac[4] = MMU.fw.data.wifiInfo.MACAddr[4];
FW_Mac[5] = MMU.fw.data.wifiInfo.MACAddr[5];
break;
}
FW_Mac[0] = MMU.fw.data.wifiInfo.MACAddr[0];
FW_Mac[1] = MMU.fw.data.wifiInfo.MACAddr[1];
FW_Mac[2] = MMU.fw.data.wifiInfo.MACAddr[2];
FW_Mac[3] = MMU.fw.data.wifiInfo.MACAddr[3];
FW_Mac[4] = MMU.fw.data.wifiInfo.MACAddr[4];
FW_Mac[5] = MMU.fw.data.wifiInfo.MACAddr[5];
// Starting the comm interface was successful.
// Report the MAC address to the user as confirmation.
WIFI_LOG(1, "MAC Address = %02X:%02X:%02X:%02X:%02X:%02X\n",
FW_Mac[0], FW_Mac[1], FW_Mac[2], FW_Mac[3], FW_Mac[4], FW_Mac[5]);
NDS_OverrideFirmwareMAC(FW_Mac);
#ifdef DESMUME_COCOA
this->_rxTaskAdhoc->start(false, 43);
#else
@ -4929,68 +4911,6 @@ void WifiHandler::SetPCapInterface(ClientPCapInterface *pcapInterface)
this->_pcap = (pcapInterface == NULL) ? &dummyPCapInterface : pcapInterface;
}
FirmwareMACMode WifiHandler::GetFirmwareMACMode()
{
return this->_firmwareMACMode;
}
void WifiHandler::SetFirmwareMACMode(FirmwareMACMode macMode)
{
this->_firmwareMACMode = macMode;
}
void WifiHandler::GetUserMACValues(u8 *outValue3, u8 *outValue4, u8 *outValue5)
{
*outValue3 = this->_userMAC[0];
*outValue4 = this->_userMAC[1];
*outValue5 = this->_userMAC[2];
}
void WifiHandler::SetUserMACValues(u8 inValue3, u8 inValue4, u8 inValue5)
{
this->_userMAC[0] = inValue3;
this->_userMAC[1] = inValue4;
this->_userMAC[2] = inValue5;
}
void WifiHandler::GenerateRandomMAC(u8 outMAC[6])
{
if (outMAC == NULL)
{
return;
}
static bool needSetRandomSeed = true;
if (needSetRandomSeed)
{
srand(time(NULL));
needSetRandomSeed = false;
}
const u32 randomValue = (u32)rand();
outMAC[3] = (randomValue >> 0) & 0xFF;
outMAC[4] = (randomValue >> 8) & 0xFF;
outMAC[5] = (randomValue >> 16) & 0xFF;
}
void WifiHandler::CopyMACFromUserValues(u8 outMAC[6])
{
if (outMAC == NULL)
{
return;
}
// The first three MAC values are Nintendo's signature MAC values.
// The last three MAC values are user-defined.
outMAC[0] = 0x00;
outMAC[1] = 0x09;
outMAC[2] = 0xBF;
outMAC[3] = this->_userMAC[0];
outMAC[4] = this->_userMAC[1];
outMAC[5] = this->_userMAC[2];
}
void WifiHandler::PrepareSaveStateWrite()
{
WIFI_IOREG_MAP &io = this->_wifi.io;

View File

@ -824,13 +824,6 @@ enum WifiCommInterfaceID
WifiCommInterfaceID_Infrastructure = 1
};
enum FirmwareMACMode
{
FirmwareMACMode_Automatic = 0,
FirmwareMACMode_Manual = 1,
FirmwareMACMode_ReadFromFirmware = 2
};
typedef u16 IOREG_W_PADDING;
typedef u16 IOREG_W_INTERNAL;
@ -3317,9 +3310,6 @@ protected:
bool _isSocketsSupported;
bool _didWarnWFCUser;
FirmwareMACMode _firmwareMACMode;
u8 _userMAC[3];
u8 *_workingTXBuffer;
u8 *_workingRXAdhocBuffer;
u8 *_workingRXSoftAPBuffer;
@ -3391,15 +3381,6 @@ public:
ClientPCapInterface* GetPCapInterface();
void SetPCapInterface(ClientPCapInterface *pcapInterface);
FirmwareMACMode GetFirmwareMACMode();
void SetFirmwareMACMode(FirmwareMACMode macMode);
void GetUserMACValues(u8 *outValue3, u8 *outValue4, u8 *outValue5);
void SetUserMACValues(u8 inValue3, u8 inValue4, u8 inValue5);
void GenerateRandomMAC(u8 outMAC[6]);
void CopyMACFromUserValues(u8 outMAC[6]);
void PrepareSaveStateWrite();
void ParseSaveStateRead();