# Game functions routed through runtime hooks (runtime/src/interp.cpp). Address = function entry.
# Frame interpolation: the main loop runs 60 times a second; game logic only on every other pass.
025F172C  # main loop body (frame counter, audio, fapGm_Execute)
0203593C  # per-frame function (HD systems + loop body): held back as a whole on hold passes
025DE788  # fpcEx_Handler: execute all processes (logic)
025DE024  # fpcDt_Handler: process deletion
025E0EE4  # fpcPi_Handler: priority changes (returns success)
025DDCEC  # fpcCt_Handler: process creation (returns success)
025D42C4  # fapGm_After: scene / transition / camera management
0200E6EC  # cCt_Counter: frame counters
025D4654  # fopAc_Draw: one-shot no-draw requests of the step's logic hold for its in-between frames
02715310  # HD UI screens' update after the process executes (end of fpcM_Management): logic, once per step
025C5A8C  # shared minigame timer: HD puts its update in the draw slot; logic once per 30 Hz step
@026277A8 # Boat-race timer formatting: presentation-only fractional milliseconds
@026E9C24 # Shared HUD timer formatting: presentation-only fractional milliseconds
024FFC40  # camera_draw: blended camera on logic passes
# children of the per-frame function; on hold passes each runs or is skipped (interp.cpp kHoldRun)
02032FE8  # per-frame child 0
020357CC  # per-frame child 1
025EE048  # per-frame child 2
02756170  # per-frame child 3
02617AF4  # per-frame child 4
02614F74  # per-frame child 5
0273841C  # per-frame child 6
0270870C  # per-frame child 7
0255E854  # per-frame child 8
02738438  # per-frame child 9
0278FEBC  # per-frame child 10
027199C0  # per-frame child 11
02618940  # per-frame child 12
02728A74  # per-frame child 13
02039834  # per-frame child 14
# sound effect starts: suppressed on in-between frames (drawing code triggers some sounds)
0201EBA0  # sound start
025E1988  # sound start
025E19CC  # sound start
025E1A04  # sound start
025E1A40  # sound start
025E1A7C  # sound start
025E1AA4  # sound start
027F4D5C  # J3DModel::calc (probe: model matrix layout)
# sound listener updates from camera_draw: only the exact camera may move the listener
025E1B44  # mDoAud_getCameraInfo -> JAIZelBasic::getCameraInfo (listener position/orientation)
02027754  # JAIZelBasic::setCameraPolygonPos (ground point under the camera)
021C4BB4  # Sploosh Kaboom board draw: cell identity for pooled hit/miss model histories
027F55FC  # J3DModel::viewCalc: model matrices blended on logic passes
027F5018  # J3DModel UBO update (update_ubo thread): halfway matrices on logic passes
020315CC  # audio frame callback (calls JAIZelBasic::gframeProcess): once per logic step while interpolating
# True 60 fps (runtime/src/true60.cpp): per-process gate, step length dt, primitives scaled by dt
025DF940  # fpcM_Execute: per-process gate (60 Hz processes every pass, others on full passes)
025DF904  # fpcM_Draw: which process is drawing (no interpolation for 60 Hz processes)
0200ECD4  # cLib_addCalc
0200ED84  # cLib_addCalc2
0200EDC8  # cLib_addCalc0
0200EE00  # cLib_addCalcPos
0200EF78  # cLib_addCalcPosXZ
0200F164  # cLib_addCalcPos2
0200F268  # cLib_addCalcPosXZ2
0200F378  # cLib_addCalcAngleS
0200F428  # cLib_addCalcAngleS2
0200F474  # cLib_addCalcAngleL
0200F4FC  # cLib_chaseUC
0200F564  # cLib_chaseS
0200F5C8  # cLib_chaseF
0200F62C  # cLib_chasePos
0200F764  # cLib_chasePosXZ
0200F8D0  # cLib_chaseAngleS
027F2FC4  # J3DFrameCtrl::update
027F2BF8  # J3DFrameCtrl::checkPass: window of one step (dt) long
025E3EC8  # mDoExt_MtxCalcOldFrame::decOldFrameMorfCounter
025D67A8  # fopAcM_calcSpeed
025D6800  # fopAcM_posMove
# cLib_calcTimer copies (true60_link.cpp): with dt < 1 timers count on full passes only
0207A9A0  # cLib_calcTimer<u8>
022ED850  # cLib_calcTimer<u8> (second copy)
02055B64  # cLib_calcTimer<s16>
0211D2F8  # cLib_calcTimer<s32>
025AAE08  # cLib_calcTimer<s32> (second copy)
# Link (true60_link.cpp)
02416230  # daPy_lk_c::setNormalSpeedF: per-step acceleration x dt
@023FCEB0 # posMoveFromFootPos: foot movement per dt -> per step
@023FD338 # posMoveFromFootPos: speed.y += gravity * 2.25 (heavy) -> gravity x dt
@023FD35C # posMoveFromFootPos: speed.y += gravity -> gravity x dt
@023FD39C # posMoveFromFootPos: current.pos += speed -> speed x dt (+ exact-arc term)
023FB230  # daPy_lk_c::checkItemAction: full passes only (true60_link.cpp)
# preview fences (true60_link.cpp): nothing lasting is decided or created on a half pass
023F695C  # daPy_lk_c::changeDemoProc
023F7820  # daPy_lk_c::changeDeadProc
023F81A4  # daPy_lk_c::changeAutoJumpProc
023F8F80  # daPy_lk_c::changeSwimProc
023FA578  # daPy_lk_c::changeDamageProc
023FB020  # daPy_lk_c::changeBoomerangCatchProc
023DBDD0  # daPy_lk_c::setGetDemo
023FD4E4  # daPy_lk_c::startRestartRoom
023DC7AC  # daPy_lk_c::deleteEquipItem
025E14A8  # fpcSCtRq_Request
025DFAB8  # fpcM_FastCreate
02821448  # JPAEmitterManager::createSimpleEmitterID
0200E240  # cCcS::Set
0253EC0C  # dEvt_control_c::order
0253ED80  # dEvt_control_c::orderOld
025F0658  # mDoGph_gInf_c::fadeOut
025B8AF4  # dSv_event_c::setEventReg
025B51DC  # dSv_player_item_c::setBottleItemIn
023FBCEC  # daPy_lk_c::playTextureAnime: full passes only (true60_link.cpp)
@0240D6D8 # daPy_lk_c::execute: procedure call (bctrl, plain member function)
@0240D6F8 # daPy_lk_c::execute: procedure call (bctrl, virtual)
@0240D6FC # daPy_lk_c::execute: after the procedure call
025028B8  # dCamera_c::followCamera: the camera runs at 60 Hz while it follows
0282167C  # JPAEmitterManager::calc: particles step on full passes only (both 60 fps modes)
@025B00B0 # dScnPly_Draw: world systems (grass, magma, moving collision, particles, counter) on full passes only
025CB6D4  # dVibration_c::Pause: not from dScnPly_Draw on half passes
024EF968  # dBgS::MoveBgCrrPos: Link riding moving collision stays at 30 Hz
02593B10  # d_meter per-step update (from the draw): full passes only with true 60
# --- true60 sites (generated by tools/true60/gen_sites.py) ---
@024FE89C
@024FEB00
@02502CCC
@02502CD0
@02502E44
@02502E48
@02502E8C
@02502E90
@02502ECC
@02502ED0
@0250329C
@025032CC
@025034AC
@025034B0
@025034D0
@02503540
@02503544
@02503564
@025035BC
@02503670
@02503674
@025037B0
@025037B4
@02503E20
@02503E24
@02503EC8
@02503ECC
@025042F8
@025043C8
@0250447C
@02504620
@02504624
@02504660
@02504664
@025046C0
@025046C4
@025046FC
@02504700
@025047B8
@025047BC
@02504808
@0250480C
@025049CC
@025049D0
@02504B1C
@02504B70
@02504B74
@02504B78
@02504B7C
@02504B94
@02504B98
@02504BA8
@02504BAC
@02504C00
@02504C04
@02504C14
@02504C18
@02504C68
@02504C6C
@02504D50
@02504DA0
@02504DA4
@02504DB0
@02504DB4
@02504ECC
@02504F5C
# --- end of true60 sites ---
# effects interpolation (runtime/src/interp_fx.cpp)
# (also hooked above) 0282167C  # JPAEmitterManager::calc: held back on hold passes; particles blended on logic passes
025AF8A0  # dScnPly_Draw: start of drawing (halfway particle values restored)
027DF40C  # key animator evaluation (btk/brk material anims): halfway frame on logic passes
# (also hooked above) 027F2FC4  # J3DFrameCtrl::update: held back on hold passes (animations played from Draw)
0246C5E8  # daSea_packet_c vertex grid: halfway wave heights on logic passes
0246C7C8  # daSea_packet_c material setup: scroll counter held back on hold passes
028E93CC  # PSMTXTrans: the sea's halfway texture scroll
0246BD4C  # daSea_packet_c::CalcFlatInter (test aid: WWHD_SEA_WAVES forces waves)
02582500  # dKankyo_wave_Packet::draw (wave crest sprites): remembers the packet
0256A448  # wave_move: wave crest sprites drawn halfway on logic passes
025A8148  # dPa_control_c particle calc 7-8 (+ g_Counter.mTimer++ after it): held back on hold passes
0254C6C4  # dGrass_packet_c::calc: halfway sway on logic passes
025C9948  # dTree_packet_c::calc: halfway sway on logic passes
02548370  # dFlower_packet_c::calc: halfway sway on logic passes
025D0994  # dWood::Packet_c::calc: held back on hold passes
# effects interpolation, round 3 (runtime/src/interp_fx.cpp)
0281FE40  # JPABaseEmitter::calc: emitter centre/scale per step (particles born this step)
02566B88  # dKyr_rain_move: rain drawn halfway on logic passes
02568BD4  # dKyr_snow_move: snow drawn halfway
02569408  # dKyr_kazanbai_move: volcanic ash (snow packet) drawn halfway
02567F68  # dKyr_housi_move: spores drawn halfway
0256BB6C  # cloud_shadow_move: fog (moya) drawn halfway
0256CA54  # poison_move: poison fog drawn halfway
0256DDF8  # vrkumo_move: sky clouds drawn halfway
02575B6C  # drawVrkumo: cloud research prototype (cloud_proto.cpp) brackets the sky-cloud draws
0256A388  # dKyr_star_move: star twinkle drawn halfway
0251D864  # dCloth_packet_c vertex fill: cloth drawn halfway after a simulation step
025EC62C  # mDoExt_3DlineMat1 control-point upload (width overload): ropes at pass_t
025ED1BC  # mDoExt_3DlineMat1 control-point upload (per-point widths): ropes at pass_t
021625DC  # KoRL sail: custom cloth vertices and placement, at upload
0245F638  # pirate ship sail: custom cloth vertices and placement, at upload
023D0E68  # pirate ship skull flag: custom cloth vertices and placement, at upload
021B89B4  # Forsaken Fortress flag: custom cloth vertices and placement, at upload
0232B624  # buoy flag: custom cloth vertices and placement, at upload
0232B984  # buoy pole: attachment placement at the same fraction as the flag
021BBC34  # mantles/capes: custom cloth vertices and placement, at upload
02574144  # dKyr_drawStar: stars placed around the eye the pass was drawn with (interp.cpp)
024EC1C8  # dAttDraw_c::draw: in true 60, the attention arrow is built from halfway values and the current camera
025615B8  # dScnKy_env_light_c::settingTevStruct_plightcol_plus: candle flicker held on frames without logic (interp_fx.cpp)
020198D8  # cM_rndF: the flicker random value inside it
02019788  # cM_rnd: WWHD_RND_TRACE (interp_fx.cpp)
02019918  # cM_rndFX: WWHD_RND_TRACE
02018D40  # cM3dGSph::SetC: NaN centre in a 60 Hz camera step is skipped and the step undone (true60.cpp)
0203DEEC  # OliveOperationMgr message handler: throttled while Miiverse is unavailable (hle/system_stubs.cpp)
# debug traces for the true 60 comparisons (true60_test.cpp; pass-through unless WWHD_LIGHT_TRACE)
025564B4  # dKy_plight_set
0255A2B8  # dKy_plight_priority_set
0255A374  # dKy_plight_cut
0255B9C8  # dKy_efplight_set
0255BA9C  # dKy_efplight_cut
025626A4  # dScnKy_env_light_c::settingTevStruct (debug trace, true60_test.cpp)
025D6CE8  # fopAcM_cullingCheck (debug trace, true60_test.cpp)
02786520  # agl shader program archive setup (debug WWHD_BOOTDBG, true60_test.cpp)
027B8904  # agl ShaderProgramArchive init (debug WWHD_BOOTDBG, true60_test.cpp)
027B82B8  # agl ShaderProgramArchive setup from sharc (debug WWHD_BOOTDBG, true60_test.cpp)
02753D6C  # sead::ExpHeap::alloc (debug WWHD_HEAPLOG, true60_test.cpp)

0252E388  # dDlst_peekZ_c::peekData: GPU depth answers for sun corona/lens flare (peekz.cpp)

026E9A38 # Retire shared HUD countdown presentation history before layout destruction
0262769C # Retire boat-race countdown presentation history before layout destruction

023D813C # daPy_sightPacket_c::setSight: aiming marker projection scope
020CBB70 # daBoomerang_sightPacket_c::setSight: target marker projection scope
025F1018 # mDoLib_projectViewport: project scoped interpolated marker points through the drawn camera

023F22FC  # daPy_lk_c::setDemoData: event commands only on full steps (may replace model heaps)
