// Visit https://github.com/ethteck/splat/wiki/Adding-Symbols for documentation about this file
entrypoint = 0x80000400; // type:func
game_main = 0x800177E0; // type:func

// Compiler runtime (IDO __ll/__ull helpers)
__ll_rshift = 0x800977F0; // type:func
__ull_rem   = 0x8009781C; // type:func
__ull_div   = 0x80097858; // type:func
__ll_lshift = 0x80097894; // type:func

// OS Thread
osCreateThread     = 0x80098A00; // type:func
osStartThread      = 0x800A6E30; // type:func
osSetThreadPri     = 0x800A19D0; // type:func
osGetThreadPri     = 0x800A1AB0; // type:func
__osDequeueThread  = 0x80096EC0; // type:func
__osEnqueueThread  = 0x80096EF0; // type:func
__osDispatchThread = 0x80098224; // type:func

// OS Message Queue
osCreateMesgQueue = 0x800A1460; // type:func
osSendMesg        = 0x800A1880; // type:func
osRecvMesg        = 0x80096CE0; // type:func
osSetEventMesg    = 0x800A0120; // type:func

// OS Interrupt / Status
osSetIntMask       = 0x80096E20; // type:func
__osDisableInt     = 0x800A3280; // type:func
__osRestoreInt     = 0x800A32F0; // type:func
__osSetSR          = 0x80099910; // type:func
__osGetSR          = 0x80099920; // type:func
__osGetCause       = 0x800A4ED0; // type:func
__osSetCompare     = 0x800A2C10; // type:func
osGetCount         = 0x8009B9D0; // type:func

// OS Video Interface
osViSetMode                = 0x8009A5A0; // type:func
osViSwapBuffer             = 0x800A1C30; // type:func
osViSetEvent               = 0x800A3A80; // type:func
osViBlack                  = 0x80099B80; // type:func
osViSetSpecialFeatures     = 0x800A38F0; // type:func
osViGetCurrentFramebuffer  = 0x800A7320; // type:func
osViGetNextFramebuffer     = 0x80099970; // type:func
osCreateViManager          = 0x800A66C0; // type:func
__osViInit                 = 0x800A3310; // type:func
__osViSwapContext          = 0x800A3450; // type:func
viMgrMain                  = 0x800A6440; // type:func

// OS Peripheral Interface (PI)
osCreatePiManager    = 0x8009B2F0; // type:func
osPiStartDma         = 0x8009C560; // type:func
osEPiStartDma        = 0x800A1220; // type:func
__osEPiRawStartDma   = 0x800A21D0; // type:func
osEPiLinkHandle      = 0x800A3C70; // type:func

// OS SP (Signal Processor)
osSpTaskLoad    = 0x8009755C; // type:func
osSpTaskStartGo = 0x800976EC; // type:func
osSpTaskYield   = 0x80099C90; // type:func
osSpTaskYielded = 0x800A23B0; // type:func
__osSpDeviceBusy = 0x800A1780; // type:func
__osSpSetStatus = 0x800A66A0; // type:func
__osSpGetStatus = 0x800A66B0; // type:func
__osSpSetPc     = 0x800A7360; // type:func

// OS Audio Interface
osAiSetFrequency  = 0x800A2A30; // type:func
osAiGetLength     = 0x800A4CF0; // type:func
osAiGetStatus     = 0x800A72F0; // type:func
osAiSetNextBuffer = 0x800A7240; // type:func

// Audio synthesis (CV64 fingerprint matches, LoD addresses)
alSynSetVol             = 0x800973A0; // type:func
alSynAllocVoice         = 0x80099278; // type:func
alSynSetFXParam         = 0x80099930; // type:func
alSynStartVoice         = 0x800999B0; // type:func
alSynSetPitch           = 0x8009B1A0; // type:func
alSynSetPan             = 0x8009B940; // type:func
alSynNew                = 0x8009C790; // type:func
alAudioFrame            = 0x8009CA90; // type:func
alEnvmixerNew           = 0x8009D2EC; // type:func
alEnvmixerPull          = 0x8009E480; // type:func
alEnvmixerParam         = 0x8009E988; // type:func
alSynSetFXMix           = 0x800A1540; // type:func
alSynGetFXRef           = 0x800A1700; // type:func
alSynAddPlayer          = 0x800A3AF0; // type:func
alSynStartVoiceParams   = 0x800A4DF0; // type:func
alSynAllocFx            = 0x800A7110; // type:func
alSynStopVoice          = 0x800A71B0; // type:func

