PortMaster
Run PC ports natively on the R36S
PortMaster is a launcher / port repository that runs native PC binaries (Half-Life, Diablo II, Doom 3, Quake, Stardew Valley, Vvvvvv, …) directly on the handheld using box86 / box64 translation when needed. ArchR ships PortMaster pre-installed and pre-wired.
What's included by default
PortMaster GUI /storage/roms/ports/PortMaster/
gptokeyb joypad → keyboard event translator
oga_controls extra device-specific input glue
control.txt default key map
SDL2 + lib32 / box86 32-bit x86 binaries via box86
SDL2 + box64 64-bit x86_64 binaries via box64
Python 3 + lzma used by the GUI and many portsVerified at boot:
python3 -c 'import lzma' # works
ls -la /dev/uinput # crw-rw-rw- (udev rule 91-uinput.rules)Run a port
Open PortMaster
In EmulationStation, scroll to the Ports system. The first entry is "PortMaster" — open it. The GUI launches.
Browse / install
Press B on a port to install. Files land in /storage/roms/ports/<port-name>/. PortMaster downloads any data files (ROM-style assets aren't included — copy wad/mpq/etc. to the port folder per its README).
Quit PortMaster GUI
MODE + B returns to ES. Installed ports appear as launchers (.sh files) in the Ports system list.
Play a port
Just like a ROM — select the launcher, press A. ArchR pauses background services (Syncthing, Tailscale, ZeroTier) for the duration, switches the CPU governor to performance, and pins the GPU at 650 MHz.
Exit
Each port has its own hotkey, usually MODE + START + SELECT. Some use MODE + START alone. The combo is documented in the port's README inside /storage/roms/ports/<port>/README.md.
Bring-your-own-data ports
Some ports ship only the engine. They expect you to drop the original game data into the port's folder. Examples:
| Port | What to drop |
|---|---|
| HalfLife | valve/ and cstrike/ from your Steam install |
| Diablo II | *.mpq files from a legitimate copy |
| Doom 3 | pak*.pk4 from the retail install |
| Quake | id1/pak0.pak and pak1.pak |
| Stardew Valley | Content/, StardewValley.dll, etc. from your Steam Linux install |
| TombRaider | data/ from the original CD |
| DevilutionX (Diablo I) | diabdat.mpq |
PortMaster shows a per-port checklist of missing files in the GUI before letting you launch.
Network play
PortMaster ports that support multiplayer (Quake, Half-Life DM, etc.) can use:
- Tailscale or ZeroTier for "internet LAN" play with friends — toggle on in ES → System Settings → Network.
- Local LAN broadcast — works out of the box; both devices need to be on the same WiFi.
ArchR keeps all VPN services paused until you launch a game that needs them, then resumes when you exit.
Performance expectations
Cortex-A35 + Mali-G31 is a budget SoC. Realistic baseline:
| Tier | Examples | Expectation |
|---|---|---|
| Native ARM, lightweight | Vvvvvv, Stardew Valley, Cute Fame, OpenRA | full speed, full battery life |
| box86 (32-bit x86) | Diablo II, Half-Life, Quake, Doom 3 | 25-60 fps depending on settings |
| box64 (64-bit x86_64) | Newer indie titles (Hollow Knight class) | playable but heavy — needs CPU Overclock on |
| Heavy 3D / RT | DOOM Eternal, modern AAA | not viable |
Toggle Enable CPU Overclock in ES (lifts cap from 1.4 → 1.5 GHz) for box86/64 ports that struggle.
Troubleshooting
Port hangs at black screen. Joypad permissions probably wrong. Check ls -la /dev/uinput returns mode 666. If not, the udev rule didn't apply — sudo chmod 666 /dev/uinput for now and report a bug.
gptokeyb: Permission denied. Same as above.
Port asks for missing data files. Drop them in /storage/roms/ports/<port>/ per the port's README. PortMaster's GUI lists missing files before launch.
box86: assertion failure. The port was built against a newer libstdc++ than what ArchR ships. Wait for an update or report it on the PortMaster Discord.
PortMaster GUI itself fails to start. Run start_portmaster.sh over SSH and read the trace. The script is now idempotent (rm -rf + guards) so re-launching is always safe.
Where things live
/storage/roms/ports/
├── PortMaster/ GUI + scripts (managed)
│ ├── PortMaster.sh
│ ├── control.txt default joypad → key map
│ ├── gptokeyb input translator
│ └── ...
├── DiabloII.sh generated launcher per port
├── DiabloII/ actual port files
├── HalfLife.sh
├── HalfLife/
└── ...Removing a port: delete the .sh and the matching folder, then ES → Game Settings → Rescan ROMs.