Skip to content

NetherSX2 - RetroBIOS

Type standalone
Classification Community forks
Source https://github.com/Trixarian/NetherSX2-patch
Upstream https://github.com/Trixarian/AetherSX2
Version 2.1-4248
Profiled 2026-08-12
Cores nethersx2, NetherSX2, NETHERSX2
Systems sony-playstation-2
Author Trixarian
BIOS directory bios/
Technical notes

PlayStation 2 emulator for Android, package xyz.aethersx2.android, activity xyz.aethersx2.android.EmulationActivity. The project is a patcher rather than a source tree: it rewrites the AetherSX2 application package, replaces its data assets and signs the result with its own key. Two lines are published, one on the AetherSX2 v1.5-4248 package and one on v1.5-3668, and both name themselves NetherSX2 and keep the same package id. Every statement below was read from the shipped arm64 library lib/arm64-v8a/libemucore.so, which is stripped, and confirmed against the unpatched AetherSX2 packages the project distributes for its own build step. ref: decomp/Extract.bat:1, old/scripts/patch-apk.sh:24-33, nethersx2 v2.1-4248 AndroidManifest.xml

The patch touches three instructions in the 4248 library. Two turn the compare-and-branch that follows a certificate comparison into a plain branch, which is what lets the package be resigned. The third replaces the test that gates BIOS acceptance. Everything reached by the file loading paths is byte for byte the AetherSX2 build, so the file set below is that build's, read from the 4248 library rather than carried over from another release. ref: decomp/Hackify.bat:24-28, nethersx2 v2.1-4248 libemucore.so 0x838560, nethersx2 v2.1-4248 libemucore.so 0x83b324

A BIOS image is required and boot stops without one, the application saying it needs a PS2 BIOS in the bios folder of the data directory. The data directory is getExternalFilesDir(null) with getDataDir() behind it, and the folder names under it come from the Folders section, Bios defaulting to bios. A script in the repository moves that root to /storage/emulated/0/NetherSX2 once all-files access is granted, and patches out the library check that requires the package name in the path; the published packages do not carry it. ref: nethersx2 v2.1-4248 libemucore.so 0xf70a9, nethersx2 v2.1-4248 libemucore.so 0x7ea914-0x7eaa8c, xyz/aethersx2/android/NativeLibrary.smali initializeOnce, patches/patch_root_storage.py:14-35, patches/patch_root_storage.py:261-351

Detection is by content. The scan lists the BIOS folder with a * mask, keeps files between 4194304 and 8388608 bytes, and accepts an image whose romdir carries a RESET entry followed by a readable ROMVER; the fifth ROMVER character gives the zone, A for USA, C for China, E for Europe, H for Asia, J for Japan, P for Free, T for T10K and X for Test, any other character standing for itself, and an EXTINFO entry is read along the way. Stock 4248 also required the sixth character to differ from D, which turned away development images; the patch forces that result to true, and the 3668 line never carried the test. An image named in the configuration is combined with the BIOS folder and opened at that path when it exists, without the size filter and without the romdir test. No name and no hash is matched anywhere. The image is read into the 4 MB ROM region and truncated to it, and one shorter than 2465792 bytes turns off the OSDSys parameter HLE. ref: aethersx2/pcsx2/ps2/BiosTools.cpp:27-28, aethersx2/pcsx2/ps2/BiosTools.cpp:62-175, aethersx2/pcsx2/ps2/BiosTools.cpp:235-260, aethersx2/pcsx2/ps2/BiosTools.cpp:272-332, nethersx2 v2.1-4248 libemucore.so 0x828d80-0x828f10, nethersx2 v2.1-4248 libemucore.so 0x829020-0x8292c0, nethersx2 v2.1-4248 libemucore.so 0x829244-0x829248