// OS Serial Interface
osContInit        = 0x80098600; // type:func
osInitialize      = 0x800994C0; // type:func
__osSiDeviceBusy  = 0x800A17B0; // type:func
__osSiRawReadIo   = 0x80099C40; // type:func
__osSiRawWriteIo  = 0x800A6600; // type:func

// OS Memory / Cache
osVirtualToPhysical  = 0x800993C0; // type:func
osWritebackDCache    = 0x80099440; // type:func
osWritebackDCacheAll = 0x800A69E0; // type:func
osInvalICache        = 0x800A13E0; // type:func
osInvalDCache        = 0x800A1490; // type:func

// OS TLB
__osProbeTLB    = 0x8009B230; // type:func
__osUnmapTLBAll = 0x800A11D0; // type:func

// GU (Graphics Utility)
guPerspectiveF   = 0x80096A50; // type:func
guPerspective    = 0x80096C80; // type:func
guRotateF        = 0x80096F80; // type:func
guMtxF2L         = 0x8009A330; // type:func
guMtxIdentF      = 0x8009A430; // type:func
guLookAtF        = 0x80098D30; // type:func
guLookAt         = 0x80098EF0; // type:func
guTranslateF     = 0x800A17E0; // type:func
guTranslate      = 0x800A1828; // type:func
guOrthoF         = 0x800A1010; // type:func
guOrtho          = 0x800A1164; // type:func
guNormalize      = 0x800A2B80; // type:func
guRotateRPYF     = 0x800A6A80; // type:func
guRotateRPY      = 0x800A6BCC; // type:func
guLookAtReflectF = 0x800A1C80; // type:func
guLookAtReflect  = 0x800A1F38; // type:func

// C Library / Math
sinf    = 0x80097170; // type:func
__cosf  = 0x800A3780; // type:func
sqrtf   = 0x800A01E0; // type:func
bzero   = 0x80000F30; // type:func
bcopy   = 0x800A2C20; // type:func
memcpy  = 0x800A1340; // type:func
strlen  = 0x800A136C; // type:func

// ============================================================================
// Game-specific functions (from CV64 decomp cross-reference + debugging)
// ============================================================================

