|
| 1 | +# NHDDL — a PS2 launcher for Neutrino |
| 2 | + |
| 3 | +<p align="center"> |
| 4 | + <img src="img/logo/logo.png"> |
| 5 | +</p> |
| 6 | + |
| 7 | +NHDDL is a Neutrino launcher that scans MMCE, APA or _FAT/exFAT-formatted_ BDM devices for ISO files, |
| 8 | +lists them and boots selected ISO via Neutrino. |
| 9 | + |
| 10 | +It displays visual Game ID to trigger per-title settings on the Pixel FX line of products and triggers per-title memory cards on SD2PSX and MemCard PRO2. |
| 11 | + |
| 12 | +Note that this not an attempt at making a Neutrino-based Open PS2 Loader replacement. |
| 13 | +Since NHDDL only launches Neutrino, PADEMU, IGR, IGS, cheats and other features supported by OPL are _out-of-scope_ unless they are implemented in Neutrino. |
| 14 | + |
| 15 | +## Usage |
| 16 | + |
| 17 | +### Title list controls |
| 18 | + |
| 19 | + - Press **Up** on the d-pad to select the **previous title** in the list |
| 20 | + - Press **Down** on the d-pad to select the **next title** in the list |
| 21 | + - Press **L1** to switch to the **previous page** or go to the **start of the list** |
| 22 | + - Press **R1** to switch to the **next page** or go to the **end of the list** |
| 23 | + |
| 24 | +### Important notes |
| 25 | + |
| 26 | +NHDDL requires a full [Neutrino](https://github.com/rickgaiser/neutrino) installation to be present at one of the following paths: |
| 27 | +- `<NHDDL launch directory>/neutrino.elf` (__might be case-sensitive__ depending on device) |
| 28 | +- `massX:/neutrino/neutrino.elf` (BDM devices, if any of BDM modes are enabled) |
| 29 | +- `hdd0:/<OPL partition>/neutrino/neutrino.elf` (APA device, if HDL mode is enabled) |
| 30 | + `OPL partition` is read from `hdd0:__common/OPL/conf_hdd.cfg`, with `+OPL` or `__common/OPL` used as a fallback |
| 31 | +- `mmceX:/neutrino/neutrino.elf` (MMCE devices, will work even if MMCE mode is _not_ enabled unless MX4SIO mode is set) |
| 32 | +- `mcX:/APPS/neutrino/neutrino.elf` (memory cards, __case-sensitive__) |
| 33 | +- `mcX:/NEUTRINO/NEUTRINO.ELF` (SAS-compliant path on memory cards, __case-sensitive__) |
| 34 | +- `mcX:/NEUTRINO/neutrino.elf` (SAS-compliant path on memory cards, __case-sensitive__) |
| 35 | + |
| 36 | +By default, NHDDL tries to initialize all supported devices. You can override this behavior and reduce initialization times by setting specific mode in launcher configuration file. |
| 37 | +See [this](#launcher-configuration-file) section for details on `nhddl.yaml`. |
| 38 | + |
| 39 | +Note that if your ELF loader resets IOP (e.g. `PS2BBL` and recent versions of `wLE_ISR`), NHDDL will try loading `nhddl.yaml` from memory cards and MMCE devices first to avoid |
| 40 | +loading modules for all devices. |
| 41 | +If `nhddl.yaml` is not present on any of the memory cards or MMCE devices, NHDDL will initialize all modules first and then will attempt to search for `nhddl.yaml` again. |
| 42 | + |
| 43 | +**Do not plug in any BDM storage devices while running NHDDL!** |
| 44 | +Doing so might crash NHDDL and/or possibly corrupt the files on your target device due to how BDM drivers work. |
| 45 | + |
| 46 | +#### Manual installation |
| 47 | + |
| 48 | +To use NHDDL: |
| 49 | +- Get the [latest `nhddl.elf`](https://github.com/pcm720/nhddl/releases) |
| 50 | +- Copy `nhddl.elf` to your memory card or storage device wherever you want. |
| 51 | +- _Additional step if you need only some of the available modes or MX4SIO support_: |
| 52 | + Modify `nhddl.yaml` [accordingly](#launcher-configuration-file) and copy it next to `nhddl.elf` |
| 53 | +- Get the [latest Neutrino release](https://github.com/rickgaiser/neutrino/releases/tag/latest) |
| 54 | +- Copy Neutrino folder to the root of your PS2 memory card or your storage device. |
| 55 | + |
| 56 | +#### Save Application System PSU |
| 57 | + |
| 58 | +You can also get NHDDL as an easy-to-use PSU package [here](https://pcm720.github.io/nhddl-psu/). |
| 59 | +To install it: |
| 60 | +- Copy generated `nhddl.psu` to your USB drive |
| 61 | +- Open wLaunchELF on your PS2 |
| 62 | +- Choose your USB device and copy `nhddl.psu` |
| 63 | +- Go back and open your memory card (`mc0` or `mc1`) |
| 64 | +- Open file menu and select `psuPaste` |
| 65 | +- Get the [latest Neutrino release](https://github.com/rickgaiser/neutrino/releases/tag/latest) |
| 66 | +- Copy Neutrino folder to the root of your PS2 memory card or your storage device. |
| 67 | + |
| 68 | +This will install NHDDL to your memory card along with the PS2 Browser icon. |
| 69 | + |
| 70 | +Updating `nhddl.elf` is as simple as replacing `nhddl.elf` with the latest version. |
| 71 | + |
| 72 | +### Supported modes |
| 73 | + |
| 74 | +#### ATA |
| 75 | + |
| 76 | +To skip all other devices, `mode: ata` must be present in `nhddl.yaml`. |
| 77 | + |
| 78 | +#### MX4SIO |
| 79 | + |
| 80 | +MX4SIO support requires explicit configuration due to conflicts with memory cards and MMCE devices. |
| 81 | +`mode: mx4sio` must be present in `nhddl.yaml` on __the memory card__ for MX4SIO to work. |
| 82 | + |
| 83 | +Note that __MMCE devices will not be available__ when this mode is enabled. |
| 84 | + |
| 85 | +#### USB |
| 86 | + |
| 87 | +Using more than one USB mass storage device at the same time is not recommended. |
| 88 | +To skip all other devices, `mode: usb` must be present in `nhddl.yaml`. |
| 89 | + |
| 90 | +#### UDPBD |
| 91 | + |
| 92 | +To skip all other devices, `mode: udpbd` must be present in `nhddl.yaml`. |
| 93 | + |
| 94 | +UDPBD module requires PS2 IP address to work. |
| 95 | +NHDDL attempts to retrieve PS2 IP address from the following sources: |
| 96 | +- `udpbd_ip` flag in `nhddl.yaml` |
| 97 | +- `SYS-CONF/IPCONFIG.DAT` on the memory card (usually created by w/uLaunchELF) |
| 98 | + |
| 99 | +`udpbd_ip` flag takes priority over `IPCONFIG.DAT`. |
| 100 | + |
| 101 | +Make sure to set the IP address in Neutrino config files (as of Neutrino 1.6.0, `config/bsd-udpbd.toml`). |
| 102 | +Consult Neutrino documentation for more details. |
| 103 | + |
| 104 | +#### iLink |
| 105 | + |
| 106 | +To skip all other devices, `mode: ilink` must be present in `nhddl.yaml`. |
| 107 | + |
| 108 | +#### MMCE (SD2PSX, MemCard PRO2) |
| 109 | + |
| 110 | +To skip all other devices, `mode: mmce` must be present in `nhddl.yaml`. |
| 111 | + |
| 112 | +#### HDL (APA-formatted HDD with HD Loader partitions) |
| 113 | + |
| 114 | +Note that HDL backend **does not support** VMCs and virtual HDDs. |
| 115 | +Cover art and title options will be loaded from one of the following APA partitions: |
| 116 | +- `+OPL` |
| 117 | +- `OPL` |
| 118 | +- `__common` |
| 119 | + |
| 120 | +To skip all other devices, `mode: hdl` must be present in `nhddl.yaml`. |
| 121 | + |
| 122 | +### Storing ISO (MMCE, BDM backends) |
| 123 | + |
| 124 | +ISOs can be stored almost anywhere on the storage device, but no more than 5 directories deep. |
| 125 | +For example, ISOs stored in `DVD/A/B/C/D` will be scanned and added to the list, but ISOs stored in `DVD/A/B/C/D/E` will be ignored. |
| 126 | + |
| 127 | +Furthermore, directories that start with `.`, `$` and the following directories are ignored to speed up the scanning process: |
| 128 | + - `nhddl` |
| 129 | + - `APPS` |
| 130 | + - `ART` |
| 131 | + - `CFG` |
| 132 | + - `CHT` |
| 133 | + - `LNG` |
| 134 | + - `THM` |
| 135 | + - `VMC` |
| 136 | + - `XEBPLUS` |
| 137 | + - `MemoryCards` |
| 138 | + |
| 139 | +### Displaying cover art |
| 140 | + |
| 141 | +NHDDL uses the same file naming convention and file format used by OPL. |
| 142 | +Just put **140x200 PNG** files named `<title ID>_COV.png` (e.g. `SLUS_200.02_COV.png`) into the `ART` directory on the root of your device. |
| 143 | +If unsure where to get your cover art from, check out the latest version of [OPL Manager](https://oplmanager.com). |
| 144 | + |
| 145 | +## Configuration files |
| 146 | + |
| 147 | +NHDDL uses YAML-_like_ files to load and store its configuration options. |
| 148 | + |
| 149 | +### Launcher configuration file |
| 150 | + |
| 151 | +Launcher configuration is read from the `nhddl.yaml` file. |
| 152 | + |
| 153 | +Configuration file is loaded from one of the following paths: |
| 154 | +- `<NHDDL launch directory>/nhddl.yaml` (__might be case-sensitive__ depending on device) |
| 155 | +- `massX:/nhddl/nhddl.yaml` (BDM devices, if any of BDM modes are enabled) |
| 156 | +- `hdd0:/<OPL partition>/neutrino/neutrino.elf` (APA device, if HDL mode is enabled) |
| 157 | + `OPL partition` is read from `hdd0:__common/OPL/conf_hdd.cfg`, with `+OPL` or `__common/OPL` used as a fallback |
| 158 | +- `mmceX:/nhddl/nhddl.yaml` (MMCE devices, will work even if MMCE mode is _not_ enabled unless MX4SIO mode is set) |
| 159 | +- `mcX:/APP_NHDDL/nhddl.yaml` (memory cards, __case-sensitive__) |
| 160 | + |
| 161 | +This file is _completely optional_ and must be used only to force video mode in NHDDL UI or set NHDDL device mode. |
| 162 | +By default, default video mode is used and all BDM devices are used to look for ISO files. |
| 163 | + |
| 164 | +To disable a flag, you can just comment it out with `#`. |
| 165 | + |
| 166 | +See [this file](examples/nhddl.yaml) for an example of a valid `nhddl.yaml` file. |
| 167 | + |
| 168 | +### Additional configuration files on storage device |
| 169 | + |
| 170 | +NHDDL stores and looks for ISO-related config files in `nhddl` directory in the root of your BDM drive. |
| 171 | + |
| 172 | +#### `lastTitle.bin` |
| 173 | + |
| 174 | +This file stores the full path of the last launched title and is used to automatically navigate to it each time NHDDL starts up. |
| 175 | +This file is created automatically. |
| 176 | + |
| 177 | +#### `cache.bin` |
| 178 | + |
| 179 | +Contains title ID cache for all ISOs located during the previous launch, making building ISO list way faster. |
| 180 | +This file is also created automatically. |
| 181 | + |
| 182 | +#### Argument files |
| 183 | + |
| 184 | +These files store arbitrary arguments that are passed to Neutrino on title launch. |
| 185 | +Arguments stored in those files __are passed to `neutrino.elf` as-is__. |
| 186 | + |
| 187 | +_For a list of valid arguments, see Neutrino README._ |
| 188 | + |
| 189 | +Example of a valid argument file: |
| 190 | +```yaml |
| 191 | +# All flags are passed to neutrino as-is for future-proofing, comments are ignored |
| 192 | +gc: 2 |
| 193 | +mc0: /memcard0.bin # all file paths must be relative to device root |
| 194 | +$mc1: /VMC/memcard1.bin # this argument is disabled |
| 195 | +# Arguments that don't have a value |
| 196 | +# Empty values are treated as a simple flag |
| 197 | +dbc: |
| 198 | +logo: |
| 199 | +``` |
| 200 | +
|
| 201 | +To be able to parse those arguments and allow you to dynamically enable or disable them in UI, |
| 202 | +NHDDL uses a dollar sign (`$`) to mark arguments as enabled or disabled by default. |
| 203 | +Only enabled arguments get passed to Neutrino. |
| 204 | + |
| 205 | +NHDDL supports two kinds of argument files: |
| 206 | + |
| 207 | +#### global.yaml |
| 208 | + |
| 209 | +Arguments stored in `nhddl/global.yaml` are applied to every ISO by default. |
| 210 | + |
| 211 | +#### ISO-specific files |
| 212 | + |
| 213 | +Arguments stored in `nhddl/<ISO name>.yaml` are applied to every ISO that starts with `<ISO name>`. |
| 214 | + |
| 215 | +NHDDL can create this file automatically when title compatibility modes are modified and saved in UI. |
| 216 | + |
| 217 | +#### Example of directory sturcture on BDM device |
| 218 | + |
| 219 | +``` |
| 220 | +ART/ # cover art, optional |
| 221 | + | |
| 222 | + - SLUS_200.02_COV.png |
| 223 | +nhddl/ |
| 224 | + | |
| 225 | + - lastTitle.txt # created automatically |
| 226 | + - cache.bin # created automatically |
| 227 | + - global.yaml # optional argument file, applies to all ISOs |
| 228 | + - nhddl.yaml # NHDDL options, applied after initialization is complete |
| 229 | + - Silent Hill 2.yaml # optional argument file, applies only to ISOs that start with "Silent Hill 2" |
| 230 | +CD/ |
| 231 | + | |
| 232 | + — Ridge Racer V.iso |
| 233 | +DVD/ |
| 234 | + | |
| 235 | + - Silent Hill 2.iso |
| 236 | + - TimeSplitters.iso |
| 237 | +``` |
| 238 | +
|
| 239 | +## UI screenshots |
| 240 | +
|
| 241 | +<details> |
| 242 | + <summary>Title list</summary> |
| 243 | + <img src="img/titles.png"> |
| 244 | +</details> |
| 245 | +<details> |
| 246 | + <summary>Title options</summary> |
| 247 | + <img src="img/options1.png"> |
| 248 | + <img src="img/options2.png"> |
| 249 | +</details> |
| 250 | +
|
| 251 | +
|
| 252 | +EXAMPLE YAML: |
| 253 | +#video: ntsc # supported video modes: ntsc, pal, 480p |
| 254 | +mode: ata # supported modes: bdm, ata, mx4sio, udpbd, usb, ilink, mmce, hdl. If not present or commented out, all devices will be used to search for ISO files |
| 255 | +mode: mmce # multiple modes are supported via multiple mode strings |
| 256 | +#udpbd_ip: 192.168.1.6 # PS2 IP address for UDPBD mode (commented out) |
0 commit comments