Companions derive from the selected image. rom1 and rom2 are appended to the full name first, then substituted for the existing extension, so an image at ps2-0230a-20080220.bin is followed by ps2-0230a-20080220.bin.rom1 then ps2-0230a-20080220.rom1. The nvm and the mec are read at the substituted extension only, and both are written with defaults when they are absent or too short. No erom is loaded on this code line. ref: aethersx2/pcsx2/ps2/BiosTools.cpp:193-218, aethersx2/pcsx2/CDVD/CDVD.cpp:120-144, aethersx2/pcsx2/CDVD/CDVD.cpp:180-214, nethersx2 v2.1-4248 libemucore.so 0x8288b0-0x828b90

The network adapter opens eeprom.dat and flash.dat by bare name, so they resolve against the process working directory, which the application never sets. A compiled-in image stands in for the first and a card filled with 0xFF for the second. DEV9hdd.raw is the default name of the empty disk image its settings page writes. An IRX named in the configuration is read into the ROM region at 0x3C0000 at boot; the field is empty by default and names no file of its own. ref: aethersx2/pcsx2/DEV9/DEV9.cpp:146-161, aethersx2/pcsx2/DEV9/flash.cpp:76-104, aethersx2/pcsx2/ps2/BiosTools.cpp:220-233, nethersx2 v2.1-4248 libemucore.so 0x7c5bec-0x7c5ca0, nethersx2 v2.1-4248 libemucore.so 0x828bc0-0x828ca0

Resources are read out of the package itself. The library has no asset manager of its own and calls back into readPackageFile, readPackageFileToString and playSoundAsync, each taking an asset-relative name, so the game database, the patch archives, the interface fonts, the shader sources every backend compiles at startup and the achievement sounds are versioned with the build and never looked for on disk. The game list draws its region flags and rating stars from the same assets. The project ships its own game database, patch archives and help pages, and adds two files the 4248 package does not carry, placeholder.png, which the library names outright, and the Polish flag the game list can ask for. ref: nethersx2 v2.1-4248 libemucore.so 0x8348d0, nethersx2 v2.1-4248 libemucore.so 0x834bb0, xyz/aethersx2/android/NativeLibrary.smali readPackageFile, xyz/aethersx2/android/NativeLibrary.smali playSoundAsync

41 files | 4 required, 37 optional | 38 in repo, 3 missing | 4 with HLE fallback

ps2-0230a-20080220.bin required in repo
PS2 BIOS image

  • Path: bios/ps2-0230a-20080220.bin
  • Size: min 4.0 MB, max 8.0 MB
  • Validation: size
  • Source: aethersx2/pcsx2/ps2/BiosTools.cpp:27-28, aethersx2/pcsx2/ps2/BiosTools.cpp:235-260, nethersx2 v2.1-4248 libemucore.so 0x828d80-0x828f10, nethersx2 v2.1-4248 libemucore.so 0x829244-0x829248
  • Platforms: batocera, lakka, recalbox, retroarch, retrobat, retrodeck, retropie, rocknix, romm
  • Any image whose romdir holds RESET and a readable ROMVER is accepted, whatever its name. The 4 to 8 MB range gates the folder scan; an image named in the configuration skips both that range and the romdir test. The sixth ROMVER character is not examined here, the patch having replaced the test that rejected images carrying D.

ps2-0230a-20080220.rom1 optional in repo
DVD player ROM

  • Path: bios/ps2-0230a-20080220.rom1
  • Size: max 4.0 MB
  • Source: aethersx2/pcsx2/ps2/BiosTools.cpp:193-218, nethersx2 v2.1-4248 libemucore.so 0x8288b0-0x828a24
  • Tried as {bios}.rom1 then {biosbase}.rom1. Read at 0x2404000 of the EE memory block and truncated to 4 MB. Logged and skipped when absent.