// Scene / gamestate lifecycle
gamestate_create           = 0x80000460; // type:func  // loads scene: calls init func, creates root object, copies GSS slots
gamestate_change           = 0x8000053C; // type:func  // requests scene change: sets obj+0x24 = -scene_id
scene4_init                = 0x8000067C; // type:func  // scene 4 (save game) init: heaps, objects, display, sound
save_screen_outer_dispatch = 0x802EBAF0; // type:func  // map_ovl_34 outer schedule dispatch via table 0x802F7170
save_screen_schedule_dispatch = 0x802ECA84; // type:func  // map_ovl_34 wrapper that advances/dispatches save-screen schedule entries
save_screen_outer_state3_update = 0x802ECF4C; // type:func  // map_ovl_34 outer state 3 handler
save_screen_inner_state4_init = 0x802ED630; // type:func  // map_ovl_34 inner state 4 initializer, sets object data motion/timer fields
save_screen_inner_state5_update = 0x802ED6C4; // type:func  // map_ovl_34 inner state 5 update, consumes movement/result helper
save_screen_state3_update  = 0x802ED804; // type:func  // map_ovl_34 save-screen object state 3 handler
save_screen_outer_state4_bridge = 0x802EDBD8; // type:func  // map_ovl_34 outer state 4 bridge into secondary schedule table
map_ovl_29_destroy_spawned_child_effects = 0x802E64AC; // type:func  // Tower map callback: destroys spawned child/effect objects
map_ovl_29_func_802E6750 = 0x802E6750; // type:func  // Tower hidden callback boundary split
map_ovl_29_func_802E67C0 = 0x802E67C0; // type:func  // Tower hidden callback boundary split, table ref at 0x802E8F20
map_ovl_29_func_802E69B8 = 0x802E69B8; // type:func  // Tower hidden callback boundary split, table ref at 0x802E8F24
map_ovl_29_func_802E6C54 = 0x802E6C54; // type:func  // Tower hidden callback boundary split
map_ovl_29_func_802E6CC4 = 0x802E6CC4; // type:func  // Tower hidden callback boundary split, table ref at 0x802E8F28
map_ovl_29_func_802E6D3C = 0x802E6D3C; // type:func  // Tower hidden callback boundary split, table ref at 0x802E8F2C
map_ovl_29_func_802E6EE0 = 0x802E6EE0; // type:func  // Tower hidden callback boundary split, table ref at 0x802E8F30
map_ovl_29_func_802E6FE8 = 0x802E6FE8; // type:func  // Tower hidden callback boundary split, table ref at 0x802E8F34
map_ovl_29_func_802E7374 = 0x802E7374; // type:func  // Tower hidden callback boundary split
map_ovl_29_func_802E73E4 = 0x802E73E4; // type:func  // Tower hidden callback boundary split, table ref at 0x802E8F48
map_ovl_29_func_802E745C = 0x802E745C; // type:func  // Tower hidden callback boundary split, table ref at 0x802E8F4C
map_ovl_29_func_802E763C = 0x802E763C; // type:func  // Tower hidden callback boundary split, table ref at 0x802E8F50
map_ovl_29_func_802E78F4 = 0x802E78F4; // type:func  // Tower hidden callback boundary split, table refs at 0x802E8F38/0x802E8F54
map_ovl_29_func_802E7938 = 0x802E7938; // type:func  // Tower hidden callback boundary split
map_ovl_29_func_802E7A18 = 0x802E7A18; // type:func  // Tower hidden callback boundary split
map_ovl_29_func_802E7A88 = 0x802E7A88; // type:func  // Tower hidden callback boundary split, table ref at 0x802E8F8C
map_ovl_29_func_802E7B00 = 0x802E7B00; // type:func  // Tower hidden callback boundary split, table ref at 0x802E8F90
map_ovl_29_func_802E7CE4 = 0x802E7CE4; // type:func  // Tower hidden callback boundary split, table ref at 0x802E8F94
map_ovl_29_func_802E8020 = 0x802E8020; // type:func  // Tower hidden callback boundary split, table ref at 0x802E8F98
map_ovl_29_func_802E8060 = 0x802E8060; // type:func  // Tower hidden callback boundary split
map_ovl_29_func_802E8738 = 0x802E8738; // type:func  // Tower hidden callback boundary split
map_ovl_29_update_distance_flag = 0x802E8A98; // type:func  // Tower object/player distance flag helper

// Game State Manager
GameStateMgr_execute       = 0x80000578; // type:func  // root object manager, dispatches scene
GameStateMgr_enqueue       = 0x80002D5C; // type:func  // enqueues command node to manager queue
GameStateMgr_dispatch      = 0x80002E3C; // type:func  // consumes manager queue, dispatches tasks

