Allow setting of firmware language value.

This commit is contained in:
masscat 2007-06-20 14:29:11 +00:00
parent 90998b1e8b
commit 6dcd2f44f3
8 changed files with 485 additions and 176 deletions

View File

@ -30,11 +30,13 @@
#include "cflash.h"
#include "ROMReader.h"
/* the count of bytes copied from the firmware into memory */
#define NDS_FW_USER_SETTINGS_MEM_BYTE_COUNT 0x70
NDSSystem nds;
NDSFirmware firmware;
static u32
calc_CRC16( u32 start, u8 *data, int count) {
calc_CRC16( u32 start, const u8 *data, int count) {
int i,j;
u32 crc = start & 0xffff;
static u16 val[] = { 0xC0C1,0xC181,0xC301,0xC601,0xCC01,0xD801,0xF001,0xA001 };
@ -58,6 +60,82 @@ calc_CRC16( u32 start, u8 *data, int count) {
return crc;
}
static int
copy_firmware_user_data( u8 *dest_buffer, const u8 *fw_data) {
/*
* Determine which of the two user settings in the firmware is the current
* and valid one and then copy this into the destination buffer.
*
* The current setting will have a greater count.
* Settings are only valid if its CRC16 is correct.
*/
int user1_valid = 0;
int user2_valid = 0;
u32 user_settings_offset;
u32 fw_crc;
u32 crc;
int copy_good = 0;
user_settings_offset = fw_data[0x20];
user_settings_offset |= fw_data[0x21] << 8;
user_settings_offset <<= 3;
if ( user_settings_offset <= 0x3FE00) {
s32 copy_settings_offset = -1;
crc = calc_CRC16( 0xffff, &fw_data[user_settings_offset],
NDS_FW_USER_SETTINGS_MEM_BYTE_COUNT);
fw_crc = fw_data[user_settings_offset + 0x72];
fw_crc |= fw_data[user_settings_offset + 0x73] << 8;
if ( crc == fw_crc) {
user1_valid = 1;
}
crc = calc_CRC16( 0xffff, &fw_data[user_settings_offset + 0x100],
NDS_FW_USER_SETTINGS_MEM_BYTE_COUNT);
fw_crc = fw_data[user_settings_offset + 0x100 + 0x72];
fw_crc |= fw_data[user_settings_offset + 0x100 + 0x73] << 8;
if ( crc == fw_crc) {
user2_valid = 1;
}
if ( user1_valid) {
if ( user2_valid) {
u16 count1, count2;
count1 = fw_data[user_settings_offset + 0x70];
count1 |= fw_data[user_settings_offset + 0x71] << 8;
count2 = fw_data[user_settings_offset + 0x100 + 0x70];
count2 |= fw_data[user_settings_offset + 0x100 + 0x71] << 8;
if ( count2 > count1) {
copy_settings_offset = user_settings_offset + 0x100;
}
else {
copy_settings_offset = user_settings_offset;
}
}
else {
copy_settings_offset = user_settings_offset;
}
}
else if ( user2_valid) {
/* copy the second user settings */
copy_settings_offset = user_settings_offset + 0x100;
}
if ( copy_settings_offset > 0) {
memcpy( dest_buffer, &fw_data[copy_settings_offset],
NDS_FW_USER_SETTINGS_MEM_BYTE_COUNT);
copy_good = 1;
}
}
return copy_good;
}
int NDS_Init( struct armcpu_memory_iface *arm9_mem_if,
struct armcpu_ctrl_iface **arm9_ctrl_iface,
struct armcpu_memory_iface *arm7_mem_if,
@ -78,15 +156,6 @@ int NDS_Init( struct armcpu_memory_iface *arm9_mem_if,
if (SPU_Init(SNDCORE_DUMMY, 735) != 0)
return -1;
sprintf(firmware.nickName,"yopyop");
firmware.nickLen = strlen(firmware.nickName);
sprintf(firmware.message,"Hi,it/s me!");
firmware.msgLen = strlen(firmware.message);
firmware.bDay = 15;
firmware.bMonth = 7;
firmware.favColor = 10;
firmware.language = 2;
#ifdef EXPERIMENTAL_WIFI
WIFI_Init(&wifiMac) ;
@ -339,6 +408,8 @@ void NDS_FreeROM(void)
MMU.bupmem.fp = NULL;
}
void NDS_Reset( void)
{
BOOL oldexecute=execute;
@ -392,36 +463,20 @@ void NDS_Reset( void)
MMU_writeHWord(1, 0x04000130, 0x3FF);
MMU_writeByte(1, 0x04000136, 0x43);
MMU_writeByte(0, 0x027FFCDC, 0x20);
MMU_writeByte(0, 0x027FFCDD, 0x20);
MMU_writeByte(0, 0x027FFCE2, 0xE0);
MMU_writeByte(0, 0x027FFCE3, 0x80);
MMU_writeHWord(0, 0x027FFCD8, 0x20<<4);
MMU_writeHWord(0, 0x027FFCDA, 0x20<<4);
MMU_writeHWord(0, 0x027FFCDE, 0xE0<<4);
MMU_writeHWord(0, 0x027FFCE0, 0x80<<4);
/*
* Setup a copy of the firmware user settings in memory.
* (this is what the DS firmware would do).
*/
{
u8 temp_buffer[NDS_FW_USER_SETTINGS_MEM_BYTE_COUNT];
int fw_index;
MMU_writeWord(0, 0x027FFE40, 0xE188);
MMU_writeWord(0, 0x027FFE44, 0x9);
MMU_writeWord(0, 0x027FFE48, 0xE194);
MMU_writeWord(0, 0x027FFE4C, 0x0);
// logcount = 0;
MMU_writeByte(0, 0x023FFC80, 1);
MMU_writeByte(0, 0x023FFC82, firmware.favColor);
MMU_writeByte(0, 0x023FFC83, firmware.bMonth);
MMU_writeByte(0, 0x023FFC84, firmware.bDay);
for(i=0; i<firmware.nickLen; i++)
MMU_writeHWord(0, 0x023FFC86+(2*i), firmware.nickName[i]);
MMU_writeHWord(0, 0x023FFC9A, firmware.nickLen);
for(i=0; i<firmware.msgLen; i++)
MMU_writeHWord(0, 0x023FFC9C+(2*i), firmware.message[i]);
MMU_writeHWord(0, 0x023FFCD0, firmware.msgLen);
MMU_writeHWord(0, 0x023FFCE4, firmware.language); //Language 1=English 2=French
if ( copy_firmware_user_data( temp_buffer, MMU.fw.data)) {
for ( fw_index = 0; fw_index < NDS_FW_USER_SETTINGS_MEM_BYTE_COUNT; fw_index++) {
MMU_writeByte( 0, 0x027FFC80 + fw_index, temp_buffer[fw_index]);
}
}
}
MMU_writeWord(0, 0x027FFE40, header->FNameTblOff);
MMU_writeWord(0, 0x027FFE44, header->FNameTblSize);
@ -458,16 +513,16 @@ void NDS_Reset( void)
MMU_writeWord(1, 0x34, 0xE25EF004);
//ARM9 BIOS IRQ HANDLER
MMU_writeWord(0, 0xFFF0018, 0xEA000000);
MMU_writeWord(0, 0xFFF0020, 0xE92D500F);
MMU_writeWord(0, 0xFFF0024, 0xEE190F11);
MMU_writeWord(0, 0xFFF0028, 0xE1A00620);
MMU_writeWord(0, 0xFFF002C, 0xE1A00600);
MMU_writeWord(0, 0xFFF0030, 0xE2800C40);
MMU_writeWord(0, 0xFFF0034, 0xE28FE000);
MMU_writeWord(0, 0xFFF0038, 0xE510F004);
MMU_writeWord(0, 0xFFF003C, 0xE8BD500F);
MMU_writeWord(0, 0xFFF0040, 0xE25EF004);
MMU_writeWord(0, 0xFFFF0018, 0xEA000000);
MMU_writeWord(0, 0xFFFF0020, 0xE92D500F);
MMU_writeWord(0, 0xFFFF0024, 0xEE190F11);
MMU_writeWord(0, 0xFFFF0028, 0xE1A00620);
MMU_writeWord(0, 0xFFFF002C, 0xE1A00600);
MMU_writeWord(0, 0xFFFF0030, 0xE2800C40);
MMU_writeWord(0, 0xFFFF0034, 0xE28FE000);
MMU_writeWord(0, 0xFFFF0038, 0xE510F004);
MMU_writeWord(0, 0xFFFF003C, 0xE8BD500F);
MMU_writeWord(0, 0xFFFF0040, 0xE25EF004);
MMU_writeWord(0, 0x0000004, 0xE3A0010E);
MMU_writeWord(0, 0x0000008, 0xE3A01020);
@ -482,8 +537,6 @@ void NDS_Reset( void)
GPU_Reset(SubScreen.gpu, 1);
SPU_Reset();
NDS_CreateDummyFirmware() ;
execute = oldexecute;
}
@ -587,9 +640,12 @@ int NDS_WriteBMP(const char *filename)
return 1;
}
static
void create_user_data( u8 *data, int count) {
static void
fill_user_data_area( struct NDS_fw_config_data *user_settings,
u8 *data, int count) {
u32 crc;
int i;
u8 *ts_cal_data_area;
memset( data, 0, 0x100);
@ -598,75 +654,46 @@ void create_user_data( u8 *data, int count) {
data[0x01] = 0;
/* colour */
data[0x02] = 7;
data[0x02] = user_settings->fav_colour;
/* birthday month and day */
data[0x03] = 6;
data[0x04] = 23;
data[0x03] = user_settings->birth_month;
data[0x04] = user_settings->birth_day;
/* nickname and length */
data[0x06] = 'y';
data[0x08] = 'o';
data[0x0a] = 'p';
data[0x0c] = 'y';
data[0x0e] = 'o';
data[0x10] = 'p';
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;
}
data[0x1a] = 6;
data[0x1a] = user_settings->nickname_len;
/* Message */
data[0x1c] = 'D';
data[0x1e] = 'e';
data[0x20] = 'S';
data[0x22] = 'm';
data[0x24] = 'u';
data[0x26] = 'M';
data[0x28] = 'E';
data[0x2a] = ' ';
data[0x2c] = 'm';
data[0x2e] = 'a';
data[0x30] = 'k';
data[0x32] = 'e';
data[0x34] = 's';
data[0x36] = ' ';
data[0x38] = 'y';
data[0x3a] = 'o';
data[0x3c] = 'u';
data[0x3e] = ' ';
data[0x40] = 'h';
data[0x42] = 'a';
data[0x44] = 'p';
data[0x46] = 'p';
data[0x48] = 'y';
data[0x4a] = '!';
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;
}
data[0x50] = 24;
data[0x50] = user_settings->message_len;
/*
* touch screen calibration
*/
/* ADC position 1, x y */
data[0x58] = 0x00;
data[0x59] = 0x02;
data[0x5a] = 0x00;
data[0x5b] = 0x02;
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 pos 1, x y */
data[0x5c] = 0x20;
data[0x5d] = 0x20;
/* ADC position 2, x y */
data[0x5e] = 0x00;
data[0x5f] = 0x0e;
data[0x60] = 0x00;
data[0x61] = 0x08;
/* screen pos 2, x y */
data[0x62] = 0xe0;
data[0x63] = 0x80;
/* 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] = 0x01;
data[0x64] = user_settings->language;
data[0x65] = 0xfc;
/* update count and crc */
@ -681,7 +708,7 @@ void create_user_data( u8 *data, int count) {
}
/* creates an firmware flash image, which contains all needed info to initiate a wifi connection */
int NDS_CreateDummyFirmware(void)
int NDS_CreateDummyFirmware( struct NDS_fw_config_data *user_settings)
{
/*
* Create the firmware header
@ -694,8 +721,11 @@ int NDS_CreateDummyFirmware(void)
MMU.fw.data[0x8 + 2] = 'C';
MMU.fw.data[0x8 + 3] = 'P';
/* DS type (phat) */
MMU.fw.data[0x1d] = 0xff;
/* DS type */
if ( user_settings->ds_type == NDS_FW_DS_TYPE_LITE)
MMU.fw.data[0x1d] = 0x20;
else
MMU.fw.data[0x1d] = 0xff;
/* User Settings offset 0x3fe00 / 8 */
MMU.fw.data[0x20] = 0xc0;
@ -705,8 +735,8 @@ int NDS_CreateDummyFirmware(void)
/*
* User settings (at 0x3FE00 and 0x3FE00)
*/
create_user_data( &MMU.fw.data[ 0x3FE00], 0);
create_user_data( &MMU.fw.data[ 0x3FF00], 1);
fill_user_data_area( user_settings, &MMU.fw.data[ 0x3FE00], 0);
fill_user_data_area( user_settings, &MMU.fw.data[ 0x3FF00], 1);
#ifdef EXPERIMENTAL_WIFI
@ -724,6 +754,48 @@ int NDS_CreateDummyFirmware(void)
return TRUE ;
}
void
NDS_FillDefaultFirmwareConfigData( struct NDS_fw_config_data *fw_config) {
const char *default_nickname = "yopyop";
const char *default_message = "DeSmuME makes you happy!";
int i;
int str_length;
memset( fw_config, 0, sizeof( struct NDS_fw_config_data));
fw_config->ds_type = NDS_FW_DS_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;
/* default touchscreen calibration */
fw_config->touch_cal[0].adc_x = 0x200;
fw_config->touch_cal[0].adc_y = 0x200;
fw_config->touch_cal[0].screen_x = 0x20;
fw_config->touch_cal[0].screen_y = 0x20;
fw_config->touch_cal[1].adc_x = 0xe00;
fw_config->touch_cal[1].adc_y = 0x800;
fw_config->touch_cal[1].screen_x = 0xe0;
fw_config->touch_cal[1].screen_y = 0x80;
}
int NDS_LoadFirmware(const char *filename)
{
int i;

View File

@ -35,9 +35,23 @@
extern "C" {
#endif
extern volatile BOOL execute;
extern BOOL click;
/*
* The firmware language values
*/
#define NDS_FW_LANG_JAP 0
#define NDS_FW_LANG_ENG 1
#define NDS_FW_LANG_FRE 2
#define NDS_FW_LANG_GER 3
#define NDS_FW_LANG_ITA 4
#define NDS_FW_LANG_SPA 5
#define NDS_FW_LANG_CHI 6
#define NDS_FW_LANG_RES 7
//#define LOG_ARM9
//#define LOG_ARM7
@ -111,27 +125,54 @@ typedef struct
u16 touchY;
} NDSSystem;
typedef struct
{
u8 favColor;
u8 bMonth;
u8 bDay;
char nickName[10];
u8 nickLen;
char message[26];
u8 msgLen;
u8 language;
} NDSFirmware;
/** /brief A touchscreen calibration point.
*/
struct NDS_fw_touchscreen_cal {
u16 adc_x;
u16 adc_y;
u8 screen_x;
u8 screen_y;
};
/** /brief The type of DS
*/
enum nds_fw_ds_type {
NDS_FW_DS_TYPE_FAT,
NDS_FW_DS_TYPE_LITE
};
#define MAX_FW_NICKNAME_LENGTH 10
#define MAX_FW_MESSAGE_LENGTH 26
struct NDS_fw_config_data {
enum nds_fw_ds_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 */
struct NDS_fw_touchscreen_cal touch_cal[2];
};
extern NDSSystem nds;
extern NDSFirmware firmware;
int NDS_Init( struct armcpu_memory_iface *arm9_mem_if,
struct armcpu_ctrl_iface **arm9_ctrl_iface,
struct armcpu_memory_iface *arm7_mem_if,
struct armcpu_ctrl_iface **arm7_ctrl_iface);
void NDS_DeInit(void);
void
NDS_FillDefaultFirmwareConfigData( struct NDS_fw_config_data *fw_config);
BOOL NDS_SetROM(u8 * rom, u32 mask);
NDS_header * NDS_getROMHeader(void);
@ -147,7 +188,7 @@ int NDS_ImportSave(const char *filename);
int NDS_WriteBMP(const char *filename);
int NDS_LoadFirmware(const char *filename);
int NDS_CreateDummyFirmware(void);
int NDS_CreateDummyFirmware( struct NDS_fw_config_data *user_settings);
u32
NDS_exec(s32 nb, BOOL force);

View File

@ -109,6 +109,8 @@ struct my_config {
#endif
int disable_limiter;
int firmware_language;
const char *nds_file;
const char *cflash_disk_image_file;
};
@ -130,6 +132,9 @@ init_config( struct my_config *config) {
config->opengl_2d = 0;
config->soft_colour_convert = 0;
#endif
/* use the default language */
config->firmware_language = -1;
}
@ -152,6 +157,14 @@ fill_config( struct my_config *config,
printf( " screen rendering. May produce better or worse\n");
printf( " frame rates depending on hardware.\n");
#endif
printf( "\n");
printf( " --fwlang=LANG Set the language in the firmware, LANG as follows:\n");
printf( " 0 = Japanese\n");
printf( " 1 = English\n");
printf( " 2 = French\n");
printf( " 3 = German\n");
printf( " 4 = Italian\n");
printf( " 5 = Spanish\n");
printf( "\n");
printf( " --arm9gdb=PORT_NUM Enable the ARM9 GDB stub on the given port\n");
printf( " --arm7gdb=PORT_NUM Enable the ARM7 GDB stub on the given port\n");
@ -177,6 +190,18 @@ fill_config( struct my_config *config,
else if ( strcmp( argv[i], "--disable-limiter") == 0) {
config->disable_limiter = 1;
}
else if ( strncmp( argv[i], "--fwlang=", 9) == 0) {
char *end_char;
int lang = strtoul( &argv[i][9], &end_char, 10);
if ( lang >= 0 && lang <= 5) {
config->firmware_language = lang;
}
else {
fprintf( stderr, "Firmware language must be set to a value from 0 to 5.\n");
good_args = 0;
}
}
else if ( strncmp( argv[i], "--arm9gdb=", 10) == 0) {
char *end_char;
unsigned long port_num = strtoul( &argv[i][10], &end_char, 10);
@ -532,12 +557,23 @@ int main(int argc, char ** argv) {
/* this holds some info about our display */
const SDL_VideoInfo *videoInfo;
/* the firmware settings */
struct NDS_fw_config_data fw_config;
/* default the firmware settings, they may get changed later */
NDS_FillDefaultFirmwareConfigData( &fw_config);
init_config( &my_config);
if ( !fill_config( &my_config, argc, argv)) {
exit(1);
}
/* use any language set on the command line */
if ( my_config.firmware_language != -1) {
fw_config.language = my_config.firmware_language;
}
if ( my_config.arm9_gdb_port != 0) {
arm9_gdb_stub = createStub_gdb( my_config.arm9_gdb_port,
&arm9_memio,
@ -567,6 +603,9 @@ int main(int argc, char ** argv) {
NDS_Init( arm9_memio, &arm9_ctrl_iface,
arm7_memio, &arm7_ctrl_iface);
/* Create the dummy firmware */
NDS_CreateDummyFirmware( &fw_config);
if ( !my_config.disable_sound) {
SPU_ChangeSoundCore(SNDCORE_SDL, 735 * 4);
}

View File

@ -72,6 +72,8 @@ struct configured_features {
u16 arm9_gdb_port;
u16 arm7_gdb_port;
int firmware_language;
const char *nds_file;
};
@ -87,6 +89,9 @@ init_configured_features( struct configured_features *config) {
config->disable_limiter = 0;
config->nds_file = NULL;
/* use the default language */
config->firmware_language = -1;
}
static int
@ -110,6 +115,14 @@ fill_configured_features( struct configured_features *config,
#endif
g_print( " --disable-limiter Disables the 60 fps limiter\n");
g_print( "\n");
g_print( " --fwlang=LANG Set the language in the firmware, LANG as follows:\n");
g_print( " 0 = Japanese\n");
g_print( " 1 = English\n");
g_print( " 2 = French\n");
g_print( " 3 = German\n");
g_print( " 4 = Italian\n");
g_print( " 5 = Spanish\n");
g_print( "\n");
g_print( " --arm9gdb=PORT_NUM Enable the ARM9 GDB stub on the given port\n");
g_print( " --arm7gdb=PORT_NUM Enable the ARM7 GDB stub on the given port\n");
//g_print( " --sticky Enable sticky keys and stylus\n");
@ -125,6 +138,18 @@ fill_configured_features( struct configured_features *config,
config->disable_3d = 1;
}
#endif
else if ( strncmp( argv[i], "--fwlang=", 9) == 0) {
char *end_char;
int lang = strtoul( &argv[i][9], &end_char, 10);
if ( lang >= 0 && lang <= 5) {
config->firmware_language = lang;
}
else {
g_print( stderr, "Firmware language must be set to a value from 0 to 5.\n");
good_args = 0;
}
}
else if ( strncmp( argv[i], "--arm9gdb=", 10) == 0) {
char *end_char;
unsigned long port_num = strtoul( &argv[i][10], &end_char, 10);
@ -403,6 +428,16 @@ common_gtk_glade_main( struct configured_features *my_config) {
struct armcpu_memory_iface *arm7_memio = &arm7_base_memory_iface;
struct armcpu_ctrl_iface *arm9_ctrl_iface;
struct armcpu_ctrl_iface *arm7_ctrl_iface;
/* the firmware settings */
struct NDS_fw_config_data fw_config;
/* default the firmware settings, they may get changed later */
NDS_FillDefaultFirmwareConfigData( &fw_config);
/* use any language set on the command line */
if ( my_config->firmware_language != -1) {
fw_config.language = my_config->firmware_language;
}
#ifdef GTKGLEXT_AVAILABLE
// check if you have GTHREAD when running configure script
@ -449,6 +484,10 @@ common_gtk_glade_main( struct configured_features *my_config) {
desmume_init( arm9_memio, &arm9_ctrl_iface,
arm7_memio, &arm7_ctrl_iface);
/* Create the dummy firmware */
NDS_CreateDummyFirmware( &fw_config);
/*
* Activate the GDB stubs
* This has to come after the NDS_Init (called in desmume_init)

View File

@ -112,6 +112,8 @@ struct configured_features {
u16 arm9_gdb_port;
u16 arm7_gdb_port;
int firmware_language;
const char *nds_file;
const char *cflash_disk_image_file;
};
@ -133,6 +135,9 @@ init_configured_features( struct configured_features *config) {
config->nds_file = NULL;
config->cflash_disk_image_file = NULL;
/* use the default language */
config->firmware_language = -1;
}
static int
@ -158,6 +163,14 @@ fill_configured_features( struct configured_features *config,
printf( " --disable-sound Disables the sound emulation\n");
printf( " --disable-limiter Disables the 60 fps limiter\n");
printf( "\n");
printf( " --fwlang=LANG Set the language in the firmware, LANG as follows:\n");
printf( " 0 = Japanese\n");
printf( " 1 = English\n");
printf( " 2 = French\n");
printf( " 3 = German\n");
printf( " 4 = Italian\n");
printf( " 5 = Spanish\n");
printf( "\n");
printf( " --arm9gdb=PORT_NUM Enable the ARM9 GDB stub on the given port\n");
printf( " --arm7gdb=PORT_NUM Enable the ARM7 GDB stub on the given port\n");
//printf( " --sticky Enable sticky keys and stylus\n");
@ -185,6 +198,18 @@ fill_configured_features( struct configured_features *config,
else if ( strcmp( argv[i], "--disable-limiter") == 0) {
config->disable_limiter = 1;
}
else if ( strncmp( argv[i], "--fwlang=", 9) == 0) {
char *end_char;
int lang = strtoul( &argv[i][9], &end_char, 10);
if ( lang >= 0 && lang <= 5) {
config->firmware_language = lang;
}
else {
fprintf( stderr, "Firmware language must be set to a value from 0 to 5.\n");
good_args = 0;
}
}
else if ( strncmp( argv[i], "--arm9gdb=", 10) == 0) {
char *end_char;
unsigned long port_num = strtoul( &argv[i][10], &end_char, 10);
@ -1553,6 +1578,17 @@ common_gtk_main( struct configured_features *my_config) {
struct armcpu_ctrl_iface *arm9_ctrl_iface;
struct armcpu_ctrl_iface *arm7_ctrl_iface;
/* the firmware settings */
struct NDS_fw_config_data fw_config;
/* default the firmware settings, they may get changed later */
NDS_FillDefaultFirmwareConfigData( &fw_config);
/* use any language set on the command line */
if ( my_config->firmware_language != -1) {
fw_config.language = my_config->firmware_language;
}
bad_glob_cflash_disk_image_file = my_config->cflash_disk_image_file;
#ifdef DEBUG
@ -1627,6 +1663,9 @@ common_gtk_main( struct configured_features *my_config) {
activateStub_gdb( arm7_gdb_stub, arm7_ctrl_iface);
}
/* Create the dummy firmware */
NDS_CreateDummyFirmware( &fw_config);
/* Initialize joysticks */
if(!init_joy()) return 1;

View File

@ -37,6 +37,9 @@
char IniName[MAX_PATH];
u32 keytab[12];
static char nickname_buffer[11];
static char message_buffer[27];
const char firmLang[6][16] = {"Japanese","English","French","German","Italian","Spanish"};
const char firmColor[16][16] = {"Gray","Brown","Red","Pink","Orange","Yellow","Lime Green",
"Green","Dark Green","Sea Green","Turquoise","Blue",
@ -47,68 +50,110 @@ 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"};
void ReadFirmConfig(void)
static void WriteFirmConfig( struct NDS_fw_config_data *fw_config)
{
char temp_str[27];
int i;
GetINIPath(IniName,MAX_PATH);
memset(&firmware,0,sizeof(firmware));
firmware.favColor = GetPrivateProfileInt("Firmware","favColor", 10, IniName);
firmware.bMonth = GetPrivateProfileInt("Firmware","bMonth", 7, IniName);
firmware.bDay = GetPrivateProfileInt("Firmware","bDay", 15, IniName);
GetPrivateProfileString("Firmware","nickName", "yopyop", firmware.nickName, 10, IniName);
firmware.nickLen = strlen(firmware.nickName);
GetPrivateProfileString("Firmware","Message", "Hi,it/s me!", firmware.message, 26, IniName);
firmware.msgLen = strlen(firmware.message);
firmware.language = GetPrivateProfileInt("Firmware","Language", 2, IniName);
}
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);
void WriteFirmConfig(void)
{
GetINIPath(IniName,MAX_PATH);
/* 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];
}
temp_str[i] = '\0';
WritePrivateProfileString("Firmware", "nickName", temp_str, IniName);
WritePrivateProfileInt("Firmware","favColor",firmware.favColor,IniName);
WritePrivateProfileInt("Firmware","bMonth",firmware.bMonth,IniName);
WritePrivateProfileInt("Firmware","bDay",firmware.bDay,IniName);
WritePrivateProfileInt("Firmware","Language",firmware.language,IniName);
WritePrivateProfileString("Firmware","nickName", firmware.nickName, IniName);
WritePrivateProfileString("Firmware","Message", firmware.message, IniName);
for ( i = 0; i < fw_config->message_len; i++) {
temp_str[i] = fw_config->message[i];
}
temp_str[i] = '\0';
WritePrivateProfileString("Firmware","Message", temp_str, IniName);
}
BOOL CALLBACK FirmConfig_Proc(HWND dialog,UINT komunikat,WPARAM wparam,LPARAM lparam)
{
int i,j;
char tempstring[256];
struct NDS_fw_config_data *fw_config = &win_fw_config;
int i;
char temp_str[27];
switch(komunikat)
{
case WM_INITDIALOG:
ReadConfig();
for(i=0;i<6;i++) SendDlgItemMessage(dialog,IDC_COMBO4,CB_ADDSTRING,0,(LPARAM)&firmLang[i]);
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,firmware.favColor,0);
SendDlgItemMessage(dialog,IDC_COMBO2,CB_SETCURSEL,firmware.bMonth-1,0);
SendDlgItemMessage(dialog,IDC_COMBO3,CB_SETCURSEL,firmware.bDay-1,0);
SendDlgItemMessage(dialog,IDC_COMBO4,CB_SETCURSEL,firmware.language,0);
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_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);
SendDlgItemMessage(dialog,IDC_EDIT1,EM_REPLACESEL,0,(LPARAM)&firmware.nickName);
SendDlgItemMessage(dialog,IDC_EDIT2,EM_REPLACESEL,0,(LPARAM)&firmware.message);
for ( i = 0; i < fw_config->nickname_len; i++) {
nickname_buffer[i] = fw_config->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];
}
message_buffer[i] = '\0';
SendDlgItemMessage(dialog,IDC_EDIT2,WM_SETTEXT,0,(LPARAM)message_buffer);
break;
case WM_COMMAND:
if((HIWORD(wparam)==BN_CLICKED)&&(((int)LOWORD(wparam))==IDOK))
{
firmware.favColor=SendDlgItemMessage(dialog,IDC_COMBO1,CB_GETCURSEL,0,0);
firmware.bMonth=1+SendDlgItemMessage(dialog,IDC_COMBO2,CB_GETCURSEL,0,0);
firmware.bDay=1+SendDlgItemMessage(dialog,IDC_COMBO3,CB_GETCURSEL,0,0);
firmware.language=SendDlgItemMessage(dialog,IDC_COMBO4,CB_GETCURSEL,0,0);
SendDlgItemMessage(dialog,IDC_EDIT1,EM_GETLINE,0,(LPARAM)&firmware.nickName);
SendDlgItemMessage(dialog,IDC_EDIT2,EM_GETLINE,0,(LPARAM)&firmware.message);
WriteFirmConfig();
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);
*(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);
}
else {
strcpy( temp_str, "yopyop");
fw_config->nickname_len = strlen( temp_str);
}
for ( char_index = 0; char_index < fw_config->nickname_len; char_index++) {
fw_config->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);
}
else {
fw_config->message_len = 0;
}
for ( char_index = 0; char_index < fw_config->message_len; char_index++) {
fw_config->message[char_index] = temp_str[char_index];
}
WriteFirmConfig( fw_config);
EndDialog(dialog,0);
NDS_CreateDummyFirmware( fw_config);
return 1;
}
else

View File

@ -21,7 +21,7 @@
#ifndef FIRMCONFIG_H
#define FIRMCONFIG_H
void ReadFirmConfig(void);
extern struct NDS_fw_config_data win_fw_config;
BOOL CALLBACK FirmConfig_Proc(HWND dialog,UINT komunikat,WPARAM wparam,LPARAM lparam);

View File

@ -115,6 +115,10 @@ int frameskiprate=0;
static int backupmemorytype=MC_TYPE_AUTODETECT;
static u32 backupmemorysize=1;
/* the firmware settings */
struct NDS_fw_config_data win_fw_config;
LRESULT CALLBACK SoundSettingsDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,
LPARAM lParam);
@ -600,6 +604,9 @@ int WINAPI WinMain (HINSTANCE hThisInstance,
HACCEL hAccel;
hAppInst=hThisInstance;
/* default the firmware settings, they may get changed later */
NDS_FillDefaultFirmwareConfigData( &win_fw_config);
InitializeCriticalSection(&section);
GetINIPath(IniName, MAX_PATH);
@ -667,6 +674,7 @@ int WINAPI WinMain (HINSTANCE hThisInstance,
NDS_Init( arm9_memio, &arm9_ctrl_iface,
arm7_memio, &arm7_ctrl_iface);
/*
* Activate the GDB stubs
* This has to come after the NDS_Init where the cpus are set up.
@ -707,17 +715,42 @@ int WINAPI WinMain (HINSTANCE hThisInstance,
sndvolume = GetPrivateProfileInt("Sound","Volume",100, IniName);
SPU_SetVolume(sndvolume);
memset(&firmware,0,sizeof(firmware));
firmware.favColor = GetPrivateProfileInt("Firmware","favColor", 10, IniName);
firmware.bMonth = GetPrivateProfileInt("Firmware","bMonth", 7, IniName);
firmware.bDay = GetPrivateProfileInt("Firmware","bDay", 15, IniName);
GetPrivateProfileString("Firmware","nickName", "yopyop", firmware.nickName, 10, IniName);
firmware.nickLen = strlen(firmware.nickName);
GetPrivateProfileString("Firmware","Message", "Hi,it/s me!", firmware.message, 26, IniName);
firmware.msgLen = strlen(firmware.message);
firmware.language = GetPrivateProfileInt("Firmware","Language", 2, IniName);
/* Read the firmware settings from the init file */
win_fw_config.fav_colour = GetPrivateProfileInt("Firmware","favColor", 10, IniName);
win_fw_config.birth_month = GetPrivateProfileInt("Firmware","bMonth", 7, IniName);
win_fw_config.birth_day = GetPrivateProfileInt("Firmware","bDay", 15, IniName);
win_fw_config.language = GetPrivateProfileInt("Firmware","Language", 1, IniName);
{
/*
* Read in the nickname and message.
* Convert the strings into Unicode UTF-16 characters.
*/
char temp_str[27];
int char_index;
GetPrivateProfileString("Firmware","nickName", "yopyop", temp_str, 11, IniName);
win_fw_config.nickname_len = strlen( temp_str);
if ( win_fw_config.nickname_len == 0) {
strcpy( temp_str, "yopyop");
win_fw_config.nickname_len = strlen( temp_str);
}
for ( char_index = 0; char_index < win_fw_config.nickname_len; char_index++) {
win_fw_config.nickname[char_index] = temp_str[char_index];
}
GetPrivateProfileString("Firmware","Message", "DeSmuME makes you happy!", temp_str, 27, IniName);
win_fw_config.message_len = strlen( temp_str);
for ( char_index = 0; char_index < win_fw_config.message_len; char_index++) {
win_fw_config.message[char_index] = temp_str[char_index];
}
}
/* Create the dummy firmware */
NDS_CreateDummyFirmware( &win_fw_config);
runthread = CreateThread(NULL, 0, run, NULL, 0, &threadID);
// Make sure any quotes from lpszArgument are removed
@ -1497,7 +1530,8 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
{
cwindow_struct FirmConfig;
if (CWindow_Init2(&FirmConfig, hAppInst, HWND_DESKTOP, "Configure Controls", IDD_FIRMSETTINGS, FirmConfig_Proc) == 0)
if (CWindow_Init2(&FirmConfig, hAppInst, HWND_DESKTOP,
"Configure Controls", IDD_FIRMSETTINGS, FirmConfig_Proc) == 0)
CWindow_Show(&FirmConfig);
}