ps2-0230a-20080220.rom2 optional missing
Chinese ROM extension

  • Path: bios/ps2-0230a-20080220.rom2
  • Size: max 512.0 KB
  • Aliases: SCPH-90006_BIOS_VX_HK _230.ROM2
  • Source: aethersx2/pcsx2/ps2/BiosTools.cpp:193-218, nethersx2 v2.1-4248 libemucore.so 0x828a34-0x828b90
  • Same two-step naming as rom1. Read at 0x2804000 of the EE memory block and truncated to 512 KB. Only present on Chinese region consoles.

ps2-0230a-20080220.nvm optional in repo HLE fallback
Console NVRAM

  • Path: bios/ps2-0230a-20080220.nvm
  • Size: min 1.0 KB
  • Validation: size
  • Source: aethersx2/pcsx2/CDVD/CDVD.cpp:158-214, nethersx2 v2.1-4248 libemucore.so 0x79b930-0x79bb90, nethersx2 v2.1-4248 libemucore.so 0x79bce0
  • Read at the BIOS path with the extension replaced by nvm, opened r+b. Carries the console id, the iLink id, the language and the OSD configuration. A 1024 byte image is written when the file is missing or shorter, zeroed except for a fixed iLink id and the language defaults of the BIOS region, and it is rewritten when the language block reads back blank.

ps2-0230a-20080220.mec optional in repo HLE fallback
Mechacon version

  • Path: bios/ps2-0230a-20080220.mec
  • Size: min 4 B
  • Validation: size
  • Source: aethersx2/pcsx2/CDVD/CDVD.cpp:120-144, nethersx2 v2.1-4248 libemucore.so 0x79cbc0-0x79cdc4
  • Read at the BIOS path with the extension replaced by mec. Written as 03 06 02 00 when the file is missing or shorter than 4 bytes.

eeprom.dat optional in repo HLE fallback
DEV9 EEPROM

  • Size: 64 B
  • Source: aethersx2/pcsx2/DEV9/DEV9.cpp:146-161, nethersx2 v2.1-4248 libemucore.so 0x7c5c40-0x7c5ca0
  • Opened O_RDWR by bare name when the network adapter starts and mapped over 64 bytes. A compiled-in image stands in when the file is missing or cannot be mapped.

flash.dat optional missing HLE fallback
DEV9 SmartMedia flash image

  • Size: max 8.2 MB
  • Source: aethersx2/pcsx2/DEV9/flash.cpp:76-104, nethersx2 v2.1-4248 libemucore.so 0x7c5bec-0x7c5c40
  • Opened rb by bare name at network adapter init and read as 1024 blocks of 16 pages of 512 bytes plus 16 ECC bytes. The card is filled with 0xFF when the file is absent.

<module>.irx optional missing
IOP module injected at boot

  • Source: aethersx2/pcsx2/ps2/BiosTools.cpp:220-233, aethersx2/pcsx2/ps2/BiosTools.cpp:327-328, nethersx2 v2.1-4248 libemucore.so 0x828bc0-0x828ca0
  • Opened at the path the configuration holds once it is longer than three characters, and read into the ROM region at 0x3C0000, capped at 0x40000 bytes. The field is empty by default and names no file of its own.

GameIndex.yaml optional in repo bundled
Game database

  • Path: assets/GameIndex.yaml
  • Size: 1.8 MB
  • SHA1: 997fdfb1c187...
  • MD5: a083d432bdcb...
  • Source: aethersx2/pcsx2/GameDatabase.cpp:35, aethersx2/pcsx2/GameDatabase.cpp:226, nethersx2 v2.1-4248 libemucore.so 0x2e35ec
  • Platforms: lakka, retroarch, retropie
  • Read from the package by name, keyed by serial, and carrying the per-game fixes, patches and settings overrides. Parsed into gamedb.cache in the cache folder. The project maintains its own copy with entries specific to this build.