// Scene system
scene_init                 = 0x800007B0; // type:func  // scene init, writes scene_arg, loads scene
object_dispatch_table      = 0x800AD640; // type:data  // per-frame handler dispatch (indexed by template_id)
object_file_info_table     = 0x800AEA8C; // type:data  // NI file info / creation guard (indexed by template_id)
sceneGraphPools_init       = 0x80004CB0; // type:func  // initializes scene-node and scene-data pools
sceneDataPool_contains     = 0x80005484; // type:func  // checks whether a pointer is in the scene data pool
sceneDataPool_alloc        = 0x800054B0; // type:func  // allocates a 64-byte scene data pool entry
sceneDataPool_free         = 0x80005530; // type:func  // frees a scene data pool entry
sceneNode_alloc            = 0x80005574; // type:func  // allocates a 0xB8-byte scene node and optional data entries
sceneNode_initFromDescriptor = 0x8000572C; // type:func  // initializes a scene node from descriptor tables
sceneNode_linkChild        = 0x800058A4; // type:func  // links a scene node as a child
sceneNode_linkSibling      = 0x800058F8; // type:func  // links a scene node through the sibling-style path
sceneLookup                = 0x80005A30; // type:func  // looks up scene state entry from descriptor table
sceneNode_createLinked     = 0x80005ABC; // type:func  // allocates and links a scene node variant
sceneStateCopy             = 0x801431CC; // type:func  // reads alloc_data[15] (+0x70), copies transform
spawnEntry_markDone        = 0x80143234; // type:func  // sets the object's map spawn entry (+0x70) flags2 |= 0x4000 (done)
spawnList_hasPending       = 0x801424C4; // type:func  // 1 if any 0x20-byte spawn entry has flags2 0x8000 without 0x4000
bgActivation_waitSpawnLists = 0x80141E80; // type:func  // obj 0x1AE: bumps activation gate 0x8019D198 once its spawn lists are done
obj1B0_dispatch            = 0x80175FB0; // type:func  // object 0x1B0 state dispatcher (table 0x80192710)
obj1B0_selectMapData       = 0x80176020; // type:func  // obj 0x1B0 state 0: per-map data for maps 7/8/0x19/0x2A
obj1B0_createModel         = 0x80176104; // type:func  // obj 0x1B0 state 1: builds scene node, marks spawn entry done (stubbed; patched)
obj1B0_update              = 0x801761E4; // type:func  // obj 0x1B0 state 2: despawn check plus pulse/bob animation
frameCounts_rescaleForFrameRate = 0x8018C680; // type:func  // rescales frame-count fields when the rate float (sys+0x8) is not 30
sceneSelector_write        = 0x80149DE4; // type:func  // writes scene selector record to sys+0x7C
sceneSelector_update1      = 0x80149BC4; // type:func  // updates scene selector globals
sceneSelector_update2      = 0x80149D30; // type:func  // updates scene selector globals (variant)

// Object system
object_curLevel_goToNextFunc = 0x80001C20; // type:func  // advances current schedule level and clears deeper levels
object_prevLevel_goToNextFunc = 0x80001C5C; // type:func  // advances previous schedule level and clears deeper levels
object_nextLevel_goToNextFunc = 0x80001C9C; // type:func  // advances next schedule level and clears deeper levels
object_curLevel_goToNextFuncAndClearTimer = 0x80001CE8; // type:func  // advances current schedule level, clears timer byte, and clears deeper levels
object_curLevel_goToPrevFunc = 0x80001D28; // type:func  // rewinds current schedule level and clears deeper levels
object_prevLevel_goToPrevFunc = 0x80001D64; // type:func  // rewinds previous schedule level and clears deeper levels
object_nextLevel_goToPrevFunc = 0x80001DA4; // type:func  // rewinds next schedule level and clears deeper levels
object_curLevel_goToPrevFuncAndClearTimer = 0x80001DF0; // type:func  // rewinds current schedule level, clears timer byte, and clears deeper levels
object_curLevel_goToFunc = 0x80001E30; // type:func  // sets current schedule level to a target function and clears deeper levels
object_goToFuncInLevel = 0x80001E64; // type:func  // sets an explicit schedule level to a target function and clears deeper levels
object_prevLevel_goToFunc = 0x80001EA0; // type:func  // sets previous schedule level to a target function and clears deeper levels
object_nextLevel_goToFunc = 0x80001ED8; // type:func  // sets next schedule level to a target function and clears deeper levels
cmdNodeTable_clear         = 0x80001940; // type:func  // clears static command-node table
cmdNodeTable_alloc         = 0x80001968; // type:func  // allocates entry from command-node table
cmdNodeTable_classify      = 0x80001FD0; // type:func  // classifies entry in command-node pool
object_allocate            = 0x8000224C; // type:func  // allocs object struct (bzero 0x74 bytes)
object_create              = 0x80002410; // type:func  // creates object from template ID
object_allocEntryInList    = 0x80002808; // type:func  // allocs data in object's alloc_data[] array
object_dispatch1           = 0x80002950; // type:func  // object dispatch helper
object_dispatch2           = 0x800029EC; // type:func  // object dispatch helper (variant)
object_executeChildren     = 0x80002B10; // type:func  // walks slots[0..3], dispatches each child
object_free                = 0x80002CE0; // type:func  // default destroy function
object_dispatchChild       = 0x8000516C; // type:func  // dispatches single child object
object_executeChildObject  = 0x80010B84; // type:func  // iterates parent slots, creates child objects
object_activateChildren    = 0x80010C80; // type:func  // activates deferred children (bit 30 check)
object_execute             = 0x80010DD4; // type:func  // dispatches object's state function

