Field-report fixes, all verified on real hardware (R36S/ArkOS) before release.
Controllers (muOS RG40XX-H "only d-pad works", ROCKNIX RG DS "d-pad dead", can't exit)
The pad normalizer no longer guesses the physical layout from the controller's USB id. retrogame_joypad is configured per firmware, so the same id ships different button orders — and sometimes a HAT d-pad — on different CFWs. The translation table is now built at runtime from the controller mapping your firmware itself provides (PortMaster get_controls → SDL_GAMECONTROLLERCONFIG): face buttons, shoulders, triggers (button- or axis-based), analog axes, HAT d-pad, and the real SELECT/START pair for the save-safe exit combo. The proven Twin PS2/USB and GO-Super profiles remain as fallback, and KOTOR_INPUT_DYNAMIC=0 restores the old behavior. debug.log now records the exact mapping used (cfw pad mapping: / kotor_input: lines), so reports can show precisely how the pad was translated.
Quick Save hard-lock (reported on R36S/DarkOsRE)
Reproduced live and fixed: the engine ends save-directory enumeration on the Win32 pair FindNextFileA()==0 + GetLastError()==ERROR_NO_MORE_FILES, but the loader never set the compat layer's last-error — so overwriting an existing quick save spun the main thread forever (the first quick save always worked, which is why it only hit the second save onwards). The loader now reports enumeration state through the layer's own SetLastError. Verified on device: quick save overwrites complete and the game keeps running.
Install
Same as before: drop the ports/ folder onto your device, launch Star Wars KOTOR, and the installer will build the game data from your own APK+OBB copy (BYO data — nothing copyrighted ships here). See INSTALLATION.md.
sha256: see attached .sha256.