├── .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 |
3 |
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('');
65 |
66 | if (openTagEnd === -1 || closeTagStart === -1) return null;
67 |
68 | // Parse first tag
69 | const firstTag = xmlData.slice(1, openTagEnd);
70 | const spaceIndex = firstTag.indexOf(' ');
71 |
72 | const element = {
73 | tagName: spaceIndex > -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
--------------------------------------------------------------------------------