// Graphics node / display-list emission
gfx_update_and_draw_root   = 0x800065DC; // type:func  // per-frame graphics root update, then draws root node list
gfx_emit_node_segment_commands = 0x80006990; // type:func  // emits texture/segment display-list commands for a graphics node
gfx_emit_node_child_lists  = 0x80007018; // type:func  // emits child/sub display-list commands for a graphics node
gfx_emit_node_recursive    = 0x800070F0; // type:func  // recursively walks graphics nodes and emits RDP state packets
gfx_build_cull_list        = 0x80007B94; // type:func  // builds per-frame draw list; culls nodes outside a 4:3 screen (+-160/+-120) plus radius
gfx_draw_root_node_list    = 0x80008AC8; // type:func  // chooses sorted/root graphics node draw path

// Figure/model hierarchy
Figure_Update              = 0x8000C914; // type:func  // CV64 Figure_Update match
Figure_UpdateMatrices      = 0x8000C9A4; // type:func  // CV64 Figure_UpdateMatrices match

// NI (Nisitenma-Ichigo) system
ni_system_dispatcher       = 0x800113EC; // type:func  // template 3 / NI file system per-frame dispatcher
DMAMgr_updatePendingFileLoad = 0x80011E48; // type:func  // DMAMgr state handler; processes queued DMAChunkMgr file_info slot
DMA_readWrite              = 0x8001A374; // type:func  // CV64 DMA_readWrite equivalent
DMA_ROMCopy                = 0x8001A42C; // type:func  // CV64 DMA_ROMCopy equivalent
ni_figure_process          = 0x800448FC; // type:func  // NI figure bitmask processing
poolObject_create          = 0x80040524; // type:func  // creates pooled NI object
poolObject_attachChild     = 0x80040628; // type:func  // attaches child to pool object
poolObject_attachChild2    = 0x80040844; // type:func  // attaches child (variant)
atari_work_table_init      = 0x800404D0; // type:func  // zeroes pool/atari_work table structures (CV64 match)
atari_work_entry_tick      = 0x80040948; // type:func  // ticks single active pool entry
poolObject_tick            = 0x800409FC; // type:func  // NI per-frame update (clear/rebuild/pair-process)
atari_work_post_update     = 0x80040A6C; // type:func  // post-update after all pool entries processed
poolObject_complete        = 0x80041C54; // type:func  // pool object completion handler
// NI overlay pair 120 (section-scoped; flat vram aliases other NI overlays)
ni_ovl_120_result_schedule_dispatch = 0x0F000484; // type:func  // pair 120: runs result callback table and resets current schedule to 0 when result is nonzero
ni_ovl_104_schedule_dispatch = 0x0F000000; // type:func  // pair 104: schedule dispatcher via table 0x0F0026F8; post-expansion-pak gs=5 crash path
ni_ovl_010_func_0F0039FC = 0x0F0039FC; // type:func  // pair 10: standalone jalr target split from 0F00396C; boss/serpent death path
ni_ovl_013_func_0F004AC0 = 0x0F004AC0; // type:func  // pair 13: explicit jalr target from 0F0049AC; Dracula second-form attack path
ni_ovl_044_set_data0_sub56_bit0 = 0x0F004030; // type:func  // pair 44: indirect dispatch target; sets obj->data0+0x132 bit 0 for Map76 werewolf boss state
ni_ovl_000_apply_figure_render_state_chain = 0x0F008020; // type:func  // pair 0: applies type/flag/render-state masks through a hardcoded figure chain
ni_ovl_000_propagate_figure_visual_bytes = 0x0F00836C; // type:func  // pair 0: indirect target; propagates figure visual bytes at +0x1B/+0x1F through the chain
ni_ovl_000_refresh_figure_render_state = 0x0F00842C; // type:func  // pair 0: refreshes render state then propagates figure visual bytes
ni_ovl_000_set_figure_visual_byte1b_and_propagate = 0x0F0084B4; // type:func  // pair 0: indirect target; sets +0x1B then calls visual-byte propagation

// NI system handler / overlay_system lifecycle
ni_system_handler          = 0x8001B9A0; // type:func  // NI system object handler (obj+0x10), increments sys+0x2B24
overlay_system_create      = 0x8001BA78; // type:func  // creates overlay_system (TMPL 0x1AB), guarded by sys+0x2B24

