diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 9da467d..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"] + opts: ["", "HDD=1", "EXFAT=1", "COH=1 EXFAT=1"] runs-on: ubuntu-latest container: ps2dev/ps2dev:v1.0 steps: @@ -27,7 +27,7 @@ jobs: - name: Compile cheat device run: | - make rebuild release ${{ matrix.opts }} + make rebuild release ${{ matrix.opts }} --trace - name: list run: | diff --git a/Makefile b/Makefile index ccb8183..603071d 100644 --- a/Makefile +++ b/Makefile @@ -5,10 +5,13 @@ 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).ELF +EE_BIN = CheatDevice$(HAS_EXFAT)$(HAS_HDD)$(HAS_COH).ELF # For minizip EE_CFLAGS += -DUSE_FILE32API @@ -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 @@ -40,6 +40,19 @@ else IRX_OBJS += resources/usbhdfsd_irx.o endif +ifeq ($(COH),1) + PRINTF = EE_SIO + EE_CFLAGS += -DSUPPORT_SYSTEM_2X6 + EE_LIBS += -liopreboot + HAS_COH = -COH + HOMEBREW_MCMAN = 1 + HOMEBREW_MCSERV = 0 + HOMEBREW_SIO2MAN = 0 + HOMEBREW_PADMAN = 0 + IRX_OBJS += resources/ioprp.o + EE_SIO = 1 +endif + ifeq ($(HDD), 1) EE_LIBS += -lpoweroff IRX_OBJS += resources/ps2fs_irx.o resources/ps2hdd_irx.o resources/ps2atad_irx.o resources/poweroff_irx.o @@ -59,8 +72,6 @@ ifeq ($(DEV9_NEED), 1) EE_CFLAGS += -DDEV9 IRX_OBJS += resources/ps2dev9_irx.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 \ @@ -75,13 +86,28 @@ OBJS += engine/engine_erl.o # Bootstrap ELF OBJS += bootstrap/bootstrap_elf.o - -ifeq ($(HOMEBREW_IRX),1) - EE_LIBS += -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 + 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 @@ -111,10 +137,22 @@ ifeq ($(EXFAT),1) else bin2o $(PS2SDK)/iop/irx/usbhdfsd.irx resources/usbhdfsd_irx.o _usbhdfsd_irx endif -ifeq ($(HOMEBREW_IRX),1) - bin2o $(PS2SDK)/iop/irx/freesio2.irx resources/sio2man_irx.o _sio2man_irx +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 +endif +ifeq ($(HOMEBREW_PADMAN),1) bin2o $(PS2SDK)/iop/irx/freepad.irx resources/padman_irx.o _padman_irx endif ifeq ($(FILEXIO_NEED), 1) @@ -129,6 +167,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 iop/IOPRP_FILEIO.IMG resources/ioprp.o _ioprp_img @# Graphics @bin2o resources/background.png resources/background_png.o _background_png @@ -157,7 +196,6 @@ endif @# Engine @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 @@ -178,7 +216,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) diff --git a/bootstrap/Makefile b/bootstrap/Makefile index 9b38d80..b6dc3f3 100644 --- a/bootstrap/Makefile +++ b/bootstrap/Makefile @@ -1,11 +1,17 @@ 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 + #EE_LDFLAGS = -s -Ttext 0x00090000 #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) @@ -27,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 diff --git a/bootstrap/main.c b/bootstrap/main.c index 3cb5cd9..53753d8 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 */ @@ -173,11 +179,8 @@ void MyLoadElf(char *elfpath) /* IOP reboot routine from ps2rd */ SifInitRpc(0); - - while (!SifIopReset("rom0:UDNL rom0:EELOADCNF", 0)) - ; - while (!SifIopSync()) - ; + while (!SifIopReset("", 0)); + while (!SifIopSync()); /* exit services */ fioExit(); diff --git a/iop/IOPRP_FILEIO.IMG b/iop/IOPRP_FILEIO.IMG new file mode 100644 index 0000000..b7fac0a Binary files /dev/null and b/iop/IOPRP_FILEIO.IMG differ diff --git a/iop/dongleman.irx b/iop/dongleman.irx new file mode 100644 index 0000000..4e3bd3c Binary files /dev/null and b/iop/dongleman.irx differ diff --git a/src/graphics.c b/src/graphics.c index 6daaaec..fb17864 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -693,7 +693,11 @@ void graphicsDrawMainMenu(int activeItem) void graphicsDrawDeviceMenu(int activeItem) { static const menuIcon_t icons[] = { +#ifndef SUPPORT_SYSTEM_2X6 {"Memory Card (Slot 1)", &memorycard1}, +#else + {"Security Dongle (Slot 1)", &memorycard1}, +#endif {"Memory Card (Slot 2)", &memorycard2}, {"Flash Drive", &flashdrive} }; diff --git a/src/main.c b/src/main.c index 15a8f1f..1ec4240 100644 --- a/src/main.c +++ b/src/main.c @@ -64,6 +64,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) { @@ -77,8 +79,9 @@ int main(int argc, char *argv[]) } } #endif + + ON_SCREEN_INIT_PROGRESS("Initialize settings"); initSettings(); - initMenus(); char *readOnlyPath = settingsGetReadOnlyDatabasePath(); if(readOnlyPath && !cheatsOpenDatabase(readOnlyPath, 1)) diff --git a/src/saves.c b/src/saves.c index 9ff9c47..d39c7cd 100644 --- a/src/saves.c +++ b/src/saves.c @@ -29,7 +29,11 @@ static const char *HELP_TICKER_SAVES = \ "{CROSS} Copy " "{CIRCLE} Device Menu"; +#ifndef SUPPORT_SYSTEM_2X6 static const char *MEMORY_CARD_1_NAME = "Memory Card (Slot 1)"; +#else +static const char *MEMORY_CARD_1_NAME = "Security Dongle (Slot 1)"; +#endif static const char *MEMORY_CARD_2_NAME = "Memory Card (Slot 2)"; static const char *FLASH_DRIVE_NAME = "Flash Drive"; @@ -108,7 +112,12 @@ static void drawDecorations(const menuItem_t *selected) switch(s_currentDevice) { case MC_SLOT_1: + +#ifndef SUPPORT_SYSTEM_2X6 deviceName = "Memory Card (Slot 1)"; +#else + deviceName = "Security Dongle (Slot 1)"; +#endif freeSpace = s_mc1Free; break; case MC_SLOT_2: diff --git a/src/util.c b/src/util.c index fbee04e..d407801 100644 --- a/src/util.c +++ b/src/util.c @@ -22,14 +22,24 @@ extern char* error; #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 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_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); @@ -50,6 +60,12 @@ EXTERN_BIN2O(_filexio_irx); EXTERN_BIN2O(_ps2dev9_irx); #endif +#ifdef SUPPORT_SYSTEM_2X6 +#include +EXTERN_BIN2O(_ioprp_img); + +#endif + #ifdef HDD #include #include @@ -103,18 +119,31 @@ void poweroffCallback(void *arg) int loadModules(int booting_from_hdd) { - int ID, RET, HDDSTAT, filexio_loaded=0, dev9_loaded=0; + int ID, RET, HDDSTAT; +#ifdef DEV9 + int dev9_loaded=0; +#endif +#ifdef FILEXIO + int filexio_loaded=0; +#endif + int report_err = 0; DPRINTF("\n ** Loading main modules **\n"); /* IOP reset routine taken from ps2rd */ SifInitRpc(0); - #ifdef _DTL_T10000 +#ifdef _DTL_T10000 while (!SifIopReset("rom0:UDNL", 0)); - #else - while (!SifIopReset("rom0:UDNL rom0:EELOADCNF", 0)); - #endif +#elif SUPPORT_SYSTEM_2X6 + 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(".\n"); /* exit services */ fioExit(); @@ -137,10 +166,24 @@ int loadModules(int booting_from_hdd) sbv_patch_enable_lmb(); sbv_patch_disable_prefix_check(); + + +#ifdef SUPPORT_SYSTEM_2X6 + + ID = SifLoadStartModule("rom0:LED", 0, NULL, &RET); + MODULE_REPORT("rom0:LED"); + + ID = SifLoadStartModule("rom0:CDVDFSV", 0, NULL, &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); } @@ -148,40 +191,98 @@ 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 -#ifdef HOMEBREW_IRX + #ifdef HOMEBREW_SIO2MAN LOAD_IRX_BUF_SILENT(_sio2man_irx); - LOAD_IRX_BUF_SILENT(_padman_irx); + 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); + #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); -#else - SifLoadModule("rom0:SIO2MAN", 0, NULL); - SifLoadModule("rom0:PADMAN", 0, NULL); - SifLoadModule("rom0:MCMAN", 0, NULL); - SifLoadModule("rom0:MCSERV", 0, NULL); -#endif + 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 + 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"); + #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 + + 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"); 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"); + #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); - sleep(2); // Allow USB devices some time to be detected + MODULE_REPORT("USBHDFSD"); + #ifndef SUPPORT_SYSTEM_2X6 + sleep(3); // Allow USB devices some time to be detected + #endif #endif - -#ifdef HOMEBREW_IRX + if (mcserv_is_runnin) { +#ifdef HOMEBREW_MCMAN + ON_SCREEN_INIT_PROGRESS("Initializing XMC RPC"); + DPRINTF("mcInit(MC_TYPE_XMC).."); + mcInit(MC_TYPE_XMC); +#elif 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 - - padInitialize(); + DPRINTF(".done\n"); + } else { + DPRINTF("skipping MCSERV RPC\n"); + } + if (padman_is_runnin) { + DPRINTF("Initializing PAD RPC.."); + padInitialize(); + DPRINTF(".done\n"); + } #ifdef HDD if (booting_from_hdd) { @@ -234,7 +335,7 @@ int loadModules(int booting_from_hdd) } } #endif - return 0; + return report_err; } void handlePad() diff --git a/src/util.h b/src/util.h index 9a141cf..576aff8 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)