On the Mac from update 13.0.5 (v2031616): the opening movie, the title, the first launch's DLC unlocks and Challenges board, the main menu, rulesets, stage and fighter select, 2-player battles (Frigate Orpheon, Big Blue, Great Bay, Find Mii, Prism Tower, Kongo Jungle 64) at 60 fps with about 2.7 ms of GPU per frame and 2 GB resident (1.2 GB of Metal allocations), quitting to the results and a second battle whose fighters' NROs the game loaded again; no red line in battle.
- Profile: modules main subsdk0 sdk (Catherine: Full Body's sdk and movie builds), the 5 GB guest layout, shader groups for data.arc's shader databases, effects and UI layouts, 35,012 shaders.
- patches.py: the engine's allocator (main+0x37c9a20, a static constructor) reserves 62 GB of address space with AllocateAddressRegion and aborted at main+0x37c9bd0. Booted once with a 64 GB alias region it commits from the region's start up (1.73 GB at the title, up to 2.5 GB in a battle) and keeps its page tables in the top 14 MB; all 11 instructions derived from the size are cut to a 4 GB region.
- sdk_patches.py: this SDK 8.2.1 sdk build (5fd4f531, Catherine's too) has the 1 GB AddressRegionManager node area and the 1 GB alignment of large regions (DRAGON QUEST XI S's SDK 7.3.2 layout at sdk+0x336b40 / +0x336d5c); both cut, so the region starts 64 MB into the 4.375 GB alias region.
- NVN: nvnSetExternalDebuggerEnabledNVX, fetched with nvnDeviceGetProcAddress(NULL, …) before the device and called unchecked (pc=0 from main+0x37fe92c), is a no-op in names.txt / hle_nvn.c, as docs/agents/03 already described.
- iOS NRO embedding (the part d979c34 left out): gen_embed.py packs the NROs nro.tsv lists into three sections (__TEXT,__dm_nro_x0, __DM_NRO_W,__img, __TEXT,__dm_nro_x1) with a table of their pieces (__DATA,__dm_nro_tab), since a Mach-O file has at most 255 sections and three per NRO would take 294; loader.c map_image maps an NRO from there (nro_pieces); build_ipa.sh puts nro.tsv beside the rewriter tables. The 98 NROs add 157 MB of code and 51 MB of data to the executable.
- shader_split.py reads data.arc through smash_arc.py (smash_arc_jobs / smash_arc_shaders: each current file scanned, labelled /data.arc/<format>#<hash40>); smash_arc.files(regions=True) gives every region's data of a regional file, without which 128 effect shaders were missing (34,884 of 35,012).
- Docs: README (games table, a Mac picture of Great Bay), AGENTS.md (50 → 51), docs/development.md (game notes, the NRO paragraph, nro_collect.py), docs/agents/01 (data.arc) and 03 (the 4 GB cut and its measurements, iOS NRO embedding).
Checked: the NSP script packs it from the NSPs alone, for the Mac and for iOS; tool tests (41), host unit tests and the NRO loader test pass. Played on an iPhone with this port's build from before it moved onto d979c34's NRO loader; the merged build was checked on the Mac (battles, an NRO loaded again) and builds for iOS.
2.1 KiB
2.1 KiB
| 1 | # Game profile of Super Smash Bros. Ultimate (Switch, base game v0 + update 13.0.5 = v2031616). Plays on the Mac and on the iPhone | |||||
|---|---|---|---|---|---|---|
| 2 | # Format: see dm/games/README.md | |||||
| 3 | # Bandai Namco / Sora's engine (namespaces app, lib, phx, nu) on SDK 8.2.1 with NVN; modules main + subsdk0 (NintendoSDK_movie) + sdk, the same sdk and movie builds as Catherine: Full Body. | |||||
| 4 | # RomFS: everything in data.arc (17.6 GB, read by dm/gfx/tools/smash_arc.py: zstd files named by hash40) beside 14 NRRs. The fighter, item and common scripts are 98 NRO modules in data.arc | |||||
| 5 | # (prebuilt:/nro/release/lua2cpp_<name>.nro, 193 MB) that the game loads with nn::ro::LoadModule (collected by dm/tools/nro_collect.py, embedded in the iOS app); the NRRs also list 666 earlier versions the archive still holds. | |||||
| 6 | # Shaders: GLSLC outputs in the SSBH shader databases (.nushdb), BNSH in the effects (EFFN) and UI layouts (SARC), and 77 in main | |||||
| 7 | # ---- Identity ---- | |||||
| 8 | title_id | 01006A800016E000 | ||||
| 9 | program_id | 01006A800016E000 | ||||
| 10 | # ---- App ---- | |||||
| 11 | # 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) | |||||
| 12 | name | Super Smash Bros. Ultimate | ||||
| 13 | ipa | SuperSmashBrosUltimate.ipa | ||||
| 14 | app_category | public.app-category.games | ||||
| 15 | # ---- Versions ---- | |||||
| 16 | # only the merged 13.0.5 copy is extracted | |||||
| 17 | build | v2031616 | 13.0.5 | main=21450c647b8c5940ed5b68218ea128fd | subsdk0=60c6edbbfcebd4176cc301d5d9cb5a6f | sdk=5fd4f531c1195e9e5510c9e73f22cd39 |
| 18 | package | v2031616 | ||||
| 19 | shader_versions | v2031616 | ||||
| 20 | # ---- Files ---- | |||||
| 21 | # load order as on Horizon: main, subsdk*, sdk | |||||
| 22 | modules | main subsdk0 sdk | ||||
| 23 | romfs_marker | data.arc | ||||
| 24 | zip_store | .arc:.metallib | ||||
| 25 | # ---- Memory ---- | |||||
| 26 | # The NPDM declares 16 MB of system resource (virtual address memory) and main never sets a heap: a 5 GB block with a 4.375 GB alias region, where the game maps its memory itself | |||||
| 27 | mem_reserve | 0x140000000 | ||||
| 28 | mem_alias | 0x118000000 | ||||
| 29 | mem_stack | 0x10000000 | ||||
| 30 | app_pool | 0xCD500000 | ||||
| 31 | sys_resource | 0x1000000 | ||||
| 32 | # ---- Shader split (shader_split.py; data.arc's current files, smash_arc.py) ---- | |||||
| 33 | shader_groups | /data.arc/SHDR=shdr /data.arc/EFFN=effect /data.arc/SARC=ui | ||||
| 34 | shader_note | Super Smash Bros. Ultimate shaders |