cheats_ws.zip optional in repo bundled
Widescreen patch archive

  • Path: assets/cheats_ws.zip
  • Size: 1.6 MB
  • SHA1: f0d9c66e4793...
  • MD5: d9460e9df9ac...
  • Source: nethersx2 v2.1-4248 libemucore.so 0x80f8bc-0x80f9a8
  • Per-game pnach entries matched on the disc CRC, read from the package when widescreen patches are enabled. The cheats_ws folder under the data directory takes precedence and the archive is skipped when it holds a match.

cheats_ni.zip optional in repo bundled
No-interlacing patch archive

  • Path: assets/cheats_ni.zip
  • Size: 216.3 KB
  • SHA1: 0b219dc8b3b9...
  • MD5: 70a2f8043f2c...
  • Source: nethersx2 v2.1-4248 libemucore.so 0x80fa54-0x80facc
  • Same form as cheats_ws.zip, read when no-interlacing patches are enabled, with the cheats_ni folder taking precedence.

Roboto-Regular.ttf required in repo bundled
Interface font

  • Path: assets/fonts/Roboto-Regular.ttf
  • Size: 298.4 KB
  • SHA1: 00d62fbdc8d5...
  • MD5: 86da78cb5957...
  • Source: nethersx2 v2.1-4248 libemucore.so 0x7dc87c-0x7dc88c
  • Read as the standard font when the interface comes up. The load fails without it.

RobotoMono-Medium.ttf required in repo bundled
Fixed-width interface font

  • Path: assets/fonts/RobotoMono-Medium.ttf
  • Size: 84.8 KB
  • SHA1: 9056e59b69c6...
  • MD5: 8ad82b1dc550...
  • Source: nethersx2 v2.1-4248 libemucore.so 0x7dc8d0-0x7dc8e0
  • Read for the fixed-width font. The load fails without it.

fa-solid-900.ttf required in repo bundled
Font Awesome icon font

  • Path: assets/fonts/fa-solid-900.ttf
  • Size: 199.7 KB
  • SHA1: 694b8a2445ff...
  • MD5: dffd9504fcb1...
  • Source: nethersx2 v2.1-4248 libemucore.so 0x7dc924-0x7dc934
  • Read for the interface icon glyphs. The load fails without it.

ffx_a.h optional in repo bundled
FidelityFX common header

  • Path: assets/shaders/common/ffx_a.h
  • Size: 157.7 KB
  • SHA1: 726370c10154...
  • MD5: 2c539b603dcb...
  • Source: nethersx2 v2.1-4248 libemucore.so 0x616ba0
  • Prepended to the sharpening shader of both backends.

ffx_cas.h optional in repo bundled
FidelityFX CAS header

  • Path: assets/shaders/common/ffx_cas.h
  • Size: 62.0 KB
  • SHA1: a1d1a687577f...
  • MD5: f8a3d7f48ae1...
  • Source: nethersx2 v2.1-4248 libemucore.so 0x616bb0
  • Prepended to the sharpening shader of both backends.

fxaa.fx optional in repo bundled
FXAA shader source

  • Path: assets/shaders/common/fxaa.fx
  • Size: 19.0 KB
  • SHA1: 3ac5f68049ed...
  • MD5: 5cdeb2963c1b...
  • Source: nethersx2 v2.1-4248 libemucore.so 0x6556c8, nethersx2 v2.1-4248 libemucore.so 0x65f020
  • Read by both backends when FXAA is enabled.

common_header.glsl optional in repo bundled
OpenGL shader preamble

  • Path: assets/shaders/opengl/common_header.glsl
  • Size: 1.8 KB
  • SHA1: 3f4759718703...
  • MD5: 1dcf4ca0cc95...
  • Source: nethersx2 v2.1-4248 libemucore.so 0x64c5d0
  • Prepended to every OpenGL program the renderer builds.

convert.glsl optional in repo bundled
OpenGL format conversion shader

  • Path: assets/shaders/opengl/convert.glsl
  • Size: 11.0 KB
  • SHA1: b2a059787ee2...
  • MD5: c3db4fcdd142...
  • Source: nethersx2 v2.1-4248 libemucore.so 0x64cf14

