├── .gitattributes ├── libcdvd_add.h ├── Makefile ├── .github └── workflows │ └── CI.yml ├── libcdvd_add.c ├── README.MD ├── OSDInit.h ├── OSDInit.c └── main-nogui.c /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /libcdvd_add.h: -------------------------------------------------------------------------------- 1 | int cdInitAdd(void); 2 | int sceCdReadRegionParams(u8 *data, u32 *stat); 3 | int sceCdReadPS1BootParam(char *param, u32 *stat); 4 | int sceCdBootCertify(const u8* data); 5 | int sceCdRM(char *ModelName, u32 *stat); 6 | int sceCdRcBypassCtl(int bypass, u32 *stat); //TODO: Not implemented. 7 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | EE_BIN = main-nogui.elf 2 | EE_BIN_PACKED = main-nogui-packed.ELF 3 | EE_BIN_STRIPPED = main-nogui-stripped.ELF 4 | EE_OBJS = main-nogui.o OSDInit.o libcdvd_add.o 5 | EE_LIBS = -ldebug -lc -lcdvd -lpatches -lfileXio 6 | 7 | all: 8 | $(MAKE) $(EE_BIN_PACKED) 9 | 10 | clean: 11 | rm -fr *.ELF *.o *.bak 12 | 13 | $(EE_BIN_STRIPPED): $(EE_BIN) 14 | $(EE_STRIP) -o $@ $< 15 | 16 | $(EE_BIN_PACKED): $(EE_BIN_STRIPPED) 17 | ifeq ($(USE_LOCAL_PACKER),1) 18 | ps2-packer/ps2-packer -v $< $@ 19 | else 20 | ps2-packer $< $@ 21 | endif 22 | 23 | include $(PS2SDK)/samples/Makefile.pref 24 | include $(PS2SDK)/samples/Makefile.eeglobal 25 | -------------------------------------------------------------------------------- /.github/workflows/CI.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | workflow_dispatch: 6 | 7 | jobs: 8 | build: 9 | runs-on: ubuntu-latest 10 | container: ps2dev/ps2dev:v1.0 11 | steps: 12 | 13 | - name: Install dependencies 14 | run: | 15 | apk add build-base git 16 | - uses: actions/checkout@v4 17 | 18 | - name: Compile 19 | run: | 20 | make 21 | 22 | - name: Upload artifacts 23 | if: ${{ success() }} 24 | uses: actions/upload-artifact@v4 25 | with: 26 | name: OSDSYS-LAUNCHER 27 | path: | 28 | *.ELF 29 | 30 | - name: Create release 31 | if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/main' 32 | uses: marvinpinto/action-automatic-releases@latest 33 | with: 34 | repo_token: "${{ secrets.GITHUB_TOKEN }}" 35 | automatic_release_tag: "latest" 36 | title: "Latest build" 37 | files: | 38 | *.ELF 39 | -------------------------------------------------------------------------------- /libcdvd_add.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | #include "libcdvd_add.h" 8 | 9 | static unsigned char MECHACON_CMD_S36_supported = 0, MECHACON_CMD_S27_supported = 0, MECHACON_CMD_S24_supported = 0; 10 | 11 | //Initialize add-on functions. Currently only retrieves the MECHACON's version to determine what sceCdAltGetRegionParams() should do. 12 | int cdInitAdd(void) 13 | { 14 | int result, status, i; 15 | u8 MECHA_version_data[3]; 16 | unsigned int MECHA_version; 17 | 18 | //Like how CDVDMAN checks sceCdMV(), do not continuously attempt to get the MECHACON version because some consoles (e.g. DTL-H301xx) can't return one. 19 | for(i = 0; i <= 100; i++) 20 | { 21 | if((result=sceCdMV(MECHA_version_data, &status)) != 0 && ((status&0x80) == 0)) 22 | { 23 | MECHA_version = MECHA_version_data[2] | ((unsigned int)MECHA_version_data[1] << 8) | ((unsigned int)MECHA_version_data[0] << 16); 24 | MECHACON_CMD_S36_supported = (0x5FFFF < MECHA_version); //v6.0 and later 25 | MECHACON_CMD_S27_supported = (0x501FF < MECHA_version); //v5.2 and later 26 | MECHACON_CMD_S24_supported = (0x4FFFF < MECHA_version); //v5.0 and later 27 | return 0; 28 | } 29 | } 30 | 31 | // printf("Failed to get MECHACON version: %d 0x%x\n", result, status); 32 | 33 | return -1; 34 | } 35 | 36 | /* 37 | This function provides an equivalent of the sceCdGetRegionParams function from the newer CDVDMAN modules. The old CDVDFSV and CDVDMAN modules don't support this S-command. 38 | It's supported by only slimline consoles, and returns regional information (e.g. MECHACON version, MG region mask, DVD player region letter etc.). 39 | */ 40 | int sceCdReadRegionParams(u8 *data, u32 *stat) 41 | { 42 | unsigned char RegionData[15]; 43 | int result; 44 | 45 | memset(data, 0, 13); 46 | if(MECHACON_CMD_S36_supported) 47 | { 48 | if((result = sceCdApplySCmd(0x36, NULL, 0, RegionData, sizeof(RegionData))) != 0) 49 | { 50 | *stat = RegionData[0]; 51 | memcpy(data, &RegionData[1], 13); 52 | } 53 | } 54 | else 55 | { 56 | *stat = 0x100; 57 | result = 1; 58 | } 59 | 60 | return result; 61 | } 62 | 63 | // This function provides an equivalent of the sceCdBootCertify function from the newer CDVDMAN modules. The old CDVDFSV and CDVDMAN modules don't support this S-command. 64 | int sceCdBootCertify(const u8* data) 65 | { 66 | int result; 67 | unsigned char CmdResult; 68 | 69 | if((result=sceCdApplySCmd(0x1A, data, 4, &CmdResult, 1))!=0) 70 | { 71 | result=CmdResult; 72 | } 73 | 74 | return result; 75 | } 76 | 77 | int sceCdRM(char *ModelName, u32 *stat) 78 | { 79 | unsigned char rdata[9]; 80 | unsigned char sdata; 81 | int result1, result2; 82 | 83 | sdata=0; 84 | result1=sceCdApplySCmd(0x17, &sdata, 1, rdata, 9); 85 | 86 | *stat=rdata[0]; 87 | memcpy(ModelName, &rdata[1], 8); 88 | 89 | sdata=8; 90 | result2=sceCdApplySCmd(0x17, &sdata, 1, rdata, 9); 91 | 92 | *stat|=rdata[0]; 93 | memcpy(&ModelName[8], &rdata[1], 8); 94 | 95 | return((result1!=0&&result2!=0)?1:0); 96 | } 97 | 98 | /* 99 | This function provides an equivalent of the sceCdReadPS1BootParam function from the newer CDVDMAN modules. The old CDVDFSV and CDVDMAN modules don't support this S-command. 100 | It's supported by only slimline consoles, and returns the boot path for the inserted PlayStation disc. 101 | */ 102 | int sceCdReadPS1BootParam(char *param, u32 *stat) 103 | { 104 | u8 out[16]; 105 | int result; 106 | 107 | memset(param, 0, 11); 108 | if(MECHACON_CMD_S27_supported) 109 | { 110 | if((result = sceCdApplySCmd(0x27, NULL, 0, out, 13)) != 0) 111 | { 112 | *stat = out[0]; 113 | memcpy(param, &out[1], 11); //Yes, one byte is not copied. 114 | } 115 | } 116 | else 117 | { 118 | *stat = 0x100; 119 | result = 1; 120 | } 121 | 122 | return result; 123 | } 124 | 125 | int sceCdRcBypassCtl(int bypass, u32 *stat) 126 | { //TODO: not implemented. 127 | u8 in[16], out[16]; 128 | int result; 129 | 130 | memset(in, 0, 11); 131 | if(MECHACON_CMD_S24_supported) 132 | { 133 | // TODO 134 | if((result = sceCdApplySCmd(0x24, &bypass, 4, out, 13)) != 0) 135 | { 136 | *stat = out[0]; 137 | } 138 | } 139 | else 140 | { 141 | *stat = 0x100; 142 | result = 1; 143 | } 144 | 145 | return result; 146 | } 147 | 148 | -------------------------------------------------------------------------------- /README.MD: -------------------------------------------------------------------------------- 1 | This will launch a OSDSYS from your MC. 2 | 3 | If you have a PS2 with v2.30 BIOS or higher, you can use this application as DEV1 (`mc0:/BOOT/BOOT.ELF`) as well as 4 | a FORTUNA default ELF (`mc0:/FORTUNA/BOOT.ELF`) replacment and use it to launch the FMCB hacked OSDSYS or XEB/XEB+. 5 | 6 | If your modchip is based on matrix, placing this application as infinity manager (`mc0:/MATRIXTEAM/MANAGER.ELF`) to avoid a issues if FreeMcBoot can't find it's configuration 7 | 8 | ## Detailed instructions for FMCB installation on SCPH-900XX or PSTV: 9 | ### FMCB v1.8C (with modchip): 10 | 1. Take a clean FMCB 1.8C release and decompress it 11 | 2. Select the correct HWC's OSDSYS Launcher "BOOT.ELF" for your region IF REQUIERED (* read notes) 12 | 3. Go to the INSTALL folder and paste "BOOT.ELF" in it 13 | 4. Create a folder called "APPS" inside the "INSTALL" folder 14 | 5. Paste you beloved apps in there (OPL, uLE, etc) 15 | 6. Copy the installation files to a pendrive and put it on your PS2 16 | 7. Use the method you want to launch the FMCB installer (a uLE DVD it's perfect if you have no MC with DEV1 ready) 17 | 8. Select normal install and wait 18 | 9. Once done, reset your PS2 and configure your modchip to boot from DEV1 19 | 10. Now reset your PS2 again, when the FMCB logo shows up, press SELECT to configure FMCB. 20 | 21 | ### FMCB v1.9 (with modchip): 22 | 1. Take a clean FMCB 1.9 release and decompress it 23 | 2. Delete the `BOOT.ELF` inside the `BOOT` folder 24 | 3. Select the correct HWC's OSDSYS Launcher `BOOT.ELF` for your region IF REQUIERED (* read notes) 25 | 4. Go to the `BOOT` folder inside the `INSTALL` folder and paste the HWC's OSDSYS Launcher `BOOT.ELF` in it 26 | 5. Go to the `APPS` folder inside the `INSTALL` folder and paste you beloved apps in there (OPL, uLE, etc) 27 | 6. Copy the installation files to a pendrive and put it on your PS2 28 | 7. Use the method you want to launch the FMCB installer (a uLE DVD it's perfect if you have no MC with DEV1 ready) 29 | 8. Select normal install and wait 30 | 9. Once done, reset your PS2 and configure your modchip to boot from DEV1 31 | 10. Now reset your PS2 again, when the FMCB logo shows up, press SELECT to configure FMCB. 32 | 33 | ### FORTUNA Users (no modchip required): 34 | 1. Install FMCB (you do not need to fellow the instructions above, you can use a noobie package if you want to). 35 | 2. Select the correct HWC's OSDSYS Launcher `BOOT.ELF` for your region IF REQUIERED (* read notes) 36 | 3. Replace the BOOT.ELF in the FORTUNA's folder (mc0:/FORTUNA/BOOT.ELF) with the HWC's OSDSYS Launcher's "BOOT.ELF" 37 | 4. Now reset your PS2 again and go to the browser and launch the FOTUNA exploit as always 38 | 5. When the FMCB logo shows up, press SELECT to configure FMCB. 39 | 40 | ## Diferences with FORTUNA FMCB Launcher by VTSTech: 41 | 42 | > Well, it seems that VTSTech did NOT tested his application on real hardware. His application will NOT work properly 43 | > on consoles with v2.30+ BIOS. Of course, it will work as intended on any console with v2.20 or lower, but that's not 44 | > the main reason to use this application, right? 45 | 46 | ## Notes: 47 | > We made a "small" adjustment on the software logic to avoid a certain issue: people having a messy FMCB installation 48 | > on their memory card AND users using a launcher from "certain developer" who does not knows how to reset IOP properly. 49 | > It seems that there's someone on eBay selling FMCB memory cards with a "multi-region" installed FMCB v1.8C which 50 | > includes three different FMCBs installations made from three different consoles. That setup is a nonsense as the 51 | > KELFs are not really region free, these are ELFs injected on the DVDELFs from XXX01, XXX04 and XXX06. That seller 52 | > does not seems to know that FMCB v1.9 exists and can do proper multi-region installations. 53 | > If you do not have these kind of frankenfmcb, ANY ELF in our release should work for you, but, if that's not the case, 54 | > please, select the proper one for your region. 55 | 56 | *** 57 | 58 |