// Scheduler (CV64 decomp: k64ret/cv64 include/ultra64/PR/sched.h)
scheduler_create           = 0x800184E0; // type:func  // init scheduler struct, create queues, register events
scheduler_getAudioCmdQ     = 0x8001876C; // type:func  // returns audio request message queue
scheduler_eventHandler     = 0x80018774; // type:func  // scheduler thread: receives VI/SP/DP events
scheduler_eventBroadcast   = 0x80018968; // type:func  // iterates client list, sends msg to each
scheduler_executeAudio     = 0x800189B8; // type:func  // audio thread: runs audio+GFX tasks on RSP
scheduler_executeGraphics  = 0x80018B50; // type:func  // graphics thread (thread 17)
scheduler_taskDispatch     = 0x80018E30; // type:func  // sends task to scheduler cmdQ via osJamMesg

// Boot threads
idleThread_entrypoint      = 0x8001783C; // type:func  // creates PI mgr + graph thread, then self-pauses at priority 0
scheduler_addClient        = 0x80018890; // type:func  // registers client with scheduler event system

// Game threads and rendering
graphThread_entrypoint     = 0x800178D0; // type:func  // thread 5 / render thread, receives VI/DP msgs
graphThread_submitGFX      = 0x80017EC0; // type:func  // main frame render function (builds display list)
createGraphicTasks         = 0x80019034; // type:func  // builds GFX task struct, submits to scheduler
createGraphicTasks_overlay = 0x80000A30; // type:func  // GFX task from overlay/recomp entry
video_init                 = 0x80091108; // type:func  // video init (called on PRE-NMI signal)
audioTask_build            = 0x80090744; // type:func  // audio task builder, called from main thread
mainThread_entrypoint      = 0x800905D8; // type:func  // main game logic thread

// Controller Pak / Input
contpak_init               = 0x800195E0; // type:func  // PADMGR init, calls osContInit
contpak_mainLoop           = 0x800196DC; // type:func  // PADMGR loop, reads controllers periodically
contpak_get_inserted_status = 0x8001CCC0; // type:func  // checks CONT_CARD_ON, sets contpak_uninserted
contpak_init_all           = 0x8001CDAC; // type:func  // initializes Controller Pak state for all controller slots
contpak_init_pak           = 0x8001CE78; // type:func  // initializes Controller Pak state for one controller slot
contpak_alloc_file         = 0x8001CF0C; // type:func  // wrapper around osPfsAllocateFile
contpak_delete_file        = 0x8001CFA4; // type:func  // wrapper around osPfsDeleteFile-style PFS API
contpak_find_file          = 0x8001D024; // type:func  // wrapper around osPfsFindFile
contpak_get_file_state     = 0x8001D0B0; // type:func  // wrapper around osPfsFileState
contpak_get_num_files      = 0x8001D114; // type:func  // wrapper around osPfsNumFiles
contpak_get_free_blks      = 0x8001D178; // type:func  // wrapper around osPfsFreeBlocks
contpak_is_plug            = 0x8001D1DC; // type:func  // wrapper around osPfsIsPlug
contpak_read_file          = 0x8001D204; // type:func  // wrapper around osPfsReadWriteFile(PFS_READ)
contpak_write_file         = 0x8001D288; // type:func  // wrapper around osPfsReadWriteFile(PFS_WRITE)
contpak_check_rumble_pak   = 0x8001D30C; // type:func  // checks whether inserted pak is a rumble pak
contpak_check_inserted_err = 0x8001D398; // type:func  // rechecks insertion and returns new-pack/no-pack style error
contpak_backup_pfs_state   = 0x8001D3E8; // type:func  // copies live OSPfs slot to backup storage
contpak_restore_pfs_state  = 0x8001D458; // type:func  // restores live OSPfs slot from backup storage
pfs_find_file              = 0x8009F400; // type:func  // libultra PFS find-file; legacy direct shim is default-off
contpak_readPIF            = 0x80098B50; // type:func  // low-level PIF SI DMA read/write
contpak_formatPIF          = 0x80098C60; // type:func  // formats PIF command buffer for button read
contpak_parsePIF           = 0x80098BD4; // type:func  // parses PIF response, extracts button data