present.glsl optional in repo bundled
OpenGL presentation shader

  • Path: assets/shaders/opengl/present.glsl
  • Size: 9.2 KB
  • SHA1: bf2688971a8e...
  • MD5: afbb9a89f17e...
  • Source: nethersx2 v2.1-4248 libemucore.so 0x64d458

merge.glsl optional in repo bundled
OpenGL frame merge shader

  • Path: assets/shaders/opengl/merge.glsl
  • Size: 455 B
  • SHA1: d1a3c11a1273...
  • MD5: 2c4d70f62928...
  • Source: nethersx2 v2.1-4248 libemucore.so 0x64d758

interlace.glsl optional in repo bundled
OpenGL deinterlacing shader

  • Path: assets/shaders/opengl/interlace.glsl
  • Size: 6.1 KB
  • SHA1: e74e58f530ab...
  • MD5: 0e537dd838a7...
  • Source: nethersx2 v2.1-4248 libemucore.so 0x64da84

shadeboost.glsl optional in repo bundled
OpenGL brightness and contrast shader

  • Path: assets/shaders/opengl/shadeboost.glsl
  • Size: 1.4 KB
  • SHA1: 8d8b8966afd2...
  • MD5: 3d1e2be521a6...
  • Source: nethersx2 v2.1-4248 libemucore.so 0x64dc8c

cas.glsl optional in repo bundled
OpenGL sharpening shader

  • Path: assets/shaders/opengl/cas.glsl
  • Size: 2.4 KB
  • SHA1: 1a69a0fc522c...
  • MD5: f8a684763e24...
  • Source: nethersx2 v2.1-4248 libemucore.so 0x64ee98

tfx_vgs.glsl optional in repo bundled
OpenGL texture function vertex and geometry shader

  • Path: assets/shaders/opengl/tfx_vgs.glsl
  • Size: 5.6 KB
  • SHA1: 0e9e98f766c9...
  • MD5: a97e9616f298...
  • Source: nethersx2 v2.1-4248 libemucore.so 0x64f1f0

tfx_fs.glsl optional in repo bundled
OpenGL texture function fragment shader

  • Path: assets/shaders/opengl/tfx_fs.glsl
  • Size: 26.1 KB
  • SHA1: 00eb0418e7a2...
  • MD5: 24e39ca8f97a...
  • Source: nethersx2 v2.1-4248 libemucore.so 0x64f200

tfx.glsl optional in repo bundled
Vulkan texture function shader

  • Path: assets/shaders/vulkan/tfx.glsl
  • Size: 28.8 KB
  • SHA1: aa06cffa0861...
  • MD5: f80e78f88892...
  • Source: nethersx2 v2.1-4248 libemucore.so 0x65b1b0

convert.glsl optional in repo bundled
Vulkan format conversion shader

  • Path: assets/shaders/vulkan/convert.glsl
  • Size: 9.1 KB
  • SHA1: b18a236b62e1...
  • MD5: 7146002ee907...
  • Source: nethersx2 v2.1-4248 libemucore.so 0x65ca34, nethersx2 v2.1-4248 libemucore.so 0x65f008

present.glsl optional in repo bundled
Vulkan presentation shader

  • Path: assets/shaders/vulkan/present.glsl
  • Size: 8.0 KB
  • SHA1: 4871ee00b249...
  • MD5: 72626d625bb9...
  • Source: nethersx2 v2.1-4248 libemucore.so 0x65d7f0

merge.glsl optional in repo bundled
Vulkan frame merge shader

  • Path: assets/shaders/vulkan/merge.glsl
  • Size: 669 B
  • SHA1: b09de39d6459...
  • MD5: b776383d2160...
  • Source: nethersx2 v2.1-4248 libemucore.so 0x65e84c

