From d355ea9981358a1df335b1f7485ce94768bbf255 Mon Sep 17 00:00:00 2001 From: Francisco Javier Trujillo Mata Date: Mon, 8 Aug 2022 11:55:04 +0200 Subject: [PATCH] Add a way to avoid IOP reset --- docs/README-ps2.md | 19 ++++++++++++++--- include/SDL_main.h | 4 ++++ src/main/ps2/SDL_ps2_main.c | 41 +++++++++++++++++++------------------ 3 files changed, 41 insertions(+), 23 deletions(-) diff --git a/docs/README-ps2.md b/docs/README-ps2.md index c61647b0a..3a0724f00 100644 --- a/docs/README-ps2.md +++ b/docs/README-ps2.md @@ -16,6 +16,22 @@ cmake --build build cmake --install build ``` +## Notes +If you trying to debug a SDL app through [ps2client](https://github.com/ps2dev/ps2client) you need to avoid the IOP reset, otherwise you will lose the conection with your computer. +So to avoid the reset of the IOP CPU, you need to call to the macro `SDL_PS2_SKIP_IOP_RESET();`. +It could be something similar as: +```c +..... + +SDL_PS2_SKIP_IOP_RESET(); + +int main(int argc, char *argv[]) +{ +..... +``` +For a release binary is recommendable to reset the IOP always. + +Remember to do a clean compilation everytime you enable or disable the `SDL_PS2_SKIP_IOP_RESET` otherwise the change won't be reflected. ## Getting PS2 Dev [Installing PS2 Dev](https://github.com/ps2dev/ps2dev) @@ -28,7 +44,4 @@ cmake --install build ## To Do - PS2 Screen Keyboard - Dialogs -- Audio -- Video -- Controllers - Others \ No newline at end of file diff --git a/include/SDL_main.h b/include/SDL_main.h index 1af74e92d..8b267082f 100644 --- a/include/SDL_main.h +++ b/include/SDL_main.h @@ -104,6 +104,10 @@ #elif defined(__PS2__) #define SDL_MAIN_AVAILABLE +#define SDL_PS2_SKIP_IOP_RESET() \ + void reset_IOP(); \ + void reset_IOP() {} + #endif #endif /* SDL_MAIN_HANDLED */ diff --git a/src/main/ps2/SDL_ps2_main.c b/src/main/ps2/SDL_ps2_main.c index 0d97ed3f1..b8631f1be 100644 --- a/src/main/ps2/SDL_ps2_main.c +++ b/src/main/ps2/SDL_ps2_main.c @@ -19,23 +19,25 @@ #include #include #include +#include #ifdef main #undef main #endif +__attribute__((weak)) +void reset_IOP() { + SifInitRpc(0); + while(!SifIopReset(NULL, 0)){}; + while(!SifIopSync()){}; +} + static void prepare_IOP() { + reset_IOP(); SifInitRpc(0); - // #if !defined(DEBUG) || defined(BUILD_FOR_PCSX2) - /* Comment this line if you don't wanna debug the output */ - while(!SifIopReset(NULL, 0)){}; - // #endif - - while(!SifIopSync()){}; - SifInitRpc(0); - sbv_patch_enable_lmb(); - sbv_patch_disable_prefix_check(); + sbv_patch_enable_lmb(); + sbv_patch_disable_prefix_check(); } static void init_drivers() { @@ -52,18 +54,17 @@ static void deinit_drivers() { static void waitUntilDeviceIsReady(char *path) { - struct stat buffer; - int ret = -1; - int retries = 50; + struct stat buffer; + int ret = -1; + int retries = 50; - while(ret != 0 && retries > 0) - { - ret = stat(path, &buffer); - /* Wait untill the device is ready */ - nopdelay(); + while(ret != 0 && retries > 0) { + ret = stat(path, &buffer); + /* Wait untill the device is ready */ + nopdelay(); - retries--; - } + retries--; + } } int main(int argc, char *argv[]) @@ -84,6 +85,6 @@ int main(int argc, char *argv[]) return res; } -#endif /* _EE */ +#endif /* _PS2 */ /* vi: set ts=4 sw=4 expandtab: */