From d084a58cf7c1ab4de604f23f765027e8ec4fc405 Mon Sep 17 00:00:00 2001 From: msiewert76 Date: Fri, 14 Oct 2011 20:11:54 +0000 Subject: [PATCH] - Improve string parsing; bugs introduced with earlier commits should be gone now - Add some very preliminary bits for importing a custom font fileExists - Add "displayDebugF" function for easier debugging - Add some comments on dsiwarehax mode to instructions file --- arm9/source/auxspi.cpp | 5 +- arm9/source/display.cpp | 17 +++++ arm9/source/display.h | 2 + arm9/source/globals.h | 4 + arm9/source/hardware.cpp | 2 +- arm9/source/main.cpp | 5 +- arm9/source/strings.cpp | 159 ++++++++++++++++++++++++++------------- savegame_manager.odt | Bin 27655 -> 28452 bytes savegame_manager.pnproj | 2 +- 9 files changed, 138 insertions(+), 58 deletions(-) diff --git a/arm9/source/auxspi.cpp b/arm9/source/auxspi.cpp index 02d98bf..9a89897 100644 --- a/arm9/source/auxspi.cpp +++ b/arm9/source/auxspi.cpp @@ -27,6 +27,7 @@ #include "auxspi.h" #include "hardware.h" #include "globals.h" +#include "display.h" #include @@ -89,7 +90,6 @@ uint8 type2_size(auxspi_extra extra) } // ======================================================== - uint8 auxspi_save_type(auxspi_extra extra) { uint32 jedec = auxspi_save_jedec_id(extra); // 9f @@ -130,6 +130,7 @@ uint32 auxspi_save_jedec_id(auxspi_extra extra) uint32 id = 0; if (extra) auxspi_disable_extra(extra); + auxspi_open(0); auxspi_write(0x9f); id |= auxspi_read() << 16; @@ -323,7 +324,7 @@ void auxspi_disable_big_protection() auxspi_extra auxspi_has_extra() { sysSetBusOwners(true, true); - + // Trying to read the save size in IR mode will fail on non-IR devices. // If we have success, it is an IR device. u8 size2 = auxspi_save_size_log_2(AUXSPI_INFRARED); diff --git a/arm9/source/display.cpp b/arm9/source/display.cpp index e5713a8..cf26f82 100644 --- a/arm9/source/display.cpp +++ b/arm9/source/display.cpp @@ -85,6 +85,7 @@ void displayPrintUpper(bool fc) iprintf("Status :\n"); } else { // old DS phat/lite + iprintf("--- SLOT 2 ---------------------"); iprintf("Game ID :\n"); iprintf("Game name:\n"); iprintf("Game save:\n"); @@ -176,6 +177,8 @@ void displayPrintUpper(bool fc) } else { uint8 type = auxspi_save_type(slot_1_type); uint8 size = auxspi_save_size_log_2(slot_1_type); + // some debug output may need this so iprintf prints to the correct region + consoleSetWindow(&upperScreen, 10, 5, 22, 1); switch (type) { case 1: sprintf(&name[0], "Eeprom (%i Bytes)", size); @@ -553,3 +556,17 @@ void displayWarning2F(int id, ...) break; } } + +void displayDebugF(const char *format, ...) +{ + va_list argp; + va_start(argp, format); + memset(txt, 0, 256); + + consoleSelect(&upperScreen); + consoleSetWindow(&upperScreen, 0, 12, 32, 4); + consoleClear(); + + vprintf(format, argp); + va_end(argp); +} diff --git a/arm9/source/display.h b/arm9/source/display.h index 48b1b33..0fab927 100644 --- a/arm9/source/display.h +++ b/arm9/source/display.h @@ -51,6 +51,8 @@ void displayStateF(int id, ...); void displayProgressBar(int cur, int max0); +void displayDebugF(const char *format, ...); + #endif diff --git a/arm9/source/globals.h b/arm9/source/globals.h index 1deadc7..233e264 100644 --- a/arm9/source/globals.h +++ b/arm9/source/globals.h @@ -34,6 +34,10 @@ #define VERSION_MICRO 0 #define VERSION_EXTRA "RC2" +// this enables a custom font. it does not work yet, stuff is missing, so please uncomment +// this line only for testing and development purposes! +//#define ENABLE_CUSTOM_FONT + extern u8 *data; extern u32 size_buf; diff --git a/arm9/source/hardware.cpp b/arm9/source/hardware.cpp index 21769d0..fa6e109 100644 --- a/arm9/source/hardware.cpp +++ b/arm9/source/hardware.cpp @@ -777,7 +777,7 @@ void hwBackupFTP(bool dlp) displayPrintUpper(); uint8 size = auxspi_save_size_log_2(slot_1_type); uint8 type = auxspi_save_type(slot_1_type); - + // Second: connect to FTP server if (!ftp_active) hwLoginFTP(); diff --git a/arm9/source/main.cpp b/arm9/source/main.cpp index 43d9f16..b43b440 100644 --- a/arm9/source/main.cpp +++ b/arm9/source/main.cpp @@ -228,8 +228,7 @@ void mode_gba() void mode_wifi() { - // use 3in1 to buffer data - displayStateF(STR_EMPTY); + //displayStateF(STR_EMPTY); displayPrintUpper(true); displayPrintLower(); @@ -472,7 +471,7 @@ int main(int argc, char* argv[]) mode = 4; // load strings - // "txt" is used as a temp buffer for the language file name + // "txt" is used as a temp buffer for the language file name, returned by hwDetect stringsLoadFile(txt); // prepare the global data buffer diff --git a/arm9/source/strings.cpp b/arm9/source/strings.cpp index 0cdd668..5cba2bf 100644 --- a/arm9/source/strings.cpp +++ b/arm9/source/strings.cpp @@ -32,24 +32,46 @@ #include #include "fileselect.h" #include "globals.h" +#include "display.h" + +// fallback string resources +#include "strings_fallback.inc" using namespace std; // a global string array char **message_strings; -#define ADD_STRING(id,text) sprintf(txt, "%i", id);\ - if (ini) {\ - if (ini_locateKey(ini, txt) == 0) {\ - ini_readString(ini, txt, 256);\ - } \ - } else {\ - strcpy(txt,text);\ - }\ - message_strings[id] = new char[strlen(txt)+1];\ - memcpy(message_strings[id], txt, strlen(txt)+1); +// --------------------------------------------------- +// local functions +// +void AddString(uint32 id, ini_fd_t ini) +{ + // first, try to read string from ini file + sprintf(txt, "%i", id); + bool found = false; + if (ini) { + if (ini_locateKey(ini, txt) == 0) { + if (ini_readString(ini, txt, 256) > 0) { + found = true; + } + } + } + if (!found) { + // if no ini file was found, use the fallback striung provided here + message_strings[id] = const_cast(strings_fallback[id]); + } else { + // did load string, so prepare a buffer for it and move text + message_strings[id] = new char[strlen(txt)+1]; + memcpy(message_strings[id], txt, strlen(txt)+1); + } +} + +// --------------------------------------------------- +// global functions +// bool stringsLoadFile(const char *fname) { #ifdef DEBUG @@ -71,56 +93,91 @@ bool stringsLoadFile(const char *fname) message_strings = new char*[STR_LAST]; if (ini) ini_locateHeading(ini, ""); + +#if 0 +//#ifdef ENABLE_CUSTOM_FONT + // EXPERIMENTAL: load and init a custom font + if (ini_locateKey(ini, "font") == 0) { + ini_readString(ini, txt, 256); + if (strlen(txt)) { + if (fileExists(txt)) { + // load and init custon font; code borrowed from custom_font demo + u32 fs = fileSize(txt); + static u32 min_fs = 32*256; + if (fs >= min_fs) { + // TODO: maybe this should be a fixed size? + void *font0 = malloc(fileSize(txt)); + FILE *file = fopen(txt, "rb"); + fread(font0, 1, fs, file); + fclose(file); - ADD_STRING(STR_EMPTY, ""); - ADD_STRING(STR_STR, "%s"); + // borrowed from libnds source + ConsoleFont font; + font.gfx = (u16*)font0 + (fs - 16*256); // 16 bit-pointer, so only "16*" + font.pal = 0; // single color! + font.numColors = 0; + font.numChars = 256; // this is fixed; it should be enough for everybody + font.bpp = 4; // 4 bits per pixel + font.asciiOffset = 0; // we cover 256 letters (well, we try) + font.convertSingleColor = true; // for now, we only want one color! + + consoleSetFont(&upperScreen, &font); + consoleSetFont(&lowerScreen, &font); + free(font0); + } + } + } + } +#endif + + AddString(STR_EMPTY, ini); + AddString(STR_STR, ini); // - ADD_STRING(STR_MM_WIPE,"\n WIPES OUT ALL SAVE DATA\n ON YOUR GAME !"); - ADD_STRING(STR_TITLE_MSG,"DS savegame manager\nVersion %i.%i.%i%s\nBy Pokedoc"); - ADD_STRING(STR_BOOT_NO_INI,"Unable to open ini file!\nPlease make sure that it is\n1. in this apps folder, or" - "\n2. in the root folder\nIf 1. does not work, use 2."); - ADD_STRING(STR_BOOT_MODE_UNSUPPORTED,"This mode is DISABLED.\nPlease restart the system."); - ADD_STRING(STR_BOOT_DLDI_ERROR,"DLDI initialisation error!"); + AddString(STR_MM_WIPE, ini); + AddString(STR_TITLE_MSG, ini); + AddString(STR_BOOT_NO_INI, ini); + AddString(STR_BOOT_MODE_UNSUPPORTED, ini); + AddString(STR_BOOT_DLDI_ERROR, ini); // - ADD_STRING(STR_HW_SWAP_CARD,"Please take out Slot 1 flash card and insert a game.\nPress A when done."); - ADD_STRING(STR_HW_CARD_UNREADABLE,"I can't read the game inserted in slot 1.\nPlease eject and retry."); - ADD_STRING(STR_HW_WRONG_GAME,"This game has a save chip that is bigger than the save you are going to write. Please insert a different game.\nPress A when done."); - ADD_STRING(STR_HW_PLEASE_REBOOT,"Done! Please power off\n(and restart if you want to do more)."); + AddString(STR_HW_SWAP_CARD, ini); + AddString(STR_HW_CARD_UNREADABLE, ini); + AddString(STR_HW_WRONG_GAME, ini); + AddString(STR_HW_PLEASE_REBOOT, ini); // - ADD_STRING(STR_HW_SELECT_FILE,"Please select a .sav file."); - ADD_STRING(STR_HW_SELECT_FILE_OW,"Please select a file to overwrite, or press L+R in a folder to create a new file."); - ADD_STRING(STR_HW_SEEK_UNUSED_FNAME,"Please wait... searching for an unused filename.\nTrying: %s"); - ADD_STRING(STR_ERR_NO_FNAME,"ERROR: Unable to get an unused nfilename! This means that you have more than 65536 saves!\n(wow!)"); + AddString(STR_HW_SELECT_FILE, ini); + AddString(STR_HW_SELECT_FILE_OW, ini); + AddString(STR_HW_SEEK_UNUSED_FNAME, ini); + AddString(STR_ERR_NO_FNAME, ini); // - ADD_STRING(STR_HW_FORMAT_GAME,"Preparing to write to your game.\nPlease wait..."); - ADD_STRING(STR_HW_WRITE_GAME,"Writing save to your game.\nPlease wait..."); - ADD_STRING(STR_HW_READ_GAME,"Reading save from your game.\nPlease wait..."); - ADD_STRING(STR_HW_WRITE_FILE, "Writing file:\n%s"); - ADD_STRING(STR_HW_READ_FILE, "Reading file:\n%s"); + AddString(STR_HW_FORMAT_GAME, ini); + AddString(STR_HW_WRITE_GAME, ini); + AddString(STR_HW_READ_GAME, ini); + AddString(STR_HW_WRITE_FILE, ini); + AddString(STR_HW_READ_FILE, ini); // - ADD_STRING(STR_HW_3IN1_FORMAT_NOR,"Preparing to write to the 3in1.\nPlease wait..."); - ADD_STRING(STR_HW_3IN1_PREPARE_REBOOT,"Preparing reboot..."); - ADD_STRING(STR_HW_3IN1_PLEASE_REBOOT,"Save has been written to the 3in1. Please power off and restart this tool to finish the dump."); - ADD_STRING(STR_HW_3IN1_CLEAR_FLAG,"Preparing to dump your save...\nPlease wait..."); - ADD_STRING(STR_HW_3IN1_DONE_DUMP,"Done. Your game save has been dumped using your 3in1. Filename:\n%s\nPress (B) to continue."); - ADD_STRING(STR_HW_3IN1_ERR_IDMODE,"ERROR!\nID mode still active!"); - ADD_STRING(STR_HW_3IN1_ERR_NOR,"ERROR!\nWriting to NOR failed!"); + AddString(STR_HW_3IN1_FORMAT_NOR, ini); + AddString(STR_HW_3IN1_PREPARE_REBOOT, ini); + AddString(STR_HW_3IN1_PLEASE_REBOOT, ini); + AddString(STR_HW_3IN1_CLEAR_FLAG, ini); + AddString(STR_HW_3IN1_DONE_DUMP, ini); + AddString(STR_HW_3IN1_ERR_IDMODE, ini); + AddString(STR_HW_3IN1_ERR_NOR, ini); // - ADD_STRING(STR_HW_FTP_SEEK_AP,"Connecting to an access point...\nplease wait..."); - ADD_STRING(STR_HW_FTP_ERR_AP,"ERROR!\nCould not find a compatible Access Point. Please configure your WiFi Connection from a WiFi-enabled game!"); - ADD_STRING(STR_HW_FTP_SEEK_FTP,"Connecting to an FTP server...\nplease wait..."); - ADD_STRING(STR_HW_FTP_ERR_FTP,"ERROR!\nCould not find an FTP server. Please refer to the documentation."); - ADD_STRING(STR_HW_FTP_LOGIN,"Logging in..."); - ADD_STRING(STR_HW_FTP_ERR_LOGIN,"ERROR!\nCould not log in to the FTP server. Please verify your username and password are correct in your ini file."); - ADD_STRING(STR_HW_FTP_DIR,"Reading FTP directory..."); - ADD_STRING(STR_HW_FTP_SLOW,"FTP is slow, please wait..."); - ADD_STRING(STR_HW_FTP_READ_ONLY,"WARNING:\nCould not write to your FTP server! Maybe you forgot to enable write access?"); + AddString(STR_HW_FTP_SEEK_AP, ini); + AddString(STR_HW_FTP_ERR_AP, ini); + AddString(STR_HW_FTP_SEEK_FTP, ini); + AddString(STR_HW_FTP_ERR_FTP, ini); + AddString(STR_HW_FTP_LOGIN, ini); + AddString(STR_HW_FTP_ERR_LOGIN, ini); + AddString(STR_HW_FTP_DIR, ini); + AddString(STR_HW_FTP_SLOW, ini); + AddString(STR_HW_FTP_READ_ONLY, ini); // - ADD_STRING(STR_HW_WARN_DELETE,"This will WIPE OUT your entire save! ARE YOU SURE?\n\nPress R+up+Y to confim!"); - ADD_STRING(STR_HW_DID_DELETE,"Done. Your game save has been PERMANENTLY deleted.\n\nPlease restart your DS."); + AddString(STR_HW_WARN_DELETE, ini); + AddString(STR_HW_DID_DELETE, ini); // - ADD_STRING(STR_FS_READ,"Please select a .sav file\n (A) Select\n (B) One directory up\n"); - ADD_STRING(STR_FS_WRITE,"Please select a .sav file\n (A) Select\n (B) One directory up\n (L+R) cancel (new file)"); + AddString(STR_FS_READ, ini); + AddString(STR_FS_WRITE, ini); // // delete temp file (which is a remnant of inilib) diff --git a/savegame_manager.odt b/savegame_manager.odt index 33c99341b95235084f335a8dd9384ec22305efcc..c5a8a7cbbbe9f6ab5bfc78d8dcb715ea57a362da 100644 GIT binary patch delta 13749 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 diff --git a/savegame_manager.pnproj b/savegame_manager.pnproj index bf9ead6..48c0dcb 100644 --- a/savegame_manager.pnproj +++ b/savegame_manager.pnproj @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file