ov000 — overlay detail

DS game only とんがりボウシとおしゃれなまほうつかい The field guide documents the DS game's internals.

Audition minigame — spell-naming/dictation game where the player selects correct kana sequences for spells NPCs know. Touch-screen candidate grid with scroll, cursor, OK/Cancel. Loads data/2d/audition.lzs. All visible text from RESO type 99 string registry — zero in-overlay translation surface.

ov000 minigame

Audition minigame — spell-naming/dictation game where the player selects correct kana sequences for spells NPCs know. Touch-screen candidate grid with scroll, cursor, OK/Cancel. Loads data/2d/audition.lzs. All visible text from RESO type 99 string registry — zero in-overlay translation surface.

Header

Numeric metadata for this overlay as read from the overlay table at ROM offset 0x8DE00 (per-entry stride 32 bytes). Function counts, data-item counts, and the call-graph fan-out are from a Ghidra 11.3.1 headless auto-analysis pass.

Overlay ID 0
File ID 0
RAM load address 0x02155a00
RAM size 9,728 bytes (0x2600)
BSS size 0 bytes
On-disk compressed size 7,756 bytes
Compression flag 0x1 (BLZ-compressed)
Functions 35
External calls 105
Jump tables 5
Data items 139
Code coverage 85% (8,262 of 9,728 bytes)

Reading the binary

The overlay ships on the cart at file ID 0 under the BLZ code-LZ compression wrapper (the same backward-LZ scheme Nintendo uses for executable ARM9 code). At load time the engine reads the overlay table entry at ROM offset 0x8DE00 + 0 * 0x20, allocates the destination RAM region at 0x02155a00, decompresses the body in-place (if compressed), and resolves any external relocations.

To inspect this overlay outside the running game, decompress overlay/overlay_000.bin with ndspy.codeCompression.decompress() (Python ndspy library) and load the resulting plaintext into Ghidra or IDA at base address 0x02155a00. The raw Ghidra auto-analysis dump used to populate this page lives at notes/overlay_knowledgebase/raw/ov000.json; the per-overlay descriptive markdown is at notes/overlay_knowledgebase/ov000.md.

Embedded strings

5 UTF-16 LE strings live inside this overlay's compiled binary. These addresses are absolute (inside the overlay's RAM image after load). The text is stored as little-endian UTF-16 code units, NUL-terminated.

0x02157c5a `ゼ砀聰頃`
0x02157d04 `頄ヲ逄蠁`
0x02157d5c `項ヲ逅蠁`
0x02157dd6 `寁頀ず老`
0x02157e50 `寁頀ず老`

Container references

Distinct container basenames referenced by this overlay. Each is loaded via the content cache by passing the basename string to a lookup that resolves it to a file ID in the ROM's FAT. The path column shows the file's location in the clean extract, where resolved.

Unresolved

These container basenames appeared in the overlay's string table but no file of that name was found in the clean extract. Most are false-positive ASCII matches (function names, register maps, fragments of other strings); a few may be containers that the overlay names but never actually opens. Listed for completeness.

Function list

Functions Ghidra auto-identified inside this overlay's RAM range. Names prefixed FUN_ are auto-generated from the function's entry address; size is in bytes; the "calls" column counts both intra-overlay branches and external ARM9 call targets. The "strings" column counts how many UTF-16 LE strings each function references.

