diff --git a/dist/popnhax/popnhax.xml b/dist/popnhax/popnhax.xml index 52b11d2..4708afa 100644 --- a/dist/popnhax/popnhax.xml +++ b/dist/popnhax/popnhax.xml @@ -6,8 +6,10 @@ 0 0 - - 0 + + 0 + + 0 0 @@ -29,8 +31,9 @@ 1 + - + 0 diff --git a/popnhax/config.h b/popnhax/config.h index dc761d8..71010b0 100644 --- a/popnhax/config.h +++ b/popnhax/config.h @@ -7,7 +7,8 @@ struct popnhax_config { bool hidden_is_offset; bool pfree; bool quick_retire; - uint8_t hd_on_sd; + bool force_hd_timing; + uint8_t force_hd_resolution; bool force_unlocks; bool force_unlock_deco; bool unset_volume; diff --git a/popnhax/dllmain.cc b/popnhax/dllmain.cc index 5e76962..7ce2051 100644 --- a/popnhax/dllmain.cc +++ b/popnhax/dllmain.cc @@ -82,8 +82,10 @@ PSMAP_MEMBER_REQ(PSMAP_PROPERTY_TYPE_BOOL, struct popnhax_config, pfree, "/popnhax/pfree") PSMAP_MEMBER_REQ(PSMAP_PROPERTY_TYPE_BOOL, struct popnhax_config, quick_retire, "/popnhax/quick_retire") -PSMAP_MEMBER_REQ(PSMAP_PROPERTY_TYPE_U8, struct popnhax_config, hd_on_sd, - "/popnhax/hd_on_sd") +PSMAP_MEMBER_REQ(PSMAP_PROPERTY_TYPE_BOOL, struct popnhax_config, force_hd_timing, + "/popnhax/force_hd_timing") +PSMAP_MEMBER_REQ(PSMAP_PROPERTY_TYPE_U8, struct popnhax_config, force_hd_resolution, + "/popnhax/force_hd_resolution") PSMAP_MEMBER_REQ(PSMAP_PROPERTY_TYPE_BOOL, struct popnhax_config, force_unlocks, "/popnhax/force_unlocks") PSMAP_MEMBER_REQ(PSMAP_PROPERTY_TYPE_BOOL, struct popnhax_config, force_unlock_deco, @@ -1773,39 +1775,50 @@ static bool patch_base_offset(int32_t value) { return res; } - - -static bool patch_hd_on_sd(uint8_t mode) { - if (mode > 2) +static bool patch_hd_timing() { + if (!patch_base_offset(-76)) { - printf("ponhax: HD on SD mode invalid value %d\n",mode); + printf("popnhax: HD timing: cannot set HD offset\n"); return false; } - if (!patch_base_offset(-76)) + printf("popnhax: HD timing forced\n"); + return true; +} + +static bool patch_hd_resolution(uint8_t mode) { + if (mode > 2) { - printf("popnhax: HD on SD: cannot set HD offset\n"); + printf("ponhax: HD resolution invalid value %d\n",mode); return false; } /* set window to 1360*768 */ - if ( mode == 2 ) + if (!patch_hex("\x0F\xB6\xC0\xF7\xD8\x1B\xC0\x25\xD0\x02", 10, -5, "\xB8\x50\x05\x00\x00\xC3\xCC\xCC\xCC", 9) + && !patch_hex("\x84\xc0\x74\x14\x0f\xb6\x05", 7, -5, "\xB8\x50\x05\x00\x00\xC3\xCC\xCC\xCC", 9)) { - if (!patch_hex("\x0F\xB6\xC0\xF7\xD8\x1B\xC0\x25\xD0\x02", 10, -5, "\xB8\x50\x05\x00\x00\xC3\xCC\xCC\xCC", 9) - && !patch_hex("\x84\xc0\x74\x14\x0f\xb6\x05", 7, -5, "\xB8\x50\x05\x00\x00\xC3\xCC\xCC\xCC", 9)) - { - printf("popnhax: HD on SD: cannot find screen width function\n"); - return false; - } - - if (!patch_hex("\x0f\xb6\xc0\xf7\xd8\x1b\xc0\x25\x20\x01", 10, -5, "\xB8\x00\x03\x00\x00\xC3\xCC\xCC\xCC", 9)) - printf("popnhax: HD on SD: cannot find screen height function\n"); - - if (!patch_hex("\x8B\x54\x24\x20\x53\x51\x52\xEB\x0C", 9, -6, "\x90\x90", 2)) - printf("popnhax: HD on SD: cannot find screen aspect ratio function\n"); + printf("popnhax: HD resolution: cannot find screen width function\n"); + return false; } - printf("popnhax: HD on SD mode %d\n",mode); + if (!patch_hex("\x0f\xb6\xc0\xf7\xd8\x1b\xc0\x25\x20\x01", 10, -5, "\xB8\x00\x03\x00\x00\xC3\xCC\xCC\xCC", 9)) + printf("popnhax: HD resolution: cannot find screen height function\n"); + + if (!patch_hex("\x8B\x54\x24\x20\x53\x51\x52\xEB\x0C", 9, -6, "\x90\x90", 2)) + printf("popnhax: HD resolution: cannot find screen aspect ratio function\n"); + + + if ( mode == 1 ) + { + /* move texts (by forcing HD behavior) */ + if (!patch_hex("\x1B\xC9\x83\xE1\x95\x81\xC1\x86", 8, -5, "\xB9\xFF\xFF\xFF\xFF\x90\x90", 7)) + printf("popnhax: HD resolution: cannot move gamecode position\n"); + + if (!patch_hex("\x6a\x01\x6a\x00\x50\x8b\x06\x33\xff", 9, -7, "\xEB", 1)) + printf("popnhax: HD resolution: cannot move credit/network position\n"); + } + + printf("popnhax: HD resolution forced%s\n",(mode==2)?" (centered texts)":""); return true; } @@ -1833,8 +1846,12 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserv patch_quick_retire(config.pfree); } - if (config.hd_on_sd) { - patch_hd_on_sd(config.hd_on_sd); + if (config.force_hd_timing) { + patch_hd_timing(); + } + + if (config.force_hd_resolution) { + patch_hd_resolution(config.force_hd_resolution); } if (config.hidden_is_offset){ @@ -1842,7 +1859,7 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserv } if (config.keysound_offset){ - /* must be called after hd_on_sd */ + /* must be called _after_ force_hd_timing */ patch_keysound_offset(config.keysound_offset); }