├── .editorconfig ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md └── workflows │ └── Build Latest.yml ├── .gitignore ├── LICENSE ├── README.md └── bin ├── APPS ├── OPL │ ├── OPNPS2LD.ELF │ └── ico.png ├── neutrino │ ├── config │ │ ├── bsd-ata.toml │ │ ├── bsd-ilink.toml │ │ ├── bsd-mmce.toml │ │ ├── bsd-mx4sio.toml │ │ ├── bsd-udpbd-hdd.toml │ │ ├── bsd-udpbd.toml │ │ ├── bsd-usb-debug.toml │ │ ├── bsd-usb.toml │ │ ├── bsdfs-bd.toml │ │ ├── bsdfs-exfat.toml │ │ ├── bsdfs-hdl.toml │ │ ├── emu-ata-file.toml │ │ ├── emu-dvd-esr.toml │ │ ├── emu-dvd-file.toml │ │ ├── emu-mc-file.toml │ │ ├── i_bdm.toml │ │ ├── i_dev9_hidden.toml │ │ ├── i_dev9_ns.toml │ │ ├── rc-uya.toml │ │ └── system.toml │ ├── modules │ │ ├── IEEE1394_bd_mini.irx │ │ ├── ata_bd.irx │ │ ├── atad_emu.irx │ │ ├── bdfs.irx │ │ ├── bdm.irx │ │ ├── bdmfs_fatfs.irx │ │ ├── cdvdfsv.irx │ │ ├── cdvdman_emu.irx │ │ ├── cdvdman_esr1.irx │ │ ├── cdvdman_esr2.irx │ │ ├── dev9_hidden.irx │ │ ├── dev9_ns.irx │ │ ├── ee_core.elf │ │ ├── eesync.irx │ │ ├── fakemod.irx │ │ ├── fhi_bd.irx │ │ ├── fhi_bd_defrag.irx │ │ ├── fileXio.irx │ │ ├── gapfill.irx │ │ ├── hdlfs.irx │ │ ├── iLinkman.irx │ │ ├── imgdrv.irx │ │ ├── iomanX.irx │ │ ├── mc_emu.irx │ │ ├── memcheck.irx │ │ ├── mmcefhi.irx │ │ ├── mmceman.irx │ │ ├── mx4sio_bd_mini.irx │ │ ├── patch_freemem.irx │ │ ├── patch_membo.irx │ │ ├── patch_rc_uya.irx │ │ ├── ps2hdd-bdm.irx │ │ ├── smap_udpbd.irx │ │ ├── smap_udptty.irx │ │ ├── udnl-t300.irx │ │ ├── udnl.irx │ │ ├── usbd_mini.irx │ │ ├── usbd_null.irx │ │ └── usbmass_bd_mini.irx │ └── neutrino.elf └── retroarch │ ├── ico.png │ └── raboot.elf ├── ART ├── SCUS_941.54_BG.PNG ├── SCUS_941.54_ICO.PNG ├── SLUS_000.67_ICO.png ├── SLUS_005.94_ICO.png ├── SLUS_008.62_ICO.PNG ├── SLUS_216.78_BG.png ├── SLUS_216.78_ICO.png ├── SLUS_219.91_BG.png ├── SLUS_219.91_ICO.png └── bg_test.png ├── CFG ├── PBPX_955.03.cfg ├── PS1DRV.cfg ├── PS1VMCGRP.cfg ├── PS2VMCGRP.cfg ├── SCES_511.76.cfg ├── SCES_511.77.cfg ├── SCUS_971.46.cfg ├── SLES_548.38.cfg ├── SLES_552.42.cfg ├── SLUS_205.54.cfg ├── SLUS_209.09.cfg ├── SLUS_210.54.cfg └── SLUS_217.69.cfg ├── OSDXMB.ELF ├── PLG ├── gme_0_xExplorer.json ├── gme_0_xMcUtils.json ├── gme_0_xOPL.json ├── gme_0_xRetroarch.json ├── gme_998_xSasApps.xml ├── gme_999_ps1.js ├── gme_999_ps2.js ├── pic_0_xViewer.json ├── set_0_xSetGame.json ├── set_1_xSetSys.json ├── set_2_xSetTheme.json ├── set_3_xSetTime.xml ├── set_4_xSetDisplay.xml ├── set_5_xSetSecurity.json ├── set_6_xSetNet.json ├── usr_0_xExit.xml ├── usr_0_xRefresh.json ├── xExplorer │ ├── options.xml │ └── scr.js ├── xGame │ └── app_scan.js ├── xMcUtils │ └── scr.js ├── xPicView │ ├── options.xml │ └── scr.js └── xSettings │ ├── xDisplayOpts.xml │ ├── xGameOpts.xml │ ├── xNetOpts.xml │ ├── xSecurityOpts.xml │ ├── xSysInfoDialog.js │ ├── xSystemOpts.xml │ ├── xThemeOpts.xml │ └── xThm.js ├── THM ├── Air Paint │ ├── bg │ │ └── bg.jpg │ ├── icons │ │ ├── ic_cat_game.png │ │ ├── ic_cat_home.png │ │ ├── ic_cat_music.png │ │ ├── ic_cat_network.png │ │ ├── ic_cat_picture.png │ │ ├── ic_cat_settings.png │ │ ├── ic_cat_video.png │ │ ├── ic_game_folder.png │ │ ├── ic_game_mctools.png │ │ ├── ic_set_cfg.png │ │ ├── ic_set_display.png │ │ ├── ic_set_game.png │ │ ├── ic_set_net.png │ │ ├── ic_set_parentalctrl.png │ │ ├── ic_set_system.png │ │ ├── ic_set_theme.png │ │ ├── ic_set_time.png │ │ ├── ic_x_folder.png │ │ ├── ic_x_help.png │ │ ├── ic_x_mass.png │ │ ├── ic_x_poweroff.png │ │ ├── ic_x_reload.png │ │ └── ic_x_usbdrive.png │ ├── thm.js │ ├── thmico.png │ └── thmprw.png ├── Original │ ├── icons │ │ ├── ic_cat_game.png │ │ ├── ic_cat_home.png │ │ ├── ic_cat_music.png │ │ ├── ic_cat_network.png │ │ ├── ic_cat_picture.png │ │ ├── ic_cat_settings.png │ │ ├── ic_cat_video.png │ │ ├── ic_game_folder.png │ │ ├── ic_game_mctools.png │ │ ├── ic_game_ps1.png │ │ ├── ic_game_ps2.png │ │ ├── ic_set_cfg.png │ │ ├── ic_set_display.png │ │ ├── ic_set_game.png │ │ ├── ic_set_net.png │ │ ├── ic_set_parentalctrl.png │ │ ├── ic_set_system.png │ │ ├── ic_set_theme.png │ │ ├── ic_set_time.png │ │ ├── ic_x_file.png │ │ ├── ic_x_folder.png │ │ ├── ic_x_help.png │ │ ├── ic_x_mass.png │ │ ├── ic_x_mc1.png │ │ ├── ic_x_mc2.png │ │ ├── ic_x_poweroff.png │ │ ├── ic_x_reload.png │ │ ├── ic_x_tool.png │ │ ├── ic_x_usbdrive.png │ │ └── ic_x_user.png │ ├── sound │ │ ├── snd_boot.wav │ │ ├── snd_cancel.wav │ │ └── snd_cursor.wav │ └── text │ │ └── font.ttf └── PSX │ ├── bg │ └── bg.png │ ├── icons │ ├── focus.png │ ├── ic_cat_game.png │ ├── ic_cat_home.png │ ├── ic_cat_music.png │ ├── ic_cat_network.png │ ├── ic_cat_picture.png │ ├── ic_cat_settings.png │ ├── ic_cat_video.png │ ├── ic_game_folder.png │ ├── ic_game_mctools.png │ ├── ic_game_ps1.png │ ├── ic_game_ps2.png │ ├── ic_set_cfg.png │ ├── ic_set_display.png │ ├── ic_set_game.png │ ├── ic_set_net.png │ ├── ic_set_parentalctrl.png │ ├── ic_set_system.png │ ├── ic_set_theme.png │ ├── ic_set_time.png │ ├── ic_x_file.png │ ├── ic_x_folder.png │ ├── ic_x_mc1.png │ ├── ic_x_mc2.png │ ├── ic_x_poweroff.png │ ├── ic_x_reload.png │ ├── ic_x_tool.png │ └── ic_x_usbdrive.png │ ├── text │ └── font.ttf │ ├── thm.js │ └── thmprw.png ├── VMC └── blank.vmc ├── XMB ├── color │ ├── ctx.png │ ├── ico1.png │ ├── ico10.png │ ├── ico11.png │ ├── ico12.png │ ├── ico13.png │ ├── ico2.png │ ├── ico3.png │ ├── ico4.png │ ├── ico5.png │ ├── ico6.png │ ├── ico7.png │ ├── ico8.png │ └── ico9.png ├── dash │ ├── dash_bg.png │ ├── dash_bg_overlay.png │ ├── dash_clock.png │ ├── dash_clock_outline.png │ ├── dash_context.png │ ├── dash_icons.xml │ ├── dash_load.png │ ├── dash_logo.png │ ├── dash_option_box.png │ ├── dash_submenu.png │ └── triangle.png ├── js │ ├── bg.js │ ├── config.js │ ├── dashboard.js │ ├── dialog.js │ ├── handlers.js │ ├── net.js │ ├── pads.js │ ├── screen.js │ ├── sound.js │ ├── system.js │ ├── text.js │ └── xml.js └── lang │ ├── lang.json │ ├── net.json │ ├── pass.json │ ├── thm.json │ └── vmsg.json ├── athena.ini └── main.js /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: http://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | # Unix-style newlines with a newline ending every file 7 | [*] 8 | end_of_line = lf 9 | insert_final_newline = true 10 | 11 | 12 | # Matches multiple files with brace expansion notation 13 | # Set default charset 14 | [*.{js,jsx,html,sass,scss,css}] 15 | charset = utf-8 16 | indent_style = space 17 | indent_size = 4 18 | trim_trailing_whitespace = true 19 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/workflows/Build Latest.yml: -------------------------------------------------------------------------------- 1 | name: Build Latest 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | paths: 8 | - 'bin/**' 9 | workflow_dispatch: 10 | 11 | jobs: 12 | package: 13 | runs-on: ubuntu-latest 14 | name: Build and Package OSDXMB 15 | 16 | steps: 17 | - name: Checkout code 18 | uses: actions/checkout@v4 19 | 20 | - name: Setup Git identity 21 | run: | 22 | git config --global user.name "github-actions" 23 | git config --global user.email "github-actions@github.com" 24 | 25 | - name: Create or update 'latest' tag 26 | run: | 27 | git fetch origin 28 | git tag -f latest 29 | git push origin latest --force 30 | 31 | - name: Prepare folder structure 32 | run: | 33 | mkdir -p release/OSDXMB/APPS 34 | cp -r bin/APPS/OPL release/OSDXMB/APPS/ 35 | cp -r bin/APPS/neutrino release/OSDXMB/APPS/ 36 | cp -r bin/ART release/OSDXMB/ 37 | cp -r bin/CFG release/OSDXMB/ 38 | cp -r bin/PLG release/OSDXMB/ 39 | cp -r bin/THM release/OSDXMB/ 40 | cp -r bin/VMC release/OSDXMB/ 41 | cp -r bin/XMB release/OSDXMB/ 42 | cp bin/athena.ini release/OSDXMB/ 43 | cp bin/OSDXMB.ELF release/OSDXMB/ 44 | cp bin/main.js release/OSDXMB/ 45 | rm -f release/OSDXMB/PLG/gme_0_xRetroarch.json 46 | 47 | - name: Create ZIP archive 48 | run: | 49 | cd release 50 | zip -r OSDXMB.zip OSDXMB 51 | 52 | - name: Upload ZIP to GitHub Release 53 | uses: softprops/action-gh-release@v2 54 | with: 55 | tag_name: latest 56 | name: OSDXMB Beta Build 57 | body: | 58 | ⚠️ This is an automatically generated build from the latest commit on the `main` branch. 59 | 60 | It may include **untested** or **experimental** changes. 61 | 62 | Always prefer a stable release for production use. 63 | files: release/OSDXMB.zip 64 | draft: false 65 | prerelease: true 66 | env: 67 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 68 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.rsuser 8 | *.suo 9 | *.user 10 | *.userosscache 11 | *.sln.docstates 12 | 13 | # User-specific files (MonoDevelop/Xamarin Studio) 14 | *.userprefs 15 | 16 | # Mono auto generated files 17 | mono_crash.* 18 | 19 | # Build results 20 | [Dd]ebug/ 21 | [Dd]ebugPublic/ 22 | [Rr]elease/ 23 | [Rr]eleases/ 24 | x64/ 25 | x86/ 26 | [Ww][Ii][Nn]32/ 27 | [Aa][Rr][Mm]/ 28 | [Aa][Rr][Mm]64/ 29 | bld/ 30 | [Oo]bj/ 31 | [Ll]og/ 32 | [Ll]ogs/ 33 | 34 | # Visual Studio 2015/2017 cache/options directory 35 | .vs/ 36 | # Uncomment if you have tasks that create the project's static files in wwwroot 37 | #wwwroot/ 38 | 39 | # Visual Studio 2017 auto generated files 40 | Generated\ Files/ 41 | 42 | # MSTest test Results 43 | [Tt]est[Rr]esult*/ 44 | [Bb]uild[Ll]og.* 45 | 46 | # NUnit 47 | *.VisualState.xml 48 | TestResult.xml 49 | nunit-*.xml 50 | 51 | # Build Results of an ATL Project 52 | [Dd]ebugPS/ 53 | [Rr]eleasePS/ 54 | dlldata.c 55 | 56 | # Benchmark Results 57 | BenchmarkDotNet.Artifacts/ 58 | 59 | # .NET Core 60 | project.lock.json 61 | project.fragment.lock.json 62 | artifacts/ 63 | 64 | # ASP.NET Scaffolding 65 | ScaffoldingReadMe.txt 66 | 67 | # StyleCop 68 | StyleCopReport.xml 69 | 70 | # Files built by Visual Studio 71 | *_i.c 72 | *_p.c 73 | *_h.h 74 | *.ilk 75 | *.meta 76 | *.obj 77 | *.iobj 78 | *.pch 79 | *.pdb 80 | *.ipdb 81 | *.pgc 82 | *.pgd 83 | *.rsp 84 | # but not Directory.Build.rsp, as it configures directory-level build defaults 85 | !Directory.Build.rsp 86 | *.sbr 87 | *.tlb 88 | *.tli 89 | *.tlh 90 | *.tmp 91 | *.tmp_proj 92 | *_wpftmp.csproj 93 | *.log 94 | *.tlog 95 | *.vspscc 96 | *.vssscc 97 | .builds 98 | *.pidb 99 | *.svclog 100 | *.scc 101 | 102 | # Chutzpah Test files 103 | _Chutzpah* 104 | 105 | # Visual C++ cache files 106 | ipch/ 107 | *.aps 108 | *.ncb 109 | *.opendb 110 | *.opensdf 111 | *.sdf 112 | *.cachefile 113 | *.VC.db 114 | *.VC.VC.opendb 115 | 116 | # Visual Studio profiler 117 | *.psess 118 | *.vsp 119 | *.vspx 120 | *.sap 121 | 122 | # Visual Studio Trace Files 123 | *.e2e 124 | 125 | # TFS 2012 Local Workspace 126 | $tf/ 127 | 128 | # Guidance Automation Toolkit 129 | *.gpState 130 | 131 | # ReSharper is a .NET coding add-in 132 | _ReSharper*/ 133 | *.[Rr]e[Ss]harper 134 | *.DotSettings.user 135 | 136 | # TeamCity is a build add-in 137 | _TeamCity* 138 | 139 | # DotCover is a Code Coverage Tool 140 | *.dotCover 141 | 142 | # AxoCover is a Code Coverage Tool 143 | .axoCover/* 144 | !.axoCover/settings.json 145 | 146 | # Coverlet is a free, cross platform Code Coverage Tool 147 | coverage*.json 148 | coverage*.xml 149 | coverage*.info 150 | 151 | # Visual Studio code coverage results 152 | *.coverage 153 | *.coveragexml 154 | 155 | # NCrunch 156 | _NCrunch_* 157 | .*crunch*.local.xml 158 | nCrunchTemp_* 159 | 160 | # MightyMoose 161 | *.mm.* 162 | AutoTest.Net/ 163 | 164 | # Web workbench (sass) 165 | .sass-cache/ 166 | 167 | # Installshield output folder 168 | [Ee]xpress/ 169 | 170 | # DocProject is a documentation generator add-in 171 | DocProject/buildhelp/ 172 | DocProject/Help/*.HxT 173 | DocProject/Help/*.HxC 174 | DocProject/Help/*.hhc 175 | DocProject/Help/*.hhk 176 | DocProject/Help/*.hhp 177 | DocProject/Help/Html2 178 | DocProject/Help/html 179 | 180 | # Click-Once directory 181 | publish/ 182 | 183 | # Publish Web Output 184 | *.[Pp]ublish.xml 185 | *.azurePubxml 186 | # Note: Comment the next line if you want to checkin your web deploy settings, 187 | # but database connection strings (with potential passwords) will be unencrypted 188 | *.pubxml 189 | *.publishproj 190 | 191 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 192 | # checkin your Azure Web App publish settings, but sensitive information contained 193 | # in these scripts will be unencrypted 194 | PublishScripts/ 195 | 196 | # NuGet Packages 197 | *.nupkg 198 | # NuGet Symbol Packages 199 | *.snupkg 200 | # The packages folder can be ignored because of Package Restore 201 | **/[Pp]ackages/* 202 | # except build/, which is used as an MSBuild target. 203 | !**/[Pp]ackages/build/ 204 | # Uncomment if necessary however generally it will be regenerated when needed 205 | #!**/[Pp]ackages/repositories.config 206 | # NuGet v3's project.json files produces more ignorable files 207 | *.nuget.props 208 | *.nuget.targets 209 | 210 | # Microsoft Azure Build Output 211 | csx/ 212 | *.build.csdef 213 | 214 | # Microsoft Azure Emulator 215 | ecf/ 216 | rcf/ 217 | 218 | # Windows Store app package directories and files 219 | AppPackages/ 220 | BundleArtifacts/ 221 | Package.StoreAssociation.xml 222 | _pkginfo.txt 223 | *.appx 224 | *.appxbundle 225 | *.appxupload 226 | 227 | # Visual Studio cache files 228 | # files ending in .cache can be ignored 229 | *.[Cc]ache 230 | # but keep track of directories ending in .cache 231 | !?*.[Cc]ache/ 232 | 233 | # Others 234 | ClientBin/ 235 | ~$* 236 | *~ 237 | *.dbmdl 238 | *.dbproj.schemaview 239 | *.jfm 240 | *.pfx 241 | *.publishsettings 242 | orleans.codegen.cs 243 | 244 | # Including strong name files can present a security risk 245 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 246 | #*.snk 247 | 248 | # Since there are multiple workflows, uncomment next line to ignore bower_components 249 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 250 | #bower_components/ 251 | 252 | # RIA/Silverlight projects 253 | Generated_Code/ 254 | 255 | # Backup & report files from converting an old project file 256 | # to a newer Visual Studio version. Backup files are not needed, 257 | # because we have git ;-) 258 | _UpgradeReport_Files/ 259 | Backup*/ 260 | UpgradeLog*.XML 261 | UpgradeLog*.htm 262 | ServiceFabricBackup/ 263 | *.rptproj.bak 264 | 265 | # SQL Server files 266 | *.mdf 267 | *.ldf 268 | *.ndf 269 | 270 | # Business Intelligence projects 271 | *.rdl.data 272 | *.bim.layout 273 | *.bim_*.settings 274 | *.rptproj.rsuser 275 | *- [Bb]ackup.rdl 276 | *- [Bb]ackup ([0-9]).rdl 277 | *- [Bb]ackup ([0-9][0-9]).rdl 278 | 279 | # Microsoft Fakes 280 | FakesAssemblies/ 281 | 282 | # GhostDoc plugin setting file 283 | *.GhostDoc.xml 284 | 285 | # Node.js Tools for Visual Studio 286 | .ntvs_analysis.dat 287 | node_modules/ 288 | 289 | # Visual Studio 6 build log 290 | *.plg 291 | 292 | # Visual Studio 6 workspace options file 293 | *.opt 294 | 295 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 296 | *.vbw 297 | 298 | # Visual Studio 6 auto-generated project file (contains which files were open etc.) 299 | *.vbp 300 | 301 | # Visual Studio 6 workspace and project file (working project files containing files to include in project) 302 | *.dsw 303 | *.dsp 304 | 305 | # Visual Studio 6 technical files 306 | *.ncb 307 | *.aps 308 | 309 | # Visual Studio LightSwitch build output 310 | **/*.HTMLClient/GeneratedArtifacts 311 | **/*.DesktopClient/GeneratedArtifacts 312 | **/*.DesktopClient/ModelManifest.xml 313 | **/*.Server/GeneratedArtifacts 314 | **/*.Server/ModelManifest.xml 315 | _Pvt_Extensions 316 | 317 | # Paket dependency manager 318 | .paket/paket.exe 319 | paket-files/ 320 | 321 | # FAKE - F# Make 322 | .fake/ 323 | 324 | # CodeRush personal settings 325 | .cr/personal 326 | 327 | # Python Tools for Visual Studio (PTVS) 328 | __pycache__/ 329 | *.pyc 330 | 331 | # Cake - Uncomment if you are using it 332 | # tools/** 333 | # !tools/packages.config 334 | 335 | # Tabs Studio 336 | *.tss 337 | 338 | # Telerik's JustMock configuration file 339 | *.jmconfig 340 | 341 | # BizTalk build output 342 | *.btp.cs 343 | *.btm.cs 344 | *.odx.cs 345 | *.xsd.cs 346 | 347 | # OpenCover UI analysis results 348 | OpenCover/ 349 | 350 | # Azure Stream Analytics local run output 351 | ASALocalRun/ 352 | 353 | # MSBuild Binary and Structured Log 354 | *.binlog 355 | 356 | # NVidia Nsight GPU debugger configuration file 357 | *.nvuser 358 | 359 | # MFractors (Xamarin productivity tool) working folder 360 | .mfractor/ 361 | 362 | # Local History for Visual Studio 363 | .localhistory/ 364 | 365 | # Visual Studio History (VSHistory) files 366 | .vshistory/ 367 | 368 | # BeatPulse healthcheck temp database 369 | healthchecksdb 370 | 371 | # Backup folder for Package Reference Convert tool in Visual Studio 2017 372 | MigrationBackup/ 373 | 374 | # Ionide (cross platform F# VS Code tools) working folder 375 | .ionide/ 376 | 377 | # Fody - auto-generated XML schema 378 | FodyWeavers.xsd 379 | 380 | # VS Code files for those working on multiple tools 381 | .vscode/* 382 | !.vscode/settings.json 383 | !.vscode/tasks.json 384 | !.vscode/launch.json 385 | !.vscode/extensions.json 386 | *.code-workspace 387 | 388 | # Local History for Visual Studio Code 389 | .history/ 390 | 391 | # Windows Installer files from build outputs 392 | *.cab 393 | *.msi 394 | *.msix 395 | *.msm 396 | *.msp 397 | 398 | # JetBrains Rider 399 | *.sln.iml 400 | 401 | POPS/ 402 | DVD/ 403 | CD/ 404 | bin/CFG/neutrino.cfg 405 | bin/CFG/pops.cfg 406 | bin/CFG/main.cfg 407 | bin/*.elf 408 | bin/**/log.txt 409 | !bin/OSDXMB.ELF 410 | # exclude hidden macos files 411 | .* 412 | !.gitignore 413 | !.editorconfig 414 | !.github 415 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OSD-XMB 2 | This is a User Interface for the PS2 resembling the PS3/PSP XMB Style developed by HiroTex, 3 | made on [Athena Env'](https://github.com/DanielSant0s/AthenaEnv) by DanielSant0s, and inspired by the [XtremeEliteBoot+](http://www.hwc.nat.cu/ps2-vault/hwc-projects/xebplus/) 4 | dashboard by Howling Wolf & Chelsea. 5 | 6 | ## Features 7 | 8 | - Plugin System where you can make your own plugins to show items on the 9 | dashboard. 10 | 11 | - **Launch PS2 games from USB Drive or MMCE**: 12 | - The App will automatically list all ISO format games that are on your 13 | "DVD/" or "CD/" folders at the root of your device, on the "Playstation 2" folder. 14 | You can customize your preferred settings for your games if you open the 15 | "Option" menu while highlighting the game and select "Information". 16 | Remember to use the confirmation button to save changes. 17 | The "Show Logo" and "Show Debug Colors" can be set globally for all games 18 | on the "Game Settings" section. 19 | 20 | - **Launch PS2 games in HDL Format**: 21 | - Games installed with HD Loader will be automatically listed on the 22 | "Playstation 2" folder. You can set their Game IDs on the "neutrino.cfg" file. 23 | 24 | - **Launch PS1 games from USB Drive**: 25 | - The app will automatically scan your POPS folder on the root of your USB Drive 26 | to list all the .VCD files on the "Playstation 1" folder. 27 | The name of the VCD will be the game's name. 28 | If no ELF for the VCD is found, it will be automatically created. 29 | You can set several POPS special settings the same way the PS2 per-game settings 30 | are set, by using the Options Menu for each game. 31 | More global options are set on the "Game Settings" section. 32 | 33 | - **Launch PS1 and PS2 games from Discs**: 34 | - The App will automatically recognize if there is a PS1 CD, PS1 CDDA, PS2 CD or 35 | PS2 DVD in the disctray and highlight it automatically if you're idle on the 36 | Game category. 37 | You can add ".cfg" files on the "CFG" folder with the Item "Title=Game Name" 38 | to display Customized Game Titles on this Item. 39 | 40 | - **Execute ELFs**: 41 | - You can execute custom ELFs by the use of Plugins, or using the File Explorer. 42 | The File Explorer will launch any ELF without arguments, but you can make custom 43 | plugins to launch Elfs with custom arguments. 44 | 45 | ## Instructions 46 | 47 | - Place the OSDXMB folder at the root of your USB Drive and launch the "OSDXMB.ELF". 48 | 49 | ## Credits and Special Thanks 50 | Inspired by: XtremeEliteBoot by Howling Wolf & Chelsea. 51 | 52 | Based on: AthenaEnv by DanielSant0s. 53 | 54 | Code Contributors: [AKuHAK](https://github.com/AKuHAK) 55 | 56 | Localization contributors: 57 | - nuno6573 (Portuguese) 58 | - PannaSalmone and Okeanos (Italian). 59 | - LOWbster (German). 60 | 61 | Special thanks to: 62 | - krHACKen for his [POPStarter](https://bitbucket.org/ShaolinAssassin/popstarter-documentation-stuff/wiki/Home) project. 63 | - rickgaiser for his [neutrino](https://github.com/rickgaiser/neutrino) app. 64 | - sync-on-luma for his original [Neutrino Plugin](https://github.com/sync-on-luma/xebplus-neutrino-loader-plugin) for XtremeEliteBoot and general feedback. 65 | - xGamereqPL for testing and general feedback. 66 | - BlackNinja for testing and general feedback. 67 | - Pmp174 for the Boot sequence feedback. 68 | - You! Thanks for using the app. 69 | -------------------------------------------------------------------------------- /bin/APPS/OPL/OPNPS2LD.ELF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/OPL/OPNPS2LD.ELF -------------------------------------------------------------------------------- /bin/APPS/OPL/ico.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/OPL/ico.png -------------------------------------------------------------------------------- /bin/APPS/neutrino/config/bsd-ata.toml: -------------------------------------------------------------------------------- 1 | # Name of loaded config, to show to user 2 | name = "ATA HDD BDM driver" 3 | 4 | # Drivers this driver depends on (config file must exist) 5 | depends = ["i_bdm", "i_dev9_ns"] 6 | 7 | # Modules to load 8 | [[module]] 9 | file = "ata_bd.irx" 10 | env = ["LE", "EE"] 11 | 12 | # Modules of the game that are faked/blocked 13 | [[fake]] 14 | file = "ATAD.IRX" 15 | name = "atad_driver" 16 | version = 0x0207 17 | startrv = 0 # 0=RESIDENT_END, 1=NO_RESIDENT_END, 2=REMOVABLE_END 18 | -------------------------------------------------------------------------------- /bin/APPS/neutrino/config/bsd-ilink.toml: -------------------------------------------------------------------------------- 1 | # Name of loaded config, to show to user 2 | name = "iLink/FireWire/IEEE1394 BDM driver" 3 | 4 | # Drivers this driver depends on (config file must exist) 5 | depends = ["i_bdm"] 6 | 7 | # Modules to load 8 | [[module]] 9 | file = "iLinkman.irx" 10 | env = ["LE", "EE"] 11 | [[module]] 12 | file = "IEEE1394_bd_mini.irx" 13 | env = ["LE", "EE"] 14 | 15 | # Modules of the game that are faked/blocked 16 | [[fake]] 17 | file = "ILINK.IRX" 18 | name = "iLINK_HW_Manager" # is this correct? 19 | version = 0x0202 # is this correct? 20 | startrv = 2 # 0=RESIDENT_END, 1=NO_RESIDENT_END, 2=REMOVABLE_END # is this correct? 21 | -------------------------------------------------------------------------------- /bin/APPS/neutrino/config/bsd-mmce.toml: -------------------------------------------------------------------------------- 1 | # Name of loaded config, to show to user 2 | name = "MMCEDRV" 3 | 4 | [[module]] 5 | file = "iomanX.irx" 6 | env = ["LE"] 7 | [[module]] 8 | file = "fileXio.irx" 9 | env = ["LE"] 10 | [[module]] 11 | file = "mmceman.irx" 12 | env = ["LE"] 13 | 14 | [[module]] 15 | file = "mmcefhi.irx" 16 | func = "FHI_FILEID" 17 | env = ["EE"] 18 | -------------------------------------------------------------------------------- /bin/APPS/neutrino/config/bsd-mx4sio.toml: -------------------------------------------------------------------------------- 1 | # Name of loaded config, to show to user 2 | name = "MX4SIO in MC2 BDM driver" 3 | 4 | # Drivers this driver depends on (config file must exist) 5 | depends = ["i_bdm"] 6 | 7 | # Modules to load 8 | [[module]] 9 | file = "mx4sio_bd_mini.irx" 10 | env = ["LE", "EE"] 11 | -------------------------------------------------------------------------------- /bin/APPS/neutrino/config/bsd-udpbd-hdd.toml: -------------------------------------------------------------------------------- 1 | # Name of loaded config, to show to user 2 | name = "UDPBD BDM driver with HDD support" 3 | 4 | # Drivers this driver depends on (config file must exist) 5 | depends = ["i_bdm", "i_dev9_ns"] 6 | 7 | # Modules to load 8 | [[module]] 9 | file = "smap_udpbd.irx" 10 | args = ["ip=192.168.1.10"] 11 | env = ["LE", "EE"] 12 | 13 | # Faking strategy 14 | # --------------- 15 | # To allow games to use hdd: 16 | # - dev9 (no-shutdown) is resident, and can be used by hdd modules 17 | # - all networking modules are faked (we hope they are not used) 18 | [[fake]] 19 | file = "ENT_SMAP.IRX" 20 | name = "ent_smap" 21 | version = 0x021f 22 | loadrv = 0 # 0=ok, -xxx=error code (module not loaded) 23 | startrv = 2 # 0=RESIDENT_END, 1=NO_RESIDENT_END, 2=REMOVABLE_END 24 | [[fake]] 25 | file = "SMAP.IRX" 26 | name = "INET_SMAP_driver" 27 | version = 0x0219 28 | loadrv = 0 # 0=ok, -xxx=error code (module not loaded) 29 | startrv = 2 # 0=RESIDENT_END, 1=NO_RESIDENT_END, 2=REMOVABLE_END 30 | -------------------------------------------------------------------------------- /bin/APPS/neutrino/config/bsd-udpbd.toml: -------------------------------------------------------------------------------- 1 | # Name of loaded config, to show to user 2 | name = "UDPBD BDM driver" 3 | 4 | # Drivers this driver depends on (config file must exist) 5 | depends = ["i_bdm", "i_dev9_hidden"] 6 | 7 | # Modules to load 8 | [[module]] 9 | file = "smap_udpbd.irx" 10 | args = ["ip=192.168.1.10"] 11 | env = ["LE", "EE"] 12 | 13 | # Faking strategy 14 | # --------------- 15 | # To prevent games from trying to use networing: 16 | # - we try to simulate that there is no dev9 hardware present: 17 | # - dev9 returns NO_RESIDENT_END, module is hidden 18 | # - all modules depending on dev9 fail to load becouse dev9 is not resident 19 | [[fake]] 20 | file = "ENT_SMAP.IRX" 21 | name = "ent_smap" 22 | version = 0x021f 23 | loadrv = -200 # KE_LINKERR becouse dev9 does not exist 24 | startrv = 1 # 0=RESIDENT_END, 1=NO_RESIDENT_END, 2=REMOVABLE_END 25 | [[fake]] 26 | file = "SMAP.IRX" 27 | name = "INET_SMAP_driver" 28 | version = 0x0219 29 | loadrv = -200 # KE_LINKERR becouse dev9 does not exist 30 | startrv = 1 # 0=RESIDENT_END, 1=NO_RESIDENT_END, 2=REMOVABLE_END 31 | -------------------------------------------------------------------------------- /bin/APPS/neutrino/config/bsd-usb-debug.toml: -------------------------------------------------------------------------------- 1 | # Name of loaded config, to show to user 2 | name = "USB BDM driver - with UDPTTY debugging" 3 | 4 | # Drivers this driver depends on (config file must exist) 5 | depends = ["i_bdm", "i_dev9_hidden"] 6 | 7 | # Modules to load 8 | [[module]] 9 | file = "smap_udptty.irx" 10 | args = ["ip=192.168.1.10"] 11 | env = ["LE", "EE"] 12 | [[module]] 13 | file = "usbd_mini.irx" 14 | # Modules that emulate the sceCdRead function must operate at a higher 15 | # priority than the highest possible game priority. 16 | # 17 | # If the priority is lower (higher number) then some games will wait in 18 | # and endless loop for data, but the waiting thread will then cause the 19 | # data to never be processed. 20 | # 21 | # This causes some games to 'need' MODE2 (sync reads) to work. 22 | # 23 | # Supported parameters: 24 | # - dev = maxDevices 25 | # - ed = maxEndpoints 26 | # - gtd = maxTransfDesc 27 | # - itd = maxIsoTransfDesc 28 | # - ioreq = maxIoReqs 29 | # - conf = maxStaticDescSize 30 | # - hub = maxHubDevices 31 | # - port = maxPortsPerHub 32 | # - thpri = hcdThreadPrio,cbThreadPrio 33 | # USBD defaults 34 | #args = ["dev=32", "ed=64", "gtd=128", "itd=128", "hub=8", "port=8", "thpri=7,8"] 35 | # USBD defaults for 'mini' driver 36 | args = ["thpri=7,8"] 37 | # Save 13KiB IOP RAM extra compared to 'mini' 38 | #args = ["dev=4", "ed=8", "gtd=16", "itd=16", "hub=2", "port=4", "thpri=7,8"] 39 | env = ["LE", "EE"] 40 | [[module]] 41 | file = "usbmass_bd_mini.irx" 42 | env = ["LE", "EE"] 43 | 44 | # Modules of the game that are faked/blocked 45 | [[fake]] 46 | file = "USBD.IRX" 47 | name = "USB_driver" 48 | version = 0x0204 49 | startrv = 2 # 0=RESIDENT_END, 1=NO_RESIDENT_END, 2=REMOVABLE_END 50 | 51 | # Faking strategy 52 | # --------------- 53 | # To prevent games from trying to use networing: 54 | # - we try to simulate that there is no dev9 hardware present: 55 | # - dev9 returns NO_RESIDENT_END, module is hidden 56 | # - all modules depending on dev9 fail to load becouse dev9 is not resident 57 | [[fake]] 58 | file = "ENT_SMAP.IRX" 59 | name = "ent_smap" 60 | version = 0x021f 61 | loadrv = -200 # KE_LINKERR becouse dev9 does not exist 62 | startrv = 1 # 0=RESIDENT_END, 1=NO_RESIDENT_END, 2=REMOVABLE_END 63 | [[fake]] 64 | file = "SMAP.IRX" 65 | name = "INET_SMAP_driver" 66 | version = 0x0219 67 | loadrv = -200 # KE_LINKERR becouse dev9 does not exist 68 | startrv = 1 # 0=RESIDENT_END, 1=NO_RESIDENT_END, 2=REMOVABLE_END 69 | -------------------------------------------------------------------------------- /bin/APPS/neutrino/config/bsd-usb.toml: -------------------------------------------------------------------------------- 1 | # Name of loaded config, to show to user 2 | name = "USB BDM driver" 3 | 4 | # Drivers this driver depends on (config file must exist) 5 | depends = ["i_bdm"] 6 | 7 | # Modules to load 8 | [[module]] 9 | file = "usbd_mini.irx" 10 | # Modules that emulate the sceCdRead function must operate at a higher 11 | # priority than the highest possible game priority. 12 | # 13 | # If the priority is lower (higher number) then some games will wait in 14 | # and endless loop for data, but the waiting thread will then cause the 15 | # data to never be processed. 16 | # 17 | # This causes some games to 'need' MODE2 (sync reads) to work. 18 | # 19 | # Supported parameters: 20 | # - dev = maxDevices 21 | # - ed = maxEndpoints 22 | # - gtd = maxTransfDesc 23 | # - itd = maxIsoTransfDesc 24 | # - ioreq = maxIoReqs 25 | # - conf = maxStaticDescSize 26 | # - hub = maxHubDevices 27 | # - port = maxPortsPerHub 28 | # - thpri = hcdThreadPrio,cbThreadPrio 29 | # USBD defaults 30 | #args = ["dev=32", "ed=64", "gtd=128", "itd=128", "hub=8", "port=8", "thpri=7,8"] 31 | # USBD defaults for 'mini' driver 32 | args = ["thpri=7,8"] 33 | # Save 13KiB IOP RAM extra compared to 'mini' 34 | #args = ["dev=4", "ed=8", "gtd=16", "itd=16", "hub=2", "port=4", "thpri=7,8"] 35 | env = ["LE", "EE"] 36 | [[module]] 37 | file = "usbmass_bd_mini.irx" 38 | env = ["LE", "EE"] 39 | 40 | # Modules of the game that are faked/blocked 41 | [[fake]] 42 | file = "USBD.IRX" 43 | name = "USB_driver" 44 | version = 0x0204 45 | startrv = 2 # 0=RESIDENT_END, 1=NO_RESIDENT_END, 2=REMOVABLE_END 46 | -------------------------------------------------------------------------------- /bin/APPS/neutrino/config/bsdfs-bd.toml: -------------------------------------------------------------------------------- 1 | # Name of loaded config, to show to user 2 | name = "Block Device filesystem driver" 3 | 4 | # Drivers this driver depends on (config file must exist) 5 | #depends = ["i_bdm"] 6 | 7 | # Modules to load in load environment 8 | [[module]] 9 | file = "bdfs.irx" 10 | env = ["LE"] 11 | 12 | # Modules to load in emulation environment 13 | [[module]] 14 | file = "fhi_bd.irx" 15 | func = "FHI_BD" 16 | env = ["EE"] 17 | -------------------------------------------------------------------------------- /bin/APPS/neutrino/config/bsdfs-exfat.toml: -------------------------------------------------------------------------------- 1 | # Name of loaded config, to show to user 2 | name = "exFat filesystem driver" 3 | 4 | # Drivers this driver depends on (config file must exist) 5 | #depends = ["i_bdm"] 6 | 7 | # Modules to load in load environment 8 | [[module]] 9 | file = "bdmfs_fatfs.irx" 10 | env = ["LE"] 11 | 12 | # Modules to load in emulation environment 13 | [[module]] 14 | file = "fhi_bd_defrag.irx" 15 | func = "FHI_BD_DEFRAG" 16 | env = ["EE"] 17 | -------------------------------------------------------------------------------- /bin/APPS/neutrino/config/bsdfs-hdl.toml: -------------------------------------------------------------------------------- 1 | # Name of loaded config, to show to user 2 | name = "HDLoader filesystem driver" 3 | 4 | # Drivers this driver depends on (config file must exist) 5 | #depends = ["i_bdm"] 6 | 7 | # Modules to load in load environment 8 | [[module]] 9 | file = "ps2hdd-bdm.irx" 10 | args = ["-o", "4", "-n", "20"] 11 | env = ["LE"] 12 | [[module]] 13 | file = "hdlfs.irx" 14 | env = ["LE"] 15 | 16 | # Modules to load in emulation environment 17 | [[module]] 18 | file = "fhi_bd_defrag.irx" 19 | func = "FHI_BD_DEFRAG" 20 | env = ["EE"] 21 | -------------------------------------------------------------------------------- /bin/APPS/neutrino/config/emu-ata-file.toml: -------------------------------------------------------------------------------- 1 | # Name of loaded config, to show to user 2 | name = "ATA emulation using image file" 3 | 4 | # Modules to load 5 | [[module]] 6 | file = "atad_emu.irx" 7 | env = ["EE"] 8 | 9 | # Modules of the game that are faked/blocked 10 | [[fake]] 11 | file = "ATAD.IRX" 12 | name = "atad_driver" 13 | version = 0x0207 14 | startrv = 0 # 0=RESIDENT_END, 1=NO_RESIDENT_END, 2=REMOVABLE_END 15 | 16 | # For booting rom0:OSDSYS, block the following?: 17 | # - rom0:ATAD (dev9 + atad combined driver) 18 | # - HDDLOAD 19 | # 20 | # What do these libraries do? Also block?: 21 | # - rom0:XDEV9 ? 22 | # - rom0:XDEV9SERV ? 23 | # - rom0:PS1ID ? 24 | # - rom0:PS1VERE ? 25 | # - rom1:DVDIDE ? 26 | -------------------------------------------------------------------------------- /bin/APPS/neutrino/config/emu-dvd-esr.toml: -------------------------------------------------------------------------------- 1 | # Name of loaded config, to show to user 2 | name = "Builtin DVD drive with ESR patched disk" 3 | 4 | # Modules to load 5 | [[module]] 6 | file = "cdvdman_esr1.irx" 7 | env = ["LE", "EE"] 8 | [[module]] 9 | file = "cdvdman_esr2.irx" 10 | env = ["LE", "EE"] 11 | -------------------------------------------------------------------------------- /bin/APPS/neutrino/config/emu-dvd-file.toml: -------------------------------------------------------------------------------- 1 | # Name of loaded config, to show to user 2 | name = "CD/DVD emulation using image file" 3 | 4 | # Modules to load 5 | [[module]] 6 | file = "cdvdman_emu.irx" 7 | ioprp = "CDVDMAN" 8 | env = ["EE"] 9 | [[module]] 10 | file = "cdvdfsv.irx" 11 | ioprp = "CDVDFSV" 12 | env = ["EE"] 13 | 14 | # Modules of the game that are faked/blocked 15 | [[fake]] 16 | file = "CDVDFSV.IRX" 17 | name = "cdvd_ee_driver" 18 | #unload = true // FIXME this is broken, can be tested with Jak X 19 | version = 0x0202 20 | startrv = 2 # 0=RESIDENT_END, 1=NO_RESIDENT_END, 2=REMOVABLE_END 21 | [[fake]] 22 | file = "CDVDSTM.IRX" 23 | name = "cdvd_st_driver" 24 | version = 0x0202 25 | startrv = 2 # 0=RESIDENT_END, 1=NO_RESIDENT_END, 2=REMOVABLE_END 26 | -------------------------------------------------------------------------------- /bin/APPS/neutrino/config/emu-mc-file.toml: -------------------------------------------------------------------------------- 1 | # Name of loaded config, to show to user 2 | name = "MC emulation using image file" 3 | 4 | # Modules to load 5 | [[module]] 6 | file = "mc_emu.irx" 7 | env = ["EE"] 8 | -------------------------------------------------------------------------------- /bin/APPS/neutrino/config/i_bdm.toml: -------------------------------------------------------------------------------- 1 | # Name of loaded config, to show to user 2 | name = "Block Device Manager" 3 | 4 | # Modules to load in load environment 5 | [[module]] 6 | file = "bdm.irx" 7 | env = ["LE"] 8 | [[module]] 9 | file = "iomanX.irx" 10 | env = ["LE"] 11 | [[module]] 12 | file = "fileXio.irx" 13 | env = ["LE"] 14 | -------------------------------------------------------------------------------- /bin/APPS/neutrino/config/i_dev9_hidden.toml: -------------------------------------------------------------------------------- 1 | # Name of loaded config, to show to user 2 | name = "DEV9 hidden driver" 3 | 4 | # Modules to load 5 | [[module]] 6 | file = "dev9_hidden.irx" # hidden version to hide from the game 7 | env = ["LE", "EE"] 8 | 9 | # Modules of the game that are faked/blocked 10 | [[fake]] 11 | file = "DEV9.IRX" 12 | name = "dev9" 13 | version = 0x0208 14 | loadrv = 0 # 0=ok, -xxx=error code (module not loaded) 15 | startrv = 1 # 0=RESIDENT_END, 1=NO_RESIDENT_END, 2=REMOVABLE_END 16 | -------------------------------------------------------------------------------- /bin/APPS/neutrino/config/i_dev9_ns.toml: -------------------------------------------------------------------------------- 1 | # Name of loaded config, to show to user 2 | name = "DEV9 no-shutdown driver" 3 | 4 | # Modules to load 5 | [[module]] 6 | file = "dev9_ns.irx" # no-shutdown version, to prevent games shutting down the dev9 7 | env = ["LE", "EE"] 8 | 9 | # Modules of the game that are faked/blocked 10 | [[fake]] 11 | file = "DEV9.IRX" 12 | name = "dev9" 13 | version = 0x0208 14 | startrv = 0 # 0=RESIDENT_END, 1=NO_RESIDENT_END, 2=REMOVABLE_END 15 | -------------------------------------------------------------------------------- /bin/APPS/neutrino/config/rc-uya.toml: -------------------------------------------------------------------------------- 1 | # Name of loaded config, to show to user 2 | name = "Patches for Ratchet Clank 3 / Up Your Arsenal - ONLINE!" 3 | 4 | # For testing 5 | #default_bsd = "ata" 6 | #default_dvd = "mass:DVD/Ratchet Clank - Up Your Arsenal (U).iso" 7 | 8 | # Boot directly into online menu 9 | default_elf = "cdrom0:I5BOOTN.ELF;1" 10 | 11 | # Load patch module that fixes a game bug 12 | [[module]] 13 | file = "patch_rc_uya.irx" 14 | env = ["EE"] 15 | -------------------------------------------------------------------------------- /bin/APPS/neutrino/config/system.toml: -------------------------------------------------------------------------------- 1 | # Name of loaded config, to show to user 2 | name = "System settings and drivers" 3 | 4 | # Default argument values 5 | # Overwrite these from the command line 6 | default_bsd = "no" 7 | default_bsdfs = "exfat" 8 | default_dvd = "no" 9 | #default_ata0 = "mass:mydrive0.bin" 10 | #default_ata0id = "mass:mydrive0_id.bin" 11 | #default_ata1 = "mass:mydrive1.bin" 12 | #default_mc0 = "mass:mymc0.bin" 13 | #default_mc1 = "mass:mymc1.bin" 14 | default_elf = "auto" 15 | #default_mt = "dvd" 16 | #default_gc = "12" 17 | #default_gsm = "fp" 18 | #default_cfg = "" 19 | default_dbc = false 20 | default_logo = false 21 | 22 | # EE_CORE configuration 23 | eecore_elf = "ee_core.elf" 24 | eecore_mod_base = 0x95000 25 | #eecore_mod_base = 0xA7000 26 | 27 | # Select the number of sectors for the FS buffer 28 | # A small value can increase game compatibility 29 | # A large value can increase performce 30 | # Min=2, Max=128, Default=8 31 | cdvdman_fs_sectors = 8 32 | 33 | # Override the 8-byte string returned by: 34 | # - sceCdRI 35 | # This string is also used by: 36 | # - sceCdReadGUID 37 | # - sceCdReadModelID 38 | # 39 | # This string is used (for instance) by the sony network configuration 40 | # to verify if the config belongs to the specific console. 41 | # 42 | #ilink_id = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00] 43 | 44 | # Use the 5-byte string returned by: 45 | # - sceCdReadDiskID 46 | #disk_id = [0x00, 0x00, 0x00, 0x00, 0x00] 47 | 48 | # Modules to load in emulation environment 49 | [[module]] 50 | file = "eesync.irx" 51 | ioprp = "EESYNC" 52 | env = ["EE"] 53 | [[module]] 54 | file = "imgdrv.irx" 55 | func = "IMGDRV" # used by EECORE durion IOP reboot 56 | env = ["EE"] 57 | # By default the system rom0:UDNL will be used, but this can be overruled here 58 | # Some games (like Auto Modellista) don't work over USB with the default UDNL. 59 | [[module]] 60 | file = "udnl.irx" 61 | #file = "udnl-t300.irx" 62 | func = "UDNL" # used by EECORE durion IOP reboot 63 | env = ["EE"] 64 | [[module]] 65 | file = "fakemod.irx" 66 | func = "FAKEMOD" # loaded last, so we don't fake our own modules 67 | env = ["EE"] 68 | 69 | #[[module]] 70 | #file = "patch_freemem.irx" 71 | #args = ["512", "X"] # "X" = block above limit (default no blocking), number is limit in KiB (default 512KiB) 72 | #env = ["EE"] 73 | 74 | #[[module]] 75 | #file = "memcheck.irx" 76 | #env = ["EE"] 77 | 78 | #[[module]] 79 | #file = "patch_membo.irx" 80 | #env = ["EE"] 81 | 82 | # It's best to load this module last (bottom of bsd-usb.toml for instance) 83 | #[[module]] 84 | #file = "gapfill.irx" 85 | #env = ["EE"] 86 | -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/IEEE1394_bd_mini.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/IEEE1394_bd_mini.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/ata_bd.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/ata_bd.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/atad_emu.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/atad_emu.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/bdfs.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/bdfs.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/bdm.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/bdm.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/bdmfs_fatfs.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/bdmfs_fatfs.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/cdvdfsv.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/cdvdfsv.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/cdvdman_emu.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/cdvdman_emu.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/cdvdman_esr1.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/cdvdman_esr1.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/cdvdman_esr2.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/cdvdman_esr2.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/dev9_hidden.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/dev9_hidden.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/dev9_ns.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/dev9_ns.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/ee_core.elf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/ee_core.elf -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/eesync.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/eesync.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/fakemod.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/fakemod.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/fhi_bd.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/fhi_bd.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/fhi_bd_defrag.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/fhi_bd_defrag.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/fileXio.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/fileXio.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/gapfill.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/gapfill.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/hdlfs.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/hdlfs.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/iLinkman.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/iLinkman.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/imgdrv.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/imgdrv.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/iomanX.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/iomanX.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/mc_emu.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/mc_emu.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/memcheck.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/memcheck.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/mmcefhi.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/mmcefhi.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/mmceman.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/mmceman.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/mx4sio_bd_mini.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/mx4sio_bd_mini.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/patch_freemem.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/patch_freemem.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/patch_membo.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/patch_membo.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/patch_rc_uya.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/patch_rc_uya.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/ps2hdd-bdm.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/ps2hdd-bdm.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/smap_udpbd.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/smap_udpbd.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/smap_udptty.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/smap_udptty.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/udnl-t300.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/udnl-t300.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/udnl.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/udnl.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/usbd_mini.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/usbd_mini.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/usbd_null.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/usbd_null.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/modules/usbmass_bd_mini.irx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/modules/usbmass_bd_mini.irx -------------------------------------------------------------------------------- /bin/APPS/neutrino/neutrino.elf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/neutrino/neutrino.elf -------------------------------------------------------------------------------- /bin/APPS/retroarch/ico.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/retroarch/ico.png -------------------------------------------------------------------------------- /bin/APPS/retroarch/raboot.elf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/APPS/retroarch/raboot.elf -------------------------------------------------------------------------------- /bin/ART/SCUS_941.54_BG.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/ART/SCUS_941.54_BG.PNG -------------------------------------------------------------------------------- /bin/ART/SCUS_941.54_ICO.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/ART/SCUS_941.54_ICO.PNG -------------------------------------------------------------------------------- /bin/ART/SLUS_000.67_ICO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/ART/SLUS_000.67_ICO.png -------------------------------------------------------------------------------- /bin/ART/SLUS_005.94_ICO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/ART/SLUS_005.94_ICO.png -------------------------------------------------------------------------------- /bin/ART/SLUS_008.62_ICO.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/ART/SLUS_008.62_ICO.PNG -------------------------------------------------------------------------------- /bin/ART/SLUS_216.78_BG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/ART/SLUS_216.78_BG.png -------------------------------------------------------------------------------- /bin/ART/SLUS_216.78_ICO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/ART/SLUS_216.78_ICO.png -------------------------------------------------------------------------------- /bin/ART/SLUS_219.91_BG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/ART/SLUS_219.91_BG.png -------------------------------------------------------------------------------- /bin/ART/SLUS_219.91_ICO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/ART/SLUS_219.91_ICO.png -------------------------------------------------------------------------------- /bin/ART/bg_test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/ART/bg_test.png -------------------------------------------------------------------------------- /bin/CFG/PBPX_955.03.cfg: -------------------------------------------------------------------------------- 1 | Title=Gran Turismo 3: A-Spec 2 | gc=5 3 | -------------------------------------------------------------------------------- /bin/CFG/PS1DRV.cfg: -------------------------------------------------------------------------------- 1 | SLPS_000.23=cdrom0:\LADIES.DA;1 2 | SLPS_000.04=cdrom0:\OP\A4OP.STR;1 3 | SLPS_001.13=cdrom0:\NP_ISHI0.SPL;1 4 | SLPS_000.38=cdrom0:\G9_100L.DA;1 5 | SLPS_000.24=cdrom0:\PSXMYST\MYST.CCS;1 6 | SLPS_001.04=cdrom0:\BOZU\BG0B.BIN;1 7 | SCPS_100.02=cdrom0:\PDATA\ATKDAT.CFL;1 8 | SLPS_000.35=cdrom0:\TMD\RX78.TMD;1 9 | SCPS_100.16=cdrom0:\_HA30.STR;1 10 | SCPS_100.87=cdrom0:\SOUND\TOMASON.STR;1 11 | SLPS_000.85=cdrom0:\STORY4_1\4S05B.MKO;1 12 | SLPS_000.22=cdrom0:\FLT\ENTSTAR.STR;1 13 | SLPS_000.89=cdrom0:\XA\TEST3.XAP;1 14 | SLPS_005.49=cdrom0:\STR\DEGI3.STR;1 15 | SLPS_000.51=cdrom0:\THATSPON\LOG.BAK;1 16 | SLPS_000.90=cdrom0:\EISEI\KOMAGUMI.BIN;1 17 | SLPS_000.21=cdrom0:\TITLE\PACHI2BG.TIM;1 18 | SLPS_000.37=cdrom0:\SIM\DAT\RDATWI.BIN;1 19 | SLPS_000.60=cdrom0:\AH1\AH1MAP.MAP;1 20 | SLPS_000.92=cdrom0:\TPC\TORNYA.TPC;1 21 | SLPS_013.83=cdrom0:\zzzzzzzz.dum;1 22 | SCPS_100.09=cdrom0:\EPI_MCH.STR;1 23 | SLPS_001.37=cdrom0:\FJTCERE\H_TAISOH.VHB;1 24 | SLPS_000.01=cdrom0:\OBJ.RRO;1 25 | SLPS_001.03=cdrom0:\MOVIE\VTENNIS.STR;1 26 | SLPS_000.07=cdrom0:\DATA2\QUE184.TIM;1 27 | SLPS_000.48=cdrom0:\DT_GO\GOACC.TIM;1 28 | SLPS_000.65=cdrom0:\CDROM\LASTPHOT\ALL_C.NBN;1 29 | -------------------------------------------------------------------------------- /bin/CFG/PS1VMCGRP.cfg: -------------------------------------------------------------------------------- 1 | # Konami Games 2 | 3 | // Metal Gear Solid 4 | SLUS_005.94=POPS_000.01 5 | SLUS_007.76=POPS_000.01 6 | SLES_013.70=POPS_000.01 7 | SLES_015.06=POPS_000.01 8 | SLES_115.06=POPS_000.01 9 | SLES_015.07=POPS_000.01 10 | SLES_115.07=POPS_000.01 11 | SLES_015.08=POPS_000.01 12 | SLES_115.08=POPS_000.01 13 | SLES_017.34=POPS_000.01 14 | SLES_117.34=POPS_000.01 15 | SCPS_453.17=POPS_000.01 16 | SCPS_453.18=POPS_000.01 17 | SCPS_453.20=POPS_000.01 18 | SCPS_453.21=POPS_000.01 19 | SCPS_453.22=POPS_000.01 20 | SLPM_861.14=POPS_000.01 21 | SLPM_861.15=POPS_000.01 22 | SLPM_861.16=POPS_000.01 23 | SLPM_864.85=POPS_000.01 24 | SLPM_864.86=POPS_000.01 25 | SLPM_874.11=POPS_000.01 26 | SLPM_874.12=POPS_000.01 27 | SLPM_874.13=POPS_000.01 28 | SLPM_870.30=POPS_000.01 29 | SLPM_870.31=POPS_000.01 30 | SLPM_861.11=POPS_000.01 31 | SLPM_861.12=POPS_000.01 32 | SLPM_861.13=POPS_000.01 33 | SLPM_861.11=POPS_000.01 34 | SLPM_861.12=POPS_000.01 35 | SLPM_861.13=POPS_000.01 36 | SCPS_454.12=POPS_000.01 37 | SCPS_454.13=POPS_000.01 38 | SCPS_454.14=POPS_000.01 39 | SLPM_862.47=POPS_000.01 40 | SLPM_862.48=POPS_000.01 41 | SLPM_862.49=POPS_000.01 42 | SLPM_864.70=POPS_000.01 43 | SLPM_864.71=POPS_000.01 44 | SLPM_864.72=POPS_000.01 45 | SLPM_873.24=POPS_000.01 46 | SLPM_873.25=POPS_000.01 47 | SLPM_873.26=POPS_000.01 48 | 49 | // Metal Gear Solid VR Missions 50 | SLES_021.36=POPS_000.01 51 | SLUS_009.57=POPS_000.01 52 | 53 | // Broken Helix 54 | SLES_117.34=POPS_000.01 55 | SLES_008.73=POPS_000.01 56 | SLES_009.62=POPS_000.01 57 | SLPM_860.65=POPS_000.01 58 | 59 | // Castlevania Symphony of the Night 60 | SLUS_000.67=POPS_000.01 61 | SLES_005.24=POPS_000.01 62 | SLPM_860.23=POPS_000.01 63 | SLPM_860.73=POPS_000.01 64 | SLPM_873.28=POPS_000.01 65 | 66 | // Contra: Legacy of War 67 | SLUS_002.88=POPS_000.01 68 | SLES_006.08=POPS_000.01 69 | 70 | // Kensei Sacred Fist 71 | SLUS_006.00=POPS_000.01 72 | SLES_010.81=POPS_000.01 73 | SLPS_005.02=POPS_000.01 74 | 75 | // Azure Dreams 76 | SLUS_006.14=POPS_000.01 77 | SLES_012.19=POPS_000.01 78 | SLPM_860.47=POPS_000.01 79 | SLPM_861.04=POPS_000.01 80 | 81 | // Poy Poy 82 | SLUS_004.86=POPS_000.01 83 | SLES_007.85=POPS_000.01 84 | 85 | // Project Overkill 86 | SLUS_000.45=POPS_000.01 87 | SLES_005.00=POPS_000.01 88 | 89 | // Silent Hill 90 | SLUS_007.07=POPS_000.01 91 | SLES_015.14=POPS_000.01 92 | SCPS_453.80=POPS_000.01 93 | SLPM_861.92=POPS_000.01 94 | SLPM_864.98=POPS_000.01 95 | SLPM_870.29=POPS_000.01 96 | 97 | // Suikoden 98 | SLUS_002.92=POPS_000.01 99 | SLES_005.27=POPS_000.01 100 | 101 | // Vandal Hearts 102 | SLUS_004.47=POPS_000.01 103 | SLES_002.04=POPS_000.01 104 | 105 | // Diver's Dream 106 | SLES_015.35=POPS_000.01 107 | 108 | // GANBARE GOEMON - UCHUU KAIZOKU AKOGINZU 109 | SLPS_002.17=POPS_000.01 110 | SLPM_860.30=POPS_000.01 111 | SLPM_873.27=POPS_000.01 112 | 113 | // Policenauts 114 | SLPS_002.15=POPS_000.01 115 | SLPS_002.16=POPS_000.01 116 | SLPM_860.48=POPS_000.01 117 | SLPM_860.49=POPS_000.01 118 | SLPM_872.90=POPS_000.01 119 | SLPM_872.91=POPS_000.01 120 | SLPS_002.28=POPS_000.01 121 | -------------------------------------------------------------------------------- /bin/CFG/SCES_511.76.cfg: -------------------------------------------------------------------------------- 1 | Title=Disney's Treasure Planet 2 | gc=7 3 | -------------------------------------------------------------------------------- /bin/CFG/SCES_511.77.cfg: -------------------------------------------------------------------------------- 1 | Title=Disney's Treasure Planet 2 | gc=7 3 | -------------------------------------------------------------------------------- /bin/CFG/SCUS_971.46.cfg: -------------------------------------------------------------------------------- 1 | Title=Disney's Treasure Planet 2 | gc=7 3 | -------------------------------------------------------------------------------- /bin/CFG/SLES_548.38.cfg: -------------------------------------------------------------------------------- 1 | Title=Donkey Xote 2 | gc=7 3 | -------------------------------------------------------------------------------- /bin/CFG/SLES_552.42.cfg: -------------------------------------------------------------------------------- 1 | Title=Yakuza 2 2 | gc=5 3 | -------------------------------------------------------------------------------- /bin/CFG/SLUS_205.54.cfg: -------------------------------------------------------------------------------- 1 | Title=Metal Gear Solid 2: Substance 2 | gc=5 3 | -------------------------------------------------------------------------------- /bin/CFG/SLUS_209.09.cfg: -------------------------------------------------------------------------------- 1 | Title=Crash Twinsanity -------------------------------------------------------------------------------- /bin/CFG/SLUS_210.54.cfg: -------------------------------------------------------------------------------- 1 | Title=Disney's Treasure Planet 2 | gc=7 3 | -------------------------------------------------------------------------------- /bin/CFG/SLUS_217.69.cfg: -------------------------------------------------------------------------------- 1 | Title=Yakuza 2 2 | gc=5 3 | -------------------------------------------------------------------------------- /bin/OSDXMB.ELF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/OSDXMB.ELF -------------------------------------------------------------------------------- /bin/PLG/gme_0_xExplorer.json: -------------------------------------------------------------------------------- 1 | { 2 | "Name": [ 3 | "File Explorer", 4 | "Explorateur de fichiers", 5 | "Explorador de Archivos", 6 | "Datei-Explorer", 7 | "Esplora file", 8 | "Bestandsverkenner", 9 | "Explorador de arquivos" 10 | ], 11 | "Description": "", 12 | "Icon": "FOLDER", 13 | "Category": 5, 14 | "Type": "SUBMENU", 15 | "Value": "./PLG/xExplorer/scr.js" 16 | } 17 | -------------------------------------------------------------------------------- /bin/PLG/gme_0_xMcUtils.json: -------------------------------------------------------------------------------- 1 | { 2 | "Name": [ 3 | "Memory Card Utility", 4 | "Utilitaire de Memory Card", 5 | "Herramienta de Memory Card", 6 | "Memory Card-Dienstprogramm", 7 | "Utilit� della Memory Card", 8 | "Diensten voor Memory Card", 9 | "Utilit�rio do Memory Card" 10 | ], 11 | "Description": "", 12 | "Icon": "GAME_MCTOOLS", 13 | "Category": 5, 14 | "Type": "SUBMENU", 15 | "Value": "./PLG/xMcUtils/scr.js" 16 | } 17 | -------------------------------------------------------------------------------- /bin/PLG/gme_0_xOPL.json: -------------------------------------------------------------------------------- 1 | { 2 | "Name": "Open PS2 Loader", 3 | "Description": "", 4 | "Icon": "TOOL", 5 | "Category": 5, 6 | "Type": "ELF", 7 | "Value": { 8 | "Path": "{cwd}/APPS/OPL/OPNPS2LD.ELF", 9 | "Args": [] 10 | }, 11 | "CustomIcon": "{cwd}/APPS/OPL/ico.png" 12 | } 13 | -------------------------------------------------------------------------------- /bin/PLG/gme_0_xRetroarch.json: -------------------------------------------------------------------------------- 1 | { 2 | "Name": "Retroarch", 3 | "Description": "", 4 | "Icon": "TOOL", 5 | "Category": 5, 6 | "Type": "ELF", 7 | "Value": { 8 | "Path": "{cwd}/APPS/retroarch/raboot.elf", 9 | "Args": [] 10 | }, 11 | "CustomIcon": "{cwd}/APPS/retroarch/ico.png" 12 | } 13 | -------------------------------------------------------------------------------- /bin/PLG/gme_998_xSasApps.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /bin/PLG/pic_0_xViewer.json: -------------------------------------------------------------------------------- 1 | { 2 | "Name": [ 3 | "Image Viewer", 4 | "Visionneuse d'images", 5 | "Visualizador de Imágenes", 6 | "Bildbetrachter", 7 | "Visualizzatore di immagini", 8 | "Afbeeldingviewer", 9 | "Visualizador de imagens" 10 | ], 11 | "Description": "", 12 | "Icon": "FOLDER", 13 | "Category": 2, 14 | "Type": "SUBMENU", 15 | "Value": "./PLG/xPicView/scr.js" 16 | } 17 | -------------------------------------------------------------------------------- /bin/PLG/set_0_xSetGame.json: -------------------------------------------------------------------------------- 1 | { 2 | "Name": [ 3 | "Game Settings", 4 | "Paramètres de jeu", 5 | "Ajustes de Juego", 6 | "Spiel-Einstellungen", 7 | "Impostazioni del gioco", 8 | "Game-instellingen", 9 | "Configurações de jogo" 10 | ], 11 | "Description": [ 12 | "Adjusts settings for games.", 13 | "R�glez les paramètres des jeux.", 14 | "Ajusta la configuración de los juegos.", 15 | "Einstellungen für Spiele anpassen.", 16 | "Regola le impostazioni dei giochi.", 17 | "Pas de instellingen voor games aan.", 18 | "Ajuste as configurações dos jogos." 19 | ], 20 | "Icon": "SET_GAME", 21 | "Category": 1, 22 | "Type": "SUBMENU", 23 | "Value": "./PLG/xSettings/xGameOpts.xml" 24 | } 25 | -------------------------------------------------------------------------------- /bin/PLG/set_1_xSetSys.json: -------------------------------------------------------------------------------- 1 | { 2 | "Name": [ 3 | "System settings", 4 | "Paramètres système", 5 | "Ajustes de Sistema", 6 | "System-Einstellungen", 7 | "Impostazioni del sistema", 8 | "Systeeminstellingen", 9 | "Definições de Sistema" 10 | ], 11 | "Description": [ 12 | "Adjusts settings for this PS2 system.", 13 | "Réglez les paramètres de ce système PS2.", 14 | "Ajusta la configuración de este sistema PS2.", 15 | "Einstellungen für dieses PS2-System anpassen.", 16 | "Regola le impostazioni di questo sistema PS2.", 17 | "Pas de instellingen van dit PS2-systeem aan.", 18 | "Ajuste as configurações deste sistema PS2." 19 | ], 20 | "Icon": "SET_SYSTEM", 21 | "Category": 1, 22 | "Type": "SUBMENU", 23 | "Value": "./PLG/xSettings/xSystemOpts.xml" 24 | } 25 | -------------------------------------------------------------------------------- /bin/PLG/set_2_xSetTheme.json: -------------------------------------------------------------------------------- 1 | { 2 | "Name": [ 3 | "Theme Settings", 4 | "Paramètres de thème", 5 | "Ajustes de Tema", 6 | "Design-Einstellungen", 7 | "Impostazioni del tema", 8 | "Thema-instellingen", 9 | "Configurações de tema" 10 | ], 11 | "Description": [ 12 | "Adjust settings related to the appearance of the XMB Screen.", 13 | "Réglez les paramètres liés à l'apparence de l'écran XMB.", 14 | "Ajusta la apariencia de la pantalla XMB.", 15 | "Einstellungen für das Erscheinungsbild des XMB-Bildschirms anpassen.", 16 | "Regola le impostazioni relative all'aspetto dello schermo XMB.", 17 | "Pas instellingen aan die verband houden met het uiterlijk van het XMB-scherm.", 18 | "Ajuste as configurações relacionadas à aparência da tela XMB." 19 | ], 20 | "Icon": "SET_THEME", 21 | "Category": 1, 22 | "Type": "SUBMENU", 23 | "Value": "./PLG/xSettings/xThemeOpts.xml" 24 | } 25 | -------------------------------------------------------------------------------- /bin/PLG/set_3_xSetTime.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 53 | 106 | 206 | 207 | -------------------------------------------------------------------------------- /bin/PLG/set_4_xSetDisplay.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /bin/PLG/set_5_xSetSecurity.json: -------------------------------------------------------------------------------- 1 | { 2 | "Name": [ 3 | "Security Settings", 4 | "Paramètres sécurité", 5 | "Ajustes de Seguridad", 6 | "Sicherheits-Einstellungen", 7 | "Impostazioni di sicurezza", 8 | "Beveiligingsinstellingen", 9 | "Definições de Segurança" 10 | ], 11 | "Description": [ 12 | "Adjusts parental control settings.", 13 | "Réglez les paramètres de contrôle parental.", 14 | "Ajusta la configuración de control parental.", 15 | "Einstellungen für die Kindersicherung anpassen.", 16 | "Regola le impostazioni di controllo parentale.", 17 | "Pas de instellingen voor ouderlijk toezicht aan.", 18 | "Ajuste as configurações de controle parental." 19 | ], 20 | "Icon": "SET_PARENTALCTRL", 21 | "Category": 1, 22 | "Type": "SUBMENU", 23 | "Value": "./PLG/xSettings/xSecurityOpts.xml" 24 | } 25 | -------------------------------------------------------------------------------- /bin/PLG/set_6_xSetNet.json: -------------------------------------------------------------------------------- 1 | { 2 | "Name": [ 3 | "Network Settings", 4 | "Paramètres réseau", 5 | "Ajustes de red", 6 | "Netzwerk-Einstellungen", 7 | "Impostazioni di rete", 8 | "Netwerkinstellingen", 9 | "Definições de Rede" 10 | ], 11 | "Description": [ 12 | "Adjusts settings for the internet connection.", 13 | "Adjusts settings for the internet connection.", 14 | "Ajusta la configuración de la conexión a Internet.", 15 | "Adjusts settings for the internet connection.", 16 | "Adjusts settings for the internet connection.", 17 | "Adjusts settings for the internet connection.", 18 | "Adjusts settings for the internet connection." 19 | ], 20 | "Icon": "SET_NET", 21 | "Category": 1, 22 | "Type": "SUBMENU", 23 | "Value": "./PLG/xSettings/xNetOpts.xml" 24 | } 25 | -------------------------------------------------------------------------------- /bin/PLG/usr_0_xExit.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /bin/PLG/usr_0_xRefresh.json: -------------------------------------------------------------------------------- 1 | { 2 | "Name": [ 3 | "Restart Interface", 4 | "Interface de red�marrage", 5 | "Reiniciar Interfaz", 6 | "Neustartschnittstelle", 7 | "Riavvia interfaccia", 8 | "Interface opnieuw opstarten", 9 | "Reiniciar Interface" 10 | ], 11 | "Description": "", 12 | "Icon": "RELOAD", 13 | "Category": 0, 14 | "Type": "ELF", 15 | "Value": { 16 | "Path": "{cwd}/OSDXMB.ELF", 17 | "Args": [ "main.js" ] 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /bin/PLG/xExplorer/options.xml: -------------------------------------------------------------------------------- 1 | 30 | -------------------------------------------------------------------------------- /bin/PLG/xExplorer/scr.js: -------------------------------------------------------------------------------- 1 | const CtxtMenu = xmlParseContext(xmlParseElement(std.loadFile("./PLG/xExplorer/options.xml"))); 2 | 3 | function ParseDirectory(path) 4 | { 5 | const dir_options = []; 6 | const isHdd = (path === "hdd0:"); 7 | const dir = System.listDir(path); 8 | 9 | // Separate directories and files 10 | let directories = dir.filter(item => item.name !== "." && item.name !== ".." && item.dir); // All directories 11 | let files = dir.filter(item => !item.dir); // All files 12 | 13 | // Sort directories and files alphabetically by name 14 | directories.sort((a, b) => a.name.localeCompare(b.name)); 15 | files.sort((a, b) => a.name.localeCompare(b.name)); 16 | 17 | const valueFun = (isHdd) ? function () { const part = mountHDDPartition(this.Name); return ParseDirectory(`${part}:/`); } : function () { return ParseDirectory(this.FullPath); } 18 | 19 | directories.forEach((item) => 20 | { 21 | dir_options.push({ 22 | Name: item.name, 23 | Description: "", 24 | Icon: 18, 25 | Type: "SUBMENU", 26 | FullPath: `${path}${item.name}/`, 27 | Option: CtxtMenu, 28 | }); 29 | 30 | Object.defineProperty(dir_options[dir_options.length - 1], "Value", { get: valueFun }); 31 | }); 32 | 33 | files.forEach((item) => 34 | { 35 | dir_options.push(getFileAsItem(`${path}${item.name}`, item.size, CtxtMenu)); 36 | }); 37 | 38 | return { Options: dir_options, Default: 0 }; 39 | } 40 | 41 | let options = []; 42 | 43 | options.push({ 44 | Name: XMBLANG.WORK_DIR_NAME, 45 | Description: "", 46 | Icon: 18, 47 | Type: "SUBMENU", 48 | get Value() { return ParseDirectory(`${os.getcwd()[0]}/`); } 49 | }); 50 | 51 | if (os.readdir("hdd0:")[0].length > 0) 52 | { 53 | options.push({ 54 | Name: XMBLANG.HDD_DIR_NAME, 55 | Description: "", 56 | Icon: 29, 57 | Type: "SUBMENU", 58 | get Value() { return ParseDirectory("hdd0:"); } 59 | }); 60 | } 61 | 62 | for (let i = 0; i < 2; i++) 63 | { 64 | const hasContent = os.readdir(`mc${i.toString()}:/`)[0].length > 0; 65 | if (!hasContent) continue; 66 | 67 | options.push({ 68 | Name: `Memory Card ${(i + 1).toString()}`, 69 | Description: "", 70 | Icon: 16 + i, 71 | Type: "SUBMENU", 72 | get Value() 73 | { 74 | return ParseDirectory(`mc${i.toString()}:/`); 75 | } 76 | }); 77 | } 78 | 79 | for (let i = 0; i < 10; i++) 80 | { 81 | const dirContent = os.readdir(`mass${i.toString()}:/`); 82 | const hasContent = dirContent.length > 0 && dirContent[0].length > 0; 83 | if (!hasContent) break; 84 | let desc = System.getbdminfo(`mass${i.toString()}:/`); 85 | desc = (desc) ? `${desc.driverName.toUpperCase()} ${desc.deviceNumber}` : ""; 86 | 87 | options.push({ 88 | get Name() { return `${XMBLANG.MASS_DIR_NAME[DATA.LANGUAGE]} ${(i + 1).toString()}`; }, 89 | Description: desc, 90 | Icon: 21, 91 | Type: "SUBMENU", 92 | get Value() 93 | { 94 | return ParseDirectory(`mass${i.toString()}:/`); 95 | } 96 | }); 97 | } 98 | 99 | for (let i = 0; i < 2; i++) 100 | { 101 | const hasContent = os.readdir(`mmce${i.toString()}:/`)[0].length > 0; 102 | if (!hasContent) continue; 103 | 104 | options.push({ 105 | Name: `MMCE ${(i + 1).toString()}`, 106 | Description: "", 107 | Icon: 21, 108 | Type: "SUBMENU", 109 | get Value() 110 | { 111 | return ParseDirectory(`mmce${i.toString()}:/`); 112 | } 113 | }); 114 | } 115 | 116 | return options; 117 | -------------------------------------------------------------------------------- /bin/PLG/xGame/app_scan.js: -------------------------------------------------------------------------------- 1 | function parseTitleCfg(path) 2 | { 3 | // Scan directory for title.cfg 4 | if (os.readdir(path)[0].includes("title.cfg")) 5 | { 6 | // Parse the Title CFG file. 7 | let data = {}; 8 | const file = std.open(`${path}title.cfg`, "r"); 9 | 10 | if (file) 11 | { 12 | while (!file.eof()) 13 | { 14 | let line = file.getline(); 15 | if (line && line.includes('=')) 16 | { // Ensure the line is not empty and contains an '=' 17 | line = line.trim(); // Read and trim whitespace 18 | const [key, value] = line.split('='); // Split into key and value 19 | data[key.trim()] = value.trim(); // Trim and store in the data object 20 | } 21 | } 22 | 23 | file.close(); 24 | 25 | let AppName = ""; 26 | let Desc = ""; 27 | let ELFPath = ""; 28 | 29 | // Get Title 30 | if ('Title' in data) 31 | { 32 | AppName = data['Title']; 33 | } 34 | else if ('title' in data) 35 | { 36 | AppName = data['title']; 37 | } 38 | 39 | // Get ELF Path 40 | if ('boot' in data) 41 | { 42 | ELFPath = `${path}${data['boot']}`; 43 | } 44 | 45 | // Get Version for Description 46 | if ('Version' in data) 47 | { 48 | Desc = "Version " + data['Version']; 49 | } 50 | 51 | if ((AppName !== "") && (ELFPath != "")) 52 | { 53 | // Return the App object 54 | return { 55 | Name: AppName, 56 | Description: Desc, 57 | Icon: 27, 58 | Type: "ELF", 59 | Value: { Path: ELFPath, Args: [], } 60 | }; 61 | } 62 | } 63 | } 64 | 65 | return {}; 66 | } 67 | 68 | function TryAddMCApps(options, path) 69 | { 70 | const dir = System.listDir(path); 71 | 72 | dir.forEach((item) => 73 | { 74 | if ((item.dir) && (item.name !== ".") && (item.name !== "..") && (item.name.includes('_'))) 75 | { 76 | const app = parseTitleCfg(`${path}${item.name}/`); 77 | if ('Name' in app) { options.push(app); } 78 | } 79 | }); 80 | 81 | return options; 82 | } 83 | 84 | let options = []; 85 | options = TryAddMCApps(options, "mc0:/"); 86 | options = TryAddMCApps(options, "mc1:/"); 87 | 88 | if (os.readdir("hdd0:").includes("__common")) 89 | { 90 | const part = mountHDDPartition("__common"); 91 | options = TryAddMCApps(options, `${part}:APPS/`); 92 | } 93 | 94 | options.sort((a, b) => a.Name.localeCompare(b.Name)); 95 | 96 | return options; 97 | -------------------------------------------------------------------------------- /bin/PLG/xMcUtils/scr.js: -------------------------------------------------------------------------------- 1 | function parseIconSysTitle(path, name) 2 | { 3 | let RET = name; 4 | const syspath = `${path}${name}`; 5 | const files = os.readdir(syspath)[0]; 6 | let fileExist = files.includes("icon.sys"); 7 | 8 | if (!fileExist) { return RET; } 9 | 10 | const file = os.open(`${syspath}/icon.sys`, os.O_RDONLY); 11 | 12 | if (file < 0) { xmblog(`MCUTILS: Could not open icon sys from ${name}`); return RET; } 13 | 14 | const code = "PS2D"; 15 | const match = true; 16 | const magic = new Uint8Array(4); 17 | os.seek(file, 0, std.SEEK_SET); 18 | os.read(file, magic.buffer, 0, 4); 19 | 20 | if (magic.length === code.length) 21 | { 22 | for (let i = 0; i < code.length; i++) 23 | { 24 | if (magic[i] !== code.charCodeAt(i)) 25 | { 26 | match = false; 27 | break; 28 | } 29 | } 30 | } 31 | else 32 | { 33 | match = false; 34 | } 35 | 36 | if (match) 37 | { 38 | //const linebreak = new Uint8Array(2); 39 | //os.seek(file, 6, std.SEEK_SET); 40 | //os.read(file, linebreak.buffer, 0, 2); 41 | //const linepos = linebreak[0] >> 1; 42 | const title = new Uint8Array(68); 43 | os.seek(file, 192, std.SEEK_SET); 44 | os.read(file, title.buffer, 0, 68); 45 | RET = IconSysDecodeTitle(title); 46 | if (/^[\?]*$/.test(RET)) { RET = name; } 47 | } 48 | 49 | os.close(file); 50 | return RET; 51 | } 52 | 53 | function ReadMCDir(slot) 54 | { 55 | const dir = System.listDir(`mc${slot.toString()}:/`).sort((a, b) => a.name.localeCompare(b.name)); 56 | 57 | // Initialize an empty array to hold the directories 58 | const directories = []; 59 | 60 | // Loop through dir and collect directories into the desired structure 61 | dir.forEach((item) => 62 | { 63 | if ((item.dir) && (item.name !== ".") && (item.name !== "..")) 64 | { 65 | directories.push({ 66 | Name: parseIconSysTitle(`mc${slot.toString()}:/`, item.name), 67 | Description: "", 68 | Icon: 14, 69 | }); 70 | } 71 | }); 72 | 73 | directories.sort((a, b) => a.Name.localeCompare(b.Name)); 74 | 75 | return { Options: directories, Default: 0 }; 76 | } 77 | 78 | function TryAddMC(slot) 79 | { 80 | if (os.readdir(`mc${slot.toString()}:/`)[0].length > 0) 81 | { 82 | //const info = System.getMCInfo(slot); 83 | 84 | return { 85 | Name: `Memory Card ${(slot + 1).toString()}`, 86 | Description: "8 Mb", // getMCInfo() doesn't work... using a temp description instead 87 | Icon: 16 + slot, 88 | Type: "SUBMENU", 89 | get Value() 90 | { 91 | return ReadMCDir(this.Icon - 16); 92 | } 93 | }; 94 | } 95 | 96 | return {}; 97 | } 98 | 99 | let options = []; 100 | 101 | const obj0 = TryAddMC(0); 102 | const obj1 = TryAddMC(1); 103 | 104 | if ("Name" in obj0) { options.push(obj0); } 105 | if ("Name" in obj1) { options.push(obj1); } 106 | 107 | return options; 108 | -------------------------------------------------------------------------------- /bin/PLG/xPicView/options.xml: -------------------------------------------------------------------------------- 1 | 20 | -------------------------------------------------------------------------------- /bin/PLG/xPicView/scr.js: -------------------------------------------------------------------------------- 1 | const CtxtMenu = xmlParseContext(xmlParseElement(std.loadFile("./PLG/xPicView/options.xml"))); 2 | 3 | function ParseDirectory(path) 4 | { 5 | const dir_options = []; 6 | const isHdd = (path === "hdd0:"); 7 | const dir = System.listDir(path); 8 | 9 | // Separate directories and files 10 | let directories = dir.filter(item => item.name !== "." && item.name !== ".." && item.dir); // All directories 11 | let files = dir.filter(item => !item.dir); // All files 12 | 13 | // Sort directories and files alphabetically by name 14 | directories.sort((a, b) => a.name.localeCompare(b.name)); 15 | files.sort((a, b) => a.name.localeCompare(b.name)); 16 | 17 | const valueFun = (isHdd) ? function () { const part = mountHDDPartition(this.Name); return ParseDirectory(`${part}:/`); } : function () { return ParseDirectory(this.FullPath); } 18 | 19 | directories.forEach((item) => 20 | { 21 | dir_options.push({ 22 | Name: item.name, 23 | Description: "", 24 | Icon: 18, 25 | Type: "SUBMENU", 26 | FullPath: `${path}${item.name}/` 27 | }); 28 | 29 | Object.defineProperty(dir_options[dir_options.length - 1], "Value", { get: valueFun }); 30 | }); 31 | 32 | files.forEach((item) => 33 | { 34 | if (isExtensionMatching(item.name, "png", "jpg", "bmp")) 35 | { 36 | dir_options.push(getFileAsItem(`${path}${item.name}`, item.size, CtxtMenu)); 37 | } 38 | }); 39 | 40 | return { Options: dir_options, Default: 0 }; 41 | } 42 | 43 | let options = []; 44 | 45 | options.push({ 46 | Name: XMBLANG.WORK_DIR_NAME, 47 | Description: "", 48 | Icon: 18, 49 | Type: "SUBMENU", 50 | get Value() { return ParseDirectory(`${os.getcwd()[0]}/`); } 51 | }); 52 | 53 | if (os.readdir("hdd0:")[0].length > 0) 54 | { 55 | options.push({ 56 | Name: XMBLANG.HDD_DIR_NAME, 57 | Description: "", 58 | Icon: 29, 59 | Type: "SUBMENU", 60 | get Value() { return ParseDirectory("hdd0:"); } 61 | }); 62 | } 63 | 64 | for (let i = 0; i < 10; i++) 65 | { 66 | const dirContent = os.readdir(`mass${i.toString()}:/`); 67 | const hasContent = dirContent.length > 0 && dirContent[0].length > 0; 68 | if (!hasContent) break; 69 | let desc = System.getbdminfo(`mass${i.toString()}:/`); 70 | desc = (desc) ? `${desc.driverName.toUpperCase()} ${desc.deviceNumber}` : ""; 71 | 72 | options.push({ 73 | get Name() { return `${XMBLANG.MASS_DIR_NAME[DATA.LANGUAGE]} ${(i + 1).toString()}`; }, 74 | Description: desc, 75 | Icon: 21, 76 | Type: "SUBMENU", 77 | get Value() 78 | { 79 | return ParseDirectory(`mass${i.toString()}:/`); 80 | } 81 | }); 82 | } 83 | 84 | for (let i = 0; i < 2; i++) 85 | { 86 | const hasContent = os.readdir(`mmce${i.toString()}:/`)[0].length > 0; 87 | if (!hasContent) continue; 88 | 89 | options.push({ 90 | Name: `MMCE ${i.toString()}`, 91 | Description: "", 92 | Icon: 21, 93 | Type: "SUBMENU", 94 | get Value() 95 | { 96 | return ParseDirectory(`mmce${i.toString()}:/`); 97 | } 98 | }); 99 | } 100 | 101 | return options; 102 | -------------------------------------------------------------------------------- /bin/PLG/xSettings/xDisplayOpts.xml: -------------------------------------------------------------------------------- 1 | 2 | 33 | 51 | 52 | -------------------------------------------------------------------------------- /bin/PLG/xSettings/xNetOpts.xml: -------------------------------------------------------------------------------- 1 | 2 | 43 | 88 | 89 | -------------------------------------------------------------------------------- /bin/PLG/xSettings/xSecurityOpts.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 20 | 21 | -------------------------------------------------------------------------------- /bin/PLG/xSettings/xSysInfoDialog.js: -------------------------------------------------------------------------------- 1 | // STRINGS // 2 | 3 | const SYSINFO_MODELNAME = 4 | [ 5 | "Console", 6 | "Console", 7 | "Consola", 8 | "Console", 9 | "Console", 10 | "Console", 11 | "Console", 12 | ]; 13 | const SYSINFO_BDATE = 14 | [ 15 | "Build Date", 16 | "Build Date", 17 | "Fecha", 18 | "Build Date", 19 | "Build Date", 20 | "Build Date", 21 | "Build Date", 22 | ]; 23 | const SYSINFO_TYPE = 24 | [ 25 | "Console Type", 26 | "Console Type", 27 | "Tipo de Consola", 28 | "Console Type", 29 | "Console Type", 30 | "Console Type", 31 | "Console Type", 32 | ]; 33 | const SYSINFO_BRWVER = 34 | [ 35 | "Browser", 36 | "Browser", 37 | "Navegador", 38 | "Browser", 39 | "Browser", 40 | "Browser", 41 | "Browser", 42 | ]; 43 | const SYSINFO_CDVER = 44 | [ 45 | "CD Player", 46 | "CD Player", 47 | "Reproductor de CD", 48 | "CD Player", 49 | "CD Player", 50 | "CD Player", 51 | "CD Player", 52 | ]; 53 | 54 | // FUNCTIONS // 55 | 56 | function getConsoleVersion(rawVersion) 57 | { 58 | // Split the version into major and minor parts 59 | const majorVersion = rawVersion.slice(0, 2).replace(/^0/, ''); // Remove leading zero from the major version 60 | const minorVersion = rawVersion.slice(2); // Take the last two characters as is 61 | 62 | // Combine the major and minor versions into the desired format 63 | return `${majorVersion}.${minorVersion}`; 64 | } 65 | function getConsoleType(regCode, rawVersion) 66 | { 67 | let consoleType = "Retail"; 68 | 69 | switch (regCode) 70 | { 71 | case "C": consoleType = "Retail"; break; 72 | case "D": consoleType = "DevKit"; break; 73 | case "Z": consoleType = "Arcade"; break; 74 | } 75 | 76 | if (std.exists("rom0:PSXVER")) { consoleType = "PSX-DVR"; } 77 | if (rawVersion === "0250") { consoleType = "PS2 TV"; } 78 | 79 | return consoleType; 80 | } 81 | function getConsoleRegion(regCode) 82 | { 83 | let ConsoleRegion = ""; 84 | 85 | switch (regCode) 86 | { 87 | case 'X': ConsoleRegion = "Test"; break; 88 | case 'C': ConsoleRegion = "China"; break; 89 | case 'E': ConsoleRegion = "Europe"; break; 90 | case 'H': ConsoleRegion = "Asia"; break; 91 | case 'A': ConsoleRegion = "America"; break; 92 | case 'T': 93 | case 'J': ConsoleRegion = "Japan"; break; 94 | } 95 | 96 | // rom1:DVDID (example 3.10M) 97 | const dvdId = std.open("rom1:DVDID", "r"); 98 | if (dvdId) 99 | { 100 | const id = dvdId.readAsString(); 101 | dvdId.close(); 102 | switch (id[4]) 103 | { 104 | case 'O': ConsoleRegion = "Oceania"; break; 105 | case 'R': ConsoleRegion = "Russia"; break; 106 | case 'M': ConsoleRegion = "Mexico"; break; 107 | } 108 | } 109 | 110 | return ConsoleRegion; 111 | } 112 | function getConsoleDate(ROMVER) 113 | { 114 | // Extract the date portion starting from character 6 115 | const year = ROMVER.substring(6, 10); // Characters 6-9 are the year 116 | const month = ROMVER.substring(10, 12); // Characters 10-11 are the month 117 | const day = ROMVER.substring(12, 14); // Characters 12-13 are the day 118 | 119 | // Format the date as YYYY/MM/DD 120 | let formattedDate = `${day}/${month}/${year}`; 121 | 122 | // Get Extended Info if available. 123 | const file = std.open("rom0:EXTINFO", "r"); 124 | 125 | if (file) 126 | { 127 | file.seek(0x10, std.SEEK_SET); 128 | const extDate = file.readAsString(0x0F); 129 | file.close(); 130 | 131 | const extYear = extDate.substring(0, 4); 132 | const extMonth = extDate.substring(4, 6); 133 | const extDay = extDate.substring(6, 8); 134 | const extHour = extDate.substring(9, 11); 135 | const extMin = extDate.substring(11, 13); 136 | const extSec = extDate.substring(13, 15); 137 | 138 | formattedDate = `${extDay}/${extMonth}/${extYear} ${extHour}:${extMin}:${extSec}`; 139 | } 140 | 141 | return formattedDate; 142 | } 143 | function getPS1Ver(ConsoleRegion) 144 | { 145 | let ps1ver = (ConsoleRegion === "Japan") ? "1.01" : "1.10"; 146 | 147 | const ps1vera = std.open("rom0:PS1VERA", "r"); 148 | 149 | if (ps1vera) 150 | { 151 | ps1vera.close(); 152 | ps1ver = readFileAsUtf8("rom0:PS1VERA"); 153 | } 154 | else 155 | { 156 | const ps1verb = std.open("rom0:PS1VER", "r"); 157 | 158 | if (ps1verb) 159 | { 160 | ps1verb.close(); 161 | ps1ver = readFileAsUtf8("rom0:PS1VER"); 162 | } 163 | } 164 | 165 | return ps1ver; 166 | } 167 | function getModelName(rawVersion) 168 | { 169 | let modelName = ""; 170 | 171 | if ((rawVersion[0] === '0') && (rawVersion[1] === '1') && (rawVersion[2] === '0')) 172 | { 173 | if (rawVersion[3] === '0') { modelName = "SCPH-10000"; } 174 | else 175 | { 176 | const osdsys = std.open("rom0:OSDSYS", "r"); 177 | 178 | if (osdsys) 179 | { 180 | osdsys.seek(0x8C808, std.SEEK_SET); 181 | modelName = osdsys.readAsString(17); 182 | osdsys.close(); 183 | } 184 | } 185 | } 186 | 187 | return modelName; 188 | } 189 | function getOsdVer() 190 | { 191 | let osdver = ""; 192 | const file = std.open("rom0:PS1ID", "r"); 193 | 194 | if (file) 195 | { 196 | osdver = file.readAsString(); 197 | file.close(); 198 | } 199 | 200 | return osdver; 201 | } 202 | function getCdVer() 203 | { 204 | let cdver = ""; 205 | const file = std.open("rom0:OSDVER", "r"); 206 | 207 | if (file) 208 | { 209 | cdver = file.readAsString(4); 210 | file.close(); 211 | 212 | // Split the version into major and minor parts 213 | const major = cdver.slice(0, 2).replace(/^0/, ''); // Remove leading zero from the major version 214 | const minor = cdver.slice(2); // Take the last two characters as is 215 | 216 | // Combine the major and minor versions into the desired format 217 | cdver = `${major}.${minor}`; 218 | } 219 | 220 | return cdver; 221 | } 222 | function newObj(list, name, value) 223 | { 224 | if (value !== "") 225 | { 226 | list.push({ 227 | Selectable: false, 228 | get Name() { return name; }, 229 | get Description() { return value; } 230 | }); 231 | } 232 | 233 | return list; 234 | } 235 | 236 | // CODE // 237 | 238 | const tmp = std.open("rom0:ROMVER", "r"); 239 | if (tmp) 240 | { 241 | const ROMVER = tmp.readAsString(); 242 | tmp.close(); 243 | 244 | // Extract the first four characters for the version 245 | const rawVersion = ROMVER.substring(0, 4); 246 | 247 | const formattedVersion = getConsoleVersion(rawVersion); 248 | const formattedDate = getConsoleDate(ROMVER); 249 | const ConsoleRegion = getConsoleRegion(ROMVER[4]); 250 | const consoleType = getConsoleType(ROMVER[5], rawVersion); 251 | const ps1ver = getPS1Ver(ConsoleRegion); 252 | const modelName = getModelName(rawVersion); 253 | const osdver = getOsdVer(); 254 | const cdver = getCdVer(); 255 | 256 | // Place all the Data extracted into the object 257 | let sysInfo = []; 258 | sysInfo = newObj(sysInfo, SYSINFO_MODELNAME[DATA.LANGUAGE], modelName); 259 | sysInfo = newObj(sysInfo, "ROMVER", formattedVersion); 260 | sysInfo = newObj(sysInfo, SYSINFO_BRWVER[DATA.LANGUAGE], osdver); 261 | sysInfo = newObj(sysInfo, SYSINFO_CDVER[DATA.LANGUAGE], cdver); 262 | sysInfo = newObj(sysInfo, "Playstation Driver", ps1ver); 263 | sysInfo = newObj(sysInfo, "Region", ConsoleRegion); 264 | sysInfo = newObj(sysInfo, SYSINFO_TYPE[DATA.LANGUAGE], consoleType); 265 | sysInfo = newObj(sysInfo, SYSINFO_BDATE[DATA.LANGUAGE], formattedDate); 266 | 267 | DATA.DASH_STATE = "IDLE_MESSAGE_FADE_IN"; 268 | DATA.OVSTATE = "MESSAGE_IN"; 269 | DATA.MESSAGE_INFO = 270 | { 271 | Icon: 8, 272 | Title: DASH_SUB[DATA.DASH_CURSUB].Options[DATA.DASH_CURSUBOPT].Name, 273 | BG: false, 274 | Type: "INFO", 275 | Data: sysInfo, 276 | BACK_BTN: true, 277 | ENTER_BTN: false, 278 | }; 279 | } 280 | -------------------------------------------------------------------------------- /bin/PLG/xSettings/xSystemOpts.xml: -------------------------------------------------------------------------------- 1 | 2 | 40 | 73 | 85 | 86 | -------------------------------------------------------------------------------- /bin/PLG/xSettings/xThemeOpts.xml: -------------------------------------------------------------------------------- 1 | 2 | 85 | 135 | 168 | 169 | -------------------------------------------------------------------------------- /bin/PLG/xSettings/xThm.js: -------------------------------------------------------------------------------- 1 | const NAME_SET1 = 2 | [ 3 | "Theme", 4 | "Thème", 5 | "Tema", 6 | "Thema", 7 | "Tema", 8 | "Thema", 9 | "Tema", 10 | ]; 11 | 12 | const DESC_SET1 = 13 | [ 14 | "Sets the interface style.", 15 | "Définir le style de l'interface.", 16 | "Establecer el estilo de la interfaz.", 17 | "Den Schnittstellenstil festlegen.", 18 | "Seleziona lo stile dell'interfaccia.", 19 | "Stel de interface-stijl in.", 20 | "Definir o estilo da interface.", 21 | ]; 22 | 23 | function GetThemeContextInfo() 24 | { 25 | const CURTHEME = getFolderNameFromPath(DATA.THEME_PATH); 26 | const listDir = System.listDir("/THM/"); 27 | 28 | let defItem = 0; 29 | let dir_options = []; 30 | 31 | dir_options.push({Name: "Original", Icon: -1}); 32 | 33 | const sortedDirectories = listDir 34 | .filter((item) => item.name !== "." && item.name !== ".." && item.name !== "Original" && item.dir) // Exclude "." and ".." and keep only directories 35 | .sort((a, b) => a.name.localeCompare(b.name)); // Sort alphabetically by name 36 | 37 | // Loop through sortedDirectories and collect directories into the desired structure 38 | sortedDirectories.forEach((item) => 39 | { 40 | const dirFiles = os.readdir(`./THM/${item.name}/`)[0]; 41 | const ico = (dirFiles.includes("thmico.png")) ? imgLoader.loadConstant(`./THM/${item.name}/thmico.png`) : -1; 42 | dir_options.push 43 | ({ 44 | Name: item.name, 45 | Icon: ico, 46 | }); 47 | 48 | if (dirFiles.includes("thmprw.png")) { dir_options[dir_options.length - 1].PreviewImage = `./THM/${item.name}/thmprw.png`; } 49 | 50 | if (item.name == CURTHEME) { defItem = dir_options.length - 1; } 51 | }); 52 | 53 | let _a = function (DATA, val) 54 | { 55 | if (DATA.THEME_PATH === `THM/${DASH_CTX[DATA.DASH_CURCTXLVL].Options[DASH_CTX[DATA.DASH_CURCTXLVL].Selected].Name}/`) { return; } 56 | 57 | DATA.DASH_STATE = "SUBMENU_CONTEXT_MESSAGE_FADE_OUT"; 58 | DATA.OVSTATE = "MESSAGE_IN"; 59 | DATA.MESSAGE_INFO = 60 | { 61 | Icon: 9, 62 | Title: DASH_SUB[DATA.DASH_CURSUB].Options[DATA.DASH_CURSUBOPT].Name, 63 | BG: false, 64 | Type: "TEXT", 65 | Text: XMBLANG.WAIT, 66 | BACK_BTN: false, 67 | ENTER_BTN: false, 68 | BgFunction: () => 69 | { 70 | let config = DATA.CONFIG.Get("main.cfg"); 71 | if (DATA.THEME_PATH !== `THM/${config["Theme"]}/`) 72 | { 73 | let bgComplete = false; 74 | let imgsLoaded = false; 75 | let fntLoaded = false; 76 | let sndLoaded = false; 77 | 78 | loaded_icons = 0; 79 | 80 | DATA.DASH_FOCUS = false; 81 | ICOSELCOL = { r: 128, g: 128, b: 128 }; 82 | TXTSELCOL = { r: 255, g: 255, b: 255 }; 83 | CTXTINT = { r: 128, g: 128, b: 128 }; 84 | DATA.DISPLAYBG = false; 85 | DATA.BGIMG = false; 86 | DATA.BGIMGA = 0; 87 | DATA.OVALPHA = 20; 88 | 89 | DATA.THEME_PATH = `THM/${config["Theme"]}/`; 90 | 91 | if (os.readdir(DATA.THEME_PATH)[0].includes("thm.js")) 92 | { 93 | std.loadScript(`${DATA.THEME_PATH}thm.js`); 94 | } 95 | 96 | let intervalID = os.setInterval(() => 97 | { 98 | let finished = false; 99 | 100 | if (DATA.DISPLAYBG) { DATA.BGIMGA += 12; if (DATA.BGIMGA >= 128) { DATA.BGIMGA = 128; bgComplete = true; } } 101 | else { bgComplete = true; } 102 | 103 | if (imgsLoaded === false) 104 | { 105 | if ((os.readdir(`${DATA.THEME_PATH}`)[0].includes("icons"))) 106 | { 107 | if (loaded_icons < dash_icons_info.children.length) 108 | { 109 | const imgPath = (os.readdir(`${DATA.THEME_PATH}icons/`)[0].includes(`${dash_icons_info.children[loaded_icons].attributes.path}`)) ? `${DATA.THEME_PATH}icons/${dash_icons_info.children[loaded_icons].attributes.path}` : `./THM/Original/icons/${dash_icons_info.children[loaded_icons].attributes.path}`; 110 | let icon = new Image(imgPath); 111 | icon.optimize(); 112 | icon.filter = LINEAR; 113 | dash_icons[loaded_icons] = icon; 114 | loaded_icons++; 115 | } 116 | else 117 | { 118 | imgsLoaded = true; 119 | } 120 | } 121 | else 122 | { 123 | loaded_icons = dash_icons_info.children.length; 124 | imgsLoaded = true; 125 | } 126 | } 127 | 128 | // Reload Font 129 | if (fntLoaded === false) { LoadFONT(); fntLoaded = true; } 130 | 131 | if (sndLoaded === false) 132 | { 133 | // Pending 134 | 135 | sndLoaded = true; 136 | } 137 | 138 | if ((bgComplete) && (imgsLoaded) && (fntLoaded) && (sndLoaded)) { finished = true; } 139 | 140 | if (finished) 141 | { 142 | DATA.OVSTATE = "MESSAGE_OUT"; 143 | DATA.DASH_STATE = "SUBMENU_MESSAGE_FADE_IN"; 144 | DATA.DASH_MOVE_FRAME = 0; 145 | SetDashPadEvents(0); 146 | os.clearInterval(intervalID); 147 | } 148 | }, 0,); 149 | } 150 | }, 151 | }; 152 | 153 | let config = DATA.CONFIG.Get("main.cfg"); 154 | config["Theme"] = DASH_CTX[DATA.DASH_CURCTXLVL].Options[DASH_CTX[DATA.DASH_CURCTXLVL].Selected].Name; 155 | DATA.CONFIG.Push("main.cfg", config); 156 | }; 157 | 158 | return { Options: dir_options, Default: defItem, Confirm: _a }; 159 | } 160 | 161 | return { 162 | Name: NAME_SET1, 163 | Description: DESC_SET1, 164 | Icon: 15, 165 | Type: "CONTEXT", 166 | Value: GetThemeContextInfo(), 167 | } 168 | -------------------------------------------------------------------------------- /bin/THM/Air Paint/bg/bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Air Paint/bg/bg.jpg -------------------------------------------------------------------------------- /bin/THM/Air Paint/icons/ic_cat_game.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Air Paint/icons/ic_cat_game.png -------------------------------------------------------------------------------- /bin/THM/Air Paint/icons/ic_cat_home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Air Paint/icons/ic_cat_home.png -------------------------------------------------------------------------------- /bin/THM/Air Paint/icons/ic_cat_music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Air Paint/icons/ic_cat_music.png -------------------------------------------------------------------------------- /bin/THM/Air Paint/icons/ic_cat_network.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Air Paint/icons/ic_cat_network.png -------------------------------------------------------------------------------- /bin/THM/Air Paint/icons/ic_cat_picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Air Paint/icons/ic_cat_picture.png -------------------------------------------------------------------------------- /bin/THM/Air Paint/icons/ic_cat_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Air Paint/icons/ic_cat_settings.png -------------------------------------------------------------------------------- /bin/THM/Air Paint/icons/ic_cat_video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Air Paint/icons/ic_cat_video.png -------------------------------------------------------------------------------- /bin/THM/Air Paint/icons/ic_game_folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Air Paint/icons/ic_game_folder.png -------------------------------------------------------------------------------- /bin/THM/Air Paint/icons/ic_game_mctools.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Air Paint/icons/ic_game_mctools.png -------------------------------------------------------------------------------- /bin/THM/Air Paint/icons/ic_set_cfg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Air Paint/icons/ic_set_cfg.png -------------------------------------------------------------------------------- /bin/THM/Air Paint/icons/ic_set_display.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Air Paint/icons/ic_set_display.png -------------------------------------------------------------------------------- /bin/THM/Air Paint/icons/ic_set_game.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Air Paint/icons/ic_set_game.png -------------------------------------------------------------------------------- /bin/THM/Air Paint/icons/ic_set_net.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Air Paint/icons/ic_set_net.png -------------------------------------------------------------------------------- /bin/THM/Air Paint/icons/ic_set_parentalctrl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Air Paint/icons/ic_set_parentalctrl.png -------------------------------------------------------------------------------- /bin/THM/Air Paint/icons/ic_set_system.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Air Paint/icons/ic_set_system.png -------------------------------------------------------------------------------- /bin/THM/Air Paint/icons/ic_set_theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Air Paint/icons/ic_set_theme.png -------------------------------------------------------------------------------- /bin/THM/Air Paint/icons/ic_set_time.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Air Paint/icons/ic_set_time.png -------------------------------------------------------------------------------- /bin/THM/Air Paint/icons/ic_x_folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Air Paint/icons/ic_x_folder.png -------------------------------------------------------------------------------- /bin/THM/Air Paint/icons/ic_x_help.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Air Paint/icons/ic_x_help.png -------------------------------------------------------------------------------- /bin/THM/Air Paint/icons/ic_x_mass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Air Paint/icons/ic_x_mass.png -------------------------------------------------------------------------------- /bin/THM/Air Paint/icons/ic_x_poweroff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Air Paint/icons/ic_x_poweroff.png -------------------------------------------------------------------------------- /bin/THM/Air Paint/icons/ic_x_reload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Air Paint/icons/ic_x_reload.png -------------------------------------------------------------------------------- /bin/THM/Air Paint/icons/ic_x_usbdrive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Air Paint/icons/ic_x_usbdrive.png -------------------------------------------------------------------------------- /bin/THM/Air Paint/thm.js: -------------------------------------------------------------------------------- 1 | DATA.BGIMG = new Image(`${DATA.THEME_PATH}bg/bg.jpg`); 2 | DATA.BGIMG.optimize(); 3 | DATA.BGIMG.filter = LINEAR; 4 | DATA.DISPLAYBG = true; 5 | -------------------------------------------------------------------------------- /bin/THM/Air Paint/thmico.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Air Paint/thmico.png -------------------------------------------------------------------------------- /bin/THM/Air Paint/thmprw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Air Paint/thmprw.png -------------------------------------------------------------------------------- /bin/THM/Original/icons/ic_cat_game.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/icons/ic_cat_game.png -------------------------------------------------------------------------------- /bin/THM/Original/icons/ic_cat_home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/icons/ic_cat_home.png -------------------------------------------------------------------------------- /bin/THM/Original/icons/ic_cat_music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/icons/ic_cat_music.png -------------------------------------------------------------------------------- /bin/THM/Original/icons/ic_cat_network.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/icons/ic_cat_network.png -------------------------------------------------------------------------------- /bin/THM/Original/icons/ic_cat_picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/icons/ic_cat_picture.png -------------------------------------------------------------------------------- /bin/THM/Original/icons/ic_cat_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/icons/ic_cat_settings.png -------------------------------------------------------------------------------- /bin/THM/Original/icons/ic_cat_video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/icons/ic_cat_video.png -------------------------------------------------------------------------------- /bin/THM/Original/icons/ic_game_folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/icons/ic_game_folder.png -------------------------------------------------------------------------------- /bin/THM/Original/icons/ic_game_mctools.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/icons/ic_game_mctools.png -------------------------------------------------------------------------------- /bin/THM/Original/icons/ic_game_ps1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/icons/ic_game_ps1.png -------------------------------------------------------------------------------- /bin/THM/Original/icons/ic_game_ps2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/icons/ic_game_ps2.png -------------------------------------------------------------------------------- /bin/THM/Original/icons/ic_set_cfg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/icons/ic_set_cfg.png -------------------------------------------------------------------------------- /bin/THM/Original/icons/ic_set_display.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/icons/ic_set_display.png -------------------------------------------------------------------------------- /bin/THM/Original/icons/ic_set_game.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/icons/ic_set_game.png -------------------------------------------------------------------------------- /bin/THM/Original/icons/ic_set_net.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/icons/ic_set_net.png -------------------------------------------------------------------------------- /bin/THM/Original/icons/ic_set_parentalctrl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/icons/ic_set_parentalctrl.png -------------------------------------------------------------------------------- /bin/THM/Original/icons/ic_set_system.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/icons/ic_set_system.png -------------------------------------------------------------------------------- /bin/THM/Original/icons/ic_set_theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/icons/ic_set_theme.png -------------------------------------------------------------------------------- /bin/THM/Original/icons/ic_set_time.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/icons/ic_set_time.png -------------------------------------------------------------------------------- /bin/THM/Original/icons/ic_x_file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/icons/ic_x_file.png -------------------------------------------------------------------------------- /bin/THM/Original/icons/ic_x_folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/icons/ic_x_folder.png -------------------------------------------------------------------------------- /bin/THM/Original/icons/ic_x_help.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/icons/ic_x_help.png -------------------------------------------------------------------------------- /bin/THM/Original/icons/ic_x_mass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/icons/ic_x_mass.png -------------------------------------------------------------------------------- /bin/THM/Original/icons/ic_x_mc1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/icons/ic_x_mc1.png -------------------------------------------------------------------------------- /bin/THM/Original/icons/ic_x_mc2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/icons/ic_x_mc2.png -------------------------------------------------------------------------------- /bin/THM/Original/icons/ic_x_poweroff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/icons/ic_x_poweroff.png -------------------------------------------------------------------------------- /bin/THM/Original/icons/ic_x_reload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/icons/ic_x_reload.png -------------------------------------------------------------------------------- /bin/THM/Original/icons/ic_x_tool.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/icons/ic_x_tool.png -------------------------------------------------------------------------------- /bin/THM/Original/icons/ic_x_usbdrive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/icons/ic_x_usbdrive.png -------------------------------------------------------------------------------- /bin/THM/Original/icons/ic_x_user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/icons/ic_x_user.png -------------------------------------------------------------------------------- /bin/THM/Original/sound/snd_boot.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/sound/snd_boot.wav -------------------------------------------------------------------------------- /bin/THM/Original/sound/snd_cancel.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/sound/snd_cancel.wav -------------------------------------------------------------------------------- /bin/THM/Original/sound/snd_cursor.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/sound/snd_cursor.wav -------------------------------------------------------------------------------- /bin/THM/Original/text/font.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/Original/text/font.ttf -------------------------------------------------------------------------------- /bin/THM/PSX/bg/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/PSX/bg/bg.png -------------------------------------------------------------------------------- /bin/THM/PSX/icons/focus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/PSX/icons/focus.png -------------------------------------------------------------------------------- /bin/THM/PSX/icons/ic_cat_game.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/PSX/icons/ic_cat_game.png -------------------------------------------------------------------------------- /bin/THM/PSX/icons/ic_cat_home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/PSX/icons/ic_cat_home.png -------------------------------------------------------------------------------- /bin/THM/PSX/icons/ic_cat_music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/PSX/icons/ic_cat_music.png -------------------------------------------------------------------------------- /bin/THM/PSX/icons/ic_cat_network.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/PSX/icons/ic_cat_network.png -------------------------------------------------------------------------------- /bin/THM/PSX/icons/ic_cat_picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/PSX/icons/ic_cat_picture.png -------------------------------------------------------------------------------- /bin/THM/PSX/icons/ic_cat_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/PSX/icons/ic_cat_settings.png -------------------------------------------------------------------------------- /bin/THM/PSX/icons/ic_cat_video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/PSX/icons/ic_cat_video.png -------------------------------------------------------------------------------- /bin/THM/PSX/icons/ic_game_folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/PSX/icons/ic_game_folder.png -------------------------------------------------------------------------------- /bin/THM/PSX/icons/ic_game_mctools.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/PSX/icons/ic_game_mctools.png -------------------------------------------------------------------------------- /bin/THM/PSX/icons/ic_game_ps1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/PSX/icons/ic_game_ps1.png -------------------------------------------------------------------------------- /bin/THM/PSX/icons/ic_game_ps2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/PSX/icons/ic_game_ps2.png -------------------------------------------------------------------------------- /bin/THM/PSX/icons/ic_set_cfg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/PSX/icons/ic_set_cfg.png -------------------------------------------------------------------------------- /bin/THM/PSX/icons/ic_set_display.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/PSX/icons/ic_set_display.png -------------------------------------------------------------------------------- /bin/THM/PSX/icons/ic_set_game.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/PSX/icons/ic_set_game.png -------------------------------------------------------------------------------- /bin/THM/PSX/icons/ic_set_net.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/PSX/icons/ic_set_net.png -------------------------------------------------------------------------------- /bin/THM/PSX/icons/ic_set_parentalctrl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/PSX/icons/ic_set_parentalctrl.png -------------------------------------------------------------------------------- /bin/THM/PSX/icons/ic_set_system.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/PSX/icons/ic_set_system.png -------------------------------------------------------------------------------- /bin/THM/PSX/icons/ic_set_theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/PSX/icons/ic_set_theme.png -------------------------------------------------------------------------------- /bin/THM/PSX/icons/ic_set_time.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/PSX/icons/ic_set_time.png -------------------------------------------------------------------------------- /bin/THM/PSX/icons/ic_x_file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/PSX/icons/ic_x_file.png -------------------------------------------------------------------------------- /bin/THM/PSX/icons/ic_x_folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/PSX/icons/ic_x_folder.png -------------------------------------------------------------------------------- /bin/THM/PSX/icons/ic_x_mc1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/PSX/icons/ic_x_mc1.png -------------------------------------------------------------------------------- /bin/THM/PSX/icons/ic_x_mc2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/PSX/icons/ic_x_mc2.png -------------------------------------------------------------------------------- /bin/THM/PSX/icons/ic_x_poweroff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/PSX/icons/ic_x_poweroff.png -------------------------------------------------------------------------------- /bin/THM/PSX/icons/ic_x_reload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/PSX/icons/ic_x_reload.png -------------------------------------------------------------------------------- /bin/THM/PSX/icons/ic_x_tool.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/PSX/icons/ic_x_tool.png -------------------------------------------------------------------------------- /bin/THM/PSX/icons/ic_x_usbdrive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/PSX/icons/ic_x_usbdrive.png -------------------------------------------------------------------------------- /bin/THM/PSX/text/font.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/PSX/text/font.ttf -------------------------------------------------------------------------------- /bin/THM/PSX/thm.js: -------------------------------------------------------------------------------- 1 | DATA.BGVAL = 8; 2 | DATA.BGTMP = 8; 3 | DATA.BGCOL = 8; 4 | DATA.BGSWITCH = true; 5 | DATA.BGFRAME = 0; 6 | DATA.DASH_FOCUS = new Image(`${DATA.THEME_PATH}icons/focus.png`); 7 | DATA.DASH_FOCUS.optimize(); 8 | DATA.BGIMG = new Image(`${DATA.THEME_PATH}bg/bg.png`); 9 | DATA.BGIMG.optimize(); 10 | DATA.BGIMG.filter = LINEAR; 11 | DATA.DISPLAYBG = true; 12 | ICOSELCOL = { r: 160, g: 140, b: 50 }; 13 | TXTSELCOL = { r: 180, g: 120, b: 0 }; 14 | CTXTINT = { r: 40, g: 96, b: 220 }; 15 | -------------------------------------------------------------------------------- /bin/THM/PSX/thmprw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/THM/PSX/thmprw.png -------------------------------------------------------------------------------- /bin/VMC/blank.vmc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/VMC/blank.vmc -------------------------------------------------------------------------------- /bin/XMB/color/ctx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/XMB/color/ctx.png -------------------------------------------------------------------------------- /bin/XMB/color/ico1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/XMB/color/ico1.png -------------------------------------------------------------------------------- /bin/XMB/color/ico10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/XMB/color/ico10.png -------------------------------------------------------------------------------- /bin/XMB/color/ico11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/XMB/color/ico11.png -------------------------------------------------------------------------------- /bin/XMB/color/ico12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/XMB/color/ico12.png -------------------------------------------------------------------------------- /bin/XMB/color/ico13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/XMB/color/ico13.png -------------------------------------------------------------------------------- /bin/XMB/color/ico2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/XMB/color/ico2.png -------------------------------------------------------------------------------- /bin/XMB/color/ico3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/XMB/color/ico3.png -------------------------------------------------------------------------------- /bin/XMB/color/ico4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/XMB/color/ico4.png -------------------------------------------------------------------------------- /bin/XMB/color/ico5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/XMB/color/ico5.png -------------------------------------------------------------------------------- /bin/XMB/color/ico6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/XMB/color/ico6.png -------------------------------------------------------------------------------- /bin/XMB/color/ico7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/XMB/color/ico7.png -------------------------------------------------------------------------------- /bin/XMB/color/ico8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/XMB/color/ico8.png -------------------------------------------------------------------------------- /bin/XMB/color/ico9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/XMB/color/ico9.png -------------------------------------------------------------------------------- /bin/XMB/dash/dash_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/XMB/dash/dash_bg.png -------------------------------------------------------------------------------- /bin/XMB/dash/dash_bg_overlay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/XMB/dash/dash_bg_overlay.png -------------------------------------------------------------------------------- /bin/XMB/dash/dash_clock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/XMB/dash/dash_clock.png -------------------------------------------------------------------------------- /bin/XMB/dash/dash_clock_outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/XMB/dash/dash_clock_outline.png -------------------------------------------------------------------------------- /bin/XMB/dash/dash_context.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/XMB/dash/dash_context.png -------------------------------------------------------------------------------- /bin/XMB/dash/dash_icons.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /bin/XMB/dash/dash_load.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/XMB/dash/dash_load.png -------------------------------------------------------------------------------- /bin/XMB/dash/dash_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/XMB/dash/dash_logo.png -------------------------------------------------------------------------------- /bin/XMB/dash/dash_option_box.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/XMB/dash/dash_option_box.png -------------------------------------------------------------------------------- /bin/XMB/dash/dash_submenu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/XMB/dash/dash_submenu.png -------------------------------------------------------------------------------- /bin/XMB/dash/triangle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HiroTex/OSD-XMB/2d3345d7645fae6ba708a8bf90acfba30da3e3de/bin/XMB/dash/triangle.png -------------------------------------------------------------------------------- /bin/XMB/js/config.js: -------------------------------------------------------------------------------- 1 | ////////////////////////////////////////////////////////////////////////// 2 | ///* CONFIG */// 3 | /// /// 4 | /// This will handle configurations to '.cfg' files to /// 5 | /// customize settings and user preferences. /// 6 | /// /// 7 | ////////////////////////////////////////////////////////////////////////// 8 | 9 | /* Info: 10 | 11 | This is the main Configuration Object to 12 | handle getting, setting, pushing or Processing 13 | configurations. 14 | 15 | Get: Get a Configuration Item from a file path or memory 16 | if it has been already pushed. 17 | 18 | Set: Write a Configuration Item directly to a file. 19 | This should not be used directly and it is better to 20 | let the Process function do it when exiting the app. 21 | 22 | Push: Push a Configuration Item to a queue that will be 23 | executed when the app is exiting. 24 | 25 | Process: Processes all queued configuration items before 26 | exiting the app. 27 | 28 | */ 29 | 30 | DATA.CONFIG = { 31 | 32 | configPath: `${os.getcwd()[0]}/CFG/`, 33 | queue: [], 34 | 35 | Get: function(path) 36 | { 37 | // Check if an item with the same path already exists in the queue list 38 | const existingItem = this.queue.find(item => item.path === path); 39 | 40 | if (existingItem) { return existingItem.config; } 41 | 42 | const fullPath = `${this.configPath}${path}`; 43 | const pathParts = fullPath.split('/'); 44 | const filename = pathParts.pop(); 45 | const directory = pathParts.join('/'); 46 | 47 | const hasfile = os.readdir(directory)[0].includes(filename); 48 | if (!hasfile) { return {}; } // Return Empty Table if not found 49 | 50 | // Read each line for config. 51 | let config = {}; 52 | let errObj = {}; 53 | const file = std.open(fullPath, "r", errObj); 54 | 55 | if (file) 56 | { 57 | while (!file.eof()) 58 | { 59 | let line = file.getline(); 60 | if (line && line.includes('=')) 61 | { // Ensure the line is not empty and contains an '=' 62 | line = line.trim(); // Read and trim whitespace 63 | const [key, value] = line.split('='); // Split into key and value 64 | config[key.trim()] = value.trim(); // Trim and store in the config object 65 | } 66 | } 67 | 68 | file.close(); 69 | } 70 | else 71 | { 72 | xmblog(`IO ERROR: ${std.strerror(errObj.errno)}`); 73 | } 74 | 75 | return config; 76 | }, 77 | 78 | Set: function(path, config) 79 | { 80 | xmblog("Saving File: " + path); 81 | path = `${this.configPath}${path}`; 82 | const lines = []; // Create an array to store each line 83 | 84 | // Iterate through the table and write each key-value pair 85 | for (const key in config) 86 | { 87 | const line = `${key.toString()}=${config[key].toString()}`; // Format as KEY=VALUE 88 | lines.push(line); 89 | } 90 | 91 | ftxtWrite(path, lines.join('\n')); // Write the lines to the file 92 | }, 93 | 94 | Push: function (path, newConfig) 95 | { 96 | // Check if an item with the same path already exists 97 | const existingItem = this.queue.find(item => item.path === path); 98 | 99 | // Update the config of the existing item by merging 100 | if (existingItem) 101 | { 102 | // Merge existing config with the newConfig 103 | existingItem.config = 104 | { 105 | ...existingItem.config, // Retain existing keys and values 106 | ...newConfig // Overwrite or add new keys from newConfig 107 | }; 108 | } 109 | else 110 | { 111 | // Add a new item to the queue 112 | this.queue.push({ path, config: newConfig }); 113 | } 114 | }, 115 | 116 | Process: function() 117 | { 118 | while (this.queue.length > 0) 119 | { 120 | const { path, config } = this.queue.shift(); // Remove and get the first item in the queue 121 | this.Set(path, config); // Call the Set function for processing 122 | } 123 | }, 124 | 125 | SetConfigPath: function(path) 126 | { 127 | this.configPath = path; 128 | }, 129 | }; 130 | 131 | if (`${os.getcwd()[0]}/`.endsWith("//")) 132 | { 133 | DATA.CONFIG.SetConfigPath(`${os.getcwd()[0]}CFG/`); 134 | } 135 | 136 | // Get the main Configuration File of the App and Parse its configuration if it has them. 137 | 138 | function ParseMainCFG() 139 | { 140 | const mainCFG = DATA.CONFIG.Get("main.cfg"); 141 | 142 | // If the main Configuration file does not exist, return. 143 | 144 | if (mainCFG.length < 1) { return; } 145 | 146 | // Get the user's preferred Video Mode. 147 | if ("vmode" in mainCFG) 148 | { 149 | if (DATA.CANVAS.mode != vmodes[Number(mainCFG["vmode"])].Value) 150 | { 151 | DATA.CANVAS.mode = vmodes[Number(mainCFG["vmode"])].Value; 152 | setScreenHeight(); 153 | setScreenWidth(); 154 | setScreeniMode(); 155 | Screen.setMode(DATA.CANVAS); 156 | DATA.SCREEN_PREVMODE = DATA.CANVAS.mode; 157 | TextRender.SetScreenDimensions(); 158 | } 159 | } 160 | 161 | // Get the user's preferred Aspect Ratio. 162 | if ("aspect" in mainCFG) 163 | { 164 | DATA.WIDESCREEN = (mainCFG["aspect"].toLowerCase() === "true"); 165 | setScreenWidth(); 166 | Screen.setMode(DATA.CANVAS); 167 | TextRender.SetScreenDimensions(); 168 | } 169 | 170 | // Get the user's preferred Parental Settings. 171 | if ("parental" in mainCFG) { DATA.PARENTAL = (mainCFG["parental"].toLowerCase() === "true"); } 172 | if ("prntcode" in mainCFG) { DATA.PRNTCODE = JSON.parse(mainCFG["prntcode"]); } 173 | 174 | // Get the user's preferred System Settings. 175 | if ("lang" in mainCFG) { DATA.LANGUAGE = Number(mainCFG["lang"]); } 176 | if ("btnType" in mainCFG) { DATA.BTNTYPE = Number(mainCFG["btnType"]); } 177 | 178 | // Get the user's preferred Date and Hour Formats. 179 | if ("dateFormat" in mainCFG) { DATA.DATE_FORMAT = Number(mainCFG["dateFormat"]); } 180 | if ("hourFormat" in mainCFG) { DATA.HOUR_FORMAT = Number(mainCFG["hourFormat"]); } 181 | if ("timezone" in mainCFG) { DATA.TIME_ZONE = Number(mainCFG["timezone"]); } 182 | if ("timezoneVal" in mainCFG) { DATA.TIMEZONEVAL = Number(mainCFG["timezoneVal"]); } 183 | 184 | // Set the user preferred Background Color. 185 | 186 | if ("BgColor" in mainCFG) 187 | { 188 | // If set to 0, use dynamic month based background color. 189 | // Else, use the custom background color. 190 | 191 | DATA.BGVAL = Number(mainCFG["BgColor"]); 192 | DATA.BGTMP = DATA.BGVAL; 193 | DATA.BGCOL = (DATA.BGVAL == 0) ? DATA.BGCOL : DATA.BGVAL; 194 | currentBgColor = monthColors[DATA.BGCOL]; 195 | Waves.setThemeColor(currentBgColor); 196 | themeColor = Color.new(currentBgColor.r, currentBgColor.g, currentBgColor.b, currentBgColor.a); 197 | } 198 | 199 | // Set Background Waves 200 | 201 | if ("waves" in mainCFG) { DATA.BGWAVES = (mainCFG["waves"].toLowerCase() === "true"); } 202 | 203 | // Set Background Image settings. 204 | 205 | if ("customBg" in mainCFG) { 206 | DATA.CUSTOMBG_PATH = mainCFG["customBg"]; 207 | if (std.exists(DATA.CUSTOMBG_PATH)) { 208 | DATA.BGIMG = new Image(DATA.CUSTOMBG_PATH); 209 | DATA.BGIMG.optimize(); 210 | DATA.BGIMG.filter = LINEAR; 211 | } 212 | } 213 | 214 | if ("displayBg" in mainCFG) { DATA.DISPLAYBG = (mainCFG["displayBg"] === "true"); } 215 | 216 | // Init Network 217 | 218 | if (("net" in mainCFG) && (mainCFG["net"].toLowerCase() === "true")) { NetInit(); } 219 | 220 | // Get the user's preferred Theme and execute the Theme's code if any. 221 | if ("Theme" in mainCFG) 222 | { 223 | DATA.THEME_PATH = `THM/${mainCFG["Theme"]}/`; 224 | if (os.readdir(DATA.THEME_PATH)[0].includes("thm.js")) 225 | { 226 | std.loadScript(`${DATA.THEME_PATH}thm.js`); 227 | } 228 | 229 | if (mainCFG["Theme"] !== "Original") { DATA.OVALPHA = 0; } 230 | } 231 | 232 | const neutconfig = DATA.CONFIG.Get("neutrino.cfg"); 233 | 234 | if ("logo" in neutconfig) { DATA.GAMESETS.LOGO = (neutconfig["logo"] === "true"); } 235 | if ("dbc" in neutconfig) { DATA.GAMESETS.DBC = (neutconfig["dbc"] === "true"); } 236 | if ("gsm" in neutconfig) { DATA.GAMESETS.GSM = (neutconfig["gsm"] === "true"); } 237 | } 238 | 239 | xmblog("INIT: CONFIG INIT COMPLETE"); 240 | -------------------------------------------------------------------------------- /bin/XMB/js/net.js: -------------------------------------------------------------------------------- 1 | ////////////////////////////////////////////////////////////////////////// 2 | ///* NETWORK */// 3 | /// /// 4 | /// This will initilize all network-related configurations /// 5 | /// and settings. /// 6 | /// /// 7 | ////////////////////////////////////////////////////////////////////////// 8 | 9 | // Network System Initilization 10 | 11 | function NetInit() 12 | { 13 | // Check if Network is already initialized 14 | if (DATA.NET) { return; } 15 | else 16 | { 17 | const config = Network.getConfig(); 18 | if ((config) && (config.ip.toString() !== "0.0.0.0")) { DATA.NET = true; return; } 19 | else if (DATA.NETTRY) { return; } 20 | } 21 | 22 | try 23 | { 24 | xmblog("NETWORK: Initializing Network"); 25 | IOP.loadDefaultModule(IOP.network); 26 | Network.init(); 27 | 28 | // Check if Valid IP found 29 | if (Network.getConfig().ip.toString() !== "0.0.0.0") { DATA.NET = true; } 30 | } 31 | catch (err) 32 | { 33 | xmblog("NETWORK: Error Initializing Network " + err); 34 | } 35 | 36 | DATA.NETTRY = true; 37 | } 38 | 39 | // Network System Exit 40 | function NetExit() 41 | { 42 | // Check if Network is already deinitialized 43 | if (!DATA.NET) { return; } 44 | 45 | try 46 | { 47 | Network.deinit(); 48 | DATA.NET = false; 49 | } 50 | catch (err) 51 | { 52 | xmblog("NETWORK: Error Deinitializing Network " + err); 53 | } 54 | } 55 | 56 | function NetCfgSave() 57 | { 58 | let config = DATA.CONFIG.Get("main.cfg"); 59 | config["net"] = DATA.NET.toString(); 60 | DATA.CONFIG.Push("main.cfg", config); 61 | } 62 | 63 | xmblog("INIT: NETWORK INIT COMPLETE"); 64 | -------------------------------------------------------------------------------- /bin/XMB/js/screen.js: -------------------------------------------------------------------------------- 1 | ////////////////////////////////////////////////////////////////////////// 2 | ///* SCREEN */// 3 | /// /// 4 | /// This script will initialize the Screen Info and provide /// 5 | /// functions to manage it. /// 6 | /// /// 7 | ////////////////////////////////////////////////////////////////////////// 8 | 9 | function setScreenWidth() 10 | { 11 | DATA.CANVAS.width = (DATA.WIDESCREEN) ? 704 : 640; 12 | } 13 | function setScreenHeight() 14 | { 15 | switch (DATA.CANVAS.mode) 16 | { 17 | case NTSC: 18 | case DTV_480p: DATA.CANVAS.height = 448; break; 19 | case PAL: DATA.CANVAS.height = 512; break; 20 | } 21 | } 22 | function setScreeniMode() 23 | { 24 | switch (DATA.CANVAS.mode) 25 | { 26 | case NTSC: 27 | case PAL: DATA.CANVAS.interlace = INTERLACED; break; 28 | case DTV_480p: DATA.CANVAS.interlace = PROGRESSIVE; break; 29 | } 30 | } 31 | 32 | // The 6 possible video modes that Athena can set. 33 | // Used by the "Video Settings" plugin. 34 | 35 | const vmodes = []; 36 | vmodes.push({ Name: "NTSC", Value: NTSC }); 37 | vmodes.push({ Name: "PAL", Value: PAL }); 38 | vmodes.push({ Name: "DTV 480p", Value: DTV_480p }); 39 | vmodes.push({ Name: "DTV 576p", Value: DTV_576p }); 40 | vmodes.push({ Name: "DTV 720p", Value: DTV_720p }); 41 | vmodes.push({ Name: "DTV 1080i", Value: DTV_1080i }); 42 | 43 | // Set Screen Parameters. 44 | 45 | DATA.CANVAS.double_buffering = true; 46 | DATA.CANVAS.zbuffering = false; 47 | Screen.setMode(DATA.CANVAS); 48 | Screen.setVSync(true); 49 | if (DBGMODE) { Screen.setFrameCounter(true); } 50 | DATA.SCREEN_PREVMODE = DATA.CANVAS.mode; // Store current Canvas mode for backup. 51 | 52 | xmblog("INIT: SCREEN INIT COMPLETE"); 53 | -------------------------------------------------------------------------------- /bin/XMB/js/sound.js: -------------------------------------------------------------------------------- 1 | ////////////////////////////////////////////////////////////////////////// 2 | ///* SOUND */// 3 | /// /// 4 | /// NOTE: Most of the Sound System will be disabled since /// 5 | /// Athena can't process sounds very well in its current /// 6 | /// state (V3). /// 7 | /// /// 8 | ////////////////////////////////////////////////////////////////////////// 9 | 10 | const soundEnabled = false; 11 | 12 | Sound.setVolume(0); 13 | 14 | // Load Boot Sound Effect and play it immediatelly. 15 | const sfx_boot = (std.exists(`${DATA.THEME_PATH}sound/snd_boot.wav`)) ? `${DATA.THEME_PATH}sound/snd_boot.wav` : `./THM/Original/sound/snd_boot.wav`; 16 | let currAudioDuration = calculateWavValue(sfx_boot); 17 | let AudioPlaying = Sound.load(sfx_boot); 18 | 19 | const sfx_cursor = (std.exists(`${DATA.THEME_PATH}sound/snd_cursor.wav`)) ? `${DATA.THEME_PATH}sound/snd_cursor.wav` : `./THM/Original/sound/snd_cursor.wav`; 20 | const cursorSFX_AudioDuration = (!soundEnabled) ? 0 : calculateWavValue(sfx_cursor); 21 | const cursorSFX = (!soundEnabled) ? false : Sound.load(sfx_cursor); 22 | 23 | const sfx_cancel = (std.exists(`${DATA.THEME_PATH}sound/snd_cancel.wav`)) ? `${DATA.THEME_PATH}sound/snd_cancel.wav` : `./THM/Original/sound/snd_cancel.wav`; 24 | const cancelSFX_AudioDuration = (!soundEnabled) ? 0 : calculateWavValue(sfx_cancel); 25 | const cancelSFX = (!soundEnabled) ? false : Sound.load(sfx_cancel); 26 | 27 | /* Manual Sound Stop process to avoid the audio to finish (and crash the app) */ 28 | 29 | function SoundStopProcess() 30 | { 31 | let audCurPos = Sound.getPosition(AudioPlaying); 32 | 33 | if (Sound.isPlaying() && (currAudioDuration <= audCurPos)) 34 | { 35 | Sound.setVolume(0); 36 | Sound.setPosition(AudioPlaying, 0); 37 | Sound.pause(AudioPlaying); 38 | xmblog("SFX LEN: " + currAudioDuration); 39 | xmblog("SFX POS: " + audCurPos); 40 | } 41 | } 42 | 43 | /* Manual WAV Length calculation value to avoid using 'getDuration' method */ 44 | /* using the 'getDuration' method will make any sound crash when finishing. */ 45 | 46 | function calculateWavValue(filePath) 47 | { 48 | // Open the file 49 | const file = std.open(filePath, "rb"); 50 | 51 | // Helper to read 4 bytes as a 32-bit little-endian integer 52 | const readUInt32LE = (buffer) => 53 | { 54 | return (buffer[0]) | 55 | (buffer[1] << 8) | 56 | (buffer[2] << 16) | 57 | (buffer[3] << 24); 58 | }; 59 | 60 | // Read Data Size (4 bytes from position 4) 61 | const dataSizeBuffer = new Uint8Array(4); // Allocate a 4-byte buffer 62 | file.seek(4, std.SEEK_SET); 63 | file.read(dataSizeBuffer.buffer, 0, 4); // Read 4 bytes starting at position 4 64 | const dataSize = readUInt32LE(dataSizeBuffer); 65 | 66 | // Read Samples Per Second (4 bytes from position 24) 67 | const samplesPerSecondBuffer = new Uint8Array(4); // Allocate a 4-byte buffer 68 | file.seek(28, std.SEEK_SET); 69 | file.read(samplesPerSecondBuffer.buffer, 0, 4); // Read 4 bytes starting at position 24 70 | const samplesPerSecond = readUInt32LE(samplesPerSecondBuffer); 71 | 72 | file.close(); 73 | 74 | // Compute the result 75 | const result = Math.round((dataSize / samplesPerSecond) * 1000); 76 | return Math.round(result - (result / 40)); 77 | } 78 | 79 | /* Play a Sound file from 'path' */ 80 | 81 | function playSound(path) 82 | { 83 | if (!path.endsWith(".wav")) { return; } 84 | 85 | Sound.pause(AudioPlaying); 86 | currAudioDuration = calculateWavValue(path); 87 | let audioToPlay = Sound.load(path); 88 | 89 | Sound.setVolume(100); 90 | Sound.play(audioToPlay, 0); 91 | Sound.repeat(false); 92 | 93 | let audioPrevious = AudioPlaying; 94 | AudioPlaying = audioToPlay; 95 | 96 | if (AudioPlaying != cursorSFX && AudioPlaying != cancelSFX) 97 | { 98 | Sound.free(audioPrevious); 99 | } 100 | } 101 | 102 | /* Play the XMB's Cursor movement SFX */ 103 | 104 | function playCursorSFX() 105 | { 106 | if (!soundEnabled) { return; } 107 | 108 | Sound.setVolume(100); 109 | 110 | if (AudioPlaying != cursorSFX && AudioPlaying != cancelSFX) 111 | { 112 | Sound.pause(AudioPlaying); 113 | currAudioDuration = cursorSFX_AudioDuration; 114 | let audioPrevious = AudioPlaying; 115 | AudioPlaying = cursorSFX; 116 | Sound.play(AudioPlaying, 0); 117 | Sound.free(audioPrevious); 118 | } 119 | else 120 | { 121 | Sound.restart(AudioPlaying); 122 | Sound.play(AudioPlaying); 123 | } 124 | } 125 | 126 | /* Play the XMB's Cancel SFX */ 127 | 128 | function playCancelSFX() 129 | { 130 | if (!soundEnabled) { return; } 131 | 132 | Sound.setVolume(100); 133 | 134 | if (AudioPlaying != cancelSFX && AudioPlaying != cursorSFX) 135 | { 136 | Sound.pause(AudioPlaying); 137 | currAudioDuration = cancelSFX_AudioDuration; 138 | let audioPrevious = AudioPlaying; 139 | AudioPlaying = cancelSFX; 140 | Sound.play(AudioPlaying, 0); 141 | Sound.free(audioPrevious); 142 | } 143 | else 144 | { 145 | Sound.restart(AudioPlaying); 146 | Sound.play(AudioPlaying); 147 | } 148 | } 149 | 150 | xmblog("INIT: SOUND INIT COMPLETE"); 151 | -------------------------------------------------------------------------------- /bin/XMB/js/text.js: -------------------------------------------------------------------------------- 1 | ////////////////////////////////////////////////////////////////////////// 2 | ///* TEXT */// 3 | /// /// 4 | /// Here are all the localization strings and Text Rendering /// 5 | /// functions, as well as the Font initialization. /// 6 | /// /// 7 | ////////////////////////////////////////////////////////////////////////// 8 | 9 | ////////////////////////////////////////////////////////////////////////// 10 | ///* LOCALIZATION STRINGS */// 11 | ////////////////////////////////////////////////////////////////////////// 12 | 13 | const langPath = "./XMB/lang/"; 14 | const XMBLANG = {}; 15 | 16 | const files = os.readdir(langPath)[0]; 17 | for (const file of files) 18 | { 19 | if (file.endsWith(".json")) 20 | { 21 | const filePath = langPath + file; 22 | try 23 | { 24 | const data = JSON.parse(std.loadFile(filePath)); 25 | Object.assign(XMBLANG, data); // Merge into XMBLANG 26 | } catch (e) 27 | { 28 | logl(`Error loading ${file}: ${e.message}\n`); 29 | } 30 | } 31 | } 32 | 33 | // Category Names, one for each category on the 7 different languages. 34 | 35 | const CAT_NAMES = []; 36 | CAT_NAMES.push(XMBLANG.CATEGORY.USER); 37 | CAT_NAMES.push(XMBLANG.CATEGORY.SETTINGS); 38 | CAT_NAMES.push(XMBLANG.CATEGORY.PHOTO); 39 | CAT_NAMES.push(XMBLANG.CATEGORY.MUSIC); 40 | CAT_NAMES.push(XMBLANG.CATEGORY.VIDEO); 41 | CAT_NAMES.push(XMBLANG.CATEGORY.GAME); 42 | CAT_NAMES.push(XMBLANG.CATEGORY.NETWORK); 43 | 44 | ////////////////////////////////////////////////////////////////////////// 45 | ///* PARAMETERS */// 46 | ////////////////////////////////////////////////////////////////////////// 47 | 48 | // Index for Left-to-right scrolling text 49 | let scrollIndex = 0; 50 | 51 | // Default Text Color 52 | const textColor = { r:255, g:255, b:255, a:128 }; 53 | 54 | // glowText object for selected text glowing animation. 55 | const glowText = { Dir: 1, Value: 1, Min: 0, Max: 64, }; 56 | 57 | // Var for Pre-processed Boot Warning Text. 58 | let BOOT_WARNING_TEXT = false; 59 | 60 | ////////////////////////////////////////////////////////////////////////// 61 | ///* FONT */// 62 | ////////////////////////////////////////////////////////////////////////// 63 | 64 | // Init Font System 65 | let font_m = false; 66 | let font_s = false; 67 | let font_ss = false; 68 | 69 | function LoadFONT() 70 | { 71 | let font_path = `./THM/Original/text/font.ttf`; // Default Font 72 | if ((os.readdir(`${DATA.THEME_PATH}`)[0].includes("text")) && (os.readdir(`${DATA.THEME_PATH}text/`)[0].includes("font.ttf"))) 73 | { 74 | font_path = `${DATA.THEME_PATH}text/font.ttf` 75 | } 76 | 77 | font_m = new Font(font_path); 78 | font_s = new Font(font_path); 79 | font_ss = new Font(font_path); 80 | font_m.scale = 0.65f; 81 | font_s.scale = 0.5f; 82 | font_ss.scale = 0.44f; 83 | } 84 | 85 | ////////////////////////////////////////////////////////////////////////// 86 | ///* TEXT RENDERER */// 87 | ////////////////////////////////////////////////////////////////////////// 88 | 89 | // Main Text Render object that will handle all text rendering on screen. 90 | 91 | const TextRender = { 92 | currentFont: null, 93 | x: 0, 94 | y: 0, 95 | basex: 0, 96 | basey: 0, 97 | maxWidth: 512, 98 | screenWidth: 640, 99 | screenHeight: 448, 100 | textColor: Color.new(255, 255, 255, 128), 101 | 102 | // SetFont method to set the current font 103 | SetFont: function(font) { 104 | this.currentFont = font; 105 | }, 106 | 107 | // SetPosition method to set the position for text rendering 108 | SetPosition: function(x, y) { 109 | this.x = x; 110 | this.y = y; 111 | this.basex = x; 112 | this.basey = y; 113 | }, 114 | 115 | // SetTextColor method to set the color for the main text line 116 | SetTextColor: function(r, g, b, a) { 117 | if (a < 0) { a = 0; } 118 | if (a > 128) { a = 128; } 119 | this.textColor = Color.new(r, g, b, a); 120 | }, 121 | 122 | // Function to get screen width and height from Screen.getMode() 123 | SetScreenDimensions: function() { 124 | const canvas = Screen.getMode(); // Assuming it returns an object with width and height properties 125 | this.maxWidth = 512; 126 | this.screenWidth = 640; 127 | this.screenHeight = canvas.height; 128 | }, 129 | 130 | // Function to process the input text into lines based on pixel width 131 | ProcessText: function(text) { 132 | let lines = typeof text === 'string' ? text.split('\n') : text; 133 | let finalLines = []; 134 | 135 | lines.forEach((line) => 136 | { 137 | let splitLines = (this.currentFont.getTextSize(line).width < this.maxWidth) ? [ line ] : this.WrapTextByPixelWidth(line); 138 | finalLines.push(...splitLines); 139 | }); 140 | 141 | return finalLines; 142 | }, 143 | 144 | // Wrap text based on pixel width (line wrapping) 145 | WrapTextByPixelWidth: function(line) { 146 | let lines = []; 147 | let words = line.split(' '); 148 | let currentLine = ''; 149 | let currentWidth = 0; 150 | 151 | // Precompute word widths to avoid repeated calls 152 | let wordWidths = words.map(word => this.currentFont.getTextSize(word).width); 153 | let spaceWidth = this.currentFont.getTextSize(' ').width; 154 | 155 | let i = 0; 156 | while (i < words.length) 157 | { 158 | let start = i; 159 | let end = words.length; 160 | let bestFitIndex = start; 161 | 162 | // Binary search for the longest segment that fits within maxWidth 163 | while (start < end) 164 | { 165 | let mid = Math.floor((start + end) / 2); 166 | let testWidth = wordWidths.slice(i, mid + 1).reduce((sum, w) => sum + w, 0) + (mid - i) * spaceWidth; 167 | 168 | if (testWidth <= this.maxWidth) 169 | { 170 | bestFitIndex = mid; 171 | start = mid + 1; 172 | } else 173 | { 174 | end = mid; 175 | } 176 | } 177 | 178 | // Form the best-fitting line 179 | currentLine = words.slice(i, bestFitIndex + 1).join(' '); 180 | lines.push(currentLine); 181 | 182 | // Move to the next set of words 183 | i = bestFitIndex + 1; 184 | } 185 | 186 | return lines; 187 | }, 188 | 189 | // Calculate alignment position for text 190 | CalculateAlignedPosition: function(lines, alignment) { 191 | 192 | if (alignment === "LEFT") { return; } 193 | 194 | let totalTextWidth = 0; 195 | let totalTextHeight = 0; 196 | let longestLine = ""; 197 | let lineSize = this.currentFont.scale * 32 198 | 199 | lines.forEach((line) => 200 | { 201 | if (line.length > longestLine.length) { longestLine = line; } 202 | totalTextHeight += lineSize; 203 | }); 204 | 205 | totalTextWidth = this.currentFont.getTextSize(longestLine).width; 206 | 207 | if (alignment === "CENTER") { 208 | this.x = ((this.screenWidth - totalTextWidth) / 2) + this.basex; 209 | } else if (alignment === "RIGHT") { 210 | this.x = (this.screenWidth - totalTextWidth) + this.basex; 211 | } 212 | 213 | if (alignment === "CENTER") { this.y = ((this.screenHeight - totalTextHeight) / 2) + this.basey; } 214 | }, 215 | 216 | // Print method to render text, with shadow and alignment 217 | Print: function(lines, alignment = "LEFT", outline = true) 218 | { 219 | // If only one line, make an array of one item. 220 | 221 | if (typeof lines === 'string') { lines = [lines]; } 222 | 223 | this.CalculateAlignedPosition(lines, alignment); 224 | 225 | const opacity = Color.getA(this.textColor); 226 | const shadowOpacity = Math.max(0, opacity - 32); 227 | 228 | lines.forEach((line, index) => 229 | { 230 | const lineY = this.y + index * (this.currentFont.scale * 32); 231 | 232 | if ((outline) && (shadowOpacity > 0)) 233 | { 234 | this.currentFont.color = Color.new(0, 0, 0, shadowOpacity); 235 | this.currentFont.print(this.x + 1, lineY + 1, line); 236 | } 237 | 238 | this.currentFont.color = this.textColor; 239 | this.currentFont.print(this.x, lineY, line); 240 | }); 241 | } 242 | }; 243 | 244 | /* Info: 245 | 246 | Main Function to render Text on Screen with several options. 247 | txt: String to render on screen. 248 | clr: Text Color. 249 | pos: Object with properties x and y to set the Text Position on screen. 250 | align: Text Alignment. Default is LEFT, but can be set to "CENTER" or "RIGHT". 251 | font: Text Font to use, default is "small". 252 | glow: Boolean to indicate if text should glow or not. 253 | */ 254 | 255 | function TxtPrint(txt, clr, pos, align = "LEFT", font = font_s, glow = false) 256 | { 257 | if ((txt != "") && (clr.a > 0)) 258 | { 259 | TextRender.SetFont(font); 260 | TextRender.SetTextColor(clr.r, clr.g, clr.b, clr.a); 261 | TextRender.SetPosition(pos.x, pos.y); 262 | TextRender.Print(txt, align); 263 | 264 | if (glow) 265 | { 266 | if (glowText.Value == glowText.Max) { glowText.Dir = -1; } 267 | if (glowText.Value == glowText.Min) { glowText.Dir = 1; } 268 | glowText.Value = glowText.Value + glowText.Dir; 269 | TextRender.SetTextColor(clr.r, clr.g, clr.b, glowText.Value * 2); 270 | TextRender.SetPosition(pos.x + 1, pos.y); 271 | TextRender.Print(txt, align, false); 272 | } 273 | } 274 | } 275 | 276 | // Function exclusively made to render the Boot Warning Text at Boot. 277 | function DisplayBootWarningText(alpha) 278 | { 279 | if (BOOT_WARNING_TEXT === false) 280 | { 281 | TextRender.SetFont(font_s); 282 | BOOT_WARNING_TEXT = TextRender.ProcessText(XMBLANG.BOOT_WARNING[DATA.LANGUAGE]); 283 | } 284 | 285 | TxtPrint(BOOT_WARNING_TEXT, { r: 255, g: 255, b: 255, a: alpha }, { x: 10 + (DATA.WIDESCREEN * 32), y: -20 }, "CENTER"); 286 | } 287 | 288 | // Function exclusively made to render the Debug Info at the bottom of the screen. 289 | function PrintDebugInfo() 290 | { 291 | if (!DBGMODE) { return; } 292 | let mem = System.getMemoryStats(); 293 | TxtPrint(`${Screen.getFPS(360)} FPS - RAM USAGE: ${Math.floor(mem.used / 1024)}KB / ${Math.floor(DATA.EE_INFO.RAMSize / 1024)}KB - W: ${DATA.CANVAS.width} H: ${DATA.CANVAS.height} - FREE VRAM: ${Screen.getFreeVRAM()} KB`, textColor, { x:20 + (DATA.WIDESCREEN * 32), y: DATA.CANVAS.height - 40 }, "LEFT", font_ss); 294 | } 295 | 296 | // Set Text Renderer Initial Parameters 297 | TextRender.SetScreenDimensions(); 298 | 299 | xmblog("INIT: TEXT INIT COMPLETE"); 300 | -------------------------------------------------------------------------------- /bin/XMB/js/xml.js: -------------------------------------------------------------------------------- 1 | ////////////////////////////////////////////////////////////////////////// 2 | ///* XML */// 3 | /// /// 4 | /// This script handles support for custom XML files for the /// 5 | /// app /// 6 | /// /// 7 | ////////////////////////////////////////////////////////////////////////// 8 | 9 | function xmlParseAttributes(attributesString) 10 | { 11 | const attributes = {}; 12 | let i = 0, len = attributesString.length; 13 | 14 | while (i < len) 15 | { 16 | // Skip leading whitespace 17 | while (i < len && attributesString.charCodeAt(i) <= 32) i++; 18 | 19 | // Break early if end of string after whitespace 20 | if (i >= len) { break; } 21 | 22 | // Find attribute name start 23 | let nameStart = i; 24 | while (i < len && attributesString.charCodeAt(i) !== 61) i++; // '=' 25 | 26 | // Extract name (avoid multiple slice/trim calls) 27 | const nameEnd = i; 28 | while (nameEnd > nameStart && attributesString.charCodeAt(nameEnd - 1) <= 32) i--; 29 | const name = attributesString.slice(nameStart, nameEnd); 30 | 31 | // Skip '="' 32 | i += 2; 33 | 34 | // Find attribute value 35 | let valueStart = i; 36 | while (i < len && attributesString.charCodeAt(i) !== 34) i++; // '"' 37 | 38 | attributes[name] = attributesString.slice(valueStart, i); 39 | 40 | // Move past closing quote 41 | i++; 42 | } 43 | 44 | return attributes; 45 | } 46 | function xmlParseElement(xmlData) 47 | { 48 | // Trim for performance-critical operations 49 | xmlData = xmlData.trim(); 50 | 51 | // Quick self-closing tag check using direct string methods 52 | if (xmlData.charCodeAt(xmlData.length - 2) === 47) 53 | { // '/' 54 | const spaceIndex = xmlData.indexOf(' '); 55 | return { 56 | tagName: xmlData.slice(1, spaceIndex > -1 ? spaceIndex : -2), 57 | attributes: spaceIndex > -1 ? xmlParseAttributes(xmlData.slice(spaceIndex + 1, -2)) : {}, 58 | children: [] 59 | }; 60 | } 61 | 62 | // Find tag boundaries using indexOf for speed 63 | const openTagEnd = xmlData.indexOf('>'); 64 | const closeTagStart = xmlData.lastIndexOf(' -1 ? firstTag.slice(0, spaceIndex) : firstTag, 74 | attributes: spaceIndex > -1 ? xmlParseAttributes(firstTag.slice(spaceIndex + 1)) : {}, 75 | children: [] 76 | }; 77 | 78 | let body = xmlData.slice(openTagEnd + 1, closeTagStart).trim(); 79 | 80 | const cdataStart = body.indexOf("", cdataStart); 84 | cdataEnd !== -1 && (element.cdata = body.slice(cdataStart + 9, cdataEnd)); 85 | return element; 86 | } 87 | 88 | const childRegex = /<(\w+)([^>]*)\s*\/>|<(\w+)([^>]*)>([\s\S]*?)<\/\3>/g; 89 | let childMatch; 90 | 91 | while ((childMatch = childRegex.exec(body)) !== null) 92 | { 93 | const fullChildXML = childMatch[0]; 94 | const child = xmlParseElement(fullChildXML); 95 | if (child) 96 | { 97 | element.children.push(child); 98 | } 99 | } 100 | 101 | return element; 102 | } 103 | function xmlGetLangObj(match) 104 | { 105 | const keys = match[1].split('.'); // Split by dot to access nested properties 106 | let value = XMBLANG; 107 | 108 | for (const key of keys) 109 | { 110 | if (value && typeof value === 'object' && key in value) 111 | { 112 | value = value[key]; // Traverse the object 113 | } 114 | else 115 | { 116 | return ""; // Return null if any key is missing 117 | } 118 | } 119 | 120 | return value; // Return the found object (string array) 121 | } 122 | function xmlGetLocalizedString(element, attributeName) 123 | { 124 | const tag = element.children.find(child => child.tagName === attributeName); 125 | if (tag) 126 | { 127 | return tag.children.map(child => child.attributes.str); 128 | } 129 | if (attributeName in element.attributes) 130 | { 131 | // Check if the attribute value is a language object (e.g. "{SOME_KEY}") 132 | const match = element.attributes[attributeName].match(/^\{(.+)\}$/); 133 | if (match) { return xmlGetLangObj(match); } 134 | return element.attributes[attributeName]; 135 | } 136 | 137 | return ""; 138 | } 139 | function xmlParseIcon(element) 140 | { 141 | const match = element.match(/^\{(.+)\}$/); 142 | if (match) { return std.evalScript(match[1]); } 143 | else if (element.startsWith('#')) { return findDashIcon(element.slice(1)); } 144 | return parseInt(element); 145 | } 146 | function xmlParseElfTag(element) 147 | { 148 | // Parse the ELF-specific Value tag 149 | const Value = {}; 150 | 151 | const valueTag = element.children.find(child => child.tagName === "Value"); 152 | if (valueTag) 153 | { 154 | Value.Path = valueTag.attributes.Path; 155 | Value.Args = ((valueTag.attributes.Args === undefined) || (valueTag.attributes.Args === "")) ? [] : valueTag.attributes.Args.split(",").map(arg => arg.trim()); 156 | } 157 | 158 | return Value; 159 | } 160 | function xmlParseCodeTag(element) 161 | { 162 | const codeTag = element.children.find(child => child.tagName === "Code"); 163 | if (codeTag) 164 | { 165 | if ("filepath" in codeTag.attributes) { return codeTag.attributes.filepath; } 166 | else if ("cdata" in codeTag) { return std.evalScript(`(${codeTag.cdata})`); } 167 | } 168 | 169 | // No code tag found, return empty function 170 | return `()`; 171 | } 172 | function xmlParseDialogTag(element) 173 | { 174 | if (!element.tagName.includes("Dialog")) 175 | { 176 | const codeTag = element.children.find(child => child.tagName === "Dialog"); 177 | if (codeTag) { return xmlParseDialogTag(codeTag); } 178 | // No Dialog tag found, return empty object 179 | return {}; 180 | } 181 | 182 | msgInfo = {}; 183 | msgInfo.Title = xmlGetLocalizedString(element, "Title"); 184 | msgInfo.Icon = xmlParseIcon(element.attributes.Icon); 185 | msgInfo.BG = (element.attributes.BG === "true"); 186 | msgInfo.Type = element.attributes.Type; 187 | 188 | // Iterate over all attributes and add them as properties of the component object 189 | for (const [name, value] of Object.entries(element.attributes)) 190 | { 191 | // Skip the Name and Icon attributes since they're already handled 192 | if (name === "ConfirmBtn") { msgInfo.ENTER_BTN = (value === "true"); } 193 | if (name === "BackBtn") { msgInfo.BACK_BTN = (value === "true"); } 194 | if (name !== "Title" && name !== "Icon" && name !== "BG" && name !== "Type") { msgInfo[name] = value; } 195 | } 196 | 197 | element.children.forEach((child) => 198 | { 199 | if ("cdata" in child) { msgInfo[child.tagName] = std.evalScript(`(${child.cdata})`); } 200 | }); 201 | 202 | switch (msgInfo.Type) 203 | { 204 | case "TEXT": 205 | msgInfo.Text = xmlGetLocalizedString(element, "Text"); 206 | const taskTag = element.children.find(child => child.tagName === "Task"); 207 | if (taskTag) 208 | { 209 | if ("cdata" in taskTag) { msgInfo.BgFunction = std.evalScript(`(${taskTag.cdata})`); } 210 | } 211 | break; 212 | case "INFO": 213 | break; 214 | } 215 | 216 | return msgInfo; 217 | } 218 | function xmlParseContext(element) 219 | { 220 | contextObj = {}; 221 | contextObj.Options = []; 222 | let defaultGetter = false; 223 | 224 | element.children.forEach((child) => 225 | { 226 | if (child.tagName === "Component") 227 | { 228 | const component = {}; 229 | component.Name = xmlGetLocalizedString(child, "Name"); 230 | component.Icon = xmlParseIcon(child.attributes.Icon); 231 | 232 | // Iterate over all attributes and add them as properties of the component object 233 | for (const [name, value] of Object.entries(child.attributes)) 234 | { 235 | // Skip the Name and Icon attributes since they're already handled 236 | if (name !== "Name" && name !== "Icon") { component[name] = value; } 237 | } 238 | 239 | child.children.forEach((option) => 240 | { 241 | if (option.tagName === "Dialog") { component[option.tagName] = xmlParseDialogTag(option); return; } 242 | if ("cdata" in option) { component[option.tagName] = std.evalScript(`(${option.cdata})`); return; } 243 | }); 244 | 245 | contextObj.Options.push(component); 246 | } 247 | else if (child.tagName === "Default") 248 | { 249 | if ("Variable" in child.attributes) 250 | { 251 | const variableName = child.attributes.Variable; 252 | defaultGetter = () => std.evalScript(variableName); 253 | } else if ("cdata" in child) 254 | { 255 | contextObj.Default = std.evalScript(`(() => { ${child.cdata} })()`); 256 | } 257 | } 258 | else if (child.tagName.includes("Dialog")) { contextObj[child.tagName] = xmlParseDialogTag(child); } 259 | else if ("cdata" in child) { contextObj[child.tagName] = std.evalScript(`(${child.cdata})`); } 260 | }); 261 | 262 | if (defaultGetter) 263 | { 264 | // Define Default as a getter function 265 | Object.defineProperty(contextObj, "Default", { 266 | get: () => defaultGetter(), 267 | enumerable: true 268 | }); 269 | } 270 | 271 | if (!("Default" in contextObj)) { contextObj.Default = 0; } 272 | 273 | return contextObj; 274 | } 275 | function xmlParseSubMenu(element) 276 | { 277 | const submenu = {}; 278 | submenu.Options = []; 279 | 280 | element.children.forEach((option) => 281 | { 282 | if (option.tagName === "Option") 283 | { 284 | if ("filepath" in option.attributes) 285 | { 286 | const optionObj = option.attributes.filepath; 287 | submenu.Options.push(optionObj); 288 | return; 289 | } 290 | 291 | const optionObj = { 292 | Name: xmlGetLocalizedString(option, "Name"), 293 | Description: xmlGetLocalizedString(option, "Description"), 294 | Type: option.attributes.Type, 295 | Icon: xmlParseIcon(option.attributes.Icon) 296 | }; 297 | 298 | if (option.attributes.Type === "SUBMENU") { optionObj.Value = xmlParseSubMenu(option); } 299 | else if (option.attributes.Type === "CONTEXT") { optionObj.Value = xmlParseContext(option); } 300 | else if (option.attributes.Type === "CODE") { optionObj.Value = xmlParseCodeTag(option); } 301 | else if (option.attributes.Type === "ELF") { optionObj.Value = xmlParseElfTag(option); } 302 | else if (option.attributes.Type === "DIALOG") { optionObj.Value = xmlParseDialogTag(option); } 303 | 304 | submenu.Options.push(optionObj); 305 | } 306 | }); 307 | 308 | submenu.Default = 0; 309 | return submenu; 310 | } 311 | function parseXmlPlugin(xmlString) 312 | { 313 | const parsedData = xmlParseElement(xmlString); 314 | 315 | if (parsedData.tagName !== "App") { return {}; } 316 | 317 | const plugin = { 318 | Name: xmlGetLocalizedString(parsedData, "Name"), 319 | Description: xmlGetLocalizedString(parsedData, "Description"), 320 | Icon: xmlParseIcon(parsedData.attributes.Icon), 321 | Category: parseInt(parsedData.attributes.Category), 322 | Type: parsedData.attributes.Type 323 | }; 324 | 325 | if (plugin.Type === "SUBMENU") 326 | { 327 | const optionsTag = parsedData.children.find(child => child.tagName === "Options"); 328 | if (optionsTag) 329 | { 330 | plugin.Value = optionsTag.attributes.filepath; 331 | if (("required" in optionsTag.attributes) && (optionsTag.attributes.required === "true")) 332 | { 333 | plugin.Value = {}; 334 | plugin.Value.Options = execScript(optionsTag.attributes.filepath); 335 | plugin.Value.Default = 0; 336 | if (plugin.Value.Options.length < 1) { return {}; } 337 | } 338 | } 339 | else { plugin.Value = xmlParseSubMenu(parsedData); } 340 | } 341 | else if (plugin.Type === "CONTEXT") { optionObj.Value = xmlParseContext(parsedData); } 342 | else if (plugin.Type === "ELF") { plugin.Value = xmlParseElfTag(parsedData); } 343 | else if (plugin.Type === "CODE") { plugin.Value = xmlParseCodeTag(parsedData); } 344 | else if (plugin.Type === "DIALOG") { optionObj.Value = xmlParseDialogTag(parsedData); } 345 | 346 | // Check for CustomIcon and add it if present 347 | const customIconTag = parsedData.children.find(child => child.tagName === "CustomIcon"); 348 | if (customIconTag) { plugin.CustomIcon = customIconTag.attributes.Path; } 349 | 350 | return plugin; 351 | } 352 | 353 | xmblog("INIT: XML INIT COMPLETE"); 354 | -------------------------------------------------------------------------------- /bin/XMB/lang/lang.json: -------------------------------------------------------------------------------- 1 | { 2 | "CATEGORY": { 3 | "USER": [ 4 | "User", 5 | "Utilisateur", 6 | "Usuario", 7 | "Benutzer", 8 | "Utente", 9 | "Gebruiker", 10 | "Usuário" 11 | ], 12 | "SETTINGS": [ 13 | "Settings", 14 | "Paramètres", 15 | "Opciones", 16 | "Optionen", 17 | "Opzioni", 18 | "Opties", 19 | "Opções" 20 | ], 21 | "PHOTO": [ 22 | "Photo", 23 | "Photo", 24 | "Foto", 25 | "Foto", 26 | "Foto", 27 | "Foto", 28 | "Fotografia" 29 | ], 30 | "MUSIC": [ 31 | "Music", 32 | "Musique", 33 | "Música", 34 | "Musik", 35 | "Musica", 36 | "Muziek", 37 | "Música" 38 | ], 39 | "VIDEO": [ 40 | "Video", 41 | "Video", 42 | "Video", 43 | "Video", 44 | "Video", 45 | "Video", 46 | "Video" 47 | ], 48 | "GAME": [ 49 | "Game", 50 | "Jeu", 51 | "Juego", 52 | "Spiel", 53 | "Giochi", 54 | "Spel", 55 | "Jogo" 56 | ], 57 | "NETWORK": [ 58 | "Network", 59 | "Réseau", 60 | "Red", 61 | "Netzwerk", 62 | "Rete", 63 | "Netwerk", 64 | "Rede" 65 | ] 66 | }, 67 | "BOOT_WARNING": [ 68 | "PHOTOSENSITIVE EPILEPSY\nIF YOU HAVE A HISTORY OF EPILEPSY OR SEIZURES, CONSULT A DOCTOR\nBEFORE USE. CERTAIN PATTERNS MAY TRIGGER SEIZURES WITH NO PRIOR HISTORY. BEFORE USING THIS PRODUCT, CAREFULLY READ THE INSTRUCTION MANUAL.", 69 | "ÉPILEPSIE PHOTOSENSIBLE\nSI VOUS AVEZ DES ANTÉCÉDENTS D'ÉPILEPSIE OU DE CRISES, CONSULTEZ UN MÉDECIN AVANT UTILISATION. CERTAINS MOTIFS PEUVENT DÉCLENCHER DES CRISES SANS ANTÉCÉDENTS. AVANT D'UTILISER CE PRODUIT, LISEZ ATTENTIVEMENT LE MANUEL D'INSTRUCTIONS.", 70 | "EPILEPSIA FOTOSENSIBLE\nSI TIENE ANTECEDENTES DE EPILEPSIA O CONVULSIONES, CONSULTE A UN MÉDICO ANTES DE USARLO. CIERTOS PATRONES PUEDEN PROVOCAR CONVULSIONES SIN ANTECEDENTES PREVIOS. ANTES DE USAR ESTE PRODUCTO, LEA CUIDADOSAMENTE EL MANUAL DE INSTRUCCIONES.", 71 | "FOTOSENSITIVE EPILEPSIE\nWENN SIE EINE VORGESCHICHTE MIT EPILEPSIE ODER KRAMPFANFÄLLEN HABEN, KONSULTIEREN SIE VOR DER VERWENDUNG EINEN ARZT. BESTIMMTE MUSTER KÖNNEN ANFÄLLE AUSLÖSEN, AUCH OHNE FRÜHERE VORGESCHICHTE. LESEN SIE VOR DER VERWENDUNG DIE BEDIENUNGSANLEITUNG SORGFÄLTIG DURCH.", 72 | "EPILESSIA FOTOSENSIBILE\nSE SI SOFFRE DI CRISI EPILETTICHE O DI DISTURBI ASSOCIATI, CONSULTARE UN MEDICO PRIMA DELL'USO. ALCUNI EFFETTI POSSONO CAUSARE CRISI EPILETTICHE ANCHE IN ASSENZA DI EPISODI PREGRESSI. PRIMA DI UTILIZZARE IL PRODOTTO, LEGGERE ATTENTAMENTE IL MANUALE DI ISTRUZIONI.", 73 | "FOTOSENSITIEVE EPILEPSIE\nALS U EEN GESCHIEDENIS HEEFT VAN EPILEPSIE OF AANVALLEN, RAADPLEEG DAN EEN ARTS VOORDAT U HET PRODUCT GEBRUIKT. BEPAALDE PATRONEN KUNNEN AANVALLEN VEROORZAKEN ZONDER EERDERE VOORGESCHIEDENIS. LEES VOORDAT U DIT PRODUCT GEBRUIKT ZORGVULDIG DE HANDLEIDING.", 74 | "EPILEPSIA FOTOSSENSÍVEL\nSE VOCÊ TEM HISTÓRICO DE EPILEPSIA OU CONVULSÕES, CONSULTE UM MÉDICO ANTES DE USAR. CERTOS PADRÕES PODEM DESENCADEAR CONVULSÕES SEM HISTÓRICO PRÉVIO. ANTES DE USAR ESTE PRODUTO, LEIA ATENTAMENTE O MANUAL DE INSTRUÇÕES." 75 | ], 76 | "WAIT": [ 77 | "Please wait...", 78 | "Veuillez patienter...", 79 | "Por favor espere...", 80 | "Bitte warten...", 81 | "Attendere prego...", 82 | "Even geduld...", 83 | "Aguarde..." 84 | ], 85 | "YES": [ 86 | "Yes", 87 | "Oui", 88 | "Sí", 89 | "Ja", 90 | "Sì", 91 | "Ja", 92 | "Sim" 93 | ], 94 | "NO": [ 95 | "No", 96 | "Non", 97 | "No", 98 | "Nein", 99 | "No", 100 | "Nee", 101 | "Não" 102 | ], 103 | "ENABLED": [ 104 | "Enabled", 105 | "Activé", 106 | "Habilitado", 107 | "Aktiviert", 108 | "Abilitato", 109 | "Ingeschakeld", 110 | "Ativado" 111 | ], 112 | "DISABLED": [ 113 | "Disabled", 114 | "Désactivé", 115 | "Deshabilitado", 116 | "Deaktiviert", 117 | "Disabilitato", 118 | "Uitgeschakeld", 119 | "Desativado" 120 | ], 121 | "INFO": [ 122 | "Information", 123 | "Information", 124 | "Información", 125 | "Information", 126 | "Informazioni", 127 | "Informatie", 128 | "Informação" 129 | ], 130 | "DELETE": [ 131 | "Delete", 132 | "Supprimer", 133 | "Eliminar", 134 | "Löschen", 135 | "Elimina", 136 | "Verwijderen", 137 | "Eliminar" 138 | ], 139 | "MSG_SUBMENU_EMPTY": [ 140 | "There are no elements.", 141 | "Il n'y a pas d'éléments.", 142 | "No hay elementos.", 143 | "Es gibt keine Elemente.", 144 | "Non ci sono elementi.", 145 | "Er zijn geen elementen.", 146 | "Não há elementos." 147 | ], 148 | "BACK": [ 149 | "Back", 150 | "Retour", 151 | "Volver", 152 | "Zurück", 153 | "Indietro", 154 | "Terug", 155 | "Voltar" 156 | ], 157 | "ENTER": [ 158 | "Accept", 159 | "Valider", 160 | "Aceptar", 161 | "Akzeptieren", 162 | "Accetta", 163 | "Accepteren", 164 | "Aceitar" 165 | ], 166 | "TITLE": [ 167 | "Title", 168 | "Titre", 169 | "Titulo", 170 | "Titel", 171 | "Titoli", 172 | "Titel", 173 | "Titulo" 174 | ], 175 | "TITLES": [ 176 | "Titles", 177 | "Titres", 178 | "Títulos", 179 | "Titel", 180 | "Titoli", 181 | "Titels", 182 | "Títulos" 183 | ], 184 | "OPTIONS": [ 185 | "Options", 186 | "Options", 187 | "Opciones", 188 | "Options", 189 | "Opzioni", 190 | "Options", 191 | "Options" 192 | ], 193 | "WORK_DIR_NAME": [ 194 | "Main Directory", 195 | "Répertoire principal", 196 | "Directorio principal", 197 | "Hauptverzeichnis", 198 | "Directory principale", 199 | "Hoofdmap", 200 | "Diretório principal" 201 | ], 202 | "MASS_DIR_NAME": [ 203 | "USB Drive", 204 | "Périphérique USB", 205 | "Dispositivo USB", 206 | "USB-Gerät", 207 | "Dispositivo USB", 208 | "USB-apparaat", 209 | "Dispositivo USB" 210 | ], 211 | "HDD_DIR_NAME": [ 212 | "Internal Hard Disk Drive", 213 | "Disque Dur Interne", 214 | "Disco Duro Interno", 215 | "Interne Festplatte", 216 | "Disco Rigido Interno", 217 | "Internal Hard Disk Drive", 218 | "Disco Rígido Interno" 219 | ], 220 | "DEVICE": [ 221 | "Device", 222 | "Device", 223 | "Dispositivo", 224 | "Device", 225 | "Device", 226 | "Device", 227 | "Device" 228 | ] 229 | } 230 | -------------------------------------------------------------------------------- /bin/XMB/lang/net.json: -------------------------------------------------------------------------------- 1 | { 2 | "NETSET1": { 3 | "NAME": [ 4 | "Settings and Connection Status List", 5 | "Liste des paramètres et de l'état de la connexion", 6 | "Ajustes y lista de estado de conexión", 7 | "Liste der Einstellungen und des Verbindungsstatus", 8 | "Elenco delle impostazioni e dello stato di connessione", 9 | "Instellingen en verbindingsstatus", 10 | "Lista de Definições e Estado das Ligações" 11 | ], 12 | "DESC": [ 13 | "View current network settings.", 14 | "Pour afficher les paramètres réseau actuels.", 15 | "Puede visualizar los ajustes de red actuales.", 16 | "Sie können die aktuellen Netzwerk-Einstellungen.", 17 | "È possibile visualizzare le impostazioni di rete correnti.", 18 | "De huidige netwerkinstellingen en de status van de internetverbinding weergeven.", 19 | "Visualize as definições de rede e o estado das ligações actuais." 20 | ] 21 | }, 22 | "NETSET2": { 23 | "NAME": [ 24 | "Internet Connection", 25 | "Connexion Internet", 26 | "Conexión a Internet", 27 | "Internetverbindung", 28 | "Connessione Internet", 29 | "Internetverbinding", 30 | "Ligação à Internet" 31 | ], 32 | "DESC": [ 33 | "Enable or disable the system's connection to the Internet.", 34 | "Pour activer ou désactiver connexion du système à Internet.", 35 | "Puede activar o desactivar la conexión del sistema a Internet.", 36 | "Sie können die Verbindung des Systems zum Internet aktivieren oder deaktivieren.", 37 | "È possibile abilitare o disabilitare la connessione a Internet del sistema.", 38 | "De internetverbinding van het systeem in- of uitschakelen.", 39 | "Active ou desactive a ligação do sistema à Internet." 40 | ] 41 | }, 42 | "NET": { 43 | "INIT_MSG": [ 44 | "Trying to connect, please wait...", 45 | "Tentative de connexion, veuillez patienter...", 46 | "Intentando conectar, por favor espere...", 47 | "Versuch der Verbindung, bitte warten...", 48 | "Tentativo di connessione, attendere prego...", 49 | "Bezig met verbinden, even geduld a.u.b...", 50 | "A tentar conectar, por favor aguarde..." 51 | ], 52 | "INIT_COMPLETE_MSG": [ 53 | "Connection successful.", 54 | "Connexion réussie.", 55 | "Conexión exitosa.", 56 | "Verbindung erfolgreich.", 57 | "Connessione riuscita.", 58 | "Verbinding geslaagd.", 59 | "Conexão bem-sucedida." 60 | ], 61 | "ERR_1": [ 62 | "Could not initialize Network.\nPlease check your connection and restart the console.", 63 | "Impossible d'initialiser le réseau.\nVeuillez vérifier votre connexion et redémarrer la console.", 64 | "No se pudo inicializar la red.\nCompruebe su conexión y reinicie la consola.", 65 | "Netzwerk konnte nicht initialisiert werden.\nBitte überprüfen Sie Ihre Verbindung und starten Sie die Konsole neu.", 66 | "Impossibile inizializzare la rete.\nControlla la tua connessione e riavvia la console.", 67 | "Kan netwerk niet initialiseren.\nControleer uw verbinding en start de console opnieuw op.", 68 | "Não foi possível inicializar a Rede.\nVerifique a sua ligação e reinicie a consola." 69 | ] 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /bin/XMB/lang/pass.json: -------------------------------------------------------------------------------- 1 | { 2 | "PASS_CHANGE": [ 3 | "Change Password", 4 | "Changer le mot de passe", 5 | "Cambiar contraseña", 6 | "Passwort ändern", 7 | "Modifica la password", 8 | "Wachtwoord wijzigen", 9 | "Mudar a palavra-passe" 10 | ], 11 | "PARENTAL_CONTROL": [ 12 | "Parental Control", 13 | "Contrôle parental", 14 | "Control paterno", 15 | "Kindersicherung", 16 | "Filtro contenuti", 17 | "Ouderlijk toezicht", 18 | "Controlo parental" 19 | ], 20 | "PASS_NEW_MSG": [ 21 | "Enter your new password", 22 | "Enter your new password", 23 | "Ingrese su nueva contraseña", 24 | "Enter your new password", 25 | "Enter your new password", 26 | "Enter your new password", 27 | "Enter your new password" 28 | ], 29 | "PASS_CUR_MSG": [ 30 | "Enter your four-digir password", 31 | "Enter your four-digir password", 32 | "Ingrese su contraseña de cuatro digitos", 33 | "Enter your four-digir password", 34 | "Enter your four-digir password", 35 | "Enter your four-digir password", 36 | "Enter your four-digir password" 37 | ] 38 | } 39 | -------------------------------------------------------------------------------- /bin/XMB/lang/thm.json: -------------------------------------------------------------------------------- 1 | { 2 | "NOWPP_MSG": [ 3 | "There is no wallpaper set. \nGo to [Photo], open an image, and then select [Set as Wallpaper] from the control panel to save the image.", 4 | "Aucun fond d'écran défini. \nAllez dans [Photo], ouvrez une image, et sélectionnez [Définir comme fond d'écran].", 5 | "No hay fondo de pantalla. \nVe a [Foto], abre una imagen y selecciona [Establecer como fondo].", 6 | "Kein Hintergrundbild gesetzt. \nNavigiere zu [Foto], öffne ein Bild und wähle [Als Hintergrundbild festlegen].", 7 | "Nessuno sfondo impostato. \nVai in [Foto], apri un'immagine e seleziona [Imposta come sfondo].", 8 | "Geen achtergrond ingesteld. \nGa naar [Foto], open een afbeelding en kies [Instellen als achtergrond].", 9 | "Nenhum papel de parede definido. \nVá para [Foto], abra uma imagem e escolha [Definir como papel de parede]." 10 | ], 11 | "SETASBG": [ 12 | "Set as Wallpaper", 13 | "Définir comme fond d'écran", 14 | "Establecer como fondo", 15 | "Als Hintergrundbild festlegen", 16 | "Imposta come sfondo", 17 | "Instellen als achtergrond", 18 | "Definir como papel de parede" 19 | ], 20 | "WALLPAPER": [ 21 | "Wallpaper", 22 | "Fond d'écran", 23 | "Fondo de pantalla", 24 | "Hintergrundbild", 25 | "Sfondo personalizzato", 26 | "Achtergrondafbeelding", 27 | "Fundo personalizado" 28 | ] 29 | } 30 | -------------------------------------------------------------------------------- /bin/XMB/lang/vmsg.json: -------------------------------------------------------------------------------- 1 | { 2 | "DISPLAYSET1": { 3 | "NAME": [ 4 | "Video Output Mode", 5 | "Paramètres de sortie vidéo", 6 | "Modo de Salida de Video", 7 | "Anzeigemodus", 8 | "Impostazioni video", 9 | "Instellingen video-uitvoer", 10 | "Definições de Saída de Vídeo" 11 | ], 12 | "DESC": [ 13 | "Set the video output display mode.", 14 | "Définir le mode d'affichage de sortie vidéo.", 15 | "Ajusta el modo de salida de video.", 16 | "Setze den Anzeigemodus.", 17 | "Seleziona la modalità dell'uscita video.", 18 | "Stel de video-uitvoermodus in.", 19 | "Definir o modo de exibição de saída de vídeo." 20 | ] 21 | }, 22 | "DISPLAYSET2": { 23 | "NAME": [ 24 | "TV Type", 25 | "Type de TV", 26 | "Tipo de TV", 27 | "Typ des TV", 28 | "Tipo di TV", 29 | "TV-type", 30 | "Tipo de TV" 31 | ], 32 | "DESC": [ 33 | "Select the type of TV in use.", 34 | "Sélectionnez le type de TV utilisé.", 35 | "Selecciona el tipo de TV en uso.", 36 | "Wähle den Typ des genutzten TV.", 37 | "Seleziona il tipo di TV utilizzata.", 38 | "Selecteer het type TV dat wordt gebruikt.", 39 | "Seleccione o tipo de TV utilizada." 40 | ] 41 | }, 42 | "SECONDS": [ 43 | "seconds", 44 | "seconds", 45 | "segundos", 46 | "sekunden", 47 | "secondi", 48 | "seconds", 49 | "seconds" 50 | ], 51 | "REMTIME": [ 52 | "Remaining time", 53 | "Temps restant", 54 | "Tiempo restante", 55 | "Verbleibende Zeit", 56 | "Tempo rimanente", 57 | "Resterende tijd", 58 | "Tempo restante" 59 | ], 60 | "VMODE_MSG": [ 61 | "Can you read this screen?\nSelect [Yes] if you can.\nIf you do not press any buttons, the system will automatically go back to the previous setting.\n \n \n \n \n", 62 | "Pouvez-vous lire cet écran ?\nSélectionnez [Oui] si vous pouvez.\nSi vous n'appuyez sur aucun bouton, le système reviendra automatiquement au réglage précédent.\n \n \n \n \n", 63 | "¿Puede leer esta pantalla?\nSelecciona [Si] si la respuesta es afirmativa.\nSi no pulsa ningun botón, el sistema regresará a la configuracion anterior automaticamente.\n \n \n \n \n", 64 | "Kannst Du das hier lesen?\nWähle [Ja], wenn dem so ist.\nWenn du keine Tasten drückst, wechselt das System automatisch zur vorherigen Einstellung.\n \n \n \n \n", 65 | "Questo testo è visibile?\nSeleziona [Si] per mantenere l'impostazione altrimenti il sistema tornerà automaticamente all'impostazione precedente.\n \n \n \n \n", 66 | "Kun je dit scherm lezen?\nSelecteer [Ja] als je dat kunt.\nAls je geen knoppen indrukt, gaat het systeem automatisch terug naar de vorige instelling.\n \n \n \n \n", 67 | "Você consegue ler esta tela?\nSelecione [Sim] se puder.\nSe você não pressionar nenhum botão, o sistema voltará automaticamente à configuração anterior.\n \n \n \n \n" 68 | ] 69 | } 70 | -------------------------------------------------------------------------------- /bin/athena.ini: -------------------------------------------------------------------------------- 1 | boot_logo = false 2 | dark_mode = true --------------------------------------------------------------------------------