Howling Wolf & Chelsea

59 |

2017-2020

60 |

Made In Cuba!

61 | 62 | 63 | *** 64 | 65 | 66 |

I you have any questions you can contact

67 |

on psx-place.com as "HWNJ" or send me

68 |

an email to cerebro404hwc@gmail.com or

69 |

howlingwolfandchelsea@gmail.com

70 | 71 | *** 72 | -------------------------------------------------------------------------------- /OSDInit.h: -------------------------------------------------------------------------------- 1 | #define ROMVER_MAX_LEN 16 2 | 3 | int OSDInitROMVER(void); 4 | 5 | #define CONFIG_BLOCK_SIZE 15 6 | 7 | enum CONSOLE_REGION{ 8 | CONSOLE_REGION_INVALID = -1, 9 | CONSOLE_REGION_JAPAN = 0, 10 | CONSOLE_REGION_USA, //USA and Asia 11 | CONSOLE_REGION_EUROPE, 12 | CONSOLE_REGION_CHINA, 13 | 14 | CONSOLE_REGION_COUNT 15 | }; 16 | 17 | enum OSD_REGION{ 18 | OSD_REGION_INVALID = -1, 19 | OSD_REGION_JAPAN = 0, 20 | OSD_REGION_USA, 21 | OSD_REGION_EUROPE, 22 | OSD_REGION_CHINA, 23 | OSD_REGION_RUSSIA, 24 | OSD_REGION_KOREA, 25 | OSD_REGION_ASIA, 26 | 27 | OSD_REGION_COUNT 28 | }; 29 | 30 | //Used to store the values, as obtained from the EEPROM/NVM 31 | typedef struct { 32 | /** 0=enabled, 1=disabled */ 33 | /*00*/u32 spdifMode:1; 34 | /** 0=4:3, 1=fullscreen, 2=16:9 */ 35 | /*01*/u32 screenType:2; 36 | /** 0=rgb(scart), 1=component */ 37 | /*03*/u32 videoOutput:1; 38 | /** LANGUAGE_??? value */ 39 | /*04*/u32 language:5; 40 | /** Timezone minutes offset from GMT */ 41 | /*09*/u32 timezoneOffset:11; 42 | /** Timezone ID */ 43 | /*20*/u32 timezone:9; 44 | /** 0=standard(winter), 1=daylight savings(summer) */ 45 | /*29*/u32 daylightSaving:1; 46 | /** 0=24 hour, 1=12 hour */ 47 | /*30*/u32 timeFormat:1; 48 | 49 | /** 0=YYYYMMDD, 1=MMDDYYYY, 2=DDMMYYYY */ 50 | /*00*/u32 dateFormat:2; 51 | /** Remote Control On/Off option */ 52 | /*02*/u32 rcEnabled:1; 53 | /** Remote Control Game Function On/Off */ 54 | /*03*/u32 rcGameFunction:1; 55 | /** Whether the Remote Control is supported by the PlayStation 2. */ 56 | /*04*/u32 rcSupported:1; 57 | /** Whether the DVD player should have progressive scanning enabled. */ 58 | /*05*/u32 dvdpProgressive:1; 59 | } OSDConfig2_t; 60 | 61 | typedef struct { 62 | u8 data[CONFIG_BLOCK_SIZE]; 63 | u8 padding; 64 | } OSDConfig1_t; 65 | 66 | //Structure of OSD Configuration block within EEPROM 67 | typedef struct { 68 | union { 69 | //0x00-0x0E 70 | struct { 71 | u8 ps1drv; 72 | u8 unused[14]; 73 | }; 74 | u8 bytes[CONFIG_BLOCK_SIZE]; 75 | } PS1; 76 | 77 | union { 78 | struct { 79 | //0x0F 80 | u8 spdifMode:1; 81 | u8 screenType:2; 82 | u8 videoOutput:1; 83 | u8 japLanguage:1; 84 | u8 extendedLanguage:1; 85 | u8 unused1:2; //Neither set nor read anywhere. 86 | 87 | //0x10 88 | u8 language:5; 89 | u8 version:3; 90 | 91 | //0x11 92 | u8 timezoneOffsetHi:3; 93 | u8 daylightSaving:1; 94 | u8 timeFormat:1; 95 | u8 dateFormat:2; 96 | u8 osdInit:1; 97 | 98 | //0x12 99 | u8 timezoneOffsetLo; 100 | 101 | //0x13 102 | u8 timezoneHi:1; 103 | u8 unknownB13_01:3; //Value is carried over 104 | u8 dvdpProgressive:1; 105 | u8 rcSupported:1; 106 | u8 rcGameFunction:1; 107 | u8 rcEnabled:1; 108 | 109 | //0x14 110 | u8 timezoneLo; 111 | 112 | //0x15-0x1E 113 | u8 unusedBytes[9]; 114 | }; 115 | 116 | u8 bytes[CONFIG_BLOCK_SIZE]; 117 | } PS2; 118 | } OSDConfigStore_t; 119 | 120 | int OSDIsLanguageValid(int region, int language); //Returns >= 0 if language is valid for use in the specified region. 121 | int OSDGetConsoleRegion(void); //Initializes and returns the console's region (CONSOLE_REGION). 122 | void OSDInitSystemPaths(void); //Initializes system directory names 123 | int OSDGetDefaultLanguage(void); //Returns the default language for the console 124 | int OSDGetRegion(void); //Initializes and returns the OSD region (OSD_REGION). 125 | int OSDGetVideoMode(void); //0 = NTSC, 1 = PAL 126 | 127 | //MagicGate-related functions that are applicable to ROM v2.20 and later 128 | int OSDGetPS1DRVRegion(char *region); //Returns the MagicGate region letter for the PlayStation Driver (returns 0 on error) 129 | int OSDGetDVDPlayerRegion(char *region); //Returns the MagicGate region letter for the DVD Player (returns 0 on error) 130 | int OSDGetMGRegion(void); //Returns MagicGate region letter (returns '\0' on error) 131 | 132 | //Low-level OSD configuration-management functions (Please use the functions in OSDConfig instead) 133 | int OSDLoadConfigFromNVM(OSDConfig1_t *osdConfigPS1, OSDConfig2_t *osdConfigPS2); //Load OSD configuration from NVRAM. Returns 0 on success. 134 | int OSDSaveConfigToNVM(const OSDConfig1_t *osdConfigPS1, const OSDConfig2_t *osdConfigPS2, u8 osdInit); //Save OSD configuration to NVRAM. Returns 0 on success. 135 | 136 | //For retrieving various folder names 137 | const char *OSDGetSystemExecFolder(void); 138 | const char *OSDGetSystemDataFolder(void); 139 | const char *OSDGetDVDPLExecFolder(void); 140 | const char *OSDGetHistoryDataFolder(void); 141 | 142 | //For compatibility with the homebrew SDK 143 | #define sceMcInit mcInit 144 | #define sceMcGetInfo mcGetInfo 145 | #define sceMcOpen mcOpen 146 | #define sceMcClose mcClose 147 | #define sceMcSeek mcSeek 148 | #define sceMcRead mcRead 149 | #define sceMcWrite mcWrite 150 | #define sceMcGetDir mcGetDir 151 | #define sceMcMkDir mcMkDir 152 | #define sceMcSetFileInfo mcSetFileInfo 153 | #define sceMcDelete mcDelete 154 | #define sceMcSync mcSync 155 | -------------------------------------------------------------------------------- /OSDInit.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include "libcdvd_add.h" 7 | #include 8 | 9 | #include "OSDInit.h" 10 | 11 | /* Parsing of values from the EEPROM and setting them into the EE kernel 12 | was done in different ways, across different browser versions. 13 | 14 | The early browsers of ROM v1.00 and v1.01 (SCPH-10000/SCPH-15000) 15 | parsed the values within the EEPROM into global variables, 16 | which are used to set the individual fields in the OSD configuration. 17 | 18 | The newer browsers parsed the values into a bitfield structure, 19 | which does not have the same layout as the OSD configuration structure. 20 | 21 | Both designs had the parsing and the preparation of the OSD 22 | configuration data separated, presumably for clarity of code and 23 | to achieve low-coupling (perhaps they belonged to different modules). */ 24 | 25 | static int ConsoleRegion = -1, ConsoleOSDRegion = -1, ConsoleOSDLanguage = -1; 26 | static int ConsoleOSDRegionInitStatus = 0, ConsoleRegionParamInitStatus = 0; //0 = Not init. 1 = Init complete. <0 = Init failed. 27 | static u8 ConsoleRegionData[16] = {0, 0, 0xFF, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 28 | 29 | //Perhaps it once used to read more configuration blocks (original capacity was 7 blocks). 30 | static u8 OSDConfigBuffer[CONFIG_BLOCK_SIZE * 2]; 31 | 32 | //Local function prototypes 33 | static int InitMGRegion(void); 34 | static int ConsoleInitRegion(void); 35 | static int ConsoleRegionParamsInitPS1DRV(const char *romver); 36 | static int GetConsoleRegion(void); 37 | static int CdReadOSDRegionParams(char *OSDVer); 38 | static int GetOSDRegion(void); 39 | static void InitOSDDefaultLanguage(int region, const char *language); 40 | static int ReadOSDConfigPS2(OSDConfig2_t *config, const OSDConfigStore_t* OSDConfigBuffer); 41 | static void ReadOSDConfigPS1(OSDConfig1_t *config, const OSDConfigStore_t* OSDConfigBuffer); 42 | static void WriteOSDConfigPS1(OSDConfigStore_t* OSDConfigBuffer, const OSDConfig1_t *config); 43 | static void WriteOSDConfigPS2(OSDConfigStore_t* OSDConfigBuffer, const OSDConfig2_t *config, u8 invalid); 44 | static void ReadConfigFromNVM(u8 *buffer); 45 | static void WriteConfigToNVM(const u8 *buffer); 46 | 47 | //Directory names 48 | static char SystemDataFolder[]="BRDATA-SYSTEM"; 49 | static char SystemExecFolder[]="BREXEC-SYSTEM"; 50 | static char DVDPLExecFolder[]="BREXEC-DVDPLAYER"; 51 | 52 | char ConsoleROMVER[ROMVER_MAX_LEN]; 53 | 54 | static int InitMGRegion(void) 55 | { 56 | u32 stat; 57 | int result; 58 | 59 | if(ConsoleRegionParamInitStatus == 0) 60 | { 61 | do{ 62 | if((result = sceCdReadRegionParams(ConsoleRegionData, &stat)) == 0) 63 | { //Failed. 64 | ConsoleRegionParamInitStatus=1; 65 | } 66 | else 67 | { 68 | if(stat & 0x100) 69 | { 70 | //MECHACON does not support this function. 71 | ConsoleRegionParamInitStatus=-1; 72 | break; 73 | } 74 | else 75 | { //Status OK, but the result yielded an error. 76 | ConsoleRegionParamInitStatus=1; 77 | } 78 | } 79 | }while((result == 0) || (stat & 0x80)); 80 | } 81 | 82 | return ConsoleRegionParamInitStatus; 83 | } 84 | 85 | void OSDInitSystemPaths(void) 86 | { 87 | int region; 88 | char regions[CONSOLE_REGION_COUNT]={'I', 'A', 'E', 'C'}; 89 | 90 | region = OSDGetConsoleRegion(); 91 | if(region>=0 && region=0)?ConsoleRegionData[8]:0); 102 | } 103 | 104 | static int ConsoleInitRegion(void) 105 | { 106 | GetOSDRegion(); 107 | return InitMGRegion(); 108 | } 109 | 110 | static int ConsoleRegionParamsInitPS1DRV(const char *romver) 111 | { 112 | int result; 113 | 114 | if(ConsoleInitRegion() >= 0) 115 | { 116 | ConsoleRegionData[2] = romver[4]; 117 | result = 1; 118 | } else 119 | result = 0; 120 | 121 | return result; 122 | } 123 | 124 | /* Present here, but not sure what it is (unused) 125 | int OSDGetROMRegion(char *out) 126 | { 127 | int result; 128 | 129 | if(ConsoleInitRegion() >= 0) 130 | { 131 | out[4] = ConsoleRegionData[2]; 132 | result = 1; 133 | } 134 | else 135 | result = 0; 136 | 137 | return result; 138 | } */ 139 | 140 | int OSDGetPS1DRVRegion(char *region) 141 | { 142 | int result; 143 | 144 | if(ConsoleInitRegion() >= 0) 145 | { 146 | *region = ConsoleRegionData[2]; 147 | result = 1; 148 | } 149 | else 150 | result = 0; 151 | 152 | return result; 153 | } 154 | 155 | int OSDGetDVDPlayerRegion(char *region) 156 | { 157 | int result; 158 | 159 | if(ConsoleInitRegion() >= 0) 160 | { 161 | *region = ConsoleRegionData[8]; 162 | result = 1; 163 | } 164 | else 165 | result = 0; 166 | 167 | return result; 168 | } 169 | 170 | static int GetConsoleRegion(void) 171 | { 172 | char romver[16]; 173 | int fd, result; 174 | 175 | if((result=ConsoleRegion)<0) 176 | { 177 | if((fd = open("rom0:ROMVER", O_RDONLY)) >= 0) 178 | { 179 | read(fd, romver, sizeof(romver)); 180 | close(fd); 181 | ConsoleRegionParamsInitPS1DRV(romver); 182 | 183 | switch(romver[4]) 184 | { 185 | case 'C': 186 | ConsoleRegion=CONSOLE_REGION_CHINA; 187 | break; 188 | case 'E': 189 | ConsoleRegion=CONSOLE_REGION_EUROPE; 190 | break; 191 | case 'H': 192 | case 'A': 193 | ConsoleRegion=CONSOLE_REGION_USA; 194 | break; 195 | case 'J': 196 | ConsoleRegion=CONSOLE_REGION_JAPAN; 197 | } 198 | 199 | result=ConsoleRegion; 200 | } else 201 | result = -1; 202 | } 203 | 204 | return result; 205 | } 206 | 207 | static int CdReadOSDRegionParams(char *OSDVer) 208 | { 209 | int result; 210 | 211 | if(OSDVer[4] == '?') 212 | { 213 | if(InitMGRegion() >= 0) 214 | { 215 | result = 1; 216 | OSDVer[4] = ConsoleRegionData[3]; 217 | OSDVer[5] = ConsoleRegionData[4]; 218 | OSDVer[6] = ConsoleRegionData[5]; 219 | OSDVer[7] = ConsoleRegionData[6]; 220 | } else 221 | result = 0; 222 | } else { 223 | ConsoleRegionParamInitStatus = -256; 224 | result = 0; 225 | } 226 | 227 | return result; 228 | } 229 | 230 | static int GetOSDRegion(void) 231 | { 232 | char OSDVer[16]; 233 | int fd; 234 | 235 | if(ConsoleOSDRegionInitStatus == 0 || ConsoleOSDRegion == -1) 236 | { 237 | ConsoleOSDRegionInitStatus = 1; 238 | if((fd = open("rom0:OSDVER", O_RDONLY)) >= 0) 239 | { 240 | read(fd, OSDVer, sizeof(OSDVer)); 241 | close(fd); 242 | CdReadOSDRegionParams(OSDVer); 243 | switch(OSDVer[4]) 244 | { 245 | case 'A': 246 | ConsoleOSDRegion = OSD_REGION_USA; 247 | break; 248 | case 'C': 249 | ConsoleOSDRegion = OSD_REGION_CHINA; 250 | break; 251 | case 'E': 252 | ConsoleOSDRegion = OSD_REGION_EUROPE; 253 | break; 254 | case 'H': 255 | ConsoleOSDRegion = OSD_REGION_ASIA; 256 | break; 257 | case 'J': 258 | ConsoleOSDRegion = OSD_REGION_JAPAN; 259 | break; 260 | case 'K': 261 | ConsoleOSDRegion = OSD_REGION_KOREA; 262 | break; 263 | case 'R': 264 | ConsoleOSDRegion = OSD_REGION_RUSSIA; 265 | break; 266 | default: 267 | ConsoleOSDRegion = OSD_REGION_INVALID; 268 | } 269 | 270 | if(ConsoleOSDRegion != OSD_REGION_INVALID) 271 | InitOSDDefaultLanguage(ConsoleOSDRegion, &OSDVer[5]); 272 | } else 273 | ConsoleOSDRegion = OSD_REGION_INVALID; 274 | } 275 | 276 | return ConsoleOSDRegion; 277 | } 278 | 279 | static void InitOSDDefaultLanguage(int region, const char *language) 280 | { 281 | int DefaultLang; 282 | 283 | DefaultLang = -1; 284 | if(ConsoleOSDLanguage == -1) 285 | { 286 | if(language != NULL) 287 | { 288 | if(strncmp(language, "jpn", 3) == 0) 289 | DefaultLang = LANGUAGE_JAPANESE; 290 | else if(strncmp(language, "eng", 3) == 0) 291 | DefaultLang = LANGUAGE_ENGLISH; 292 | else if(strncmp(language, "fre", 3) == 0) 293 | DefaultLang = LANGUAGE_FRENCH; 294 | else if(strncmp(language, "spa", 3) == 0) 295 | DefaultLang = LANGUAGE_SPANISH; 296 | else if(strncmp(language, "ger", 3) == 0) 297 | DefaultLang = LANGUAGE_GERMAN; 298 | else if(strncmp(language, "ita", 3) == 0) 299 | DefaultLang = LANGUAGE_ITALIAN; 300 | else if(strncmp(language, "dut", 3) == 0) 301 | DefaultLang = LANGUAGE_DUTCH; 302 | else if(strncmp(language, "por", 3) == 0) 303 | DefaultLang = LANGUAGE_PORTUGUESE; 304 | else if(strncmp(language, "rus", 3) == 0) 305 | DefaultLang = LANGUAGE_RUSSIAN; 306 | else if(strncmp(language, "kor", 3) == 0) 307 | DefaultLang = LANGUAGE_KOREAN; 308 | else if(strncmp(language, "tch", 3) == 0) 309 | DefaultLang = LANGUAGE_TRAD_CHINESE; 310 | else if(strncmp(language, "sch", 3) == 0) 311 | DefaultLang = LANGUAGE_SIMPL_CHINESE; 312 | else DefaultLang = -1; 313 | } 314 | 315 | //Check if the specified language is valid for the region 316 | if(!OSDIsLanguageValid(region, DefaultLang)) 317 | { 318 | switch(region) 319 | { 320 | case OSD_REGION_JAPAN: 321 | DefaultLang = LANGUAGE_JAPANESE; 322 | break; 323 | case OSD_REGION_CHINA: 324 | DefaultLang = LANGUAGE_SIMPL_CHINESE; 325 | break; 326 | case OSD_REGION_RUSSIA: 327 | DefaultLang = LANGUAGE_RUSSIAN; 328 | break; 329 | case OSD_REGION_KOREA: 330 | DefaultLang = LANGUAGE_KOREAN; 331 | break; 332 | case OSD_REGION_USA: 333 | case OSD_REGION_EUROPE: 334 | case OSD_REGION_ASIA: 335 | default: 336 | DefaultLang = LANGUAGE_ENGLISH; 337 | } 338 | } 339 | 340 | ConsoleOSDLanguage = DefaultLang; 341 | } 342 | } 343 | 344 | int OSDIsLanguageValid(int region, int language) 345 | { 346 | switch(region) 347 | { 348 | case OSD_REGION_JAPAN: 349 | return(language == LANGUAGE_JAPANESE || language == LANGUAGE_ENGLISH) ? language : -1; 350 | case OSD_REGION_CHINA: 351 | return(language == LANGUAGE_ENGLISH || language == LANGUAGE_SIMPL_CHINESE) ? language : -1; 352 | case OSD_REGION_RUSSIA: 353 | return(language == LANGUAGE_ENGLISH || language == LANGUAGE_RUSSIAN) ? language : -1; 354 | case OSD_REGION_KOREA: 355 | return(language == LANGUAGE_ENGLISH || language == LANGUAGE_KOREAN) ? language : -1; 356 | case OSD_REGION_ASIA: 357 | return(language == LANGUAGE_ENGLISH || language == LANGUAGE_TRAD_CHINESE) ? language : -1; 358 | case OSD_REGION_USA: 359 | case OSD_REGION_EUROPE: 360 | default: 361 | return(language <= LANGUAGE_PORTUGUESE && region > OSD_REGION_JAPAN) ? language : -1; 362 | } 363 | } 364 | 365 | int OSDGetConsoleRegion(void) 366 | { //Default to Japan, if the region cannot be obtained. 367 | int result; 368 | 369 | result=GetConsoleRegion(); 370 | 371 | return(result < 0 ? 0 : result); 372 | } 373 | 374 | int OSDGetVideoMode(void) 375 | { 376 | return(GetConsoleRegion() == CONSOLE_REGION_EUROPE); 377 | } 378 | 379 | int OSDGetRegion(void) 380 | { 381 | int region; 382 | 383 | if((region = GetOSDRegion()) < 0) 384 | { 385 | region = OSDGetConsoleRegion(); 386 | InitOSDDefaultLanguage(region, NULL); 387 | } 388 | 389 | return region; 390 | } 391 | 392 | int OSDGetDefaultLanguage(void) 393 | { 394 | if(ConsoleOSDLanguage == -1) 395 | OSDGetRegion(); 396 | 397 | return ConsoleOSDLanguage; 398 | } 399 | 400 | /* Notes: 401 | Version = 0 (Protokernel consoles only) NTSC-J, 1 = ROM versions up to v1.70, 2 = v1.80 and later. 2 = support for extended languages (Osd2 bytes 3 and 4) 402 | In the homebrew PS2SDK, this was previously known as the "region". 403 | japLanguage = 0 (Japanese, protokernel consoles only), 1 = non-Japanese (Protokernel consoles only). Newer browsers have this set always to 1. 404 | */ 405 | static int ReadOSDConfigPS2(OSDConfig2_t *config, const OSDConfigStore_t* OSDConfigBuffer) 406 | { 407 | config->spdifMode = OSDConfigBuffer->PS2.spdifMode; 408 | config->screenType = OSDConfigBuffer->PS2.screenType; 409 | config->videoOutput = OSDConfigBuffer->PS2.videoOutput; 410 | 411 | if (OSDConfigBuffer->PS2.extendedLanguage) //Extended/Basic language set 412 | { //One of the 8 standard languages 413 | config->language = OSDConfigBuffer->PS2.language; 414 | } 415 | else 416 | { //Japanese/English 417 | config->language = OSDConfigBuffer->PS2.japLanguage; 418 | } 419 | 420 | config->daylightSaving = OSDConfigBuffer->PS2.daylightSaving; 421 | config->timeFormat = OSDConfigBuffer->PS2.timeFormat; 422 | config->dateFormat = OSDConfigBuffer->PS2.dateFormat; 423 | config->timezoneOffset = OSDConfigBuffer->PS2.timezoneOffsetLo | ((u32)OSDConfigBuffer->PS2.timezoneOffsetHi) << 8; 424 | config->timezone = OSDConfigBuffer->PS2.timezoneLo | (((u32)OSDConfigBuffer->PS2.timezoneHi) << 8); 425 | config->rcEnabled = OSDConfigBuffer->PS2.rcEnabled; 426 | config->rcGameFunction = OSDConfigBuffer->PS2.rcGameFunction; 427 | config->rcSupported = OSDConfigBuffer->PS2.rcSupported; 428 | config->dvdpProgressive = OSDConfigBuffer->PS2.dvdpProgressive; 429 | 430 | return(OSDConfigBuffer->PS2.osdInit ^ 1); 431 | } 432 | 433 | static void ReadOSDConfigPS1(OSDConfig1_t *config, const OSDConfigStore_t* OSDConfigBuffer) 434 | { 435 | int i; 436 | 437 | for(i = 0; i < CONFIG_BLOCK_SIZE; i++) 438 | config->data[i] = OSDConfigBuffer->PS1.bytes[i]; 439 | } 440 | 441 | static void WriteOSDConfigPS1(OSDConfigStore_t* OSDConfigBuffer, const OSDConfig1_t *config) 442 | { 443 | int i; 444 | 445 | for(i = 0; i < CONFIG_BLOCK_SIZE; i++) 446 | OSDConfigBuffer->PS1.bytes[i] = config->data[i]; 447 | } 448 | 449 | static void WriteOSDConfigPS2(OSDConfigStore_t* OSDConfigBuffer, const OSDConfig2_t *config, u8 invalid) 450 | { 451 | int japLanguage, version, osdInitValue; 452 | 453 | osdInitValue = invalid ^ 1; 454 | version = OSDConfigBuffer->PS2.extendedLanguage == 0 ? 1 : OSDConfigBuffer->PS2.extendedLanguage; 455 | 456 | if(config->language <= LANGUAGE_ENGLISH) 457 | japLanguage = config->language; 458 | else //Do not update the legacy language option if the language was changed to something unsupported. 459 | japLanguage = OSDConfigBuffer->PS2.japLanguage; 460 | 461 | //0x0F 462 | OSDConfigBuffer->PS2.videoOutput = config->videoOutput; 463 | OSDConfigBuffer->PS2.japLanguage = japLanguage; 464 | OSDConfigBuffer->PS2.extendedLanguage = 1; 465 | OSDConfigBuffer->PS2.spdifMode = config->spdifMode; 466 | OSDConfigBuffer->PS2.screenType = config->screenType; 467 | 468 | //0x10 469 | OSDConfigBuffer->PS2.language = config->language; 470 | OSDConfigBuffer->PS2.version = version; 471 | 472 | //0x11 473 | OSDConfigBuffer->PS2.timezoneOffsetHi = config->timezoneOffset >> 8; 474 | OSDConfigBuffer->PS2.dateFormat = config->dateFormat; 475 | OSDConfigBuffer->PS2.timeFormat = config->timeFormat; 476 | OSDConfigBuffer->PS2.daylightSaving = config->daylightSaving; 477 | OSDConfigBuffer->PS2.osdInit = osdInitValue; 478 | 479 | //0x12 480 | OSDConfigBuffer->PS2.timezoneOffsetLo = config->timezoneOffset; 481 | 482 | //0x13 483 | OSDConfigBuffer->PS2.timezoneHi = config->timezone >> 8; 484 | OSDConfigBuffer->PS2.unknownB13_01 = OSDConfigBuffer->PS2.unknownB13_01; //Carry over 485 | OSDConfigBuffer->PS2.rcEnabled = config->rcEnabled; 486 | OSDConfigBuffer->PS2.rcGameFunction = config->rcGameFunction; 487 | OSDConfigBuffer->PS2.rcSupported = config->rcSupported; 488 | OSDConfigBuffer->PS2.dvdpProgressive = config->dvdpProgressive; 489 | 490 | //0x14 491 | OSDConfigBuffer->PS2.timezoneLo = config->timezone; 492 | } 493 | 494 | static void ReadConfigFromNVM(u8 *buffer) 495 | { /* Hmm. What should the check for stat be? In v1.xx, it seems to be a check against 0x9. In v2.20, it checks against 0x81. 496 | In the HDD Browser, reading checks against 0x81, while writing checks against 0x9. 497 | But because we are targeting all consoles, it would be probably safer to follow the HDD Browser. */ 498 | int result; 499 | u32 stat; 500 | 501 | do{ 502 | sceCdOpenConfig(1, 0, 2, &stat); 503 | }while(stat & 0x81); 504 | 505 | do{ 506 | result=sceCdReadConfig(buffer, &stat); 507 | }while((stat & 0x81) || (result == 0)); 508 | 509 | do{ 510 | result=sceCdCloseConfig(&stat); 511 | }while((stat & 0x81) || (result == 0)); 512 | } 513 | 514 | static void WriteConfigToNVM(const u8 *buffer) 515 | { // Read the comment in ReadConfigFromNVM() about the error status bits. 516 | u32 stat; 517 | int result; 518 | 519 | do{ 520 | sceCdOpenConfig(1, 1, 2, &stat); 521 | }while(stat & 0x09); 522 | 523 | do{ 524 | result=sceCdWriteConfig(buffer, &stat); 525 | }while((stat & 0x09) || (result == 0)); 526 | 527 | do{ 528 | result=sceCdCloseConfig(&stat); 529 | }while((stat & 9) || (result == 0)); 530 | } 531 | 532 | int OSDLoadConfigFromNVM(OSDConfig1_t *osdConfigPS1, OSDConfig2_t *osdConfigPS2) 533 | { 534 | int result; 535 | 536 | ReadConfigFromNVM(OSDConfigBuffer); 537 | result = ReadOSDConfigPS2(osdConfigPS2, (const OSDConfigStore_t*)OSDConfigBuffer); 538 | ReadOSDConfigPS1(osdConfigPS1, (const OSDConfigStore_t*)OSDConfigBuffer); 539 | 540 | return result; 541 | } 542 | 543 | int OSDSaveConfigToNVM(const OSDConfig1_t *osdConfigPS1, const OSDConfig2_t *osdConfigPS2, u8 invalid) 544 | { 545 | WriteOSDConfigPS1((OSDConfigStore_t*)OSDConfigBuffer, osdConfigPS1); 546 | WriteOSDConfigPS2((OSDConfigStore_t*)OSDConfigBuffer, osdConfigPS2, invalid); 547 | WriteConfigToNVM(OSDConfigBuffer); 548 | 549 | return 0; 550 | } 551 | 552 | //Directory management 553 | const char *OSDGetHistoryDataFolder(void) 554 | { 555 | return SystemDataFolder; 556 | } 557 | 558 | const char *OSDGetSystemDataFolder(void) 559 | { 560 | return SystemDataFolder; 561 | } 562 | 563 | const char *OSDGetSystemExecFolder(void) 564 | { 565 | return SystemExecFolder; 566 | } 567 | 568 | const char *OSDGetDVDPLExecFolder(void) 569 | { 570 | return DVDPLExecFolder; 571 | } 572 | 573 | int OSDInitROMVER(void) 574 | { 575 | int fd; 576 | 577 | memset(ConsoleROMVER, 0, ROMVER_MAX_LEN); 578 | if((fd = open("rom0:ROMVER", O_RDONLY)) >= 0) 579 | { 580 | read(fd, ConsoleROMVER, ROMVER_MAX_LEN); 581 | close(fd); 582 | } 583 | 584 | return 0; 585 | } 586 | -------------------------------------------------------------------------------- /main-nogui.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | //#include 14 | //#include 15 | #include 16 | #include 17 | #include "OSDInit.h" 18 | 19 | //Segments of code comes from uLE and some works of SP193 20 | 21 | void ResetIOP() 22 | { 23 | SifInitRpc(0); 24 | while(!SifIopReset("", 0)){}; 25 | while(!SifIopSync()){}; 26 | SifInitRpc(0); 27 | } 28 | 29 | void InitPS2() 30 | { 31 | init_scr(); 32 | ResetIOP(); 33 | SifInitIopHeap(); 34 | SifLoadFileInit(); 35 | fioInit(); 36 | sbv_patch_disable_prefix_check(); 37 | SifLoadModule("rom0:SIO2MAN", 0, NULL); 38 | SifLoadModule("rom0:MCMAN", 0, NULL); 39 | SifLoadModule("rom0:MCSERV", 0, NULL); 40 | } 41 | 42 | void LoadElf(const char *elf, char* path) 43 | { 44 | char* args[1]; 45 | t_ExecData exec; 46 | SifLoadElf(elf, &exec); 47 | 48 | if(exec.epc > 0) 49 | { 50 | ResetIOP(); 51 | 52 | if(path != 0) 53 | { 54 | args[0] = path; 55 | ExecPS2((void*)exec.epc, (void*)exec.gp, 1, args); 56 | } 57 | else 58 | { 59 | ExecPS2((void*)exec.epc, (void*)exec.gp, 0, NULL); 60 | } 61 | } 62 | } 63 | 64 | int main(int argc, char *argv[], char **envp) 65 | { 66 | InitPS2(); 67 | scr_clear(); 68 | scr_printf("\n\n HWC's OSDSYS Launcher v1.7 \n"); //NOGUI 69 | 70 | char *mi_rom_es; 71 | char *simple_es; 72 | mi_rom_es=GetRomName("5"); 73 | simple_es=strncpy("????", mi_rom_es, 4); 74 | 75 | u8 romver[16]; 76 | int fdn; 77 | if((fdn = open("rom0:ROMVER", O_RDONLY)) > 0) 78 | { 79 | read(fdn, romver, sizeof romver); 80 | close(fdn); 81 | } 82 | int file_exists(char filepath[]) 83 | { 84 | filepath[6] = (romver[4] == 'E' ? 'E' : 85 | (romver[4] == 'J' ? 'I' : 86 | (romver[4] == 'H' ? 'A' : 87 | (romver[4] == 'U' ? 'A' : romver[4])))); 88 | 89 | int fdn; 90 | 91 | fdn = open(filepath, O_RDONLY); 92 | if (fdn < 0) return 0; 93 | close(fdn); 94 | 95 | return 1; 96 | } 97 | void CargarelOSDSYS(char default_OSDSYS_path[]) 98 | { 99 | char arg0[20], arg1[20], arg2[20], arg3[40]; 100 | char *args[4] = {arg0, arg1, arg2, arg3}; 101 | char kelf_loader[40]; 102 | int argc; 103 | char path[1025]; 104 | 105 | default_OSDSYS_path[6] = (romver[4] == 'E' ? 'E' : 106 | (romver[4] == 'J' ? 'I' : 107 | (romver[4] == 'H' ? 'A' : 108 | (romver[4] == 'U' ? 'A' : romver[4])))); 109 | /* 110 | if(romver[4] == 'J') default_OSDSYS_path[] = "mc:/BIEXEC-SYSTEM/osdmain.elf"; 111 | else if(romver[4] == 'E') default_OSDSYS_path[] = "mc:/BEEXEC-SYSTEM/osdmain.elf"; 112 | else default_OSDSYS_path[] = "mc:/BAEXEC-SYSTEM/osdmain.elf"; 113 | */ 114 | 115 | strcpy(path, default_OSDSYS_path); 116 | 117 | strcpy(arg0, "-m rom0:SIO2MAN"); 118 | strcpy(arg1, "-m rom0:MCMAN"); 119 | strcpy(arg2, "-m rom0:MCSERV"); 120 | sprintf(arg3, "-x %s", path); 121 | argc = 4; 122 | strcpy(kelf_loader, "moduleload"); 123 | LoadExecPS2(kelf_loader, argc, args); 124 | } 125 | 126 | 127 | if (file_exists("mc0:/B?EXEC-SYSTEM/osdmain.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osdmain.elf"); 128 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd110.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd110.elf"); 129 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd120.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd120.elf"); 130 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd130.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd130.elf"); 131 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd140.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd140.elf"); 132 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd150.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd150.elf"); 133 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd160.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd160.elf"); 134 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd170.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd170.elf"); 135 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd180.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd180.elf"); 136 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd190.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd190.elf"); 137 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd200.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd200.elf"); 138 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd210.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd210.elf"); 139 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd220.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd220.elf"); 140 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd230.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd230.elf"); 141 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd240.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd240.elf"); 142 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd250.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd250.elf"); 143 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd260.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd260.elf"); 144 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd270.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd270.elf"); 145 | 146 | if (file_exists("mc1:/B?EXEC-SYSTEM/osdmain.elf")) CargarelOSDSYS("mc1:/B?EXEC-SYSTEM/osdmain.elf"); 147 | if (file_exists("mc1:/B?EXEC-SYSTEM/osd110.elf")) CargarelOSDSYS("mc1:/B?EXEC-SYSTEM/osd110.elf"); 148 | if (file_exists("mc1:/B?EXEC-SYSTEM/osd120.elf")) CargarelOSDSYS("mc1:/B?EXEC-SYSTEM/osd120.elf"); 149 | if (file_exists("mc1:/B?EXEC-SYSTEM/osd130.elf")) CargarelOSDSYS("mc1:/B?EXEC-SYSTEM/osd130.elf"); 150 | if (file_exists("mc1:/B?EXEC-SYSTEM/osd140.elf")) CargarelOSDSYS("mc1:/B?EXEC-SYSTEM/osd140.elf"); 151 | if (file_exists("mc1:/B?EXEC-SYSTEM/osd150.elf")) CargarelOSDSYS("mc1:/B?EXEC-SYSTEM/osd150.elf"); 152 | if (file_exists("mc1:/B?EXEC-SYSTEM/osd160.elf")) CargarelOSDSYS("mc1:/B?EXEC-SYSTEM/osd160.elf"); 153 | if (file_exists("mc1:/B?EXEC-SYSTEM/osd170.elf")) CargarelOSDSYS("mc1:/B?EXEC-SYSTEM/osd170.elf"); 154 | if (file_exists("mc1:/B?EXEC-SYSTEM/osd180.elf")) CargarelOSDSYS("mc1:/B?EXEC-SYSTEM/osd180.elf"); 155 | if (file_exists("mc1:/B?EXEC-SYSTEM/osd190.elf")) CargarelOSDSYS("mc1:/B?EXEC-SYSTEM/osd190.elf"); 156 | if (file_exists("mc1:/B?EXEC-SYSTEM/osd200.elf")) CargarelOSDSYS("mc1:/B?EXEC-SYSTEM/osd200.elf"); 157 | if (file_exists("mc1:/B?EXEC-SYSTEM/osd210.elf")) CargarelOSDSYS("mc1:/B?EXEC-SYSTEM/osd210.elf"); 158 | if (file_exists("mc1:/B?EXEC-SYSTEM/osd220.elf")) CargarelOSDSYS("mc1:/B?EXEC-SYSTEM/osd220.elf"); 159 | if (file_exists("mc1:/B?EXEC-SYSTEM/osd230.elf")) CargarelOSDSYS("mc1:/B?EXEC-SYSTEM/osd230.elf"); 160 | if (file_exists("mc1:/B?EXEC-SYSTEM/osd240.elf")) CargarelOSDSYS("mc1:/B?EXEC-SYSTEM/osd240.elf"); 161 | if (file_exists("mc1:/B?EXEC-SYSTEM/osd250.elf")) CargarelOSDSYS("mc1:/B?EXEC-SYSTEM/osd250.elf"); 162 | if (file_exists("mc1:/B?EXEC-SYSTEM/osd260.elf")) CargarelOSDSYS("mc1:/B?EXEC-SYSTEM/osd260.elf"); 163 | if (file_exists("mc1:/B?EXEC-SYSTEM/osd270.elf")) CargarelOSDSYS("mc1:/B?EXEC-SYSTEM/osd270.elf"); 164 | /* 165 | if (file_exists("mc0:/BAEXEC-SYSTEM/osdmain.elf")) CargarelOSDSYS("mc:/BAEXEC-SYSTEM/osdmain.elf"); 166 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd110.elf")) CargarelOSDSYS("mc:/BAEXEC-SYSTEM/osd110.elf"); 167 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd120.elf")) CargarelOSDSYS("mc:/BAEXEC-SYSTEM/osd120.elf"); 168 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd130.elf")) CargarelOSDSYS("mc:/BAEXEC-SYSTEM/osd130.elf"); 169 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd140.elf")) CargarelOSDSYS("mc:/BAEXEC-SYSTEM/osd140.elf"); 170 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd150.elf")) CargarelOSDSYS("mc:/BAEXEC-SYSTEM/osd150.elf"); 171 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd160.elf")) CargarelOSDSYS("mc:/BAEXEC-SYSTEM/osd160.elf"); 172 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd170.elf")) CargarelOSDSYS("mc:/BAEXEC-SYSTEM/osd170.elf"); 173 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd180.elf")) CargarelOSDSYS("mc:/BAEXEC-SYSTEM/osd180.elf"); 174 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd190.elf")) CargarelOSDSYS("mc:/BAEXEC-SYSTEM/osd190.elf"); 175 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd200.elf")) CargarelOSDSYS("mc:/BAEXEC-SYSTEM/osd200.elf"); 176 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd210.elf")) CargarelOSDSYS("mc:/BAEXEC-SYSTEM/osd210.elf"); 177 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd220.elf")) CargarelOSDSYS("mc:/BAEXEC-SYSTEM/osd220.elf"); 178 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd230.elf")) CargarelOSDSYS("mc:/BAEXEC-SYSTEM/osd230.elf"); 179 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd240.elf")) CargarelOSDSYS("mc:/BAEXEC-SYSTEM/osd240.elf"); 180 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd250.elf")) CargarelOSDSYS("mc:/BAEXEC-SYSTEM/osd250.elf"); 181 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd260.elf")) CargarelOSDSYS("mc:/BAEXEC-SYSTEM/osd260.elf"); 182 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd270.elf")) CargarelOSDSYS("mc:/BAEXEC-SYSTEM/osd270.elf"); 183 | if (file_exists("mc0:/BEEXEC-SYSTEM/osdmain.elf")) CargarelOSDSYS("mc:/BEEXEC-SYSTEM/osdmain.elf"); 184 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd110.elf")) CargarelOSDSYS("mc:/BEEXEC-SYSTEM/osd110.elf"); 185 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd120.elf")) CargarelOSDSYS("mc:/BEEXEC-SYSTEM/osd120.elf"); 186 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd130.elf")) CargarelOSDSYS("mc:/BEEXEC-SYSTEM/osd130.elf"); 187 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd140.elf")) CargarelOSDSYS("mc:/BEEXEC-SYSTEM/osd140.elf"); 188 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd150.elf")) CargarelOSDSYS("mc:/BEEXEC-SYSTEM/osd150.elf"); 189 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd160.elf")) CargarelOSDSYS("mc:/BEEXEC-SYSTEM/osd160.elf"); 190 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd170.elf")) CargarelOSDSYS("mc:/BEEXEC-SYSTEM/osd170.elf"); 191 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd180.elf")) CargarelOSDSYS("mc:/BEEXEC-SYSTEM/osd180.elf"); 192 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd190.elf")) CargarelOSDSYS("mc:/BEEXEC-SYSTEM/osd190.elf"); 193 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd200.elf")) CargarelOSDSYS("mc:/BEEXEC-SYSTEM/osd200.elf"); 194 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd210.elf")) CargarelOSDSYS("mc:/BEEXEC-SYSTEM/osd210.elf"); 195 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd220.elf")) CargarelOSDSYS("mc:/BEEXEC-SYSTEM/osd220.elf"); 196 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd230.elf")) CargarelOSDSYS("mc:/BEEXEC-SYSTEM/osd230.elf"); 197 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd240.elf")) CargarelOSDSYS("mc:/BEEXEC-SYSTEM/osd240.elf"); 198 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd250.elf")) CargarelOSDSYS("mc:/BEEXEC-SYSTEM/osd250.elf"); 199 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd260.elf")) CargarelOSDSYS("mc:/BEEXEC-SYSTEM/osd260.elf"); 200 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd270.elf")) CargarelOSDSYS("mc:/BEEXEC-SYSTEM/osd270.elf"); 201 | if (file_exists("mc0:/BIEXEC-SYSTEM/osdmain.elf")) CargarelOSDSYS("mc:/BIEXEC-SYSTEM/osdmain.elf"); 202 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd110.elf")) CargarelOSDSYS("mc:/BIEXEC-SYSTEM/osd110.elf"); 203 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd120.elf")) CargarelOSDSYS("mc:/BIEXEC-SYSTEM/osd120.elf"); 204 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd130.elf")) CargarelOSDSYS("mc:/BIEXEC-SYSTEM/osd130.elf"); 205 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd140.elf")) CargarelOSDSYS("mc:/BIEXEC-SYSTEM/osd140.elf"); 206 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd150.elf")) CargarelOSDSYS("mc:/BIEXEC-SYSTEM/osd150.elf"); 207 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd160.elf")) CargarelOSDSYS("mc:/BIEXEC-SYSTEM/osd160.elf"); 208 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd170.elf")) CargarelOSDSYS("mc:/BIEXEC-SYSTEM/osd170.elf"); 209 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd180.elf")) CargarelOSDSYS("mc:/BIEXEC-SYSTEM/osd180.elf"); 210 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd190.elf")) CargarelOSDSYS("mc:/BIEXEC-SYSTEM/osd190.elf"); 211 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd200.elf")) CargarelOSDSYS("mc:/BIEXEC-SYSTEM/osd200.elf"); 212 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd210.elf")) CargarelOSDSYS("mc:/BIEXEC-SYSTEM/osd210.elf"); 213 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd220.elf")) CargarelOSDSYS("mc:/BIEXEC-SYSTEM/osd220.elf"); 214 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd230.elf")) CargarelOSDSYS("mc:/BIEXEC-SYSTEM/osd230.elf"); 215 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd240.elf")) CargarelOSDSYS("mc:/BIEXEC-SYSTEM/osd240.elf"); 216 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd250.elf")) CargarelOSDSYS("mc:/BIEXEC-SYSTEM/osd250.elf"); 217 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd260.elf")) CargarelOSDSYS("mc:/BIEXEC-SYSTEM/osd260.elf"); 218 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd270.elf")) CargarelOSDSYS("mc:/BIEXEC-SYSTEM/osd270.elf"); 219 | */ 220 | ///////////////// 221 | // Agregar dentro del while la llamada al SYSLOOP.ELF 222 | scr_printf("\n Prioritary region: EUR \n"); 223 | scr_printf("\n\n If you stuck on this screen for a while, \n verify you have connected a Memory Card \n with XtremeEliteBoot+ or FreeMCBoot \n properly installed. \n"); 224 | while(1){ 225 | if (file_exists("mc0:/B?EXEC-SYSTEM/osdmain.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osdmain.elf"); 226 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd110.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd110.elf"); 227 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd120.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd120.elf"); 228 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd130.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd130.elf"); 229 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd140.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd140.elf"); 230 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd150.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd150.elf"); 231 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd160.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd160.elf"); 232 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd170.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd170.elf"); 233 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd180.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd180.elf"); 234 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd190.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd190.elf"); 235 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd200.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd200.elf"); 236 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd210.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd210.elf"); 237 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd220.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd220.elf"); 238 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd230.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd230.elf"); 239 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd240.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd240.elf"); 240 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd250.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd250.elf"); 241 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd260.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd260.elf"); 242 | if (file_exists("mc0:/B?EXEC-SYSTEM/osd270.elf")) CargarelOSDSYS("mc0:/B?EXEC-SYSTEM/osd270.elf"); 243 | // 244 | if (file_exists("mc0:/BEEXEC-SYSTEM/osdmain.elf")) CargarelOSDSYS("mc0:/BEEXEC-SYSTEM/osdmain.elf"); 245 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd110.elf")) CargarelOSDSYS("mc0:/BEEXEC-SYSTEM/osd110.elf"); 246 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd120.elf")) CargarelOSDSYS("mc0:/BEEXEC-SYSTEM/osd120.elf"); 247 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd130.elf")) CargarelOSDSYS("mc0:/BEEXEC-SYSTEM/osd130.elf"); 248 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd140.elf")) CargarelOSDSYS("mc0:/BEEXEC-SYSTEM/osd140.elf"); 249 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd150.elf")) CargarelOSDSYS("mc0:/BEEXEC-SYSTEM/osd150.elf"); 250 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd160.elf")) CargarelOSDSYS("mc0:/BEEXEC-SYSTEM/osd160.elf"); 251 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd170.elf")) CargarelOSDSYS("mc0:/BEEXEC-SYSTEM/osd170.elf"); 252 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd180.elf")) CargarelOSDSYS("mc0:/BEEXEC-SYSTEM/osd180.elf"); 253 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd190.elf")) CargarelOSDSYS("mc0:/BEEXEC-SYSTEM/osd190.elf"); 254 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd200.elf")) CargarelOSDSYS("mc0:/BEEXEC-SYSTEM/osd200.elf"); 255 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd210.elf")) CargarelOSDSYS("mc0:/BEEXEC-SYSTEM/osd210.elf"); 256 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd220.elf")) CargarelOSDSYS("mc0:/BEEXEC-SYSTEM/osd220.elf"); 257 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd230.elf")) CargarelOSDSYS("mc0:/BEEXEC-SYSTEM/osd230.elf"); 258 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd240.elf")) CargarelOSDSYS("mc0:/BEEXEC-SYSTEM/osd240.elf"); 259 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd250.elf")) CargarelOSDSYS("mc0:/BEEXEC-SYSTEM/osd250.elf"); 260 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd260.elf")) CargarelOSDSYS("mc0:/BEEXEC-SYSTEM/osd260.elf"); 261 | if (file_exists("mc0:/BEEXEC-SYSTEM/osd270.elf")) CargarelOSDSYS("mc0:/BEEXEC-SYSTEM/osd270.elf"); 262 | // 263 | if (file_exists("mc0:/BAEXEC-SYSTEM/osdmain.elf")) CargarelOSDSYS("mc0:/BAEXEC-SYSTEM/osdmain.elf"); 264 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd110.elf")) CargarelOSDSYS("mc0:/BAEXEC-SYSTEM/osd110.elf"); 265 | if (file_exists("mc0:/BAEXEC-SYSTEM/osdsys.elf")) CargarelOSDSYS("mc0:/BAEXEC-SYSTEM/osdsys.elf"); 266 | if (file_exists("mc0:/BAEXEC-SYSTEM/osdmain.elf")) CargarelOSDSYS("mc0:/BAEXEC-SYSTEM/osdmain.elf"); 267 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd110.elf")) CargarelOSDSYS("mc0:/BAEXEC-SYSTEM/osd110.elf"); 268 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd120.elf")) CargarelOSDSYS("mc0:/BAEXEC-SYSTEM/osd120.elf"); 269 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd130.elf")) CargarelOSDSYS("mc0:/BAEXEC-SYSTEM/osd130.elf"); 270 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd140.elf")) CargarelOSDSYS("mc0:/BAEXEC-SYSTEM/osd140.elf"); 271 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd150.elf")) CargarelOSDSYS("mc0:/BAEXEC-SYSTEM/osd150.elf"); 272 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd160.elf")) CargarelOSDSYS("mc0:/BAEXEC-SYSTEM/osd160.elf"); 273 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd170.elf")) CargarelOSDSYS("mc0:/BAEXEC-SYSTEM/osd170.elf"); 274 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd180.elf")) CargarelOSDSYS("mc0:/BAEXEC-SYSTEM/osd180.elf"); 275 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd190.elf")) CargarelOSDSYS("mc0:/BAEXEC-SYSTEM/osd190.elf"); 276 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd200.elf")) CargarelOSDSYS("mc0:/BAEXEC-SYSTEM/osd200.elf"); 277 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd210.elf")) CargarelOSDSYS("mc0:/BAEXEC-SYSTEM/osd210.elf"); 278 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd220.elf")) CargarelOSDSYS("mc0:/BAEXEC-SYSTEM/osd220.elf"); 279 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd230.elf")) CargarelOSDSYS("mc0:/BAEXEC-SYSTEM/osd230.elf"); 280 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd240.elf")) CargarelOSDSYS("mc0:/BAEXEC-SYSTEM/osd240.elf"); 281 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd250.elf")) CargarelOSDSYS("mc0:/BAEXEC-SYSTEM/osd250.elf"); 282 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd260.elf")) CargarelOSDSYS("mc0:/BAEXEC-SYSTEM/osd260.elf"); 283 | if (file_exists("mc0:/BAEXEC-SYSTEM/osd270.elf")) CargarelOSDSYS("mc0:/BAEXEC-SYSTEM/osd270.elf"); 284 | // 285 | if (file_exists("mc0:/BIEXEC-SYSTEM/osdmain.elf"))CargarelOSDSYS("mc0:/BIEXEC-SYSTEM/osdmain.elf"); 286 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd110.elf")) CargarelOSDSYS("mc0:/BIEXEC-SYSTEM/osd110.elf"); 287 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd120.elf")) CargarelOSDSYS("mc0:/BIEXEC-SYSTEM/osd120.elf"); 288 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd130.elf")) CargarelOSDSYS("mc0:/BIEXEC-SYSTEM/osd130.elf"); 289 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd140.elf")) CargarelOSDSYS("mc0:/BIEXEC-SYSTEM/osd140.elf"); 290 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd150.elf")) CargarelOSDSYS("mc0:/BIEXEC-SYSTEM/osd150.elf"); 291 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd160.elf")) CargarelOSDSYS("mc0:/BIEXEC-SYSTEM/osd160.elf"); 292 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd170.elf")) CargarelOSDSYS("mc0:/BIEXEC-SYSTEM/osd170.elf"); 293 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd180.elf")) CargarelOSDSYS("mc0:/BIEXEC-SYSTEM/osd180.elf"); 294 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd190.elf")) CargarelOSDSYS("mc0:/BIEXEC-SYSTEM/osd190.elf"); 295 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd200.elf")) CargarelOSDSYS("mc0:/BIEXEC-SYSTEM/osd200.elf"); 296 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd210.elf")) CargarelOSDSYS("mc0:/BIEXEC-SYSTEM/osd210.elf"); 297 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd220.elf")) CargarelOSDSYS("mc0:/BIEXEC-SYSTEM/osd220.elf"); 298 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd230.elf")) CargarelOSDSYS("mc0:/BIEXEC-SYSTEM/osd230.elf"); 299 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd240.elf")) CargarelOSDSYS("mc0:/BIEXEC-SYSTEM/osd240.elf"); 300 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd250.elf")) CargarelOSDSYS("mc0:/BIEXEC-SYSTEM/osd250.elf"); 301 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd260.elf")) CargarelOSDSYS("mc0:/BIEXEC-SYSTEM/osd260.elf"); 302 | if (file_exists("mc0:/BIEXEC-SYSTEM/osd270.elf")) CargarelOSDSYS("mc0:/BIEXEC-SYSTEM/osd270.elf"); 303 | //CargarelOSDSYS("mc:/B?EXEC-SYSTEM/osdmain.elf"); 304 | if (file_exists("mc0:/BOOT/BOOT2.ELF")) LoadElf("mc0:/BOOT/BOOT2.ELF", "mc0:/BOOT/"); 305 | if (file_exists("mc0:/FORTUNA/BOOT2.ELF")) LoadElf("mc0:/FORTUNA/BOOT2.ELF", "mc0:/FORTUNA/"); 306 | if (file_exists("mc0:/OPENTUNA/BOOT2.ELF")) LoadElf("mc0:/OPENTUNA/BOOT2.ELF", "mc0:/OPENTUNA/"); 307 | if (file_exists("mc0:/APPS/BOOT.ELF")) LoadElf("mc0:/APPS/BOOT.ELF", "mc0:/APPS/"); 308 | if (file_exists("mc0:/APPS/ULE.ELF")) LoadElf("mc0:/APPS/ULE.ELF", "mc0:/APPS/"); 309 | if (file_exists("mc0:/BOOT/ULE.ELF")) LoadElf("mc0:/BOOT/ULE.ELF", "mc0:/BOOT/"); 310 | if (file_exists("mc0:/APPS/WLE.ELF")) LoadElf("mc0:/APPS/WLE.ELF", "mc0:/APPS/"); 311 | if (file_exists("mc0:/BOOT/WLE.ELF")) LoadElf("mc0:/BOOT/WLE.ELF", "mc0:/BOOT/"); 312 | if (file_exists("mc1:/BOOT/BOOT.ELF")) LoadElf("mc1:/BOOT/BOOT.ELF", "mc1:/BOOT/"); 313 | if (file_exists("mc1:/APPS/BOOT.ELF")) LoadElf("mc1:/APPS/BOOT.ELF", "mc1:/APPS/"); 314 | if (file_exists("mc1:/APPS/ULE.ELF")) LoadElf("mc1:/APPS/ULE.ELF", "mc1:/APPS/"); 315 | if (file_exists("mc1:/BOOT/ULE.ELF")) LoadElf("mc1:/BOOT/ULE.ELF", "mc1:/BOOT/"); 316 | if (file_exists("mc1:/APPS/WLE.ELF")) LoadElf("mc1:/APPS/WLE.ELF", "mc1:/APPS/"); 317 | if (file_exists("mc1:/BOOT/WLE.ELF")) LoadElf("mc1:/BOOT/WLE.ELF", "mc1:/BOOT/"); 318 | if (file_exists("mc1:/FORTUNA/BOOT.ELF")) LoadElf("mc1:/FORTUNA/BOOT.ELF", "mc1:/FORTUNA/"); 319 | if (file_exists("mc1:/FORTUNA/BOOT2.ELF")) LoadElf("mc1:/FORTUNA/BOOT2.ELF", "mc1:/FORTUNA/"); 320 | if (file_exists("mc1:/OPENTUNA/BOOT.ELF")) LoadElf("mc1:/OPENTUNA/BOOT.ELF", "mc1:/OPENTUNA/"); 321 | if (file_exists("mc1:/OPENTUNA/BOOT2.ELF")) LoadElf("mc1:/OPENTUNA/BOOT2.ELF", "mc1:/OPENTUNA/"); 322 | } 323 | return 0; //Nadie deberá llegar a acá 324 | } 325 | --------------------------------------------------------------------------------