3893890x03415584 = requestLODMgrModelsAndUpdateDebugInput:
3903900x03414D74 = runActorUpdateStuff:
391391
392- ; custom_PostCalc:
393- ; mflr r0
394- ; stw r0, 0x04(r1)
395- ; stwu r1, -0x18(r1)
396- ; lwz r0, 0x00(r4)
397- ; lis r3, GameScene__postCalc@ha
398- ; addi r3, r3, GameScene__postCalc@l
399- ; lwz r3, 0x08(r3)
400- ; addi r4, r1, 0x08
401- ; stw r0, 0x08(r1)
402- ; bl GameScene__postCalc
403- ; lwz r0, 0x1C(r1)
404- ; mtlr r0
405- ; addi r1, r1, 0x18
406- ; blr
407392
4083930x10463E64 = GameScene_sBinderStatus:
4093940x02C4FAD4 = StageBinder_getStage:
@@ -417,36 +402,56 @@ stw r3, 0x1C(r1)
417402stw r4 , 0x18 (r1)
418403stw r5 , 0x14 (r1)
419404stw r6 , 0x10 (r1)
405+ stw r7 , 0x0C (r1)
420406
421407lwz r3 , 0x1C (r1)
422408lwz r3 , 0x200 (r3)
423409cmpwi r3 , 0
424410beq skip_custom_PostCalc
425411
426- lis r3 , GameScene_sBinderStatus@ha
427- lwz r3 , GameScene_sBinderStatus@l(r3 )
428- cmpwi r3 , 2
412+ lis r6 , GameScene_sBinderStatus@ha
413+ lwz r6 , GameScene_sBinderStatus@l(r6 )
414+ cmpwi r6 , 2
429415beq skip_custom_PostCalc
430416
431- lis r3 , StageBinder_getStage@ha
432- addi r3 , r3 , StageBinder_getStage@l
433- mtctr r3
434- lwz r3 , 0x1C (r1)
417+ ; get stage
418+ lis r6 , StageBinder_getStage@ha
419+ addi r6 , r6 , StageBinder_getStage@l
420+ mtctr r6
421+ ;lwz r3, 0x1C(r1)
435422bctrl ; bl StageBinder_getStage
436423
424+ ; check if stage is valid
437425cmpwi r3 , 0
438426beq skip_custom_PostCalc
439427
440- lis r8 , stru_101C1474@ha
441- addi r8 , r8 , stru_101C1474@l
442- stw r8 , 8 (r1)
443- lwz r9 , 0 (r3)
444- lwz r0 , 0x4C ( r9 )
445- mtctr r0
446- addi r4 , r1 , 8
447- bctrl ; bl Stage__postCalc
428+ lis r5 , stru_101C1474@ha
429+ addi r5 , r5 , stru_101C1474@l
430+ stw r5 , 0x08 (r1) ; store callback vtable on stack
431+ addi r4 , r1 , 0x08
432+
433+ 0x02C44944 = MainFieldDungeonStage__postCalc:
434+ lwz r6 , 0x00 (r3) ; stage->vtable
435+ lwz r6 , 0x4C (r6) ; get Stage::postCalc function pointer
436+ lis r7 , MainFieldDungeonStage__postCalc@ha
437+ addi r7 , r7 , MainFieldDungeonStage__postCalc@l
438+ cmpw r6 , r7
439+ bne skip_custom_PostCalc
440+
441+ ; run ONE function of the stage's postCalc
442+ 0x02C42FF0 = BackgroundCamera_postCalc:
443+ lis r7 , BackgroundCamera_postCalc@ha
444+ addi r7 , r7 , BackgroundCamera_postCalc@l
445+ mtctr r7
446+ bctrl ; bl BackgroundCamera::postCalc
447+
448+ ; lwz r6, 0x00(r3) ; stage->vtable
449+ ; lwz r6, 0x4C(r6) ; get Stage::postCalc function pointer
450+ ; mtctr r6
451+ ; bctrl ; bl Stage::postCalc
448452
449453skip_custom_PostCalc:
454+ lwz r7 , 0x0C (r1)
450455lwz r6 , 0x10 (r1)
451456lwz r5 , 0x14 (r1)
452457lwz r4 , 0x18 (r1)
@@ -459,10 +464,10 @@ blr
459464
460465custom_GameScene_calcAndRunStateMachine:
461466mflr r0
462- stwu r1 , - 0x10 (r1)
463- stw r0 , 0x14 (r1)
464- stw r3 , 0x0C (r1)
465- stw r4 , 0x08 (r1)
467+ stwu r1 , - 0x20 (r1)
468+ stw r0 , 0x24 (r1)
469+ stw r3 , 0x0C (r1) ; stores System*
470+ stw r4 , 0x08 (r1) ; stores Framework*
466471stw r5 , 0x04 (r1)
467472
468473lis r3 , currentEyeSide@ha
@@ -591,34 +596,44 @@ lbz r3, byte_10463E7C@l(r3)
591596; run gameScene::calcGraphicsStuff(*a2)
5925970x03416590 = gameScene__calcGraphicsStuff:
593598
594- lis r3 , gameScene__calcGraphicsStuff@ha
595- addi r3 , r3 , gameScene__calcGraphicsStuff@l
596- mtctr r3
597- lwz r3 , 0x0C (r1)
598- lwz r4 , 0x08 (r1)
599- lwz r5 , 0x04 (r1)
600- lwz r3 , 0x0 (r4)
599+ ;lis r3, gameScene__calcGraphicsStuff@ha
600+ ;addi r3, r3, gameScene__calcGraphicsStuff@l
601+ ;mtctr r3
602+ ;lwz r3, 0x0C(r1)
603+ ;lwz r4, 0x08(r1)
604+ ;lwz r5, 0x04(r1)
605+ ;lwz r3, 0x0(r4)
606+ ;;bctrl
607+ ;
608+ ;lis r3, uking__frm__System__postCalc@ha
609+ ;addi r3, r3, uking__frm__System__postCalc@l
610+ ;mtctr r3
611+ ;lwz r3, 0x0C(r1)
612+ ;lwz r4, 0x08(r1)
613+ ;lwz r5, 0x04(r1)
601614;bctrl
602615
603-
604- lis r3 , uking__frm__System__postCalc@ha
605- addi r3 , r3 , uking__frm__System__postCalc@l
606- mtctr r3
616+ ; load system and framework pointers
607617lwz r3 , 0x0C (r1)
608618lwz r4 , 0x08 (r1)
609619lwz r5 , 0x04 (r1)
610- bctrl
620+ ; store callback pointer
621+ lwz r5 , 0x0 (r4)
622+ addi r4 , r1 , 0x18
623+ stw r5 , 0x18 (r1)
624+
625+ lwz r3 , 0x08 (r3) ; uking::frm::Scene->gameScene
611626
612- ; bl custom_PostCalc
627+ bl custom_PostCalc
613628
614629
615630continuecalcAndRunStateMachine__run:
616- lwz r0 , 0x14 (r1)
631+ lwz r0 , 0x24 (r1)
617632mtlr r0
618633lwz r3 , 0x0C (r1)
619634lwz r4 , 0x08 (r1)
620635lwz r5 , 0x04 (r1)
621- addi r1 , r1 , 0x10
636+ addi r1 , r1 , 0x20
622637blr
623638
624639; hook the precall to run our custom code which runs the pre, run and post calc
0 commit comments