// Background state / overlay 47
bgState_activate           = 0x80146240; // type:func  // activates background state (sys+0x2908, sys+0x2B10)
bgHandler_dispatch         = 0x80177860; // type:func  // background handler dispatcher
bgHandler_active           = 0x80177948; // type:func  // background handler active path
bgHandler_inactive         = 0x80177B4C; // type:func  // background handler inactive path
ovl47_localDispatch        = 0x8014B300; // type:func  // overlay 47 local state dispatcher
ovl47_gateProducer         = 0x8014B370; // type:func  // overlay 47 gate producer (increments 0x8019D194)
vec3_distance              = 0x80147D5C; // type:func  // computes 3D distance between two xyz vectors

// Request bit system
requestBit_set             = 0x801476FC; // type:func  // sets bit in request word at 0x8019D19C
requestBit_test            = 0x80147718; // type:func  // tests bit in request word
requestBit_clear           = 0x80147728; // type:func  // clears bit in request word

// Common interactables (CV64 cross-reference)
Interactable_Entrypoint = 0x80186DF0; // type:func  // CUTSCENE_INTERACTABLES state dispatcher
Interactable_Init = 0x80186E60; // type:func  // initializes pickable item/text spot state, model, event flag, and trigger
Interactable_Main = 0x80187564; // type:func  // idle/update path; advances after object +0x3C interacting flag is set
Interactable_InitCheck = 0x80187C78; // type:func  // starts item name textbox, White Jewel save prompt, or text spot message
Interactable_SelectTextboxOption = 0x80187E04; // type:func  // handles White Jewel yes/no and text spot option actions
Interactable_StopCheck = 0x80188264; // type:func  // waits for save/textbox completion and clears freeze/interacting state
Interactable_Destroy = 0x8018842C; // type:func  // final item pickup/event-flag destroy path
Interactable_stopInteraction = 0x801885A4; // type:func  // clears textbox pointer, fade timer, textbox-active flag, and object +0x3C
Player_getActorCurrentlyInteractingWith = 0x80188730; // type:func  // scans object slots for CUTSCENE_INTERACTABLES and special textboxes
playerCanInteractWithSpecialTextbox = 0x80188A80; // type:func  // position/facing gate for special textbox objects
playerCanInteractWithInteractuable = 0x80188B84; // type:func  // position/facing gate for pickable items and text spots
interactables_getInteractingType = 0x80188E84; // type:func  // returns player interaction action type
interactables_setInteractingFlag = 0x80188F78; // type:func  // writes object +0x3C when player accepts interaction
interactable_createWithSettings = 0x80188F84; // type:func  // creates CUTSCENE_INTERACTABLES child and stores settings at object +0x70
interactable_setPosition = 0x80188FC4; // type:func  // writes interactable position fields

// NI overlay system
NI_systemInit              = 0x801CB5CC; // type:func  // overlay_system: creates NI file management object

// ============================================================================
// Key globals
// ============================================================================
D_800B0088 = 0x800B0088; // type:data  // "video ready" flag, set by scheduler on PRE-NMI
gDisplayListHead = 0x800CE760; // type:data  // current display list write pointer
contpak_uninserted = 0x800F2260; // type:data  // byte[4]: per-controller "no pak" flag
max_controllers = 0x8013EDB1; // type:data  // byte: number of detected controllers
pif_buffer = 0x8013ED70; // type:data  // 64-byte PIF command/response buffer
scene_table = 0x800ACFDC; // type:data  // scene descriptor table, 80 bytes per entry

// NI pair 23 / bike skeleton spawn path
ni_ovl_023_bike_skeleton_spawn_dispatch = 0x0F00469C; // type:func  // pair 23: two-entry sub-dispatch table at 0x0F006FC8; entry 1 targets internal label 0x0F004A24
ni_ovl_023_bike_skeleton_spawn_init = 0x0F004744; // type:func  // pair 23: state-0 bike skeleton spawn/init path; contains internal update label 0x0F004A24
ni_ovl_023_bike_skeleton_root_update = 0x0F000F9C; // type:func  // pair 23: root update/wrapper; dispatches state table at 0x0F006F80 and can call the spawn sub-dispatcher
ni_ovl_023_bike_skeleton_state_spawn_gate = 0x0F003358; // type:func  // pair 23: state-table handler reached from 0x0F006F80; manages child/effect spawn gate state
