Big Brain Academy: Brain vs. Brain plays on the Mac: profile 0100620012D6E000 (update 1.2.0, SDK 11.4.3)
- NintendoWare Bezel Engine 1.56: nearly all of RomFS is in Bezel Engine archives (.bea, magic SCNE, every entry a zstd frame). shader_split.py reads them (bea_members): 2,125 shaders, most of them the engine's own in System.nx.bea. The 12 geometry shaders of Bezel's line renderer do not build (the main menu chart's outlines are missing); ten pixel shaders that choose their texture handle between two of the game's uniform buffers at run time do not load. The survey names Bezel Engine archives (profile_guess.py, the NSP script's notes) - nninitStartup picks virtual address memory (a 60 GB StandardAllocator region) or a heap by IsVirtualAddressMemoryEnabled, which the host answered yes for every game. The new profile key sys_resource reports the NPDM's system resource (0 here); the survey writes it for new games, profiles without it keep the 32 MB answer - SDK 11 calls that reach a service: GetHardwareOpusDecoderWorkBufferSize(int, int), the IR camera (every camera unconnected), LoadCachedNintendoAccountInfo, Enable / DisableIndividualFileDataCache, ldn::GetNetworkConfig and the socket overloads with plain sockaddr - Movie decoder: the activity previews loop with Flush and Start from four threads. An input index the game held across a flush went back to the free list and was handed out twice; the fifth pending packet overwrote the decoder's mutex and the process died in 2 runs of 5. A send now claims such an index, held indices are withheld for 250 ms after a flush, pend[] cannot overflow, a flush keeps each slot's last picture and an output with no picture leaves the client texture as it was (the black flash at every loop). DM_MOVIE_TRACE=1 logs every decoder call - The crash handler takes SIGABRT; a command buffer with no GPU start time no longer counts the whole clock as GPU time - Handheld with Boost (op_mode, perf_mode): handheld, the game reads the touch screen; Boost gives 1920x1080 - 60 fps, sound, previews and saves; the title, enrollment, the menus and activities of every category. About 1.5 GB resident at the first activity, 1.86 GB after 15 minutes of activities (the game's pools as each activity loads). Prewarm list recorded through enrollment and a full activity. Not yet tested on an iPhone
This commit is contained in:
1 parent
6400306b25
commit
64cdee954c
28 files changed
+10144
-19
No files matched your search
@@ -0,0 +1 @@
|
||||
# generated
|
||||
|
@@ -0,0 +1,3 @@
|
||||
# chain b-cb0b0057e8d7 2026-10-22T00:45:45+08:00
|
||||
3a24a7c1351c6492
|
||||
5c116cabc36aeae3
|
||||
|
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,2 @@
|
||||
// Generated file (dm/gfx/tools/dmsh_chain.py --header, game 0100620012D6E000): the B shader library translation chain version this source tree expects (default options); the host loads only <library dir>/b-<V>/
|
||||
#define DMSH_CHAIN "cb0b0057e8d7"
|
||||
@@ -0,0 +1,46 @@
|
||||
# Game profile of Big Brain Academy: Brain vs. Brain (Switch, update 1.2.0). Plays on the Mac; not yet tested on an iPhone
|
||||
# Format: see dm/games/README.md
|
||||
# NintendoWare Bezel Engine 1.56, SDK 11.4.3: nearly all of RomFS is in Bezel Engine archives (.bea, zstd entries); the shaders are BNSH in their .bfsha entries (the engine's own in System.nx.bea),
|
||||
# in the layouts' archive shaders and in main (shader_split.py bea_members)
|
||||
|
||||
# ---- Identity ----
|
||||
title_id 0100620012D6E000
|
||||
program_id 0100620012D6E000
|
||||
|
||||
# ---- App ----
|
||||
# Game name: only a label for profile listings and the Mac window title; the iOS app name is the game name in the base NSP, and the bundle ID comes from the base game title ID (build_ipa.sh / NSP script)
|
||||
name Big Brain Academy: Brain vs. Brain
|
||||
ipa BigBrainAcademyBrainVsBrain.ipa
|
||||
app_category public.app-category.puzzle-games
|
||||
|
||||
# ---- Versions ----
|
||||
build v131072 1.2.0 main=bfed48f22df30be71b4eeae5b0373a9f subsdk0=4dd097b435891c5e0e15a65dbe47124f subsdk1=507f19d1240d09d00992248e8a0fd77e sdk=2d369d9999e3e10e665106f840ffff9b
|
||||
package v131072
|
||||
shader_versions v131072
|
||||
|
||||
# ---- Files ----
|
||||
# load order as on Horizon: main, subsdk*, sdk (subsdk0 = GLSLC, subsdk1 = NintendoSDK_movie)
|
||||
modules main subsdk0 subsdk1 sdk
|
||||
romfs_marker Archive/Permanent~01Boot.nx.bea
|
||||
zip_store .bea:.bfstm:.mp4:.metallib
|
||||
|
||||
# ---- Memory ----
|
||||
# The NPDM declares no system resource, so IsVirtualAddressMemoryEnabled must be false: nninitStartup (main+0x5b6984) then sets a heap of pool − used memory (2 MB aligned) and hands it
|
||||
# to StandardAllocator; with virtual address memory it asks for a 60 GB address region instead. The 4 GB layout with a 3328 MB heap region: SetHeapSize asks for 3.14 GB.
|
||||
# Within it the game creates 1.5 GB of NVN memory pools in its first 25 s (about 1.3 GB resident at the title on the Mac)
|
||||
sys_resource 0
|
||||
mem_reserve 0x100000000
|
||||
mem_alias 0x10000000
|
||||
mem_stack 0x10000000
|
||||
app_pool 0xCD500000
|
||||
|
||||
# ---- Shader split (shader_split.py; BNSH in the Bezel Engine archives, bea_members) ----
|
||||
# the engine's own resources (System.nx.bea) go to system, the game's archives to archive
|
||||
shader_groups /System.nx.bea/=system /Archive/=archive
|
||||
shader_note Big Brain Academy: Brain vs. Brain shaders
|
||||
|
||||
# ---- Mode ----
|
||||
# Handheld, the game reads the touch screen (menus, every activity, Party's two-player touch battles); docked it does not. Handheld Normal draws 1280x720,
|
||||
# handheld with Boost 1920x1080 (the window crop goes from 1280x720 to 1920x1080 once the game sees Boost)
|
||||
op_mode handheld
|
||||
perf_mode boost
|
||||
|
@@ -0,0 +1,165 @@
|
||||
# Prewarm seed list (shipped in the app, next to shader_map.tsv). Rows: S<TAB>shader key<TAB>stage / R<TAB>render pipeline key (pso_skey hex) / C<TAB>compute shader key.
|
||||
# Recorded on the Mac with prewarm off, handheld with Boost: boot, the title, Solo, enrolling a new student, the main menu, Practice, Whack Match played through, its results, coins and an unlock, and the way back into a second round
|
||||
S ca9c3279ab4aa99d_b 5
|
||||
C ca9c3279ab4aa99d_b
|
||||
S 2036c57917484e00_b 0
|
||||
S c0ceab38747b3d4e_b 1
|
||||
S c5bae943989fe9bd_b 0
|
||||
R 323033366335373931373438346530305f62000000000000633063656162333837343762336434655f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000080000000000000000000000000000000000000000000000000f3e00000d4000000000000000000000000000000000000000000000000000000000000044000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 633562616539343339383966653962645f62000000000000633063656162333837343762336434655f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000008000000000000000000000000000000000000000000000000274800002a3c0000000000000000000000000000000000000000000000000000000000004c000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 9cec811b54abf8a3_b 0
|
||||
R 396365633831316235346162663861335f62000000000000633063656162333837343762336434655f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002200000800000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000000000044000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S d0ab579bfc657d8f_b 0
|
||||
R 643061623537396266633635376438665f62000000000000633063656162333837343762336434655f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002200000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 5bc209a85377dc06_b 0
|
||||
S beda96f1f6f48186_b 1
|
||||
S 94afca43888d3fd9_b 0
|
||||
R 356263323039613835333737646330365f62000000000000626564613936663166366634383138365f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000008123c0000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000000000044000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 393461666361343338383864336664395f62000000000000626564613936663166366634383138365f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000008114400000000000000000000000000000000000000000000274800002a3c0000000000000000000000000000000000000000000000000000000000004c000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 4f3584c94e91bb2a_b 0
|
||||
S 6c0e59ef919af2ef_b 0
|
||||
R 346633353834633934653931626232615f62000000000000626564613936663166366634383138365f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff0000000010040481040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000080d3c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 366330653539656639313961663265665f62000000000000626564613936663166366634383138365f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff0000000010040481040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000080d3c000000000000000000000000000000000000000000000f3e00000d4000000000000000000000000000000000000000000000000000000000000044000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S c2c9c26ee38e01ac_b 0
|
||||
S 722db94baa97fb0e_b 1
|
||||
S 2e9d6bfd3e5d8990_b 1
|
||||
R 633263396332366565333865303161635f62000000000000373232646239346261613937666230655f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 633263396332366565333865303161635f62000000000000326539643662666433653564383939305f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S dff008f4f4da3478_b 0
|
||||
S 6331af2337fee7d9_b 1
|
||||
S 5c116cabc36aeae3_b 0
|
||||
S 0f1f2c66d3f64aa1_b 1
|
||||
S 6862a25cc3c154e5_b 0
|
||||
S 9b69523e14b860f0_b 1
|
||||
S 8c49f8bab8724d6f_b 1
|
||||
S 0961bd98781cbff2_b 0
|
||||
S 78aeff602421d576_b 1
|
||||
S 2d2cc1fbe95af74f_b 0
|
||||
S 83757b6d5ac89218_b 1
|
||||
R 646666303038663466346461333437385f62000000000000363333316166323333376665653764395f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 646666303038663466346461333437385f62000000000000363333316166323333376665653764395f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028180a8604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 356331313663616263333661656165335f62000000000000306631663263363664336636346161315f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028180a86040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 363836326132356363336331353465355f62000000000000396236393532336531346238363066305f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 363836326132356363336331353465355f62000000000000386334396638626162383732346436665f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 303936316264393837383163626666325f62000000000000373861656666363032343231643537365f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028180a8604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 326432636331666265393561663734665f62000000000000383337353762366435616338393231385f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028180a8604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 3476d171ac6d73bb_b 0
|
||||
S ea69cf17d43bd11a_b 1
|
||||
R 333437366431373161633664373362625f62000000000000656136396366313764343362643131615f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000470000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 646666303038663466346461333437385f62000000000000363333316166323333376665653764395f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 363836326132356363336331353465355f62000000000000386334396638626162383732346436665f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028180a8604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S f85760318d039e1a_b 0
|
||||
S 9e4aba4d6c75c3a8_b 1
|
||||
R 663835373630333138643033396531615f62000000000000396534616261346436633735633361385f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028180a8604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 4a02f064b2dc9acd_b 0
|
||||
S 6d791aef5d138828_b 1
|
||||
R 346130326630363462326463396163645f62000000000000366437393161656635643133383832385f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000000000000000000000100000001000000ffffffff000000002818048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 7df1e6ada2a27a22_b 0
|
||||
S fb914ecaa9c7b52b_b 1
|
||||
S 686a8f3517cd6652_b 0
|
||||
S 3562072cc143b237_b 1
|
||||
R 376466316536616461326132376132325f62000000000000666239313465636161396337623532625f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 363836613866333531376364363635325f62000000000000333536323037326363313433623233375f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028180a8604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 3f2c6259c0ff0f72_b 0
|
||||
S 10f6af0dab2f31fd_b 1
|
||||
S 8f84cc4d4180b121_b 1
|
||||
S 1ca74ba09c16136e_b 0
|
||||
R 336632633632353963306666306637325f62000000000000313066366166306461623266333166645f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000000d1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 336632633632353963306666306637325f62000000000000313066366166306461623266333166645f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000290000000d0c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 336632633632353963306666306637325f62000000000000386638346363346434313830623132315f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000290000000d0c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 366330653539656639313961663265665f62000000000000386638346363346434313830623132315f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000290000000d10000000000000000000000000000000000000000000000f120000120c000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 366330653539656639313961663265665f62000000000000313066366166306461623266333166645f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000290000000d10000000000000000000000000000000000000000000000f120000120c000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 316361373462613039633136313336655f62000000000000386638346363346434313830623132315f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000000d1000000000000000000000000000000000000000000000031200000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 316361373462613039633136313336655f62000000000000313066366166306461623266333166645f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000000d1000000000000000000000000000000000000000000000031200000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S b52241b72acb7c24_b 1
|
||||
S 91f3fda4bb2c09bf_b 1
|
||||
R 363836613866333531376364363635325f62000000000000623532323431623732616362376332345f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028180a8604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 356331313663616263333661656165335f62000000000000393166336664613462623263303962665f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028180a86040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 9d43bdc2204de3aa_b 1
|
||||
S eb9524ea40e79bb3_b 1
|
||||
S 090670f92da91812_b 1
|
||||
R 326432636331666265393561663734665f62000000000000383337353762366435616338393231385f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 363836326132356363336331353465355f62000000000000396434336264633232303464653361615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 363836326132356363336331353465355f62000000000000656239353234656134306537396262335f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 356331313663616263333661656165335f62000000000000303930363730663932646139313831325f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028180a86040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 84e5cbd33db320a7_b 0
|
||||
S cb9dbb9311d28e21_b 1
|
||||
R 383465356362643333646233323061375f62000000000000636239646262393331316432386532315f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028180a8604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 6296db582594ef59_b 1
|
||||
R 333437366431373161633664373362625f62000000000000363239366462353832353934656635395f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000470000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 8796a5c836ce5913_b 0
|
||||
S 30058e3d3497336f_b 1
|
||||
R 383739366135633833366365353931335f62000000000000333030353865336433343937333336665f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff00000000281804860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000002e1000002e20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 384def8883281233_b 0
|
||||
S 4d5b645feadcef2f_b 1
|
||||
R 333834646566383838333238313233335f62000000000000346435623634356665616463656632665f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000002e0c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 1cc255771de573b9_b 1
|
||||
R 363836613866333531376364363635325f62000000000000316363323535373731646535373362395f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028080a8204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 363836613866333531376364363635325f62000000000000316363323535373731646535373362395f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028180a8604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 18cad8c65127cc01_b 1
|
||||
S fe2af981359b86a4_b 1
|
||||
R 356331313663616263333661656165335f62000000000000306631663263363664336636346161315f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000ffffffff0000000010040481040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 363836326132356363336331353465355f62000000000000313863616438633635313237636330315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 376466316536616461326132376132325f62000000000000666532616639383133353962383661345f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 55ab7f2edf9f0956_b 0
|
||||
S c0c0ab011276aa65_b 1
|
||||
R 353561623766326564663966303935365f62000000000000633063306162303131323736616136355f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000161000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000180000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S d0ae177ce11d8620_b 1
|
||||
R 383465356362643333646233323061375f62000000000000643061653137376365313164383632305f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028080a8204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 383465356362643333646233323061375f62000000000000643061653137376365313164383632305f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028180a8604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 376466316536616461326132376132325f62000000000000666532616639383133353962383661345f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028180a8604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S eccceb1dccf6988a_b 1
|
||||
R 633263396332366565333865303161635f62000000000000656363636562316463636636393838615f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 398e4bc784c30d36_b 0
|
||||
S 83f5a7e9d9bb13bf_b 1
|
||||
S e0187a1354549f8f_b 0
|
||||
S f68ca1d4bc5d7aa3_b 1
|
||||
S 52e7e4f7a362aba3_b 1
|
||||
R 633263396332366565333865303161635f62000000000000326539643662666433653564383939305f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 333938653462633738346333306433365f62000000000000383366356137653964396262313362665f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 653031383761313335343534396638665f62000000000000663638636131643462633564376161335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 633263396332366565333865303161635f62000000000000353265376534663761333632616261335f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 643061623537396266633635376438665f62000000000000633063656162333837343762336434655f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 2ce3d6898127ef78_b 0
|
||||
S 03a582f1b869374a_b 1
|
||||
R 326365336436383938313237656637385f62000000000000303361353832663162383639333734615f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S ba10aaf569d6f20e_b 0
|
||||
S fb0aa7e05c29b670_b 1
|
||||
R 626131306161663536396436663230655f62000000000000666230616137653035633239623637305f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028080482040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000000d1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 383465356362643333646233323061375f62000000000000636239646262393331316432386532315f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028080a820d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 00894295e20155e7_b 0
|
||||
S 418bd7c35ef052a8_b 1
|
||||
R 303038393432393565323031353565375f62000000000000343138626437633335656630353261385f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028180a8604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 6d46a814f0199ae6_b 0
|
||||
S dfa6fc2706e213d6_b 1
|
||||
R 366434366138313466303139396165365f62000000000000646661366663323730366532313364365f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028180a8604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 326432636331666265393561663734665f62000000000000383337353762366435616338393231385f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028080a8204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 646666303038663466346461333437385f62000000000000363333316166323333376665653764395f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028080a8204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 4048a066eda9f3c7_b 1
|
||||
S 3a13becd7c5515c0_b 0
|
||||
S ad25dfb96c901052_b 1
|
||||
R 383465356362643333646233323061375f62000000000000343034386130363665646139663363375f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028080a8204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 336131336265636437633535313563305f62000000000000616432356466623936633930313035325f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028080a8204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S e7851f3590a9d6c8_b 0
|
||||
S 2be0d70d30c46ca6_b 1
|
||||
R 653738353166333539306139643663385f62000000000000326265306437306433306334366361365f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028080a8204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 363836613866333531376364363635325f62000000000000623532323431623732616362376332345f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028080a8204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 48a0300b9fa57ff0_b 5
|
||||
C 48a0300b9fa57ff0_b
|
||||
S 2e28bbaa15e304bf_b 0
|
||||
S d42278aa330f02d0_b 1
|
||||
S 72efe72c57f954a1_b 0
|
||||
R 326532386262616131356533303462665f62000000000000643432323738616133333066303264305f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028080a820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000002e0000082e0000102e0000182e0000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000100000010000000010000001000000001000000100000000100000010000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 373265666537326335376639353461315f62000000000000643432323738616133333066303264305f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028080a820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000002e0000082e0000102e000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000100000010000000010000001000000001000000100000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 37ade3ba7c46277d_b 1
|
||||
R 633263396332366565333865303161635f62000000000000333761646533626137633436323737645f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 633263396332366565333865303161635f62000000000000373232646239346261613937666230655f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000470000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 633263396332366565333865303161635f62000000000000326539643662666433653564383939305f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000470000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000160800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 646666303038663466346461333437385f62000000000000363333316166323333376665653764395f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff000000001014048504000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S b27de89afd688b5e_b 5
|
||||
C b27de89afd688b5e_b
|
||||
S 7a8d6b509d9d43fd_b 0
|
||||
S 3f85fe8c3b9adb22_b 0
|
||||
R 376138643662353039643964343366645f62000000000000643432323738616133333066303264305f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028080a820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000002e0000082e0000102e0000182e0000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000100000010000000010000001000000001000000100000000100000010000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 336638356665386333623961646232325f62000000000000643432323738616133333066303264305f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028080a820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000002e0000082e0000102e000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000100000010000000010000001000000001000000100000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 383465356362643333646233323061375f62000000000000343034386130363665646139663363375f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff0000000028180a8604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
|
@@ -0,0 +1,6 @@
|
||||
# Answer table for translation queries (generated by dm/gfx/tools/shader_split.py, do not edit): key <TAB> fact JSON. This game has no PC version to pair with: only the thread group / shared memory of compute shaders (taken from the control section); other queries get the translator defaults
|
||||
06d39c2bcd39499b {"local":[32,1,1],"shared":0}
|
||||
48a0300b9fa57ff0 {"local":[32,1,1],"shared":0}
|
||||
8a556df991e38628 {"local":[32,1,1],"shared":176}
|
||||
b27de89afd688b5e {"local":[32,1,1],"shared":0}
|
||||
ca9c3279ab4aa99d {"local":[64,1,1],"shared":0}
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 19.
|
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,2 @@
|
||||
# kind: evidence control-section key conflict rulings: empty
|
||||
dm_ctl_sha16 chosen_pc class candidates records
|
||||
|
File diff suppressed because it is too large.
Load diff
@@ -40,6 +40,7 @@ None of them has a default game: without one they stop and list the profiles. To
|
||||
| `zip_store` | Extensions the IPA stores without compressing |
|
||||
| `mem_reserve`, `mem_alias`, `mem_stack`, `app_pool` | Guest address-space partition and application pool (`hle_svc.c`) |
|
||||
| `mem_used` | Memory `GetInfo(UsedMemorySize)` reports beside the heap (default `0x4000000`, 64 MB). `SetHeapSize` checks a request against the real size of the loaded modules, so a game that sizes its heap as total − used and has more than 64 MB of modules needs at least their size here. Hyrule Warriors: Age of Calamity: 66.6 MB of modules, so the default made `SetHeapSize(pool − 64 MB)` fail and `nnMain` return at once; it sets 72 MB. Cuphead: 80 MB of modules, 84 MB |
|
||||
| `sys_resource` | The system resource size the NPDM declares (main.npdm META +0x14), which `GetInfo(TotalSystemResourceSize)` reports (`hle_svc.c`). The SDK's `IsVirtualAddressMemoryEnabled` is "that size is not 0", and some games choose their memory setup by it: Big Brain Academy: Brain vs. Brain's `nninitStartup` asks StandardAllocator for a 60 GB address region with virtual address memory and sets a heap without it, and its NPDM declares none (`0`). The survey writes it from the NPDM for every new game; a profile without it gets the host's earlier answer, 32 MB, for every game |
|
||||
| `game_args` | Arguments the game gets when the command line gives none (the iOS app, the NSP script's Mac runs), split at spaces; `dmhost <dir> -- …` overrides them. The SDK hands them to the game before `nninitStartup`, as on hardware (`main.c`). Octopath Traveler 0 caps the address region Unreal's `nninitStartup` reserves (62 GB by default) with `-SwitchVirtualAddressSpaceSize=2048` (MB) |
|
||||
| `game_env` | `KEY=VALUE` pairs, separated by spaces, that the game's `getenv` returns (`hle_os.c`; any other name goes to the SDK's own `getenv`, whose environment is empty as on Horizon). For runtimes that take their settings from the environment. Absolum (.NET NativeAOT) sets `DOTNET_GCRegionRange=60000000`: the GC reserves 5 × its heap hard limit as its region range otherwise, 3.75 GB, which only the Switch's 64 GB alias region holds. `DM_GAME_ENV` overrides it, also from `Documents/env.txt` |
|
||||
| `mem_map_limit` | `on` / `off` (the default): `MapPhysicalMemory` fails with ResultLimitReached when it would take the process past the application pool (the pool less the used memory `GetInfo` reports), as on Horizon (`hle_svc.c`). Pokémon Legends: Z-A allocates and frees everything it can at startup and the SDK keeps the freed pages mapped until a map fails, then unmaps them and retries; without the limit they stay mapped and the game maps past the pool. Off by default: Ace Attorney Investigations Collection maps a little more than the 1 GB pool its profile reports |
|
||||
|
||||
@@ -141,6 +141,7 @@ def header(g):
|
||||
f'#define DM_GAME_MEM_STACK {g.int("mem_stack"):#x}ull',
|
||||
f'#define DM_GAME_APP_POOL {g.int("app_pool"):#x}ull',
|
||||
f'#define DM_GAME_MEM_USED {int(g.get("mem_used", "0x4000000"), 0):#x}ull', # used memory reported beside the heap (hle_svc.c GetInfo UsedMemorySize)
|
||||
f'#define DM_GAME_SYS_RESOURCE {int(g.get("sys_resource", "0x2000000"), 0):#x}ull', # the NPDM's system resource size (hle_svc.c GetInfo TotalSystemResourceSize; 0 = no virtual address memory)
|
||||
f'#define DM_GAME_ARGS {q(g.get("game_args", ""))}', # game arguments when the command line gives none (main.c; Octopath Traveler 0: Unreal's -SwitchVirtualAddressSpaceSize=)
|
||||
f'#define DM_GAME_ENV {q(g.get("game_env", ""))}', # KEY=VALUE pairs getenv answers (hle_os.c; Absolum: .NET's DOTNET_GCRegionRange)
|
||||
f'#define DM_GAME_MEM_MAP_LIMIT {int(mml == "on")}',
|
||||
|
||||
@@ -17,8 +17,8 @@ sys.path.insert(0, str(HERE.parent / 'tools')); import nso_syms # dynamic symb
|
||||
MAGICS = [(b'UnityFS\0', 'UnityFS'), (b'UnityWeb', 'UnityWeb'), (b'UnityRaw', 'UnityRaw'), (b'BNSH', 'BNSH'), (b'BAHS', 'BAHS'), (b'SARC', 'SARC'), (b'Yaz0', 'Yaz0'),
|
||||
(bytes.fromhex('28b52ffd'), 'zstd'), (b'FRES', 'bfres'), (b'BNTX', 'BNTX'), (b'BWAV', 'BWAV'), (b'FSAR', 'BFSAR'), (b'CPK ', 'CRI CPK'), (b'CRID', 'CRI USM'),
|
||||
(b'@UTF', 'CRI UTF'), (b'AKPK', 'Wwise pck'), (b'BKHD', 'Wwise bnk'), (b'FSB5', 'FMOD'), (b'\x89PNG', 'PNG'), (b'RIFF', 'RIFF'), (b'OggS', 'Ogg'), (b'PK\x03\x04', 'zip'), (b'NSO0', 'NSO'),
|
||||
(bytes.fromhex('03022307'), 'SPIR-V'), (b'ONEPACK\0', 'Trinity pack'), (b'ARC\0', 'MT Framework ARC')]
|
||||
PACKED = {'UnityFS', 'UnityWeb', 'Yaz0', 'zstd', 'BWAV', 'CRI CPK', 'CRI USM', 'Wwise pck', 'FMOD', 'PNG', 'Ogg', 'zip', 'Trinity pack', 'MT Framework ARC'} # file headers of compressed / media formats (zip_store)
|
||||
(bytes.fromhex('03022307'), 'SPIR-V'), (b'ONEPACK\0', 'Trinity pack'), (b'ARC\0', 'MT Framework ARC'), (b'SCNE', 'Bezel Engine archive')]
|
||||
PACKED = {'UnityFS', 'UnityWeb', 'Yaz0', 'zstd', 'BWAV', 'CRI CPK', 'CRI USM', 'Wwise pck', 'FMOD', 'PNG', 'Ogg', 'zip', 'Trinity pack', 'MT Framework ARC', 'Bezel Engine archive'} # file headers of compressed / media formats (zip_store)
|
||||
# IL2CPP by the metadata file every IL2CPP player opens: Unity 2022's main (Ace Attorney Investigations Collection) has no il2cpp_ API names, Engage's 2020.3 has both
|
||||
MARKERS = [(b'nvnBootstrapLoader', 'NVN'), (b'vkCreateInstance', 'Vulkan'), (b'eglGetProcAddress', 'EGL / OpenGL'), (b'global-metadata.dat', 'Unity IL2CPP'), (b'UnityEngine', 'Unity'),
|
||||
(b'sead::', 'Nintendo sead'), (b'agl::', 'Nintendo agl'), (b'gsys::', 'Nintendo gsys'), (b'Unreal', 'Unreal'), (b'UE4', 'Unreal 4'), (b'Havok', 'Havok'), (b'CRIWARE', 'CRIWARE'), (b'Wwise', 'Wwise')]
|
||||
@@ -146,6 +146,8 @@ def guess(F, hooks=None):
|
||||
('main sets a heap of at most the pool − 64 MB' + (f' − {giant // MiB} MB of bss (counted as used memory)' if giant else '') + f': a {heap // MiB} MB heap region')
|
||||
if heap_api else 'main never sets a heap (its memory is its own bss): a 256 MB heap region')
|
||||
G['mem_reserve'] = (f'{mem[0]:#x}', mem[3]); G['mem_alias'] = (f'{mem[1]:#x}', ''); G['mem_stack'] = ('0x10000000', ''); G['app_pool'] = (f'{mem[2]:#X}'.replace('0X', '0x'), '')
|
||||
G['sys_resource'] = (f'{F["sysres"]:#x}', f'the NPDM declares {F["sysres"] // MiB} MB of system resource' + ('' if F['sysres'] else
|
||||
': IsVirtualAddressMemoryEnabled is false, as on Horizon (Big Brain Academy: Brain vs. Brain sets a heap only then)'))
|
||||
|
||||
if F.get('main_markers', set()) & {'Unreal', 'Unreal 4'} and R['exts'].get('.pak') and 'nvnBootstrapLoader' in imp:
|
||||
G['shader_groups'] = ('ShaderArchive-Global-=global ShaderArchive-=game', 'the decoded shader code archives: the engine\'s global shaders and the game\'s material shaders')
|
||||
|
||||
@@ -1058,7 +1058,7 @@ static void gpu_tag_done(uint64_t f, double g0, double g1) {
|
||||
unsigned k = f % GRING;
|
||||
if (atomic_load(&g_gpu[k].frame) != f) return;
|
||||
double d = g1 - g0;
|
||||
if (d > 0) {
|
||||
if (d > 0 && g0 > 0) { // a command buffer can complete with no start time (0, while a movie's frames upload each frame in Big Brain Academy: Brain vs. Brain), and its span would be the whole clock
|
||||
atomic_fetch_add(&g_gpu[k].ns, (uint64_t)(d * 1e9));
|
||||
uint64_t s0 = (uint64_t)(g0 * 1e9), s1 = (uint64_t)(g1 * 1e9), v;
|
||||
for (v = atomic_load(&g_gpu[k].t0); s0 < v && !atomic_compare_exchange_weak(&g_gpu[k].t0, &v, s0);) {}
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
# · SDF (Capcom's RE Engine, Monster Hunter Rise): shader definitions inside the PAK archives (KPKA, entries zstd / deflate compressed), only the newest copy of each path, see kpka_jobs and sdf_shaders
|
||||
# · Trinity packs (Game Freak, Pokémon Legends: Z-A): BNSH inside the files of arc/data.trpfs (Oodle Mermaid, decoded by the game's own decoder in the Mac host), see trpfs_jobs and trinity_shaders
|
||||
# · SPK (Capcom's MT Framework, The Great Ace Attorney Chronicles): the shader package inside an ARC archive (zlib entries), code area + control section per shader, see mtarc_members and mtspk_shaders
|
||||
# · BEA (NintendoWare Bezel Engine archives, Big Brain Academy: Brain vs. Brain): BNSH in the .bfsha entries of the archives (zstd entries), see bea_members
|
||||
# Code area: 0x30 header + (graphics) 0x50 SPH + instructions; header magic 0x12345678 for graphics, 0x12345679 for compute. The control section starts with 0x98761234, +0x704 = code area length,
|
||||
# +0x700 = start of the c1 constant segment within the code area; for compute +0x748 thread group xyz (u32 ×3), +0x754 shared memory bytes (checked one by one against PC reflection on D2R's 22 compute shaders).
|
||||
# Stage: BNSH uses the stage slot; BAHS uses bits 10..13 of SPH word 0 (1 vertex 2 hull 3 domain 4 geometry 5 pixel), and a compute header means compute.
|
||||
@@ -342,6 +343,25 @@ def mtarc_shaders(d, label, out):
|
||||
for path, m in mtarc_members(d, label):
|
||||
if m[:4] == MTSPK: out.extend(mtspk_shaders(m, f'{label}#{path}'))
|
||||
|
||||
SCNE, ZSTD_MAGIC = b'SCNE', bytes.fromhex('28b52ffd')
|
||||
def bea_members(d, label):
|
||||
"""NintendoWare Bezel Engine archive ('.bea', magic 'SCNE', a NintendoWare binary file of version 0x10100; Big Brain Academy: Brain vs. Brain keeps nearly all of RomFS in 603 of them):
|
||||
+0x20 u64 entry count, +0x28 u64 offset of the entry pointer array (u64 each), each pointing at a 0x30-byte 'ASST' entry {+0x10 u16 kind, u16 alignment shift, u32 stored length,
|
||||
u32 length, +0x20 u64 data offset, +0x28 u64 name offset (u16 length + the path)}. Every entry of the game's 7,665 is one zstd frame (kind 2, and 258 for the one sound project),
|
||||
even the two whose stored length equals their length, so the frame magic decides. → (path, data) of each entry"""
|
||||
n, arr = struct.unpack_from('<QQ', d, 0x20)
|
||||
zstd = None
|
||||
for i in range(n):
|
||||
o = struct.unpack_from('<Q', d, arr + 8 * i)[0]
|
||||
if d[o:o + 4] != b'ASST': red(f'{label}: entry {i} @{o:#x} is not an ASST entry')
|
||||
csz, usz, off, nm = struct.unpack_from('<II4xQQ', d, o + 0x14)
|
||||
path = d[nm + 2:nm + 2 + struct.unpack_from('<H', d, nm)[0]].decode('utf-8', 'replace')
|
||||
data = d[off:off + csz]
|
||||
if data[:4] == ZSTD_MAGIC:
|
||||
zstd = zstd or zstd_mod(); data = zstd.decompress(data)
|
||||
if len(data) != usz: red(f'{label}/{path}: {len(data):#x} bytes, the entry says {usz:#x}')
|
||||
yield path, data
|
||||
|
||||
ONEPACK = b'ONEPACK\0'
|
||||
def fb_field(d, t, i):
|
||||
"""FlatBuffers: absolute offset of field i of the table at t, None when the field is absent"""
|
||||
@@ -634,6 +654,9 @@ def scan_file(args):
|
||||
if head[:4] == MTARC: # an MT Framework archive (mtarc_members): its shader package
|
||||
mtarc_shaders(open(path, 'rb').read(), '/' + rel, found)
|
||||
return rel, uniq_keys(found), var_pairs(found), trees
|
||||
if head[:4] == SCNE: # a Bezel Engine archive (bea_members): each entry scanned as a file of its own (the shaders are BNSH in its .bfsha entries)
|
||||
for nm, m in bea_members(open(path, 'rb').read(), '/' + rel): scan_blob(m, f'/{rel}/{nm}', found)
|
||||
return rel, uniq_keys(found), var_pairs(found), trees
|
||||
d = unzs(path) if path.endswith('.zs') else open(path, 'rb').read()
|
||||
if d[:4] == b'Yaz0': d = yaz0(d)
|
||||
if d[:8] == b'UnityFS\0' or (d[8:11] == b'\0\0\0' and __import__('unityfs').is_serialized(d)):
|
||||
|
||||
@@ -209,4 +209,7 @@ void crash_install(void) {
|
||||
pthread_detach(th);
|
||||
}
|
||||
sigaction(SIGSEGV, &sa, 0); sigaction(SIGBUS, &sa, 0); sigaction(SIGILL, &sa, 0); sigaction(SIGTRAP, &sa, 0);
|
||||
// abort() too (an assertion or an uncaught exception in the host or a framework): Big Brain Academy: Brain vs. Brain died once with SIGABRT 11 minutes into a run with nothing
|
||||
// in the log and no crash report, so where it came from was lost
|
||||
sigaction(SIGABRT, &sa, 0);
|
||||
}
|
||||
@@ -61,6 +61,9 @@ HLE_FORCE("_ZN2nn7account37LoadNetworkServiceAccountIdTokenCacheEPmPcmRKNS0_10Us
|
||||
(void)buf; (void)sz; (void)h; if (n) *n = 0; return RES_FAIL;
|
||||
}
|
||||
HLE_FORCE("_ZN2nn7account40ShowLicenseRequirementsForNetworkServiceERKNS0_10UserHandleE", "online membership notice applet, out of scope; cut", Result, h_acc_ShowLic, const UserHandle *h) { (void)h; return RES_FAIL; }
|
||||
// The Nintendo Account's cached profile (birthday, country): no Nintendo Account is linked on the host, so loading fails and the game skips its getters (Big Brain Academy: Brain vs. Brain, main+0xab8bc)
|
||||
HLE_FORCE("_ZN2nn7account29LoadCachedNintendoAccountInfoEPNS0_25CachedNintendoAccountInfoERKNS0_10UserHandleEPvm", "cached Nintendo Account info: none linked, fails", Result, h_acc_LoadNaInfo,
|
||||
void *info, const UserHandle *h, void *buf, uint64_t sz) { (void)info; (void)h; (void)buf; (void)sz; return RES_FAIL; }
|
||||
|
||||
// AsyncContext / NintendoAccountAuthorizationRequestContext: object contents are read and written only by the interfaces below; construction writes no memory, the completion event fires immediately, and the result is always failure
|
||||
HLE_FORCE("_ZN2nn7account12AsyncContextC1Ev", "async context constructor; the host creates no IPC object", void, h_acc_AcCtor, void *self) { (void)self; }
|
||||
|
||||
@@ -21,6 +21,11 @@ static void *opus_soft(const void *hw) { void *s = objmap_get(hw); if (!s) die("
|
||||
HLE_FORCE("_ZN2nn5codec36GetHardwareOpusDecoderWorkBufferSizeEiii", "hwopus service; work buffer computed for the software decoder", size_t, h_codec_HwOpusWorkSize, int rate, int ch, int option) {
|
||||
(void)option; size_t (*f)(int, int) = opus_fn("_ZN2nn5codec28GetOpusDecoderWorkBufferSizeEii"); return f(rate, ch);
|
||||
}
|
||||
// SDK 11's form without the option (Big Brain Academy: Brain vs. Brain sizes its decoders with it early in nnMain, main+0x31f8e8; the SDK's own opens hwopus and aborts resolving the service)
|
||||
HLE_FORCE("_ZN2nn5codec36GetHardwareOpusDecoderWorkBufferSizeEii", "hwopus service; work buffer computed for the software decoder (SDK 11 two-argument version)", size_t, h_codec_HwOpusWorkSize2,
|
||||
int rate, int ch) {
|
||||
size_t (*f)(int, int) = opus_fn("_ZN2nn5codec28GetOpusDecoderWorkBufferSizeEii"); return f(rate, ch);
|
||||
}
|
||||
HLE_FORCE("_ZN2nn5codec29InitializeHardwareOpusDecoderEPNS0_23HardwareOpusDecoderTypeEiiPvmi", "hwopus service; replaced by the software OpusDecoder", int, h_codec_HwOpusInit,
|
||||
void *hw, int rate, int ch, void *buf, size_t size, int option) {
|
||||
(void)option; int (*f)(void *, int, int, void *, size_t) = opus_fn("_ZN2nn5codec21InitializeOpusDecoderEPNS0_15OpusDecoderTypeEiiPvm");
|
||||
|
||||
@@ -627,6 +627,11 @@ HLE_FORCE("_ZN2nn2fs25CleanDirectoryRecursivelyEPKc", "fsp-srv → recursively d
|
||||
}
|
||||
// file data cache (a global read cache in the fs process): the host reads through the page cache and leaves the buffer unused
|
||||
HLE_FORCE("_ZN2nn2fs25EnableGlobalFileDataCacheEPvm", "fsp-srv global read cache; unused by the host", void, h_fs_EnableGlobalCache, void *buf, size_t sz) { (void)buf; (void)sz; }
|
||||
// the same cache for one file (SDK 11, Big Brain Academy: Brain vs. Brain; the game does not read the result)
|
||||
HLE_FORCE("_ZN2nn2fs29EnableIndividualFileDataCacheEPKcPvm", "fsp-srv read cache for one file; unused by the host", Result, h_fs_EnableFileCache, const char *path, void *buf, size_t sz) {
|
||||
(void)path; (void)buf; (void)sz; return RES_OK;
|
||||
}
|
||||
HLE_FORCE("_ZN2nn2fs30DisableIndividualFileDataCacheEPKc", "fsp-srv read cache for one file; unused by the host", void, h_fs_DisableFileCache, const char *path) { (void)path; }
|
||||
// SDK 11 (Metroid Dread): delete an empty directory
|
||||
HLE_FORCE("_ZN2nn2fs15DeleteDirectoryEPKc", "fsp-srv → rmdir(2) (the directory must be empty)", Result, h_fs_DeleteDir, const char *path) {
|
||||
HP(path); RW(); return rmdir(hp) ? err_res("rmdir", hp) : RES_OK;
|
||||
|
||||
+43
-15
@@ -46,6 +46,7 @@ HLE_FORCE("_ZN5movie9Extractor13SetDataSourceEPKc", "movie demuxer: the host doe
|
||||
#define MD_NOUT 8 // output slots
|
||||
#define MD_NO_INPUT 0x1011 // SDK: no free input
|
||||
#define MD_NO_OUTPUT 0x100e // SDK: no output ready
|
||||
#define MD_STALE_NS 250000000ull // how long an input the client held across a flush stays withheld (h_movie_AcqIn)
|
||||
#define MD_FMT_NV12 4
|
||||
#define MD_FMT_ABGR 3 // 4-byte RGBA (memory order R G B A), only with the native texture mode
|
||||
#define MD_MODE_TEX 2 // native texture mode: the decoder writes frames into the client's NVN texture
|
||||
@@ -63,6 +64,7 @@ typedef struct {
|
||||
void *ev[4]; // a copy of DecoderEvents: {input, output, format, error} EventType*. The client's struct need not stay alive (by Metroid Dread's second movie it had been overwritten and Start crashed signalling), so it is copied at registration
|
||||
int w, h, fmt_sent, started;
|
||||
uint8_t *in[MD_NIN]; int infree[MD_NIN], ninfree; // queue of free input indices
|
||||
int inown[MD_NIN]; uint64_t instale[MD_NIN]; // inown: acquired by the client and not sent yet; instale: when a Flush / Stop found it held (the client may still send it), 0 if not
|
||||
struct { int used, pic; int64_t pts; uint32_t flags; uint8_t *frm; size_t cap, bytes; } out[MD_NOUT]; // pic: frm holds a decoded picture (audio: bytes of PCM); cap: bytes in frm
|
||||
int outq[MD_NOUT], noutq; // queue of ready output indices
|
||||
struct { int in, off, size; int64_t pts; uint32_t flags; } pend[MD_NIN]; int npend; // input packets waiting to be decoded (in arrival order)
|
||||
@@ -117,13 +119,15 @@ void *dm_guest_thread_spawn(void (*fn)(void *), void *arg, int prio, size_t stac
|
||||
static pthread_mutex_t g_dfmu = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t g_dfcv = PTHREAD_COND_INITIALIZER;
|
||||
static struct { void *d; int ev; uint64_t due; } g_dfq[64]; static int g_ndfq, g_dfthr;
|
||||
static void md_defer_body(void *arg);
|
||||
static void md_defer(void *d, int ev) {
|
||||
static void md_defer_at(void *d, int ev, uint64_t due) {
|
||||
pthread_mutex_lock(&g_dfmu);
|
||||
if (!g_dfthr) { g_dfthr = 1; dm_guest_thread_spawn(md_defer_body, NULL, 16, 64 << 10); }
|
||||
if (g_ndfq < 64) g_dfq[g_ndfq++] = (__typeof__(g_dfq[0])){d, ev, now_ns() + 2000000};
|
||||
for (int i = 0; i < g_ndfq; i++) if (g_dfq[i].d == d && g_dfq[i].ev == ev && g_dfq[i].due <= due) { pthread_mutex_unlock(&g_dfmu); return; } // already due by then
|
||||
if (g_ndfq < 64) g_dfq[g_ndfq++] = (__typeof__(g_dfq[0])){d, ev, due};
|
||||
else LOG("[RED] movie: deferred event queue full, dropping one");
|
||||
pthread_cond_signal(&g_dfcv); pthread_mutex_unlock(&g_dfmu);
|
||||
}
|
||||
static void md_defer(void *d, int ev) { md_defer_at(d, ev, now_ns() + 2000000); }
|
||||
static void md_defer_drop(void *d) {
|
||||
pthread_mutex_lock(&g_dfmu);
|
||||
int n = 0; for (int i = 0; i < g_ndfq; i++) if (g_dfq[i].d != d) g_dfq[n++] = g_dfq[i];
|
||||
@@ -162,8 +166,10 @@ static void movie_ring_wait(const uint64_t *regs) {
|
||||
uint64_t dt = now_ns() - t0; static _Atomic int nlong; if (dt > 50000000ull && nlong++ < 8) LOG("[movie] waited %.1f ms on the player request ring", dt / 1e6);
|
||||
}
|
||||
__attribute__((constructor)) static void movie_ring_gates(void) { gate_obs_set(OBS_MOVIE_RING_LINK, movie_ring_wait); gate_obs_set(OBS_MOVIE_RING_UNLINK, movie_ring_wait); }
|
||||
// log the first 12 calls one by one, then every 2^k-th
|
||||
#define MD_TRACE(d, slot, ...) do { unsigned long n_ = ++(d)->ncall[slot]; if (n_ <= 12 || !(n_ & (n_ - 1))) LOG("[movie] " __VA_ARGS__); } while (0)
|
||||
// log the first 12 calls one by one, then every 2^k-th (DM_MOVIE_TRACE=1: every call, with the calling thread)
|
||||
static int md_trace_all(void) { static int on = -1; if (on < 0) on = getenv("DM_MOVIE_TRACE") != NULL; return on; }
|
||||
#define MD_TRACE(d, slot, fmt, ...) do { unsigned long n_ = ++(d)->ncall[slot]; if (md_trace_all()) LOG("[movie] [%p] " fmt, (void *)pthread_self(), ##__VA_ARGS__); \
|
||||
else if (n_ <= 12 || !(n_ & (n_ - 1))) LOG("[movie] " fmt, ##__VA_ARGS__); } while (0)
|
||||
|
||||
// VP9 key frame uncompressed header → width and height (VP9 spec 6.2: frame_marker, profile, show_existing_frame, frame_type, show_frame, error_resilient_mode, sync code, color config, frame_size)
|
||||
static int vp9_size(const uint8_t *p, int n, int *w, int *h) {
|
||||
@@ -460,7 +466,7 @@ static void md_free(void **self) {
|
||||
mdec_t *d = md_of(self); if (!d) return;
|
||||
md_defer_drop(d);
|
||||
self[1] = NULL;
|
||||
LOG("[movie] decoder %p destroyed: %lu packets in, %lu frames out; VP9 decoded %llu packets, average %.2f ms per packet, longest %.2f ms", (void *)self, d->ncall[7], d->ncall[8],
|
||||
LOG("[movie] decoder %p destroyed: %lu packets in, %lu frames out; decoded %llu packets, average %.2f ms per packet, longest %.2f ms", (void *)self, d->ncall[7], d->ncall[8],
|
||||
(unsigned long long)d->dec_n, d->dec_n ? d->dec_ns / 1e6 / d->dec_n : 0.0, d->dec_max / 1e6);
|
||||
pthread_mutex_lock(&d->dmu); md_job(d, MDJ_QUIT); pthread_mutex_unlock(&d->dmu);
|
||||
pthread_join(d->wk, NULL);
|
||||
@@ -520,9 +526,13 @@ static void md_reset(mdec_t *d, int close) {
|
||||
if (close) md_job(d, MDJ_CLOSE);
|
||||
if (d->avc) mavc_drop(d->avc); // H.264 pictures waiting for their turn belong to the old position
|
||||
pthread_mutex_lock(&d->mu);
|
||||
for (int i = 0; i < MD_NIN; i++) d->infree[i] = i;
|
||||
// Every input goes back to the free list, as with MediaCodec, but one the client holds may still be sent: Big Brain Academy: Brain vs. Brain's event thread acquires inputs while its
|
||||
// control thread flushes to loop an activity preview, and sends them after the flush (SendInputBufferForDecode claims them back). Those are withheld for a while (h_movie_AcqIn)
|
||||
uint64_t now = now_ns();
|
||||
for (int i = 0; i < MD_NIN; i++) { d->infree[i] = i; d->instale[i] = d->inown[i] ? now : 0; d->inown[i] = 0; }
|
||||
d->ninfree = MD_NIN; d->noutq = 0; d->npend = 0; d->avc_drain = 0;
|
||||
for (int i = 0; i < MD_NOUT; i++) d->out[i].used = d->out[i].pic = 0;
|
||||
// a flush keeps each slot's last picture: the same game reads an output it acquired before the flush right after it (a black frame in the loop otherwise)
|
||||
for (int i = 0; i < MD_NOUT; i++) { d->out[i].used = 0; if (close) d->out[i].pic = 0; }
|
||||
pthread_mutex_unlock(&d->mu);
|
||||
pthread_mutex_unlock(&d->dmu);
|
||||
}
|
||||
@@ -552,8 +562,18 @@ HLE_FORCE("_ZN5movie7Decoder23AcquireInputBufferIndexEPiS1_", "movie decoder: ac
|
||||
// after Stop returned every input index, a late input event could still get one, the wrapper was destroyed afterwards, and the worker thread (main+0x223bd4) read the freed object and crashed
|
||||
pthread_mutex_lock(&d->mu);
|
||||
int r = MD_NO_INPUT; *idx = -1; *left = 0;
|
||||
if (d->ninfree && d->started) { *idx = d->infree[0]; memmove(d->infree, d->infree + 1, --d->ninfree * sizeof *d->infree); *left = d->ninfree; r = 0; }
|
||||
// An input the client held across a flush (md_reset) is not handed out again for MD_STALE_NS unless the client sends it first: handing it out while the client still meant to send
|
||||
// it gave the client one buffer twice (a packet dropped as sent twice, VideoToolbox -12909). A client that abandons it gets it back after that time instead of losing a buffer
|
||||
uint64_t now = now_ns(), wake = 0; int k = -1;
|
||||
for (int j = 0; j < d->ninfree && k < 0; j++) { int x = d->infree[j]; if (!d->instale[x] || now - d->instale[x] >= MD_STALE_NS) k = j; }
|
||||
if (k >= 0 && d->started) {
|
||||
*idx = d->infree[k]; memmove(d->infree + k, d->infree + k + 1, (size_t)(--d->ninfree - k) * sizeof *d->infree); *left = d->ninfree; r = 0;
|
||||
d->inown[*idx] = 1; d->instale[*idx] = 0;
|
||||
} else if (d->ninfree && d->started) { // only withheld inputs are free: announce input when the first of them comes back
|
||||
wake = UINT64_MAX; for (int j = 0; j < d->ninfree; j++) { uint64_t t = d->instale[d->infree[j]] + MD_STALE_NS; if (t < wake) wake = t; }
|
||||
}
|
||||
pthread_mutex_unlock(&d->mu);
|
||||
if (wake) md_defer_at(d, 0, wake); // after mu: Stop takes the deferred queue's lock before mu
|
||||
MD_TRACE(d, 6, "AcquireInputBufferIndex → %#x index %d left %d", r, *idx, *left);
|
||||
return r;
|
||||
}
|
||||
@@ -568,6 +588,17 @@ HLE_FORCE("_ZN5movie7Decoder24SendInputBufferForDecodeEiiilj", "movie decoder: s
|
||||
mdec_t *d = md_of(self); if (!d) return 0x1000;
|
||||
if (i < 0 || i >= MD_NIN || off < 0 || size < 0 || (uint32_t)off + (uint32_t)size > MD_INCAP) return 0x100b;
|
||||
pthread_mutex_lock(&d->mu);
|
||||
// An index the client acquired before a Flush and sends after it (Big Brain Academy: Brain vs. Brain loops its activity previews this way): the flush put it back in the free list,
|
||||
// so it is claimed from there now. Before, it could be handed out a second time, two packets shared one buffer (VideoToolbox -12909 on the overwritten one) and the fifth pending
|
||||
// packet wrote past pend[] into npend and dmu (the process died destroying dmu, 2 runs in 5)
|
||||
for (int k = 0; k < d->ninfree; k++) if (d->infree[k] == i) {
|
||||
memmove(d->infree + k, d->infree + k + 1, (size_t)(--d->ninfree - k) * sizeof *d->infree);
|
||||
static int once; if (!once++) LOG("[movie] input index %d sent after a flush returned it: claimed from the free list (first case)", i);
|
||||
break;
|
||||
}
|
||||
d->inown[i] = d->instale[i] = 0;
|
||||
for (int k = 0; k < d->npend; k++) if (d->pend[k].in == i) { pthread_mutex_unlock(&d->mu); if (!d->red_dec++) LOG("[RED] movie: input index %d sent twice, the second packet is dropped (first case)", i); return 0x100b; }
|
||||
if (d->npend == MD_NIN) { pthread_mutex_unlock(&d->mu); if (!d->red_dec++) LOG("[RED] movie: more packets pending than input buffers, one dropped (first case)"); return 0x100b; }
|
||||
int fmt_now = 0;
|
||||
if (d->type == MD_TYPE_VP9 && !d->w && size > 0 && vp9_size(d->in[i] + off, size, &d->w, &d->h)) LOG("[movie] VP9 key frame: %d×%d", d->w, d->h);
|
||||
if (!d->fmt_sent) { d->fmt_sent = 1; fmt_now = 1; if (!d->w && !MD_AUDIO(d)) { d->w = 1920; d->h = 1080; } } // the size is fixed from here on (slots are allocated by it)
|
||||
@@ -623,7 +654,7 @@ HLE_FORCE("_ZN5movie7Decoder19GetOutputBufferSizeEPiS1_", "movie decoder: output
|
||||
MD_TRACE(d, 11, "GetOutputBufferSize → %d (%d×%d)", *size, w, h);
|
||||
return 0;
|
||||
}
|
||||
// Write one frame into the client buffer: the decoded picture, or a black frame (video range Y 16, UV 128) when there is none (end-of-stream packet, AVC / VP8)
|
||||
// Write one frame into the client buffer: the decoded picture, or a black frame (video range Y 16, UV 128) when there is none (end-of-stream packet, AVC / VP8); a client texture keeps its last frame then
|
||||
// Native texture mode: the client Buffer's data pointer is the NVNtexture object itself (capacity given as 8; Metroid Dread main+0x226c98: the texture object embedded at +0x18 of a texture pool entry), plus the NVN device and a sync object (SetNvnDev / SetNvnSync).
|
||||
// In the SDK, NnCodecConsumer draws the decoded frame into that texture on the GPU and signals the sync when done; the host writes the texture storage on the CPU (as WriteTexels; the replay layer re-uploads dirty pages), and the sync counts as done once written
|
||||
int nvn_host_write_texture(const void *nvntex, const void *src, int w, int h, size_t row, int *tw, int *th);
|
||||
@@ -636,14 +667,11 @@ static int md_out_tex(mdec_t *d, int i, void *buf) {
|
||||
if (f < 0) { LOG("[RED] movie: buffer data %p in native-texture mode is not a texture object", tex); return 0x100b; }
|
||||
if (f != 0x25 && f != 0x38 && f != 0x6d && f != 0x37 && !d->red_img++) LOG("[RED] movie: client texture format %#x is not RGBA8 / RGBX8 (sRGB included), writing in RGBA byte order", f); // Metroid Dread: RGBX8_SRGB
|
||||
int w = d->w < tw ? d->w : tw, h = d->h < th ? d->h : th;
|
||||
// No picture (an end-of-stream output): nothing is drawn and the texture keeps the last frame, as the SDK's consumer has no frame to draw. A black frame here flashed at the
|
||||
// end of every loop of Big Brain Academy: Brain vs. Brain's activity previews, which read the end-of-stream output's buffer
|
||||
if (d->out[i].pic && d->out[i].frm) nvn_host_write_texture(tex, d->out[i].frm, w, h, (size_t)d->w * 4, NULL, NULL);
|
||||
else { // no picture: a black frame
|
||||
size_t n = (size_t)tw * th; uint32_t *k = malloc(n * 4); if (!k) die("movie: black frame allocation failed");
|
||||
for (size_t j = 0; j < n; j++) k[j] = 0xff000000u;
|
||||
nvn_host_write_texture(tex, k, tw, th, (size_t)tw * 4, NULL, NULL); free(k);
|
||||
}
|
||||
void *sy = G.nvn_sync(buf); if (sy && nvn_host_signal_sync(sy) && !d->red_dec++) LOG("[RED] movie: the buffer's sync object %p is not an NVNsync", sy);
|
||||
MD_TRACE(d, 12, "GetOutputBuffer index %d → texture %p (%d×%d format %#x)%s", i, tex, tw, th, f, d->out[i].pic ? "" : " (black frame)");
|
||||
MD_TRACE(d, 12, "GetOutputBuffer index %d → texture %p (%d×%d format %#x)%s", i, tex, tw, th, f, d->out[i].pic ? "" : " (no picture: the texture keeps its last frame)");
|
||||
return 0;
|
||||
}
|
||||
HLE_FORCE("_ZN5movie7Decoder15GetOutputBufferEiPNS_6BufferE", "movie decoder: get a frame", int, h_movie_GetOut, void **self, int i, void *buf) {
|
||||
|
||||
@@ -43,6 +43,7 @@ HLE_FORCE("_ZN2nn3ldn19GetDisconnectReasonEv", "local wireless (cut): 0", int, h
|
||||
HLE_FORCE("_ZN2nn3ldn20AddAcceptFilterEntryENS0_10MacAddressE", "local wireless (cut)", Result, h_ldn_Filter, uint64_t mac) { (void)mac; return RES_FAIL; }
|
||||
HLE_FORCE("_ZN2nn3ldn22SetStationAcceptPolicyENS0_12AcceptPolicyE", "local wireless (cut)", Result, h_ldn_Policy, int p) { (void)p; return RES_FAIL; }
|
||||
HLE_FORCE("_ZN2nn3ldn6RejectENS0_11Ipv4AddressE", "local wireless (cut)", Result, h_ldn_Reject, uint32_t a) { (void)a; return RES_FAIL; }
|
||||
HLE_FORCE("_ZN2nn3ldn16GetNetworkConfigEPNS0_13NetworkConfigE", "local wireless (cut)", Result, h_ldn_NetCfg, void *o) { (void)o; return RES_FAIL; }
|
||||
|
||||
// ---------- socket: offline. Initialization succeeds (the network library's global init depends on it), every later operation fails with errno = ENETDOWN ----------
|
||||
enum { SK_ENETDOWN = 50, SK_EAI_FAIL = 4 };
|
||||
@@ -59,6 +60,41 @@ HLE_FORCE("_ZN2nn6socket8RecvFromEiPvmiP8sockaddrPj", "offline (cut)", long, h_s
|
||||
HLE_FORCE("_ZN2nn6socket11GetAddrInfoEPKcS2_PK8addrinfoPPS3_", "name resolution (cut): EAI_FAIL", int, h_sk_Gai2, const char *h, const char *s, const void *hint, void **res) { (void)h; (void)s; (void)hint; if (res) *res = NULL; return SK_EAI_FAIL; }
|
||||
HLE_FORCE("_ZN2nn6socket12FreeAddrInfoEP8addrinfo", "pairs with GetAddrInfo (cut)", void, h_sk_FreeAi2, void *ai) { (void)ai; }
|
||||
HLE_FORCE("_ZN2nn6socket11GAIStrErrorENS0_7AiErrnoE", "resolver error text", const char *, h_sk_GaiStr, int e) { (void)e; return "network unavailable"; }
|
||||
// SDK 11's overloads with plain sockaddr / int arguments (Big Brain Academy: Brain vs. Brain, through Pia)
|
||||
HLE_FORCE("_ZN2nn6socket7ConnectEiPK8sockaddrj", "offline (cut)", int, h_sk_Connect2, int s, const void *a, unsigned n) { (void)s; (void)a; (void)n; return -1; }
|
||||
HLE_FORCE("_ZN2nn6socket6AcceptEiP8sockaddrPj", "offline (cut)", int, h_sk_Accept2, int s, void *a, unsigned *n) { (void)s; (void)a; (void)n; return -1; }
|
||||
HLE_FORCE("_ZN2nn6socket11GetSockNameEiP8sockaddrPj", "offline (cut)", int, h_sk_GetSockName2, int s, void *a, unsigned *n) { (void)s; (void)a; (void)n; return -1; }
|
||||
HLE_FORCE("_ZN2nn6socket10GetSockOptEiiiPvPj", "offline (cut)", int, h_sk_GetSockOpt2, int s, int l, int o, void *v, unsigned *n) { (void)s; (void)l; (void)o; (void)v; (void)n; return -1; }
|
||||
HLE_FORCE("_ZN2nn6socket10SetSockOptEiiiPKvj", "offline (cut)", int, h_sk_SetSockOpt2, int s, int l, int o, const void *v, unsigned n) { (void)s; (void)l; (void)o; (void)v; (void)n; return -1; }
|
||||
HLE_FORCE("_ZN2nn6socket5FcntlEiiz", "offline (cut)", int, h_sk_Fcntl2, int s, int c) { (void)s; (void)c; return -1; }
|
||||
HLE_FORCE("_ZN2nn6socket4RecvEiPvmi", "offline (cut)", long, h_sk_Recv2, int s, void *b, unsigned long n, int f) { (void)s; (void)b; (void)n; (void)f; return -1; }
|
||||
HLE_FORCE("_ZN2nn6socket4SendEiPKvmi", "offline (cut)", long, h_sk_Send2, int s, const void *b, unsigned long n, int f) { (void)s; (void)b; (void)n; (void)f; return -1; }
|
||||
|
||||
// ---------- irsensor: the Joy-Con IR camera (Big Brain Academy: Brain vs. Brain's input layer makes one per controller). The host has none: every camera is unconnected,
|
||||
// processors cannot run and report no states. The default-config getters and MakeRect only fill the game's structs and keep running in the SDK ----------
|
||||
enum { IRS_UNCONNECTED = 2 }; // IrCameraStatus: 0 available, 1 unsupported, 2 unconnected (the game takes 0 as "available", main+0x497fd4)
|
||||
HLE_FORCE("_ZN2nn8irsensor17GetIrCameraHandleERKj", "IR camera handle of a controller (player number in the low byte)", uint32_t, h_irs_Handle, const uint32_t *npad) { return *npad & 0xff; }
|
||||
HLE_FORCE("_ZN2nn8irsensor10InitializeERKNS0_14IrCameraHandleE", "IR camera (cut): nothing to initialize", void, h_irs_Init, const void *h) { (void)h; }
|
||||
HLE_FORCE("_ZN2nn8irsensor8FinalizeERKNS0_14IrCameraHandleE", "IR camera (cut)", void, h_irs_Fini, const void *h) { (void)h; }
|
||||
HLE_FORCE("_ZN2nn8irsensor17GetIrCameraStatusERKNS0_14IrCameraHandleE", "IR camera (cut): unconnected", int, h_irs_Status, const void *h) { (void)h; return IRS_UNCONNECTED; }
|
||||
HLE_FORCE("_ZN2nn8irsensor18StopImageProcessorERKNS0_14IrCameraHandleE", "IR camera (cut)", void, h_irs_Stop, const void *h) { (void)h; }
|
||||
HLE_FORCE("_ZN2nn8irsensor18RunMomentProcessorERKNS0_14IrCameraHandleERKNS0_21MomentProcessorConfigE", "IR camera (cut)", Result, h_irs_RunMoment, const void *h, const void *c) { (void)h; (void)c; return RES_FAIL; }
|
||||
HLE_FORCE("_ZN2nn8irsensor22RunClusteringProcessorERKNS0_14IrCameraHandleERKNS0_25ClusteringProcessorConfigE", "IR camera (cut)", Result, h_irs_RunCluster, const void *h, const void *c) { (void)h; (void)c; return RES_FAIL; }
|
||||
HLE_FORCE("_ZN2nn8irsensor15RunHandAnalysisERKNS0_14IrCameraHandleERKNS0_18HandAnalysisConfigE", "IR camera (cut)", Result, h_irs_RunHand, const void *h, const void *c) { (void)h; (void)c; return RES_FAIL; }
|
||||
HLE_FORCE("_ZN2nn8irsensor25RunImageTransferProcessorERKNS0_14IrCameraHandleERKNS0_28ImageTransferProcessorConfigEPvm", "IR camera (cut)", Result, h_irs_RunImage,
|
||||
const void *h, const void *c, void *b, size_t n) { (void)h; (void)c; (void)b; (void)n; return RES_FAIL; }
|
||||
HLE_FORCE("_ZN2nn8irsensor25RunImageTransferProcessorERKNS0_14IrCameraHandleERKNS0_30ImageTransferProcessorExConfigEPvm", "IR camera (cut)", Result, h_irs_RunImageEx,
|
||||
const void *h, const void *c, void *b, size_t n) { (void)h; (void)c; (void)b; (void)n; return RES_FAIL; }
|
||||
HLE_FORCE("_ZN2nn8irsensor24GetMomentProcessorStatesEPNS0_20MomentProcessorStateEPiiRKNS0_14IrCameraHandleE", "IR camera (cut): 0 states", Result, h_irs_Moment,
|
||||
void *s, int *n, int max, const void *h) { (void)s; (void)max; (void)h; if (n) *n = 0; return RES_FAIL; }
|
||||
HLE_FORCE("_ZN2nn8irsensor28GetClusteringProcessorStatesEPNS0_24ClusteringProcessorStateEPiiRKNS0_14IrCameraHandleE", "IR camera (cut): 0 states", Result, h_irs_Cluster,
|
||||
void *s, int *n, int max, const void *h) { (void)s; (void)max; (void)h; if (n) *n = 0; return RES_FAIL; }
|
||||
HLE_FORCE("_ZN2nn8irsensor25GetHandAnalysisImageStateEPNS0_22HandAnalysisImageStateEPiilRKNS0_14IrCameraHandleE", "IR camera (cut): 0 states", Result, h_irs_HandImage,
|
||||
void *s, int *n, int max, int64_t since, const void *h) { (void)s; (void)max; (void)since; (void)h; if (n) *n = 0; return RES_FAIL; }
|
||||
HLE_FORCE("_ZN2nn8irsensor30GetHandAnalysisSilhouetteStateEPNS0_27HandAnalysisSilhouetteStateEPiilRKNS0_14IrCameraHandleE", "IR camera (cut): 0 states", Result, h_irs_HandSil,
|
||||
void *s, int *n, int max, int64_t since, const void *h) { (void)s; (void)max; (void)since; (void)h; if (n) *n = 0; return RES_FAIL; }
|
||||
HLE_FORCE("_ZN2nn8irsensor30GetImageTransferProcessorStateEPNS0_27ImageTransferProcessorStateEPvmRKNS0_14IrCameraHandleE", "IR camera (cut)", Result, h_irs_ImageState,
|
||||
void *s, void *b, size_t n, const void *h) { (void)s; (void)b; (void)n; (void)h; return RES_FAIL; }
|
||||
|
||||
// ---------- ssl: offline, creating a context fails ----------
|
||||
HLE_FORCE("_ZN2nn3ssl7Context15ImportClientPkiEPmPKcS4_jj", "SSL (cut)", Result, h_ssl_ImpCli, void *self, uint64_t *id, const char *a, const char *b, unsigned x, unsigned y) { (void)self; (void)a; (void)b; (void)x; (void)y; if (id) *id = 0; return RES_FAIL; }
|
||||
|
||||
+3
-1
@@ -288,7 +288,9 @@ uint64_t svc_dispatch(int num, uint64_t *regs, uint64_t orig_addr) {
|
||||
case I_UsedMem: case I_UsedNonSys: v = g_heap_cur + DM_GAME_MEM_USED + big_bss_bytes(); // profile mem_used, 64 MB unless the game needs more (see mem_used in dm/games/README.md)
|
||||
// with mem_map_limit, the pages mapped in the alias region count too, as on Horizon (the limit in MapPhysicalMemory is the pool less this)
|
||||
if (DM_GAME_MEM_MAP_LIMIT) v += (uint64_t)atomic_load(&g_alias_mapped); break;
|
||||
case I_SysResTotal: v = 0x2000000; break; case I_SysResUsed: v = 0x400000; break;
|
||||
// the system resource the NPDM declares (profile sys_resource; 32 MB without the key). The SDK's IsVirtualAddressMemoryEnabled is "total != 0": Big Brain Academy's nninitStartup
|
||||
// asks StandardAllocator for 60 GB of virtual address memory when it is, and sets a heap only when it is not (its NPDM declares none)
|
||||
case I_SysResTotal: v = DM_GAME_SYS_RESOURCE; break; case I_SysResUsed: v = DM_GAME_SYS_RESOURCE ? 0x400000 : 0; break;
|
||||
case I_DebuggerAttached: v = 0; break;
|
||||
case I_RandomEntropy: { uint64_t dm_entropy64(void); v = dm_entropy64(); break; } // a deterministic stream when DM_DETCLOCK is on (hle_os.c)
|
||||
case I_ProgramId: { static uint64_t pid; if (!pid) { const char *e = getenv("DM_PROGRAM_ID"); pid = e ? strtoull(e, NULL, 16) : DM_GAME_PROGRAM_ID; } v = pid; break; } // default from the game profile's program_id; DM_PROGRAM_ID=hex overrides
|
||||
|
||||
@@ -59,5 +59,6 @@ The work folder `$W` sits in the game's NSP folder, beside the NSP script's `<ti
|
||||
- Koei Tecmo's KTGL (Hyrule Warriors: Age of Calamity) keeps everything in RDB archives: `asset/<name>.rdb` is the index (`_DRK0000` header, then one `IDRK0000` record per file), and `asset/<name>.rdb.bin*` plus `asset/data/0x<KTID>.file` hold the data as a run of `IDRK0000` entries: u64 entry length, u64 stored length, u64 length, u32 0, u32 file KTID, u32 type KTID, u32 flags, a few parameter words, then the stored data at the end of the entry. Entries follow each other directly, some after padding to 64 KB. Flag 0x100000 = zlib in chunks: u32 stored length + a zlib stream each, up to 16 KB inflated per chunk, a zero length ends. The first bytes of the inflated data name the format (`GT1G` textures, `_M1G` models, `_S2G` shaders, `KTSR` / `TSRS` / `ASRS` sound). The DLC folders add `.rdb.bin3_0` files of the same layout.
|
||||
- Unreal Engine (Octopath Traveler 0, UE5: the paged global distance field shaders and the LowLevelTasks task system) keeps everything in pak files: `Octopath_Traveler0/Content/Paks/pakchunk0-Switch.pak` (1.5 GB, 159,757 files) next to loose CRIWARE `.awb` sound banks and one `.usm` movie. A version 11 pak has its footer in the last 0xdd bytes (encryption key GUID, encrypted-index flag, magic `0x5A6F12E1`, version, index offset and size, SHA-1, five compression method names) and an AES-256 (ECB) encrypted index: mount point, entry count, path hash seed, path hash index, full directory index (a second encrypted block: directories, then file names with offsets into the encoded entries) and the encoded entries (one bit-packed u32 per file: block size, block count, encrypted, compression method, then offset and sizes). The key is in `main`: the one 32-byte window of its read-only or data segment that decrypts the index start to the mount point `../../../` (Octopath Traveler 0: `main+0x57c7f70`, found among 116,287 candidates in under a second). Never print it. Most files are Oodle-compressed in 64 KB blocks; the two shader code archives are stored. `dm/gfx/tools/uepak.py` reads all of this (AES through macOS CommonCrypto, no Python package) and lists a pak (`uepak.py list <pak> <main NSO> <out tsv>`).
|
||||
- Capcom's MT Framework (The Great Ace Attorney Chronicles) keeps everything under `nativeNXx64/`: 447 ARC archives (`*.arc`, 17,910 files) beside loose `.tex` textures, Opus / ADPCM sound and H.264 `.mp4` movies. An ARC is `ARC\0`, u16 version 7, u16 file count, then one 0x90-byte entry per file: the path (128 bytes, `\`-separated, no extension), u32 type hash, u32 stored length, u32 length in the low 29 bits (flags above), u32 offset. Each file is one zlib stream (stored when the two lengths are equal), and its first bytes name the format (`TEX\0`, `MOD\0`, `MRL\0`, `GMD\0`, `SDL\0`, `SPK\0` the shader package, …). `shader_split.py` reads them (`mtarc_members`).
|
||||
- NintendoWare Bezel Engine (Big Brain Academy: Brain vs. Brain) keeps nearly everything in Bezel Engine archives: 603 `.bea` files (`Archive/<Permanent|Temporary>~<name>.nx[.<language>].bea`, plus the engine's own `System.nx.bea` at the RomFS root), 7,665 files in all, 2.6 GB unpacked from 0.38 GB. A `.bea` is a NintendoWare binary file with magic `SCNE` (version 0x10100, BOM `FF FE`): +0x20 u64 entry count, +0x28 u64 offset of an array of u64 entry offsets, +0x30 the name dictionary (`_DIC`), +0x40 the archive name. Each entry is a 0x30-byte `ASST` record: +0x10 u16 kind (2; 258 for the one sound project), u16 alignment shift, +0x14 u32 stored length, +0x18 u32 length, +0x20 u64 data offset, +0x28 u64 name offset (u16 length, then the path). Every entry is one zstd frame, even the two whose stored length equals their length. Inside: layouts (`.lyt`, SARCs with their own `__ArchiveShader.bnsh`), BNTX textures, `.bfsha` shader archives, models (`.fmdb`), MSBT text and fonts; the sound is loose `stream/*.bfstm` and the movies loose `movie/Movie/*.mp4` (H.264). `shader_split.py` reads the archives itself (`bea_members`).
|
||||
- Game Freak's Trinity engine (Pokémon Legends: Z-A) keeps almost everything in one archive, `arc/data.trpfs` (4.4 GB, 13,181 packs, 238,546 files, 17.7 GB unpacked), indexed by `arc/data.trpfd`; both are FlatBuffers. The descriptor's root table holds the file hashes (u64, sorted), the pack names (`arc/<the first file's path without its slashes>.trpak`), one info table per file (its pack index) and one per pack (size, file count). The file system starts with `ONEPACK\0` and the u64 offset of its own root table: the pack name hashes and the pack offsets. The name hash is not a plain FNV-1a 64 of the descriptor's name, so a pack is named through its first file's hash. A pack is a table of file hashes and file tables `{1 compression i8, 2 level u8, 3 length u64, 4 data}`; compression 3 is Oodle (every file but 15,528 small stored ones), and every Oodle stream is Mermaid (header `8C 0A`, `CC 0A` for an uncompressed chunk). Oodle is linked into `main` and there is no Mermaid decoder with a licence fit for this repository, so the shader split runs the game's own `OodleLZ_Decompress` in the Mac host's tool mode (`dm/host/hle_oodle.c`, `DM_OODLE_SERVE=1`: requests on stdin, answers on stdout). The host finds it in `main` by the one function that references its name string (as for Unreal's archives), and calls it as the game does (`main+0x1a9b7bc` on 2.0.2: fuzz safe, no CRC check, thread phase 3). The shader split's full scan (every file decoded, 17.7 GB) takes 5 minutes with 12 workers on a 12-core Apple M6.
|
||||
- The older KTGL of Fire Emblem: Three Houses uses a LINKDATA archive instead: `DATA0.bin` is an index of 32-byte entries `{u64 offset, u64 length, u64 stored length, u64 compressed}` into `DATA1.bin` (6.9 GB), and `patch1`–`patch4` hold loose overrides listed by `patchN/INFO0.bin` (0x120-byte entries ending in a `rom:/patchN/…` path). Its compressed entries and `*.gz` files are another chunked zlib: u32 chunk size (0x10000), u32 chunk count, u32 length, the stored length of each chunk, then the chunks at 0x80 alignment, each a u32 length + one zlib stream, or the plain bytes when the stored length equals the chunk's length (`kt_gz` in `shader_split.py`).
|
||||
@@ -183,6 +183,11 @@ Each entry: symptom → root cause → fix (where the fix lives). Check these fi
|
||||
- **Not a host bug: the TV latency calibration ("press A when you hear the fourth beat") ignores A.** Docked, the first boot runs it (scene script `main+0x4c0820`). It starts listening only `0x3c0` frames (16 s) after the prompt, through the active controller (`main+0x22b0` id `0x3ed`, virtual button 4 = A), and passes when about ten presses keep a steady offset within −5 to +13 frames of the cue (evaluation `main+0x2948c0`; offset = cue ticks at `+0x34` / about 17 ticks per frame, about 480 per beat). Scripted presses at fixed seconds drift off the beat; use frame-timed `DM_KEYS` at the bar period (117.12 frames at its 123 BPM) and read each press's offset with `DM_PROBE=main:2951f0@34`. A passed calibration is saved per TV panel identity (the host's all-zero one included) and not asked again. The profile plays it handheld with Boost (`op_mode handheld`, `perf_mode boost`), which skips the TV setup and keeps the 1080p draw size.
|
||||
- **Black screen with every geometry right (`DM_NVN_HILITE` shows each sprite and glyph in place)** → its sprite shader discards a fragment whose alpha is 0 and every texture read 0: the textures sit in `CPU_NO_ACCESS` pools made on memory the files were read into (the initial content of such pools, [04](04-graphics.md)).
|
||||
- **SDK 10.4.1 (The Great Ace Attorney Chronicles, Capcom's MT Framework)**: the first boot crashed in `oe::DisableAlbumImageTakenNotification` (a null read at `sdk+0x338070`, the first call in `nnMain`, `main+0x6b188c`: the SDK asks am through the applet proxy the host never made). The import list against the hooks (`nso_syms.py`, then `main`'s undefined `nn::` symbols no `HLE_FORCE` names) then gave the rest before they were met: `oe::IsInStoreDemoModeEnabled` (no), `vi::ListDisplays` (one display, "Default"; the game lists 10 into a stack buffer and does not read them, `main+0x808f08`), `fs::RenameDirectory` (as `RenameFile`), `account::StoreSaveDataThumbnailImage` / `DeleteSaveDataThumbnailImage` (nothing kept), the `ec::ShowShop…` overloads without an `ApplicationId` (the calling application's own pages), `friends::StartFacedFriendRequest` / `StartSendingFriendRequest` (fail), and `ngc::ProfanityFilter::MaskProfanityWordsInText(int *, char *, uint32_t)`, `SetMaskMode` and `Finalize`, which this game calls by name rather than through the vtable. The touch-screen states (`GetTouchScreenState<16>`) were already hooked by a macro the import table does not see. Two NVN calls were red stubs: `nvnDeviceSetIntermediateShaderCache` and `nvnCommandBufferDiscardColor` (a discarded target is undefined, so keeping its content is correct). After that it runs its frame loop at 30 fps; the black screen it showed was its textures, never uploaded ([04](04-graphics.md), Seen in The Great Ace Attorney Chronicles).
|
||||
- **SDK 11.4.3 (Big Brain Academy: Brain vs. Brain, NintendoWare Bezel Engine)**:
|
||||
- **`nn::diag` abort in `StandardAllocator::Initialize(void *, size_t, bool)` from `nninitStartup`** (`sdk+0x2f98e4` ← `main+0x5b69e0`) → the game's `nninitStartup` (`main+0x5b6984`) asks `os::IsVirtualAddressMemoryEnabled()`: when true it gives StandardAllocator a 60 GB address region (`0xf00000000`), when false it sets a heap of pool − used (2 MB aligned) and hands that over. The SDK's answer is `GetInfo(TotalSystemResourceSize) != 0` (`VammManager::IsVirtualAddressMemoryEnabled`, `sdk+0x34e074`), and the host reported a 32 MB system resource to every game, while this game's NPDM declares none. The profile key `sys_resource` reports the NPDM's size (0 here, so the heap path, as on hardware); the survey writes it for every new game, and profiles without it keep the 32 MB answer.
|
||||
- **Abort in `sf::hipc::InitializeHipcServiceResolution` under `codec::GetHardwareOpusDecoderWorkBufferSize(int, int)`** (`main+0x31f8e8`, early in `nnMain`) → SDK 11's form without the option argument; the host had only the three-argument one.
|
||||
- **From the import list before the next boot** (`main`'s undefined `nn::` symbols no hook names; [02](02-survey.md)): `fs::EnableIndividualFileDataCache` / `DisableIndividualFileDataCache`, `account::LoadCachedNintendoAccountInfo` (fails: no Nintendo Account; the game then skips the birthday and country getters), the IR camera (`irsensor`: every camera unconnected, processors cannot run; Bezel's input layer makes one per controller and asks its status, `main+0x497f84`), `ldn::GetNetworkConfig`, and SDK 11's socket overloads with plain `sockaddr` / `int` arguments (`Connect`, `Accept`, `GetSockName`, `Get` / `SetSockOpt`, `Fcntl`, `Recv`, `Send`). The survey's table counts only names given to `HLE` / `HLE_FORCE` directly: hooks made through macros (`SKF` and `SSF` in `hle_net.c`, `TOUCH(N)` in `hle_hid.c`) show as missing.
|
||||
- **The process dies when an activity starts, 2 runs in 5, with no `CRASH` line** (the run ends with exit 137, SIGKILL; `~/Library/Logs/DiagnosticReports/dmhost-*.ips` has `EXC_BREAKPOINT` in `_os_unfair_lock_corruption_abort` ← `pthread_mutex_destroy` ← `md_free`, the movie decoder's destructor) → each activity's preview is an H.264 movie (`movie/Movie/*.mp4`) the game loops with Flush and Start, from four threads at once (`DM_MOVIE_TRACE=1` logs every decoder call with its thread). Its event thread acquired an input index while the control thread's Flush waited for the packet being decoded; the flush then returned that index to the free list, it was handed out a second time, two packets shared one buffer (VideoToolbox -12909 on the overwritten one, in exactly the runs that died) and a fifth pending packet wrote past `pend[]` into the decoder's `npend` and `dmu`. A send now claims an index a flush returned, and `pend[]` cannot overflow. Handing such an index out last was not enough (with three hosts running at once one run still sent an index twice): an index the client held across a flush is now withheld for 250 ms unless the client sends it first, and an acquire refused only for that announces input when the first one comes back, so a client that abandons its indices, as MediaCodec's rules expect, loses none (`hle_movie.c`). The previews also flashed black at the end of every loop: the game reads the buffers of the end-of-stream output (no picture) and of an output it acquired before the flush, and the host painted its texture black for both. A flush now keeps each slot's last picture, and in native-texture mode an output with no picture leaves the texture as it was, as the SDK's GPU consumer has nothing to draw.
|
||||
- **Code inherited from another title calls fixed addresses** → harmless on the build it was written for, silent memory corruption on any other. d2r-mobile's 3D render scale read a renderer pointer at `main+0x31e0848` and called `main+0x8582f0`; in Mario v0 that is the middle of a static initializer and only did nothing because the pointer happened to read 0. Such code checks `module_t.build_id` now (written into `fixups.tsv` by the rewriter) and stays off on other builds.
|
||||
- **Device / subsystem setup returns quietly and the next stage never starts** → a version or capability check failed (NVN API version, a feature query) → compare what the game queries with what the host answers.
|
||||
- **Font engine runs on garbage** → the system shared font must look like BFTTF: the SDK calls `ScalableFontEngineHelper::Decode(ptr, size)`, which XOR-decodes in place unless the first word is the "already decoded" marker (LE `0x18029a7f`) → serve `marker + bswap(size ^ 0x49621806) + TTF` (`hle_sdk16.c`).
|
||||
|
||||
@@ -19,6 +19,7 @@ Do not stop at the obvious archive. In Mario the main `bfsha` held 4,888 of the
|
||||
- **SDF in RE Engine PAKs** (Monster Hunter Rise): shader definitions (`SDF\0`, 2,685 files in the PAK view, [01](01-extract.md)): u16 version 1, u16 entry count, u64, then 0x108-byte entries from +0x10. Entry +0x10 holds six u64 offsets (vertex, hull, domain, geometry, pixel, compute; 0 = none), each to `{u32 control length, u32 code length}` followed by the control section (0x880 bytes) and the code area; compute code has no header. An entry's stages are one program, so its vertex / pixel stages are a pair. Empty definitions are 16 bytes of version 0. `kpka_jobs` maps the PAKs, takes the newest copy of each path, peeks at 4 decompressed bytes and inflates only SDF entries (`sdf_shaders`): 63,111 shaders (30,233 vertex, 21,475 pixel, 11,271 compute, 53 geometry, 33 hull, 46 domain) and 102,345 pairs, in 5 s with 12 jobs.
|
||||
- **Unreal Engine shader code archives** (Octopath Traveler 0: `ShaderArchive-Global-SF_GLSL_SWITCH_MOBILE-SP_GLSL_SWITCH_MOBILE.ushaderbytecode`, 1,219 shaders, and `ShaderArchive-Octopath_Traveler0_Chunk0-…`, 9,377, both stored in the pak, [01](01-extract.md)): version 2 archives of shader map hashes, shader hashes, shader map entries, shader entries `{u64 offset, u32 size, u32 raw size, u8 frequency}` (17 bytes packed; frequency 0 vertex, 3 pixel, 5 compute), preload entries and shader indices, then the code. Every shader is Oodle-compressed (Mermaid, block header `8C 0A`); there is no Oodle decoder in this repository, so the game's own `OodleLZ_Decompress` (statically linked into `main`; the host finds it as the one function that takes the address of the library's own name string "OodleLZ_Decompress", its profiler scope: Octopath Traveler 0 `main+0x4f77e10`, Pokemon Legends: Z-A `main+0x1a9c9e0`) decodes them in the Mac host: `DM_OODLE_JOB` (`dm/host/hle_oodle.c`), the NSP script's `decode_ue_shaders` for any game with Unreal paks. A decoded shader is an `LSLG` record: `LSLG`, a stage tag (`SV`, `SP`, `SC`), a header with the source name (`/Engine/Private/…usf:MainPS`), then `u32` code length, the code area, `u32` control length (0x880), the control section and a 24- or 29-byte tail, all at unaligned offsets (`uepak.lslg`). The host keys came out exactly: 37 of 37 shaders a first run reported missing were in the two archives. 10,324 unique shaders (1,457 vertex, 6,346 pixel, 2,521 compute); vertex and pixel shaders combine per draw, so every vertex shader is paired with the single-stage cover. Bindings: separate textures and samplers, as Engage's (`0x168` / `0x568`); 61 vertex shaders pick a texture slot at run time (profile key `tex_dyn_slots`, below), 2,084 shaders do atomics on buffer images (below). 16 compute shaders do atomics on a 3D `r32ui` image, which SPIRV-Cross's MSL 2.3 image-atomic emulation indexes with an `int3` (`array subscript is not an integer`): all are Unreal's paged global distance field (`GlobalDistanceFieldCompositeObjects.usf:CompositeObjectsIntoPagesCS`), which the mobile renderer does not dispatch (none in any run), so they stay unbuilt.
|
||||
- **BNSH in Trinity packs** (Pokémon Legends: Z-A, Game Freak's engine): every shader is a BNSH inside the Oodle-compressed files of `arc/data.trpfs` ([01](01-extract.md)). For any game with Trinity packs (`ONEPACK` files), `trpfs_jobs` / `trinity_shaders` in `shader_split.py` name the packs from `data.trpfd`, decode every file with the game's own Oodle in the Mac host (`DM_OODLE_HOST` / `DM_OODLE_MODULES`, set by the NSP script) and scan it like a loose file. 28,603 shaders (11,633 vertex, 16,845 pixel, 125 compute) and 26,051 variation pairs: the material shaders in `system_resource/gfx2/shader/NX64/env_ikkaku` (`material/standard.bnsh`, `material/transparent.bnsh`, `system/light.bnsh`, and the `special/imgui.trsha` pack with the engine's system shaders), particle effects (`.ptcl` / `.trtml` in `ik_effectdata`, 19,842 of the shaders), UI layouts (`__ArchiveShader.bnsh` in the `.truiv` packs of `uidata`) and the 40 BNSH in `main`. The layout archives' control sections are 104 KB long, and their stage descriptors run 456 bytes past the control's own length (control +0x20), with bytes that differ between copies of one shader; `same_shader` compares copies only up to the control's own length.
|
||||
- **BNSH in Bezel Engine archives** (Big Brain Academy: Brain vs. Brain, NintendoWare Bezel Engine 1.56): the shaders are BNSH in the `.bfsha` entries of the `.bea` archives (zstd entries, [01](01-extract.md)), most of them the engine's own in `System.nx.bea` (`_BezelSystemResources/<system>/shader/*.bfsha`: PBR shadow maps 846, post effects 770, …), the rest in the layouts' `__ArchiveShader.bnsh` and the per-archive shader packs (`.bnbshpk`), plus one BNSH in `main`. `shader_split.py` scans each archive entry as a file of its own (`bea_members`): 2,125 shaders in about 90 s.
|
||||
- **SPK in an MT Framework ARC** (The Great Ace Attorney Chronicles, Capcom's MT Framework): the engine's one shader package, `sc\NX_64\root` (`SPK\0`, type hash `0x02358e1a`) in `nativeNXx64/sa/NX_64/root.arc` ([01](01-extract.md)). After the package's tables every shader is a code area followed directly by its control section, back to back to the end of the file: 230 vertex shaders, then 230 pixel shaders. Each control section names its code length (+0x704), so the code is the bytes right before it, and every block must start where the previous one ended (`mtspk_shaders`). The tables that say which vertex and pixel shaders the engine combines are not read: the vertex shaders are paired with the single-stage cover (one pixel shader reads every input any of them reads). `CustomShaderPackage.mfx` (`MFX\0`, the effect descriptions) holds no shader code, and neither `main` nor any other ARC entry does. All 460 build, with Mario's binding layout; every binding decodes.
|
||||
- **BAHS** (agl `sharcb`, engine utility shaders): code region at header +0x1c (size +0x18). Binary entries in the table area are 16 bytes `{code offset, 0, control size (0x880/0x88c; 0x848 in BAHS version 9, Super Mario 3D World), signed offset from this entry to the control section}`. Control sections are shared between programs, so pair by entry, never by searching for code near a control.
|
||||
- **Shorter control sections (SDK 10, Super Mario 3D World + Bowser's Fury)**: the control section stores its own length at +0x20. Mario's, Engage's, Dread's and 13 Sentinels' are all at least 0x880 bytes; 3D World has 2,888 of 0x850 bytes (its ShaderData bfsha and six layouts) and 0x848 in BAHS version 9, each followed directly by other data. The key therefore hashes the first `min(0x880, control +0x20)` bytes (`ctl_len` in `shader_split.py`, `keys_hash` in `hle_nvn.c`); the other games' tables came out byte-identical.
|
||||
@@ -337,3 +338,11 @@ M2's ADV engine on SDK 20.5.17: 487 shaders (483 pixel, 4 vertex) in five BNSH i
|
||||
- **1280x720 in both modes, by the game's own choice.** The window is 1920x1080 and the game crops it (`nvnWindowSetCrop`) to the 1280x720 it draws; the present scales the crop to the screen. Its render size setting (engine object + 0x6000) holds 1920x1080 docked from its constructor (`main+0x383eb0`) until its start-up code sets 1280x720 (`main+0x17c50` → setter `main+0x389e90`), whatever the host reports. Raw screenshots (`DM_NVN_SHOT`) show the whole swap texture, the picture in its lower-left corner (lower-left window origin); `DM_NVN_SHOT_OUT=960x540` gives the presented picture.
|
||||
- **A film look**: the backgrounds carry a green scratch line, coloured dust specks, chromatic fringes and displaced rows; by every sign the game's own effect (not yet compared with a Switch capture).
|
||||
- **Movies in buffer mode**: H.264 decoders opened with output 4 (NV12 into the client's buffer, 1280 × 720 × 1.5 bytes) in mode 1; the AAC sound plays through an AudioOut whose volume the game sets every frame ([03](03-bringup.md)).
|
||||
|
||||
### Seen in Big Brain Academy: Brain vs. Brain
|
||||
|
||||
NintendoWare Bezel Engine 1.56, SDK 11.4.3: 2,125 shaders (955 vertex, 1,153 pixel, 12 geometry, 5 compute) from the Bezel Engine archives and `main` (section 1). The window origin is lower left, depth mode near = 0, the swapchain 1920x1080 RGBA8 sRGB (format 0x38; cropped to 1280x720 in handheld Normal), present interval 1 at 60 fps. Everything drew right at the first frame with shaders; no texture or pool key was needed.
|
||||
|
||||
- **Not done: Bezel's line renderer.** Its 12 geometry shaders (`_BezelSystemResources/line/shader/line.bfsha`) take a line strip with adjacency (primitive type 11) and emit up to 12 vertices per segment as triangle strips: thick lines with joins and caps (28 emit sites). Metal has no geometry stage, so they do not build (`unknown main0_out`) and their draws are skipped (`[RED] primitive type 11 not implemented`). From the main menu on, every frame draws one such line (width 10 in its uniform block) into the top-left 512x512 of the frame and copies that region into a texture, so the menu's chart loses its outlines. The vendored Ryujinx translator has its geometry-to-compute transforms (`VertexToCompute`, `GeometryToCompute`), which the chain does not use yet.
|
||||
- **Not done: ten pixel shaders pick their texture at run time** (Ryujinx's fallback arrays, `fp_t2d_cb0_40000000`): six in `03GamePerception.bnbshpk`, two PBR, two in `main`. In `e10f24835bbaa5f6` the handle is c3 +0x130 or c12 +0x1d0 of the game's own uniform buffers, chosen by a flag in c12, packed as texture ID | sampler ID << 20; `tex_dyn_slots` covers only handles from the driver's c2 tables, so these do not load and their draws are skipped. Resolving them needs the translator to report such a choice of two uniform-buffer handles, a chain change for every profile. None of the activities checked uses them; a long run of activities met one once.
|
||||
- **Conditional rendering**: the engine calls `SetRenderEnableConditional`; drawn unconditionally (the profile has no `render_cond`), no screen played looked wrong.
|
||||
@@ -13,6 +13,7 @@ x0=… x28=…
|
||||
|
||||
- `pc` and `lr` are module-relative (`main+…`, `sdk+…`) or host symbols. Module offsets are the same as in the decompressed NSO and the ELF (Ghidra adds 0x100000).
|
||||
- Look at the registers before the code: a pointer that is a valid pointer plus garbage high bits, an index of `0xfffffffe`, or `pc == lr == 0x100000000` each tell a different story. a fault at `0x74a740e114 = 0x70a740c570 + 0xfffffffe·4 + 0x1bac` was an index of −2 widened as unsigned; `pc == lr` on a nonsense value is a `ret` through an overwritten saved LR (look at the zeroed frame below `sp`).
|
||||
- The handler takes SIGSEGV, SIGBUS, SIGILL, SIGTRAP, SIGALRM (the run's time limit) and SIGABRT (`abort()`: an assertion or an uncaught exception in the host or a framework; before it was handled, Big Brain Academy: Brain vs. Brain died once with exit 134, nothing in the log and no report). A run that ends with exit 137 and no `CRASH` line was killed with SIGKILL: macOS does that after a trap in a system library (`_os_unfair_lock_corruption_abort` destroying a corrupted mutex, the movie decoder entry in [03](03-bringup.md)), and its report is in `~/Library/Logs/DiagnosticReports/dmhost-*.ips`, a JSON document whose `faultingThread` names the thread whose `frames` to read.
|
||||
- When the frame-pointer backtrace is empty, the stack scan's negative offsets (below `sp`) show the return addresses of the calls the crashing function made last.
|
||||
- `[dm] *xN:` lines show the first six words each register points at (read safely, so a bad pointer is skipped). A word inside a module prints as `main+…`: the first word of an object is its vtable, which names its class, and comparing it with the class's own vtable shows whether the object was destroyed (a base-class vtable) or rebuilt.
|
||||
|
||||
|
||||
@@ -405,6 +405,15 @@ The game's own work and its frame rate stay as they are; the host avoids work of
|
||||
- **Memory:** no system resource; the game sets a 3.05 GB heap in the 4 GB layout. About 1.0–1.1 GB resident in the story on the Mac.
|
||||
- **Mac input:** A on the title, Right to CONTINUE, A, Right to QUICK LOAD, A, A on the save, Left to OK, A loads the quick save. The menu takes presses late while its background movie starts (100 to 500 frames after the title's A), so check a `DM_KEYS` route's frames with screenshots.
|
||||
|
||||
**Big Brain Academy: Brain vs. Brain (`0100620012D6E000`)**
|
||||
- **Status:** brought up on the Mac: the title, Solo, enrolling a new student (birthday, profession, appearance, online features, the creepy-crawly filter), the main menu (Practice, Ghost Clash, Test), the Practice categories and activities from each (Whack Match, Species Spotlight, Frame Filler, Fast Focus, Flash Memory, Cubegame, the photo quiz, Tick-Tock Turn, Shadow Shift) with their results, coins and unlocks, at 60 fps with sound, the H.264 activity previews and saves, by controller and by touch. Not yet tested on an iPhone.
|
||||
- **Engine:** NintendoWare Bezel Engine 1.56 on SDK 11.4.3, NVN, update 1.2.0 (v131072). Nearly all of RomFS is in Bezel Engine archives (`.bea`, zstd entries, [01](agents/01-extract.md)); `subsdk0` is GLSLC (imported, never called: `main` holds no GLSL source) and `subsdk1` the movie module.
|
||||
- **Shaders:** 2,125 BNSH in the archives' `.bfsha` entries (most of them the engine's own, in `System.nx.bea`), the layouts and `main`; `shader_split.py` reads the archives (`bea_members`, [04](agents/04-graphics.md)). The 12 geometry shaders of Bezel's line renderer do not build: the main menu's chart is drawn with it every frame (a line strip with adjacency expanded into thick lines, then copied out of the frame), so the chart's outlines are missing. Ten pixel shaders pick their texture at run time from one of two places in the game's uniform buffers; they do not load and their draws are skipped. None of the activities above uses them; one 15-minute run of activities met one of them (`e10f24835bbaa5f6`, `03GamePerception.bnbshpk`) and the process aborted moments later, before the host caught SIGABRT, so its cause is not known; a second 15-minute run was clean.
|
||||
- **Host:** `nninitStartup` chooses virtual address memory or a heap by `IsVirtualAddressMemoryEnabled`, which the host answered yes for every game; the profile key `sys_resource` reports this NPDM's none. SDK 11's Opus work-buffer call, the IR camera, cached Nintendo Account info, per-file data caches and SDK 11's socket overloads ([03](agents/03-bringup.md)). The activity previews loop with Flush and Start from four threads, which corrupted the movie decoder (a host fix, `hle_movie.c`).
|
||||
- **Input:** the profile plays it handheld with Boost (`op_mode handheld`, `perf_mode boost`): handheld, the game reads the touch screen (every menu and activity, and Party's two-player touch battles); docked it does not. Handheld Normal draws 1280x720, Boost 1920x1080. The buttons work as well; the virtual gamepad starts in the 2D layout.
|
||||
- **Memory:** no system resource; the game sets a 3.14 GB heap (pool − used) in the 4 GB layout. It creates 1.5 GB of NVN memory pools in its first 25 s (384 + 256 MB CPU-uncached, a 320 MB physical pool for sparse mappings, 192 + 64 MB of render targets), so about 1.3 GB is resident at the title and 1.5 GB in the first activity. Over 15 minutes of activities it rose to 1.86 GB in steps as each new activity loaded (pools 217 → 292, textures 444 → 1,173), flat in between.
|
||||
- **Mac input:** from a fresh save, `DM_KEYS="f1900:A,f2400:A*9/150,f3800:Right*14/150,f3875:A*14/150,f6000:A*4/150,f6900:Down*5/60,f7250:A,f7500:A*17/150,f10050:A"` enrolls a student (birthday 01/01/2000, the default appearance, no online features) and starts Whack Match from Practice at about frame 10,050 (`<work>/run/enroll.sh`). In handheld mode `T<x>x<y>` taps work too: `f1900:T0.5x0.88` taps Start on the title.
|
||||
|
||||
## Tools (`dm/tools`)
|
||||
|
||||
| Tool | What it does |
|
||||
|
||||
@@ -456,6 +456,7 @@ def survey(nsp_dir, app, fam, keys, repo, py, env):
|
||||
if F['glslc']: notes.append(f'main has {F["glslc"]} GLSLC compiler output magics (0x19866891): shader_split.py takes those that are whole outputs (13 Sentinels and the KTGL games compile their shaders into main; Unity\'s player has 11 of its own)')
|
||||
if rom['mags']['Trinity pack']: notes.append('Trinity packs (Game Freak, arc/data.trpfs with its index data.trpfd): the shaders are BNSH inside Oodle Mermaid streams; shader_split.py decodes them with the game\'s own OodleLZ_Decompress in the Mac host, which dm/host/hle_oodle.c finds by the library\'s name string')
|
||||
elif rom['mags']['MT Framework ARC']: notes.append('MT Framework ARC archives (Capcom, The Great Ace Attorney Chronicles): the shaders are in a shader package (SPK) inside one of them, which shader_split.py reads (mtarc_members, mtspk_shaders)')
|
||||
elif rom['mags']['Bezel Engine archive']: notes.append('NintendoWare Bezel Engine archives (.bea, magic SCNE; Big Brain Academy: Brain vs. Brain): every entry is a zstd frame, and the shaders are BNSH in their .bfsha entries, which shader_split.py reads (bea_members)')
|
||||
elif not (rom['mags']['BNSH'] or rom['mags']['BAHS']) and not rom['mags']['UnityFS'] and not vulkan and not F['glslc']:
|
||||
notes.append('no BNSH / BAHS at the top level: the shaders are inside compressed or other containers or in main, and must be located first')
|
||||
major = {v.split('_')[0] for v in F['sdkver']}
|
||||
|
||||
Reference in new issue
Block a user