From 947c835269a380102c7d6d94290f56678b310c38 Mon Sep 17 00:00:00 2001 From: Nitraiolo Date: Sun, 15 Mar 2015 06:03:08 +0000 Subject: [PATCH] Compilation - code cleanup to remove all compilation warnings GC - updated nintendont config support to version 0x00000003 Internals - added Wii / vWii identification capability GC - fixed wide screen support in vWii for nintendont GC - added nintendont memory card sizing GC - added nintnedont shared memory card support Internals - added "mem_card_emu" and "mem_card_size" keys for games configs in "settings.cfg" Build - added revision number to version as suffix "." (70r78.8) --- Languages/IT.lang | 6 +++ Makefile | 2 +- source/NintendontConfig.h | 109 ++++++++++++++++++++++++++++++-------- source/RuntimeIOSPatch.c | 5 +- source/cfg.c | 19 +++++++ source/cfg.h | 4 ++ source/gc.c | 7 ++- source/guimenu.c | 32 ++++++++--- source/menu.c | 60 ++++++++++++++------- source/sort.c | 2 +- source/usb-loader.c | 12 +++++ 11 files changed, 204 insertions(+), 54 deletions(-) diff --git a/Languages/IT.lang b/Languages/IT.lang index 83fbfee..1d9180d 100644 --- a/Languages/IT.lang +++ b/Languages/IT.lang @@ -1242,6 +1242,9 @@ msgstr "Emu NAND:" msgid "NMM:" msgstr "NMM:" +msgid "MC size:" +msgstr "Dimensione MC:" + msgid "" "NOTE: CIOS249 before rev10:\n" "Loading games from SDHC not supported!" @@ -1417,6 +1420,9 @@ msgstr "Corse Fuoristrada" msgid "On" msgstr "Attivato" +msgid "Shared" +msgstr "Condiviso" + msgid "Online" msgstr "Online" diff --git a/Makefile b/Makefile index 372d419..27328e9 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,7 @@ include $(DEVKITPPC)/wii_rules # SOURCES is a list of directories containing source code # INCLUDES is a list of directories containing extra header files #--------------------------------------------------------------------------------- -VERSION := 70r78 +VERSION := 70r78.8 RELEASE := release # to override RELEASE use: make announce RELEASE=beta ifeq ($(findstring compat,$(VERSION)),compat) diff --git a/source/NintendontConfig.h b/source/NintendontConfig.h index 5ba6b9b..6d360c9 100644 --- a/source/NintendontConfig.h +++ b/source/NintendontConfig.h @@ -5,7 +5,7 @@ //#include "NintendontVersion.h" //#include "Metadata.h" -#define NIN_CFG_VERSION 0x00000002 +#define NIN_CFG_VERSION 0x00000003 #define NIN_CFG_MAXPAD 4 @@ -20,36 +20,88 @@ typedef struct NIN_CFG char CheatPath[255]; unsigned int MaxPads; unsigned int GameID; + unsigned int MemCardBlocks; } NIN_CFG; +enum ninconfigbitpos +{ + NIN_CFG_BIT_CHEATS = (0), + NIN_CFG_BIT_DEBUGGER = (1), // Only for Wii Version + NIN_CFG_BIT_DEBUGWAIT = (2), // Only for Wii Version + NIN_CFG_BIT_MEMCARDEMU = (3), + NIN_CFG_BIT_CHEAT_PATH = (4), + NIN_CFG_BIT_FORCE_WIDE = (5), + NIN_CFG_BIT_FORCE_PROG = (6), + NIN_CFG_BIT_AUTO_BOOT = (7), + NIN_CFG_BIT_HID = (8), + NIN_CFG_BIT_OSREPORT = (9), + NIN_CFG_BIT_USB = (10), + NIN_CFG_BIT_LED = (11), + NIN_CFG_BIT_LOG = (12), + NIN_CFG_BIT_LAST = (13), + + NIN_CFG_BIT_MC_MULTI = (13), + NIN_CFG_BIT_NATIVE_SI = (14), + NIN_CFG_BIT_WIIU_WIDE = (15), +}; + enum ninconfig { - NIN_CFG_CHEATS = (1<<0), - NIN_CFG_DEBUGGER = (1<<1), // Only for Wii Version - NIN_CFG_DEBUGWAIT = (1<<2), // Only for Wii Version - NIN_CFG_MEMCARDEMU = (1<<3), - NIN_CFG_CHEAT_PATH = (1<<4), - NIN_CFG_FORCE_WIDE = (1<<5), - NIN_CFG_FORCE_PROG = (1<<6), - NIN_CFG_AUTO_BOOT = (1<<7), - NIN_CFG_HID = (1<<8), - NIN_CFG_OSREPORT = (1<<9), - NIN_CFG_USB = (1<<10), - NIN_CFG_LED = (1<<11), + NIN_CFG_CHEATS = (1<vidtv); cfg_bool("country_patch", &game_cfg->country_patch); + cfg_int_max("mem_card_emu", &game_cfg->mem_card_emu, 2); + cfg_int_max("mem_card_size", &game_cfg->mem_card_size, 5); cfg_bool("clear_patches", &game_cfg->clean); cfg_map("clear_patches", "all", &game_cfg->clean, CFG_CLEAN_ALL); cfg_bool("fix_002", &game_cfg->fix_002); @@ -3003,6 +3016,12 @@ bool CFG_Save_Settings(int verbose) SAVE_BOOL(ntsc_j_patch); SAVE_BOOL(nodisc); SAVE_BOOL(screenshot); + if (game_cfg-> mem_card_emu == 2) { + SAVE_NUM(mem_card_emu); + } else { + SAVE_BOOL(mem_card_emu); + } + SAVE_NUM(mem_card_size); SAVE_BOOL(country_patch); SAVE_BOOL(fix_002); s = ios_str(game_cfg->ios_idx); diff --git a/source/cfg.h b/source/cfg.h index e29e8dc..986f660 100644 --- a/source/cfg.h +++ b/source/cfg.h @@ -248,6 +248,8 @@ struct Game_CFG int nodisc; int screenshot; int country_patch; + int mem_card_emu; + int mem_card_size; int fix_002; int ios_idx; int block_ios_reload; @@ -363,6 +365,7 @@ struct CFG int device; char partition[16]; int hide_header; + int vwii_mode; // simple variants: int confirm_start; int hide_hddinfo; @@ -724,6 +727,7 @@ extern struct TextMap map_ios[]; extern struct TextMap map_nand_emu[]; extern struct TextMap map_channel_boot[]; extern struct TextMap map_gc_boot[]; +extern struct TextMap map_mem_card_size[]; extern char *names_vpatch[CFG_VIDEO_PATCH_NUM]; extern u8 cIOS_base[]; diff --git a/source/gc.c b/source/gc.c index f4e4fb4..cdd13e5 100644 --- a/source/gc.c +++ b/source/gc.c @@ -653,15 +653,20 @@ void Nintendont_set_options(struct discHdr *header, char *CheatPath, char *NewCh ncfg.Magicbytes = 0x01070CF6; ncfg.Version = NIN_CFG_VERSION; + ncfg.MemCardBlocks = CFG.game.mem_card_size; if (CFG.game.ocarina) ncfg.Config |= NIN_CFG_CHEATS; - if (CFG.game.country_patch) //country_patch contains NMM setting + if (CFG.game.mem_card_emu) ncfg.Config |= NIN_CFG_MEMCARDEMU; + if (CFG.game.mem_card_emu == 2) + ncfg.Config |= NIN_CFG_MC_MULTI; if (CFG.game.ocarina) ncfg.Config |= NIN_CFG_CHEAT_PATH; if (CFG.game.wide_screen) ncfg.Config |= NIN_CFG_FORCE_WIDE; + if (CFG.game.wide_screen && CFG.vwii_mode) + ncfg.Config |= NIN_CFG_WIIU_WIDE; if (CFG.game.video == 4 || CFG.game.video == 5) ncfg.Config |= NIN_CFG_FORCE_PROG; ncfg.Config |= NIN_CFG_AUTO_BOOT; diff --git a/source/guimenu.c b/source/guimenu.c index 5447b49..8de556d 100644 --- a/source/guimenu.c +++ b/source/guimenu.c @@ -457,6 +457,8 @@ struct W_GameCfg Widget *video_patch; Widget *vidtv; Widget *country_patch; + Widget *mem_card_emu; + Widget *mem_card_size; Widget *ios_idx; Widget *block_ios_reload; Widget *fix_002; @@ -744,7 +746,8 @@ void update_gameopt_state() gameopt_inactive(cond, wgame.language, CFG_LANG_CONSOLE); gameopt_inactive(cond, wgame.video, CFG_VIDEO_GAME); gameopt_inactive(cond, wgame.vidtv, 0); - gameopt_inactive(cond, wgame.country_patch, 0); + gameopt_inactive(cond, wgame.mem_card_emu, 0); + gameopt_inactive(cond, wgame.mem_card_size, 0); gameopt_inactive(cond, wgame.channel_boot, 0); gameopt_inactive(cond, wgame.ocarina, 0); gameopt_inactive(cond, wgame.wide_screen, 0); @@ -973,6 +976,10 @@ void InitGameOptionsPage(Widget *pp, int bh) int num_gc_boot = map_get_num(map_gc_boot); char *names_gc_boot[num_gc_boot]; num_gc_boot = map_to_list(map_gc_boot, num_gc_boot, names_gc_boot); + + int num_mem_card_size = map_get_num(map_mem_card_size); + char *names_mem_card_size[num_mem_card_size]; + num_mem_card_size = map_to_list(map_mem_card_size, num_mem_card_size, names_mem_card_size); ww = wgui_add_game_opt(op, gt("Language:"), CFG_LANG_NUM, languages); BIND_OPT(language); @@ -984,23 +991,27 @@ void InitGameOptionsPage(Widget *pp, int bh) ww = wgui_add_game_opt(op, gt("Video Patch:"), 3, str_block); BIND_OPT(block_ios_reload); - ww = wgui_add_game_opt(op, gt("NMM:"), 2, NULL); - BIND_OPT(country_patch); - + char *str_nmm[3] = { gt("Off"), gt("On"), gt("Shared") }; + ww = wgui_add_game_opt(op, gt("NMM:"), 3, str_nmm); + BIND_OPT(mem_card_emu); + + ww = wgui_add_game_opt(op, gt("MC size:"), num_mem_card_size, names_mem_card_size); + BIND_OPT(mem_card_size); + ww = wgui_add_game_opt(op, gt("Wide Screen:"), 2, NULL); BIND_OPT(wide_screen); ww = wgui_add_game_opt(op, gt("Ocarina (cheats):"), 2, NULL); BIND_OPT(ocarina); - - ww = wgui_add_game_opt(op, gt("Boot Method:"), num_gc_boot, names_gc_boot); - BIND_OPT(channel_boot); ///////////////// - + op = wgui_add_page(pp, w_opt_page, pos_wh(SIZE_FULL, -bh), "opt"); op->render = NULL; + ww = wgui_add_game_opt(op, gt("Boot Method:"), num_gc_boot, names_gc_boot); + BIND_OPT(channel_boot); + ww = wgui_add_game_opt(op, gt("PAD HOOK"), 2, NULL); BIND_OPT(hooktype); @@ -1018,6 +1029,11 @@ void InitGameOptionsPage(Widget *pp, int bh) ww = wgui_add_game_opt(op, gt("Screenshot:"), 2, NULL); BIND_OPT(screenshot); + + ///////////////// + + op = wgui_add_page(pp, w_opt_page, pos_wh(SIZE_FULL, -bh), "opt"); + op->render = NULL; ww = wgui_add_game_opt(op, gt("Alt Button Cfg:"), 2, NULL); BIND_OPT(alt_controller_cfg); diff --git a/source/menu.c b/source/menu.c index c263c0d..53d50fd 100644 --- a/source/menu.c +++ b/source/menu.c @@ -189,11 +189,21 @@ char *str_channel_boot[2] = char *str_gc_boot[4] = { gts("Default"), - gts("DIOS MIOS") - gts("Devolution") + gts("DIOS MIOS"), + gts("Devolution"), gts("Nintendont") }; +char *str_mem_card_size[6] = +{ + gts(" 59 blocks"), + gts(" 123 blocks"), + gts(" 251 blocks"), + gts(" 507 blocks"), + gts("1019 blocks"), + gts("2043 blocks") +}; + int Menu_Global_Options(); int Menu_Game_Options(); void Switch_Favorites(bool enable); @@ -1818,7 +1828,7 @@ int Menu_Boot_Options(struct discHdr *header, bool disc) { int opt_saved; //int opt_ios_reload; int opt_language, opt_video, opt_video_patch, opt_vidtv, opt_padhook, opt_nand_emu; - int opt_country_patch, opt_anti_002, opt_ocarina, opt_wide_screen, opt_nodisc, opt_ntsc_j_patch, opt_screenshot; + int opt_mem_card_emu, opt_mem_card_size, opt_country_patch, opt_anti_002, opt_ocarina, opt_wide_screen, opt_nodisc, opt_ntsc_j_patch, opt_screenshot; f32 size = 0.0; int redraw_cover = 0; int i; @@ -1865,7 +1875,7 @@ int Menu_Boot_Options(struct discHdr *header, bool disc) { struct Menu menu; int NUM_OPT = 19; - if (header->magic == GC_GAME_ON_DRIVE) NUM_OPT = 16; + if (header->magic == GC_GAME_ON_DRIVE) NUM_OPT = 17; if (header->magic == CHANNEL_MAGIC) NUM_OPT = 19; char active[NUM_OPT]; menu_init(&menu, NUM_OPT); @@ -1898,6 +1908,8 @@ int Menu_Boot_Options(struct discHdr *header, bool disc) { opt_video_patch = game_cfg->video_patch; opt_vidtv = game_cfg->vidtv; opt_country_patch = game_cfg->country_patch; + opt_mem_card_emu = game_cfg->mem_card_emu; + opt_mem_card_size = game_cfg->mem_card_size; opt_anti_002 = game_cfg->fix_002; opt_wide_screen = game_cfg->wide_screen; opt_nodisc = game_cfg->nodisc; @@ -1913,6 +1925,8 @@ int Menu_Boot_Options(struct discHdr *header, bool disc) { opt_video_patch = CFG_VIDEO_PATCH_OFF; opt_vidtv = 0; opt_country_patch = 0; + opt_mem_card_emu = 0; + opt_mem_card_size = 2; opt_anti_002 = 0; opt_ocarina = 0; opt_ntsc_j_patch = 0; @@ -2014,8 +2028,15 @@ int Menu_Boot_Options(struct discHdr *header, bool disc) { } if (menu_window_mark(&menu)) PRINT_OPT_B(gt("LED:"), opt_vidtv); + if (menu_window_mark(&menu)) { + if (opt_mem_card_emu == 2) { + PRINT_OPT_S(gt("NMM:"), gt("Shared")); + } else { + PRINT_OPT_B(gt("NMM:"), opt_mem_card_emu); + } + } if (menu_window_mark(&menu)) - PRINT_OPT_B(gt("NMM:"), opt_country_patch); + PRINT_OPT_S(gt("MC size::"), gt(str_mem_card_size[opt_mem_card_size])); if (menu_window_mark(&menu)) PRINT_OPT_B(gt("Ocarina (cheats):"), opt_ocarina); if (menu_window_mark(&menu)) @@ -2197,40 +2218,43 @@ int Menu_Boot_Options(struct discHdr *header, bool disc) { CHANGE(game_cfg->vidtv, 1); break; case 5: - CHANGE(game_cfg->country_patch, 1); + CHANGE(game_cfg->mem_card_emu, 2); break; case 6: - CHANGE(game_cfg->ocarina, 1); + CHANGE(game_cfg->mem_card_size, 5); break; case 7: - Menu_Cheats(header); + CHANGE(game_cfg->ocarina, 1); break; case 8: + Menu_Cheats(header); + break; + case 9: printf("\n\n"); Download_Cover((char*)header->id, change > 0, true); Cache_Invalidate(); Gui_DrawCover(header->id); Menu_PrintWait(); break; - case 9: // Wide Screen + case 10: // Wide Screen CHANGE(game_cfg->wide_screen, 1); break; - case 10: // NoDisc+ + case 11: // NoDisc+ CHANGE(game_cfg->ntsc_j_patch, 1); break; - case 11: // NoDisc+ + case 12: // NoDisc+ CHANGE(game_cfg->nodisc, 1); break; - case 12: // PAD HOOK) + case 13: // PAD HOOK) CHANGE(game_cfg->hooktype, 1); break; - case 13: // gc Boot Method + case 14: // gc Boot Method CHANGE(game_cfg->channel_boot, 3); break; - case 14: // Screenshot + case 15: // Screenshot CHANGE(game_cfg->screenshot, 1); break; - case 15: // Alt Button Cfg + case 16: // Alt Button Cfg CHANGE(game_cfg->alt_controller_cfg, 1); break; } @@ -4863,7 +4887,7 @@ L_repaint: snprintf(devoPath, sizeof(devoPath), "%s/game.iso", header->path); - DEVO_SetOptions(devoPath, CFG.game.country_patch); + DEVO_SetOptions(devoPath, CFG.game.mem_card_emu); snprintf(D_S(loaderPath), "%s/loader.bin", USBLOADER_PATH); sleep(1); @@ -4914,10 +4938,10 @@ L_repaint: if (CFG.dml == CFG_DML_R51) { DML_Old_SetOptions(header->path, cheatPath, newCheatPath, CFG.game.ocarina); } else { - DML_New_SetOptions(header->path, cheatPath, newCheatPath, CFG.game.ocarina, false, CFG.game.country_patch, CFG.game.nodisc, CFG.game.vidtv, CFG.game.video, CFG.game.wide_screen, CFG.game.hooktype, CFG.game.block_ios_reload, CFG.game.screenshot); + DML_New_SetOptions(header->path, cheatPath, newCheatPath, CFG.game.ocarina, false, CFG.game.mem_card_emu, CFG.game.nodisc, CFG.game.vidtv, CFG.game.video, CFG.game.wide_screen, CFG.game.hooktype, CFG.game.block_ios_reload, CFG.game.screenshot); } } else if (CFG.dml >= CFG_DML_1_2) { - DML_New_SetBootDiscOption(cheatPath, newCheatPath, CFG.game.ocarina, CFG.game.country_patch, CFG.game.vidtv, CFG.game.video); + DML_New_SetBootDiscOption(cheatPath, newCheatPath, CFG.game.ocarina, CFG.game.mem_card_emu, CFG.game.vidtv, CFG.game.video); } if (CFG.game.ntsc_j_patch) diff --git a/source/sort.c b/source/sort.c index a9d0467..5c9f299 100644 --- a/source/sort.c +++ b/source/sort.c @@ -639,7 +639,7 @@ int filter_search(struct discHdr *list, int cnt, char *search_field, bool notuse int kept_cnt = 0; struct gameXMLinfo *g; char temp_str[200]; - int search_int; + int search_int = 0; int rec_int; bool keep_record; diff --git a/source/usb-loader.c b/source/usb-loader.c index f32052c..ca999ca 100644 --- a/source/usb-loader.c +++ b/source/usb-loader.c @@ -24,6 +24,8 @@ #include "rcstub.h" +#define HW_PROCESSOR ((vu32*)0xCD8005A0) + // libogc < 1.8.5 can hang if wiimote is initialized multiple times // (in case ios is reload 2x) so we delay wpad to later // libogc = 1.8.5 can crash if started with 2+ wiimotes @@ -89,6 +91,16 @@ int main(int argc, char **argv) mem_init(); Sys_Init(); + /* Identify if we are on WII or WIIU in crediar way, Thanks! */ + if((*HW_PROCESSOR >> 16) == 0xCAFE) + { + dbg_printf("vWii Mode\n"); + CFG.vwii_mode = true; + } else { + dbg_printf("Legacy Wii Mode\n"); + CFG.vwii_mode = false; + } + cfg_parsearg_early(argc, argv); InitDebug(); // reset in 60 seconds in case an exception (CODE DUMP) occurs