interlace.glsl optional in repo bundled
Vulkan deinterlacing shader

  • Path: assets/shaders/vulkan/interlace.glsl
  • Size: 6.5 KB
  • SHA1: f8d14d80036f...
  • MD5: bf3caa253287...
  • Source: nethersx2 v2.1-4248 libemucore.so 0x65e01c

shadeboost.glsl optional in repo bundled
Vulkan brightness and contrast shader

  • Path: assets/shaders/vulkan/shadeboost.glsl
  • Size: 1.7 KB
  • SHA1: 26b29f57685d...
  • MD5: 366b45b6c4e9...
  • Source: nethersx2 v2.1-4248 libemucore.so 0x65f2d4

cas.glsl optional in repo bundled
Vulkan sharpening shader

  • Path: assets/shaders/vulkan/cas.glsl
  • Size: 2.6 KB
  • SHA1: 709fd5393188...
  • MD5: 56f3cf4de895...
  • Source: nethersx2 v2.1-4248 libemucore.so 0x65fa0c

unlock.wav optional in repo bundled
Achievement unlock sound

  • Path: assets/sounds/achievements/unlock.wav
  • Size: 85.7 KB
  • SHA1: eb488a762176...
  • MD5: 4d035ee86f83...
  • Source: nethersx2 v2.1-4248 libemucore.so 0x81cd38
  • Handed to playSoundAsync, which opens it from the package and plays it through MediaPlayer.

lbsubmit.wav optional in repo bundled
Leaderboard submission sound

  • Path: assets/sounds/achievements/lbsubmit.wav
  • Size: 80.2 KB
  • SHA1: 5ad1e110dcf0...
  • MD5: fa6a7030a9f2...
  • Source: nethersx2 v2.1-4248 libemucore.so 0x81d464

message.wav optional in repo bundled
Achievement notification sound

  • Path: assets/sounds/achievements/message.wav
  • Size: 15.3 KB
  • SHA1: c54f04b63ac6...
  • MD5: d66b0bccd743...
  • Source: nethersx2 v2.1-4248 libemucore.so 0x81bd44

placeholder.png optional in repo bundled
Fallback interface texture

  • Path: assets/placeholder.png
  • Size: 2.7 KB
  • SHA1: c36292ab7e16...
  • MD5: 8f846541ccbf...
  • Source: nethersx2 v2.1-4248 libemucore.so 0x7dcbf0, nethersx2 v2.1-4248 libemucore.so 0x7dd560, nethersx2 v2.1-4248 libemucore.so 0x8238dc
  • Requested from the texture cache when a notification or a loading screen has no image of its own. The 4248 package names it without carrying one, and the project adds it.

<region>.png optional in repo bundled
Game list region flag

  • Path: assets/icons/flags/NTSC-U.png
  • Source: nethersx2 v2.1-4248 classes.dex icons/flags/%s.png
  • Loaded as icons/flags/.png with the region string of the entry. Thirty are carried, seven NTSC and twenty-two PAL plus Other, the Polish flag being one the project adds.

star-<rating>.png optional in repo bundled
Game list compatibility rating icon

  • Path: assets/icons/star-0.png
  • Source: nethersx2 v2.1-4248 classes.dex icons/star-%d.png
  • Loaded as icons/star-.png for ratings 0 to 5.

faq.html optional in repo bundled
Help page

  • Path: assets/faq.html
  • Size: 13.7 KB
  • SHA1: 9163d4a3d19b...
  • MD5: c2a64e0bcc40...
  • Source: nethersx2 v2.1-4248 classes.dex android_asset faq.html
  • Opened under the android_asset scheme in the built-in browser view.

3rdparty.html optional in repo bundled
Third party notices page

  • Path: assets/3rdparty.html
  • Size: 88.2 KB
  • SHA1: 7743bf1d7e6e...
  • MD5: fb4ff036f3e4...
  • Source: nethersx2 v2.1-4248 classes.dex android_asset 3rdparty.html
  • Opened under the android_asset scheme in the built-in browser view.

Generated on 2026-08-23T16:12:06Z