From bb3802287308a2348477134921b79531a6b61005 Mon Sep 17 00:00:00 2001 From: rogerman Date: Thu, 25 Oct 2018 01:43:19 -0700 Subject: [PATCH] Firmware: Replace the old NDS_fw_config_data struct with the new FirmwareConfig struct, which allows for easy modification of all the user-related settings, including all the WiFi settings. Also do a massive refactor and cleanup of the firmware-related code. - Also exposes all of the WiFi-related firmware settings in the Cocoa port UI. --- desmume/src/NDSSystem.cpp | 10 +- desmume/src/NDSSystem.h | 38 +- desmume/src/firmware.cpp | 826 ++++++----- desmume/src/firmware.h | 435 +++++- .../src/frontend/cocoa/DefaultUserPrefs.plist | 104 ++ desmume/src/frontend/cocoa/cocoa_core.mm | 12 +- desmume/src/frontend/cocoa/cocoa_firmware.h | 69 +- desmume/src/frontend/cocoa/cocoa_firmware.mm | 1233 ++++++++++++---- .../translations/English.lproj/MainMenu.xib | 1250 +++++++++++++++-- .../userinterface/EmuControllerDelegate.h | 3 + .../userinterface/EmuControllerDelegate.mm | 65 + .../cocoa/userinterface/WifiSettingsPanel.h | 1 - .../cocoa/userinterface/WifiSettingsPanel.mm | 41 +- .../cocoa/userinterface/appDelegate.h | 2 +- .../cocoa/userinterface/appDelegate.mm | 86 +- .../userinterface/preferencesWindowDelegate.h | 16 + .../preferencesWindowDelegate.mm | 85 ++ desmume/src/frontend/posix/cli/main.cpp | 6 +- desmume/src/frontend/posix/gtk-glade/main.cpp | 6 +- desmume/src/frontend/posix/gtk/main.cpp | 6 +- desmume/src/frontend/windows/FirmConfig.cpp | 64 +- desmume/src/frontend/windows/main.cpp | 72 +- desmume/src/movie.cpp | 56 +- desmume/src/saves.cpp | 9 +- desmume/src/wifi.cpp | 11 +- 25 files changed, 3426 insertions(+), 1080 deletions(-) diff --git a/desmume/src/NDSSystem.cpp b/desmume/src/NDSSystem.cpp index b20e89994..861c2c3a7 100755 --- a/desmume/src/NDSSystem.cpp +++ b/desmume/src/NDSSystem.cpp @@ -127,7 +127,7 @@ int NDS_GetCPUCoreCount() void NDS_SetupDefaultFirmware() { - NDS_FillDefaultFirmwareConfigData(&CommonSettings.fw_config); + NDS_GetDefaultFirmwareConfig(CommonSettings.fwConfig); } void NDS_RunAdvansceneAutoImport() @@ -2161,7 +2161,7 @@ static void PrepareBiosARM7() NDS_ARM7.BIOS_loaded = false; memset(MMU.ARM7_BIOS, 0, sizeof(MMU.ARM7_BIOS)); - if(CommonSettings.UseExtBIOS == true) + if(CommonSettings.UseExtBIOS) { //read arm7 bios from inputfile and flag it if it succeeds FILE *arm7inf = fopen(CommonSettings.ARM7BIOS,"rb"); @@ -2219,7 +2219,7 @@ static void PrepareBiosARM9() memset(MMU.ARM9_BIOS, 0, sizeof(MMU.ARM9_BIOS)); NDS_ARM9.BIOS_loaded = false; - if(CommonSettings.UseExtBIOS == true) + if(CommonSettings.UseExtBIOS) { //read arm9 bios from inputfile and flag it if it succeeds FILE* arm9inf = fopen(CommonSettings.ARM9BIOS,"rb"); @@ -2434,7 +2434,7 @@ bool NDS_FakeBoot() // 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_CreateDummyFirmware(&CommonSettings.fw_config); + NDS_InitFirmwareWithConfig(CommonSettings.fwConfig); //firmware loads the game card arm9 and arm7 programs as specified in rom header { @@ -2473,7 +2473,7 @@ bool NDS_FakeBoot() //TBD - this code is really clunky //it seems to be copying the MMU.fw.data data into RAM in the user memory stash locations u8 temp_buffer[NDS_FW_USER_SETTINGS_MEM_BYTE_COUNT]; - if ( copy_firmware_user_data( temp_buffer, MMU.fw.data)) { + if ( copy_firmware_user_data( temp_buffer, MMU.fw.data._raw)) { for ( int fw_index = 0; fw_index < NDS_FW_USER_SETTINGS_MEM_BYTE_COUNT; fw_index++) _MMU_write08(0x027FFC80 + fw_index, temp_buffer[fw_index]); } diff --git a/desmume/src/NDSSystem.h b/desmume/src/NDSSystem.h index f9c8bc55e..39997caef 100755 --- a/desmume/src/NDSSystem.h +++ b/desmume/src/NDSSystem.h @@ -24,6 +24,7 @@ #include "types.h" #include "ROMReader.h" +#include "firmware.h" #include "wifi.h" class CFIRMWARE; @@ -213,7 +214,7 @@ enum NDS_CONSOLE_TYPE NDS_CONSOLE_TYPE_FAT = 0xFF, NDS_CONSOLE_TYPE_LITE = 0x20, NDS_CONSOLE_TYPE_IQUE = 0x43, - NDS_CONSOLE_TYPE_IQUE_LIE = 0x63, + NDS_CONSOLE_TYPE_IQUE_LITE = 0x63, NDS_CONSOLE_TYPE_DSI = 0xFE }; @@ -291,39 +292,6 @@ struct NDSSystem bool isIn3dVblank() const { return VCount >= 192 && VCount<215; } }; -/** /brief A touchscreen calibration point. - */ -struct NDS_fw_touchscreen_cal { - u16 adc_x; - u16 adc_y; - - u8 screen_x; - u8 screen_y; -}; - -#define MAX_FW_NICKNAME_LENGTH 10 -#define MAX_FW_MESSAGE_LENGTH 26 - -struct NDS_fw_config_data -{ - NDS_CONSOLE_TYPE ds_type; - - u8 fav_colour; - u8 birth_month; - u8 birth_day; - - u16 nickname[MAX_FW_NICKNAME_LENGTH]; - u8 nickname_len; - - u16 message[MAX_FW_MESSAGE_LENGTH]; - u8 message_len; - - u8 language; - - //touchscreen calibration - NDS_fw_touchscreen_cal touch_cal[2]; -}; - extern NDSSystem nds; int NDS_Init(); @@ -608,7 +576,7 @@ extern struct TCommonSettings bool UseExtFirmwareSettings; char Firmware[256]; bool BootFromFirmware; - NDS_fw_config_data fw_config; + FirmwareConfig fwConfig; NDS_CONSOLE_TYPE ConsoleType; bool DebugConsole; diff --git a/desmume/src/firmware.cpp b/desmume/src/firmware.cpp index 94f3e9ca2..f337ed4d8 100644 --- a/desmume/src/firmware.cpp +++ b/desmume/src/firmware.cpp @@ -1,5 +1,5 @@ /* - Copyright (C) 2009-2015 DeSmuME Team + Copyright (C) 2009-2018 DeSmuME Team 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 @@ -25,25 +25,24 @@ #define DFC_ID_CODE "DeSmuME Firmware User Settings" #define DFC_ID_SIZE sizeof(DFC_ID_CODE) -#define USER_SETTINGS_SIZE 0x100 #define WIFI_SETTINGS_SIZE 0x1D5 #define WIFI_AP_SETTINGS_SIZE 0x300 -#define SETTINGS_SIZE (USER_SETTINGS_SIZE + WIFI_SETTINGS_SIZE + WIFI_AP_SETTINGS_SIZE) +#define SETTINGS_SIZE (sizeof(FWUserSettings) + WIFI_SETTINGS_SIZE + WIFI_AP_SETTINGS_SIZE) #define DFC_FILE_SIZE (SETTINGS_SIZE + DFC_ID_SIZE) -#define WIFI_SETTINGS_OFF 0x0000002A -#define WIFI_AP_SETTINGS_OFF 0x0003FA00 static _KEY1 enc(&MMU.ARM7_BIOS[0x0030]); +static const char *defaultNickname = "DeSmuME"; +static const char *defaultMessage = "DeSmuME makes you happy!"; -u16 CFIRMWARE::getBootCodeCRC16() +u16 CFIRMWARE::_getBootCodeCRC16(const u8 *arm9Data, const u32 arm9Size, const u8 *arm7Data, const u32 arm7Size) { unsigned int i, j; u32 crc = 0xFFFF; const u16 val[8] = {0xC0C1, 0xC181, 0xC301, 0xC601, 0xCC01, 0xD801, 0xF001, 0xA001}; - for(i = 0; i < size9; i++) + for(i = 0; i < arm9Size; i++) { - crc = (crc ^ tmp_data9[i]); + crc = (crc ^ arm9Data[i]); for(j = 0; j < 8; j++) { @@ -54,9 +53,9 @@ u16 CFIRMWARE::getBootCodeCRC16() } } - for(i = 0; i < size7; i++) + for(i = 0; i < arm7Size; i++) { - crc = (crc ^ tmp_data7[i]); + crc = (crc ^ arm7Data[i]); for(j = 0; j < 8; j++) { @@ -70,7 +69,7 @@ u16 CFIRMWARE::getBootCodeCRC16() return (crc & 0xFFFF); } -u32 CFIRMWARE::decrypt(const u8 *in, u8* &out) +u32 CFIRMWARE::_decrypt(const u8 *in, u8* &out) { u32 curBlock[2] = { 0 }; u32 blockSize = 0; @@ -160,7 +159,7 @@ u32 CFIRMWARE::decrypt(const u8 *in, u8* &out) return (blockSize); } -u32 CFIRMWARE::decompress(const u8 *in, u8* &out) +u32 CFIRMWARE::_decompress(const u8 *in, u8* &out) { u32 curBlock[2] = { 0 }; u32 blockSize = 0; @@ -248,7 +247,6 @@ u32 CFIRMWARE::decompress(const u8 *in, u8* &out) bool CFIRMWARE::load() { u32 size = 0; - u8 *data = NULL; if (!CommonSettings.UseExtFirmware) return false; @@ -266,56 +264,53 @@ bool CFIRMWARE::load() fclose(fp); return false; } - - data = new u8 [size]; - if (!data) + + NDSFirmwareData newFirmwareData; + + if (fread(&newFirmwareData._raw[0], 1, 12, fp) == 12) + { + if ((newFirmwareData.header.identifierValue & 0x00FFFFFF) != 0x0043414D) + { + fclose(fp); + return false; + } + } + else { fclose(fp); return false; } - - if (fread(data, 1, size, fp) != size) + + if (fread(&newFirmwareData._raw[12], 1, size - 12, fp) != (size - 12)) { - delete [] data; - data = NULL; fclose(fp); return false; } - - memcpy(&header, data, sizeof(header)); - if ((header.fw_identifier & 0x00FFFFFF) != 0x0043414D) - { - delete [] data; - data = NULL; - fclose(fp); - return false; - } + fclose(fp); + + this->_header = newFirmwareData.header; if (MMU.fw.size != size) // reallocate mc_alloc(&MMU.fw, size); - - userDataAddr = T1ReadWord(data, 0x20) * 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 ((T1ReadWord(data, 0x1E) != 0xFFFF) && data[0x1D] == 0x63) + if ( (newFirmwareData.header.key.unused != 0xFFFF) && (newFirmwareData.header.key.consoleType == NDS_CONSOLE_TYPE_IQUE_LITE) ) { - data[0x1D] = NDS_CONSOLE_TYPE_FAT; - data[0x1E] = 0xFF; - data[0x1F] = 0xFF; + newFirmwareData.header.key.consoleType = NDS_CONSOLE_TYPE_FAT; + newFirmwareData.header.key.unused = 0xFFFF; } - - memcpy(MMU.fw.data, data, size); - - delete [] data; - data = NULL; - + + memcpy(&MMU.fw.data, &newFirmwareData, size); + // Generate the path for the external firmware config file. std::string extFilePath = CFIRMWARE::GetExternalFilePath(); strncpy(MMU.fw.userfile, extFilePath.c_str(), MAX_PATH); - successLoad = true; + this->_isLoaded = true; return true; } @@ -332,85 +327,78 @@ bool CFIRMWARE::unpack() INFO("ERROR: 32Mbit (512Kb) firmware not supported\n"); return false; } - - u8 *data = new u8 [size]; - if (!data) - return false; - - memcpy(data, MMU.fw.data, size); - - shift1 = ((header.shift_amounts >> 0) & 0x07); - shift2 = ((header.shift_amounts >> 3) & 0x07); - shift3 = ((header.shift_amounts >> 6) & 0x07); - shift4 = ((header.shift_amounts >> 9) & 0x07); + + NDSFirmwareData workingFirmwareData; + memcpy(&workingFirmwareData, &MMU.fw.data, size); + + shift1 = ((this->_header.shift >> 0) & 0x07); + shift2 = ((this->_header.shift >> 3) & 0x07); + shift3 = ((this->_header.shift >> 6) & 0x07); + shift4 = ((this->_header.shift >> 9) & 0x07); // todo - add support for 512Kb - part1addr = (header.part1_rom_boot9_addr << (2 + shift1)); - part1ram = (0x02800000 - (header.part1_ram_boot9_addr << (2+shift2))); - part2addr = (header.part2_rom_boot7_addr << (2+shift3)); - part2ram = (0x03810000 - (header.part2_ram_boot7_addr << (2+shift4))); - part3addr = (header.part3_rom_gui9_addr << 3); - part4addr = (header.part4_rom_wifi7_addr << 3); - part5addr = (header.part5_data_gfx_addr << 3); + part1addr = (this->_header.part1_rom_boot9_addr << (2 + shift1)); + part1ram = (0x02800000 - (this->_header.part1_ram_boot9_addr << (2+shift2))); + part2addr = (this->_header.part2_rom_boot7_addr << (2+shift3)); + part2ram = (0x03810000 - (this->_header.part2_ram_boot7_addr << (2+shift4))); + part3addr = (this->_header.part3_rom_gui9_addr << 3); + part4addr = (this->_header.part4_rom_wifi7_addr << 3); + part5addr = (this->_header.part5_data_gfx_addr << 3); - ARM9bootAddr = part1ram; - ARM7bootAddr = part2ram; + u32 ARM9bootAddr = part1ram; + u32 ARM7bootAddr = part2ram; - enc.init(header.fw_identifier, 1, 0xC); + enc.init(this->_header.identifierValue, 1, 0xC); #if 0 enc.applyKeycode((u32*)&data[0x18]); #else // fix touch coords - data[0x18] = 0x00; - data[0x19] = 0x00; - data[0x1A] = 0x00; - data[0x1B] = 0x00; - - data[0x1C] = 0x00; - data[0x1D] = 0xFF; - data[0x1E] = 0x00; - data[0x1F] = 0x00; + workingFirmwareData.header.key.timestamp = 0; + workingFirmwareData.header.key.consoleType = NDS_CONSOLE_TYPE_FAT; + workingFirmwareData.header.key.unused = 0xFFFF; #endif - enc.init(header.fw_identifier, 2, 0xC); - - size9 = decrypt(data + part1addr, tmp_data9); + enc.init(this->_header.identifierValue, 2, 0xC); + + u8 *tmp_data9 = NULL; + u8 *tmp_data7 = NULL; + u32 arm9Size = 0; + u32 arm7Size = 0; + + arm9Size = this->_decrypt((u8 *)&workingFirmwareData + part1addr, tmp_data9); if (!tmp_data9) { - delete [] data; data = NULL; return false; } - size7 = decrypt(data + part2addr, tmp_data7); + arm7Size = this->_decrypt((u8 *)&workingFirmwareData + part2addr, tmp_data7); if (!tmp_data7) { delete [] tmp_data9; - delete [] data; data = NULL; return false; } - u16 crc16_mine = getBootCodeCRC16(); + u16 crc16_mine = this->_getBootCodeCRC16(tmp_data9, arm9Size, tmp_data7, arm7Size); - if (crc16_mine != header.part12_boot_crc16) + if (crc16_mine != this->_header.part12_boot_crc16) { - INFO("Firmware: ERROR: the boot code CRC16 (0x%04X) doesn't match the value in the firmware header (0x%04X)", crc16_mine, header.part12_boot_crc16); + INFO("Firmware: ERROR: the boot code CRC16 (0x%04X) doesn't match the value in the firmware header (0x%04X)", crc16_mine, this->_header.part12_boot_crc16); delete [] tmp_data9; delete [] tmp_data7; - delete [] data; data = NULL; return false; } // Copy firmware boot codes to their respective locations src = 0; - for(u32 i = 0; i < (size9 >> 2); i++) + for(u32 i = 0; i < (arm9Size >> 2); i++) { _MMU_write32(part1ram, T1ReadLong(tmp_data9, src)); src += 4; part1ram += 4; } src = 0; - for(u32 i = 0; i < (size7 >> 2); i++) + for(u32 i = 0; i < (arm7Size >> 2); i++) { _MMU_write32(part2ram, T1ReadLong(tmp_data7, src)); src += 4; part2ram += 4; @@ -418,74 +406,70 @@ bool CFIRMWARE::unpack() delete [] tmp_data7; delete [] tmp_data9; - patched = false; - if (data[0x17C] != 0xFF) - patched = true; - + bool isPatched = (workingFirmwareData._raw[0x17C] != 0xFF); + INFO("Firmware:\n"); INFO("- path: %s\n", CommonSettings.Firmware); INFO("- size: %i bytes (%i Mbit)\n", size, size/1024/8); - INFO("- CRC : 0x%04X\n", header.part12_boot_crc16); + INFO("- CRC : 0x%04X\n", this->_header.part12_boot_crc16); INFO("- header: \n"); - INFO(" * size firmware %i\n", ((header.shift_amounts >> 12) & 0xF) * 128 * 1024); + INFO(" * size firmware %i\n", ((this->_header.shift >> 12) & 0xF) * 128 * 1024); INFO(" * ARM9 boot code address: 0x%08X\n", part1addr); INFO(" * ARM9 boot code RAM address: 0x%08X\n", ARM9bootAddr); - INFO(" * ARM9 unpacked size: 0x%08X (%i) bytes\n", size9, size9); + INFO(" * ARM9 unpacked size: 0x%08X (%i) bytes\n", arm9Size, arm9Size); INFO(" * ARM9 GUI code address: 0x%08X\n", part3addr); INFO("\n"); INFO(" * ARM7 boot code address: 0x%08X\n", part2addr); INFO(" * ARM7 boot code RAM address: 0x%08X\n", ARM7bootAddr); INFO(" * ARM7 WiFi code address: 0x%08X\n", part4addr); - INFO(" * ARM7 unpacked size: 0x%08X (%i) bytes\n", size7, size7); + INFO(" * ARM7 unpacked size: 0x%08X (%i) bytes\n", arm7Size, arm7Size); INFO("\n"); INFO(" * Data/GFX address: 0x%08X\n", part5addr); - if (patched) + if (isPatched) { u32 patch_offset = 0x3FC80; - if (data[0x17C] > 1) + if (workingFirmwareData._raw[0x17C] > 1) patch_offset = 0x3F680; - memcpy(&header, data + patch_offset, sizeof(header)); + memcpy(&this->_header, &workingFirmwareData._raw[patch_offset], sizeof(this->_header)); - shift1 = ((header.shift_amounts >> 0) & 0x07); - shift2 = ((header.shift_amounts >> 3) & 0x07); - shift3 = ((header.shift_amounts >> 6) & 0x07); - shift4 = ((header.shift_amounts >> 9) & 0x07); + shift1 = ((this->_header.shift >> 0) & 0x07); + shift2 = ((this->_header.shift >> 3) & 0x07); + shift3 = ((this->_header.shift >> 6) & 0x07); + shift4 = ((this->_header.shift >> 9) & 0x07); // todo - add support for 512Kb - part1addr = (header.part1_rom_boot9_addr << (2 + shift1)); - part1ram = (0x02800000 - (header.part1_ram_boot9_addr << (2+shift2))); - part2addr = (header.part2_rom_boot7_addr << (2+shift3)); - part2ram = (0x03810000 - (header.part2_ram_boot7_addr << (2+shift4))); + part1addr = (this->_header.part1_rom_boot9_addr << (2 + shift1)); + part1ram = (0x02800000 - (this->_header.part1_ram_boot9_addr << (2+shift2))); + part2addr = (this->_header.part2_rom_boot7_addr << (2+shift3)); + part2ram = (0x03810000 - (this->_header.part2_ram_boot7_addr << (2+shift4))); ARM9bootAddr = part1ram; ARM7bootAddr = part2ram; - size9 = decompress(data + part1addr, tmp_data9); + arm9Size = this->_decompress(&workingFirmwareData._raw[part1addr], tmp_data9); if (!tmp_data9) { - delete [] data; return false; } - size7 = decompress(data + part2addr, tmp_data7); + arm7Size = this->_decompress(&workingFirmwareData._raw[part2addr], tmp_data7); if (!tmp_data7) { delete [] tmp_data9; - delete [] data; return false; }; // Copy firmware boot codes to their respective locations src = 0; - for(u32 i = 0; i < (size9 >> 2); i++) + for(u32 i = 0; i < (arm9Size >> 2); i++) { _MMU_write32(part1ram, T1ReadLong(tmp_data9, src)); src += 4; part1ram += 4; } src = 0; - for(u32 i = 0; i < (size7 >> 2); i++) + for(u32 i = 0; i < (arm7Size >> 2); i++) { _MMU_write32(part2ram, T1ReadLong(tmp_data7, src)); src += 4; part2ram += 4; @@ -497,17 +481,16 @@ bool CFIRMWARE::unpack() INFO("- header: \n"); INFO(" * ARM9 boot code address: 0x%08X\n", part1addr); INFO(" * ARM9 boot code RAM address: 0x%08X\n", ARM9bootAddr); - INFO(" * ARM9 unpacked size: 0x%08X (%i) bytes\n", size9, size9); + INFO(" * ARM9 unpacked size: 0x%08X (%i) bytes\n", arm9Size, arm9Size); INFO("\n"); INFO(" * ARM7 boot code address: 0x%08X\n", part2addr); INFO(" * ARM7 boot code RAM address: 0x%08X\n", ARM7bootAddr); - INFO(" * ARM7 unpacked size: 0x%08X (%i) bytes\n", size7, size7); + INFO(" * ARM7 unpacked size: 0x%08X (%i) bytes\n", arm7Size, arm7Size); } - memcpy(MMU.fw.data, data, size); + memcpy(&MMU.fw.data, &workingFirmwareData, size); MMU.fw.fp = NULL; - delete [] data; data = NULL; return true; } @@ -532,10 +515,10 @@ bool CFIRMWARE::loadSettings() { if (fread(usr, 1, SETTINGS_SIZE, fp) == SETTINGS_SIZE) { - memcpy(&MMU.fw.data[userDataAddr], usr, USER_SETTINGS_SIZE); - memcpy(&MMU.fw.data[userDataAddr + 0x100], usr, USER_SETTINGS_SIZE); - memcpy(&MMU.fw.data[WIFI_SETTINGS_OFF], usr + USER_SETTINGS_SIZE, WIFI_SETTINGS_SIZE); - memcpy(&MMU.fw.data[WIFI_AP_SETTINGS_OFF], usr + USER_SETTINGS_SIZE + WIFI_SETTINGS_SIZE, WIFI_AP_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", MMU.fw.userfile); } } @@ -557,20 +540,17 @@ bool CFIRMWARE::saveSettings() { if (!CommonSettings.UseExtFirmware) return false; if (!CommonSettings.UseExtFirmwareSettings) return false; - - u8 *data = &MMU.fw.data[userDataAddr]; - u8 counter0 = data[0x070]; - u8 counter1 = data[0x170]; - - if (counter1 == ((counter0 + 1) & 0x7F)) + + FWUserSettings &userSettings0 = MMU.fw.data.userSettings0; + FWUserSettings &userSettings1 = MMU.fw.data.userSettings1; + + if (userSettings1.updateCounter == ((userSettings0.updateCounter + 1) & 0x7F)) { - // copy User Settings 1 to User Settings 0 area - memcpy(data, data + 0x100, 0x100); + userSettings0 = userSettings1; } else { - // copy User Settings 0 to User Settings 1 area - memcpy(data + 0x100, data, 0x100); + userSettings1 = userSettings0; } printf("Firmware: saving config"); @@ -581,9 +561,10 @@ bool CFIRMWARE::saveSettings() if (usr) { memcpy(usr, DFC_ID_CODE, DFC_ID_SIZE); - memcpy(usr + DFC_ID_SIZE, data, USER_SETTINGS_SIZE); - memcpy(usr + DFC_ID_SIZE + USER_SETTINGS_SIZE, &MMU.fw.data[WIFI_SETTINGS_OFF], WIFI_SETTINGS_SIZE); - memcpy(usr + DFC_ID_SIZE + USER_SETTINGS_SIZE + WIFI_SETTINGS_SIZE, &MMU.fw.data[WIFI_AP_SETTINGS_OFF], WIFI_AP_SETTINGS_SIZE); + memcpy(usr + DFC_ID_SIZE, &userSettings0, sizeof(FWUserSettings)); + memcpy(usr + DFC_ID_SIZE + sizeof(FWUserSettings), &MMU.fw.data.wifiInfo, WIFI_SETTINGS_SIZE); + memcpy(usr + DFC_ID_SIZE + sizeof(FWUserSettings) + WIFI_SETTINGS_SIZE, &MMU.fw.data.wifiAP1, WIFI_AP_SETTINGS_SIZE); + if (fwrite(usr, 1, DFC_FILE_SIZE, fp) == DFC_FILE_SIZE) printf(" - done\n"); else @@ -610,11 +591,16 @@ std::string CFIRMWARE::GetExternalFilePath() return finalPath; } -void *CFIRMWARE::getTouchCalibrate() +bool CFIRMWARE::loaded() +{ + return this->_isLoaded; +} + +void* CFIRMWARE::getTouchCalibrate() { static TSCalInfo cal = {0}; - if (!successLoad || !CommonSettings.UseExtFirmware || !successLoad) + if (!this->_isLoaded || !CommonSettings.UseExtFirmware) { cal.adc.x1 = _MMU_read16(0x027FFC80 + 0x58) & 0x1FFF; cal.adc.y1 = _MMU_read16(0x027FFC80 + 0x5A) & 0x1FFF; @@ -627,14 +613,16 @@ void *CFIRMWARE::getTouchCalibrate() } else { - cal.adc.x1 = T1ReadWord(MMU.fw.data, userDataAddr + 0x58) & 0x1FFF; - cal.adc.y1 = T1ReadWord(MMU.fw.data, userDataAddr + 0x5A) & 0x1FFF; - cal.scr.x1 = T1ReadByte(MMU.fw.data, userDataAddr + 0x5C); - cal.scr.y1 = T1ReadByte(MMU.fw.data, userDataAddr + 0x5D); - cal.adc.x2 = T1ReadWord(MMU.fw.data, userDataAddr + 0x5E) & 0x1FFF; - cal.adc.y2 = T1ReadWord(MMU.fw.data, userDataAddr + 0x60) & 0x1FFF; - cal.scr.x2 = T1ReadByte(MMU.fw.data, userDataAddr + 0x62); - cal.scr.y2 = T1ReadByte(MMU.fw.data, userDataAddr + 0x63); + FWUserSettings &userSettings = (FWUserSettings &)MMU.fw.data._raw[this->_userDataAddr]; + + cal.adc.x1 = LE_TO_LOCAL_16(userSettings.tscADC_x1) & 0x1FFF; + cal.adc.y1 = LE_TO_LOCAL_16(userSettings.tscADC_y1) & 0x1FFF; + cal.scr.x1 = userSettings.tscPixel_x1; + cal.scr.y1 = userSettings.tscPixel_y1; + cal.adc.x2 = LE_TO_LOCAL_16(userSettings.tscADC_x2) & 0x1FFF; + cal.adc.y2 = LE_TO_LOCAL_16(userSettings.tscADC_y2) & 0x1FFF; + cal.scr.x2 = userSettings.tscPixel_x2; + cal.scr.y2 = userSettings.tscPixel_y2; } cal.adc.width = (cal.adc.x2 - cal.adc.x1); @@ -646,9 +634,10 @@ void *CFIRMWARE::getTouchCalibrate() } //===================================================================================================== -static u32 -calc_CRC16( u32 start, const u8 *data, int count) { +static u32 calc_CRC16(u32 start, const void *inBuffer, int count) +{ int i,j; + const u8 *data = (u8 *)inBuffer; u32 crc = start & 0xffff; const u16 val[8] = { 0xC0C1,0xC181,0xC301,0xC601,0xCC01,0xD801,0xF001,0xA001 }; for(i = 0; i < count; i++) @@ -746,218 +735,319 @@ int copy_firmware_user_data( u8 *dest_buffer, const u8 *fw_data) return copy_good; } -static void fill_user_data_area( struct NDS_fw_config_data *user_settings,u8 *data, int count) +void NDS_GetDefaultFirmwareConfig(FirmwareConfig &outConfig) { - u32 crc; - int i; - u8 *ts_cal_data_area; - - memset( data, 0, 0x100); - - // version - data[0x00] = 5; - data[0x01] = 0; - - // colour - data[0x02] = user_settings->fav_colour; - - // birthday month and day - data[0x03] = user_settings->birth_month; - data[0x04] = user_settings->birth_day; - - //nickname and length - for ( i = 0; i < MAX_FW_NICKNAME_LENGTH; i++) { - data[0x06 + (i * 2)] = user_settings->nickname[i] & 0xff; - data[0x06 + (i * 2) + 1] = (user_settings->nickname[i] >> 8) & 0xff; + memset(&outConfig, 0, sizeof(FirmwareConfig)); + + outConfig.consoleType = NDS_CONSOLE_TYPE_FAT; + outConfig.favoriteColor = 7; + outConfig.birthdayMonth = 6; + outConfig.birthdayDay = 23; + outConfig.language = 1; // English + outConfig.backlightLevel = 3; // Max brightness + + // The length of the default strings, ignoring the null-terminating character. + outConfig.nicknameLength = strlen(defaultNickname); + outConfig.messageLength = strlen(defaultMessage); + + // Copy the default char buffers into the UTF-16 string buffers. + for (size_t i = 0; i < outConfig.nicknameLength; i++) + { + outConfig.nickname[i] = defaultNickname[i]; } - - data[0x1a] = user_settings->nickname_len; - - //Message - for ( i = 0; i < MAX_FW_MESSAGE_LENGTH; i++) { - data[0x1c + (i * 2)] = user_settings->message[i] & 0xff; - data[0x1c + (i * 2) + 1] = (user_settings->message[i] >> 8) & 0xff; + + for (size_t i = 0; i < outConfig.messageLength; i++) + { + outConfig.message[i] = defaultMessage[i]; } - - data[0x50] = user_settings->message_len; - - //touch screen calibration - ts_cal_data_area = &data[0x58]; - for ( i = 0; i < 2; i++) { - // ADC x y - *ts_cal_data_area++ = user_settings->touch_cal[i].adc_x & 0xff; - *ts_cal_data_area++ = (user_settings->touch_cal[i].adc_x >> 8) & 0xff; - *ts_cal_data_area++ = user_settings->touch_cal[i].adc_y & 0xff; - *ts_cal_data_area++ = (user_settings->touch_cal[i].adc_y >> 8) & 0xff; - - //screen x y - *ts_cal_data_area++ = user_settings->touch_cal[i].screen_x; - *ts_cal_data_area++ = user_settings->touch_cal[i].screen_y; - } - - //language and flags - data[0x64] = user_settings->language | 0x30; // Also set bits 4 and 5 to set the backlight level to max. - data[0x65] = 0xfc; - - //update count and crc - data[0x70] = count & 0xff; - data[0x71] = (count >> 8) & 0xff; - - crc = calc_CRC16( 0xffff, data, 0x70); - data[0x72] = crc & 0xff; - data[0x73] = (crc >> 8) & 0xff; - - memset( &data[0x74], 0xff, 0x100 - 0x74); -} - -// creates an firmware flash image, which contains all needed info to initiate a wifi connection -int NDS_CreateDummyFirmware(NDS_fw_config_data *user_settings) -{ - //Create the firmware header - - memset( MMU.fw.data, 0, 0x40000); - - //firmware identifier - MMU.fw.data[0x8] = 'M'; - MMU.fw.data[0x8 + 1] = 'A'; - MMU.fw.data[0x8 + 2] = 'C'; - MMU.fw.data[0x8 + 3] = 'P'; - - // DS type - if ( user_settings->ds_type == NDS_CONSOLE_TYPE_DSI) - MMU.fw.data[0x1d] = 0xFF; - else - MMU.fw.data[0x1d] = user_settings->ds_type; - - //User Settings offset 0x3fe00 / 8 - MMU.fw.data[0x20] = 0xc0; - MMU.fw.data[0x21] = 0x7f; - - - //User settings (at 0x3FE00 and 0x3FF00) - - fill_user_data_area( user_settings, &MMU.fw.data[ 0x3FE00], 0); - fill_user_data_area( user_settings, &MMU.fw.data[ 0x3FF00], 1); - - // Wifi config length - MMU.fw.data[0x2C] = 0x38; - MMU.fw.data[0x2D] = 0x01; - - MMU.fw.data[0x2E] = 0x00; - - //Wifi version - MMU.fw.data[0x2F] = 0x00; - - //MAC address - memcpy((MMU.fw.data + 0x36), FW_Mac, sizeof(FW_Mac)); - - //Enabled channels - MMU.fw.data[0x3C] = 0xFE; - MMU.fw.data[0x3D] = 0x3F; - - MMU.fw.data[0x3E] = 0xFF; - MMU.fw.data[0x3F] = 0xFF; - - //RF related - MMU.fw.data[0x40] = 0x02; - MMU.fw.data[0x41] = 0x18; - MMU.fw.data[0x42] = 0x0C; - - MMU.fw.data[0x43] = 0x01; - - //Wifi I/O init values - memcpy((MMU.fw.data + 0x44), FW_WIFIInit, sizeof(FW_WIFIInit)); - - //Wifi BB init values - memcpy((MMU.fw.data + 0x64), FW_BBInit, sizeof(FW_BBInit)); - - //Wifi RF init values - memcpy((MMU.fw.data + 0xCE), FW_RFInit, sizeof(FW_RFInit)); - - //Wifi channel-related init values - memcpy((MMU.fw.data + 0xF2), FW_RFChannel, sizeof(FW_RFChannel)); - memcpy((MMU.fw.data + 0x146), FW_BBChannel, sizeof(FW_BBChannel)); - memset((MMU.fw.data + 0x154), 0x10, 0xE); - - //WFC profiles - memcpy((MMU.fw.data + 0x3FA40), &FW_WFCProfile1, sizeof(FW_WFCProfile)); - memcpy((MMU.fw.data + 0x3FB40), &FW_WFCProfile2, sizeof(FW_WFCProfile)); - memcpy((MMU.fw.data + 0x3FC40), &FW_WFCProfile3, sizeof(FW_WFCProfile)); - (*(u16*)(MMU.fw.data + 0x3FAFE)) = (u16)calc_CRC16(0, (MMU.fw.data + 0x3FA00), 0xFE); - (*(u16*)(MMU.fw.data + 0x3FBFE)) = (u16)calc_CRC16(0, (MMU.fw.data + 0x3FB00), 0xFE); - (*(u16*)(MMU.fw.data + 0x3FCFE)) = (u16)calc_CRC16(0, (MMU.fw.data + 0x3FC00), 0xFE); - - - MMU.fw.data[0x162] = 0x19; - memset((MMU.fw.data + 0x163), 0xFF, 0x9D); - - //Wifi settings CRC16 - (*(u16*)(MMU.fw.data + 0x2A)) = calc_CRC16(0, (MMU.fw.data + 0x2C), 0x138); - - if (&CommonSettings.fw_config != user_settings) - memcpy(&CommonSettings.fw_config, user_settings, sizeof(NDS_fw_config_data)); - - return TRUE ; -} - -void NDS_FillDefaultFirmwareConfigData(NDS_fw_config_data *fw_config) { - const char *default_nickname = "DeSmuME"; - const char *default_message = "DeSmuME makes you happy!"; - int i; - int str_length; - - memset( fw_config, 0, sizeof(NDS_fw_config_data)); - fw_config->ds_type = NDS_CONSOLE_TYPE_FAT; - - fw_config->fav_colour = 7; - - fw_config->birth_day = 23; - fw_config->birth_month = 6; - - str_length = strlen( default_nickname); - for ( i = 0; i < str_length; i++) { - fw_config->nickname[i] = default_nickname[i]; - } - fw_config->nickname_len = str_length; - - str_length = strlen( default_message); - for ( i = 0; i < str_length; i++) { - fw_config->message[i] = default_message[i]; - } - fw_config->message_len = str_length; - - //default to English - fw_config->language = 1; - + + outConfig.MACAddress[0] = 0x00; + outConfig.MACAddress[1] = 0x09; + outConfig.MACAddress[2] = 0xBF; + outConfig.MACAddress[3] = 0x12; + outConfig.MACAddress[4] = 0x34; + outConfig.MACAddress[5] = 0x56; + // default touchscreen calibration - + //ANCIENT DESMUME VALUES - fw_config->touch_cal[0].adc_x = 0x200; - fw_config->touch_cal[0].adc_y = 0x200; - fw_config->touch_cal[0].screen_x = 0x20 + 1; // calibration screen coords are 1-based, - fw_config->touch_cal[0].screen_y = 0x20 + 1; // either that or NDS_getADCTouchPosX/Y are wrong. + outConfig.tscADC_x1 = 0x200; + outConfig.tscADC_y1 = 0x200; + outConfig.tscPixel_x1 = 0x20 + 1; // calibration screen coords are 1-based, + outConfig.tscPixel_y1 = 0x20 + 1; // either that or NDS_getADCTouchPosX/Y are wrong. //VALUES FROM NOCASH - //fw_config->touch_cal[0].adc_x = 0x02DF; - //fw_config->touch_cal[0].adc_y = 0x032C; - //fw_config->touch_cal[0].screen_x = 0x20; - //fw_config->touch_cal[0].screen_y = 0x20; - + //outConfig.tscADC_x1 = 0x02DF; + //outConfig.tscADC_y1 = 0x032C; + //outConfig.tscPixel_x1 = 0x20; + //outConfig.tscPixel_y1 = 0x20; + //ANCIENT DESMUME VALUES - fw_config->touch_cal[1].adc_x = 0xe00; - fw_config->touch_cal[1].adc_y = 0x800; - fw_config->touch_cal[1].screen_x = 0xe0 + 1; - fw_config->touch_cal[1].screen_y = 0x80 + 1; + outConfig.tscADC_x2 = 0xE00; + outConfig.tscADC_y2 = 0x800; + outConfig.tscPixel_x2 = 0xE0 + 1; + outConfig.tscPixel_y2 = 0x80 + 1; //VALUES FROM NOCASH - //fw_config->touch_cal[1].adc_x = 0x0D3B; - //fw_config->touch_cal[1].adc_y = 0x0CE7; - //fw_config->touch_cal[1].screen_x = 0xE0; - //fw_config->touch_cal[1].screen_y = 0xA0; + //outConfig.tscADC_x2 = 0x0D3B; + //outConfig.tscADC_y2 = 0x0CE7; + //outConfig.tscPixel_x2 = 0xE0; + //outConfig.tscPixel_y2 = 0xA0; + + outConfig.subnetMask_AP1 = 24; + outConfig.subnetMask_AP2 = 24; + outConfig.subnetMask_AP3 = 24; } -void NDS_PatchFirmwareMAC() +void NDS_InitFirmwareWithConfig(const FirmwareConfig &inConfig) { - memcpy((MMU.fw.data + 0x36), FW_Mac, sizeof(FW_Mac)); - (*(u16*)(MMU.fw.data + 0x2A)) = calc_CRC16(0, (MMU.fw.data + 0x2C), 0x138); + // Create the firmware header + 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 = offsetof(NDSFirmwareData, userSettings0) / 8; + + // NDS type + if (inConfig.consoleType == NDS_CONSOLE_TYPE_DSI) + { + fw.header.key.consoleType = NDS_CONSOLE_TYPE_FAT; + } + else + { + fw.header.key.consoleType = inConfig.consoleType; + } + + // User settings (at 0x3FE00 and 0x3FF00) + 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 = inConfig.nicknameLength; + fw.userSettings0.messageLength = inConfig.nicknameLength; + + for (size_t i = 0; i < fw.userSettings0.nicknameLength; i++) + { + fw.userSettings0.nickname[i] = inConfig.nickname[i]; + } + + for (size_t i = 0; i < fw.userSettings0.messageLength; i++) + { + fw.userSettings0.message[i] = inConfig.message[i]; + } + + // Default touch-screen calibration settings. + fw.userSettings0.tscADC_x1 = inConfig.tscADC_x1; + fw.userSettings0.tscADC_y1 = inConfig.tscADC_y1; + fw.userSettings0.tscPixel_x1 = inConfig.tscPixel_x1; + fw.userSettings0.tscPixel_y1 = inConfig.tscPixel_y1; + fw.userSettings0.tscADC_x2 = inConfig.tscADC_x2; + fw.userSettings0.tscADC_y2 = 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 = 0; + fw.userSettings1.updateCounter = 1; + fw.userSettings0.crc16 = (u16)calc_CRC16(0xFFFF, &fw.userSettings0, 0x70); + fw.userSettings1.crc16 = (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 = calc_CRC16(0, &fw.wifiInfo.length, fw.wifiInfo.length); + + // 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'; + 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)) || + (*(u32 *)inConfig.ipv4PrimaryDNS_AP2 != 0) || + (*(u32 *)inConfig.ipv4SecondaryDNS_AP2 != 0) ) + { + fw.wifiAP2.SSID[0] = 'S'; + 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)) || + (*(u32 *)inConfig.ipv4PrimaryDNS_AP3 != 0) || + (*(u32 *)inConfig.ipv4SecondaryDNS_AP3 != 0) ) + { + fw.wifiAP3.SSID[0] = 'S'; + 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 = (u16)calc_CRC16(0, &fw.wifiAP1, 254); + 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); } //========================= @@ -980,7 +1070,7 @@ void fw_reset_com(fw_memory_chip *mc) if (mc->fp) { fseek(mc->fp, 0, SEEK_SET); - fwrite(mc->data, mc->size, 1, mc->fp); + fwrite(mc->data._raw, mc->size, 1, mc->fp); } if (mc->isFirmware && CommonSettings.UseExtFirmware && CommonSettings.UseExtFirmwareSettings && firmware) @@ -1009,7 +1099,7 @@ u8 fw_transfer(fw_memory_chip *mc, u8 data) case FW_CMD_READ: if(mc->addr < mc->size) /* check if we can read */ { - data = mc->data[mc->addr]; /* return byte */ + data = mc->data._raw[mc->addr]; /* return byte */ mc->addr++; /* then increment address */ } break; @@ -1017,7 +1107,7 @@ u8 fw_transfer(fw_memory_chip *mc, u8 data) case FW_CMD_PAGEWRITE: if(mc->addr < mc->size) { - mc->data[mc->addr] = data; /* write byte */ + mc->data._raw[mc->addr] = data; /* write byte */ mc->addr++; } break; @@ -1104,45 +1194,41 @@ void mc_init(fw_memory_chip *mc, int type) mc->com = 0; mc->addr = 0; mc->addr_shift = 0; - mc->data = NULL; mc->size = 0; mc->write_enable = FALSE; mc->writeable_buffer = FALSE; mc->type = type; - switch(mc->type) + switch (mc->type) { - case MC_TYPE_EEPROM1: - mc->addr_size = 1; - break; - case MC_TYPE_EEPROM2: - case MC_TYPE_FRAM: - mc->addr_size = 2; - break; - case MC_TYPE_FLASH: - mc->addr_size = 3; - break; - default: break; + case MC_TYPE_EEPROM1: + mc->addr_size = 1; + break; + + case MC_TYPE_EEPROM2: + case MC_TYPE_FRAM: + mc->addr_size = 2; + break; + + case MC_TYPE_FLASH: + mc->addr_size = 3; + break; + + default: + break; } } u8 *mc_alloc(fw_memory_chip *mc, u32 size) { - u8 *buffer = NULL; - buffer = new u8[size]; - if(!buffer) { return NULL; } - memset(buffer,0,size); - - if (mc->data) delete [] mc->data; - mc->data = buffer; + memset(mc->data._raw, 0, sizeof(NDSFirmwareData)); mc->size = size; mc->writeable_buffer = TRUE; - return buffer; + return mc->data._raw; } void mc_free(fw_memory_chip *mc) { - if(mc->data) delete[] mc->data; - mc_init(mc, 0); + mc_init(mc, MC_TYPE_AUTODETECT); } diff --git a/desmume/src/firmware.h b/desmume/src/firmware.h index 407a78691..f161e0595 100644 --- a/desmume/src/firmware.h +++ b/desmume/src/firmware.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2009-2015 DeSmuME Team + Copyright (C) 2009-2018 DeSmuME Team 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 @@ -30,24 +30,387 @@ //extension of the firmware user settings file #define FW_CONFIG_FILE_EXT "dfc" -struct NDS_fw_config_data; +#define MAX_FW_NICKNAME_LENGTH 10 +#define MAX_FW_MESSAGE_LENGTH 26 + +struct FirmwareConfig +{ + u8 consoleType; + + u8 favoriteColor; + u8 birthdayMonth; + u8 birthdayDay; + + // Add one character to these string buffers just in case clients + // try to terminate a max length string with a null character. + u16 nickname[MAX_FW_NICKNAME_LENGTH+1]; + u8 nicknameLength; + u16 message[MAX_FW_MESSAGE_LENGTH+1]; + u8 messageLength; + + u8 language; + u8 backlightLevel; + + u16 tscADC_x1; + u16 tscADC_y1; + u8 tscPixel_x1; + u8 tscPixel_y1; + u16 tscADC_x2; + u16 tscADC_y2; + u8 tscPixel_x2; + u8 tscPixel_y2; + + u8 MACAddress[6]; + + u8 ipv4Address_AP1[4]; + u8 ipv4Gateway_AP1[4]; + u8 ipv4PrimaryDNS_AP1[4]; + u8 ipv4SecondaryDNS_AP1[4]; + u8 subnetMask_AP1; + + u8 ipv4Address_AP2[4]; + u8 ipv4Gateway_AP2[4]; + u8 ipv4PrimaryDNS_AP2[4]; + u8 ipv4SecondaryDNS_AP2[4]; + u8 subnetMask_AP2; + + u8 ipv4Address_AP3[4]; + u8 ipv4Gateway_AP3[4]; + u8 ipv4PrimaryDNS_AP3[4]; + u8 ipv4SecondaryDNS_AP3[4]; + u8 subnetMask_AP3; +}; +typedef FirmwareConfig FirmwareConfig; + +#include "PACKED.h" +typedef union __PACKED +{ + u64 encryption; + + struct + { + u64 timestamp:40; + u64 consoleType:8; + u64 unused:16; + }; +} FW_HEADER_KEY; + +typedef union __PACKED +{ + u16 value; + + struct + { + u16 language:3; + u16 gbaModeScreenSelection:1; + u16 backlightLevel:2; + u16 bootmenuDisable:1; + u16 :1; + + u16 :1; + u16 settingsLost:1; + u16 settingsOkay1:1; + u16 :1; + u16 settingsOkay2:1; + u16 settingsOkay3:1; + u16 settingsOkay4:1; + u16 settingsOkay5:1; + }; +} FW_USERSETTINGS_LANGUAGE_FLAGS; + +typedef struct __PACKED +{ + u16 part3_rom_gui9_addr; // 0x0000 + u16 part4_rom_wifi7_addr; // 0x0002 + u16 part34_gui_wifi_crc16; // 0x0004 + u16 part12_boot_crc16; // 0x0006 + + union + { + u32 identifierValue; // 0x0008 + u8 identifier[4]; // 0x0008 + }; + + u16 part1_rom_boot9_addr; // 0x000C + u16 part1_ram_boot9_addr; // 0x000E + u16 part2_rom_boot7_addr; // 0x0010 + u16 part2_ram_boot7_addr; // 0x0012 + u16 shift; // 0x0014 + u16 part5_data_gfx_addr; // 0x0016 + + FW_HEADER_KEY key; // 0x0018 + + u16 userSettingsOffset; // 0x0020 + u16 UNKNOWN1; // 0x0022 + u16 UNKNOWN2; // 0x0024 + u16 part5_crc16; // 0x0026 + u16 unused2; // 0x0028 +} FWHeader; + +typedef struct __PACKED +{ + u16 crc16; // 0x002A + u16 length; // 0x002C + u8 unused1; // 0x002E + u8 version; // 0x002F + u8 unused2[6]; // 0x0030 + u8 MACAddr[6]; // 0x0036 + u16 channels; // 0x003C + u16 flags; // 0x003E + u8 rfType; // 0x0040 + u8 rfBits; // 0x0041 + u8 rfEntries; // 0x0042 + u8 UNKNOWN1; // 0x0043 + + u16 wifiConfig146; // 0x0044 + u16 wifiConfig148; // 0x0046 + u16 wifiConfig14A; // 0x0048 + u16 wifiConfig14C; // 0x004A + u16 wifiConfig120; // 0x004C + u16 wifiConfig122; // 0x004E + u16 wifiConfig154; // 0x0050 + u16 wifiConfig144; // 0x0052 + u16 wifiConfig130; // 0x0054 + u16 wifiConfig132; // 0x0056 + u16 wifiConfig140; // 0x0058 + u16 wifiConfig142; // 0x005A + u16 wifiConfigPowerTX; // 0x005C + u16 wifiConfig124; // 0x005E + u16 wifiConfig128; // 0x0060 + u16 wifiConfig150; // 0x0062 + + u8 bbData[105]; // 0x0064 + u8 unused3; // 0x00CD + + union + { + struct + { + u8 rfValue[36]; // 0x00CE + u8 rfChannelValue24[84]; // 0x00F2 + u8 bbChannelValue8[14]; // 0x0146 + u8 rfChannelValue8[14]; // 0x0154 + } Type2; + + struct + { + u8 type3Data[148]; // 0x00CE + } Type3; + }; + + u8 UNKNOWN2; // 0x0162 + u8 unused4; // 0x0163 + u8 unused5[156]; // 0x0164 +} FWWifiInfo; + +typedef struct +{ + u8 UNKNOWN1[64]; + u8 SSID[32]; + u8 SSID_WEP[32]; + u8 wepKey1[16]; + u8 wepKey2[16]; + u8 wepKey3[16]; + u8 wepKey4[16]; + u8 ipv4Address[4]; + u8 ipv4Gateway[4]; + u8 ipv4PrimaryDNS[4]; + u8 ipv4SecondaryDNS[4]; + u8 subnetMask; + u8 wepKeyAOSS[20]; + u8 UNKNOWN2; + u8 wepMode; + u8 configureMode; + u8 zero; + u8 UNKNOWN3; + u16 mtuSize; + u8 UNKNOWN4[3]; + u8 connectStatus; + u8 wfcUserID[6]; + u8 UNKNOWN5[8]; + u16 crc16; +} FWAccessPointSettings; + +typedef struct +{ + u8 proxyAuthenticationUsername[32]; + u8 proxyAuthenticationPassword[32]; + u8 SSID[32]; + u8 SSID_WEP[32]; + u8 wepKey1[16]; + u8 wepKey2[16]; + u8 wepKey3[16]; + u8 wepKey4[16]; + u8 ipv4Address[4]; + u8 ipv4Gateway[4]; + u8 ipv4PrimaryDNS[4]; + u8 ipv4SecondaryDNS[4]; + u8 subnetMask; + u8 wepKeyAOSS[20]; + u8 UNKNOWN2; + u8 wepMode; + u8 configureMode; + u8 ssidLength; + u8 UNKNOWN3; + u16 mtuSize; + u8 UNKNOWN4[3]; + u8 connectStatus; + u8 unused1[14]; + u16 crc16_1; + u8 UNKNOWN5[32]; + u8 wpaKey[16]; + u8 unused2[82]; + u8 securityMode; + u8 proxyEnable; + u8 proxyAuthentication; + u8 proxyName[32]; + u8 unused3[65]; + u16 proxyPort; + u8 unused4[21]; + u16 crc16_2; +} FWExtAccessPointSettings; + +typedef struct +{ + u16 version; + u8 favoriteColor; + u8 birthdayMonth; + u8 birthdayDay; + u8 unused1; + u16 nickname[10]; + u16 nicknameLength; + u16 message[26]; + u16 messageLength; + u8 alarmHour; + u8 alarmMinute; + u16 unused2; + u8 alarmEnable; + u8 unused3; + u16 tscADC_x1; + u16 tscADC_y1; + u8 tscPixel_x1; + u8 tscPixel_y1; + u16 tscADC_x2; + u16 tscADC_y2; + u8 tscPixel_x2; + u8 tscPixel_y2; + FW_USERSETTINGS_LANGUAGE_FLAGS languageFlags; + u8 year; + u8 UNKNOWN1; + u32 rtcOffset; + u32 unused4; + + u16 updateCounter; + u16 crc16; + + union + { + struct + { + u8 unused5[140]; + } nds; + + struct + { + u8 UNKNOWN2; + u8 extendedLanguage; + u16 supportedLanguage; + u8 unused6[134]; + u16 crc16Extended; + } dsi; + }; + +} FWUserSettings; + +typedef struct +{ + union + { + u64 identifierValue; + u8 identifier[8]; + }; + + u16 crc16Value; + u16 crc16Length; + u8 version; + u8 updateCount; + u8 bootMenuFlags; + u8 gbaBorder; + u16 tempCalibrationTP0; + u16 tempCalibrationTP1; + u16 tempCalibrationDegrees; + u8 tempFlags; + u8 backlightIntensity; + u32 dateCenturyOffset; + u8 dateMonthRecoveryValue; + u8 dateDayRecoveryValue; + u8 dateYearRecoveryValue; + u8 dateTimeFlags; + u8 dateSeparator; + u8 timeSeparator; + u8 decimalSeparator; + u8 thousandsSeparator; + u8 daylightSavingsTimeNth; + u8 daylightSavingsTimeDay; + u8 daylightSavingsTimeMonth; + u8 daylightSavingsTimeFlags; +} FWExtUserSettings; + +typedef union +{ + u8 _raw[262144]; + + struct + { + FWHeader header; + FWWifiInfo wifiInfo; + + union + { + struct + { + u8 codeAndData[260096]; + } nds; + + struct + { + u8 zeroBuffer[255]; + u8 value0x80; + u8 ffBuffer[127231]; + u8 bootFlags; + FWExtAccessPointSettings wifiAP4; + FWExtAccessPointSettings wifiAP5; + FWExtAccessPointSettings wifiAP6; + u8 UNKNOWN1[131072]; + } dsi; + }; + + FWAccessPointSettings wifiAP1; + FWAccessPointSettings wifiAP2; + FWAccessPointSettings wifiAP3; + + u8 unused[256]; + + FWUserSettings userSettings0; + FWUserSettings userSettings1; + }; + +} NDSFirmwareData; +#include "PACKED_END.h" class CFIRMWARE { private: - u8 *tmp_data9; - u8 *tmp_data7; - u32 size9, size7; - u32 userDataAddr; - - u16 getBootCodeCRC16(); - u32 decrypt(const u8 *in, u8* &out); - u32 decompress(const u8 *in, u8* &out); - - bool successLoad; + FWHeader _header; + 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); + u32 _decompress(const u8 *in, u8* &out); public: - CFIRMWARE(): size9(0), size7(0), ARM9bootAddr(0), ARM7bootAddr(0), patched(0), userDataAddr(0x3FE00), successLoad(false) {}; + CFIRMWARE(): _userDataAddr(0x3FE00), _isLoaded(false) {}; bool load(); bool unpack(); @@ -56,43 +419,15 @@ public: static std::string GetExternalFilePath(); - u32 getID() { return header.fw_identifier; } - bool loaded() { return successLoad; } - void *getTouchCalibrate(); - - struct HEADER - { - u16 part3_rom_gui9_addr; // 000h - u16 part4_rom_wifi7_addr; // 002h - u16 part34_gui_wifi_crc16; // 004h - u16 part12_boot_crc16; // 006h - u32 fw_identifier; // 008h - u16 part1_rom_boot9_addr; // 00Ch - u16 part1_ram_boot9_addr; // 00Eh - u16 part2_rom_boot7_addr; // 010h - u16 part2_ram_boot7_addr; // 012h - u16 shift_amounts; // 014h - u16 part5_data_gfx_addr; // 016h - - u8 fw_timestamp[5]; // 018h - u8 console_type; // 01Dh - u16 unused1; // 01Eh - u16 user_settings_offset; // 020h - u16 unknown1; // 022h - u16 unknown2; // 024h - u16 part5_crc16; // 026h - u16 unused2; // 028h - FFh filled - } header; - - u32 ARM9bootAddr; - u32 ARM7bootAddr; - bool patched; + bool loaded(); + void* getTouchCalibrate(); }; int copy_firmware_user_data( u8 *dest_buffer, const u8 *fw_data); -int NDS_CreateDummyFirmware(NDS_fw_config_data *user_settings); -void NDS_FillDefaultFirmwareConfigData(NDS_fw_config_data *fw_config); -void NDS_PatchFirmwareMAC(); + +void NDS_GetDefaultFirmwareConfig(FirmwareConfig &outConfig); +void NDS_InitFirmwareWithConfig(const FirmwareConfig &inConfig); +void NDS_OverrideFirmwareMAC(const u8 inMAC[6]); struct fw_memory_chip { @@ -102,8 +437,9 @@ struct fw_memory_chip u8 addr_size; //size of addr when writing/reading BOOL write_enable; //is write enabled ? - - u8 *data; //memory data + + NDSFirmwareData data; + u32 size; //memory size BOOL writeable_buffer; //is "data" writeable ? int type; //type of Memory @@ -125,4 +461,3 @@ void mc_load_file(fw_memory_chip *mc, const char* filename); /* load save file a void mc_free(fw_memory_chip *mc); /* delete mc memory */ #endif - diff --git a/desmume/src/frontend/cocoa/DefaultUserPrefs.plist b/desmume/src/frontend/cocoa/DefaultUserPrefs.plist index c3324a491..71c12427a 100644 --- a/desmume/src/frontend/cocoa/DefaultUserPrefs.plist +++ b/desmume/src/frontend/cocoa/DefaultUserPrefs.plist @@ -80,6 +80,110 @@ EmulationSlot1_DeviceType 1 + FirmwareConfig_MACAddress + 0 + FirmwareConfig_IPv4Address_AP1_1 + 0 + FirmwareConfig_IPv4Address_AP1_2 + 0 + FirmwareConfig_IPv4Address_AP1_3 + 0 + FirmwareConfig_IPv4Address_AP1_4 + 0 + FirmwareConfig_IPv4Gateway_AP1_1 + 0 + FirmwareConfig_IPv4Gateway_AP1_2 + 0 + FirmwareConfig_IPv4Gateway_AP1_3 + 0 + FirmwareConfig_IPv4Gateway_AP1_4 + 0 + FirmwareConfig_IPv4PrimaryDNS_AP1_1 + 0 + FirmwareConfig_IPv4PrimaryDNS_AP1_2 + 0 + FirmwareConfig_IPv4PrimaryDNS_AP1_3 + 0 + FirmwareConfig_IPv4PrimaryDNS_AP1_4 + 0 + FirmwareConfig_IPv4SecondaryDNS_AP1_1 + 0 + FirmwareConfig_IPv4SecondaryDNS_AP1_2 + 0 + FirmwareConfig_IPv4SecondaryDNS_AP1_3 + 0 + FirmwareConfig_IPv4SecondaryDNS_AP1_4 + 0 + FirmwareConfig_SubnetMask_AP1 + 24 + FirmwareConfig_IPv4Address_AP2_1 + 0 + FirmwareConfig_IPv4Address_AP2_2 + 0 + FirmwareConfig_IPv4Address_AP2_3 + 0 + FirmwareConfig_IPv4Address_AP2_4 + 0 + FirmwareConfig_IPv4Gateway_AP2_1 + 0 + FirmwareConfig_IPv4Gateway_AP2_2 + 0 + FirmwareConfig_IPv4Gateway_AP2_3 + 0 + FirmwareConfig_IPv4Gateway_AP2_4 + 0 + FirmwareConfig_IPv4PrimaryDNS_AP2_1 + 0 + FirmwareConfig_IPv4PrimaryDNS_AP2_2 + 0 + FirmwareConfig_IPv4PrimaryDNS_AP2_3 + 0 + FirmwareConfig_IPv4PrimaryDNS_AP2_4 + 0 + FirmwareConfig_IPv4SecondaryDNS_AP2_1 + 0 + FirmwareConfig_IPv4SecondaryDNS_AP2_2 + 0 + FirmwareConfig_IPv4SecondaryDNS_AP2_3 + 0 + FirmwareConfig_IPv4SecondaryDNS_AP2_4 + 0 + FirmwareConfig_SubnetMask_AP2 + 24 + FirmwareConfig_IPv4Address_AP3_1 + 0 + FirmwareConfig_IPv4Address_AP3_2 + 0 + FirmwareConfig_IPv4Address_AP3_3 + 0 + FirmwareConfig_IPv4Address_AP3_4 + 0 + FirmwareConfig_IPv4Gateway_AP3_1 + 0 + FirmwareConfig_IPv4Gateway_AP3_2 + 0 + FirmwareConfig_IPv4Gateway_AP3_3 + 0 + FirmwareConfig_IPv4Gateway_AP3_4 + 0 + FirmwareConfig_IPv4PrimaryDNS_AP3_1 + 0 + FirmwareConfig_IPv4PrimaryDNS_AP3_2 + 0 + FirmwareConfig_IPv4PrimaryDNS_AP3_3 + 0 + FirmwareConfig_IPv4PrimaryDNS_AP3_4 + 0 + FirmwareConfig_IPv4SecondaryDNS_AP3_1 + 0 + FirmwareConfig_IPv4SecondaryDNS_AP3_2 + 0 + FirmwareConfig_IPv4SecondaryDNS_AP3_3 + 0 + FirmwareConfig_IPv4SecondaryDNS_AP3_4 + 0 + FirmwareConfig_SubnetMask_AP3 + 24 FirmwareConfig_Birthday 2011-06-23T07:00:00Z FirmwareConfig_FavoriteColor diff --git a/desmume/src/frontend/cocoa/cocoa_core.mm b/desmume/src/frontend/cocoa/cocoa_core.mm index 947e78ab0..6225e780f 100644 --- a/desmume/src/frontend/cocoa/cocoa_core.mm +++ b/desmume/src/frontend/cocoa/cocoa_core.mm @@ -734,17 +734,7 @@ volatile bool execute = true; - (void) generateFirmwareMACAddress { - const uint32_t macValue = (uint32_t)random() & 0x00FFFFFF; - - uint8_t newMACAddress[6]; - newMACAddress[0] = 0x00; - newMACAddress[1] = 0x09; - newMACAddress[2] = 0xBF; - newMACAddress[3] = (macValue >> 0) & 0x000000FF; - newMACAddress[4] = (macValue >> 8) & 0x000000FF; - newMACAddress[5] = (macValue >> 16) & 0x000000FF; - - [[self cdsFirmware] setMACAddress:newMACAddress]; + [[self cdsFirmware] generateRandomMACAddress]; [self setFirmwareMACAddressSelectionString:NULL]; } diff --git a/desmume/src/frontend/cocoa/cocoa_firmware.h b/desmume/src/frontend/cocoa/cocoa_firmware.h index 74e8d5785..1d8303951 100644 --- a/desmume/src/frontend/cocoa/cocoa_firmware.h +++ b/desmume/src/frontend/cocoa/cocoa_firmware.h @@ -19,6 +19,7 @@ #import #include +struct FirmwareConfig; /******************************************************************************************** CocoaDSFirmware - OBJECTIVE-C CLASS @@ -30,76 +31,20 @@ ********************************************************************************************/ @interface CocoaDSFirmware : NSObject { - struct NDS_fw_config_data *internalData; + FirmwareConfig *_internalData; NSUInteger _birth_year; - uint8_t _MACAddress[6]; - NSInteger ipv4Address_AP1_1; - NSInteger ipv4Address_AP1_2; - NSInteger ipv4Address_AP1_3; - NSInteger ipv4Address_AP1_4; - NSInteger ipv4Gateway_AP1_1; - NSInteger ipv4Gateway_AP1_2; - NSInteger ipv4Gateway_AP1_3; - NSInteger ipv4Gateway_AP1_4; - NSInteger ipv4PrimaryDNS_AP1_1; - NSInteger ipv4PrimaryDNS_AP1_2; - NSInteger ipv4PrimaryDNS_AP1_3; - NSInteger ipv4PrimaryDNS_AP1_4; - NSInteger ipv4SecondaryDNS_AP1_1; - NSInteger ipv4SecondaryDNS_AP1_2; - NSInteger ipv4SecondaryDNS_AP1_3; - NSInteger ipv4SecondaryDNS_AP1_4; - NSInteger subnetMask_AP1; + NSString *MACAddressString; NSString *subnetMaskString_AP1; - - NSInteger ipv4Address_AP2_1; - NSInteger ipv4Address_AP2_2; - NSInteger ipv4Address_AP2_3; - NSInteger ipv4Address_AP2_4; - NSInteger ipv4Gateway_AP2_1; - NSInteger ipv4Gateway_AP2_2; - NSInteger ipv4Gateway_AP2_3; - NSInteger ipv4Gateway_AP2_4; - NSInteger ipv4PrimaryDNS_AP2_1; - NSInteger ipv4PrimaryDNS_AP2_2; - NSInteger ipv4PrimaryDNS_AP2_3; - NSInteger ipv4PrimaryDNS_AP2_4; - NSInteger ipv4SecondaryDNS_AP2_1; - NSInteger ipv4SecondaryDNS_AP2_2; - NSInteger ipv4SecondaryDNS_AP2_3; - NSInteger ipv4SecondaryDNS_AP2_4; - NSInteger subnetMask_AP2; NSString *subnetMaskString_AP2; - - NSInteger ipv4Address_AP3_1; - NSInteger ipv4Address_AP3_2; - NSInteger ipv4Address_AP3_3; - NSInteger ipv4Address_AP3_4; - NSInteger ipv4Gateway_AP3_1; - NSInteger ipv4Gateway_AP3_2; - NSInteger ipv4Gateway_AP3_3; - NSInteger ipv4Gateway_AP3_4; - NSInteger ipv4PrimaryDNS_AP3_1; - NSInteger ipv4PrimaryDNS_AP3_2; - NSInteger ipv4PrimaryDNS_AP3_3; - NSInteger ipv4PrimaryDNS_AP3_4; - NSInteger ipv4SecondaryDNS_AP3_1; - NSInteger ipv4SecondaryDNS_AP3_2; - NSInteger ipv4SecondaryDNS_AP3_3; - NSInteger ipv4SecondaryDNS_AP3_4; - NSInteger subnetMask_AP3; NSString *subnetMaskString_AP3; - NSInteger backlightLevel; - pthread_mutex_t mutex; } -@property (readonly) struct NDS_fw_config_data *internalData; - // WiFi Info -@property (assign) NSString *MACAddressString; +@property (assign) uint32_t MACAddressValue; +@property (retain) NSString *MACAddressString; // Access Point Settings @property (assign) NSInteger ipv4Address_AP1_1; @@ -168,9 +113,7 @@ @property (assign) NSInteger language; @property (assign) NSInteger backlightLevel; -- (void) setMACAddress:(const uint8_t *)inMACAddress; -- (uint8_t *) MACAddress; - - (void) update; +- (uint32_t) generateRandomMACAddress; @end diff --git a/desmume/src/frontend/cocoa/cocoa_firmware.mm b/desmume/src/frontend/cocoa/cocoa_firmware.mm index b6de0cf10..25e14c5d5 100644 --- a/desmume/src/frontend/cocoa/cocoa_firmware.mm +++ b/desmume/src/frontend/cocoa/cocoa_firmware.mm @@ -25,64 +25,63 @@ @implementation CocoaDSFirmware -@synthesize internalData; +@dynamic MACAddressValue; +@synthesize MACAddressString; -@dynamic MACAddressString; - -@synthesize ipv4Address_AP1_1; -@synthesize ipv4Address_AP1_2; -@synthesize ipv4Address_AP1_3; -@synthesize ipv4Address_AP1_4; -@synthesize ipv4Gateway_AP1_1; -@synthesize ipv4Gateway_AP1_2; -@synthesize ipv4Gateway_AP1_3; -@synthesize ipv4Gateway_AP1_4; -@synthesize ipv4PrimaryDNS_AP1_1; -@synthesize ipv4PrimaryDNS_AP1_2; -@synthesize ipv4PrimaryDNS_AP1_3; -@synthesize ipv4PrimaryDNS_AP1_4; -@synthesize ipv4SecondaryDNS_AP1_1; -@synthesize ipv4SecondaryDNS_AP1_2; -@synthesize ipv4SecondaryDNS_AP1_3; -@synthesize ipv4SecondaryDNS_AP1_4; +@dynamic ipv4Address_AP1_1; +@dynamic ipv4Address_AP1_2; +@dynamic ipv4Address_AP1_3; +@dynamic ipv4Address_AP1_4; +@dynamic ipv4Gateway_AP1_1; +@dynamic ipv4Gateway_AP1_2; +@dynamic ipv4Gateway_AP1_3; +@dynamic ipv4Gateway_AP1_4; +@dynamic ipv4PrimaryDNS_AP1_1; +@dynamic ipv4PrimaryDNS_AP1_2; +@dynamic ipv4PrimaryDNS_AP1_3; +@dynamic ipv4PrimaryDNS_AP1_4; +@dynamic ipv4SecondaryDNS_AP1_1; +@dynamic ipv4SecondaryDNS_AP1_2; +@dynamic ipv4SecondaryDNS_AP1_3; +@dynamic ipv4SecondaryDNS_AP1_4; @dynamic subnetMask_AP1; @synthesize subnetMaskString_AP1; -@synthesize ipv4Address_AP2_1; -@synthesize ipv4Address_AP2_2; -@synthesize ipv4Address_AP2_3; -@synthesize ipv4Address_AP2_4; -@synthesize ipv4Gateway_AP2_1; -@synthesize ipv4Gateway_AP2_2; -@synthesize ipv4Gateway_AP2_3; -@synthesize ipv4Gateway_AP2_4; -@synthesize ipv4PrimaryDNS_AP2_1; -@synthesize ipv4PrimaryDNS_AP2_2; -@synthesize ipv4PrimaryDNS_AP2_3; -@synthesize ipv4PrimaryDNS_AP2_4; -@synthesize ipv4SecondaryDNS_AP2_1; -@synthesize ipv4SecondaryDNS_AP2_2; -@synthesize ipv4SecondaryDNS_AP2_3; -@synthesize ipv4SecondaryDNS_AP2_4; +@dynamic ipv4Address_AP2_1; +@dynamic ipv4Address_AP2_2; +@dynamic ipv4Address_AP2_3; +@dynamic ipv4Address_AP2_4; +@dynamic ipv4Gateway_AP2_1; +@dynamic ipv4Gateway_AP2_2; +@dynamic ipv4Gateway_AP2_3; +@dynamic ipv4Gateway_AP2_4; +@dynamic ipv4PrimaryDNS_AP2_1; +@dynamic ipv4PrimaryDNS_AP2_2; +@dynamic ipv4PrimaryDNS_AP2_3; +@dynamic ipv4PrimaryDNS_AP2_4; +@dynamic ipv4SecondaryDNS_AP2_1; +@dynamic ipv4SecondaryDNS_AP2_2; +@dynamic ipv4SecondaryDNS_AP2_3; +@dynamic ipv4SecondaryDNS_AP2_4; @dynamic subnetMask_AP2; @synthesize subnetMaskString_AP2; -@synthesize ipv4Address_AP3_1; -@synthesize ipv4Address_AP3_2; -@synthesize ipv4Address_AP3_3; -@synthesize ipv4Address_AP3_4; -@synthesize ipv4Gateway_AP3_1; -@synthesize ipv4Gateway_AP3_2; -@synthesize ipv4Gateway_AP3_3; -@synthesize ipv4Gateway_AP3_4; -@synthesize ipv4PrimaryDNS_AP3_1; -@synthesize ipv4PrimaryDNS_AP3_2; -@synthesize ipv4PrimaryDNS_AP3_3; -@synthesize ipv4PrimaryDNS_AP3_4; -@synthesize ipv4SecondaryDNS_AP3_1; -@synthesize ipv4SecondaryDNS_AP3_2; -@synthesize ipv4SecondaryDNS_AP3_3; -@synthesize ipv4SecondaryDNS_AP3_4; +@dynamic ipv4Address_AP3_1; +@dynamic ipv4Address_AP3_2; +@dynamic ipv4Address_AP3_3; +@dynamic ipv4Address_AP3_4; +@dynamic ipv4Gateway_AP3_1; +@dynamic ipv4Gateway_AP3_2; +@dynamic ipv4Gateway_AP3_3; +@dynamic ipv4Gateway_AP3_4; +@dynamic ipv4PrimaryDNS_AP3_1; +@dynamic ipv4PrimaryDNS_AP3_2; +@dynamic ipv4PrimaryDNS_AP3_3; +@dynamic ipv4PrimaryDNS_AP3_4; +@dynamic ipv4SecondaryDNS_AP3_1; +@dynamic ipv4SecondaryDNS_AP3_2; +@dynamic ipv4SecondaryDNS_AP3_3; +@dynamic ipv4SecondaryDNS_AP3_4; @dynamic subnetMask_AP3; @synthesize subnetMaskString_AP3; @@ -92,7 +91,7 @@ @dynamic favoriteColor; @dynamic birthday; @dynamic language; -@synthesize backlightLevel; +@dynamic backlightLevel; - (id)init { @@ -102,81 +101,41 @@ return self; } - internalData = (struct NDS_fw_config_data *)malloc(sizeof(struct NDS_fw_config_data)); - if (internalData == nil) + _internalData = (FirmwareConfig *)malloc(sizeof(FirmwareConfig)); + if (_internalData == nil) { [self release]; return nil; } - NDS_FillDefaultFirmwareConfigData(internalData); - - _MACAddress[0] = 0x00; - _MACAddress[1] = 0x09; - _MACAddress[2] = 0xBF; - _MACAddress[3] = 0x12; - _MACAddress[4] = 0x34; - _MACAddress[5] = 0x56; + NDS_GetDefaultFirmwareConfig(*_internalData); _birth_year = 1970; - backlightLevel = 3; - ipv4Address_AP1_1 = 0; - ipv4Address_AP1_2 = 0; - ipv4Address_AP1_3 = 0; - ipv4Address_AP1_4 = 0; - ipv4Gateway_AP1_1 = 0; - ipv4Gateway_AP1_2 = 0; - ipv4Gateway_AP1_3 = 0; - ipv4Gateway_AP1_4 = 0; - ipv4PrimaryDNS_AP1_1 = 0; - ipv4PrimaryDNS_AP1_2 = 0; - ipv4PrimaryDNS_AP1_3 = 0; - ipv4PrimaryDNS_AP1_4 = 0; - ipv4SecondaryDNS_AP1_1 = 0; - ipv4SecondaryDNS_AP1_2 = 0; - ipv4SecondaryDNS_AP1_3 = 0; - ipv4SecondaryDNS_AP1_4 = 0; - subnetMask_AP1 = 0; - subnetMaskString_AP1 = @"0.0.0.0"; + MACAddressString = [[NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X", + _internalData->MACAddress[0], _internalData->MACAddress[1], _internalData->MACAddress[2], + _internalData->MACAddress[3], _internalData->MACAddress[4], _internalData->MACAddress[5]] retain]; - ipv4Address_AP2_1 = 0; - ipv4Address_AP2_2 = 0; - ipv4Address_AP2_3 = 0; - ipv4Address_AP2_4 = 0; - ipv4Gateway_AP2_1 = 0; - ipv4Gateway_AP2_2 = 0; - ipv4Gateway_AP2_3 = 0; - ipv4Gateway_AP2_4 = 0; - ipv4PrimaryDNS_AP2_1 = 0; - ipv4PrimaryDNS_AP2_2 = 0; - ipv4PrimaryDNS_AP2_3 = 0; - ipv4PrimaryDNS_AP2_4 = 0; - ipv4SecondaryDNS_AP2_1 = 0; - ipv4SecondaryDNS_AP2_2 = 0; - ipv4SecondaryDNS_AP2_3 = 0; - ipv4SecondaryDNS_AP2_4 = 0; - subnetMask_AP2 = 0; - subnetMaskString_AP2 = @"0.0.0.0"; + uint32_t subnetMaskValue = (_internalData->subnetMask_AP1 == 0) ? 0 : (0xFFFFFFFF << (32 - _internalData->subnetMask_AP1)); + subnetMaskString_AP1 = [[NSString stringWithFormat:@"%d.%d.%d.%d", + (subnetMaskValue >> 24) & 0x000000FF, + (subnetMaskValue >> 16) & 0x000000FF, + (subnetMaskValue >> 8) & 0x000000FF, + (subnetMaskValue >> 0) & 0x000000FF] retain]; - ipv4Address_AP3_1 = 0; - ipv4Address_AP3_2 = 0; - ipv4Address_AP3_3 = 0; - ipv4Address_AP3_4 = 0; - ipv4Gateway_AP3_1 = 0; - ipv4Gateway_AP3_2 = 0; - ipv4Gateway_AP3_3 = 0; - ipv4Gateway_AP3_4 = 0; - ipv4PrimaryDNS_AP3_1 = 0; - ipv4PrimaryDNS_AP3_2 = 0; - ipv4PrimaryDNS_AP3_3 = 0; - ipv4PrimaryDNS_AP3_4 = 0; - ipv4SecondaryDNS_AP3_1 = 0; - ipv4SecondaryDNS_AP3_2 = 0; - ipv4SecondaryDNS_AP3_3 = 0; - ipv4SecondaryDNS_AP3_4 = 0; - subnetMask_AP3 = 0; - subnetMaskString_AP3 = @"0.0.0.0"; + subnetMaskValue = (_internalData->subnetMask_AP2 == 0) ? 0 : (0xFFFFFFFF << (32 - _internalData->subnetMask_AP2)); + subnetMaskString_AP2 = [[NSString stringWithFormat:@"%d.%d.%d.%d", + (subnetMaskValue >> 24) & 0x000000FF, + (subnetMaskValue >> 16) & 0x000000FF, + (subnetMaskValue >> 8) & 0x000000FF, + (subnetMaskValue >> 0) & 0x000000FF] retain]; + + subnetMaskValue = (_internalData->subnetMask_AP3 == 0) ? 0 : (0xFFFFFFFF << (32 - _internalData->subnetMask_AP3)); + subnetMaskString_AP3 = [[NSString stringWithFormat:@"%d.%d.%d.%d", + (subnetMaskValue >> 24) & 0x000000FF, + (subnetMaskValue >> 16) & 0x000000FF, + (subnetMaskValue >> 8) & 0x000000FF, + (subnetMaskValue >> 0) & 0x000000FF] retain]; pthread_mutex_init(&mutex, NULL); @@ -185,11 +144,12 @@ - (void)dealloc { - free(internalData); - internalData = NULL; + free(_internalData); + _internalData = NULL; pthread_mutex_destroy(&mutex); + [self setMACAddressString:nil]; [self setSubnetMaskString_AP1:nil]; [self setSubnetMaskString_AP2:nil]; [self setSubnetMaskString_AP3:nil]; @@ -197,43 +157,289 @@ [super dealloc]; } -- (void) setMACAddress:(const uint8_t *)inMACAddress +- (void) setMACAddressValue:(uint32_t)inMACAddressValue { - if (inMACAddress == NULL) - { - return; - } - pthread_mutex_lock(&mutex); - _MACAddress[0] = 0x00; - _MACAddress[1] = 0x09; - _MACAddress[2] = 0xBF; - _MACAddress[3] = inMACAddress[3]; - _MACAddress[4] = inMACAddress[4]; - _MACAddress[5] = inMACAddress[5]; + _internalData->MACAddress[0] = 0x00; + _internalData->MACAddress[1] = 0x09; + _internalData->MACAddress[2] = 0xBF; + _internalData->MACAddress[3] = (inMACAddressValue >> 8) & 0xFF; + _internalData->MACAddress[4] = (inMACAddressValue >> 16) & 0xFF; + _internalData->MACAddress[5] = (inMACAddressValue >> 24) & 0xFF; pthread_mutex_unlock(&mutex); - [self setMACAddressString:NULL]; -} - -- (uint8_t *) MACAddress -{ - return _MACAddress; -} - -- (void) setMACAddressString:(NSString *)theMACAddressString -{ - // Do nothing. This is here for KVO-compliance only. -} - -- (NSString *) MACAddressString -{ - pthread_mutex_lock(&mutex); NSString *theMACAddressString = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X", - _MACAddress[0], _MACAddress[1], _MACAddress[2], _MACAddress[3], _MACAddress[4], _MACAddress[5]]; + _internalData->MACAddress[0], _internalData->MACAddress[1], _internalData->MACAddress[2], + _internalData->MACAddress[3], _internalData->MACAddress[4], _internalData->MACAddress[5]]; + + [self setMACAddressString:theMACAddressString]; +} + +- (uint32_t) MACAddressValue +{ + uint32_t outMACAddressValue = 0; + outMACAddressValue |= (_internalData->MACAddress[2] << 0); + outMACAddressValue |= (_internalData->MACAddress[3] << 8); + outMACAddressValue |= (_internalData->MACAddress[4] << 16); + outMACAddressValue |= (_internalData->MACAddress[5] << 24); + + return outMACAddressValue; +} + +- (void) setIpv4Address_AP1_1:(NSInteger)ipv4AddressPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4Address_AP1[0] = ipv4AddressPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4Address_AP1_1 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4AddressPart = _internalData->ipv4Address_AP1[0]; pthread_mutex_unlock(&mutex); - return theMACAddressString; + return ipv4AddressPart; +} + +- (void) setIpv4Address_AP1_2:(NSInteger)ipv4AddressPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4Address_AP1[1] = ipv4AddressPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4Address_AP1_2 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4AddressPart = _internalData->ipv4Address_AP1[1]; + pthread_mutex_unlock(&mutex); + + return ipv4AddressPart; +} + +- (void) setIpv4Address_AP1_3:(NSInteger)ipv4AddressPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4Address_AP1[2] = ipv4AddressPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4Address_AP1_3 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4AddressPart = _internalData->ipv4Address_AP1[2]; + pthread_mutex_unlock(&mutex); + + return ipv4AddressPart; +} + +- (void) setIpv4Address_AP1_4:(NSInteger)ipv4AddressPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4Address_AP1[3] = ipv4AddressPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4Address_AP1_4 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4AddressPart = _internalData->ipv4Address_AP1[3]; + pthread_mutex_unlock(&mutex); + + return ipv4AddressPart; +} + +- (void) setIpv4Gateway_AP1_1:(NSInteger)ipv4GatewayPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4Gateway_AP1[0] = ipv4GatewayPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4Gateway_AP1_1 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4GatewayPart = _internalData->ipv4Gateway_AP1[0]; + pthread_mutex_unlock(&mutex); + + return ipv4GatewayPart; +} + +- (void) setIpv4Gateway_AP1_2:(NSInteger)ipv4GatewayPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4Gateway_AP1[1] = ipv4GatewayPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4Gateway_AP1_2 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4GatewayPart = _internalData->ipv4Gateway_AP1[1]; + pthread_mutex_unlock(&mutex); + + return ipv4GatewayPart; +} + +- (void) setIpv4Gateway_AP1_3:(NSInteger)ipv4GatewayPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4Gateway_AP1[2] = ipv4GatewayPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4Gateway_AP1_3 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4GatewayPart = _internalData->ipv4Gateway_AP1[2]; + pthread_mutex_unlock(&mutex); + + return ipv4GatewayPart; +} + +- (void) setIpv4Gateway_AP1_4:(NSInteger)ipv4GatewayPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4Gateway_AP1[3] = ipv4GatewayPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4Gateway_AP1_4 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4GatewayPart = _internalData->ipv4Gateway_AP1[3]; + pthread_mutex_unlock(&mutex); + + return ipv4GatewayPart; +} + +- (void) setIpv4PrimaryDNS_AP1_1:(NSInteger)ipv4PrimaryDNSPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4PrimaryDNS_AP1[0] = ipv4PrimaryDNSPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4PrimaryDNS_AP1_1 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4PrimaryDNSPart = _internalData->ipv4PrimaryDNS_AP1[0]; + pthread_mutex_unlock(&mutex); + + return ipv4PrimaryDNSPart; +} + +- (void) setIpv4PrimaryDNS_AP1_2:(NSInteger)ipv4PrimaryDNSPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4PrimaryDNS_AP1[1] = ipv4PrimaryDNSPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4PrimaryDNS_AP1_2 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4PrimaryDNSPart = _internalData->ipv4PrimaryDNS_AP1[1]; + pthread_mutex_unlock(&mutex); + + return ipv4PrimaryDNSPart; +} + +- (void) setIpv4PrimaryDNS_AP1_3:(NSInteger)ipv4PrimaryDNSPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4PrimaryDNS_AP1[2] = ipv4PrimaryDNSPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4PrimaryDNS_AP1_3 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4PrimaryDNSPart = _internalData->ipv4PrimaryDNS_AP1[2]; + pthread_mutex_unlock(&mutex); + + return ipv4PrimaryDNSPart; +} + +- (void) setIpv4PrimaryDNS_AP1_4:(NSInteger)ipv4PrimaryDNSPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4PrimaryDNS_AP1[3] = ipv4PrimaryDNSPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4PrimaryDNS_AP1_4 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4PrimaryDNSPart = _internalData->ipv4PrimaryDNS_AP1[3]; + pthread_mutex_unlock(&mutex); + + return ipv4PrimaryDNSPart; +} + +- (void) setIpv4SecondaryDNS_AP1_1:(NSInteger)ipv4SecondaryDNSPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4SecondaryDNS_AP1[0] = ipv4SecondaryDNSPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4SecondaryDNS_AP1_1 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4SecondaryDNSPart = _internalData->ipv4SecondaryDNS_AP1[0]; + pthread_mutex_unlock(&mutex); + + return ipv4SecondaryDNSPart; +} + +- (void) setIpv4SecondaryDNS_AP1_2:(NSInteger)ipv4SecondaryDNSPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4SecondaryDNS_AP1[1] = ipv4SecondaryDNSPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4SecondaryDNS_AP1_2 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4SecondaryDNSPart = _internalData->ipv4SecondaryDNS_AP1[1]; + pthread_mutex_unlock(&mutex); + + return ipv4SecondaryDNSPart; +} + +- (void) setIpv4SecondaryDNS_AP1_3:(NSInteger)ipv4SecondaryDNSPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4SecondaryDNS_AP1[2] = ipv4SecondaryDNSPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4SecondaryDNS_AP1_3 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4SecondaryDNSPart = _internalData->ipv4SecondaryDNS_AP1[2]; + pthread_mutex_unlock(&mutex); + + return ipv4SecondaryDNSPart; +} + +- (void) setIpv4SecondaryDNS_AP1_4:(NSInteger)ipv4SecondaryDNSPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4SecondaryDNS_AP1[3] = ipv4SecondaryDNSPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4SecondaryDNS_AP1_4 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4SecondaryDNSPart = _internalData->ipv4SecondaryDNS_AP1[3]; + pthread_mutex_unlock(&mutex); + + return ipv4SecondaryDNSPart; } - (void) setSubnetMask_AP1:(NSInteger)subnetMask @@ -248,10 +454,10 @@ } pthread_mutex_lock(&mutex); - subnetMask_AP1 = subnetMask; - const uint32_t subnetMaskValue = (subnetMask_AP1 == 0) ? 0 : (0xFFFFFFFF << (32 - subnetMask_AP1)); + _internalData->subnetMask_AP1 = subnetMask; pthread_mutex_unlock(&mutex); + const uint32_t subnetMaskValue = (subnetMask == 0) ? 0 : (0xFFFFFFFF << (32 - subnetMask)); NSString *subnetMaskString = [NSString stringWithFormat:@"%d.%d.%d.%d", (subnetMaskValue >> 24) & 0x000000FF, (subnetMaskValue >> 16) & 0x000000FF, @@ -264,12 +470,268 @@ - (NSInteger) subnetMask_AP1 { pthread_mutex_lock(&mutex); - const NSInteger subnetMask = subnetMask_AP1; + const NSInteger subnetMask = _internalData->subnetMask_AP1; pthread_mutex_unlock(&mutex); return subnetMask; } +- (void) setIpv4Address_AP2_1:(NSInteger)ipv4AddressPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4Address_AP2[0] = ipv4AddressPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4Address_AP2_1 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4AddressPart = _internalData->ipv4Address_AP2[0]; + pthread_mutex_unlock(&mutex); + + return ipv4AddressPart; +} + +- (void) setIpv4Address_AP2_2:(NSInteger)ipv4AddressPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4Address_AP2[1] = ipv4AddressPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4Address_AP2_2 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4AddressPart = _internalData->ipv4Address_AP2[1]; + pthread_mutex_unlock(&mutex); + + return ipv4AddressPart; +} + +- (void) setIpv4Address_AP2_3:(NSInteger)ipv4AddressPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4Address_AP2[2] = ipv4AddressPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4Address_AP2_3 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4AddressPart = _internalData->ipv4Address_AP2[2]; + pthread_mutex_unlock(&mutex); + + return ipv4AddressPart; +} + +- (void) setIpv4Address_AP2_4:(NSInteger)ipv4AddressPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4Address_AP2[3] = ipv4AddressPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4Address_AP2_4 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4AddressPart = _internalData->ipv4Address_AP2[3]; + pthread_mutex_unlock(&mutex); + + return ipv4AddressPart; +} + +- (void) setIpv4Gateway_AP2_1:(NSInteger)ipv4GatewayPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4Gateway_AP2[0] = ipv4GatewayPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4Gateway_AP2_1 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4GatewayPart = _internalData->ipv4Gateway_AP2[0]; + pthread_mutex_unlock(&mutex); + + return ipv4GatewayPart; +} + +- (void) setIpv4Gateway_AP2_2:(NSInteger)ipv4GatewayPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4Gateway_AP2[1] = ipv4GatewayPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4Gateway_AP2_2 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4GatewayPart = _internalData->ipv4Gateway_AP2[1]; + pthread_mutex_unlock(&mutex); + + return ipv4GatewayPart; +} + +- (void) setIpv4Gateway_AP2_3:(NSInteger)ipv4GatewayPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4Gateway_AP2[2] = ipv4GatewayPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4Gateway_AP2_3 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4GatewayPart = _internalData->ipv4Gateway_AP2[2]; + pthread_mutex_unlock(&mutex); + + return ipv4GatewayPart; +} + +- (void) setIpv4Gateway_AP2_4:(NSInteger)ipv4GatewayPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4Gateway_AP2[3] = ipv4GatewayPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4Gateway_AP2_4 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4GatewayPart = _internalData->ipv4Gateway_AP2[3]; + pthread_mutex_unlock(&mutex); + + return ipv4GatewayPart; +} + +- (void) setIpv4PrimaryDNS_AP2_1:(NSInteger)ipv4PrimaryDNSPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4PrimaryDNS_AP2[0] = ipv4PrimaryDNSPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4PrimaryDNS_AP2_1 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4PrimaryDNSPart = _internalData->ipv4PrimaryDNS_AP2[0]; + pthread_mutex_unlock(&mutex); + + return ipv4PrimaryDNSPart; +} + +- (void) setIpv4PrimaryDNS_AP2_2:(NSInteger)ipv4PrimaryDNSPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4PrimaryDNS_AP2[1] = ipv4PrimaryDNSPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4PrimaryDNS_AP2_2 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4PrimaryDNSPart = _internalData->ipv4PrimaryDNS_AP2[1]; + pthread_mutex_unlock(&mutex); + + return ipv4PrimaryDNSPart; +} + +- (void) setIpv4PrimaryDNS_AP2_3:(NSInteger)ipv4PrimaryDNSPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4PrimaryDNS_AP2[2] = ipv4PrimaryDNSPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4PrimaryDNS_AP2_3 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4PrimaryDNSPart = _internalData->ipv4PrimaryDNS_AP2[2]; + pthread_mutex_unlock(&mutex); + + return ipv4PrimaryDNSPart; +} + +- (void) setIpv4PrimaryDNS_AP2_4:(NSInteger)ipv4PrimaryDNSPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4PrimaryDNS_AP2[3] = ipv4PrimaryDNSPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4PrimaryDNS_AP2_4 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4PrimaryDNSPart = _internalData->ipv4PrimaryDNS_AP2[3]; + pthread_mutex_unlock(&mutex); + + return ipv4PrimaryDNSPart; +} + +- (void) setIpv4SecondaryDNS_AP2_1:(NSInteger)ipv4SecondaryDNSPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4SecondaryDNS_AP2[0] = ipv4SecondaryDNSPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4SecondaryDNS_AP2_1 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4SecondaryDNSPart = _internalData->ipv4SecondaryDNS_AP2[0]; + pthread_mutex_unlock(&mutex); + + return ipv4SecondaryDNSPart; +} + +- (void) setIpv4SecondaryDNS_AP2_2:(NSInteger)ipv4SecondaryDNSPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4SecondaryDNS_AP2[1] = ipv4SecondaryDNSPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4SecondaryDNS_AP2_2 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4SecondaryDNSPart = _internalData->ipv4SecondaryDNS_AP2[1]; + pthread_mutex_unlock(&mutex); + + return ipv4SecondaryDNSPart; +} + +- (void) setIpv4SecondaryDNS_AP2_3:(NSInteger)ipv4SecondaryDNSPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4SecondaryDNS_AP2[2] = ipv4SecondaryDNSPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4SecondaryDNS_AP2_3 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4SecondaryDNSPart = _internalData->ipv4SecondaryDNS_AP2[2]; + pthread_mutex_unlock(&mutex); + + return ipv4SecondaryDNSPart; +} + +- (void) setIpv4SecondaryDNS_AP2_4:(NSInteger)ipv4SecondaryDNSPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4SecondaryDNS_AP2[3] = ipv4SecondaryDNSPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4SecondaryDNS_AP2_4 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4SecondaryDNSPart = _internalData->ipv4SecondaryDNS_AP2[3]; + pthread_mutex_unlock(&mutex); + + return ipv4SecondaryDNSPart; +} + - (void) setSubnetMask_AP2:(NSInteger)subnetMask { if (subnetMask > 28) @@ -282,10 +744,10 @@ } pthread_mutex_lock(&mutex); - subnetMask_AP2 = subnetMask; - const uint32_t subnetMaskValue = (subnetMask_AP2 == 0) ? 0 : (0xFFFFFFFF << (32 - subnetMask_AP2)); + _internalData->subnetMask_AP2 = subnetMask; pthread_mutex_unlock(&mutex); + const uint32_t subnetMaskValue = (subnetMask == 0) ? 0 : (0xFFFFFFFF << (32 - subnetMask)); NSString *subnetMaskString = [NSString stringWithFormat:@"%d.%d.%d.%d", (subnetMaskValue >> 24) & 0x000000FF, (subnetMaskValue >> 16) & 0x000000FF, @@ -298,12 +760,268 @@ - (NSInteger) subnetMask_AP2 { pthread_mutex_lock(&mutex); - const NSInteger subnetMask = subnetMask_AP2; + const NSInteger subnetMask = _internalData->subnetMask_AP2; pthread_mutex_unlock(&mutex); return subnetMask; } +- (void) setIpv4Address_AP3_1:(NSInteger)ipv4AddressPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4Address_AP3[0] = ipv4AddressPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4Address_AP3_1 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4AddressPart = _internalData->ipv4Address_AP3[0]; + pthread_mutex_unlock(&mutex); + + return ipv4AddressPart; +} + +- (void) setIpv4Address_AP3_2:(NSInteger)ipv4AddressPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4Address_AP3[1] = ipv4AddressPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4Address_AP3_2 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4AddressPart = _internalData->ipv4Address_AP3[1]; + pthread_mutex_unlock(&mutex); + + return ipv4AddressPart; +} + +- (void) setIpv4Address_AP3_3:(NSInteger)ipv4AddressPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4Address_AP3[2] = ipv4AddressPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4Address_AP3_3 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4AddressPart = _internalData->ipv4Address_AP3[2]; + pthread_mutex_unlock(&mutex); + + return ipv4AddressPart; +} + +- (void) setIpv4Address_AP3_4:(NSInteger)ipv4AddressPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4Address_AP3[3] = ipv4AddressPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4Address_AP3_4 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4AddressPart = _internalData->ipv4Address_AP3[3]; + pthread_mutex_unlock(&mutex); + + return ipv4AddressPart; +} + +- (void) setIpv4Gateway_AP3_1:(NSInteger)ipv4GatewayPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4Gateway_AP3[0] = ipv4GatewayPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4Gateway_AP3_1 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4GatewayPart = _internalData->ipv4Gateway_AP3[0]; + pthread_mutex_unlock(&mutex); + + return ipv4GatewayPart; +} + +- (void) setIpv4Gateway_AP3_2:(NSInteger)ipv4GatewayPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4Gateway_AP3[1] = ipv4GatewayPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4Gateway_AP3_2 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4GatewayPart = _internalData->ipv4Gateway_AP3[1]; + pthread_mutex_unlock(&mutex); + + return ipv4GatewayPart; +} + +- (void) setIpv4Gateway_AP3_3:(NSInteger)ipv4GatewayPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4Gateway_AP3[2] = ipv4GatewayPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4Gateway_AP3_3 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4GatewayPart = _internalData->ipv4Gateway_AP3[2]; + pthread_mutex_unlock(&mutex); + + return ipv4GatewayPart; +} + +- (void) setIpv4Gateway_AP3_4:(NSInteger)ipv4GatewayPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4Gateway_AP3[3] = ipv4GatewayPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4Gateway_AP3_4 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4GatewayPart = _internalData->ipv4Gateway_AP3[3]; + pthread_mutex_unlock(&mutex); + + return ipv4GatewayPart; +} + +- (void) setIpv4PrimaryDNS_AP3_1:(NSInteger)ipv4PrimaryDNSPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4PrimaryDNS_AP3[0] = ipv4PrimaryDNSPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4PrimaryDNS_AP3_1 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4PrimaryDNSPart = _internalData->ipv4PrimaryDNS_AP3[0]; + pthread_mutex_unlock(&mutex); + + return ipv4PrimaryDNSPart; +} + +- (void) setIpv4PrimaryDNS_AP3_2:(NSInteger)ipv4PrimaryDNSPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4PrimaryDNS_AP3[1] = ipv4PrimaryDNSPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4PrimaryDNS_AP3_2 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4PrimaryDNSPart = _internalData->ipv4PrimaryDNS_AP3[1]; + pthread_mutex_unlock(&mutex); + + return ipv4PrimaryDNSPart; +} + +- (void) setIpv4PrimaryDNS_AP3_3:(NSInteger)ipv4PrimaryDNSPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4PrimaryDNS_AP3[2] = ipv4PrimaryDNSPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4PrimaryDNS_AP3_3 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4PrimaryDNSPart = _internalData->ipv4PrimaryDNS_AP3[2]; + pthread_mutex_unlock(&mutex); + + return ipv4PrimaryDNSPart; +} + +- (void) setIpv4PrimaryDNS_AP3_4:(NSInteger)ipv4PrimaryDNSPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4PrimaryDNS_AP3[3] = ipv4PrimaryDNSPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4PrimaryDNS_AP3_4 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4PrimaryDNSPart = _internalData->ipv4PrimaryDNS_AP3[3]; + pthread_mutex_unlock(&mutex); + + return ipv4PrimaryDNSPart; +} + +- (void) setIpv4SecondaryDNS_AP3_1:(NSInteger)ipv4SecondaryDNSPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4SecondaryDNS_AP3[0] = ipv4SecondaryDNSPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4SecondaryDNS_AP3_1 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4SecondaryDNSPart = _internalData->ipv4SecondaryDNS_AP3[0]; + pthread_mutex_unlock(&mutex); + + return ipv4SecondaryDNSPart; +} + +- (void) setIpv4SecondaryDNS_AP3_2:(NSInteger)ipv4SecondaryDNSPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4SecondaryDNS_AP3[1] = ipv4SecondaryDNSPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4SecondaryDNS_AP3_2 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4SecondaryDNSPart = _internalData->ipv4SecondaryDNS_AP3[1]; + pthread_mutex_unlock(&mutex); + + return ipv4SecondaryDNSPart; +} + +- (void) setIpv4SecondaryDNS_AP3_3:(NSInteger)ipv4SecondaryDNSPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4SecondaryDNS_AP3[2] = ipv4SecondaryDNSPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4SecondaryDNS_AP3_3 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4SecondaryDNSPart = _internalData->ipv4SecondaryDNS_AP3[2]; + pthread_mutex_unlock(&mutex); + + return ipv4SecondaryDNSPart; +} + +- (void) setIpv4SecondaryDNS_AP3_4:(NSInteger)ipv4SecondaryDNSPart +{ + pthread_mutex_lock(&mutex); + _internalData->ipv4SecondaryDNS_AP3[3] = ipv4SecondaryDNSPart; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) ipv4SecondaryDNS_AP3_4 +{ + pthread_mutex_lock(&mutex); + const NSInteger ipv4SecondaryDNSPart = _internalData->ipv4SecondaryDNS_AP3[3]; + pthread_mutex_unlock(&mutex); + + return ipv4SecondaryDNSPart; +} + - (void) setSubnetMask_AP3:(NSInteger)subnetMask { if (subnetMask > 28) @@ -316,10 +1034,10 @@ } pthread_mutex_lock(&mutex); - subnetMask_AP3 = subnetMask; - const uint32_t subnetMaskValue = (subnetMask_AP3 == 0) ? 0 : (0xFFFFFFFF << (32 - subnetMask_AP3)); + _internalData->subnetMask_AP3 = subnetMask; pthread_mutex_unlock(&mutex); + const uint32_t subnetMaskValue = (subnetMask == 0) ? 0 : (0xFFFFFFFF << (32 - subnetMask)); NSString *subnetMaskString = [NSString stringWithFormat:@"%d.%d.%d.%d", (subnetMaskValue >> 24) & 0x000000FF, (subnetMaskValue >> 16) & 0x000000FF, @@ -332,7 +1050,7 @@ - (NSInteger) subnetMask_AP3 { pthread_mutex_lock(&mutex); - const NSInteger subnetMask = subnetMask_AP3; + const NSInteger subnetMask = _internalData->subnetMask_AP3; pthread_mutex_unlock(&mutex); return subnetMask; @@ -341,14 +1059,14 @@ - (void) setConsoleType:(NSInteger)theType { pthread_mutex_lock(&mutex); - internalData->ds_type = (NDS_CONSOLE_TYPE)theType; + _internalData->consoleType = (NDS_CONSOLE_TYPE)theType; pthread_mutex_unlock(&mutex); } - (NSInteger) consoleType { pthread_mutex_lock(&mutex); - NSInteger theType = internalData->ds_type; + NSInteger theType = _internalData->consoleType; pthread_mutex_unlock(&mutex); return theType; @@ -367,7 +1085,7 @@ characterRange.length = MAX_FW_NICKNAME_LENGTH; } - [theNickname getBytes:&internalData->nickname[0] + [theNickname getBytes:&_internalData->nickname[0] maxLength:(sizeof(UInt16) * characterRange.length) usedLength:NULL encoding:NSUTF16LittleEndianStringEncoding @@ -375,12 +1093,12 @@ range:characterRange remainingRange:NULL]; - internalData->nickname_len = (u8)characterRange.length; + _internalData->nicknameLength = (u8)characterRange.length; } else { - memset(&internalData->nickname[0], 0, sizeof(internalData->nickname)); - internalData->nickname_len = 0; + memset(&_internalData->nickname[0], 0, sizeof(_internalData->nickname)); + _internalData->nicknameLength = 0; } pthread_mutex_unlock(&mutex); @@ -389,7 +1107,7 @@ - (NSString *) nickname { pthread_mutex_lock(&mutex); - NSString *theNickname = [[[NSString alloc] initWithBytes:&internalData->nickname[0] length:(sizeof(UInt16) * internalData->nickname_len) encoding:NSUTF16LittleEndianStringEncoding] autorelease]; + NSString *theNickname = [[[NSString alloc] initWithBytes:&_internalData->nickname[0] length:(sizeof(UInt16) * _internalData->nicknameLength) encoding:NSUTF16LittleEndianStringEncoding] autorelease]; pthread_mutex_unlock(&mutex); return theNickname; @@ -408,7 +1126,7 @@ characterRange.length = MAX_FW_MESSAGE_LENGTH; } - [theMessage getBytes:&internalData->message[0] + [theMessage getBytes:&_internalData->message[0] maxLength:(sizeof(UInt16) * characterRange.length) usedLength:NULL encoding:NSUTF16LittleEndianStringEncoding @@ -416,12 +1134,12 @@ range:characterRange remainingRange:NULL]; - internalData->message_len = (u8)characterRange.length; + _internalData->messageLength = (u8)characterRange.length; } else { - memset(&internalData->message[0], 0, sizeof(internalData->message)); - internalData->message_len = 0; + memset(&_internalData->message[0], 0, sizeof(_internalData->message)); + _internalData->messageLength = 0; } pthread_mutex_unlock(&mutex); @@ -430,7 +1148,7 @@ - (NSString *) message { pthread_mutex_lock(&mutex); - NSString *theMessage = [[[NSString alloc] initWithBytes:&internalData->message[0] length:(sizeof(UInt16) * internalData->message_len) encoding:NSUTF16LittleEndianStringEncoding] autorelease]; + NSString *theMessage = [[[NSString alloc] initWithBytes:&_internalData->message[0] length:(sizeof(UInt16) * _internalData->messageLength) encoding:NSUTF16LittleEndianStringEncoding] autorelease]; pthread_mutex_unlock(&mutex); return theMessage; @@ -439,14 +1157,14 @@ - (void) setFavoriteColor:(NSInteger)colorID { pthread_mutex_lock(&mutex); - internalData->fav_colour = (u8)colorID; + _internalData->favoriteColor = (u8)colorID; pthread_mutex_unlock(&mutex); } - (NSInteger) favoriteColor { pthread_mutex_lock(&mutex); - NSInteger theFavoriteColorID = internalData->fav_colour; + NSInteger theFavoriteColorID = _internalData->favoriteColor; pthread_mutex_unlock(&mutex); return theFavoriteColorID; @@ -471,14 +1189,14 @@ [dateFormatter release]; - internalData->birth_month = (u8)theMonth; - internalData->birth_day = (u8)theDay; + _internalData->birthdayMonth = (u8)theMonth; + _internalData->birthdayDay = (u8)theDay; _birth_year = theYear; } else { - internalData->birth_month = 1; - internalData->birth_day = 1; + _internalData->birthdayMonth = 1; + _internalData->birthdayDay = 1; _birth_year = 1970; } @@ -488,7 +1206,7 @@ - (NSDate *) birthday { pthread_mutex_lock(&mutex); - NSDate *theBirthday = [NSDate dateWithString:[NSString stringWithFormat:@"%ld-%ld-%ld 12:00:00 +0000", (unsigned long)_birth_year, (unsigned long)internalData->birth_month, (unsigned long)internalData->birth_day]]; + NSDate *theBirthday = [NSDate dateWithString:[NSString stringWithFormat:@"%ld-%ld-%ld 12:00:00 +0000", (unsigned long)_birth_year, (unsigned long)_internalData->birthdayMonth, (unsigned long)_internalData->birthdayDay]]; pthread_mutex_unlock(&mutex); return theBirthday; @@ -497,145 +1215,64 @@ - (void) setLanguage:(NSInteger)languageID { pthread_mutex_lock(&mutex); - internalData->language = (u8)languageID; + _internalData->language = (u8)languageID; pthread_mutex_unlock(&mutex); } - (NSInteger) language { pthread_mutex_lock(&mutex); - NSInteger theLanguageID = internalData->language; + NSInteger theLanguageID = _internalData->language; pthread_mutex_unlock(&mutex); return theLanguageID; } -// TODO: Remove this function after firmware.cpp is reworked. -// This is just a direct copy-paste of the function from there. -static u32 calc_CRC16( u32 start, const u8 *data, int count) +- (void) setBacklightLevel:(NSInteger)level { - int i,j; - u32 crc = start & 0xffff; - const u16 val[8] = { 0xC0C1,0xC181,0xC301,0xC601,0xCC01,0xD801,0xF001,0xA001 }; - for(i = 0; i < count; i++) - { - crc = crc ^ data[i]; - - for(j = 0; j < 8; j++) { - int do_bit = 0; - - if ( crc & 0x1) - do_bit = 1; - - crc = crc >> 1; - - if ( do_bit) { - crc = crc ^ (val[j] << (7-j)); - } - } - } - return crc; + pthread_mutex_lock(&mutex); + _internalData->backlightLevel = (u8)level; + pthread_mutex_unlock(&mutex); +} + +- (NSInteger) backlightLevel +{ + pthread_mutex_lock(&mutex); + NSInteger level = _internalData->backlightLevel; + pthread_mutex_unlock(&mutex); + + return level; } - (void) update { - // Write the attributes to the DS via the data struct. - // We have make a copy of the struct and send that so that the firmware - // changes get saved in CommonSettings.InternalFirmwareConf. pthread_mutex_lock(&mutex); - - struct NDS_fw_config_data newFirmwareData = *internalData; - NDS_CreateDummyFirmware(&newFirmwareData); - - // WiFi Info - MMU.fw.data[0x36] = _MACAddress[0]; - MMU.fw.data[0x37] = _MACAddress[1]; - MMU.fw.data[0x38] = _MACAddress[2]; - MMU.fw.data[0x39] = _MACAddress[3]; - MMU.fw.data[0x3A] = _MACAddress[4]; - MMU.fw.data[0x3B] = _MACAddress[5]; - *(u16 *)&MMU.fw.data[0x2A] = calc_CRC16(0, &MMU.fw.data[0x2C], 0x138); - - // Access Point Settings - MMU.fw.data[0x3FA40] = 'S'; - MMU.fw.data[0x3FA41] = 'o'; - MMU.fw.data[0x3FA42] = 'f'; - MMU.fw.data[0x3FA43] = 't'; - MMU.fw.data[0x3FA44] = 'A'; - MMU.fw.data[0x3FA45] = 'P'; - MMU.fw.data[0x3FAC0] = ipv4Address_AP1_1; - MMU.fw.data[0x3FAC1] = ipv4Address_AP1_2; - MMU.fw.data[0x3FAC2] = ipv4Address_AP1_3; - MMU.fw.data[0x3FAC3] = ipv4Address_AP1_4; - MMU.fw.data[0x3FAC4] = ipv4Gateway_AP1_1; - MMU.fw.data[0x3FAC5] = ipv4Gateway_AP1_2; - MMU.fw.data[0x3FAC6] = ipv4Gateway_AP1_3; - MMU.fw.data[0x3FAC7] = ipv4Gateway_AP1_4; - MMU.fw.data[0x3FAC8] = ipv4PrimaryDNS_AP1_1; - MMU.fw.data[0x3FAC9] = ipv4PrimaryDNS_AP1_2; - MMU.fw.data[0x3FACA] = ipv4PrimaryDNS_AP1_3; - MMU.fw.data[0x3FACB] = ipv4PrimaryDNS_AP1_4; - MMU.fw.data[0x3FACC] = ipv4SecondaryDNS_AP1_1; - MMU.fw.data[0x3FACD] = ipv4SecondaryDNS_AP1_2; - MMU.fw.data[0x3FACE] = ipv4SecondaryDNS_AP1_3; - MMU.fw.data[0x3FACF] = ipv4SecondaryDNS_AP1_4; - MMU.fw.data[0x3FAD0] = subnetMask_AP1; - MMU.fw.data[0x3FAE7] = 0; - *(u16 *)&MMU.fw.data[0x3FAFE] = calc_CRC16(0, &MMU.fw.data[0x3FA00], 0xFE); - - MMU.fw.data[0x3FB40] = 'S'; - MMU.fw.data[0x3FB41] = 'o'; - MMU.fw.data[0x3FB42] = 'f'; - MMU.fw.data[0x3FB43] = 't'; - MMU.fw.data[0x3FB44] = 'A'; - MMU.fw.data[0x3FB45] = 'P'; - MMU.fw.data[0x3FBC0] = ipv4Address_AP2_1; - MMU.fw.data[0x3FBC1] = ipv4Address_AP2_2; - MMU.fw.data[0x3FBC2] = ipv4Address_AP2_3; - MMU.fw.data[0x3FBC3] = ipv4Address_AP2_4; - MMU.fw.data[0x3FBC4] = ipv4Gateway_AP2_1; - MMU.fw.data[0x3FBC5] = ipv4Gateway_AP2_2; - MMU.fw.data[0x3FBC6] = ipv4Gateway_AP2_3; - MMU.fw.data[0x3FBC7] = ipv4Gateway_AP2_4; - MMU.fw.data[0x3FBC8] = ipv4PrimaryDNS_AP2_1; - MMU.fw.data[0x3FBC9] = ipv4PrimaryDNS_AP2_2; - MMU.fw.data[0x3FBCA] = ipv4PrimaryDNS_AP2_3; - MMU.fw.data[0x3FBCB] = ipv4PrimaryDNS_AP2_4; - MMU.fw.data[0x3FBCC] = ipv4SecondaryDNS_AP2_1; - MMU.fw.data[0x3FBCD] = ipv4SecondaryDNS_AP2_2; - MMU.fw.data[0x3FBCE] = ipv4SecondaryDNS_AP2_3; - MMU.fw.data[0x3FBCF] = ipv4SecondaryDNS_AP2_4; - MMU.fw.data[0x3FBD0] = subnetMask_AP2; - MMU.fw.data[0x3FBE7] = 0; - *(u16 *)&MMU.fw.data[0x3FBFE] = calc_CRC16(0, &MMU.fw.data[0x3FB00], 0xFE); - - MMU.fw.data[0x3FC40] = 'S'; - MMU.fw.data[0x3FC41] = 'o'; - MMU.fw.data[0x3FC42] = 'f'; - MMU.fw.data[0x3FC43] = 't'; - MMU.fw.data[0x3FC44] = 'A'; - MMU.fw.data[0x3FC45] = 'P'; - MMU.fw.data[0x3FCC0] = ipv4Address_AP3_1; - MMU.fw.data[0x3FCC1] = ipv4Address_AP3_2; - MMU.fw.data[0x3FCC2] = ipv4Address_AP3_3; - MMU.fw.data[0x3FCC3] = ipv4Address_AP3_4; - MMU.fw.data[0x3FCC4] = ipv4Gateway_AP3_1; - MMU.fw.data[0x3FCC5] = ipv4Gateway_AP3_2; - MMU.fw.data[0x3FCC6] = ipv4Gateway_AP3_3; - MMU.fw.data[0x3FCC7] = ipv4Gateway_AP3_4; - MMU.fw.data[0x3FCC8] = ipv4PrimaryDNS_AP3_1; - MMU.fw.data[0x3FCC9] = ipv4PrimaryDNS_AP3_2; - MMU.fw.data[0x3FCCA] = ipv4PrimaryDNS_AP3_3; - MMU.fw.data[0x3FCCB] = ipv4PrimaryDNS_AP3_4; - MMU.fw.data[0x3FCCC] = ipv4SecondaryDNS_AP3_1; - MMU.fw.data[0x3FCCD] = ipv4SecondaryDNS_AP3_2; - MMU.fw.data[0x3FCCE] = ipv4SecondaryDNS_AP3_3; - MMU.fw.data[0x3FCCF] = ipv4SecondaryDNS_AP3_4; - MMU.fw.data[0x3FCD0] = subnetMask_AP3; - MMU.fw.data[0x3FCE7] = 0; - *(u16 *)&MMU.fw.data[0x3FCFE] = calc_CRC16(0, &MMU.fw.data[0x3FC00], 0xFE); - + NDS_InitFirmwareWithConfig(*_internalData); pthread_mutex_unlock(&mutex); } +- (uint32_t) generateRandomMACAddress +{ + uint32_t randomMACAddressValue = 0; + + do + { + randomMACAddressValue = (uint32_t)random() & 0x00FFFFFF; + } while (randomMACAddressValue == 0); + + randomMACAddressValue = (randomMACAddressValue << 8) | 0xBF; + + uint8_t newMACAddress[6]; + newMACAddress[0] = 0x00; + newMACAddress[1] = 0x09; + newMACAddress[2] = (randomMACAddressValue >> 0) & 0x000000FF; + newMACAddress[3] = (randomMACAddressValue >> 8) & 0x000000FF; + newMACAddress[4] = (randomMACAddressValue >> 16) & 0x000000FF; + newMACAddress[5] = (randomMACAddressValue >> 24) & 0x000000FF; + + [self setMACAddressValue:randomMACAddressValue]; + + return randomMACAddressValue; +} + @end diff --git a/desmume/src/frontend/cocoa/translations/English.lproj/MainMenu.xib b/desmume/src/frontend/cocoa/translations/English.lproj/MainMenu.xib index f86f992ed..a09cfd19c 100644 --- a/desmume/src/frontend/cocoa/translations/English.lproj/MainMenu.xib +++ b/desmume/src/frontend/cocoa/translations/English.lproj/MainMenu.xib @@ -12,7 +12,7 @@ YES - + YES @@ -2862,6 +2862,7 @@ {{0, 0}, {1920, 1177}} {1.7976931348623157e+308, 1.7976931348623157e+308} + AppAboutWindow YES @@ -3094,7 +3095,7 @@ {{0, 0}, {1920, 1177}} {1.7976931348623157e+308, 1.7976931348623157e+308} - + AppPreferencesWindow YES @@ -7301,7 +7302,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 NSView - + 268 YES @@ -7317,7 +7318,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {{13, 10}, {528, 441}} - YES @@ -7342,7 +7342,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{16, 52}, {198, 18}} - YES @@ -7367,7 +7366,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{16, 32}, {217, 18}} - YES @@ -7392,7 +7390,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{16, 12}, {183, 18}} - _NS:682 YES @@ -7416,13 +7413,11 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {{1, 1}, {494, 78}} - {{6, 301}, {496, 94}} - {0, 0} @@ -7454,7 +7449,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{18, 14}, {165, 38}} - YES NO @@ -7702,7 +7696,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{242, 15}, {73, 17}} - YES @@ -7722,7 +7715,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{320, 13}, {50, 22}} - YES @@ -7801,7 +7793,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{371, 10}, {19, 27}} - YES @@ -7820,13 +7811,11 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {{1, 1}, {494, 62}} - {{6, 219}, {496, 78}} - {0, 0} @@ -7858,7 +7847,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{95, 14}, {66, 17}} - _NS:526 {251, 750} @@ -7881,7 +7869,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{164, 12}, {176, 26}} - _NS:9 YES @@ -7907,7 +7894,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{343, 14}, {52, 17}} - _NS:526 {251, 750} YES @@ -7981,7 +7967,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{161, 36}, {26, 14}} - _NS:526 {251, 750} @@ -8004,7 +7989,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{239, 36}, {26, 14}} - _NS:526 {251, 750} @@ -8027,7 +8011,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{314, 36}, {31, 14}} - _NS:526 {251, 750} @@ -8048,14 +8031,12 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {{1, 1}, {494, 60}} - _NS:11 {{6, 139}, {496, 76}} - _NS:9 {0, 0} @@ -8088,7 +8069,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{16, 12}, {462, 18}} - YES @@ -8111,13 +8091,11 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {{1, 1}, {494, 38}} - {{6, 81}, {496, 54}} - {0, 0} @@ -8149,7 +8127,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{16, 32}, {146, 18}} - YES @@ -8174,7 +8151,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{16, 12}, {118, 18}} - YES 67108864 @@ -8196,13 +8172,11 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {{1, 1}, {494, 58}} - {{6, 3}, {496, 74}} - {0, 0} @@ -8222,7 +8196,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {{10, 33}, {508, 395}} - General Settings @@ -9592,8 +9565,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {554, 465} - - NSView @@ -13234,7 +13205,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {1.7976931348623157e+308, 1.7976931348623157e+308} - + 256 YES @@ -13243,6 +13214,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{119, 480}, {170, 22}} + YES -1804599231 @@ -13263,6 +13235,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{119, 430}, {170, 44}} + YES -1805647871 @@ -13283,6 +13256,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{17, 482}, {97, 17}} + YES 68157504 @@ -13301,6 +13275,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{17, 454}, {97, 17}} + YES 68157504 @@ -13319,6 +13294,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{12, 406}, {102, 17}} + YES 68157504 @@ -13337,6 +13313,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{17, 376}, {97, 17}} + YES 68157504 @@ -13355,6 +13332,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{17, 350}, {97, 17}} + YES 68157504 @@ -13373,6 +13351,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{119, 374}, {173, 27}} + YES 71303168 @@ -13394,6 +13373,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{116, 344}, {176, 26}} + YES -2076180416 @@ -13494,6 +13474,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{116, 400}, {176, 26}} + YES -2076180416 @@ -13767,6 +13748,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{17, 42}, {275, 56}} + YES 67108864 @@ -13785,6 +13767,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{106, 5}, {96, 32}} + YES 67108864 @@ -13803,9 +13786,10 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 - -2147483380 + 268 {{17, 323}, {97, 17}} + _NS:4068 YES @@ -13823,9 +13807,10 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 - -2147483380 + 268 {{116, 323}, {176, 17}} + _NS:4068 YES @@ -13844,9 +13829,10 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 - -2147483380 + 268 {{113, 294}, {182, 32}} + _NS:610 YES @@ -13867,9 +13853,10 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 - -2147483636 + 12 {{13, 96}, {283, 198}} + _NS:559 YES @@ -13885,6 +13872,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{-2, 129}, {95, 17}} + _NS:4068 YES @@ -13905,6 +13893,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{-2, 100}, {95, 17}} + _NS:4068 YES @@ -13925,6 +13914,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{-2, 71}, {95, 17}} + _NS:4068 YES @@ -13945,6 +13935,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{-2, 41}, {95, 17}} + _NS:4068 YES @@ -13965,6 +13956,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{-2, 11}, {95, 17}} + _NS:4068 YES @@ -13985,6 +13977,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{127, 129}, {12, 17}} + _NS:4068 YES @@ -14005,6 +13998,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{169, 129}, {12, 17}} + _NS:4068 YES @@ -14025,6 +14019,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{211, 129}, {12, 17}} + _NS:4068 YES @@ -14045,6 +14040,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{127, 71}, {12, 17}} + _NS:4068 YES @@ -14065,6 +14061,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{169, 71}, {12, 17}} + _NS:4068 YES @@ -14085,6 +14082,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{211, 71}, {12, 17}} + _NS:4068 YES @@ -14105,6 +14103,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{127, 41}, {12, 17}} + _NS:4068 YES @@ -14125,6 +14124,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{169, 41}, {12, 17}} + _NS:4068 YES @@ -14145,6 +14145,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{211, 41}, {12, 17}} + _NS:4068 YES @@ -14165,6 +14166,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{127, 11}, {12, 17}} + _NS:4068 YES @@ -14185,6 +14187,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{169, 11}, {12, 17}} + _NS:4068 YES @@ -14205,6 +14208,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{211, 11}, {12, 17}} + _NS:4068 YES @@ -14225,6 +14229,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{108, 100}, {151, 17}} + _NS:4068 YES @@ -14246,6 +14251,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{94, 127}, {36, 22}} + _NS:185 YES @@ -14327,6 +14333,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{136, 127}, {36, 22}} + _NS:185 YES @@ -14408,6 +14415,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{178, 127}, {36, 22}} + _NS:185 YES @@ -14489,6 +14497,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{220, 127}, {36, 22}} + _NS:185 YES @@ -14570,6 +14579,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{94, 69}, {36, 22}} + _NS:185 YES @@ -14651,6 +14661,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{136, 69}, {36, 22}} + _NS:185 YES @@ -14732,6 +14743,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{178, 69}, {36, 22}} + _NS:185 YES @@ -14813,6 +14825,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{220, 69}, {36, 22}} + _NS:185 YES @@ -14894,6 +14907,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{94, 39}, {36, 22}} + _NS:185 YES @@ -14975,6 +14989,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{136, 39}, {36, 22}} + _NS:185 YES @@ -15056,6 +15071,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{178, 39}, {36, 22}} + _NS:185 YES @@ -15137,6 +15153,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{220, 39}, {36, 22}} + _NS:185 YES @@ -15218,6 +15235,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{94, 9}, {36, 22}} + _NS:185 YES @@ -15299,6 +15317,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{136, 9}, {36, 22}} + _NS:185 YES @@ -15380,6 +15399,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{178, 9}, {36, 22}} + _NS:185 YES @@ -15461,6 +15481,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{220, 9}, {36, 22}} + _NS:185 YES @@ -15542,6 +15563,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{91, 96}, {19, 27}} + _NS:4123 YES @@ -15549,7 +15571,8 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 0 _NS:4123 - 100 + 24 + 28 1 YES @@ -15558,6 +15581,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {{10, 33}, {263, 152}} + _NS:561 Profile 1 @@ -18956,6 +18980,8 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {309, 512} + + {{0, 0}, {1920, 1177}} {1.7976931348623157e+308, 1.7976931348623157e+308} @@ -19775,7 +19801,11 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 75497536 2048 Type - + + LucidaGrande + 11 + 16 + @@ -25668,15 +25698,16 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 YES - + 256 YES - -2147483636 + 12 {{13, 131}, {240, 173}} + _NS:559 YES @@ -25692,6 +25723,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{-1, 113}, {78, 14}} + _NS:4068 YES @@ -25712,6 +25744,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{105, 113}, {12, 17}} + _NS:4068 YES @@ -25732,6 +25765,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{141, 113}, {12, 17}} + _NS:4068 YES @@ -25752,6 +25786,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{177, 113}, {12, 17}} + _NS:4068 YES @@ -25772,6 +25807,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{78, 111}, {30, 19}} + _NS:185 YES @@ -25853,6 +25889,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{114, 111}, {30, 19}} + _NS:185 YES @@ -25934,6 +25971,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{150, 111}, {30, 19}} + _NS:185 YES @@ -26015,6 +26053,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{186, 111}, {30, 19}} + _NS:185 YES @@ -26096,6 +26135,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{-1, 61}, {78, 14}} + _NS:4068 YES @@ -26116,6 +26156,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{105, 61}, {12, 17}} + _NS:4068 YES @@ -26136,6 +26177,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{141, 61}, {12, 17}} + _NS:4068 YES @@ -26156,6 +26198,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{177, 61}, {12, 17}} + _NS:4068 YES @@ -26176,6 +26219,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{78, 59}, {30, 19}} + _NS:185 YES @@ -26257,6 +26301,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{114, 59}, {30, 19}} + _NS:185 YES @@ -26338,6 +26383,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{150, 59}, {30, 19}} + _NS:185 YES @@ -26419,6 +26465,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{186, 59}, {30, 19}} + _NS:185 YES @@ -26500,6 +26547,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{-1, 34}, {78, 14}} + _NS:4068 YES @@ -26520,6 +26568,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{105, 34}, {12, 17}} + _NS:4068 YES @@ -26540,6 +26589,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{141, 34}, {12, 17}} + _NS:4068 YES @@ -26560,6 +26610,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{177, 34}, {12, 17}} + _NS:4068 YES @@ -26580,6 +26631,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{78, 32}, {30, 19}} + _NS:185 YES @@ -26661,6 +26713,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{114, 32}, {30, 19}} + _NS:185 YES @@ -26742,6 +26795,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{150, 32}, {30, 19}} + _NS:185 YES @@ -26823,6 +26877,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{186, 32}, {30, 19}} + _NS:185 YES @@ -26904,6 +26959,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{-1, 8}, {78, 14}} + _NS:4068 YES @@ -26924,6 +26980,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{105, 8}, {12, 17}} + _NS:4068 YES @@ -26944,6 +27001,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{141, 8}, {12, 17}} + _NS:4068 YES @@ -26964,6 +27022,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{177, 8}, {12, 17}} + _NS:4068 YES @@ -26984,6 +27043,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{78, 6}, {30, 19}} + _NS:185 YES @@ -27065,6 +27125,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{114, 6}, {30, 19}} + _NS:185 YES @@ -27146,6 +27207,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{150, 6}, {30, 19}} + _NS:185 YES @@ -27227,6 +27289,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{186, 6}, {30, 19}} + _NS:185 YES @@ -27308,6 +27371,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{1, 86}, {76, 14}} + _NS:4068 YES @@ -27328,6 +27392,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{93, 86}, {126, 14}} + _NS:4068 YES @@ -27349,6 +27414,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{75, 81}, {19, 27}} + _NS:4123 YES @@ -27357,6 +27423,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 _NS:4123 + 24 28 1 YES @@ -27366,6 +27433,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {{10, 25}, {220, 135}} + _NS:561 Profile 1 @@ -30766,9 +30834,10 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 - -2147483380 + 268 {{105, 305}, {140, 28}} + _NS:610 YES @@ -30789,9 +30858,10 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 - -2147483380 + 268 {{109, 331}, {134, 14}} + _NS:4068 YES @@ -30810,9 +30880,10 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 - -2147483380 + 268 {{17, 331}, {88, 14}} + _NS:4068 YES @@ -30833,6 +30904,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{53, 9}, {154, 19}} + YES -2080374784 @@ -30854,6 +30926,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{107, 406}, {136, 22}} + YES -2076180416 @@ -31079,6 +31152,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{107, 353}, {136, 22}} + YES -2076180416 @@ -31179,6 +31253,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{17, 36}, {226, 98}} + YES 67108864 @@ -31197,6 +31272,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{110, 381}, {133, 27}} + YES 71303168 @@ -31216,6 +31292,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{17, 358}, {88, 14}} + YES 68157504 @@ -31234,6 +31311,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{17, 385}, {88, 14}} + YES 68157504 @@ -31252,6 +31330,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{17, 411}, {88, 14}} + YES 68157504 @@ -31270,6 +31349,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{17, 457}, {88, 14}} + YES 68157504 @@ -31288,6 +31368,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{17, 483}, {88, 14}} + YES 68157504 @@ -31306,6 +31387,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{110, 434}, {130, 40}} + YES -1805647871 @@ -31326,6 +31408,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{110, 481}, {130, 19}} + YES -1804599231 @@ -31343,6 +31426,8 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {260, 513} + + NSView @@ -33830,7 +33915,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {1.7976931348623157e+308, 1.7976931348623157e+308} - + 256 YES @@ -33849,7 +33934,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{15, 77}, {206, 18}} - YES -2080374784 @@ -33873,7 +33957,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{15, 15}, {109, 14}} - YES 68157504 @@ -33892,7 +33975,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{15, 57}, {115, 18}} - YES -2080374784 @@ -33916,7 +33998,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{15, 37}, {195, 18}} - YES -2080374784 @@ -33940,7 +34021,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{126, 10}, {96, 22}} - _NS:791 YES @@ -34063,12 +34143,10 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {{1, 1}, {237, 102}} - {{17, 109}, {239, 118}} - {0, 0} 67108864 @@ -34089,7 +34167,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{56, 8}, {162, 19}} - YES -2080374784 @@ -34121,7 +34198,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{18, 14}, {107, 58}} - YES NO 3 @@ -34380,12 +34456,10 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {{1, 1}, {237, 82}} - {{17, 424}, {239, 98}} - {0, 0} 67108864 @@ -34416,7 +34490,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{15, 52}, {108, 18}} - YES -2080374784 @@ -34440,7 +34513,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{15, 32}, {135, 18}} - YES -2080374784 @@ -34464,7 +34536,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{15, 12}, {82, 18}} - YES -2080374784 @@ -34488,7 +34559,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{32, 148}, {113, 14}} - _NS:526 {251, 750} YES @@ -34510,7 +34580,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{150, 146}, {48, 19}} - _NS:9 YES @@ -34588,7 +34657,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{203, 142}, {19, 27}} - _NS:1592 YES @@ -34608,7 +34676,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{15, 72}, {137, 18}} - YES 67108864 @@ -34632,7 +34699,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{6, 96}, {139, 14}} - YES 68157504 @@ -34651,7 +34717,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{203, 89}, {19, 27}} - YES 67895328 @@ -34671,7 +34736,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{163, 96}, {38, 14}} - _NS:4068 YES @@ -34748,7 +34812,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{41, 122}, {104, 14}} - _NS:4068 YES @@ -34769,7 +34832,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{147, 117}, {75, 22}} - _NS:791 YES @@ -34838,12 +34900,10 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {{1, 1}, {237, 173}} - {{17, 231}, {239, 189}} - {0, 0} 67108864 @@ -34874,7 +34934,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{16, 12}, {114, 18}} - YES 67108864 @@ -34898,7 +34957,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{158, 30}, {70, 22}} - _NS:791 YES @@ -34945,7 +35003,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{18, 35}, {146, 14}} - _NS:4068 YES @@ -34964,12 +35021,10 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {{1, 1}, {237, 58}} - {{17, 31}, {239, 74}} - {0, 0} 67108864 @@ -34987,8 +35042,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {273, 542} - - {{0, 0}, {1920, 1177}} {1.7976931348623157e+308, 1.7976931348623157e+308} @@ -35251,11 +35304,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 68157504 71435264 Current Session MAC: - - LucidaGrande - 11 - 16 - + _NS:4068 @@ -35275,7 +35324,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 70254657 4326400 - + 00:09:BF:FF:FF:FF _NS:4068 @@ -44862,6 +44911,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {{0, 0}, {1920, 1177}} {580, 614} {580, 614} + AppTroubleshootingFormWindow YES @@ -62913,6 +62963,926 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 11782 + + + value: values.FirmwareConfig_IPv4Address_AP1_1 + + + + + + value: values.FirmwareConfig_IPv4Address_AP1_1 + value + values.FirmwareConfig_IPv4Address_AP1_1 + 2 + + + 12060 + + + + value: values.FirmwareConfig_IPv4Address_AP1_2 + + + + + + value: values.FirmwareConfig_IPv4Address_AP1_2 + value + values.FirmwareConfig_IPv4Address_AP1_2 + 2 + + + 12061 + + + + value: values.FirmwareConfig_IPv4Address_AP1_3 + + + + + + value: values.FirmwareConfig_IPv4Address_AP1_3 + value + values.FirmwareConfig_IPv4Address_AP1_3 + 2 + + + 12062 + + + + value: values.FirmwareConfig_IPv4Address_AP1_4 + + + + + + value: values.FirmwareConfig_IPv4Address_AP1_4 + value + values.FirmwareConfig_IPv4Address_AP1_4 + 2 + + + 12063 + + + + value: values.FirmwareConfig_IPv4Gateway_AP1_1 + + + + + + value: values.FirmwareConfig_IPv4Gateway_AP1_1 + value + values.FirmwareConfig_IPv4Gateway_AP1_1 + 2 + + + 12064 + + + + value: values.FirmwareConfig_IPv4Gateway_AP1_2 + + + + + + value: values.FirmwareConfig_IPv4Gateway_AP1_2 + value + values.FirmwareConfig_IPv4Gateway_AP1_2 + 2 + + + 12065 + + + + value: values.FirmwareConfig_IPv4Gateway_AP1_3 + + + + + + value: values.FirmwareConfig_IPv4Gateway_AP1_3 + value + values.FirmwareConfig_IPv4Gateway_AP1_3 + 2 + + + 12066 + + + + value: values.FirmwareConfig_IPv4Gateway_AP1_4 + + + + + + value: values.FirmwareConfig_IPv4Gateway_AP1_4 + value + values.FirmwareConfig_IPv4Gateway_AP1_4 + 2 + + + 12067 + + + + value: values.FirmwareConfig_IPv4PrimaryDNS_AP1_1 + + + + + + value: values.FirmwareConfig_IPv4PrimaryDNS_AP1_1 + value + values.FirmwareConfig_IPv4PrimaryDNS_AP1_1 + 2 + + + 12068 + + + + value: values.FirmwareConfig_IPv4PrimaryDNS_AP1_2 + + + + + + value: values.FirmwareConfig_IPv4PrimaryDNS_AP1_2 + value + values.FirmwareConfig_IPv4PrimaryDNS_AP1_2 + 2 + + + 12069 + + + + value: values.FirmwareConfig_IPv4PrimaryDNS_AP1_3 + + + + + + value: values.FirmwareConfig_IPv4PrimaryDNS_AP1_3 + value + values.FirmwareConfig_IPv4PrimaryDNS_AP1_3 + 2 + + + 12070 + + + + value: values.FirmwareConfig_IPv4PrimaryDNS_AP1_4 + + + + + + value: values.FirmwareConfig_IPv4PrimaryDNS_AP1_4 + value + values.FirmwareConfig_IPv4PrimaryDNS_AP1_4 + 2 + + + 12071 + + + + value: values.FirmwareConfig_IPv4SecondaryDNS_AP1_1 + + + + + + value: values.FirmwareConfig_IPv4SecondaryDNS_AP1_1 + value + values.FirmwareConfig_IPv4SecondaryDNS_AP1_1 + 2 + + + 12072 + + + + value: values.FirmwareConfig_IPv4SecondaryDNS_AP1_2 + + + + + + value: values.FirmwareConfig_IPv4SecondaryDNS_AP1_2 + value + values.FirmwareConfig_IPv4SecondaryDNS_AP1_2 + 2 + + + 12073 + + + + value: values.FirmwareConfig_IPv4SecondaryDNS_AP1_3 + + + + + + value: values.FirmwareConfig_IPv4SecondaryDNS_AP1_3 + value + values.FirmwareConfig_IPv4SecondaryDNS_AP1_3 + 2 + + + 12074 + + + + value: values.FirmwareConfig_IPv4SecondaryDNS_AP1_4 + + + + + + value: values.FirmwareConfig_IPv4SecondaryDNS_AP1_4 + value + values.FirmwareConfig_IPv4SecondaryDNS_AP1_4 + 2 + + + 12075 + + + + value: values.FirmwareConfig_SubnetMask_AP1 + + + + + + value: values.FirmwareConfig_SubnetMask_AP1 + value + values.FirmwareConfig_SubnetMask_AP1 + 2 + + + 12076 + + + + value: values.FirmwareConfig_IPv4Address_AP2_1 + + + + + + value: values.FirmwareConfig_IPv4Address_AP2_1 + value + values.FirmwareConfig_IPv4Address_AP2_1 + 2 + + + 12077 + + + + value: values.FirmwareConfig_IPv4Address_AP2_2 + + + + + + value: values.FirmwareConfig_IPv4Address_AP2_2 + value + values.FirmwareConfig_IPv4Address_AP2_2 + 2 + + + 12078 + + + + value: values.FirmwareConfig_IPv4Address_AP2_3 + + + + + + value: values.FirmwareConfig_IPv4Address_AP2_3 + value + values.FirmwareConfig_IPv4Address_AP2_3 + 2 + + + 12079 + + + + value: values.FirmwareConfig_IPv4Address_AP2_4 + + + + + + value: values.FirmwareConfig_IPv4Address_AP2_4 + value + values.FirmwareConfig_IPv4Address_AP2_4 + 2 + + + 12080 + + + + value: values.FirmwareConfig_IPv4Gateway_AP2_1 + + + + + + value: values.FirmwareConfig_IPv4Gateway_AP2_1 + value + values.FirmwareConfig_IPv4Gateway_AP2_1 + 2 + + + 12081 + + + + value: values.FirmwareConfig_IPv4Gateway_AP2_2 + + + + + + value: values.FirmwareConfig_IPv4Gateway_AP2_2 + value + values.FirmwareConfig_IPv4Gateway_AP2_2 + 2 + + + 12082 + + + + value: values.FirmwareConfig_IPv4Gateway_AP2_3 + + + + + + value: values.FirmwareConfig_IPv4Gateway_AP2_3 + value + values.FirmwareConfig_IPv4Gateway_AP2_3 + 2 + + + 12083 + + + + value: values.FirmwareConfig_IPv4Gateway_AP2_4 + + + + + + value: values.FirmwareConfig_IPv4Gateway_AP2_4 + value + values.FirmwareConfig_IPv4Gateway_AP2_4 + 2 + + + 12084 + + + + value: values.FirmwareConfig_IPv4PrimaryDNS_AP2_1 + + + + + + value: values.FirmwareConfig_IPv4PrimaryDNS_AP2_1 + value + values.FirmwareConfig_IPv4PrimaryDNS_AP2_1 + 2 + + + 12085 + + + + value: values.FirmwareConfig_IPv4PrimaryDNS_AP2_2 + + + + + + value: values.FirmwareConfig_IPv4PrimaryDNS_AP2_2 + value + values.FirmwareConfig_IPv4PrimaryDNS_AP2_2 + 2 + + + 12086 + + + + value: values.FirmwareConfig_IPv4PrimaryDNS_AP2_3 + + + + + + value: values.FirmwareConfig_IPv4PrimaryDNS_AP2_3 + value + values.FirmwareConfig_IPv4PrimaryDNS_AP2_3 + 2 + + + 12087 + + + + value: values.FirmwareConfig_IPv4PrimaryDNS_AP2_4 + + + + + + value: values.FirmwareConfig_IPv4PrimaryDNS_AP2_4 + value + values.FirmwareConfig_IPv4PrimaryDNS_AP2_4 + 2 + + + 12088 + + + + value: values.FirmwareConfig_IPv4SecondaryDNS_AP2_1 + + + + + + value: values.FirmwareConfig_IPv4SecondaryDNS_AP2_1 + value + values.FirmwareConfig_IPv4SecondaryDNS_AP2_1 + 2 + + + 12089 + + + + value: values.FirmwareConfig_IPv4SecondaryDNS_AP2_2 + + + + + + value: values.FirmwareConfig_IPv4SecondaryDNS_AP2_2 + value + values.FirmwareConfig_IPv4SecondaryDNS_AP2_2 + 2 + + + 12090 + + + + value: values.FirmwareConfig_IPv4SecondaryDNS_AP2_3 + + + + + + value: values.FirmwareConfig_IPv4SecondaryDNS_AP2_3 + value + values.FirmwareConfig_IPv4SecondaryDNS_AP2_3 + 2 + + + 12091 + + + + value: values.FirmwareConfig_IPv4SecondaryDNS_AP2_4 + + + + + + value: values.FirmwareConfig_IPv4SecondaryDNS_AP2_4 + value + values.FirmwareConfig_IPv4SecondaryDNS_AP2_4 + 2 + + + 12092 + + + + value: values.FirmwareConfig_SubnetMask_AP2 + + + + + + value: values.FirmwareConfig_SubnetMask_AP2 + value + values.FirmwareConfig_SubnetMask_AP2 + 2 + + + 12093 + + + + value: values.FirmwareConfig_IPv4Address_AP3_1 + + + + + + value: values.FirmwareConfig_IPv4Address_AP3_1 + value + values.FirmwareConfig_IPv4Address_AP3_1 + 2 + + + 12094 + + + + value: values.FirmwareConfig_IPv4Address_AP3_2 + + + + + + value: values.FirmwareConfig_IPv4Address_AP3_2 + value + values.FirmwareConfig_IPv4Address_AP3_2 + 2 + + + 12095 + + + + value: values.FirmwareConfig_IPv4Address_AP3_3 + + + + + + value: values.FirmwareConfig_IPv4Address_AP3_3 + value + values.FirmwareConfig_IPv4Address_AP3_3 + 2 + + + 12096 + + + + value: values.FirmwareConfig_IPv4Address_AP3_4 + + + + + + value: values.FirmwareConfig_IPv4Address_AP3_4 + value + values.FirmwareConfig_IPv4Address_AP3_4 + 2 + + + 12097 + + + + value: values.FirmwareConfig_IPv4Gateway_AP3_1 + + + + + + value: values.FirmwareConfig_IPv4Gateway_AP3_1 + value + values.FirmwareConfig_IPv4Gateway_AP3_1 + 2 + + + 12098 + + + + value: values.FirmwareConfig_IPv4Gateway_AP3_2 + + + + + + value: values.FirmwareConfig_IPv4Gateway_AP3_2 + value + values.FirmwareConfig_IPv4Gateway_AP3_2 + 2 + + + 12099 + + + + value: values.FirmwareConfig_IPv4Gateway_AP3_3 + + + + + + value: values.FirmwareConfig_IPv4Gateway_AP3_3 + value + values.FirmwareConfig_IPv4Gateway_AP3_3 + 2 + + + 12100 + + + + value: values.FirmwareConfig_IPv4Gateway_AP3_4 + + + + + + value: values.FirmwareConfig_IPv4Gateway_AP3_4 + value + values.FirmwareConfig_IPv4Gateway_AP3_4 + 2 + + + 12101 + + + + value: values.FirmwareConfig_IPv4PrimaryDNS_AP3_1 + + + + + + value: values.FirmwareConfig_IPv4PrimaryDNS_AP3_1 + value + values.FirmwareConfig_IPv4PrimaryDNS_AP3_1 + 2 + + + 12102 + + + + value: values.FirmwareConfig_IPv4PrimaryDNS_AP3_2 + + + + + + value: values.FirmwareConfig_IPv4PrimaryDNS_AP3_2 + value + values.FirmwareConfig_IPv4PrimaryDNS_AP3_2 + 2 + + + 12103 + + + + value: values.FirmwareConfig_IPv4PrimaryDNS_AP3_3 + + + + + + value: values.FirmwareConfig_IPv4PrimaryDNS_AP3_3 + value + values.FirmwareConfig_IPv4PrimaryDNS_AP3_3 + 2 + + + 12104 + + + + value: values.FirmwareConfig_IPv4PrimaryDNS_AP3_4 + + + + + + value: values.FirmwareConfig_IPv4PrimaryDNS_AP3_4 + value + values.FirmwareConfig_IPv4PrimaryDNS_AP3_4 + 2 + + + 12105 + + + + value: values.FirmwareConfig_IPv4SecondaryDNS_AP3_1 + + + + + + value: values.FirmwareConfig_IPv4SecondaryDNS_AP3_1 + value + values.FirmwareConfig_IPv4SecondaryDNS_AP3_1 + 2 + + + 12106 + + + + value: values.FirmwareConfig_IPv4SecondaryDNS_AP3_2 + + + + + + value: values.FirmwareConfig_IPv4SecondaryDNS_AP3_2 + value + values.FirmwareConfig_IPv4SecondaryDNS_AP3_2 + 2 + + + 12107 + + + + value: values.FirmwareConfig_IPv4SecondaryDNS_AP3_3 + + + + + + value: values.FirmwareConfig_IPv4SecondaryDNS_AP3_3 + value + values.FirmwareConfig_IPv4SecondaryDNS_AP3_3 + 2 + + + 12108 + + + + value: values.FirmwareConfig_IPv4SecondaryDNS_AP3_4 + + + + + + value: values.FirmwareConfig_IPv4SecondaryDNS_AP3_4 + value + values.FirmwareConfig_IPv4SecondaryDNS_AP3_4 + 2 + + + 12109 + + + + value: values.FirmwareConfig_SubnetMask_AP3 + + + + + + value: values.FirmwareConfig_SubnetMask_AP3 + value + values.FirmwareConfig_SubnetMask_AP3 + 2 + + + 12110 + + + + value: subnetMaskString_AP1 + + + + + + value: subnetMaskString_AP1 + value + subnetMaskString_AP1 + 2 + + + 12111 + + + + value: subnetMaskString_AP2 + + + + + + value: subnetMaskString_AP2 + value + subnetMaskString_AP2 + 2 + + + 12112 + + + + value: subnetMaskString_AP3 + + + + + + value: subnetMaskString_AP3 + value + subnetMaskString_AP3 + 2 + + + 12113 + + + + generateFirmwareMACAddress: + + + + 12118 + + + + updateSubnetMaskString_AP1: + + + + 12119 + + + + updateSubnetMaskString_AP2: + + + + 12120 + + + + updateSubnetMaskString_AP3: + + + + 12121 + + + + value: firmwareMACAddressString + + + + + + value: firmwareMACAddressString + value + firmwareMACAddressString + 2 + + + 12122 + + + + prefWindowDelegate + + + + 12123 + @@ -92943,7 +93913,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{1160, 512}, {302, 473}} + {{1157, 512}, {302, 473}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -93572,7 +94542,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{1132, 65}, {260, 513}} + {{894, 75}, {260, 513}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -93647,9 +94617,9 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{472, 448}, {309, 512}} + {{586, 344}, {309, 512}} com.apple.InterfaceBuilder.CocoaPlugin - {{472, 448}, {309, 512}} + {{586, 344}, {309, 512}} com.apple.InterfaceBuilder.CocoaPlugin @@ -94069,7 +95039,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{1116, 403}, {257, 433}} + {{1075, 552}, {250, 433}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -94162,9 +95132,9 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{642, 700}, {400, 100}} + {{892, 791}, {400, 100}} com.apple.InterfaceBuilder.CocoaPlugin - {{642, 700}, {400, 100}} + {{892, 791}, {400, 100}} com.apple.InterfaceBuilder.CocoaPlugin {{534, 800}, {616, 0}} @@ -95855,7 +96825,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 - 12059 + 12123 @@ -96302,7 +97272,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 DisplayPreviewView NSView - + IBProjectSource userinterface/preferencesWindowDelegate.h @@ -97074,6 +98044,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 ndsErrorSheet ndsErrorStatusTextField openglMSAAPopUpButton + prefWindowDelegate romInfoPanel romInfoPanelController saveFileMigrationSheet @@ -97103,6 +98074,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 NSWindow NSTextField NSPopUpButton + PreferencesWindowDelegate RomInfoPanel NSObjectController NSWindow @@ -97135,6 +98107,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 ndsErrorSheet ndsErrorStatusTextField openglMSAAPopUpButton + prefWindowDelegate romInfoPanel romInfoPanelController saveFileMigrationSheet @@ -97221,6 +98194,10 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 openglMSAAPopUpButton NSPopUpButton + + prefWindowDelegate + PreferencesWindowDelegate + romInfoPanel RomInfoPanel @@ -97834,13 +98811,18 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 chooseRomForAutoload: closeFirmwareConfigSheet: configureInternalFirmware: + generateFirmwareMACAddress: selectDisplayRotation: selectOutputFilter: selectPixelScaler: selectSPUSyncMethod: selectSPUSyncMode: updateFiltersPreferGPU: + updateFirmwareMACAddressString: updateSourceDeposterize: + updateSubnetMaskString_AP1: + updateSubnetMaskString_AP2: + updateSubnetMaskString_AP3: updateVolumeIcon: @@ -97862,6 +98844,11 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 id id id + id + id + id + id + id @@ -97877,13 +98864,18 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 chooseRomForAutoload: closeFirmwareConfigSheet: configureInternalFirmware: + generateFirmwareMACAddress: selectDisplayRotation: selectOutputFilter: selectPixelScaler: selectSPUSyncMethod: selectSPUSyncMode: updateFiltersPreferGPU: + updateFirmwareMACAddressString: updateSourceDeposterize: + updateSubnetMaskString_AP1: + updateSubnetMaskString_AP2: + updateSubnetMaskString_AP3: updateVolumeIcon: @@ -97924,6 +98916,10 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 configureInternalFirmware: id + + generateFirmwareMACAddress: + id + selectDisplayRotation: id @@ -97948,10 +98944,26 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 updateFiltersPreferGPU: id + + updateFirmwareMACAddressString: + id + updateSourceDeposterize: id + + updateSubnetMaskString_AP1: + id + + + updateSubnetMaskString_AP2: + id + + + updateSubnetMaskString_AP3: + id + updateVolumeIcon: id @@ -98144,12 +99156,12 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 - + RomInfoContentView NSView - + IBProjectSource userinterface/RomInfoPanel.h @@ -98221,7 +99233,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 - + RomInfoPanelSectionView @@ -98258,7 +99270,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 - + Slot2WindowDelegate @@ -98679,21 +99691,21 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 NSApplication NSResponder - + IBFrameworkSource AppKit.framework/Headers/NSApplication.h NSApplication - + IBFrameworkSource AppKit.framework/Headers/NSApplicationScripting.h NSApplication - + IBFrameworkSource AppKit.framework/Headers/NSColorPanel.h @@ -98778,7 +99790,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 NSControl NSView - + IBFrameworkSource AppKit.framework/Headers/NSControl.h @@ -98864,7 +99876,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 NSDrawer NSResponder - + IBFrameworkSource AppKit.framework/Headers/NSDrawer.h @@ -98920,7 +99932,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 NSMenu NSObject - + IBFrameworkSource AppKit.framework/Headers/NSMenu.h @@ -98928,7 +99940,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 NSMenuItem NSObject - + IBFrameworkSource AppKit.framework/Headers/NSMenuItem.h @@ -98966,19 +99978,19 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 NSObject - + NSObject - + NSObject - + NSObject - + NSObject @@ -99017,7 +100029,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 NSObject - + NSObject @@ -99028,7 +100040,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 NSObject - + IBFrameworkSource AppKit.framework/Headers/NSOutlineView.h @@ -99049,21 +100061,21 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 NSObject - + IBFrameworkSource AppKit.framework/Headers/NSTableView.h NSObject - + IBFrameworkSource AppKit.framework/Headers/NSToolbarItem.h NSObject - + IBFrameworkSource AppKit.framework/Headers/NSView.h @@ -99233,7 +100245,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 NSOutlineView NSTableView - + NSPanel @@ -99397,7 +100409,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 NSTableView NSControl - + NSText @@ -99442,7 +100454,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 NSToolbarItem NSObject - + NSUserDefaultsController @@ -99461,7 +100473,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 NSView - + NSView @@ -99473,11 +100485,11 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 NSView NSResponder - + NSWindow - + NSWindow diff --git a/desmume/src/frontend/cocoa/userinterface/EmuControllerDelegate.h b/desmume/src/frontend/cocoa/userinterface/EmuControllerDelegate.h index 6bb643155..97e6d89c0 100644 --- a/desmume/src/frontend/cocoa/userinterface/EmuControllerDelegate.h +++ b/desmume/src/frontend/cocoa/userinterface/EmuControllerDelegate.h @@ -31,6 +31,7 @@ @class RomInfoPanel; @class MacScreenshotCaptureToolDelegate; @class MacAVCaptureToolDelegate; +@class PreferencesWindowDelegate; struct ClientCommandAttributes; class AudioSampleBlockGenerator; @@ -47,6 +48,7 @@ class AudioSampleBlockGenerator; CheatWindowDelegate *cheatWindowDelegate; MacScreenshotCaptureToolDelegate *screenshotCaptureToolDelegate; MacAVCaptureToolDelegate *avCaptureToolDelegate; + PreferencesWindowDelegate *prefWindowDelegate; NSObjectController *firmwarePanelController; NSObjectController *romInfoPanelController; NSObjectController *cdsCoreController; @@ -132,6 +134,7 @@ class AudioSampleBlockGenerator; @property (readonly) IBOutlet CheatWindowDelegate *cheatWindowDelegate; @property (readonly) IBOutlet MacScreenshotCaptureToolDelegate *screenshotCaptureToolDelegate; @property (readonly) IBOutlet MacAVCaptureToolDelegate *avCaptureToolDelegate; +@property (readonly) IBOutlet PreferencesWindowDelegate *prefWindowDelegate; @property (readonly) IBOutlet NSObjectController *firmwarePanelController; @property (readonly) IBOutlet NSObjectController *romInfoPanelController; @property (readonly) IBOutlet NSObjectController *cdsCoreController; diff --git a/desmume/src/frontend/cocoa/userinterface/EmuControllerDelegate.mm b/desmume/src/frontend/cocoa/userinterface/EmuControllerDelegate.mm index 42d6b2bd6..f2ee3cf0c 100644 --- a/desmume/src/frontend/cocoa/userinterface/EmuControllerDelegate.mm +++ b/desmume/src/frontend/cocoa/userinterface/EmuControllerDelegate.mm @@ -22,6 +22,7 @@ #import "Slot2WindowDelegate.h" #import "MacAVCaptureTool.h" #import "MacScreenshotCaptureTool.h" +#import "preferencesWindowDelegate.h" #import "cocoa_globals.h" #import "cocoa_cheat.h" @@ -46,6 +47,7 @@ @synthesize cheatWindowDelegate; @synthesize screenshotCaptureToolDelegate; @synthesize avCaptureToolDelegate; +@synthesize prefWindowDelegate; @synthesize firmwarePanelController; @synthesize romInfoPanelController; @synthesize cdsCoreController; @@ -982,11 +984,74 @@ [[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 ipv4Address_AP1_1] forKey:@"FirmwareConfig_IPv4Address_AP1_1"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4Address_AP1_2] forKey:@"FirmwareConfig_IPv4Address_AP1_2"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4Address_AP1_3] forKey:@"FirmwareConfig_IPv4Address_AP1_3"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4Address_AP1_4] forKey:@"FirmwareConfig_IPv4Address_AP1_4"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4Gateway_AP1_1] forKey:@"FirmwareConfig_IPv4Gateway_AP1_1"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4Gateway_AP1_2] forKey:@"FirmwareConfig_IPv4Gateway_AP1_2"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4Gateway_AP1_3] forKey:@"FirmwareConfig_IPv4Gateway_AP1_3"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4Gateway_AP1_4] forKey:@"FirmwareConfig_IPv4Gateway_AP1_4"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4PrimaryDNS_AP1_1] forKey:@"FirmwareConfig_IPv4PrimaryDNS_AP1_1"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4PrimaryDNS_AP1_2] forKey:@"FirmwareConfig_IPv4PrimaryDNS_AP1_2"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4PrimaryDNS_AP1_3] forKey:@"FirmwareConfig_IPv4PrimaryDNS_AP1_3"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4PrimaryDNS_AP1_4] forKey:@"FirmwareConfig_IPv4PrimaryDNS_AP1_4"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4SecondaryDNS_AP1_1] forKey:@"FirmwareConfig_IPv4SecondaryDNS_AP1_1"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4SecondaryDNS_AP1_2] forKey:@"FirmwareConfig_IPv4SecondaryDNS_AP1_2"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4SecondaryDNS_AP1_3] forKey:@"FirmwareConfig_IPv4SecondaryDNS_AP1_3"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4SecondaryDNS_AP1_4] forKey:@"FirmwareConfig_IPv4SecondaryDNS_AP1_4"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware subnetMask_AP1] forKey:@"FirmwareConfig_SubnetMask_AP1"]; + + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4Address_AP2_1] forKey:@"FirmwareConfig_IPv4Address_AP2_1"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4Address_AP2_2] forKey:@"FirmwareConfig_IPv4Address_AP2_2"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4Address_AP2_3] forKey:@"FirmwareConfig_IPv4Address_AP2_3"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4Address_AP2_4] forKey:@"FirmwareConfig_IPv4Address_AP2_4"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4Gateway_AP2_1] forKey:@"FirmwareConfig_IPv4Gateway_AP2_1"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4Gateway_AP2_2] forKey:@"FirmwareConfig_IPv4Gateway_AP2_2"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4Gateway_AP2_3] forKey:@"FirmwareConfig_IPv4Gateway_AP2_3"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4Gateway_AP2_4] forKey:@"FirmwareConfig_IPv4Gateway_AP2_4"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4PrimaryDNS_AP2_1] forKey:@"FirmwareConfig_IPv4PrimaryDNS_AP2_1"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4PrimaryDNS_AP2_2] forKey:@"FirmwareConfig_IPv4PrimaryDNS_AP2_2"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4PrimaryDNS_AP2_3] forKey:@"FirmwareConfig_IPv4PrimaryDNS_AP2_3"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4PrimaryDNS_AP2_4] forKey:@"FirmwareConfig_IPv4PrimaryDNS_AP2_4"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4SecondaryDNS_AP2_1] forKey:@"FirmwareConfig_IPv4SecondaryDNS_AP2_1"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4SecondaryDNS_AP2_2] forKey:@"FirmwareConfig_IPv4SecondaryDNS_AP2_2"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4SecondaryDNS_AP2_3] forKey:@"FirmwareConfig_IPv4SecondaryDNS_AP2_3"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4SecondaryDNS_AP2_4] forKey:@"FirmwareConfig_IPv4SecondaryDNS_AP2_4"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware subnetMask_AP2] forKey:@"FirmwareConfig_SubnetMask_AP2"]; + + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4Address_AP3_1] forKey:@"FirmwareConfig_IPv4Address_AP3_1"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4Address_AP3_2] forKey:@"FirmwareConfig_IPv4Address_AP3_2"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4Address_AP3_3] forKey:@"FirmwareConfig_IPv4Address_AP3_3"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4Address_AP3_4] forKey:@"FirmwareConfig_IPv4Address_AP3_4"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4Gateway_AP3_1] forKey:@"FirmwareConfig_IPv4Gateway_AP3_1"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4Gateway_AP3_2] forKey:@"FirmwareConfig_IPv4Gateway_AP3_2"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4Gateway_AP3_3] forKey:@"FirmwareConfig_IPv4Gateway_AP3_3"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4Gateway_AP3_4] forKey:@"FirmwareConfig_IPv4Gateway_AP3_4"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4PrimaryDNS_AP3_1] forKey:@"FirmwareConfig_IPv4PrimaryDNS_AP3_1"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4PrimaryDNS_AP3_2] forKey:@"FirmwareConfig_IPv4PrimaryDNS_AP3_2"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4PrimaryDNS_AP3_3] forKey:@"FirmwareConfig_IPv4PrimaryDNS_AP3_3"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4PrimaryDNS_AP3_4] forKey:@"FirmwareConfig_IPv4PrimaryDNS_AP3_4"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4SecondaryDNS_AP3_1] forKey:@"FirmwareConfig_IPv4SecondaryDNS_AP3_1"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4SecondaryDNS_AP3_2] forKey:@"FirmwareConfig_IPv4SecondaryDNS_AP3_2"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4SecondaryDNS_AP3_3] forKey:@"FirmwareConfig_IPv4SecondaryDNS_AP3_3"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware ipv4SecondaryDNS_AP3_4] forKey:@"FirmwareConfig_IPv4SecondaryDNS_AP3_4"]; + [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware subnetMask_AP3] forKey:@"FirmwareConfig_SubnetMask_AP3"]; + + //[[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware consoleType] forKey:@"FirmwareConfig_ConsoleType"]; [[NSUserDefaults standardUserDefaults] setObject:[writeFirmware nickname] forKey:@"FirmwareConfig_Nickname"]; [[NSUserDefaults standardUserDefaults] setObject:[writeFirmware message] forKey:@"FirmwareConfig_Message"]; [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware favoriteColor] forKey:@"FirmwareConfig_FavoriteColor"]; [[NSUserDefaults standardUserDefaults] setObject:[writeFirmware birthday] forKey:@"FirmwareConfig_Birthday"]; [[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware language] forKey:@"FirmwareConfig_Language"]; + //[[NSUserDefaults standardUserDefaults] setInteger:[writeFirmware backlightLevel] forKey:@"FirmwareConfig_BacklightLevel"]; + + [prefWindowDelegate updateFirmwareMACAddressString:nil]; + [prefWindowDelegate updateSubnetMaskString_AP1:nil]; + [prefWindowDelegate updateSubnetMaskString_AP2:nil]; + [prefWindowDelegate updateSubnetMaskString_AP3:nil]; [[NSUserDefaults standardUserDefaults] synchronize]; } diff --git a/desmume/src/frontend/cocoa/userinterface/WifiSettingsPanel.h b/desmume/src/frontend/cocoa/userinterface/WifiSettingsPanel.h index 5306d8d40..3580c86ff 100644 --- a/desmume/src/frontend/cocoa/userinterface/WifiSettingsPanel.h +++ b/desmume/src/frontend/cocoa/userinterface/WifiSettingsPanel.h @@ -58,7 +58,6 @@ class ClientExecutionControl; @property (readonly) IBOutlet NSPopUpButton *bridgeDevicePopUpButton; - (void) updateMyMACAddressStringsWithValue:(uint32_t)value; -- (void) updateFirmwareMACAddressStringWithValue:(uint32_t)value; - (void) fillLibpcapDeviceMenu; - (void) generateRandomMyMACAddressSet; - (IBAction) generateNewAddresses:(id)sender; diff --git a/desmume/src/frontend/cocoa/userinterface/WifiSettingsPanel.mm b/desmume/src/frontend/cocoa/userinterface/WifiSettingsPanel.mm index 1b47c1b7d..9d986ec2a 100644 --- a/desmume/src/frontend/cocoa/userinterface/WifiSettingsPanel.mm +++ b/desmume/src/frontend/cocoa/userinterface/WifiSettingsPanel.mm @@ -51,10 +51,10 @@ execControl = NULL; - _myMACAddressValue = 0x00503412; - const uint8_t myMAC4 = (_myMACAddressValue >> 0) & 0x000000FF; - const uint8_t myMAC5 = (_myMACAddressValue >> 8) & 0x000000FF; - const uint8_t myMAC6 = (_myMACAddressValue >> 16) & 0x000000F0; + _myMACAddressValue = 0x503412BF; + const uint8_t myMAC4 = (_myMACAddressValue >> 8) & 0x000000FF; + const uint8_t myMAC5 = (_myMACAddressValue >> 16) & 0x000000FF; + const uint8_t myMAC6 = (_myMACAddressValue >> 24) & 0x000000F0; firmwareMACAddressString = @"Firmware 00:09:BF:FF:FF:FF"; currentSessionMACAddressString = @"00:09:BF:FF:FF:FF"; @@ -99,9 +99,9 @@ } else if ( (theSelection >= 1) && (theSelection <= 4) ) { - const uint8_t myMAC4 = (_myMACAddressValue >> 0) & 0x000000FF; - const uint8_t myMAC5 = (_myMACAddressValue >> 8) & 0x000000FF; - const uint8_t myMAC6 = (_myMACAddressValue >> 16) & 0x000000F0; + 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); @@ -135,9 +135,9 @@ - (void) updateMyMACAddressStringsWithValue:(uint32_t)value { - const uint8_t myMAC4 = (value >> 0) & 0x000000FF; - const uint8_t myMAC5 = (value >> 8) & 0x000000FF; - const uint8_t myMAC6 = (value >> 16) & 0x000000F0; + const uint8_t myMAC4 = (value >> 8) & 0x000000FF; + const uint8_t myMAC5 = (value >> 16) & 0x000000FF; + const uint8_t myMAC6 = (value >> 24) & 0x000000F0; [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]]; @@ -145,15 +145,6 @@ [self setMyMACAddress4String:[NSString stringWithFormat:@"My Address #4 00:09:BF:%02X:%02X:%02X", myMAC4, myMAC5, myMAC6 + 4]]; } -- (void) updateFirmwareMACAddressStringWithValue:(uint32_t)value -{ - const uint8_t fwMAC4 = (value >> 0) & 0x000000FF; - const uint8_t fwMAC5 = (value >> 8) & 0x000000FF; - const uint8_t fwMAC6 = (value >> 16) & 0x000000FF; - - [self setFirmwareMACAddressString:[NSString stringWithFormat:@"Firmware 00:09:BF:%02X:%02X:%02X", fwMAC4, fwMAC5, fwMAC6]]; -} - - (void) fillLibpcapDeviceMenu { std::vector deviceList; @@ -183,7 +174,14 @@ - (void) generateRandomMyMACAddressSet { - _myMACAddressValue = (uint32_t)random() & 0x00FFFFFF; + 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]; @@ -220,7 +218,6 @@ if ([[NSUserDefaults standardUserDefaults] objectForKey:@"Wifi_MyMACAddress"] != nil) { userDefaultMACAddressValue = (uint32_t)[[NSUserDefaults standardUserDefaults] integerForKey:@"Wifi_MyMACAddress"]; - userDefaultMACAddressValue &= 0x00FFFFFF; } if (userDefaultMACAddressValue == 0) @@ -231,6 +228,8 @@ userDefaultMACAddressValue = (uint32_t)random() & 0x00FFFFFF; } while (userDefaultMACAddressValue == 0); + userDefaultMACAddressValue = ((userDefaultMACAddressValue << 8) | 0xBF); + [[NSUserDefaults standardUserDefaults] setInteger:userDefaultMACAddressValue forKey:@"Wifi_MyMACAddress"]; needUserDefaultSynchronize = YES; } diff --git a/desmume/src/frontend/cocoa/userinterface/appDelegate.h b/desmume/src/frontend/cocoa/userinterface/appDelegate.h index bd7a57251..dcb21e2c6 100644 --- a/desmume/src/frontend/cocoa/userinterface/appDelegate.h +++ b/desmume/src/frontend/cocoa/userinterface/appDelegate.h @@ -1,6 +1,6 @@ /* Copyright (C) 2011 Roger Manuel - Copyright (C) 2011-2015 DeSmuME Team + Copyright (C) 2011-2018 DeSmuME Team 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 diff --git a/desmume/src/frontend/cocoa/userinterface/appDelegate.mm b/desmume/src/frontend/cocoa/userinterface/appDelegate.mm index d67bd1910..93221ad5c 100644 --- a/desmume/src/frontend/cocoa/userinterface/appDelegate.mm +++ b/desmume/src/frontend/cocoa/userinterface/appDelegate.mm @@ -1,6 +1,6 @@ /* Copyright (C) 2011 Roger Manuel - Copyright (C) 2011-2017 DeSmuME Team + Copyright (C) 2011-2018 DeSmuME Team 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 @@ -468,11 +468,95 @@ // Set up the firmware per user preferences. CocoaDSFirmware *newFirmware = [[[CocoaDSFirmware alloc] init] autorelease]; + uint32_t defaultMACAddress_u32 = 0; + + if ([[NSUserDefaults standardUserDefaults] objectForKey:@"FirmwareConfig_MACAddress"] != nil) + { + defaultMACAddress_u32 = (uint32_t)[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_MACAddress"]; + } + + 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"]; + [[NSUserDefaults standardUserDefaults] synchronize]; + } + + [newFirmware setMACAddressValue:defaultMACAddress_u32]; + + [newFirmware setIpv4Address_AP1_1:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4Address_AP1_1"]]; + [newFirmware setIpv4Address_AP1_2:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4Address_AP1_2"]]; + [newFirmware setIpv4Address_AP1_3:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4Address_AP1_3"]]; + [newFirmware setIpv4Address_AP1_4:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4Address_AP1_4"]]; + [newFirmware setIpv4Gateway_AP1_1:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4Gateway_AP1_1"]]; + [newFirmware setIpv4Gateway_AP1_2:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4Gateway_AP1_2"]]; + [newFirmware setIpv4Gateway_AP1_3:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4Gateway_AP1_3"]]; + [newFirmware setIpv4Gateway_AP1_4:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4Gateway_AP1_4"]]; + [newFirmware setIpv4PrimaryDNS_AP1_1:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4PrimaryDNS_AP1_1"]]; + [newFirmware setIpv4PrimaryDNS_AP1_2:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4PrimaryDNS_AP1_2"]]; + [newFirmware setIpv4PrimaryDNS_AP1_3:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4PrimaryDNS_AP1_3"]]; + [newFirmware setIpv4PrimaryDNS_AP1_4:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4PrimaryDNS_AP1_4"]]; + [newFirmware setIpv4SecondaryDNS_AP1_1:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4SecondaryDNS_AP1_1"]]; + [newFirmware setIpv4SecondaryDNS_AP1_2:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4SecondaryDNS_AP1_2"]]; + [newFirmware setIpv4SecondaryDNS_AP1_3:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4SecondaryDNS_AP1_3"]]; + [newFirmware setIpv4SecondaryDNS_AP1_4:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4SecondaryDNS_AP1_4"]]; + [newFirmware setSubnetMask_AP1:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_SubnetMask_AP1"]]; + + [newFirmware setIpv4Address_AP2_1:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4Address_AP2_1"]]; + [newFirmware setIpv4Address_AP2_2:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4Address_AP2_2"]]; + [newFirmware setIpv4Address_AP2_3:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4Address_AP2_3"]]; + [newFirmware setIpv4Address_AP2_4:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4Address_AP2_4"]]; + [newFirmware setIpv4Gateway_AP2_1:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4Gateway_AP2_1"]]; + [newFirmware setIpv4Gateway_AP2_2:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4Gateway_AP2_2"]]; + [newFirmware setIpv4Gateway_AP2_3:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4Gateway_AP2_3"]]; + [newFirmware setIpv4Gateway_AP2_4:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4Gateway_AP2_4"]]; + [newFirmware setIpv4PrimaryDNS_AP2_1:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4PrimaryDNS_AP2_1"]]; + [newFirmware setIpv4PrimaryDNS_AP2_2:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4PrimaryDNS_AP2_2"]]; + [newFirmware setIpv4PrimaryDNS_AP2_3:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4PrimaryDNS_AP2_3"]]; + [newFirmware setIpv4PrimaryDNS_AP2_4:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4PrimaryDNS_AP2_4"]]; + [newFirmware setIpv4SecondaryDNS_AP2_1:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4SecondaryDNS_AP2_1"]]; + [newFirmware setIpv4SecondaryDNS_AP2_2:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4SecondaryDNS_AP2_2"]]; + [newFirmware setIpv4SecondaryDNS_AP2_3:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4SecondaryDNS_AP2_3"]]; + [newFirmware setIpv4SecondaryDNS_AP2_4:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4SecondaryDNS_AP2_4"]]; + [newFirmware setSubnetMask_AP2:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_SubnetMask_AP2"]]; + + [newFirmware setIpv4Address_AP3_1:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4Address_AP3_1"]]; + [newFirmware setIpv4Address_AP3_2:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4Address_AP3_2"]]; + [newFirmware setIpv4Address_AP3_3:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4Address_AP3_3"]]; + [newFirmware setIpv4Address_AP3_4:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4Address_AP3_4"]]; + [newFirmware setIpv4Gateway_AP3_1:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4Gateway_AP3_1"]]; + [newFirmware setIpv4Gateway_AP3_2:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4Gateway_AP3_2"]]; + [newFirmware setIpv4Gateway_AP3_3:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4Gateway_AP3_3"]]; + [newFirmware setIpv4Gateway_AP3_4:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4Gateway_AP3_4"]]; + [newFirmware setIpv4PrimaryDNS_AP3_1:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4PrimaryDNS_AP3_1"]]; + [newFirmware setIpv4PrimaryDNS_AP3_2:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4PrimaryDNS_AP3_2"]]; + [newFirmware setIpv4PrimaryDNS_AP3_3:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4PrimaryDNS_AP3_3"]]; + [newFirmware setIpv4PrimaryDNS_AP3_4:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4PrimaryDNS_AP3_4"]]; + [newFirmware setIpv4SecondaryDNS_AP3_1:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4SecondaryDNS_AP3_1"]]; + [newFirmware setIpv4SecondaryDNS_AP3_2:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4SecondaryDNS_AP3_2"]]; + [newFirmware setIpv4SecondaryDNS_AP3_3:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4SecondaryDNS_AP3_3"]]; + [newFirmware setIpv4SecondaryDNS_AP3_4:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_IPv4SecondaryDNS_AP3_4"]]; + [newFirmware setSubnetMask_AP3:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_SubnetMask_AP3"]]; + + //[newFirmware setConsoleType:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_ConsoleType"]]; [newFirmware setNickname:[[NSUserDefaults standardUserDefaults] objectForKey:@"FirmwareConfig_Nickname"]]; [newFirmware setMessage:[[NSUserDefaults standardUserDefaults] objectForKey:@"FirmwareConfig_Message"]]; [newFirmware setFavoriteColor:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_FavoriteColor"]]; [newFirmware setBirthday:[[NSUserDefaults standardUserDefaults] objectForKey:@"FirmwareConfig_Birthday"]]; [newFirmware setLanguage:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_Language"]]; + //[newFirmware setBacklightLevel:[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_BacklightLevel"]]; + + [prefWindowDelegate updateFirmwareMACAddressString:nil]; + [prefWindowDelegate updateSubnetMaskString_AP1:nil]; + [prefWindowDelegate updateSubnetMaskString_AP2:nil]; + [prefWindowDelegate updateSubnetMaskString_AP3:nil]; [newFirmware update]; [emuControl setCdsFirmware:newFirmware]; diff --git a/desmume/src/frontend/cocoa/userinterface/preferencesWindowDelegate.h b/desmume/src/frontend/cocoa/userinterface/preferencesWindowDelegate.h index 389768c1c..2a984f02d 100644 --- a/desmume/src/frontend/cocoa/userinterface/preferencesWindowDelegate.h +++ b/desmume/src/frontend/cocoa/userinterface/preferencesWindowDelegate.h @@ -84,6 +84,11 @@ class OGLImage; DisplayPreviewView *previewView; + NSString *firmwareMACAddressString; + NSString *subnetMaskString_AP1; + NSString *subnetMaskString_AP2; + NSString *subnetMaskString_AP3; + NSMutableDictionary *bindings; } @@ -116,6 +121,11 @@ class OGLImage; @property (readonly) IBOutlet DisplayPreviewView *previewView; +@property (retain) NSString *firmwareMACAddressString; +@property (retain) NSString *subnetMaskString_AP1; +@property (retain) NSString *subnetMaskString_AP2; +@property (retain) NSString *subnetMaskString_AP3; + @property (readonly) NSMutableDictionary *bindings; - (IBAction) changePrefView:(id)sender; @@ -149,6 +159,12 @@ class OGLImage; - (IBAction) closeFirmwareConfigSheet:(id)sender; - (void) didEndFirmwareConfigSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; +- (IBAction) generateFirmwareMACAddress:(id)sender; +- (IBAction) updateFirmwareMACAddressString:(id)sender; +- (IBAction) updateSubnetMaskString_AP1:(id)sender; +- (IBAction) updateSubnetMaskString_AP2:(id)sender; +- (IBAction) updateSubnetMaskString_AP3:(id)sender; + - (void) switchContentView:(NSView *)theView; - (void) markUnsupportedOpenGLMSAAMenuItems; - (void) setupUserDefaults; diff --git a/desmume/src/frontend/cocoa/userinterface/preferencesWindowDelegate.mm b/desmume/src/frontend/cocoa/userinterface/preferencesWindowDelegate.mm index 04555eff3..43e5ce40b 100644 --- a/desmume/src/frontend/cocoa/userinterface/preferencesWindowDelegate.mm +++ b/desmume/src/frontend/cocoa/userinterface/preferencesWindowDelegate.mm @@ -308,6 +308,11 @@ @synthesize previewView; +@synthesize firmwareMACAddressString; +@synthesize subnetMaskString_AP1; +@synthesize subnetMaskString_AP2; +@synthesize subnetMaskString_AP3; + @synthesize bindings; - (id)init @@ -326,6 +331,11 @@ return self; } + firmwareMACAddressString = @"00:09:BF:FF:FF:FF"; + subnetMaskString_AP1 = @"0.0.0.0"; + subnetMaskString_AP2 = @"0.0.0.0"; + subnetMaskString_AP3 = @"0.0.0.0"; + // Load the volume icons. iconVolumeFull = [[NSImage imageNamed:@"Icon_VolumeFull_16x16"] retain]; iconVolumeTwoThird = [[NSImage imageNamed:@"Icon_VolumeTwoThird_16x16"] retain]; @@ -347,6 +357,11 @@ [bindings release]; [prefViewDict release]; + [self setFirmwareMACAddressString:nil]; + [self setSubnetMaskString_AP1:nil]; + [self setSubnetMaskString_AP2:nil]; + [self setSubnetMaskString_AP3:nil]; + [super dealloc]; } @@ -878,6 +893,76 @@ [sheet orderOut:self]; } +- (IBAction) generateFirmwareMACAddress:(id)sender +{ + uint32_t randomMACAddressValue = 0; + + do + { + randomMACAddressValue = (uint32_t)random() & 0x00FFFFFF; + } while (randomMACAddressValue == 0); + + randomMACAddressValue = (randomMACAddressValue << 8) | 0xBF; + + [[NSUserDefaults standardUserDefaults] setInteger:randomMACAddressValue forKey:@"FirmwareConfig_MACAddress"]; + [[NSUserDefaults standardUserDefaults] synchronize]; + + [self updateFirmwareMACAddressString:nil]; +} + +- (IBAction) updateFirmwareMACAddressString:(id)sender +{ + const uint32_t defaultMACAddressValue = (uint32_t)[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_MACAddress"]; + const uint8_t mac4 = (defaultMACAddressValue >> 8) & 0x000000FF; + const uint8_t mac5 = (defaultMACAddressValue >> 16) & 0x000000FF; + const uint8_t mac6 = (defaultMACAddressValue >> 24) & 0x000000FF; + + NSString *theMACAddressString = [NSString stringWithFormat:@"00:09:BF:%02X:%02X:%02X", mac4, mac5, mac6]; + [self setFirmwareMACAddressString:theMACAddressString]; +} + +- (IBAction) updateSubnetMaskString_AP1:(id)sender +{ + const uint32_t defaultSubnetMask = (uint8_t)[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_SubnetMask_AP1"]; + const uint32_t subnetMaskValue = (defaultSubnetMask == 0) ? 0 : (0xFFFFFFFF << (32 - defaultSubnetMask)); + + NSString *subnetMaskString = [NSString stringWithFormat:@"%d.%d.%d.%d", + (subnetMaskValue >> 24) & 0x000000FF, + (subnetMaskValue >> 16) & 0x000000FF, + (subnetMaskValue >> 8) & 0x000000FF, + (subnetMaskValue >> 0) & 0x000000FF]; + + [self setSubnetMaskString_AP1:subnetMaskString]; +} + +- (IBAction) updateSubnetMaskString_AP2:(id)sender +{ + const uint32_t defaultSubnetMask = (uint8_t)[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_SubnetMask_AP2"]; + const uint32_t subnetMaskValue = (defaultSubnetMask == 0) ? 0 : (0xFFFFFFFF << (32 - defaultSubnetMask)); + + NSString *subnetMaskString = [NSString stringWithFormat:@"%d.%d.%d.%d", + (subnetMaskValue >> 24) & 0x000000FF, + (subnetMaskValue >> 16) & 0x000000FF, + (subnetMaskValue >> 8) & 0x000000FF, + (subnetMaskValue >> 0) & 0x000000FF]; + + [self setSubnetMaskString_AP2:subnetMaskString]; +} + +- (IBAction) updateSubnetMaskString_AP3:(id)sender +{ + const uint32_t defaultSubnetMask = (uint8_t)[[NSUserDefaults standardUserDefaults] integerForKey:@"FirmwareConfig_SubnetMask_AP3"]; + const uint32_t subnetMaskValue = (defaultSubnetMask == 0) ? 0 : (0xFFFFFFFF << (32 - defaultSubnetMask)); + + NSString *subnetMaskString = [NSString stringWithFormat:@"%d.%d.%d.%d", + (subnetMaskValue >> 24) & 0x000000FF, + (subnetMaskValue >> 16) & 0x000000FF, + (subnetMaskValue >> 8) & 0x000000FF, + (subnetMaskValue >> 0) & 0x000000FF]; + + [self setSubnetMaskString_AP3:subnetMaskString]; +} + - (void)controlTextDidEndEditing:(NSNotification *)aNotification { [self updateDisplayRotationMenu:[displayRotationField floatValue]]; diff --git a/desmume/src/frontend/posix/cli/main.cpp b/desmume/src/frontend/posix/cli/main.cpp index fee0b4253..24350fa7c 100644 --- a/desmume/src/frontend/posix/cli/main.cpp +++ b/desmume/src/frontend/posix/cli/main.cpp @@ -501,12 +501,12 @@ int main(int argc, char ** argv) { const SDL_VideoInfo *videoInfo; /* the firmware settings */ - struct NDS_fw_config_data fw_config; + FirmwareConfig fw_config; NDS_Init(); /* default the firmware settings, they may get changed later */ - NDS_FillDefaultFirmwareConfigData( &fw_config); + NDS_GetDefaultFirmwareConfig(fw_config); init_config( &my_config); @@ -621,7 +621,7 @@ int main(int argc, char ** argv) { #endif /* Create the dummy firmware */ - NDS_CreateDummyFirmware( &fw_config); + NDS_InitFirmwareWithConfig(fw_config); if ( !my_config.disable_sound) { SPU_ChangeSoundCore(SNDCORE_SDL, 735 * 4); diff --git a/desmume/src/frontend/posix/gtk-glade/main.cpp b/desmume/src/frontend/posix/gtk-glade/main.cpp index 623b1a246..81d25be0c 100755 --- a/desmume/src/frontend/posix/gtk-glade/main.cpp +++ b/desmume/src/frontend/posix/gtk-glade/main.cpp @@ -354,12 +354,12 @@ joinThread_gdb( void *thread_handle) { static int common_gtk_glade_main( struct configured_features *my_config) { /* the firmware settings */ - struct NDS_fw_config_data fw_config; + FirmwareConfig fw_config; gchar *uifile; GKeyFile *keyfile; /* default the firmware settings, they may get changed later */ - NDS_FillDefaultFirmwareConfigData( &fw_config); + NDS_GetDefaultFirmwareConfig(fw_config); /* use any language set on the command line */ if ( my_config->firmware_language != -1) { @@ -384,7 +384,7 @@ common_gtk_glade_main( struct configured_features *my_config) { desmume_init(); /* Create the dummy firmware */ - NDS_CreateDummyFirmware( &fw_config); + NDS_InitFirmwareWithConfig(fw_config); /* * Activate the GDB stubs diff --git a/desmume/src/frontend/posix/gtk/main.cpp b/desmume/src/frontend/posix/gtk/main.cpp index 0b8ba7d0f..cd80db6ac 100644 --- a/desmume/src/frontend/posix/gtk/main.cpp +++ b/desmume/src/frontend/posix/gtk/main.cpp @@ -3005,10 +3005,10 @@ common_gtk_main( class configured_features *my_config) GtkWidget *pToolBar; /* the firmware settings */ - struct NDS_fw_config_data fw_config; + FirmwareConfig fw_config; /* default the firmware settings, they may get changed later */ - NDS_FillDefaultFirmwareConfigData( &fw_config); + NDS_GetDefaultFirmwareConfig(fw_config); /* use any language set on the command line */ if ( my_config->firmware_language != -1) { @@ -3130,7 +3130,7 @@ common_gtk_main( class configured_features *my_config) #endif /* Create the dummy firmware */ - NDS_CreateDummyFirmware( &fw_config); + NDS_InitFirmwareWithConfig(fw_config); /* Initialize joysticks */ if(!init_joy()) return 1; diff --git a/desmume/src/frontend/windows/FirmConfig.cpp b/desmume/src/frontend/windows/FirmConfig.cpp index 4a6e80c6c..e2a017e19 100644 --- a/desmume/src/frontend/windows/FirmConfig.cpp +++ b/desmume/src/frontend/windows/FirmConfig.cpp @@ -42,28 +42,28 @@ const char firmDay[31][16] = {"1","2","3","4","5","6","7","8","9","10","11","1 const char firmMonth[12][16] = {"January","Feburary","March","April","May","June","July", "August","September","October","November","December"}; -static void WriteFirmConfig( struct NDS_fw_config_data *fw_config) +static void WriteFirmConfig(const FirmwareConfig &fwConfig) { char temp_str[27]; int i; - WritePrivateProfileInt("Firmware","favColor", fw_config->fav_colour,IniName); - WritePrivateProfileInt("Firmware","bMonth", fw_config->birth_month,IniName); - WritePrivateProfileInt("Firmware","bDay",fw_config->birth_day,IniName); - WritePrivateProfileInt("Firmware","Language",fw_config->language,IniName); + WritePrivateProfileInt("Firmware","favColor", fwConfig.favoriteColor,IniName); + WritePrivateProfileInt("Firmware","bMonth", fwConfig.birthdayMonth,IniName); + WritePrivateProfileInt("Firmware","bDay",fwConfig.birthdayDay,IniName); + WritePrivateProfileInt("Firmware","Language",fwConfig.language,IniName); /* FIXME: harshly only use the lower byte of the UTF-16 character. * This would cause strange behaviour if the user could set UTF-16 but * they cannot yet. */ - for ( i = 0; i < fw_config->nickname_len; i++) { - temp_str[i] = fw_config->nickname[i]; + for ( i = 0; i < fwConfig.nicknameLength; i++) { + temp_str[i] = fwConfig.nickname[i]; } temp_str[i] = '\0'; WritePrivateProfileString("Firmware", "nickName", temp_str, IniName); - for ( i = 0; i < fw_config->message_len; i++) { - temp_str[i] = fw_config->message[i]; + for ( i = 0; i < fwConfig.messageLength; i++) { + temp_str[i] = fwConfig.message[i]; } temp_str[i] = '\0'; WritePrivateProfileString("Firmware","Message", temp_str, IniName); @@ -71,7 +71,7 @@ static void WriteFirmConfig( struct NDS_fw_config_data *fw_config) BOOL CALLBACK FirmConfig_Proc(HWND dialog,UINT komunikat,WPARAM wparam,LPARAM lparam) { - struct NDS_fw_config_data *fw_config = &CommonSettings.fw_config; + FirmwareConfig &fwConfig = CommonSettings.fwConfig; int i; char temp_str[27]; @@ -82,23 +82,23 @@ BOOL CALLBACK FirmConfig_Proc(HWND dialog,UINT komunikat,WPARAM wparam,LPARAM lp for(i=0;i<12;i++) SendDlgItemMessage(dialog,IDC_COMBO2,CB_ADDSTRING,0,(LPARAM)&firmMonth[i]); for(i=0;i<16;i++) SendDlgItemMessage(dialog,IDC_COMBO1,CB_ADDSTRING,0,(LPARAM)&firmColor[i]); for(i=0;i<31;i++) SendDlgItemMessage(dialog,IDC_COMBO3,CB_ADDSTRING,0,(LPARAM)&firmDay[i]); - SendDlgItemMessage(dialog,IDC_COMBO1,CB_SETCURSEL,fw_config->fav_colour,0); - SendDlgItemMessage(dialog,IDC_COMBO2,CB_SETCURSEL,fw_config->birth_month-1,0); - SendDlgItemMessage(dialog,IDC_COMBO3,CB_SETCURSEL,fw_config->birth_day-1,0); - SendDlgItemMessage(dialog,IDC_COMBO4,CB_SETCURSEL,fw_config->language,0); + SendDlgItemMessage(dialog,IDC_COMBO1,CB_SETCURSEL,fwConfig.favoriteColor,0); + SendDlgItemMessage(dialog,IDC_COMBO2,CB_SETCURSEL,fwConfig.birthdayMonth-1,0); + SendDlgItemMessage(dialog,IDC_COMBO3,CB_SETCURSEL,fwConfig.birthdayDay-1,0); + SendDlgItemMessage(dialog,IDC_COMBO4,CB_SETCURSEL,fwConfig.language,0); SendDlgItemMessage(dialog,IDC_EDIT1,EM_SETLIMITTEXT,10,0); SendDlgItemMessage(dialog,IDC_EDIT2,EM_SETLIMITTEXT,26,0); SendDlgItemMessage(dialog,IDC_EDIT1,EM_SETSEL,0,10); SendDlgItemMessage(dialog,IDC_EDIT2,EM_SETSEL,0,26); - for ( i = 0; i < fw_config->nickname_len; i++) { - nickname_buffer[i] = fw_config->nickname[i]; + for ( i = 0; i < fwConfig.nicknameLength; i++) { + nickname_buffer[i] = fwConfig.nickname[i]; } nickname_buffer[i] = '\0'; SendDlgItemMessage(dialog,IDC_EDIT1,WM_SETTEXT,0,(LPARAM)nickname_buffer); - for ( i = 0; i < fw_config->message_len; i++) { - message_buffer[i] = fw_config->message[i]; + for ( i = 0; i < fwConfig.messageLength; i++) { + message_buffer[i] = fwConfig.message[i]; } message_buffer[i] = '\0'; SendDlgItemMessage(dialog,IDC_EDIT2,WM_SETTEXT,0,(LPARAM)message_buffer); @@ -109,43 +109,43 @@ BOOL CALLBACK FirmConfig_Proc(HWND dialog,UINT komunikat,WPARAM wparam,LPARAM lp { int char_index; LRESULT res; - fw_config->fav_colour = SendDlgItemMessage(dialog,IDC_COMBO1,CB_GETCURSEL,0,0); - fw_config->birth_month = 1 + SendDlgItemMessage(dialog,IDC_COMBO2,CB_GETCURSEL,0,0); - fw_config->birth_day = 1 + SendDlgItemMessage(dialog,IDC_COMBO3,CB_GETCURSEL,0,0); - fw_config->language = SendDlgItemMessage(dialog,IDC_COMBO4,CB_GETCURSEL,0,0); + fwConfig.favoriteColor = SendDlgItemMessage(dialog,IDC_COMBO1,CB_GETCURSEL,0,0); + fwConfig.birthdayMonth = 1 + SendDlgItemMessage(dialog,IDC_COMBO2,CB_GETCURSEL,0,0); + fwConfig.birthdayDay = 1 + SendDlgItemMessage(dialog,IDC_COMBO3,CB_GETCURSEL,0,0); + fwConfig.language = SendDlgItemMessage(dialog,IDC_COMBO4,CB_GETCURSEL,0,0); *(WORD *)temp_str = 10; res = SendDlgItemMessage(dialog,IDC_EDIT1,EM_GETLINE,0,(LPARAM)temp_str); if ( res > 0) { temp_str[res] = '\0'; - fw_config->nickname_len = strlen( temp_str); + fwConfig.nicknameLength = strlen( temp_str); } else { strcpy( temp_str, "yopyop"); - fw_config->nickname_len = strlen( temp_str); + fwConfig.nicknameLength = strlen( temp_str); } - for ( char_index = 0; char_index < fw_config->nickname_len; char_index++) { - fw_config->nickname[char_index] = temp_str[char_index]; + for ( char_index = 0; char_index < fwConfig.nicknameLength; char_index++) { + fwConfig.nickname[char_index] = temp_str[char_index]; } *(WORD *)temp_str = 26; res = SendDlgItemMessage(dialog,IDC_EDIT2,EM_GETLINE,0,(LPARAM)temp_str); if ( res > 0) { temp_str[res] = '\0'; - fw_config->message_len = strlen( temp_str); + fwConfig.messageLength = strlen( temp_str); } else { - fw_config->message_len = 0; + fwConfig.messageLength = 0; } - for ( char_index = 0; char_index < fw_config->message_len; char_index++) { - fw_config->message[char_index] = temp_str[char_index]; + for ( char_index = 0; char_index < fwConfig.messageLength; char_index++) { + fwConfig.message[char_index] = temp_str[char_index]; } - WriteFirmConfig( fw_config); + WriteFirmConfig(fwConfig); EndDialog(dialog,0); if (CommonSettings.UseExtFirmware == 0) - NDS_CreateDummyFirmware( fw_config); + NDS_InitFirmwareWithConfig(fwConfig); return 1; } else diff --git a/desmume/src/frontend/windows/main.cpp b/desmume/src/frontend/windows/main.cpp index 4288e83ac..8298b8d38 100755 --- a/desmume/src/frontend/windows/main.cpp +++ b/desmume/src/frontend/windows/main.cpp @@ -2247,20 +2247,36 @@ int _main() wifiHandler->SetPCapInterface(winpcapInterface); wifiHandler->SetSocketsSupported(isSocketsSupported); - // 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); - unsigned long ipaddr; - if (he == NULL || he->h_addr_list[0] == NULL) - ipaddr = 0x0100007F; // 127.0.0.1 - else - ipaddr = *(unsigned long*)he->h_addr_list[0]; - - wifiHandler->SetIP4Address(ipaddr); - wifiHandler->SetUniqueMACValue((u32)GetCurrentProcessId()); + // 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->SetMACModeForComm(WifiCommInterfaceID_AdHoc, WifiMACMode_Manual); + //wifiHandler->SetFirmwareMACMode(FirmwareMACMode_Manual); + } + wifiHandler->SetCommInterfaceID(CommonSettings.wifi.mode); wifiHandler->SetBridgeDeviceIndex(CommonSettings.wifi.infraBridgeAdapter); @@ -2425,12 +2441,12 @@ int _main() FilterUpdate(MainWindow->getHWnd(),false); //default the firmware settings, they may get changed later - NDS_FillDefaultFirmwareConfigData(&CommonSettings.fw_config); + NDS_GetDefaultFirmwareConfig(CommonSettings.fwConfig); // Read the firmware settings from the init file - CommonSettings.fw_config.fav_colour = GetPrivateProfileInt("Firmware","favColor", 10, IniName); - CommonSettings.fw_config.birth_month = GetPrivateProfileInt("Firmware","bMonth", 7, IniName); - CommonSettings.fw_config.birth_day = GetPrivateProfileInt("Firmware","bDay", 15, IniName); - CommonSettings.fw_config.language = GetPrivateProfileInt("Firmware","Language", 1, IniName); + CommonSettings.fwConfig.favoriteColor = GetPrivateProfileInt("Firmware","favColor", 10, IniName); + CommonSettings.fwConfig.birthdayMonth = GetPrivateProfileInt("Firmware","bMonth", 7, IniName); + CommonSettings.fwConfig.birthdayDay = GetPrivateProfileInt("Firmware","bDay", 15, IniName); + CommonSettings.fwConfig.language = GetPrivateProfileInt("Firmware","Language", 1, IniName); { /* @@ -2440,21 +2456,21 @@ int _main() char temp_str[27]; int char_index; GetPrivateProfileString("Firmware","nickName", "yopyop", temp_str, 11, IniName); - CommonSettings.fw_config.nickname_len = strlen( temp_str); + CommonSettings.fwConfig.nicknameLength = strlen( temp_str); - if (CommonSettings.fw_config.nickname_len == 0) { + if (CommonSettings.fwConfig.nicknameLength == 0) { strcpy( temp_str, "yopyop"); - CommonSettings.fw_config.nickname_len = strlen( temp_str); + CommonSettings.fwConfig.nicknameLength = strlen( temp_str); } - for ( char_index = 0; char_index < CommonSettings.fw_config.nickname_len; char_index++) { - CommonSettings.fw_config.nickname[char_index] = temp_str[char_index]; + for ( char_index = 0; char_index < CommonSettings.fwConfig.nicknameLength; char_index++) { + CommonSettings.fwConfig.nickname[char_index] = temp_str[char_index]; } GetPrivateProfileString("Firmware","Message", "DeSmuME makes you happy!", temp_str, 27, IniName); - CommonSettings.fw_config.message_len = strlen( temp_str); - for ( char_index = 0; char_index < CommonSettings.fw_config.message_len; char_index++) { - CommonSettings.fw_config.message[char_index] = temp_str[char_index]; + CommonSettings.fwConfig.messageLength = strlen( temp_str); + for ( char_index = 0; char_index < CommonSettings.fwConfig.messageLength; char_index++) { + CommonSettings.fwConfig.message[char_index] = temp_str[char_index]; } } @@ -2467,7 +2483,7 @@ int _main() } //not supported; use the GUI - //if(cmdline.language != -1) CommonSettings.fw_config.language = cmdline.language; + //if(cmdline.language != -1) CommonSettings.fwConfig.language = cmdline.language; cmdline.process_movieCommands(); diff --git a/desmume/src/movie.cpp b/desmume/src/movie.cpp index 2b8b9b8de..812cfe49d 100755 --- a/desmume/src/movie.cpp +++ b/desmume/src/movie.cpp @@ -264,17 +264,17 @@ MovieData::MovieData(bool fromCurrentSettings) bootFromFirmware = CommonSettings.BootFromFirmware; if (!CommonSettings.UseExtFirmware) { - firmNickname.resize(CommonSettings.fw_config.nickname_len); - for (int i = 0; i < CommonSettings.fw_config.nickname_len; i++) - firmNickname[i] = CommonSettings.fw_config.nickname[i]; - firmMessage.resize(CommonSettings.fw_config.message_len); - for (int i = 0; i < CommonSettings.fw_config.message_len; i++) - firmMessage[i] = CommonSettings.fw_config.message[i]; + firmNickname.resize(CommonSettings.fwConfig.nicknameLength); + for (int i = 0; i < CommonSettings.fwConfig.nicknameLength; i++) + firmNickname[i] = CommonSettings.fwConfig.nickname[i]; + firmMessage.resize(CommonSettings.fwConfig.messageLength); + for (int i = 0; i < CommonSettings.fwConfig.messageLength; i++) + firmMessage[i] = CommonSettings.fwConfig.message[i]; - firmFavColour = CommonSettings.fw_config.fav_colour; - firmBirthMonth = CommonSettings.fw_config.birth_month; - firmBirthDay = CommonSettings.fw_config.birth_day; - firmLanguage = CommonSettings.fw_config.language; + firmFavColour = CommonSettings.fwConfig.favoriteColor; + firmBirthMonth = CommonSettings.fwConfig.birthdayMonth; + firmBirthDay = CommonSettings.fwConfig.birthdayDay; + firmLanguage = CommonSettings.fwConfig.language; } advancedTiming = CommonSettings.advanced_timing; jitBlockSize = CommonSettings.use_jit ? CommonSettings.jit_max_block_size : 0; @@ -356,18 +356,18 @@ int MovieData::dump(EMUFILE &fp, bool binary) } else { - std::wstring wnick((wchar_t*)CommonSettings.fw_config.nickname,CommonSettings.fw_config.nickname_len); + std::wstring wnick((wchar_t*)CommonSettings.fwConfig.nickname, CommonSettings.fwConfig.nicknameLength); std::string nick = wcstombs(wnick); - std::wstring wmessage((wchar_t*)CommonSettings.fw_config.message,CommonSettings.fw_config.message_len); + std::wstring wmessage((wchar_t*)CommonSettings.fwConfig.message, CommonSettings.fwConfig.messageLength); std::string message = wcstombs(wmessage); fp.fprintf("firmNickname %s\n", nick.c_str()); fp.fprintf("firmMessage %s\n", message.c_str()); - fp.fprintf("firmFavColour %d\n", CommonSettings.fw_config.fav_colour); - fp.fprintf("firmBirthMonth %d\n", CommonSettings.fw_config.birth_month); - fp.fprintf("firmBirthDay %d\n", CommonSettings.fw_config.birth_day); - fp.fprintf("firmLanguage %d\n", CommonSettings.fw_config.language); + fp.fprintf("firmFavColour %d\n", CommonSettings.fwConfig.favoriteColor); + fp.fprintf("firmBirthMonth %d\n", CommonSettings.fwConfig.birthdayMonth); + fp.fprintf("firmBirthDay %d\n", CommonSettings.fwConfig.birthdayDay); + fp.fprintf("firmLanguage %d\n", CommonSettings.fwConfig.language); } fp.fprintf("advancedTiming %d\n", CommonSettings.advanced_timing?1:0); @@ -574,28 +574,28 @@ static void LoadSettingsFromMovie(MovieData movieData) { if (movieData.firmNickname != "") { - CommonSettings.fw_config.nickname_len = movieData.firmNickname.length() > MAX_FW_NICKNAME_LENGTH ? MAX_FW_NICKNAME_LENGTH : movieData.firmNickname.length(); - for (int i = 0; i < CommonSettings.fw_config.nickname_len; i++) - CommonSettings.fw_config.nickname[i] = movieData.firmNickname[i]; + CommonSettings.fwConfig.nicknameLength = movieData.firmNickname.length() > MAX_FW_NICKNAME_LENGTH ? MAX_FW_NICKNAME_LENGTH : movieData.firmNickname.length(); + for (int i = 0; i < CommonSettings.fwConfig.nicknameLength; i++) + CommonSettings.fwConfig.nickname[i] = movieData.firmNickname[i]; } if (movieData.firmMessage != "") { - CommonSettings.fw_config.message_len = movieData.firmMessage.length() > MAX_FW_MESSAGE_LENGTH ? MAX_FW_MESSAGE_LENGTH : movieData.firmMessage.length(); - for (int i = 0; i < CommonSettings.fw_config.message_len; i++) - CommonSettings.fw_config.message[i] = movieData.firmMessage[i]; + CommonSettings.fwConfig.messageLength = movieData.firmMessage.length() > MAX_FW_MESSAGE_LENGTH ? MAX_FW_MESSAGE_LENGTH : movieData.firmMessage.length(); + for (int i = 0; i < CommonSettings.fwConfig.messageLength; i++) + CommonSettings.fwConfig.message[i] = movieData.firmMessage[i]; } if (movieData.firmFavColour != -1) - CommonSettings.fw_config.fav_colour = movieData.firmFavColour; + CommonSettings.fwConfig.favoriteColor = movieData.firmFavColour; if (movieData.firmBirthMonth != -1) - CommonSettings.fw_config.birth_month = movieData.firmBirthMonth; + CommonSettings.fwConfig.birthdayMonth = movieData.firmBirthMonth; if (movieData.firmBirthDay != -1) - CommonSettings.fw_config.birth_day = movieData.firmBirthDay; + CommonSettings.fwConfig.birthdayDay = movieData.firmBirthDay; if (movieData.firmLanguage != -1) - CommonSettings.fw_config.language = movieData.firmLanguage; + CommonSettings.fwConfig.language = movieData.firmLanguage; // reset firmware (some games can write to it) - NDS_CreateDummyFirmware(&CommonSettings.fw_config); + NDS_InitFirmwareWithConfig(CommonSettings.fwConfig); } if (movieData.advancedTiming != -1) CommonSettings.advanced_timing = movieData.advancedTiming; @@ -781,7 +781,7 @@ void FCEUI_SaveMovie(const char *fname, std::wstring author, START_FROM startFro // reset firmware (some games can write to it) if (!CommonSettings.UseExtFirmware) { - NDS_CreateDummyFirmware(&CommonSettings.fw_config); + NDS_InitFirmwareWithConfig(CommonSettings.fwConfig); } diff --git a/desmume/src/saves.cpp b/desmume/src/saves.cpp index fc2768675..703eed3c4 100644 --- a/desmume/src/saves.cpp +++ b/desmume/src/saves.cpp @@ -504,7 +504,7 @@ static void mmu_savestate(EMUFILE &os) //version 8: os.write_32LE(MMU.fw.size); - os.fwrite(MMU.fw.data,MMU.fw.size); + os.fwrite(MMU.fw.data._raw, MMU.fw.size); } static bool mmu_loadstate(EMUFILE &is, int size) @@ -594,11 +594,10 @@ static bool mmu_loadstate(EMUFILE &is, int size) if (version < 8) return ok; //version 8: - delete[] MMU.fw.data; + memset(MMU.fw.data._raw, 0, sizeof(NDSFirmwareData)); MMU.fw.size = is.read_u32LE(); - MMU.fw.data = new u8[size]; - is.fread(MMU.fw.data,MMU.fw.size); - + is.fread(MMU.fw.data._raw, MMU.fw.size); + return ok; } diff --git a/desmume/src/wifi.cpp b/desmume/src/wifi.cpp index 2370739a1..b128a4632 100755 --- a/desmume/src/wifi.cpp +++ b/desmume/src/wifi.cpp @@ -4748,16 +4748,21 @@ bool WifiHandler::CommStart() { case WifiMACMode_Automatic: this->GenerateMACFromValues(FW_Mac); - NDS_PatchFirmwareMAC(); + NDS_OverrideFirmwareMAC(FW_Mac); break; case WifiMACMode_Manual: this->CopyMACFromUserValues(FW_Mac); - NDS_PatchFirmwareMAC(); + NDS_OverrideFirmwareMAC(FW_Mac); break; case WifiMACMode_ReadFromFirmware: - memcpy(FW_Mac, (MMU.fw.data + 0x36), 6); + 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; }