SDL: Add a way to avoid IOP reset

From d355ea9981358a1df335b1f7485ce94768bbf255 Mon Sep 17 00:00:00 2001
From: Francisco Javier Trujillo Mata <[EMAIL REDACTED]>
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 | 45 +++++++++++++++++++------------------
 3 files changed, 43 insertions(+), 25 deletions(-)

diff --git a/docs/README-ps2.md b/docs/README-ps2.md
index c61647b0a16..3a0724f00db 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 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
@@ -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 1af74e92d2d…8b267082f23 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 0d97ed3f1f6…b8631f1be86 100644
— a/src/main/ps2/SDL_ps2_main.c
+++ b/src/main/ps2/SDL_ps2_main.c
@@ -19,23 +19,25 @@
#include <sbv_patches.h>
#include <ps2_fileXio_driver.h>
#include <ps2_memcard_driver.h>
+#include <ps2_usb_driver.h>

#ifdef main
#undef main
#endif

-static void prepare_IOP()
-{
+attribute((weak))
+void 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();
    +}

+static void prepare_IOP()
+{

  • reset_IOP();
  • SifInitRpc(0);
  • 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;
  • while(ret != 0 && retries > 0)
  • {
  •  ret = stat(path, &buffer);
    
  •  /* Wait untill the device is ready */
    
  •  nopdelay();
    
  •  retries--;
    
  • }
  • 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();
    
  •    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: */