From 1ba41bd77d89a6672eb189ddb8c06c638279cea7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=ADas=20Israelson?= <57065102+israpps@users.noreply.github.com> Date: Mon, 19 Feb 2024 21:21:07 -0300 Subject: [PATCH 01/38] initial coh support --- .github/workflows/CI.yml | 3 ++- Makefile | 19 ++++++++++++++++--- bootstrap/main.c | 5 ++++- iop/IOPRP_FILEIO.IMG | Bin 0 -> 11440 bytes src/util.c | 15 +++++++++++++-- 5 files changed, 35 insertions(+), 7 deletions(-) create mode 100644 iop/IOPRP_FILEIO.IMG diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 5c09bad..47e7106 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -13,6 +13,7 @@ jobs: matrix: exfat: ["EXFAT=0", "EXFAT=1"] hdd: ["HDD=0", "HDD=1"] + coh: ["COH=0", "COH=1"] runs-on: ubuntu-latest container: ps2dev/ps2dev:v1.0 steps: @@ -28,7 +29,7 @@ jobs: - name: Compile cheat device run: | - make rebuild release ${{ matrix.exfat }} ${{ matrix.hdd }} + make rebuild release ${{ matrix.exfat }} ${{ matrix.hdd }} ${{ matrix.coh }} - name: list run: | diff --git a/Makefile b/Makefile index 75eccd1..23765c0 100644 --- a/Makefile +++ b/Makefile @@ -47,6 +47,13 @@ else IRX_OBJS += resources/usbhdfsd_irx.o endif +ifeq ($(COH),1) + EE_CFLAGS += -DSUPPORT_SYSTEM_2x6 + EE_LIBS += -liopreboot + HAS_COH = -COH + HOMEBREW_IRX = 0 + EE_OBJS += ioprp.o +endif # Graphic resources OBJS += resources/background_png.o \ resources/check_png.o resources/hamburgerIcon_png.o resources/gamepad_png.o resources/cube_png.o \ @@ -63,10 +70,12 @@ OBJS += engine/engine_erl.o OBJS += bootstrap/bootstrap_elf.o ifeq ($(HOMEBREW_IRX),1) - EE_LIBS += -lpadx - EE_CFLAGS += -DHOMEBREW_IRX + += -lpadx + EE_CFLAGS += -DHOMEBREW_IRX +else ifeq ($(COH),1)#Because on COH, rom0:PADMAN has the RPC style of retail rom0:XPADMAN + EE_LIBS += -lpadx else - EE_LIBS += -lpad + EE_LIBS += -lpad endif ifeq ($(DTL_T10000),1) EE_CFLAGS += -D_DTL_T10000 -g @@ -163,5 +172,9 @@ clean: rebuild: clean all +ioprp.o: iop/IOPRP_FILEIO.IMG + @bin2o $< $@ _ioprp_img + + include $(PS2SDK)/samples/Makefile.pref include $(PS2SDK)/samples/Makefile.eeglobal diff --git a/bootstrap/main.c b/bootstrap/main.c index 3cb5cd9..63e1365 100644 --- a/bootstrap/main.c +++ b/bootstrap/main.c @@ -173,9 +173,12 @@ void MyLoadElf(char *elfpath) /* IOP reboot routine from ps2rd */ SifInitRpc(0); - +#ifdef SUPPORT_SYSTEM_2X6 + while (!SifIopReset("", 0)); +#else while (!SifIopReset("rom0:UDNL rom0:EELOADCNF", 0)) ; +#endif while (!SifIopSync()) ; diff --git a/iop/IOPRP_FILEIO.IMG b/iop/IOPRP_FILEIO.IMG new file mode 100644 index 0000000000000000000000000000000000000000..b7fac0aa45c9a9615938b6852d947c69793369e5 GIT binary patch literal 11440 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 literal 0 HcmV?d00001 diff --git a/src/util.c b/src/util.c index a006745..96062f8 100644 --- a/src/util.c +++ b/src/util.c @@ -46,6 +46,12 @@ extern u8 _usbhdfsd_irx_start[]; extern int _usbhdfsd_irx_size; #endif +#ifdef SUPPORT_SYSTEM_2X6 +#include +extern u8 _ioprp_img[]; +extern int _ioprp_img_size; +#endif + void loadModules() { int ret; @@ -56,8 +62,10 @@ void loadModules() #ifdef _DTL_T10000 while (!SifIopReset("rom0:UDNL", 0)); + #elif SUPPORT_SYSTEM_2X6 + while (!SifIopRebootBuffer(_ioprp_img, _ioprp_img_size)); #else - while (!SifIopReset("rom0:UDNL rom0:EELOADCNF", 0)); + while (!SifIopReset("", 0)); #endif while (!SifIopSync()); @@ -84,6 +92,9 @@ void loadModules() sbv_patch_disable_prefix_check(); #ifdef HOMEBREW_IRX +#ifdef SUPPORT_SYSTEM_2X6 +#error Namco system 2x6 enabled, homebrew MCMAN cannot be used +#endif SifExecModuleBuffer(_sio2man_irx_start, _sio2man_irx_size, 0, NULL, &ret); SifExecModuleBuffer(_padman_irx_start, _padman_irx_size, 0, NULL, &ret); SifExecModuleBuffer(_mcman_irx_start, _mcman_irx_size, 0, NULL, &ret); @@ -107,7 +118,7 @@ void loadModules() sleep(2); // Allow USB devices some time to be detected #endif -#ifdef HOMEBREW_IRX +#if defined(HOMEBREW_IRX) || defined(SUPPORT_SYSTEM_2X6) mcInit(MC_TYPE_XMC); #else mcInit(MC_TYPE_MC); From 60311bd03d3d8e08be46e1138dc2aa1b7bf999e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=ADas=20Israelson?= <57065102+israpps@users.noreply.github.com> Date: Tue, 20 Feb 2024 15:21:33 -0300 Subject: [PATCH 02/38] Update Makefile --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 0662037..4e77726 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ EXFAT ?= 0 HOMEBREW_IRX ?= 1 #wether to use or not homebrew IRX for pad, memcard and SIO2. if disabled. rom0: drivers will be used. wich is not a safe option. as it makes using the program on protokernel PS2 dangerous (at least for memcard I/O) PRINTF = NONE RELDIR = release -EE_BIN = CheatDevice$(HAS_EXFAT)$(HAS_HDD).ELF +EE_BIN = CheatDevice$(HAS_EXFAT)$(HAS_HDD)$(HAS_COH).ELF # For minizip EE_CFLAGS += -DUSE_FILE32API @@ -186,7 +186,7 @@ $(RELDIR): all zip -q -9 $(RELDIR)/CheatDatabase.zip CheatDatabase.txt cp CheatDevicePS2.ini LICENSE README.md $(RELDIR) sed -i 's/CheatDatabase.txt/CheatDatabase.zip/g' $(RELDIR)/CheatDevicePS2.ini - cd $(RELDIR) && zip -q -9 CheatDevicePS2$(HAS_EXFAT)$(HAS_HDD).zip * extra_cheats/*.zip + cd $(RELDIR) && zip -q -9 CheatDevicePS2$(HAS_EXFAT)$(HAS_HDD)$(HAS_COH).zip * extra_cheats/*.zip clean: rm -rf src/*.o src/libraries/*.o src/libraries/minizip/*.o src/saveformats/*.o $(EE_BIN) $(RELDIR)/$(EE_BIN) From 2218fd826d15d9d5b7bc6b4673db60dd96a4b0c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=ADas=20Israelson?= <57065102+israpps@users.noreply.github.com> Date: Tue, 20 Feb 2024 16:49:40 -0300 Subject: [PATCH 03/38] Update main.c --- bootstrap/main.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/bootstrap/main.c b/bootstrap/main.c index 63e1365..7c9b9a2 100644 --- a/bootstrap/main.c +++ b/bootstrap/main.c @@ -11,6 +11,12 @@ #include #include +#ifdef SUPPORT_SYSTEM_2X6 +#include +extern u8 _ioprp_img[]; +extern int _ioprp_img_size; +#endif + /* Debug colors. Now NTSC Safe! At least I believe they are... */ int red = 0x1010B4; /* RED: Opening elf */ int green = 0x10B410; /* GREEN: Reading elf */ @@ -174,13 +180,11 @@ void MyLoadElf(char *elfpath) /* IOP reboot routine from ps2rd */ SifInitRpc(0); #ifdef SUPPORT_SYSTEM_2X6 - while (!SifIopReset("", 0)); + while (!SifIopRebootBuffer(_ioprp_img, _ioprp_img_size)); #else - while (!SifIopReset("rom0:UDNL rom0:EELOADCNF", 0)) - ; + while (!SifIopReset("rom0:UDNL rom0:EELOADCNF", 0)); #endif - while (!SifIopSync()) - ; + while (!SifIopSync()); /* exit services */ fioExit(); From 99a4eb9a27599ca15df170232b5f8cafdd9d5048 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=ADas=20Israelson?= <57065102+israpps@users.noreply.github.com> Date: Tue, 20 Feb 2024 16:55:42 -0300 Subject: [PATCH 04/38] Update Makefile --- bootstrap/Makefile | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/bootstrap/Makefile b/bootstrap/Makefile index 9b38d80..5d90125 100644 --- a/bootstrap/Makefile +++ b/bootstrap/Makefile @@ -1,6 +1,13 @@ EE_BIN = bootstrap.elf EE_OBJS = main.o +vpath ioprp.o ../ +ifeq ($(COH),1) + EE_CFLAGS += -DSUPPORT_SYSTEM_2x6 + EE_LIBS += -liopreboot + EE_OBJS += ioprp.o +endif + #EE_LDFLAGS = -s -Ttext 0x00090000 #EE_LDFLAGS = -s -Ttext 0x01900000 #EE_LDFLAGS = -s -Ttext 0x000F3000 From 5bc61c9b773f0673cfaf185d73ac094572a3cf09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=ADas=20Israelson?= <57065102+israpps@users.noreply.github.com> Date: Tue, 20 Feb 2024 17:01:02 -0300 Subject: [PATCH 05/38] Update Makefile --- Makefile | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 4e77726..168431b 100644 --- a/Makefile +++ b/Makefile @@ -166,9 +166,11 @@ endif @cd engine && $(MAKE) @bin2o engine/engine.erl engine/engine_erl.o _engine_erl - @# Bootstrap - @cd bootstrap && $(MAKE) - @bin2o bootstrap/bootstrap.elf bootstrap/bootstrap_elf.o _bootstrap_elf +bootstrap/bootstrap.elf: + $(MAKE) -C bootstrap + +bootstrap/bootstrap_elf.o: bootstrap/bootstrap.elf ioprp.o + @bin2o bootstrap/bootstrap.elf $@ _bootstrap_elf version: @echo -n '#define GIT_VERSION "'> src/version.h From 5ec4b4faa22784aaf5d7400e1923e1c4c3df28a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=ADas=20Israelson?= <57065102+israpps@users.noreply.github.com> Date: Tue, 20 Feb 2024 17:05:39 -0300 Subject: [PATCH 06/38] Update Makefile --- bootstrap/Makefile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/bootstrap/Makefile b/bootstrap/Makefile index 5d90125..0097c4e 100644 --- a/bootstrap/Makefile +++ b/bootstrap/Makefile @@ -1,11 +1,10 @@ EE_BIN = bootstrap.elf EE_OBJS = main.o -vpath ioprp.o ../ ifeq ($(COH),1) EE_CFLAGS += -DSUPPORT_SYSTEM_2x6 EE_LIBS += -liopreboot - EE_OBJS += ioprp.o + EE_OBJS += ../ioprp.o endif #EE_LDFLAGS = -s -Ttext 0x00090000 From bd7d389adb41955fe7456aa17411d690d6600ef1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=ADas=20Israelson?= <57065102+israpps@users.noreply.github.com> Date: Tue, 20 Feb 2024 17:06:11 -0300 Subject: [PATCH 07/38] Update Makefile --- bootstrap/Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bootstrap/Makefile b/bootstrap/Makefile index 0097c4e..8eef69d 100644 --- a/bootstrap/Makefile +++ b/bootstrap/Makefile @@ -7,6 +7,9 @@ ifeq ($(COH),1) EE_OBJS += ../ioprp.o endif +../ioprp.o: ../iop/IOPRP_FILEIO.IMG + @bin2o $< $@ _ioprp_img + #EE_LDFLAGS = -s -Ttext 0x00090000 #EE_LDFLAGS = -s -Ttext 0x01900000 #EE_LDFLAGS = -s -Ttext 0x000F3000 From ff923090d39862950875be8cf5695d30519b6572 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=ADas=20Israelson?= <57065102+israpps@users.noreply.github.com> Date: Tue, 20 Feb 2024 17:32:18 -0300 Subject: [PATCH 08/38] Update Makefile --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 168431b..e7a5e1a 100644 --- a/Makefile +++ b/Makefile @@ -167,10 +167,10 @@ endif @bin2o engine/engine.erl engine/engine_erl.o _engine_erl bootstrap/bootstrap.elf: - $(MAKE) -C bootstrap + cd bootstrap && $(MAKE) bootstrap/bootstrap_elf.o: bootstrap/bootstrap.elf ioprp.o - @bin2o bootstrap/bootstrap.elf $@ _bootstrap_elf + @bin2o bootstrap/bootstrap.elf bootstrap/bootstrap_elf.o _bootstrap_elf version: @echo -n '#define GIT_VERSION "'> src/version.h From 89c59f4523761dcf2f186a3f898a31b71b92f291 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=ADas=20Israelson?= <57065102+israpps@users.noreply.github.com> Date: Tue, 20 Feb 2024 17:35:15 -0300 Subject: [PATCH 09/38] Update Makefile --- Makefile | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index e7a5e1a..7478c23 100644 --- a/Makefile +++ b/Makefile @@ -165,12 +165,9 @@ endif @# Engine @cd engine && $(MAKE) @bin2o engine/engine.erl engine/engine_erl.o _engine_erl - -bootstrap/bootstrap.elf: - cd bootstrap && $(MAKE) - -bootstrap/bootstrap_elf.o: bootstrap/bootstrap.elf ioprp.o - @bin2o bootstrap/bootstrap.elf bootstrap/bootstrap_elf.o _bootstrap_elf + @# Bootstrap + @cd bootstrap && $(MAKE) + @bin2o bootstrap/bootstrap.elf bootstrap/bootstrap_elf.o _bootstrap_elf version: @echo -n '#define GIT_VERSION "'> src/version.h From 0933993646c876381e0178ddd2700ef0d2a86221 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=ADas=20Israelson?= <57065102+israpps@users.noreply.github.com> Date: Tue, 20 Feb 2024 17:38:40 -0300 Subject: [PATCH 10/38] Update CI.yml --- .github/workflows/CI.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 4d7e2a9..66d3a3f 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -27,7 +27,7 @@ jobs: - name: Compile cheat device run: | - make rebuild release ${{ matrix.opts }} + make rebuild release ${{ matrix.opts }} --trace - name: list run: | From b56c6ecd686836b00d00b3e7c8e77b90c41afd95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=ADas=20Israelson?= <57065102+israpps@users.noreply.github.com> Date: Tue, 20 Feb 2024 17:58:50 -0300 Subject: [PATCH 11/38] Update Makefile --- bootstrap/Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bootstrap/Makefile b/bootstrap/Makefile index 8eef69d..3c54dc9 100644 --- a/bootstrap/Makefile +++ b/bootstrap/Makefile @@ -7,9 +7,6 @@ ifeq ($(COH),1) EE_OBJS += ../ioprp.o endif -../ioprp.o: ../iop/IOPRP_FILEIO.IMG - @bin2o $< $@ _ioprp_img - #EE_LDFLAGS = -s -Ttext 0x00090000 #EE_LDFLAGS = -s -Ttext 0x01900000 #EE_LDFLAGS = -s -Ttext 0x000F3000 @@ -36,5 +33,8 @@ all: $(EE_BIN) clean: rm -f *.o *.s *.elf +../ioprp.o: ../iop/IOPRP_FILEIO.IMG + @bin2o $< $@ _ioprp_img + include $(PS2SDK)/samples/Makefile.pref include $(PS2SDK)/samples/Makefile.eeglobal From 15dd06e7013b156fe001c0e641564faa3851dfda Mon Sep 17 00:00:00 2001 From: israpps <57065102+israpps@users.noreply.github.com> Date: Wed, 21 Feb 2024 11:04:17 -0300 Subject: [PATCH 12/38] fix cd access? --- src/util.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/util.c b/src/util.c index 127d5ca..bc58a06 100644 --- a/src/util.c +++ b/src/util.c @@ -145,6 +145,13 @@ int loadModules(int booting_from_hdd) sbv_patch_enable_lmb(); sbv_patch_disable_prefix_check(); + + +#ifdef SUPPORT_SYSTEM_2X6 + ID = SifLoadStartModule("rom0:CDVDFSV", 0, NULL, &RET); + DPRINTF(" [rom0:CDVDFSV]: ID=%d, ret=%d\n", ID, RET); +#endif + LOAD_IRX_BUF_SILENT(_iomanX_irx); #ifdef FILEXIO if (booting_from_hdd) { From c4347082833d6ab57f4e6df13571ca97c65b085f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=ADas=20Israelson?= <57065102+israpps@users.noreply.github.com> Date: Wed, 21 Feb 2024 12:54:27 -0300 Subject: [PATCH 13/38] Update Makefile --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 7478c23..4ffa91b 100644 --- a/Makefile +++ b/Makefile @@ -46,6 +46,7 @@ ifeq ($(COH),1) HAS_COH = -COH HOMEBREW_IRX = 0 EE_OBJS += ioprp.o + EE_SIO = 1 endif ifeq ($(HDD), 1) From 35347cd4dc99fde8f9f269bd2b01aa4a105750c4 Mon Sep 17 00:00:00 2001 From: israpps <57065102+israpps@users.noreply.github.com> Date: Wed, 21 Feb 2024 13:09:14 -0300 Subject: [PATCH 14/38] crude on screen logging --- src/main.c | 3 +++ src/util.c | 16 ++++++++++++---- src/util.h | 4 ++++ 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/main.c b/src/main.c index 15a8f1f..14da96d 100644 --- a/src/main.c +++ b/src/main.c @@ -10,6 +10,7 @@ #include "cheats.h" #include "settings.h" #include "dbgprintf.h" +char prog[255]; #include "util.h" #ifdef HDD @@ -77,7 +78,9 @@ int main(int argc, char *argv[]) } } #endif + ON_SCREEN_INIT_PROGRESS("Initialize settings"); initSettings(); + ON_SCREEN_INIT_PROGRESS("Initialize menu"); initMenus(); char *readOnlyPath = settingsGetReadOnlyDatabasePath(); diff --git a/src/util.c b/src/util.c index bc58a06..7f2d4b4 100644 --- a/src/util.c +++ b/src/util.c @@ -118,6 +118,7 @@ int loadModules(int booting_from_hdd) #ifdef _DTL_T10000 while (!SifIopReset("rom0:UDNL", 0)); #elif SUPPORT_SYSTEM_2X6 + ON_SCREEN_INIT_PROGRESS("Flashing IOPRP IMAGE"); while (!SifIopRebootBuffer(_ioprp_img, _ioprp_img_size)); #else while (!SifIopReset("", 0)); @@ -150,6 +151,7 @@ int loadModules(int booting_from_hdd) #ifdef SUPPORT_SYSTEM_2X6 ID = SifLoadStartModule("rom0:CDVDFSV", 0, NULL, &RET); DPRINTF(" [rom0:CDVDFSV]: ID=%d, ret=%d\n", ID, RET); + ON_SCREEN_INIT_PROGRESS_BUF(" [rom0:CDVDFSV]: ID=%d, ret=%d\n", ID, RET); #endif LOAD_IRX_BUF_SILENT(_iomanX_irx); @@ -176,10 +178,14 @@ int loadModules(int booting_from_hdd) LOAD_IRX_BUF_SILENT(_mcman_irx); LOAD_IRX_BUF_SILENT(_mcserv_irx); #else - SifLoadModule("rom0:SIO2MAN", 0, NULL); - SifLoadModule("rom0:PADMAN", 0, NULL); - SifLoadModule("rom0:MCMAN", 0, NULL); - SifLoadModule("rom0:MCSERV", 0, NULL); + ID = SifLoadStartModule("rom0:SIO2MAN", 0, NULL, &RET); + ON_SCREEN_INIT_PROGRESS_BUF(" [rom0:SIO2MAN]: ID=%d, ret=%d\n", ID, RET); + ID = SifLoadStartModule("rom0:PADMAN", 0, NULL, &RET); + ON_SCREEN_INIT_PROGRESS_BUF(" [rom0:PADMAN]: ID=%d, ret=%d\n", ID, RET); + ID = SifLoadStartModule("rom0:MCMAN", 0, NULL, &RET); + ON_SCREEN_INIT_PROGRESS_BUF(" [rom0:MCMAN]: ID=%d, ret=%d\n", ID, RET); + ID = SifLoadStartModule("rom0:MCSERV", 0, NULL, &RET); + ON_SCREEN_INIT_PROGRESS_BUF(" [rom0:MCSERV]: ID=%d, ret=%d\n", ID, RET); #endif #ifdef EXFAT LOAD_IRX_BUF_SILENT(_bdm_irx); @@ -194,11 +200,13 @@ int loadModules(int booting_from_hdd) #endif #if defined(HOMEBREW_IRX) || defined(SUPPORT_SYSTEM_2X6) + ON_SCREEN_INIT_PROGRESS("Initializing XMC RPC"); mcInit(MC_TYPE_XMC); #else mcInit(MC_TYPE_MC); #endif + ON_SCREEN_INIT_PROGRESS("Initializing PAD RPC"); padInitialize(); #ifdef HDD diff --git a/src/util.h b/src/util.h index 9a141cf..ab5dcee 100644 --- a/src/util.h +++ b/src/util.h @@ -8,6 +8,10 @@ #include +#define ON_SCREEN_INIT_PROGRESS(x) displayError(x) +#define ON_SCREEN_INIT_PROGRESS_BUF(x...) sprintf(prog, x), displayError(prog) +extern char* prog; + #define READ_8(address) \ *((unsigned char *)address) From 384aa0b3cd2439f32465a74ccdb700c76fb12779 Mon Sep 17 00:00:00 2001 From: israpps <57065102+israpps@users.noreply.github.com> Date: Wed, 21 Feb 2024 13:09:14 -0300 Subject: [PATCH 15/38] crude on screen logging --- src/main.c | 3 +++ src/util.c | 17 +++++++++++++---- src/util.h | 3 +++ 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/main.c b/src/main.c index 15a8f1f..cea360b 100644 --- a/src/main.c +++ b/src/main.c @@ -11,6 +11,7 @@ #include "settings.h" #include "dbgprintf.h" #include "util.h" +char prog[255]; #ifdef HDD int getMountInfo(char *path, char *mountString, char *mountPoint, char *newCWD); @@ -77,7 +78,9 @@ int main(int argc, char *argv[]) } } #endif + ON_SCREEN_INIT_PROGRESS("Initialize settings"); initSettings(); + ON_SCREEN_INIT_PROGRESS("Initialize menu"); initMenus(); char *readOnlyPath = settingsGetReadOnlyDatabasePath(); diff --git a/src/util.c b/src/util.c index bc58a06..bcf24f4 100644 --- a/src/util.c +++ b/src/util.c @@ -19,6 +19,7 @@ #include extern char* error; +extern char* prog; #define EXTERN_BIN2O(_name_) extern u8 _name_##_start[]; extern int _name_##_size; #define LOAD_IRX_BUF(_irx_, ARGC, ARGV, RET) SifExecModuleBuffer(_irx_##_start, _irx_##_size, ARGC, ARGV, RET) #define LOAD_IRX_BUF_NARG(_irx_, RET) LOAD_IRX_BUF(_irx_, 0, NULL, RET) @@ -118,6 +119,7 @@ int loadModules(int booting_from_hdd) #ifdef _DTL_T10000 while (!SifIopReset("rom0:UDNL", 0)); #elif SUPPORT_SYSTEM_2X6 + ON_SCREEN_INIT_PROGRESS("Flashing IOPRP IMAGE"); while (!SifIopRebootBuffer(_ioprp_img, _ioprp_img_size)); #else while (!SifIopReset("", 0)); @@ -150,6 +152,7 @@ int loadModules(int booting_from_hdd) #ifdef SUPPORT_SYSTEM_2X6 ID = SifLoadStartModule("rom0:CDVDFSV", 0, NULL, &RET); DPRINTF(" [rom0:CDVDFSV]: ID=%d, ret=%d\n", ID, RET); + ON_SCREEN_INIT_PROGRESS_BUF(" [rom0:CDVDFSV]: ID=%d, ret=%d\n", ID, RET); #endif LOAD_IRX_BUF_SILENT(_iomanX_irx); @@ -176,10 +179,14 @@ int loadModules(int booting_from_hdd) LOAD_IRX_BUF_SILENT(_mcman_irx); LOAD_IRX_BUF_SILENT(_mcserv_irx); #else - SifLoadModule("rom0:SIO2MAN", 0, NULL); - SifLoadModule("rom0:PADMAN", 0, NULL); - SifLoadModule("rom0:MCMAN", 0, NULL); - SifLoadModule("rom0:MCSERV", 0, NULL); + ID = SifLoadStartModule("rom0:SIO2MAN", 0, NULL, &RET); + ON_SCREEN_INIT_PROGRESS_BUF(" [rom0:SIO2MAN]: ID=%d, ret=%d\n", ID, RET); + ID = SifLoadStartModule("rom0:PADMAN", 0, NULL, &RET); + ON_SCREEN_INIT_PROGRESS_BUF(" [rom0:PADMAN]: ID=%d, ret=%d\n", ID, RET); + ID = SifLoadStartModule("rom0:MCMAN", 0, NULL, &RET); + ON_SCREEN_INIT_PROGRESS_BUF(" [rom0:MCMAN]: ID=%d, ret=%d\n", ID, RET); + ID = SifLoadStartModule("rom0:MCSERV", 0, NULL, &RET); + ON_SCREEN_INIT_PROGRESS_BUF(" [rom0:MCSERV]: ID=%d, ret=%d\n", ID, RET); #endif #ifdef EXFAT LOAD_IRX_BUF_SILENT(_bdm_irx); @@ -194,11 +201,13 @@ int loadModules(int booting_from_hdd) #endif #if defined(HOMEBREW_IRX) || defined(SUPPORT_SYSTEM_2X6) + ON_SCREEN_INIT_PROGRESS("Initializing XMC RPC"); mcInit(MC_TYPE_XMC); #else mcInit(MC_TYPE_MC); #endif + ON_SCREEN_INIT_PROGRESS("Initializing PAD RPC"); padInitialize(); #ifdef HDD diff --git a/src/util.h b/src/util.h index 9a141cf..59ed0a0 100644 --- a/src/util.h +++ b/src/util.h @@ -8,6 +8,9 @@ #include +#define ON_SCREEN_INIT_PROGRESS(x) displayError(x) +#define ON_SCREEN_INIT_PROGRESS_BUF(x...) sprintf(prog, x), displayError(prog) + #define READ_8(address) \ *((unsigned char *)address) From 69a1757f4094a769e81364d73b9a88c828a4e291 Mon Sep 17 00:00:00 2001 From: israpps <57065102+israpps@users.noreply.github.com> Date: Wed, 21 Feb 2024 13:31:46 -0300 Subject: [PATCH 16/38] . --- src/main.c | 1 - src/util.h | 1 - 2 files changed, 2 deletions(-) diff --git a/src/main.c b/src/main.c index ca0fdda..cea360b 100644 --- a/src/main.c +++ b/src/main.c @@ -10,7 +10,6 @@ #include "cheats.h" #include "settings.h" #include "dbgprintf.h" -char prog[255]; #include "util.h" char prog[255]; diff --git a/src/util.h b/src/util.h index ab5dcee..59ed0a0 100644 --- a/src/util.h +++ b/src/util.h @@ -10,7 +10,6 @@ #define ON_SCREEN_INIT_PROGRESS(x) displayError(x) #define ON_SCREEN_INIT_PROGRESS_BUF(x...) sprintf(prog, x), displayError(prog) -extern char* prog; #define READ_8(address) \ *((unsigned char *)address) From f3f0e7ee382103ae975feec5e49455b9f82b58df Mon Sep 17 00:00:00 2001 From: israpps <57065102+israpps@users.noreply.github.com> Date: Wed, 21 Feb 2024 13:45:03 -0300 Subject: [PATCH 17/38] tesst --- .github/workflows/CI.yml | 2 +- Makefile | 1 + src/util.c | 21 ++++++++++++++++++++- src/util.h | 4 ++-- 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 66d3a3f..ad62166 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -11,7 +11,7 @@ jobs: strategy: fail-fast: false matrix: - opts: ["", "HDD=1", "EXFAT=1", "COH=1"] + opts: ["", "HDD=1", "EXFAT=1", "COH=1 EXFAT=1"] runs-on: ubuntu-latest container: ps2dev/ps2dev:v1.0 steps: diff --git a/Makefile b/Makefile index 4ffa91b..ba6fb4d 100644 --- a/Makefile +++ b/Makefile @@ -41,6 +41,7 @@ else endif ifeq ($(COH),1) + PRINTF = EE_SIO EE_CFLAGS += -DSUPPORT_SYSTEM_2x6 EE_LIBS += -liopreboot HAS_COH = -COH diff --git a/src/util.c b/src/util.c index bcf24f4..c4feaf1 100644 --- a/src/util.c +++ b/src/util.c @@ -24,6 +24,7 @@ extern char* prog; #define LOAD_IRX_BUF(_irx_, ARGC, ARGV, RET) SifExecModuleBuffer(_irx_##_start, _irx_##_size, ARGC, ARGV, RET) #define LOAD_IRX_BUF_NARG(_irx_, RET) LOAD_IRX_BUF(_irx_, 0, NULL, RET) #define LOAD_IRX_BUF_SILENT(_irx_) LOAD_IRX_BUF(_irx_, 0, NULL, NULL) +#define MODULE_REPORT(MODULE) DPRINTF("%s: id:%d, ret:%d\n", ID, RET) #define IRX_LOAD_SUCCESS() (ID >= 0 && RET != 1) #ifdef HOMEBREW_IRX EXTERN_BIN2O(_sio2man_irx) @@ -151,14 +152,16 @@ int loadModules(int booting_from_hdd) #ifdef SUPPORT_SYSTEM_2X6 ID = SifLoadStartModule("rom0:CDVDFSV", 0, NULL, &RET); - DPRINTF(" [rom0:CDVDFSV]: ID=%d, ret=%d\n", ID, RET); + MODULE_REPORT("rom0:CDVDFSV"); ON_SCREEN_INIT_PROGRESS_BUF(" [rom0:CDVDFSV]: ID=%d, ret=%d\n", ID, RET); #endif LOAD_IRX_BUF_SILENT(_iomanX_irx); + MODULE_REPORT("IOMANX"); #ifdef FILEXIO if (booting_from_hdd) { ID = LOAD_IRX_BUF_NARG(_filexio_irx, &RET); + MODULE_REPORT("FILEXIO"); filexio_loaded = IRX_LOAD_SUCCESS(); if (filexio_loaded) fileXioInit(); else sprintf(error, "HDD Init error\n%s: ID:%d, RET_%d!", "FILEXIO.IRX", ID, RET); } @@ -166,6 +169,7 @@ int loadModules(int booting_from_hdd) #ifdef DEV9 if (booting_from_hdd) { ID = LOAD_IRX_BUF_NARG(_ps2dev9_irx, &RET); + MODULE_REPORT("DEV9"); dev9_loaded = IRX_LOAD_SUCCESS(); } #endif @@ -180,35 +184,50 @@ int loadModules(int booting_from_hdd) LOAD_IRX_BUF_SILENT(_mcserv_irx); #else ID = SifLoadStartModule("rom0:SIO2MAN", 0, NULL, &RET); + MODULE_REPORT("rom0:SIO2MAN"); ON_SCREEN_INIT_PROGRESS_BUF(" [rom0:SIO2MAN]: ID=%d, ret=%d\n", ID, RET); ID = SifLoadStartModule("rom0:PADMAN", 0, NULL, &RET); + MODULE_REPORT("rom0:PADMAN"); ON_SCREEN_INIT_PROGRESS_BUF(" [rom0:PADMAN]: ID=%d, ret=%d\n", ID, RET); ID = SifLoadStartModule("rom0:MCMAN", 0, NULL, &RET); + MODULE_REPORT("rom0:MCMAN"); ON_SCREEN_INIT_PROGRESS_BUF(" [rom0:MCMAN]: ID=%d, ret=%d\n", ID, RET); ID = SifLoadStartModule("rom0:MCSERV", 0, NULL, &RET); + MODULE_REPORT("rom0:MCSERV"); ON_SCREEN_INIT_PROGRESS_BUF(" [rom0:MCSERV]: ID=%d, ret=%d\n", ID, RET); #endif #ifdef EXFAT LOAD_IRX_BUF_SILENT(_bdm_irx); + MODULE_REPORT("BDM"); LOAD_IRX_BUF_SILENT(_bdmfs_fatfs_irx); + MODULE_REPORT("BDMFS_FATFS"); LOAD_IRX_BUF_SILENT(_usbd_irx); + MODULE_REPORT("USBD"); LOAD_IRX_BUF_SILENT(_usbmass_bd_irx); + MODULE_REPORT("USBMASS_BD"); sleep(3); // Allow USB devices some time to be detected #else LOAD_IRX_BUF_SILENT(_usbd_irx); + MODULE_REPORT("USBD"); LOAD_IRX_BUF_SILENT(_usbhdfsd_irx); + MODULE_REPORT("USBHDFSD"); sleep(2); // Allow USB devices some time to be detected #endif #if defined(HOMEBREW_IRX) || defined(SUPPORT_SYSTEM_2X6) ON_SCREEN_INIT_PROGRESS("Initializing XMC RPC"); + DPRINTF("mcInit(MC_TYPE_XMC).."); mcInit(MC_TYPE_XMC); #else + DPRINTF("mcInit(MC_TYPE_MC).."); mcInit(MC_TYPE_MC); #endif + DPRINTF(".done\n"); ON_SCREEN_INIT_PROGRESS("Initializing PAD RPC"); + DPRINTF("padInitialize().."); padInitialize(); + DPRINTF(".done\n"); #ifdef HDD if (booting_from_hdd) { diff --git a/src/util.h b/src/util.h index 59ed0a0..813b544 100644 --- a/src/util.h +++ b/src/util.h @@ -8,8 +8,8 @@ #include -#define ON_SCREEN_INIT_PROGRESS(x) displayError(x) -#define ON_SCREEN_INIT_PROGRESS_BUF(x...) sprintf(prog, x), displayError(prog) +#define ON_SCREEN_INIT_PROGRESS(x) //displayError(x) +#define ON_SCREEN_INIT_PROGRESS_BUF(x...) //sprintf(prog, x), displayError(prog) #define READ_8(address) \ *((unsigned char *)address) From 531c0734b1e8a3efce190bb13673b16e82befb42 Mon Sep 17 00:00:00 2001 From: israpps <57065102+israpps@users.noreply.github.com> Date: Wed, 21 Feb 2024 14:12:56 -0300 Subject: [PATCH 18/38] split mcman, mcser, sio2man and padman toggles --- Makefile | 40 ++++++++++++++++++++++++++++++---------- src/util.c | 49 ++++++++++++++++++++++++++++++++++++------------- 2 files changed, 66 insertions(+), 23 deletions(-) diff --git a/Makefile b/Makefile index ba6fb4d..038469c 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,10 @@ DTL_T10000 ?= 0 EXFAT ?= 0 -HOMEBREW_IRX ?= 1 #wether to use or not homebrew IRX for pad, memcard and SIO2. if disabled. rom0: drivers will be used. wich is not a safe option. as it makes using the program on protokernel PS2 dangerous (at least for memcard I/O) +HOMEBREW_MCMAN ?= 1 +HOMEBREW_MCSERV ?= 1 +HOMEBREW_PADMAN ?= 1 +HOMEBREW_SIO2MAN ?= 1 PRINTF = NONE RELDIR = release EE_BIN = CheatDevice$(HAS_EXFAT)$(HAS_HDD)$(HAS_COH).ELF @@ -28,9 +31,6 @@ OBJS += src/saveformats/util.o src/saveformats/cbs.o src/saveformats/psu.o src/s # IRX Modules IRX_OBJS += resources/usbd_irx.o IRX_OBJS += resources/iomanX_irx.o -ifeq ($(HOMEBREW_IRX),1) - IRX_OBJS += resources/sio2man_irx.o resources/mcman_irx.o resources/mcserv_irx.o resources/padman_irx.o -endif ifeq ($(EXFAT),1) EE_CFLAGS += -DEXFAT @@ -45,7 +45,8 @@ ifeq ($(COH),1) EE_CFLAGS += -DSUPPORT_SYSTEM_2x6 EE_LIBS += -liopreboot HAS_COH = -COH - HOMEBREW_IRX = 0 + HOMEBREW_MCMAN = 0 + HOMEBREW_MCSERV = 0 EE_OBJS += ioprp.o EE_SIO = 1 endif @@ -83,15 +84,28 @@ OBJS += engine/engine_erl.o # Bootstrap ELF OBJS += bootstrap/bootstrap_elf.o - -ifeq ($(HOMEBREW_IRX),1) - += -lpadx - EE_CFLAGS += -DHOMEBREW_IRX +ifeq ($(HOMEBREW_PADMAN),1) + IRX_OBJS += resources/padman_irx.o + EE_LIBS += -lpadx + EE_CFLAGS += -DHOMEBREW_PADMAN else ifeq ($(COH),1)#Because on COH, rom0:PADMAN has the RPC style of retail rom0:XPADMAN EE_LIBS += -lpadx else EE_LIBS += -lpad endif +ifeq ($(HOMEBREW_MCMAN),1) + EE_CFLAGS += -DHOMEBREW_MCMAN + IRX_OBJS += resources/mcman_irx.o +endif +ifeq ($(HOMEBREW_SIO2MAN),1) + EE_CFLAGS += -DHOMEBREW_SIO2MAN + IRX_OBJS += resources/sio2man_irx.o +endif +ifeq ($(HOMEBREW_MCSERV),1) + EE_CFLAGS += -DHOMEBREW_MCSERV + IRX_OBJS += resources/mcserv_irx.o +endif + ifeq ($(DTL_T10000),1) EE_CFLAGS += -D_DTL_T10000 -g endif @@ -121,10 +135,16 @@ ifeq ($(EXFAT),1) else bin2o $(PS2SDK)/iop/irx/usbhdfsd.irx resources/usbhdfsd_irx.o _usbhdfsd_irx endif -ifeq ($(HOMEBREW_IRX),1) +ifeq ($(HOMEBREW_SIO2MAN),1) bin2o $(PS2SDK)/iop/irx/freesio2.irx resources/sio2man_irx.o _sio2man_irx +endif +ifeq ($(HOMEBREW_MCMAN),1) bin2o $(PS2SDK)/iop/irx/mcman.irx resources/mcman_irx.o _mcman_irx +endif +ifeq ($(HOMEBREW_MCSERV),1) bin2o $(PS2SDK)/iop/irx/mcserv.irx resources/mcserv_irx.o _mcserv_irx +endif +ifeq ($(HOMEBREW_PADMAN),1) bin2o $(PS2SDK)/iop/irx/freepad.irx resources/padman_irx.o _padman_irx endif ifeq ($(FILEXIO_NEED), 1) diff --git a/src/util.c b/src/util.c index c4feaf1..908a874 100644 --- a/src/util.c +++ b/src/util.c @@ -23,15 +23,23 @@ extern char* prog; #define EXTERN_BIN2O(_name_) extern u8 _name_##_start[]; extern int _name_##_size; #define LOAD_IRX_BUF(_irx_, ARGC, ARGV, RET) SifExecModuleBuffer(_irx_##_start, _irx_##_size, ARGC, ARGV, RET) #define LOAD_IRX_BUF_NARG(_irx_, RET) LOAD_IRX_BUF(_irx_, 0, NULL, RET) -#define LOAD_IRX_BUF_SILENT(_irx_) LOAD_IRX_BUF(_irx_, 0, NULL, NULL) -#define MODULE_REPORT(MODULE) DPRINTF("%s: id:%d, ret:%d\n", ID, RET) +#define LOAD_IRX_BUF_SILENT(_irx_) LOAD_IRX_BUF(_irx_, 0, NULL, &RET) +#define MODULE_REPORT(MODULE) DPRINTF("%s: id:%d, ret:%d\n", MODULE, ID, RET) #define IRX_LOAD_SUCCESS() (ID >= 0 && RET != 1) -#ifdef HOMEBREW_IRX + +#ifdef HOMEBREW_SIO2MAN EXTERN_BIN2O(_sio2man_irx) +#endif +#ifdef HOMEBREW_MCMAN EXTERN_BIN2O(_mcman_irx) +#endif +#ifdef HOMEBREW_MCSERV EXTERN_BIN2O(_mcserv_irx); +#endif +#ifdef HOMEBREW_PADMAN EXTERN_BIN2O(_padman_irx); #endif + EXTERN_BIN2O(_usbd_irx); EXTERN_BIN2O(_iomanX_irx); @@ -174,28 +182,43 @@ int loadModules(int booting_from_hdd) } #endif -#ifdef HOMEBREW_IRX +#ifdef HOMEBREW_MCMAN #ifdef SUPPORT_SYSTEM_2X6 #error Namco system 2x6 enabled, homebrew MCMAN cannot be used #endif +#endif + #ifdef HOMEBREW_SIO2MAN LOAD_IRX_BUF_SILENT(_sio2man_irx); - LOAD_IRX_BUF_SILENT(_padman_irx); - LOAD_IRX_BUF_SILENT(_mcman_irx); - LOAD_IRX_BUF_SILENT(_mcserv_irx); -#else + MODULE_REPORT("SIO2MAN"); + #else ID = SifLoadStartModule("rom0:SIO2MAN", 0, NULL, &RET); MODULE_REPORT("rom0:SIO2MAN"); ON_SCREEN_INIT_PROGRESS_BUF(" [rom0:SIO2MAN]: ID=%d, ret=%d\n", ID, RET); - ID = SifLoadStartModule("rom0:PADMAN", 0, NULL, &RET); - MODULE_REPORT("rom0:PADMAN"); - ON_SCREEN_INIT_PROGRESS_BUF(" [rom0:PADMAN]: ID=%d, ret=%d\n", ID, RET); + #endif + #ifdef HOMEBREW_MCMAN + LOAD_IRX_BUF_SILENT(_mcman_irx); + MODULE_REPORT("MCMAN"); + #else ID = SifLoadStartModule("rom0:MCMAN", 0, NULL, &RET); MODULE_REPORT("rom0:MCMAN"); ON_SCREEN_INIT_PROGRESS_BUF(" [rom0:MCMAN]: ID=%d, ret=%d\n", ID, RET); + #endif + #ifdef HOMEBREW_MCSERV + LOAD_IRX_BUF_SILENT(_mcserv_irx); + MODULE_REPORT("MCSERV"); + #else ID = SifLoadStartModule("rom0:MCSERV", 0, NULL, &RET); MODULE_REPORT("rom0:MCSERV"); ON_SCREEN_INIT_PROGRESS_BUF(" [rom0:MCSERV]: ID=%d, ret=%d\n", ID, RET); -#endif + #endif + #ifdef HOMEBREW_PADMAN + LOAD_IRX_BUF_SILENT(_padman_irx); + MODULE_REPORT("PADMAN"); + #else + ID = SifLoadStartModule("rom0:PADMAN", 0, NULL, &RET); + MODULE_REPORT("rom0:PADMAN"); + ON_SCREEN_INIT_PROGRESS_BUF(" [rom0:PADMAN]: ID=%d, ret=%d\n", ID, RET); + #endif #ifdef EXFAT LOAD_IRX_BUF_SILENT(_bdm_irx); MODULE_REPORT("BDM"); @@ -214,7 +237,7 @@ int loadModules(int booting_from_hdd) sleep(2); // Allow USB devices some time to be detected #endif -#if defined(HOMEBREW_IRX) || defined(SUPPORT_SYSTEM_2X6) +#if defined(HOMEBREW_MCMAN) || defined(SUPPORT_SYSTEM_2X6) ON_SCREEN_INIT_PROGRESS("Initializing XMC RPC"); DPRINTF("mcInit(MC_TYPE_XMC).."); mcInit(MC_TYPE_XMC); From 53a17ef9b129ee61f9ff59a6108a43f9764528a8 Mon Sep 17 00:00:00 2001 From: israpps <57065102+israpps@users.noreply.github.com> Date: Wed, 21 Feb 2024 14:20:20 -0300 Subject: [PATCH 19/38] seems like `sleep()` makes coh bios hang? --- src/util.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/util.c b/src/util.c index 908a874..90519a0 100644 --- a/src/util.c +++ b/src/util.c @@ -23,7 +23,7 @@ extern char* prog; #define EXTERN_BIN2O(_name_) extern u8 _name_##_start[]; extern int _name_##_size; #define LOAD_IRX_BUF(_irx_, ARGC, ARGV, RET) SifExecModuleBuffer(_irx_##_start, _irx_##_size, ARGC, ARGV, RET) #define LOAD_IRX_BUF_NARG(_irx_, RET) LOAD_IRX_BUF(_irx_, 0, NULL, RET) -#define LOAD_IRX_BUF_SILENT(_irx_) LOAD_IRX_BUF(_irx_, 0, NULL, &RET) +#define LOAD_IRX_BUF_SILENT(_irx_) ID = LOAD_IRX_BUF(_irx_, 0, NULL, &RET) #define MODULE_REPORT(MODULE) DPRINTF("%s: id:%d, ret:%d\n", MODULE, ID, RET) #define IRX_LOAD_SUCCESS() (ID >= 0 && RET != 1) @@ -228,13 +228,17 @@ int loadModules(int booting_from_hdd) MODULE_REPORT("USBD"); LOAD_IRX_BUF_SILENT(_usbmass_bd_irx); MODULE_REPORT("USBMASS_BD"); + #ifndef SUPPORT_SYSTEM_2X6 sleep(3); // Allow USB devices some time to be detected + #endif #else LOAD_IRX_BUF_SILENT(_usbd_irx); MODULE_REPORT("USBD"); LOAD_IRX_BUF_SILENT(_usbhdfsd_irx); MODULE_REPORT("USBHDFSD"); - sleep(2); // Allow USB devices some time to be detected + #ifndef SUPPORT_SYSTEM_2X6 + sleep(3); // Allow USB devices some time to be detected + #endif #endif #if defined(HOMEBREW_MCMAN) || defined(SUPPORT_SYSTEM_2X6) From ebbd299e509877a455368720d94bc755bd99988c Mon Sep 17 00:00:00 2001 From: israpps <57065102+israpps@users.noreply.github.com> Date: Wed, 21 Feb 2024 14:27:51 -0300 Subject: [PATCH 20/38] use the appropiate sio2man version --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 038469c..12b5e9c 100644 --- a/Makefile +++ b/Makefile @@ -136,7 +136,7 @@ else bin2o $(PS2SDK)/iop/irx/usbhdfsd.irx resources/usbhdfsd_irx.o _usbhdfsd_irx endif ifeq ($(HOMEBREW_SIO2MAN),1) - bin2o $(PS2SDK)/iop/irx/freesio2.irx resources/sio2man_irx.o _sio2man_irx + bin2o $(PS2SDK)/iop/irx/sio2man.irx resources/sio2man_irx.o _sio2man_irx endif ifeq ($(HOMEBREW_MCMAN),1) bin2o $(PS2SDK)/iop/irx/mcman.irx resources/mcman_irx.o _mcman_irx From 800888dac441c02102d54487a9b0605064bbef8a Mon Sep 17 00:00:00 2001 From: israpps <57065102+israpps@users.noreply.github.com> Date: Wed, 21 Feb 2024 14:39:30 -0300 Subject: [PATCH 21/38] aaaa --- src/util.c | 4 +++- src/util.h | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/util.c b/src/util.c index 90519a0..3be7343 100644 --- a/src/util.c +++ b/src/util.c @@ -211,6 +211,7 @@ int loadModules(int booting_from_hdd) MODULE_REPORT("rom0:MCSERV"); ON_SCREEN_INIT_PROGRESS_BUF(" [rom0:MCSERV]: ID=%d, ret=%d\n", ID, RET); #endif + int mcserv_is_runnin = IRX_LOAD_SUCCESS(); #ifdef HOMEBREW_PADMAN LOAD_IRX_BUF_SILENT(_padman_irx); MODULE_REPORT("PADMAN"); @@ -240,7 +241,7 @@ int loadModules(int booting_from_hdd) sleep(3); // Allow USB devices some time to be detected #endif #endif - + if (mcserv_is_runnin) { #if defined(HOMEBREW_MCMAN) || defined(SUPPORT_SYSTEM_2X6) ON_SCREEN_INIT_PROGRESS("Initializing XMC RPC"); DPRINTF("mcInit(MC_TYPE_XMC).."); @@ -250,6 +251,7 @@ int loadModules(int booting_from_hdd) mcInit(MC_TYPE_MC); #endif DPRINTF(".done\n"); + } else displayError("MCSERV module failed to load\nmemory card access disabled"); ON_SCREEN_INIT_PROGRESS("Initializing PAD RPC"); DPRINTF("padInitialize().."); diff --git a/src/util.h b/src/util.h index 813b544..59ed0a0 100644 --- a/src/util.h +++ b/src/util.h @@ -8,8 +8,8 @@ #include -#define ON_SCREEN_INIT_PROGRESS(x) //displayError(x) -#define ON_SCREEN_INIT_PROGRESS_BUF(x...) //sprintf(prog, x), displayError(prog) +#define ON_SCREEN_INIT_PROGRESS(x) displayError(x) +#define ON_SCREEN_INIT_PROGRESS_BUF(x...) sprintf(prog, x), displayError(prog) #define READ_8(address) \ *((unsigned char *)address) From 4236640923e8c8fbc925f9b4f2dcd41282b25aea Mon Sep 17 00:00:00 2001 From: israpps <57065102+israpps@users.noreply.github.com> Date: Wed, 21 Feb 2024 14:45:57 -0300 Subject: [PATCH 22/38] more tests --- Makefile | 1 + src/util.c | 5 ++++- src/util.h | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 12b5e9c..79fc62b 100644 --- a/Makefile +++ b/Makefile @@ -47,6 +47,7 @@ ifeq ($(COH),1) HAS_COH = -COH HOMEBREW_MCMAN = 0 HOMEBREW_MCSERV = 0 + HOMEBREW_SIO2MAN = 0 EE_OBJS += ioprp.o EE_SIO = 1 endif diff --git a/src/util.c b/src/util.c index 3be7343..efb54b6 100644 --- a/src/util.c +++ b/src/util.c @@ -251,7 +251,10 @@ int loadModules(int booting_from_hdd) mcInit(MC_TYPE_MC); #endif DPRINTF(".done\n"); - } else displayError("MCSERV module failed to load\nmemory card access disabled"); + } else { + DPRITNF() + displayError("MCSERV module failed to load\nmemory card access disabled"); + } ON_SCREEN_INIT_PROGRESS("Initializing PAD RPC"); DPRINTF("padInitialize().."); diff --git a/src/util.h b/src/util.h index 59ed0a0..fa42b50 100644 --- a/src/util.h +++ b/src/util.h @@ -9,7 +9,7 @@ #include #define ON_SCREEN_INIT_PROGRESS(x) displayError(x) -#define ON_SCREEN_INIT_PROGRESS_BUF(x...) sprintf(prog, x), displayError(prog) +#define ON_SCREEN_INIT_PROGRESS_BUF(x...) sprintf(prog, x); displayError(prog) #define READ_8(address) \ *((unsigned char *)address) From 79ab75fe46937a898c5051da091e72bcc9735802 Mon Sep 17 00:00:00 2001 From: israpps <57065102+israpps@users.noreply.github.com> Date: Wed, 21 Feb 2024 14:47:31 -0300 Subject: [PATCH 23/38] Update util.c --- src/util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util.c b/src/util.c index efb54b6..07c0eac 100644 --- a/src/util.c +++ b/src/util.c @@ -252,7 +252,7 @@ int loadModules(int booting_from_hdd) #endif DPRINTF(".done\n"); } else { - DPRITNF() + DPRINTF("skipping MCSERV RPC\n"); displayError("MCSERV module failed to load\nmemory card access disabled"); } From f35d28980cb89b9458f7d1b9b7f62136f39d3a08 Mon Sep 17 00:00:00 2001 From: israpps <57065102+israpps@users.noreply.github.com> Date: Wed, 21 Feb 2024 14:50:30 -0300 Subject: [PATCH 24/38] Update Makefile --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 79fc62b..97ccb0f 100644 --- a/Makefile +++ b/Makefile @@ -48,6 +48,7 @@ ifeq ($(COH),1) HOMEBREW_MCMAN = 0 HOMEBREW_MCSERV = 0 HOMEBREW_SIO2MAN = 0 + HOMEBREW_PADMAN = 0 EE_OBJS += ioprp.o EE_SIO = 1 endif From 87de05bb15ce39e35ba5d8d6d14da5a38c97e999 Mon Sep 17 00:00:00 2001 From: israpps <57065102+israpps@users.noreply.github.com> Date: Wed, 21 Feb 2024 14:56:05 -0300 Subject: [PATCH 25/38] zaaadas --- src/main.c | 4 ++-- src/util.c | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main.c b/src/main.c index cea360b..563c33b 100644 --- a/src/main.c +++ b/src/main.c @@ -31,6 +31,8 @@ int main(int argc, char *argv[]) printf("Cheat Device. By wesley castro. Maintained by El_isra\n Compilation " __DATE__ " " __TIME__ "\n"); DPRINTF("Cheat Device. By wesley castro. Maintained by El_isra\n Compilation " __DATE__ " " __TIME__ "\n"); initGraphics(); + ON_SCREEN_INIT_PROGRESS("Initialize menu"); + initMenus(); #ifndef NO_DPRINTF for (ret=0;ret Date: Wed, 21 Feb 2024 15:00:43 -0300 Subject: [PATCH 26/38] Update main.c --- src/main.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main.c b/src/main.c index 563c33b..6e61e2b 100644 --- a/src/main.c +++ b/src/main.c @@ -31,8 +31,6 @@ int main(int argc, char *argv[]) printf("Cheat Device. By wesley castro. Maintained by El_isra\n Compilation " __DATE__ " " __TIME__ "\n"); DPRINTF("Cheat Device. By wesley castro. Maintained by El_isra\n Compilation " __DATE__ " " __TIME__ "\n"); initGraphics(); - ON_SCREEN_INIT_PROGRESS("Initialize menu"); - initMenus(); #ifndef NO_DPRINTF for (ret=0;ret Date: Wed, 21 Feb 2024 15:06:05 -0300 Subject: [PATCH 27/38] I HATE THESE TYPOS --- Makefile | 2 +- bootstrap/Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 97ccb0f..ed2c47c 100644 --- a/Makefile +++ b/Makefile @@ -42,7 +42,7 @@ endif ifeq ($(COH),1) PRINTF = EE_SIO - EE_CFLAGS += -DSUPPORT_SYSTEM_2x6 + EE_CFLAGS += -DSUPPORT_SYSTEM_2X6 EE_LIBS += -liopreboot HAS_COH = -COH HOMEBREW_MCMAN = 0 diff --git a/bootstrap/Makefile b/bootstrap/Makefile index 3c54dc9..0107483 100644 --- a/bootstrap/Makefile +++ b/bootstrap/Makefile @@ -2,7 +2,7 @@ EE_BIN = bootstrap.elf EE_OBJS = main.o ifeq ($(COH),1) - EE_CFLAGS += -DSUPPORT_SYSTEM_2x6 + EE_CFLAGS += -DSUPPORT_SYSTEM_2X6 EE_LIBS += -liopreboot EE_OBJS += ../ioprp.o endif From 98af510f555bedc00865d4f79c8a8da3e998b418 Mon Sep 17 00:00:00 2001 From: israpps <57065102+israpps@users.noreply.github.com> Date: Wed, 21 Feb 2024 15:09:03 -0300 Subject: [PATCH 28/38] Update Makefile --- bootstrap/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bootstrap/Makefile b/bootstrap/Makefile index 0107483..d46ee31 100644 --- a/bootstrap/Makefile +++ b/bootstrap/Makefile @@ -2,6 +2,7 @@ EE_BIN = bootstrap.elf EE_OBJS = main.o ifeq ($(COH),1) + EE_LIBS += -lpatches EE_CFLAGS += -DSUPPORT_SYSTEM_2X6 EE_LIBS += -liopreboot EE_OBJS += ../ioprp.o @@ -11,7 +12,6 @@ endif #EE_LDFLAGS = -s -Ttext 0x01900000 #EE_LDFLAGS = -s -Ttext 0x000F3000 #EE_LIBS += -lkernel -lpatches -lerl - EE_CFLAGS := -mips3 -ffreestanding -fno-builtin -G0 \ -fshort-double -mlong64 -mhard-float -mno-abicalls -O2 -EL -Wall \ $(EE_INCS) $(EE_CFLAGS) From 34fa63d94912325ad155f3f3894c6d8ae3af8eef Mon Sep 17 00:00:00 2001 From: israpps <57065102+israpps@users.noreply.github.com> Date: Wed, 21 Feb 2024 15:11:58 -0300 Subject: [PATCH 29/38] test --- bootstrap/Makefile | 12 ++++++------ bootstrap/main.c | 6 +----- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/bootstrap/Makefile b/bootstrap/Makefile index d46ee31..b6dc3f3 100644 --- a/bootstrap/Makefile +++ b/bootstrap/Makefile @@ -1,12 +1,12 @@ EE_BIN = bootstrap.elf EE_OBJS = main.o -ifeq ($(COH),1) - EE_LIBS += -lpatches - EE_CFLAGS += -DSUPPORT_SYSTEM_2X6 - EE_LIBS += -liopreboot - EE_OBJS += ../ioprp.o -endif +#ifeq ($(COH),1) +# EE_LIBS += -lpatches +# EE_CFLAGS += -DSUPPORT_SYSTEM_2X6 +# EE_LIBS += -liopreboot +# EE_OBJS += ../ioprp.o +#endif #EE_LDFLAGS = -s -Ttext 0x00090000 #EE_LDFLAGS = -s -Ttext 0x01900000 diff --git a/bootstrap/main.c b/bootstrap/main.c index 7c9b9a2..53753d8 100644 --- a/bootstrap/main.c +++ b/bootstrap/main.c @@ -179,11 +179,7 @@ void MyLoadElf(char *elfpath) /* IOP reboot routine from ps2rd */ SifInitRpc(0); -#ifdef SUPPORT_SYSTEM_2X6 - while (!SifIopRebootBuffer(_ioprp_img, _ioprp_img_size)); -#else - while (!SifIopReset("rom0:UDNL rom0:EELOADCNF", 0)); -#endif + while (!SifIopReset("", 0)); while (!SifIopSync()); /* exit services */ From 212efe8f45e8384d3f7746f121ca1c2c57751314 Mon Sep 17 00:00:00 2001 From: israpps <57065102+israpps@users.noreply.github.com> Date: Wed, 21 Feb 2024 15:15:03 -0300 Subject: [PATCH 30/38] Update util.c --- src/util.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/util.c b/src/util.c index 244d3f7..abe434e 100644 --- a/src/util.c +++ b/src/util.c @@ -62,8 +62,7 @@ EXTERN_BIN2O(_ps2dev9_irx); #ifdef SUPPORT_SYSTEM_2X6 #include -extern u8 _ioprp_img[]; -extern int _ioprp_img_size; +EXTERN_BIN2O(_ioprp_img); #endif #ifdef HDD @@ -129,7 +128,7 @@ int loadModules(int booting_from_hdd) while (!SifIopReset("rom0:UDNL", 0)); #elif SUPPORT_SYSTEM_2X6 ON_SCREEN_INIT_PROGRESS("Flashing IOPRP IMAGE"); - while (!SifIopRebootBuffer(_ioprp_img, _ioprp_img_size)); + while (!SifIopRebootBuffer(_ioprp_img_start, _ioprp_img_size)); #else while (!SifIopReset("", 0)); #endif From e65c97f690a3eb30f910cffa83e623ca93f9928a Mon Sep 17 00:00:00 2001 From: israpps <57065102+israpps@users.noreply.github.com> Date: Wed, 21 Feb 2024 15:18:55 -0300 Subject: [PATCH 31/38] Update Makefile --- Makefile | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index ed2c47c..67dc04c 100644 --- a/Makefile +++ b/Makefile @@ -49,7 +49,7 @@ ifeq ($(COH),1) HOMEBREW_MCSERV = 0 HOMEBREW_SIO2MAN = 0 HOMEBREW_PADMAN = 0 - EE_OBJS += ioprp.o + EE_OBJS += resources/ioprp.o EE_SIO = 1 endif @@ -161,6 +161,7 @@ ifeq ($(HDD), 1) bin2o $(PS2SDK)/iop/irx/ps2atad.irx resources/ps2atad_irx.o _ps2atad_irx bin2o $(PS2SDK)/iop/irx/poweroff.irx resources/poweroff_irx.o _poweroff_irx endif + @bin2o resources/ioprp.o iop/IOPRP_FILEIO.IMG _ioprp_img @# Graphics @bin2o resources/background.png resources/background_png.o _background_png @@ -219,9 +220,6 @@ clean: rebuild: clean all -ioprp.o: iop/IOPRP_FILEIO.IMG - @bin2o $< $@ _ioprp_img - ifeq ($(PRINTF),EE_SIO) EE_CFLAGS += -DEE_SIO endif From 8587ffb3f4bd858ad6a5e96954065f61d630a14d Mon Sep 17 00:00:00 2001 From: israpps <57065102+israpps@users.noreply.github.com> Date: Wed, 21 Feb 2024 15:26:20 -0300 Subject: [PATCH 32/38] Update Makefile --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 67dc04c..c5f1c17 100644 --- a/Makefile +++ b/Makefile @@ -161,7 +161,7 @@ ifeq ($(HDD), 1) bin2o $(PS2SDK)/iop/irx/ps2atad.irx resources/ps2atad_irx.o _ps2atad_irx bin2o $(PS2SDK)/iop/irx/poweroff.irx resources/poweroff_irx.o _poweroff_irx endif - @bin2o resources/ioprp.o iop/IOPRP_FILEIO.IMG _ioprp_img + @bin2o iop/IOPRP_FILEIO.IMG resources/ioprp.o _ioprp_img @# Graphics @bin2o resources/background.png resources/background_png.o _background_png From 8c53ae035b578329f075fffb208476566b7f9b4b Mon Sep 17 00:00:00 2001 From: israpps <57065102+israpps@users.noreply.github.com> Date: Wed, 21 Feb 2024 15:32:28 -0300 Subject: [PATCH 33/38] im tired of this --- Makefile | 2 +- src/util.c | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index c5f1c17..906239c 100644 --- a/Makefile +++ b/Makefile @@ -49,7 +49,7 @@ ifeq ($(COH),1) HOMEBREW_MCSERV = 0 HOMEBREW_SIO2MAN = 0 HOMEBREW_PADMAN = 0 - EE_OBJS += resources/ioprp.o + IRX_OBJS += resources/ioprp.o EE_SIO = 1 endif diff --git a/src/util.c b/src/util.c index abe434e..10a9dd1 100644 --- a/src/util.c +++ b/src/util.c @@ -25,6 +25,7 @@ extern char* prog; #define LOAD_IRX_BUF_NARG(_irx_, RET) LOAD_IRX_BUF(_irx_, 0, NULL, RET) #define LOAD_IRX_BUF_SILENT(_irx_) ID = LOAD_IRX_BUF(_irx_, 0, NULL, &RET) #define MODULE_REPORT(MODULE) DPRINTF("%s: id:%d, ret:%d\n", MODULE, ID, RET) +#define IOPRP_REBOOT(_ioprp_) SifIopRebootBuffer(_ioprp_##_start, _ioprp_##_size) #define IRX_LOAD_SUCCESS() (ID >= 0 && RET != 1) #ifdef HOMEBREW_SIO2MAN @@ -63,6 +64,7 @@ EXTERN_BIN2O(_ps2dev9_irx); #ifdef SUPPORT_SYSTEM_2X6 #include EXTERN_BIN2O(_ioprp_img); + #endif #ifdef HDD @@ -128,7 +130,7 @@ int loadModules(int booting_from_hdd) while (!SifIopReset("rom0:UDNL", 0)); #elif SUPPORT_SYSTEM_2X6 ON_SCREEN_INIT_PROGRESS("Flashing IOPRP IMAGE"); - while (!SifIopRebootBuffer(_ioprp_img_start, _ioprp_img_size)); + while (!IOPRP_REBOOT(_ioprp_img)); #else while (!SifIopReset("", 0)); #endif From 41a48a919d486391abe7d7152710a1fd2dc12abd Mon Sep 17 00:00:00 2001 From: israpps <57065102+israpps@users.noreply.github.com> Date: Wed, 21 Feb 2024 15:37:21 -0300 Subject: [PATCH 34/38] Update util.c --- src/util.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/util.c b/src/util.c index 10a9dd1..9b9bc66 100644 --- a/src/util.c +++ b/src/util.c @@ -126,14 +126,15 @@ int loadModules(int booting_from_hdd) /* IOP reset routine taken from ps2rd */ SifInitRpc(0); - #ifdef _DTL_T10000 +#ifdef _DTL_T10000 while (!SifIopReset("rom0:UDNL", 0)); - #elif SUPPORT_SYSTEM_2X6 - ON_SCREEN_INIT_PROGRESS("Flashing IOPRP IMAGE"); - while (!IOPRP_REBOOT(_ioprp_img)); - #else +#elif SUPPORT_SYSTEM_2X6 + DPRINTF("Flashing IOPRP IMAGE"); + while (!IOPRP_REBOOT(_ioprp_img)) DPRINTF("."); + DPRINTF("\n"); +#else while (!SifIopReset("", 0)); - #endif +#endif while (!SifIopSync()); /* exit services */ From d07e11ec85bb641a9d5c6747dff502f91535c557 Mon Sep 17 00:00:00 2001 From: israpps <57065102+israpps@users.noreply.github.com> Date: Wed, 21 Feb 2024 15:40:47 -0300 Subject: [PATCH 35/38] dad --- src/util.c | 10 ++++++---- src/util.h | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/util.c b/src/util.c index 9b9bc66..6d6f893 100644 --- a/src/util.c +++ b/src/util.c @@ -129,13 +129,15 @@ int loadModules(int booting_from_hdd) #ifdef _DTL_T10000 while (!SifIopReset("rom0:UDNL", 0)); #elif SUPPORT_SYSTEM_2X6 - DPRINTF("Flashing IOPRP IMAGE"); - while (!IOPRP_REBOOT(_ioprp_img)) DPRINTF("."); - DPRINTF("\n"); + sio_printf("Flashing IOPRP IMAGE"); + while (!IOPRP_REBOOT(_ioprp_img)) sio_printf("."); + sio_printf("\n"); #else while (!SifIopReset("", 0)); #endif - while (!SifIopSync()); + sio_printf("SifIopSync"); + while (!SifIopSync()) sio_printf("."); + sio_printf("\n"); /* exit services */ fioExit(); diff --git a/src/util.h b/src/util.h index fa42b50..576aff8 100644 --- a/src/util.h +++ b/src/util.h @@ -8,8 +8,8 @@ #include -#define ON_SCREEN_INIT_PROGRESS(x) displayError(x) -#define ON_SCREEN_INIT_PROGRESS_BUF(x...) sprintf(prog, x); displayError(prog) +#define ON_SCREEN_INIT_PROGRESS(x)// displayError(x) +#define ON_SCREEN_INIT_PROGRESS_BUF(x...)// sprintf(prog, x); displayError(prog) #define READ_8(address) \ *((unsigned char *)address) From 69f2299c95150ce6b3738d2244a8dc22f377e1b2 Mon Sep 17 00:00:00 2001 From: israpps <57065102+israpps@users.noreply.github.com> Date: Wed, 21 Feb 2024 15:50:48 -0300 Subject: [PATCH 36/38] inform of padman or mcserv loading failures --- src/main.c | 4 ++-- src/util.c | 37 ++++++++++++++++++++++++------------- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/main.c b/src/main.c index 6e61e2b..bb27c69 100644 --- a/src/main.c +++ b/src/main.c @@ -65,6 +65,8 @@ int main(int argc, char *argv[]) #endif ret = loadModules(booting_from_hdd); + ON_SCREEN_INIT_PROGRESS("Initialize menu"); + initMenus(); if (ret != 0) displayError(error); #ifdef HDD if (ret == 0) { @@ -79,8 +81,6 @@ int main(int argc, char *argv[]) } #endif - ON_SCREEN_INIT_PROGRESS("Initialize menu"); - initMenus(); ON_SCREEN_INIT_PROGRESS("Initialize settings"); initSettings(); diff --git a/src/util.c b/src/util.c index 6d6f893..b8755d0 100644 --- a/src/util.c +++ b/src/util.c @@ -121,6 +121,7 @@ void poweroffCallback(void *arg) int loadModules(int booting_from_hdd) { int ID, RET, HDDSTAT, filexio_loaded=0, dev9_loaded=0; + int report_err = 0; DPRINTF("\n ** Loading main modules **\n"); /* IOP reset routine taken from ps2rd */ @@ -129,15 +130,15 @@ int loadModules(int booting_from_hdd) #ifdef _DTL_T10000 while (!SifIopReset("rom0:UDNL", 0)); #elif SUPPORT_SYSTEM_2X6 - sio_printf("Flashing IOPRP IMAGE"); - while (!IOPRP_REBOOT(_ioprp_img)) sio_printf("."); - sio_printf("\n"); + sio_printf("Flashing IOPRP IMAGE.."); + while (!IOPRP_REBOOT(_ioprp_img)); + sio_printf(".\n"); #else while (!SifIopReset("", 0)); #endif - sio_printf("SifIopSync"); - while (!SifIopSync()) sio_printf("."); - sio_printf("\n"); + sio_printf("SifIopSync().."); + while (!SifIopSync()); + sio_printf(".\n"); /* exit services */ fioExit(); @@ -216,6 +217,11 @@ int loadModules(int booting_from_hdd) ON_SCREEN_INIT_PROGRESS_BUF(" [rom0:MCSERV]: ID=%d, ret=%d\n", ID, RET); #endif int mcserv_is_runnin = IRX_LOAD_SUCCESS(); + if (!mcserv_is_runnin) { + sprintf(error, "MCSERV module failed to load\nid: %d, ret: %d", ID, RET); + report_err = 1; + } + #ifdef HOMEBREW_PADMAN LOAD_IRX_BUF_SILENT(_padman_irx); MODULE_REPORT("PADMAN"); @@ -224,6 +230,12 @@ int loadModules(int booting_from_hdd) MODULE_REPORT("rom0:PADMAN"); ON_SCREEN_INIT_PROGRESS_BUF(" [rom0:PADMAN]: ID=%d, ret=%d\n", ID, RET); #endif + + int padman_is_runnin = IRX_LOAD_SUCCESS(); + if (!padman_is_runnin) { + sprintf(error, "PADMAN module failed to load\nid: %d, ret: %d", ID, RET); + report_err = 1; + } #ifdef EXFAT LOAD_IRX_BUF_SILENT(_bdm_irx); MODULE_REPORT("BDM"); @@ -261,13 +273,12 @@ int loadModules(int booting_from_hdd) DPRINTF(".done\n"); } else { DPRINTF("skipping MCSERV RPC\n"); - displayError("MCSERV module failed to load\nmemory card access disabled"); } - - ON_SCREEN_INIT_PROGRESS("Initializing PAD RPC"); - DPRINTF("padInitialize().."); - padInitialize(); - DPRINTF(".done\n"); + if (padman_is_runnin) { + DPRINTF("Initializing PAD RPC.."); + padInitialize(); + DPRINTF(".done\n"); + } #ifdef HDD if (booting_from_hdd) { @@ -320,7 +331,7 @@ int loadModules(int booting_from_hdd) } } #endif - return 0; + return report_err; } void handlePad() From 904a73f71fa37f749b669105ab12f5144ef934d0 Mon Sep 17 00:00:00 2001 From: israpps <57065102+israpps@users.noreply.github.com> Date: Wed, 21 Feb 2024 15:51:25 -0300 Subject: [PATCH 37/38] remove unused buffer --- src/main.c | 1 - src/util.c | 1 - 2 files changed, 2 deletions(-) diff --git a/src/main.c b/src/main.c index bb27c69..1ec4240 100644 --- a/src/main.c +++ b/src/main.c @@ -11,7 +11,6 @@ #include "settings.h" #include "dbgprintf.h" #include "util.h" -char prog[255]; #ifdef HDD int getMountInfo(char *path, char *mountString, char *mountPoint, char *newCWD); diff --git a/src/util.c b/src/util.c index b8755d0..ae990c4 100644 --- a/src/util.c +++ b/src/util.c @@ -19,7 +19,6 @@ #include extern char* error; -extern char* prog; #define EXTERN_BIN2O(_name_) extern u8 _name_##_start[]; extern int _name_##_size; #define LOAD_IRX_BUF(_irx_, ARGC, ARGV, RET) SifExecModuleBuffer(_irx_##_start, _irx_##_size, ARGC, ARGV, RET) #define LOAD_IRX_BUF_NARG(_irx_, RET) LOAD_IRX_BUF(_irx_, 0, NULL, RET) From c5c4ac4b1ebc709ee125cd938c5a21852047e7f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=ADas=20Israelson?= <57065102+israpps@users.noreply.github.com> Date: Sat, 6 Apr 2024 10:36:29 -0300 Subject: [PATCH 38/38] polish some stuff --- Makefile | 8 +++++++- iop/dongleman.irx | Bin 0 -> 83725 bytes src/graphics.c | 4 ++++ src/saves.c | 9 +++++++++ src/util.c | 17 +++++++++++------ 5 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 iop/dongleman.irx diff --git a/Makefile b/Makefile index 906239c..603071d 100644 --- a/Makefile +++ b/Makefile @@ -45,7 +45,7 @@ ifeq ($(COH),1) EE_CFLAGS += -DSUPPORT_SYSTEM_2X6 EE_LIBS += -liopreboot HAS_COH = -COH - HOMEBREW_MCMAN = 0 + HOMEBREW_MCMAN = 1 HOMEBREW_MCSERV = 0 HOMEBREW_SIO2MAN = 0 HOMEBREW_PADMAN = 0 @@ -141,7 +141,13 @@ ifeq ($(HOMEBREW_SIO2MAN),1) bin2o $(PS2SDK)/iop/irx/sio2man.irx resources/sio2man_irx.o _sio2man_irx endif ifeq ($(HOMEBREW_MCMAN),1) + ifeq ($(COH),1) + bin2o iop/dongleman.irx resources/mcman_irx.o _mcman_irx + echo Using dongleman + else bin2o $(PS2SDK)/iop/irx/mcman.irx resources/mcman_irx.o _mcman_irx + echo using homebrew MCMAN + endif endif ifeq ($(HOMEBREW_MCSERV),1) bin2o $(PS2SDK)/iop/irx/mcserv.irx resources/mcserv_irx.o _mcserv_irx diff --git a/iop/dongleman.irx b/iop/dongleman.irx new file mode 100644 index 0000000000000000000000000000000000000000..4e3bd3c07a79fa67169546ae118f3ac975eed118 GIT binary patch literal 83725 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 ix8OG1fxEB)_uxJ}fQRr1Mqdr>r(hS%LUrwhum1