A game launcher that runs on the PlayStation 2 and does its own homework.

Everything NULD can do, and how to turn it on. You need a PS2 that runs homebrew (FreeMcBoot or similar) and a USB drive.

Download

Fig. 1, the loading screen at every boot, while the console starts the USB, reads the memory cards and loads the covers.
1

The USB drive

Copy the zip's contents to the root of the drive, put your ISOs in DVD/ (CD games in CD/) and start mass0:/launcher.elf from uLaunchELF. The setup wizard opens on the first boot.

USB root
├── launcher.elf
├── neutrino/     the loader, with NULD's in-game menu and achievements agent
├── DVD/          PS2 DVD ISOs
├── CD/           PS2 CD ISOs
├── POPS/         PS1 games (POPStarter .VCD), optional
├── APPS/         homebrew .ELF files, optional
├── covers/       written by NULD: the covers it downloads
└── nuld/         written by NULD: config.ini, juegos.ini, estado.ini

FAT32 cannot hold files over 4 GB: format the drive as exFAT for big ISOs. Virtual memory cards live in VMC/ on the game's own device.

2

Buttons

Carousel view: Beyond Good and Evil selected, its tags at the top and the button hints at the bottom
Fig. 2, the home screen. The hints at the bottom right change with what the selected game allows.
← → ↑ ↓Move through the library
L1 / R1Filter: all, PS2, PS1, apps
□Change view: carousel, grid, list
△Per-game options: video mode, compatibility, memory card
○The game's achievements, when it has a set
✕Play
STARTThe setup wizard
SELECTStatus: each game source (games found, or why it failed), the network, frame times
L2 + R2Switch the menu between 720p and 480i for a CRT TV. It works blind, and is remembered
3

config.ini

NULD writes mass0:/nuld/config.ini on its first boot, and the setup wizard (START) edits the main keys for you. Each key is explained in the file. The main ones:

Section and keyValuesWhat it does
[ui] idiomaes, enLanguage of the menus and of the file's comments
[juegos] origenusb, hdd, mx4sio, ilink, mmce, udpbd, udpfsWhere to look for games, comma-separated
[juegos] servidoran IPThe home game server (udpfs)
[memorycard] modojuego, compartida, fisicaA virtual card per game, one shared, or the physical one
[video] modonativo, 480p, 1080iVideo mode of the games
[video] pantalla720p, 480iThe menu's own output; 480i for a CRT
[red] ipdhcp or an IPDHCP, or a fixed IP with mascara, puerta and dns
[portadas] descargarsi, noDownload missing covers at boot
[logros] activossi, noRetroAchievements through the xeRAbora client
[actualizaciones] buscarsi, noLook for a new NULD release at boot
[igr] menua button comboThe in-game menu's combo; also reiniciar and apagar
4

Covers

Plug in the network cable (built in on slim PS2s, the network adapter on fat ones). At boot NULD downloads the covers it is missing from xlenore/ps2-covers and keeps them on the USB, so later boots work offline.

Your own covers: tools/covers.py in the zip turns PNG or JPG files named by serial (SLUS-21376.png) into the pair of files for mass0:/covers/.

5

Back from a game

NULD installs BOOT/NULD.ELF on your memory card, and the setup wizard can set FreeMcBoot to start it (autoboot, a button, or an item in FMCB's menu). Then Restart in the in-game menu (L1+L2+R1+R2+START+SELECT) reboots the console straight into NULD. L1+L2+R1+R2+L3+R3 powers it off.

6

Per-game options

Per-game options panel over the dimmed home screen
Fig. 3, △ on a PS2 game.

The card at the top right shows the game's newest save and its 3D icon: from the virtual card, or from the physical one in slot 1 when you choose it here.

Video mode (480p or 1080i, forced), Neutrino's compatibility modes for games that need them, and the memory card: the game's own, the shared one or the physical one. The choices are saved in nuld/juegos.ini.

7

RetroAchievements

Achievements panel for Black: 0 of 56, 0 of 600 points
Fig. 4, ○ on Black: 56 achievements, with points and progress.
  1. On a PC or server on your network, run the xeRAbora v0.1.0-alpha.9 client and sign in to your RetroAchievements account.
  2. On the PS2, keep [logros] activos = si. Leave servidor empty to find the client on the network, or set its IP.
  3. Games with a set show the achievements tag, and ○ lists them with your progress. Press ✕ any time: NULD does not wait for the answer.
  4. While you play, the agent inside the game sends its memory to the client, which unlocks achievements on your profile.
8

Home game server

Keep your ISOs on a Linux machine and play them over the cable. The zip's server/ folder has everything:

# on the server, with the ISOs in /srv/data/ps2/DVD
cp -r server ~/nuld && cd ~/nuld
mkdir -p ~/.config/systemd/user && cp *.service ~/.config/systemd/user/
systemctl --user daemon-reload
systemctl --user enable --now udpfs nuld-catalog
loginctl enable-linger $USER
curl http://localhost:18290/catalog      # what the PS2 will see

Allow UDP 62966 and TCP 18290 in the firewall. On the PS2: [juegos] origen = usb, udpfs and servidor = <server IP>. Use a cable on both ends: udpfs does not survive WiFi packet loss.

9

Other sources

Add them to origen, or tick them in the setup wizard: hdd (internal exFAT disk, or HD Loader partitions), mx4sio, ilink, mmce (not together with mx4sio), udpbd (needs a fixed IP in [red]). NULD can also run from an MMCE's SD card with no USB drive at all.

A MemCard PRO 2 or SD2PSX switches to the game's own card when a game starts, whatever its source. To save there instead of a virtual card, set the game's memory card to fisica with △.

10

Updates

With the cable in, NULD looks for a newer release at boot and says so; START installs it. Every file is checked against a manifest signed with the release key before anything is replaced, and the old files stay as .old.

Coming from ORBIT (v1.1 or older): the first boot moves orbit/ to nuld/, keeps BOOT/ORBIT.ELF up to date next to the new BOOT/NULD.ELF, and keeps using VMC/ORBIT.bin as the shared card.

11

Troubleshooting

  • No covers: check the cable and [portadas] descargar = si. The line after the loading screen says which step failed; for "no DNS", set [red] dns = 1.1.1.1.
  • A source shows no games: SELECT lists every source and why it failed.
  • "Achievements: no server": the xeRAbora client did not answer; set its IP in [logros] servidor.
  • Black screen with a game: try 480p instead of nativo with △, or a compatibility mode.
  • Black screen on a CRT: press L2+R2 together for 480i.
  • Logs: mass0:/launcher.txt records each launch.