Show all 35 functions
# Address Size Calls Strings Role hint
1 0x02155ce4 16 0 0 renderer_request_release_5() — sets bit 5 on renderer status byte
2 0x02155cf4 16 0 0 renderer_request_release_1() — sets bit 0 on renderer status byte
3 0x02155d04 1,242 79 1 scene_tick() [vtable 3] — 9-state main game loop. States: load_palettes → wait_assets → wait_render → fade_in → interactive_loop → fade_out → swap_pages → release
4 0x02156204 16 0 0 is_fade_done() — returns 1 when fade animation complete
5 0x02156214 304 23 0 scene_render_vsync() [vtable 4] — per-VBlank sprite push. Iterates 4 top-screen + 8 bottom-screen sprite headers, pushes cursor + alt-card overlay
6 0x0215635c 218 10 2 top_screen_bg_init() — allocates 4-sprite top-screen background from audition.lzs
7 0x02156454 42 3 0 top_screen_bg_destroy() — frees top-screen BG draw list
8 0x02156484 198 9 2 bottom_screen_bg_init() — allocates 8-sprite bottom-screen BG with OK/Cancel buttons
9 0x0215655c 48 3 0 bottom_screen_bg_destroy() — frees bottom-screen BG draw list
10 0x02156590 1,352 83 0 interactive_frame_handler() — 1352 bytes. Heart of state 5: cursor refresh, idle/swap gate, hotspot polling, DPad dispatch, inactivity timeout, swap animation
11 0x02156af8 114 6 0 cursor_refresh() — detects cursor position change, triggers label relayout
12 0x02156b6c 80 3 0 hitbox_test(idx) — tests touch position against 8-entry hitbox table at 0x02157ed4
13 0x02156bd0 96 1 0 set_cursor_zone(zone, sfx_flag) — maps input zone 0..7 to cursor position, plays SFX 400
14 0x02156c40 52 3 0 card_select_at_cursor() — plays SFX 0x192, sets selected_card_idx from cursor position
15 0x02156c78 126 10 0 commit_cancel() — cancel commit. Guard: no slot busy. SFX 0x192, page-A swap anim, rewind direction
16 0x02156d00 100 6 0 commit_ok() — OK commit. SFX 0x191, forward swap anim, refresh page-0 glyphs if on page 1
17 0x02156d6c 98 4 0 commit_scroll_up() — SFX 0x2bb, scroll-up animation, timer_swap=6
18 0x02156de0 52 3 0 commit_scroll_down() — SFX 0x191, scroll-down animation, timer_swap=6
19 0x02156e1c 956 47 0 lay_out_labels(mode) — 956 bytes. Builds per-card text labels. Fetches strings from RESO type 99 (IDs 0x2a1c–0x2a26). Mode 0=relayout, Mode 1=full rebuild
20 0x021571f8 244 9 0 page_meta_sync() — refreshes swap_anim_state from NSC metadata (stage indicator + mode)
21 0x021572f8 28 2 0 disable_scroll_chevrons() — controls scroll-chevron animator direction
22 0x02157318 96 5 0 register_scene_graph_nodes() — attaches 2 scheduler nodes via arm9 0x0200e510
23 0x02157384 10 0 0 unregister_scene_graph_nodes() — detaches from scene scheduler
24 0x02157398 284 7 0 preload_card_glyphs(page) — 3-pass glyph preloader: base/highlighted/shadow variants per card
25 0x021574b8 154 2 0 request_card_renderers() — requests up to 4+1 card renders from renderer pool
26 0x02157554 20 1 0 request_render() — trampoline to func_0x021599d8 (renderer pool)
27 0x02157568 52 0 0 is_no_slot_busy() — returns 1 if no card in lifecycle state 1 (precondition for OK/Cancel)
28 0x0215759c 1,044 7 0 card_animation_step() — 1044 bytes. Per-frame scroll latch, scroll step, state-3 collection, state-1/2 positioning, state-4 retry
29 0x021579c4 116 1 0 release_all_card_slots() — frees all 4 renderer pool slots, resets card lifecycles
30 0x02157a38 174 2 0 is_spell_opcode(npc_iter, opcode) — filters message opcodes 0x14–0x26 for spell content
31 0x02157b1c 82 6 0 card_passes_double_filter() — calls is_spell_opcode for both sides, returns 1 only if both pass
32 0x02157b70 780 27 0 seed_cards_from_npc_spells() — 780 bytes. Init-time card seeder: builds 140-entry table, shuffles, sorts by weight, filters by NPC friendship tier
33 0x02157e7c 10 0 0 swap_u32(a, b) — swaps a pair of u16s
34 0x02157e88 18 1 0 scene_attach_to_scheduler() [vtable 0] — initializes embedded scheduler list node
35 0x02157e9c 24 2 0 scene_detach_from_scheduler() [vtable 1] — re-inits list node, notifies arm9

Open questions & conflicts

Open questions / unknowns

Conflicts with the prior shallow pass

Source