{"id":21918294,"url":"https://github.com/pcm720/nhddl","last_synced_at":"2026-04-05T17:04:43.499Z","repository":{"id":256098902,"uuid":"851353246","full_name":"pcm720/nhddl","owner":"pcm720","description":"A PS2-based launcher for Neutrino","archived":false,"fork":false,"pushed_at":"2026-03-27T23:42:22.000Z","size":2651,"stargazers_count":130,"open_issues_count":13,"forks_count":10,"subscribers_count":13,"default_branch":"main","last_synced_at":"2026-03-28T05:53:15.378Z","etag":null,"topics":["ps2"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"afl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pcm720.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-09-03T00:05:22.000Z","updated_at":"2026-03-18T22:21:49.000Z","dependencies_parsed_at":null,"dependency_job_id":"3559a00e-b6bd-454e-ad2d-28753c8e1606","html_url":"https://github.com/pcm720/nhddl","commit_stats":null,"previous_names":["pcm720/nhddl"],"tags_count":19,"template":false,"template_full_name":null,"purl":"pkg:github/pcm720/nhddl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pcm720%2Fnhddl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pcm720%2Fnhddl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pcm720%2Fnhddl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pcm720%2Fnhddl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pcm720","download_url":"https://codeload.github.com/pcm720/nhddl/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pcm720%2Fnhddl/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31442926,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-05T15:22:31.103Z","status":"ssl_error","status_checked_at":"2026-04-05T15:22:00.205Z","response_time":75,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ps2"],"created_at":"2024-11-28T19:50:35.055Z","updated_at":"2026-04-05T17:04:43.493Z","avatar_url":"https://github.com/pcm720.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# NHDDL — a PS2 launcher for Neutrino\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"img/logo/logo.png\"\u003e\n\u003c/p\u003e\n\nNHDDL is a Neutrino launcher that scans MMCE, APA or _FAT/exFAT-formatted_ BDM devices for ISO files,\nlists them and boots selected ISO via Neutrino.  \n\nIt 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.\n\nNote that this not an attempt at making a Neutrino-based Open PS2 Loader replacement.  \nSince NHDDL only launches Neutrino, PADEMU, IGR, IGS, cheats and other features supported by OPL are _out-of-scope_ unless they are implemented in Neutrino.\n\n## Usage\n\n### Title list controls\n\n - Press **Up** on the d-pad to select the **previous title** in the list\n - Press **Down** on the d-pad to select the **next title** in the list\n - Press **L1** to switch to the **previous page** or go to the **start of the list**\n - Press **R1** to switch to the **next page** or go to the **end of the list**\n\n### Important notes\n\nNHDDL requires a full [Neutrino](https://github.com/rickgaiser/neutrino) installation to be present at one of the following paths:\n- `\u003cNHDDL launch directory\u003e/neutrino.elf` (__might be case-sensitive__ depending on device)\n- `massX:/neutrino/neutrino.elf` (BDM devices, if any of BDM modes are enabled)\n- `hdd0:/\u003cOPL partition\u003e/neutrino/neutrino.elf` (APA device, if HDL mode is enabled)  \n  `OPL partition` is read from `hdd0:__common/OPL/conf_hdd.cfg`, with `+OPL` or `__common/OPL` used as a fallback\n- `mmceX:/neutrino/neutrino.elf` (MMCE devices, will work even if MMCE mode is _not_ enabled unless MX4SIO mode is set)\n- `mcX:/APPS/neutrino/neutrino.elf` (memory cards, __case-sensitive__)\n- `mcX:/NEUTRINO/NEUTRINO.ELF` (SAS-compliant path on memory cards, __case-sensitive__)\n- `mcX:/NEUTRINO/neutrino.elf` (SAS-compliant path on memory cards, __case-sensitive__)\n\nBy 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.  \nSee [this](#launcher-configuration-file) section for details on `nhddl.yaml`.  \n\nNote 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\nloading modules for all devices.  \nIf `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.\n\n**Do not plug in any BDM storage devices while running NHDDL!**  \nDoing so might crash NHDDL and/or possibly corrupt the files on your target device due to how BDM drivers work.\n\n#### Manual installation\n\nTo use NHDDL:\n- Get the [latest `nhddl.elf`](https://github.com/pcm720/nhddl/releases)\n- Copy `nhddl.elf` to your memory card or storage device wherever you want.\n- _Additional step if you need only some of the available modes or MX4SIO support_:  \n  1. Modify `nhddl.yaml` [accordingly](#launcher-configuration-file) and copy it next to `nhddl.elf`.  \n  See notes on [the configuration file](#launcher-configuration-file) for more information\n  2. When loading NHDDL from APA or BDM, there is no reliable way to get modes from `nhddl.yaml`.  \n  You can [rename the ELF](#forcing-a-specific-mode-via-the-nhddl-elf-file-name) to force a specific mode\n- Get the [latest Neutrino release](https://github.com/rickgaiser/neutrino/releases)\n- Copy Neutrino folder to the root of your PS2 memory card or your storage device. \n\n#### Save Application System PSU\n\nYou can also get NHDDL as an easy-to-use PSU package [here](https://pcm720.github.io/nhddl-psu/).  \nTo install it:\n- Copy generated `nhddl.psu` to your USB drive\n- Open wLaunchELF on your PS2\n- Choose your USB device and copy `nhddl.psu`\n- Go back and open your memory card (`mc0` or `mc1`)\n- Open file menu and select `psuPaste`\n- Get the [latest Neutrino release](https://github.com/rickgaiser/neutrino/releases)\n- Copy Neutrino folder to the root of your PS2 memory card or your storage device. \n\nThis will install NHDDL to your memory card along with the PS2 Browser icon.\n \nUpdating `nhddl.elf` is as simple as replacing `nhddl.elf` with the latest version.\n\n### Supported modes\n\n#### ATA (MBR/GPT-formatted HDD with exFAT partition)\n\nTo skip all other devices, `mode: ata` must be present in `nhddl.yaml`.\n\n#### MX4SIO\n\nMX4SIO support requires explicit configuration due to conflicts with memory cards and MMCE devices.  \n`mode: mx4sio` must be present in `nhddl.yaml` on __the memory card__ for MX4SIO to work.  \n\nNote that __MMCE devices will not be available__ when this mode is enabled.\n\n#### USB\n\nUsing more than one USB mass storage device at the same time is not recommended.\nTo skip all other devices, `mode: usb` must be present in `nhddl.yaml`.\n\n#### UDPBD\n\nTo skip all other devices, `mode: udpbd` must be present in `nhddl.yaml`.\n\nUDPBD module requires PS2 IP address to work.  \nNHDDL attempts to retrieve PS2 IP address from the following sources:\n- `udpbd_ip` flag in `nhddl.yaml`\n- `SYS-CONF/IPCONFIG.DAT` on the memory card (usually created by w/uLaunchELF via `MISC/Configure/Network Settings...`)\n\n`udpbd_ip` flag takes priority over `IPCONFIG.DAT`.\n\nMake sure to set the IP address in Neutrino config files (as of Neutrino 1.6.0, `config/bsd-udpbd.toml`).  \nConsult Neutrino documentation for more details.\n\nRecommended UDPBD server implementations:\n- [udpbd-server](https://gitlab.com/ps2max/udpbd-server) by Maximus32\n  - Supports serving physical disks or disk images\n  - Supports read and write operations\n  - Preferred server implementation for *nix systems\n- [udpbd-vexfat](https://github.com/awaken1ng/udpbd-vexfat) by Awaken1ng\n  - Creates virtual exFAT filesystem from directory contents\n  - Supports only read operations\n\n#### iLink\n\nTo skip all other devices, `mode: ilink` must be present in `nhddl.yaml`.\n\n#### MMCE (SD2PSX, MemCard PRO2)\n\nTo skip all other devices, `mode: mmce` must be present in `nhddl.yaml`.\n\n#### HD Loader (APA-formatted HDD with HDL partitions)\n\nNote that HDL backend **does not support** VMCs and virtual HDDs.  \nCover art, `nhddl.yaml` title options will be loaded from the OPL partition set in\n`hdd0:__common/OPL/conf_hdd.cfg`, with `+OPL` or `__common/OPL` used as a fallback.\n\nTo skip all other devices, `mode: hdl` must be present in `nhddl.yaml`.\nHowever, due to how device modules are initialized, this will not improve the initialization times.\n\n### Storing ISO (MMCE, BDM backends)\n\nISOs can be stored almost anywhere on the storage device, but no more than 5 directories deep.  \nFor 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.  \n\nFurthermore, directories that start with `.`, `$` and the following directories are ignored to speed up the scanning process:\n - `nhddl`\n - `APPS`\n - `ART`\n - `CFG`\n - `CHT`\n - `LNG`\n - `THM`\n - `VMC`\n - `XEBPLUS`\n - `MemoryCards`\n\n### Displaying cover art\n\nNHDDL uses the same file naming convention and file format used by OPL.  \nJust put **140x200 PNG** files named `\u003ctitle ID\u003e_COV.png` (e.g. `SLUS_200.02_COV.png`) into the `ART` directory on the root of your device.  \nIf unsure where to get your cover art from, check out the latest version of [OPL Manager](https://oplmanager.com).\n\n### Passing arguments\n\nSimilar to Neutrino, NHDDL supports receiving launcher options from `argv` in the `-\u003carg\u003e=\u003cvalue\u003e` format.  \nBe aware that passing any argument will cause NHDDL to completely skip loading launcher configuration files from any device.  \n\nFor example, to initialize NHDDL with UDPBD mode, you can run `nhddl.elf` with `-mode=udpbd` and `-udpbd_ip=192.168.1.6`.  \n\nIf NHDDL receives `-mode` and `-dvd=\u003cpath to the image file\u003e`, it will skip UI initialization and directly launch Neutrino while respecting all arguments specified in argument files.  \nAdd `-noinit` argument to skip IOP initialization (make sure all required modules are already loaded).  \n\nSee [this file](examples/nhddl.yaml) for a list of all supported arguments and their possible values.\n\n### Forcing a specific mode via the NHDDL ELF file name\n\nWhen loading NHDDL from APA or BDM, there is no reliable way to get modes from `nhddl.yaml` other than passing arguments. However, not a lot of launchers support this.  \nTo work around this, you can add a postfix to `nhddl.elf` to force a specific mode:\n- `nhddl-ata.elf` — force ATA mode\n- `nhddl-mmce.elf` — force MMCE mode\n- `nhddl-hdl.elf` — force HDL mode\n- `nhddl-udpbd.elf` — force UDPBD mode\n- `nhddl-usb.elf` — force USB mode\n- `nhddl-ilink.elf` — force iLink mode\n- `nhddl-m4s.elf` — force MX4SIO mode\n\nNHDDL will only initialize the mode specified in the file name and respect all other options from `nhddl.yaml` on the storage device.\nWhen forcing UDPBD mode, make sure you've configured `SYS-CONF/IPCONFIG.DAT` on your memory card.\n\n## Configuration files\n\nNHDDL uses YAML-_like_ files to load and store its configuration options.\n\n### Launcher configuration file\n\nLauncher configuration is read from the `nhddl.yaml` file.\n\nConfiguration file is loaded from one of the following paths:\n- `\u003cNHDDL launch directory\u003e/nhddl.yaml` (__might be case-sensitive__ depending on device)\n- `massX:/nhddl/nhddl.yaml` (BDM devices, if any of BDM modes are enabled)\n- `hdd0:/\u003cOPL partition\u003e/nhddl/nhddl.yaml` (APA device, if HDL mode is enabled)  \n  `OPL partition` is read from `hdd0:__common/OPL/conf_hdd.cfg`, with `+OPL` or `__common/OPL` used as a fallback\n- `mmceX:/nhddl/nhddl.yaml` (MMCE devices, will work even if MMCE mode is _not_ enabled unless MX4SIO mode is set)\n- `mcX:/APP_NHDDL/nhddl.yaml` (memory cards, __case-sensitive__)\n\nThis file is _completely optional_ and must be used only to force video mode in NHDDL UI or set NHDDL device mode.  \nBy default, default video mode is used and all BDM devices are used to look for ISO files.\n\nTo disable a flag, you can just comment it out with `#`.\n\nSee [this file](examples/nhddl.yaml) for an example of a valid `nhddl.yaml` file and a list of all supported arguments and possible values.\n\n### Additional configuration files on storage device\n\nNHDDL stores and looks for ISO-related config files in `nhddl` directory in the root of your BDM drive.  \n\n#### `lastTitle.bin`\n\nThis file stores the full path of the last launched title and is used to automatically navigate to it each time NHDDL starts up.  \nThis file is created automatically.\n\n#### `cache.bin`\n\nContains title ID cache for all ISOs located during the previous launch, making building ISO list way faster.  \nThis file is also created automatically.\n\n#### Argument files\n\nThese files store arbitrary arguments that are passed to Neutrino on title launch.  \nArguments stored in those files __are passed to `neutrino.elf` as-is__.\n\nEnsure that paths are as short as possible as the combined length of all arguments cannot exceed approximately 255 characters. If this limit is exceeded, arguments will be truncated when passed to Neutrino, potentially causing unpredictable results such as returning to the PS2 menu or ignoring some arguments.  \nNote that NHDDL always adds `-bsd=\u003c\u003e`, `-dvd=\u003cfull path to ISO\u003e`, and `-qb` arguments to load the title, which reduces the actual allowable length below 255 characters.\n\n_For a list of valid arguments, see Neutrino README._\n\nExample of a valid argument file:\n```yaml\n# All flags are passed to neutrino as-is for future-proofing, comments are ignored\ngc: 2\nmc0: /memcard0.bin # all file paths must be relative to device root, the actual mountpoint will be added automatically\n$mc1: /VMC/memcard1.bin # this argument is disabled\n# Arguments that don't have a value\n# Empty values are treated as a simple flag\ndbc:\nlogo:\n```\n\nTo be able to parse those arguments and allow you to dynamically enable or disable them in UI,  \nNHDDL uses a dollar sign (`$`) to mark arguments as enabled or disabled by default.  \nOnly enabled arguments get passed to Neutrino.\n\nNHDDL supports two kinds of argument files:\n\n#### global.yaml\n\nArguments stored in `nhddl/global.yaml` are applied to every ISO by default.\n\n#### ISO-specific files\n\nArguments stored in `nhddl/\u003cISO name\u003e.yaml` are applied to every ISO that starts with `\u003cISO name\u003e`.  \n\nNHDDL can create this file automatically when title compatibility modes are modified and saved in UI.\n\n#### Example of directory sturcture on BDM device\n\n```\nART/ # cover art, optional\n  |\n  - SLUS_200.02_COV.png\nnhddl/\n  |\n   - lastTitle.txt # created automatically\n   - cache.bin # created automatically\n   - global.yaml # optional argument file, applies to all ISOs\n   - nhddl.yaml # NHDDL options, applied after initialization is complete\n   - Silent Hill 2.yaml # optional argument file, applies only to ISOs that start with \"Silent Hill 2\"\nCD/\n  |\n   — Ridge Racer V.iso\nDVD/\n  |\n   - Silent Hill 2.iso\n   - TimeSplitters.iso\n```\n\n## UI screenshots\n\n\u003cdetails\u003e\n    \u003csummary\u003eTitle list\u003c/summary\u003e\n    \u003cimg src=\"img/titles.png\"\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n    \u003csummary\u003eTitle options\u003c/summary\u003e\n    \u003cimg src=\"img/options1.png\"\u003e\n    \u003cimg src=\"img/options2.png\"\u003e\n\u003c/details\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpcm720%2Fnhddl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpcm720%2Fnhddl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpcm720%2Fnhddl/lists"}