EmuCoreV - RetroBIOS¶
Technical notes
PlayStation Vita emulator for Android, package com.sbro.emucorev, arm64-v8a only. A Kotlin and Compose front end drives a Vita3K tree vendored verbatim under app/src/main/cpp/vita3k, reached through an adapter layer that owns every JNI entry point. Frontends start the exported activity com.sbro.emucorev.core.vita.Emulator with an AppStartParameters string array; ES-DE passes -r followed by the title id read from the .psvita file. ref: app/src/main/cpp/emucorev/README.md:1-13, app/src/main/AndroidManifest.xml:85-101, app/src/main/java/com/sbro/emucorev/core/vita/Emulator.kt:128, app/src/main/java/com/sbro/emucorev/core/vita/Emulator.kt:140-152, app/build.gradle.kts:85-86, app/build.gradle.kts:95
The Android library is built from the JNI sources plus interface.cpp and performance.cpp, and links app, audio, compat, config, cppcommon, ctrl, dialog, display, ime, lang, gdbstub, gxm, io, miniz, modules, motion, packages, patch, renderer, shader, touch, util and psvpfsparser, with overlay and np arriving through renderer and modules. The ImGui front end under vita3k/gui is never added as a subdirectory, gui-qt is desktop only, and the adapter drops those two and updater from the link line as well when a configuration defines them. So the home screen, live area, themes, trophy collection, user avatars and the pd0 background music player are not compiled: pd0 is written by a firmware install and never read back, which is why no third preinst package is offered. ref: app/src/main/cpp/vita3k/vita3k/CMakeLists.txt:122-124, app/src/main/cpp/vita3k/vita3k/CMakeLists.txt:154-172, app/src/main/cpp/vita3k/vita3k/CMakeLists.txt:212-215, app/src/main/cpp/emucorev/cmake/AttachToVita3K.cmake:31, app/src/main/cpp/emucorev/cmake/CoreTargetFilter.cmake:19-23
Firmware installation calls vanilla install_pup. The file is tested for the SCEUF magic and nothing else, the SCE segments are decrypted with the built-in keys, os0.img, pd0.img, sa0.img and vs0.img are joined from their pieces, and each image with content is extracted into the Vita filesystem root. The version string is read from the version.txt the package carries. No digest and no length is compared. ref: app/src/main/cpp/emucorev/src/vita_install_bridge.cpp:86-102, app/src/main/cpp/vita3k/vita3k/packages/src/pup.cpp:119-123, app/src/main/cpp/vita3k/vita3k/packages/src/pup.cpp:239-258, app/src/main/cpp/vita3k/vita3k/packages/src/pup.cpp:260-314
Two packages are named in code, both pinned to firmware 3.74 and fetched from Sony. Each URL carries the MD5 of the package it serves in its rel_ and sd_ path segment. The byte counts beside them feed the progress bar and its fallback alone, and one of the two is not the length of the file it names, so nothing measures what was downloaded. ref: app/src/main/java/com/sbro/emucorev/core/FirmwareSource.kt:16-37, app/src/main/java/com/sbro/emucorev/ui/onboarding/FirmwareDownloadViewModel.kt:96-124
Both packages are required. launchInstalledTitle returns MissingFirmware before doing any work when vita/vs0 holds no file, and MissingFirmwareUpdate when vita/sa0 holds no file, each with its own refusal string. The refusal is the app's own: nothing in the vendored core tests either partition before a run, and the only sa0 test in the tree sits in the front end that is not compiled. The gate also sits in the in-app launcher alone, so a frontend starting the activity itself, which is what ES-DE does, reaches the core without passing through it. ref: app/src/main/java/com/sbro/emucorev/core/VitaLaunchBridge.kt:24-30, app/src/main/java/com/sbro/emucorev/core/EmulatorStorage.kt:262-272, app/src/main/java/com/sbro/emucorev/core/vita/Emulator.kt:140-152, app/src/main/res/values/strings.xml:27-31, app/src/main/res/values/strings.xml:710-711
What the partitions are read for. Every launch queues os0:kd/bootimage.skprx
and os0:kd/sysmodule.skprx, then for each preload module that is LLE takes
app0:sce_module/
Storage. The Vita filesystem is a directory named vita under a storage root the user can move to a card, holding ux0 and the partitions a firmware install writes. Configuration, logs, patches, the texture folders and the cache stay on internal storage. Static assets never reach the filesystem: on Android the static assets path is left empty and shaders, fonts and images are read out of the package through SDL. ref: app/src/main/java/com/sbro/emucorev/core/EmulatorStorage.kt:36-46, app/src/main/java/com/sbro/emucorev/core/EmulatorStorage.kt:101-148, app/src/main/cpp/vita3k/vita3k/app/src/app_init.cpp:244-256
Titles arrive as VPK, ZIP, PKG or an already extracted directory, and a PKG needs a zRIF that is either typed in or derived from a license already installed for that content id. ref: app/src/main/cpp/emucorev/src/vita_install_bridge.cpp:104-197, app/src/main/cpp/vita3k/vita3k/packages/src/pkg.cpp:356-376
13 files | 2 required, 11 optional | 6 in repo, 7 missing Categories: 3 BIOS, 10 game data
PSVUPDAT.PUP required in repo large_file
PS Vita system software update package
- System: sony-playstation-vita
- MD5:
f2c7b12fe854... - Source:
app/src/main/java/com/sbro/emucorev/core/FirmwareSource.kt:17-23,app/src/main/java/com/sbro/emucorev/ui/onboarding/FirmwareDownloadViewModel.kt:96-105,app/src/main/java/com/sbro/emucorev/core/VitaInstallBridge.kt:25-36,app/src/main/cpp/emucorev/src/vita_install_bridge.cpp:97-101,app/src/main/cpp/vita3k/vita3k/packages/src/pup.cpp:292-299,app/src/main/java/com/sbro/emucorev/core/VitaLaunchBridge.kt:25-27 - Platforms: batocera
- Base firmware, pinned to 3.74 by a hardcoded URL whose rel_ segment is the MD5 of the package. Downloaded on demand to firmware-downloads under the external files directory, or picked from anywhere through the file picker, then consumed by install_pup, which extracts whichever of os0, vs0, pd0 and sa0 the package carries. This one is what fills vs0, and the app refuses to start a title while vs0 is empty.
PSP2UPDAT.PUP required in repo large_file
PS Vita firmware font package
- System: sony-playstation-vita
- MD5:
59dcf059d332... - Source:
app/src/main/java/com/sbro/emucorev/core/FirmwareSource.kt:25-31,app/src/main/cpp/vita3k/vita3k/packages/src/pup.cpp:296-297,app/src/main/cpp/vita3k/vita3k/renderer/src/renderer.cpp:121-127,app/src/main/java/com/sbro/emucorev/core/VitaLaunchBridge.kt:28-30 - Platforms: batocera
- Second package of the same 3.74 release, pinned by a URL whose sd_ segment is its MD5, and the one that fills sa0 with the PVF system fonts. Installed through the same path as the base package. The app refuses to start a title while sa0 is empty, and asks for it even though the overlay carries a system font fallback of its own.
app_compat_db.xml optional in repo game_data
per-title compatibility ratings
- Path:
compatibility/app_compat_db.xml - System: sony-playstation-vita
- Source:
app/src/main/java/com/sbro/emucorev/data/VitaCompatibilityRepository.kt:18-20,app/src/main/java/com/sbro/emucorev/data/VitaCompatibilityRepository.kt:54-107,app/src/main/java/com/sbro/emucorev/data/VitaCompatibilityRepository.kt:346-350,app/src/main/cpp/vita3k/vita3k/android/jni/native_bootstrap.cpp:122,app/src/main/cpp/vita3k/vita3k/compat/src/compat.cpp:127-150 - Downloaded as app_compat_db.xml.zip from the Vita3K compatibility releases, unpacked into the compatibility directory of internal storage and parsed for the badges the library and catalog screens draw. The native side looks for the same filename in the cache directory at bootstrap and logs a warning when it finds none.
commercial_list.json optional in repo game_data
commercial title index
- Path:
compatibility/commercial_list.json - System: sony-playstation-vita
- Source:
app/src/main/java/com/sbro/emucorev/data/VitaCompatibilityRepository.kt:20,app/src/main/java/com/sbro/emucorev/data/VitaCompatibilityRepository.kt:69-73,app/src/main/java/com/sbro/emucorev/data/VitaCompatibilityRepository.kt:349 - Fetched from the Vita3K web API and merged over the XML snapshot, so a title the database does not carry still resolves. Read only when the file is present and not empty.
psvita_games.db optional in repo game_data bundled
bundled catalog of Vita titles
- System: sony-playstation-vita
- Source:
app/src/main/java/com/sbro/emucorev/data/VitaCatalogRepository.kt:8-9,app/src/main/java/com/sbro/emucorev/data/VitaCatalogRepository.kt:276-292 - SQLite catalog carried in the package assets and copied into internal storage the first time the catalog screen opens, then reopened read only from there. A copy already present is kept.
config.txt optional missing game_data
taiHEN plugin configuration
- Path:
vita/ux0/tai/config.txt - System: sony-playstation-vita
- Source:
app/src/main/cpp/vita3k/vita3k/modules/taiHEN/taiHEN.cpp:1253-1272,app/src/main/cpp/vita3k/vita3k/interface.cpp:535 - Read once per session from ux0:tai/config.txt, then from ur0:tai/config.txt when the first is absent. Sections name a title id or KERNEL and list the plugin paths loaded for it. No file found is logged and the session continues.
<plugin>.suprx optional missing game_data
taiHEN plugin
- Path:
vita/ux0/tai/<plugin>.suprx - System: sony-playstation-vita
- Source:
app/src/main/cpp/vita3k/vita3k/modules/taiHEN/taiHEN.cpp:1362-1405,app/src/main/cpp/vita3k/vita3k/modules/taiHEN/taiHEN.cpp:1306-1359 - Loaded at the path config.txt gives it, kernel plugins once per session and title plugins on each launch of the matching title id. A plugin that fails to load is logged and skipped. Exports of a loaded plugin that already have an HLE implementation are overridden by it.
<TITLEID>.txt optional missing game_data
per-title binary patch list
- Path:
patch/<TITLEID>.txt - System: sony-playstation-vita
- Source:
app/src/main/cpp/vita3k/vita3k/patch/src/patch.cpp:26-70,app/src/main/cpp/vita3k/vita3k/patch/src/patch.cpp:77-90,app/src/main/cpp/vita3k/vita3k/patch/src/util.cpp:24-50,app/src/main/cpp/vita3k/vita3k/interface.cpp:482-484 - The patch directory is scanned at module load and any filename holding the running title id and ending in .txt is parsed. A bracketed header names the binary the lines under it apply to, eboot.bin until one says otherwise, and each line is a segment and an offset followed by the values written there. A line that fails to parse is logged and the rest of the file is kept.
PATCHLIST.TXT optional in repo game_data
shared binary patch list
- Path:
patch/PATCHLIST.TXT - System: sony-playstation-vita
- Source:
app/src/main/cpp/vita3k/vita3k/patch/src/patch.cpp:30-37,app/src/main/cpp/vita3k/vita3k/patch/src/patch.cpp:57-59,app/src/main/cpp/vita3k/vita3k/patch/src/util.cpp:30-38 - Read alongside the per-title files whatever the running title is, the name matched case insensitively as a substring. Its headers take a title id and an optional binary, so one file holds patches for several titles, and the lines under a header for another title are skipped.
<hash>.png optional missing game_data
replacement texture
- Path:
textures/import/<TITLEID>/<hash>.png - System: sony-playstation-vita
- Source:
app/src/main/cpp/vita3k/vita3k/renderer/src/texture/cache.cpp:312-315,app/src/main/cpp/vita3k/vita3k/renderer/src/texture/replacement.cpp:607-630,app/src/main/java/com/sbro/emucorev/core/VitaCoreConfigRepository.kt:30,app/src/main/java/com/sbro/emucorev/core/VitaCoreConfigRepository.kt:262 - Read when the import textures option is on. The import folder is walked recursively and a file counts only when its name parses as a hexadecimal hash, which is the key the texture cache looks it up by.
<hash>.dds optional missing game_data
replacement texture, compressed
- Path:
textures/import/<TITLEID>/<hash>.dds - System: sony-playstation-vita
- Source:
app/src/main/cpp/vita3k/vita3k/renderer/src/texture/replacement.cpp:624-629 - Same folder and same hash naming as the png form, taken as a DDS instead and used for the block compressed formats.
<driver>.zip optional missing
replacement Vulkan driver package
- System: sony-playstation-vita
- Source:
app/src/main/java/com/sbro/emucorev/core/GpuDriverCatalogRepository.kt:45-78,app/src/main/java/com/sbro/emucorev/core/GpuDriverCatalogRepository.kt:130-136,app/src/main/java/com/sbro/emucorev/core/GpuDriverManager.kt:52-125,app/src/main/java/com/sbro/emucorev/core/GpuDriverManager.kt:136-171,app/src/main/java/com/sbro/emucorev/ui/settings/SettingsTabContent.kt:215,app/src/main/cpp/vita3k/vita3k/util/src/android_driver.cpp:202-215,app/src/main/cpp/vita3k/vita3k/util/src/android_driver.cpp:362-380,app/src/main/cpp/vita3k/vita3k/renderer/src/vulkan/renderer.cpp:371-387,app/src/main/cpp/vita3k/vita3k/renderer/src/vulkan/renderer.cpp:569-578 - Listed by a catalog fetched from the EmuCoreV-Drivers repository, or picked from the device. The archive is unpacked into a directory named after it under driver in internal storage, the Vulkan library it holds is recorded in a driver_name.txt written beside it, libvulkan.so taken first and any other name carrying vulkan after it, and the renderer resolves vkGetInstanceProcAddr through adrenotools from that pair before the Vulkan instance is created. The system loader is used when no driver is configured or the injection fails. The setting is shown only when the device strings name Qualcomm hardware, or match an sm model with no other vendor named.
work.bin optional missing game_data
title license
- Path:
vita/ux0/license/<TITLEID>/<CONTENTID>.rif - System: sony-playstation-vita
- Source:
app/src/main/cpp/emucorev/src/vita_install_bridge.cpp:122-124,app/src/main/cpp/vita3k/vita3k/packages/src/license.cpp:53-84,app/src/main/cpp/vita3k/vita3k/packages/src/license.cpp:99-106,app/src/main/cpp/vita3k/vita3k/packages/src/pkg.cpp:356-376 - A picked file named work.bin, or carrying the .rif or .bin extension, is read as a license, checked for its magic and copied under ux0:license as
.rif. A PKG install with no zRIF given reads the license already sitting there for that content id and derives one from it. A missing or corrupt license is logged and the retail livearea path is used instead.
Generated on 2026-08-23T16:12:06Z