From 51ac35a65d49e90c0ceb51d6028e133292d86b94 Mon Sep 17 00:00:00 2001 From: snesrev <111028570+snesrev@users.noreply.github.com> Date: Mon, 20 Mar 2023 18:12:36 +0100 Subject: [PATCH] Code cleanup (#28) Lots of code cleanup --- other/useful_regexps.txt | 11 + src/funcs.h | 1240 ++++++++++++++++++-------------------- src/ida_types.h | 47 +- src/move_defines.py | 31 + src/sm.vcxproj | 1 + src/sm_80.c | 506 ++++++---------- src/sm_81.c | 553 +++++++---------- src/sm_82.c | 675 ++++++++------------- src/sm_84.c | 1161 +++++++++++++++-------------------- src/sm_85.c | 16 +- src/sm_86.c | 268 ++++---- src/sm_87.c | 34 +- src/sm_88.c | 250 ++++---- src/sm_89.c | 22 +- src/sm_8b.c | 578 ++++++------------ src/sm_8d.c | 24 +- src/sm_8f.c | 28 +- src/sm_90.c | 486 ++++++--------- src/sm_91.c | 651 +++++++++----------- src/sm_92.c | 12 +- src/sm_93.c | 100 ++- src/sm_94.c | 406 ++++++------- src/sm_9b.c | 263 +++----- src/sm_a0.c | 782 +++++++++++------------- src/sm_a2.c | 427 ++++++------- src/sm_a3.c | 386 ++++++------ src/sm_a4.c | 352 ++++++----- src/sm_a5.c | 336 ++++------- src/sm_a6.c | 637 +++++++++----------- src/sm_a7.c | 269 ++++----- src/sm_a8.c | 525 +++++++--------- src/sm_a9.c | 551 ++++++++--------- src/sm_aa.c | 571 ++++++++---------- src/sm_ad.c | 216 +++---- src/sm_b2.c | 179 +++--- src/sm_b3.c | 168 +++--- src/sm_b4.c | 67 +- src/sm_cpu_infra.c | 43 +- src/sm_rtl.c | 36 +- src/sm_rtl.h | 232 +++---- src/types.h | 4 + src/variables.h | 40 +- 42 files changed, 5746 insertions(+), 7438 deletions(-) create mode 100644 other/useful_regexps.txt create mode 100644 src/move_defines.py diff --git a/other/useful_regexps.txt b/other/useful_regexps.txt new file mode 100644 index 0000000..8b48c0f --- /dev/null +++ b/other/useful_regexps.txt @@ -0,0 +1,11 @@ + + + +(, *|[-=+!] *|\()\*\(\(uint16 \*\)(v[0-9]+) \+ 2\) $1GET_WORD($2 + 4) + +(\(|[-=+!] *|, *)\*\(uint16 \*\)(v[0-9]+) $1GET_WORD($2) + +(, *|[-=+!] *|\()\*\(uint16 \*\)\((v[0-9]+) \+ 3\) $1GET_WORD($2 + 3) + +RespawnEnemy + diff --git a/src/funcs.h b/src/funcs.h index 100e8bc..2dd3b7b 100644 --- a/src/funcs.h +++ b/src/funcs.h @@ -27,7 +27,7 @@ void AddGrappleToHudTilemap(void); void AddMissilesToHudTilemap(void); void AddPowerBombsToHudTilemap(void); void AddSuperMissilesToHudTilemap(void); -void AddToTilemapInner(uint16 k, uint16 j); +void AddToTilemapInner(uint16 k, const uint16 *j); void AddXrayToHudTilemap(void); void CalculateBgScrollAndLayerPositionBlocks(void); void CalculateBgScrolls(void); @@ -41,9 +41,8 @@ void ClearTimerRam(void); void ConfigureMode7RotationMatrix(void); void CopySuperMetroidString(void); void DebugScrollPosSaveLoad(void); -void DecompressToMem(void); -void DecompressToMem_IpArg(const void* p); -void DecompressToVRAM(void); +void DecompressToMem(uint32 src, uint8 *decompress_dst); +void DecompressToVRAM(uint32 src, uint16 dst_addr); void DisableIrqInterrupts(void); void DisableNMI(void); void DisplayViewablePartOfRoom(void); @@ -52,10 +51,10 @@ void DoorTransitionScrollingSetup_Down(void); void DoorTransitionScrollingSetup_Left(void); void DoorTransitionScrollingSetup_Right(void); void DoorTransitionScrollingSetup_Up(void); -void DrawThreeHudDigits(uint16 a, uint16 k); +void DrawThreeHudDigits(LongPtr r0, uint16 a, uint16 k); void DrawTimer(void); void DrawTimerSpritemap(uint16 a, uint16 j); -void DrawTwoHudDigits(uint16 a, uint16 k); +void DrawTwoHudDigits(LongPtr r0, uint16 a, uint16 k); void DrawTwoTimerDigits(uint16 a, uint16 k); void EnableIrqInterrupts(void); void EnableIrqInterruptsNow(void); @@ -97,7 +96,7 @@ void LoadFromLoadStation(void); void LoadMirrorOfExploredMapTiles(void); void Multiply16x16(uint16 a, uint16 j); void NMI_ProcessMode7Queue(void); -void NMI_ProcessMode7QueueInner(uint16 k); +void NMI_ProcessMode7QueueInner(const uint8 *p); void NMI_ProcessVramReadQueue(void); void NMI_ProcessVramWriteQueue(void); void NmiProcessAnimtilesVramTransfers(void); @@ -198,7 +197,7 @@ void DrawSpritemap(uint8 db, uint16 j); void DrawSpritemapOffScreen(uint16 j); void DrawSpritemapWithBaseTile(uint8 db, uint16 j); void DrawSpritemapWithBaseTile2(uint8 db, uint16 j); -void DrawSpritemapWithBaseTileOffscreen(uint8 db, uint16 j); +void DrawSpritemapWithBaseTileOffscreen(uint8 db, uint16 j, uint16 r20_x, uint16 r18_y); void FileSelectClearRestOfMenuTilemapRow(uint16 k); void FileSelectMap(void); void FileSelectMap_0(void); @@ -292,7 +291,7 @@ void SetupInitialExpandingSquareHDMA(void); void SetupRoomSelectMapExpandingSquareTransHDMA(void); void SwitchActiveFileSelectMapArea(void); void UnpackMapFromSave(void); -void sub_818A5F(uint16 j); +void sub_818A5F(const uint8 *pp); void sub_819591(void); void sub_81A3D1(uint16 k); void sub_81AEC8(void); @@ -623,116 +622,116 @@ void sub_82F404(uint16 k); void sub_82F419(uint16 j); // Bank 84 -uint16 PlmInstr_ABD6(uint16 k, uint16 j); -uint16 PlmInstr_ActivateEnergyStation(uint16 j, uint16 k); -uint16 PlmInstr_ActivateMapStation(uint16 j, uint16 k); -uint16 PlmInstr_ActivateMissileStation(uint16 j, uint16 k); -uint16 PlmInstr_ActivateSaveStationAndGotoIfNo(uint16 j, uint16 k); -uint16 PlmInstr_Call(uint16 j, uint16 k); -uint16 PlmInstr_CallFunction(uint16 j, uint16 k); -uint16 PlmInstr_ClearChargeBeamCounter(uint16 j, uint16 k); -uint16 PlmInstr_ClearMusicQueueAndQueueTrack(uint16 j, uint16 k); -uint16 PlmInstr_ClearPreInstr(uint16 j, uint16 k); -uint16 PlmInstr_ClearTrigger(uint16 j, uint16 k); -uint16 PlmInstr_CollectAmmoMissileTank(uint16 j, uint16 k); -uint16 PlmInstr_CollectAmmoPowerBombTank(uint16 j, uint16 k); -uint16 PlmInstr_CollectAmmoSuperMissileTank(uint16 j, uint16 k); -uint16 PlmInstr_CollectHealthEnergyTank(uint16 j, uint16 k); -uint16 PlmInstr_CollectHealthReserveTank(uint16 j, uint16 k); -uint16 PlmInstr_CopyFromRamToVram(uint16 j, uint16 k); -uint16 PlmInstr_DamageDraygonTurret(uint16 j, uint16 k); -uint16 PlmInstr_DamageDraygonTurret2(uint16 j, uint16 k); -uint16 PlmInstr_DamageDraygonTurretFacingDownLeft(uint16 j, uint16 k); -uint16 PlmInstr_DamageDraygonTurretFacingDownRight(uint16 j, uint16 k); -uint16 PlmInstr_DamageDraygonTurretFacingUpLeft(uint16 j, uint16 k); -uint16 PlmInstr_DamageDraygonTurretFacingUpRight(uint16 j, uint16 k); -uint16 PlmInstr_DealDamage_2(uint16 j, uint16 k); -uint16 PlmInstr_DecrementAndBranchNonzero(uint16 j, uint16 k); -uint16 PlmInstr_Delete(uint16 j, uint16 k); -uint16 PlmInstr_DiagonalEarthquake(uint16 j, uint16 k); -uint16 PlmInstr_DisableSamusControls(uint16 j, uint16 k); -uint16 PlmInstr_DisplayGameSavedMessageBox(uint16 j, uint16 k); -uint16 PlmInstr_Draw0x38FramesOfLeftTreadmill(uint16 j, uint16 k); -uint16 PlmInstr_Draw0x38FramesOfRightTreadmill(uint16 j, uint16 k); -uint16 PlmInstr_DrawItemFrame0(uint16 j, uint16 k); -uint16 PlmInstr_DrawItemFrame1(uint16 j, uint16 k); -uint16 PlmInstr_DrawItemFrame_Common(uint16 j, uint16 k); -uint16 PlmInstr_DrawPlmBlock(uint16 j, uint16 k); -uint16 PlmInstr_DrawPlmBlock_(uint16 j, uint16 k); -uint16 PlmInstr_E63B(uint16 k, uint16 j); -uint16 PlmInstr_EnableMovementAndSetSaveStationUsed(uint16 j, uint16 k); -uint16 PlmInstr_EnableSamusControls(uint16 j, uint16 k); -uint16 PlmInstr_EnableWaterPhysics(uint16 j, uint16 k); -uint16 PlmInstr_FxBaseYPos_0x2D2(uint16 j, uint16 k); -uint16 PlmInstr_GiveInvincibility(uint16 j, uint16 k); -uint16 PlmInstr_Goto(uint16 j, uint16 k); -uint16 PlmInstr_GotoIfBossBitSet(uint16 j, uint16 k); -uint16 PlmInstr_GotoIfChozoSet(uint16 j, uint16 k); -uint16 PlmInstr_GotoIfDoorBitSet(uint16 j, uint16 k); -uint16 PlmInstr_GotoIfEventSet(uint16 j, uint16 k); -uint16 PlmInstr_GotoIfItemBitSet(uint16 j, uint16 k); -uint16 PlmInstr_GotoIfMissilesFull(uint16 j, uint16 k); -uint16 PlmInstr_GotoIfRoomArgLess(uint16 j, uint16 k); -uint16 PlmInstr_GotoIfSamusHealthFull(uint16 j, uint16 k); -uint16 PlmInstr_GotoIfSamusNear(uint16 j, uint16 k); -uint16 PlmInstr_IncrementArgumentAndJGE(uint16 j, uint16 k); -uint16 PlmInstr_IncrementDoorHitCounterAndJGE(uint16 j, uint16 k); -uint16 PlmInstr_JumpIfSamusHasNoBombs(uint16 j, uint16 k); -uint16 PlmInstr_LoadItemPlmGfx(uint16 j, uint16 k); -uint16 PlmInstr_MovePlmDownOneBlock(uint16 j, uint16 k); -uint16 PlmInstr_MovePlmDownOneBlock_0(uint16 j, uint16 k); -uint16 PlmInstr_MovePlmRight4Blocks(uint16 j, uint16 k); -uint16 PlmInstr_MoveUpAndMakeBlueDoorFacingLeft(uint16 j, uint16 k); -uint16 PlmInstr_MoveUpAndMakeBlueDoorFacingRight(uint16 j, uint16 k); -uint16 PlmInstr_PickupBeamAndShowMessage(uint16 j, uint16 k); -uint16 PlmInstr_PickupEquipmentAddGrappleShowMessage(uint16 j, uint16 k); -uint16 PlmInstr_PickupEquipmentAddXrayShowMessage(uint16 j, uint16 k); -uint16 PlmInstr_PickupEquipmentAndShowMessage(uint16 j, uint16 k); -uint16 PlmInstr_PlaceSamusOnSaveStation(uint16 j, uint16 k); -uint16 PlmInstr_PreInstr(uint16 j, uint16 k); -uint16 PlmInstr_ProcessAirScrollUpdate(uint16 j, uint16 k); -uint16 PlmInstr_ProcessSolidScrollUpdate(uint16 j, uint16 k); -uint16 PlmInstr_QueueMusic(uint16 j, uint16 k); -uint16 PlmInstr_QueueSfx1_Max1(uint16 j, uint16 k); -uint16 PlmInstr_QueueSfx1_Max15(uint16 j, uint16 k); -uint16 PlmInstr_QueueSfx1_Max3(uint16 j, uint16 k); -uint16 PlmInstr_QueueSfx1_Max6(uint16 j, uint16 k); -uint16 PlmInstr_QueueSfx1_Max9(uint16 j, uint16 k); -uint16 PlmInstr_QueueSfx2_Max1(uint16 j, uint16 k); -uint16 PlmInstr_QueueSfx2_Max15(uint16 j, uint16 k); -uint16 PlmInstr_QueueSfx2_Max3(uint16 j, uint16 k); -uint16 PlmInstr_QueueSfx2_Max6(uint16 j, uint16 k); -uint16 PlmInstr_QueueSfx2_Max9(uint16 j, uint16 k); -uint16 PlmInstr_QueueSfx3_Max1(uint16 j, uint16 k); -uint16 PlmInstr_QueueSfx3_Max15(uint16 j, uint16 k); -uint16 PlmInstr_QueueSfx3_Max6(uint16 j, uint16 k); -uint16 PlmInstr_QueueSfx3_Max9(uint16 j, uint16 k); -uint16 PlmInstr_QueueSfx_Max3(uint16 j, uint16 k); -uint16 PlmInstr_QueueSong1MusicTrack(uint16 j, uint16 k); -uint16 PlmInstr_Return(uint16 j, uint16 k); -uint16 PlmInstr_Scroll_0_1_Blue(uint16 j, uint16 k); -uint16 PlmInstr_SetBTS(uint16 j, uint16 k); -uint16 PlmInstr_SetBtsTo1(uint16 j, uint16 k); -uint16 PlmInstr_SetCrittersEscapedEvent(uint16 j, uint16 k); -uint16 PlmInstr_SetEvent(uint16 j, uint16 k); -uint16 PlmInstr_SetGreyDoorPreInstr(uint16 j, uint16 k); -uint16 PlmInstr_SetItemBit(uint16 j, uint16 k); -uint16 PlmInstr_SetLinkReg(uint16 j, uint16 k); -uint16 PlmInstr_SetRoomChozoBit(uint16 j, uint16 k); -uint16 PlmInstr_SetTimer(uint16 j, uint16 k); -uint16 PlmInstr_ShootEyeDoorProjectileWithProjectileArg(uint16 j, uint16 k); -uint16 PlmInstr_Sleep(uint16 j, uint16 k); -uint16 PlmInstr_Spawn10shardsAnd6n00bs(uint16 j, uint16 k); -uint16 PlmInstr_SpawnEnemyProjectile(uint16 j, uint16 k); -uint16 PlmInstr_SpawnEyeDoorSmokeProjectile(uint16 j, uint16 k); -uint16 PlmInstr_SpawnEyeDoorSweatEnemyProjectile(uint16 j, uint16 k); -uint16 PlmInstr_SpawnFourMotherBrainGlass(uint16 j, uint16 k); -uint16 PlmInstr_SpawnN00bTubeCrackEnemyProjectile(uint16 j, uint16 k); -uint16 PlmInstr_SpawnTorizoStatueBreaking(uint16 j, uint16 k); -uint16 PlmInstr_SpawnTwoEyeDoorSmoke(uint16 j, uint16 k); -uint16 PlmInstr_TransferWreckedShipChozoSpikesToSlopes(uint16 j, uint16 k); -uint16 PlmInstr_TransferWreckedShipSlopesToChozoSpikes(uint16 j, uint16 k); -uint16 PlmInstr_WakeEnemyProjectileAtPlmPos(uint16 j, uint16 k); +const uint8 *PlmInstr_ABD6(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_ActivateEnergyStation(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_ActivateMapStation(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_ActivateMissileStation(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_ActivateSaveStationAndGotoIfNo(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_Call(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_CallFunction(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_ClearChargeBeamCounter(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_ClearMusicQueueAndQueueTrack(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_ClearPreInstr(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_ClearTrigger(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_CollectAmmoMissileTank(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_CollectAmmoPowerBombTank(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_CollectAmmoSuperMissileTank(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_CollectHealthEnergyTank(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_CollectHealthReserveTank(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_CopyFromRamToVram(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_DamageDraygonTurret(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_DamageDraygonTurret2(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_DamageDraygonTurretFacingDownLeft(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_DamageDraygonTurretFacingDownRight(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_DamageDraygonTurretFacingUpLeft(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_DamageDraygonTurretFacingUpRight(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_DealDamage_2(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_DecrementAndBranchNonzero(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_Delete(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_DiagonalEarthquake(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_DisableSamusControls(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_DisplayGameSavedMessageBox(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_Draw0x38FramesOfLeftTreadmill(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_Draw0x38FramesOfRightTreadmill(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_DrawItemFrame0(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_DrawItemFrame1(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_DrawItemFrame_Common(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_DrawPlmBlock(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_DrawPlmBlock_(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_E63B(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_EnableMovementAndSetSaveStationUsed(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_EnableSamusControls(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_EnableWaterPhysics(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_FxBaseYPos_0x2D2(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_GiveInvincibility(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_Goto(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_GotoIfBossBitSet(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_GotoIfChozoSet(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_GotoIfDoorBitSet(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_GotoIfEventSet(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_GotoIfItemBitSet(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_GotoIfMissilesFull(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_GotoIfRoomArgLess(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_GotoIfSamusHealthFull(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_GotoIfSamusNear(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_IncrementArgumentAndJGE(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_IncrementDoorHitCounterAndJGE(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_JumpIfSamusHasNoBombs(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_LoadItemPlmGfx(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_MovePlmDownOneBlock(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_MovePlmDownOneBlock_0(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_MovePlmRight4Blocks(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_MoveUpAndMakeBlueDoorFacingLeft(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_MoveUpAndMakeBlueDoorFacingRight(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_PickupBeamAndShowMessage(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_PickupEquipmentAddGrappleShowMessage(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_PickupEquipmentAddXrayShowMessage(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_PickupEquipmentAndShowMessage(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_PlaceSamusOnSaveStation(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_PreInstr(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_ProcessAirScrollUpdate(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_ProcessSolidScrollUpdate(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_QueueMusic(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_QueueSfx1_Max1(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_QueueSfx1_Max15(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_QueueSfx1_Max3(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_QueueSfx1_Max6(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_QueueSfx1_Max9(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_QueueSfx2_Max1(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_QueueSfx2_Max15(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_QueueSfx2_Max3(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_QueueSfx2_Max6(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_QueueSfx2_Max9(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_QueueSfx3_Max1(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_QueueSfx3_Max15(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_QueueSfx3_Max6(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_QueueSfx3_Max9(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_QueueSfx_Max3(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_QueueSong1MusicTrack(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_Return(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_Scroll_0_1_Blue(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_SetBTS(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_SetBtsTo1(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_SetCrittersEscapedEvent(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_SetEvent(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_SetGreyDoorPreInstr(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_SetItemBit(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_SetLinkReg(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_SetRoomChozoBit(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_SetTimer(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_ShootEyeDoorProjectileWithProjectileArg(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_Sleep(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_Spawn10shardsAnd6n00bs(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_SpawnEnemyProjectile(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_SpawnEyeDoorSmokeProjectile(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_SpawnEyeDoorSweatEnemyProjectile(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_SpawnFourMotherBrainGlass(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_SpawnN00bTubeCrackEnemyProjectile(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_SpawnTorizoStatueBreaking(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_SpawnTwoEyeDoorSmoke(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_TransferWreckedShipChozoSpikesToSlopes(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_TransferWreckedShipSlopesToChozoSpikes(const uint8 *plmp, uint16 k); +const uint8 *PlmInstr_WakeEnemyProjectileAtPlmPos(const uint8 *plmp, uint16 k); uint16 SetBtsTo0x10AdvanceRow(uint16 k); uint16 SetBtsTo0x10AdvanceRowUp(uint16 k); uint8 ActivateStationIfSamusCannonLinedUp(uint16 a, uint16 j); @@ -1491,9 +1490,9 @@ uint16 CalculateCrystalFlashHdmaDataTablesScaled_RightOfScreen(uint16 k, uint16 void CalculateCrystalFlashHdmaObjectTablePtrs(uint16 k); void CalculatePowerBombHdmaObjectTablePtrs(uint16 k); void CalculatePowerBombHdmaTablePointers(uint16 k); -void CalculatePowerBombHdma_LeftOfScreen(uint16 k, uint16 j); -void CalculatePowerBombHdma_OnScreen(uint16 k, uint16 j); -void CalculatePowerBombHdma_RightOfScreen(uint16 k, uint16 j); +void CalculatePowerBombHdma_LeftOfScreen(uint16 k, const uint8 *j); +void CalculatePowerBombHdma_OnScreen(uint16 k, const uint8 *j); +void CalculatePowerBombHdma_RightOfScreen(uint16 k, const uint8 *j); void CalculateXrayHdmaTable(void); void CinematicFunction_Intro_Func133(void); void CrystalFlashCleanup(uint16 k); @@ -3113,7 +3112,7 @@ void BlockInsideReact_SpecialAir_9(void); void BlockInsideReact_SpecialAir_Default(void); void BlockInsideReact_SpikeAir_BTS2(void); void BombOrPowerBomb_Func1(uint16 k); -void CalculateBlockAt(void); +void CalculateBlockAt(uint16 r26, uint16 r28, uint16 r30, uint16 r32); void ClearCarry_8(void); void DrawGrappleOams(uint16 j); void DrawGrappleOams2(void); @@ -3210,21 +3209,20 @@ uint16 DetermineDirectionOfSamusFromEnemy(void); uint16 EnemyFunc_AC67(uint16 k); uint16 EnemyFunc_ACA8(void); uint16 EnemyFunc_ADA3(uint16 a); -uint16 EnemyInstr_ClearAiPreInstr(uint16 k, uint16 j); -uint16 EnemyInstr_CopyToVram(uint16 k, uint16 j); -uint16 EnemyInstr_DecTimerAndGoto(uint16 k, uint16 j); -uint16 EnemyInstr_DecTimerAndGoto2(uint16 k, uint16 j); -uint16 EnemyInstr_DecTimerAndGotoRel(uint16 k, uint16 j); -uint16 EnemyInstr_DisableOffScreenProcessing(uint16 k, uint16 j); -uint16 EnemyInstr_EnableOffScreenProcessing(uint16 k, uint16 j); -uint16 EnemyInstr_Goto(uint16 k, uint16 j); -uint16 EnemyInstr_GotoRel(uint16 k, uint16 j); -uint16 EnemyInstr_SetAiPreInstr(uint16 k, uint16 j); -uint16 EnemyInstr_SetTimer(uint16 k, uint16 j); -uint16 EnemyInstr_Skip2bytes(uint16 k, uint16 j); -uint16 EnemyInstr_Sleep(uint16 k, uint16 j); -uint16 EnemyInstr_StopScript(uint16 k, uint16 j); -uint16 EnemyInstr_WaitNframes(uint16 k, uint16 j); +const uint16 *EnemyInstr_ClearAiPreInstr(uint16 k, const uint16 *jp); +const uint16 *EnemyInstr_CopyToVram(uint16 k, const uint16 *jp); +const uint16 *EnemyInstr_DecTimerAndGoto(uint16 k, const uint16 *jp); +const uint16 *EnemyInstr_DecTimerAndGotoRel(uint16 k, const uint16 *jp); +const uint16 *EnemyInstr_DisableOffScreenProcessing(uint16 k, const uint16 *jp); +const uint16 *EnemyInstr_EnableOffScreenProcessing(uint16 k, const uint16 *jp); +const uint16 *EnemyInstr_Goto(uint16 k, const uint16 *jp); +const uint16 *EnemyInstr_GotoRel(uint16 k, const uint16 *jp); +const uint16 *EnemyInstr_SetAiPreInstr(uint16 k, const uint16 *jp); +const uint16 *EnemyInstr_SetTimer(uint16 k, const uint16 *jp); +const uint16 *EnemyInstr_Skip2bytes(uint16 k, const uint16 *jp); +const uint16 *EnemyInstr_Sleep(uint16 k, const uint16 *jp); +const uint16 *EnemyInstr_StopScript(uint16 k, const uint16 *jp); +const uint16 *EnemyInstr_WaitNframes(uint16 k, const uint16 *jp); uint16 EnemyWithNormalSpritesIsOffScreen(void); uint16 GetSamusEnemyDelta_X(uint16 k); uint16 GetSamusEnemyDelta_Y(uint16 k); @@ -3270,7 +3268,6 @@ void ClearEnemyDataAndProcessEnemySet(void); void ConvertAngleToXy(void); void CreateADudShot(void); void CreateDudShot(void); -void DebugLoadEnemySetData(void); void DecrementSamusTimers(void); void DeleteEnemyAndConnectedEnemies(void); void DetermineWhichEnemiesToProcess(void); @@ -3361,59 +3358,53 @@ void TransferEnemyTilesToVramAndInit(void); void WriteEnemyOams(void); // Bank A2 -uint16 BouncingGoofball_Instr_88C5(uint16 k, uint16 j); -uint16 BouncingGoofball_Instr_88C6(uint16 k, uint16 j); +const uint16 *BouncingGoofball_Instr_88C5(uint16 k, const uint16 *jp); +const uint16 *BouncingGoofball_Instr_88C6(uint16 k, const uint16 *jp); uint16 BouncingGoofball_SamusCloseX(void); -uint16 EnemyInstr_DecTimerAndGoto2_A2(uint16 k, uint16 j); -uint16 EnemyInstr_DisableOffScreenProcessing_A2(uint16 k, uint16 j); -uint16 EnemyInstr_EnableOffScreenProcessing_A2(uint16 k, uint16 j); -uint16 EnemyInstr_Goto_A2(uint16 k, uint16 j); -uint16 EnemyInstr_Rio_Instr_1(uint16 k, uint16 j); -uint16 EnemyInstr_SetTimer_A2(uint16 k, uint16 j); -uint16 EnemyInstr_Sleep_A2(uint16 k, uint16 j); +const uint16 *EnemyInstr_Rio_Instr_1(uint16 k, const uint16 *jp); uint16 Flies_2(uint16 k); -uint16 LavaSeahorse_Instr_E5FB(uint16 k, uint16 j); -uint16 LowerNorfairRio_Instr_C6D2(uint16 k, uint16 j); -uint16 LowerNorfairRio_Instr_C6DD(uint16 k, uint16 j); -uint16 LowerNorfairRio_Instr_C6E8(uint16 k, uint16 j); -uint16 MaridiaBeybladeTurtle_Instr_9381(uint16 k, uint16 j); -uint16 MaridiaBeybladeTurtle_Instr_9412(uint16 k, uint16 j); -uint16 MaridiaBeybladeTurtle_Instr_9447(uint16 k, uint16 j); -uint16 MaridiaBeybladeTurtle_Instr_9451(uint16 k, uint16 j); -uint16 MaridiaBeybladeTurtle_Instr_946B(uint16 k, uint16 j); -uint16 MaridiaBeybladeTurtle_Instr_9485(uint16 k, uint16 j); -uint16 MaridiaBeybladeTurtle_Instr_94A1(uint16 k, uint16 j); -uint16 MaridiaBeybladeTurtle_Instr_94C7(uint16 k, uint16 j); -uint16 MaridiaBeybladeTurtle_Instr_94D1(uint16 k, uint16 j); -uint16 MaridiaLargeSnail_Instr_CB6B(uint16 k, uint16 j); -uint16 MaridiaLargeSnail_Instr_CCB3(uint16 k, uint16 j); -uint16 MaridiaLargeSnail_Instr_CCBE(uint16 k, uint16 j); -uint16 MaridiaLargeSnail_Instr_CCC9(uint16 k, uint16 j); -uint16 MaridiaSpikeyShell_Instr_A56D(uint16 k, uint16 j); -uint16 MaridiaSpikeyShell_Instr_A571(uint16 k, uint16 j); -uint16 MiniCrocomire_Instr_897E(uint16 k, uint16 j); -uint16 MiniCrocomire_Instr_8990(uint16 k, uint16 j); -uint16 MiniCrocomire_Instr_899D(uint16 k, uint16 j); -uint16 NorfairLavajumpingEnemy_Instr_BE8E(uint16 k, uint16 j); -uint16 NorfairRio_Instr_C1C9(uint16 k, uint16 j); -uint16 NorfairRio_Instr_C1D4(uint16 k, uint16 j); -uint16 NorfairRio_Instr_C1DF(uint16 k, uint16 j); -uint16 NorfairRio_Instr_C1EA(uint16 k, uint16 j); -uint16 NorfairRio_Instr_C1F5(uint16 k, uint16 j); -uint16 NorfairRio_Instr_C200(uint16 k, uint16 j); -uint16 NorfairRio_Instr_C20B(uint16 k, uint16 j); -uint16 NorfairRio_Instr_C216(uint16 k, uint16 j); -uint16 NorfairRio_Instr_C221(uint16 k, uint16 j); -uint16 NorfairRio_Instr_C22C(uint16 k, uint16 j); -uint16 NorfairRio_Instr_C237(uint16 k, uint16 j); +const uint16 *LavaSeahorse_Instr_E5FB(uint16 k, const uint16 *jp); +const uint16 *LowerNorfairRio_Instr_C6D2(uint16 k, const uint16 *jp); +const uint16 *LowerNorfairRio_Instr_C6DD(uint16 k, const uint16 *jp); +const uint16 *LowerNorfairRio_Instr_C6E8(uint16 k, const uint16 *jp); +const uint16 *MaridiaBeybladeTurtle_Instr_9381(uint16 k, const uint16 *jp); +const uint16 *MaridiaBeybladeTurtle_Instr_9412(uint16 k, const uint16 *jp); +const uint16 *MaridiaBeybladeTurtle_Instr_9447(uint16 k, const uint16 *jp); +const uint16 *MaridiaBeybladeTurtle_Instr_9451(uint16 k, const uint16 *jp); +const uint16 *MaridiaBeybladeTurtle_Instr_946B(uint16 k, const uint16 *jp); +const uint16 *MaridiaBeybladeTurtle_Instr_9485(uint16 k, const uint16 *jp); +const uint16 *MaridiaBeybladeTurtle_Instr_94A1(uint16 k, const uint16 *jp); +const uint16 *MaridiaBeybladeTurtle_Instr_94C7(uint16 k, const uint16 *jp); +const uint16 *MaridiaBeybladeTurtle_Instr_94D1(uint16 k, const uint16 *jp); +const uint16 *MaridiaLargeSnail_Instr_CB6B(uint16 k, const uint16 *jp); +const uint16 *MaridiaLargeSnail_Instr_CCB3(uint16 k, const uint16 *jp); +const uint16 *MaridiaLargeSnail_Instr_CCBE(uint16 k, const uint16 *jp); +const uint16 *MaridiaLargeSnail_Instr_CCC9(uint16 k, const uint16 *jp); +const uint16 *MaridiaSpikeyShell_Instr_A56D(uint16 k, const uint16 *jp); +const uint16 *MaridiaSpikeyShell_Instr_A571(uint16 k, const uint16 *jp); +const uint16 *MiniCrocomire_Instr_897E(uint16 k, const uint16 *jp); +const uint16 *MiniCrocomire_Instr_8990(uint16 k, const uint16 *jp); +const uint16 *MiniCrocomire_Instr_899D(uint16 k, const uint16 *jp); +const uint16 *NorfairLavajumpingEnemy_Instr_BE8E(uint16 k, const uint16 *jp); +const uint16 *NorfairRio_Instr_C1C9(uint16 k, const uint16 *jp); +const uint16 *NorfairRio_Instr_C1D4(uint16 k, const uint16 *jp); +const uint16 *NorfairRio_Instr_C1DF(uint16 k, const uint16 *jp); +const uint16 *NorfairRio_Instr_C1EA(uint16 k, const uint16 *jp); +const uint16 *NorfairRio_Instr_C1F5(uint16 k, const uint16 *jp); +const uint16 *NorfairRio_Instr_C200(uint16 k, const uint16 *jp); +const uint16 *NorfairRio_Instr_C20B(uint16 k, const uint16 *jp); +const uint16 *NorfairRio_Instr_C216(uint16 k, const uint16 *jp); +const uint16 *NorfairRio_Instr_C221(uint16 k, const uint16 *jp); +const uint16 *NorfairRio_Instr_C22C(uint16 k, const uint16 *jp); +const uint16 *NorfairRio_Instr_C237(uint16 k, const uint16 *jp); uint16 Rinka_2(uint16 k); uint16 Rinka_Instr_B9A2(uint16 k, uint16 j); -uint16 Rinka_Instr_B9B3(uint16 k, uint16 j); -uint16 Rinka_Instr_B9BD(uint16 k, uint16 j); -uint16 Rinka_Instr_B9C7(uint16 k, uint16 j); -uint16 SpikeShootingPlant_Instr_9F2A(uint16 k, uint16 j); -uint16 SpikeShootingPlant_Instr_A095(uint16 k, uint16 j); -uint16 SpikeShootingPlant_Instr_A0A7(uint16 k, uint16 j); +const uint16 *Rinka_Instr_B9B3(uint16 k, const uint16 *jp); +const uint16 *Rinka_Instr_B9BD(uint16 k, const uint16 *jp); +const uint16 *Rinka_Instr_B9C7(uint16 k, const uint16 *jp); +const uint16 *SpikeShootingPlant_Instr_9F2A(uint16 k, const uint16 *jp); +const uint16 *SpikeShootingPlant_Instr_A095(uint16 k, const uint16 *jp); +const uint16 *SpikeShootingPlant_Instr_A0A7(uint16 k, const uint16 *jp); uint8 Gripper_Func_1(uint16 k); uint8 Gripper_Func_2(uint16 k); uint8 MiniCrocomire_Func9(void); @@ -3706,38 +3697,34 @@ void sub_A29A6C(uint16 a); // Bank A3 uint16 Bang_Func_4(uint16 a); -uint16 Bang_Instr_1(uint16 k, uint16 j); -uint16 Bang_Instr_2(uint16 k, uint16 j); -uint16 EnemyInstr_DisableOffScreenProcessing_A3(uint16 k, uint16 j); -uint16 EnemyInstr_EnableOffScreenProcessing_A3(uint16 k, uint16 j); -uint16 EnemyInstr_Goto_A3(uint16 k, uint16 j); -uint16 EnemyInstr_Sleep_A3(uint16 k, uint16 j); -uint16 MaridiaFish_Instr_1(uint16 k, uint16 j); -uint16 MaridiaFish_Instr_2(uint16 k, uint16 j); -uint16 MaridiaFish_Instr_3(uint16 k, uint16 j); -uint16 MaridiaRefillCandy_Instr_1(uint16 k, uint16 j); -uint16 MaridiaRefillCandy_Instr_2(uint16 k, uint16 j); -uint16 MaridiaRefillCandy_Instr_3(uint16 k, uint16 j); -uint16 MaridiaSnail_Instr_1(uint16 k, uint16 j); -uint16 MaridiaSnail_Instr_2(uint16 k, uint16 j); -uint16 MaridiaSnail_Instr_3(uint16 k, uint16 j); -uint16 MaridiaSnail_Instr_4(uint16 k, uint16 j); -uint16 MaridiaSnail_Instr_5(uint16 k, uint16 j); -uint16 Metalee_Instr_1(uint16 k, uint16 j); -uint16 Metroid_Instr_1(uint16 k, uint16 j); -uint16 Metroid_Instr_2(uint16 k, uint16 j); -uint16 PlatformThatFallsWithSamus_Instr_1(uint16 k, uint16 j); -uint16 PlatformThatFallsWithSamus_Instr_2(uint16 k, uint16 j); -uint16 PlatformThatFallsWithSamus_Instr_3(uint16 k, uint16 j); -uint16 PlatformThatFallsWithSamus_Instr_4(uint16 k, uint16 j); -uint16 Reflec_Instr_1(uint16 k, uint16 j); -uint16 Sidehopper_Func_1(uint16 k, uint16 j); +const uint16 *Bang_Instr_1(uint16 k, const uint16 *jp); +const uint16 *Bang_Instr_2(uint16 k, const uint16 *jp); +const uint16 *MaridiaFish_Instr_1(uint16 k, const uint16 *jp); +const uint16 *MaridiaFish_Instr_2(uint16 k, const uint16 *jp); +const uint16 *MaridiaFish_Instr_3(uint16 k, const uint16 *jp); +const uint16 *MaridiaRefillCandy_Instr_1(uint16 k, const uint16 *jp); +const uint16 *MaridiaRefillCandy_Instr_2(uint16 k, const uint16 *jp); +const uint16 *MaridiaRefillCandy_Instr_3(uint16 k, const uint16 *jp); +const uint16 *MaridiaSnail_Instr_1(uint16 k, const uint16 *jp); +const uint16 *MaridiaSnail_Instr_2(uint16 k, const uint16 *jp); +const uint16 *MaridiaSnail_Instr_3(uint16 k, const uint16 *jp); +const uint16 *MaridiaSnail_Instr_4(uint16 k, const uint16 *jp); +const uint16 *MaridiaSnail_Instr_5(uint16 k, const uint16 *jp); +const uint16 *Metalee_Instr_1(uint16 k, const uint16 *jp); +const uint16 *Metroid_Instr_1(uint16 k, const uint16 *jp); +const uint16 *Metroid_Instr_2(uint16 k, const uint16 *jp); +const uint16 *PlatformThatFallsWithSamus_Instr_1(uint16 k, const uint16 *jp); +const uint16 *PlatformThatFallsWithSamus_Instr_2(uint16 k, const uint16 *jp); +const uint16 *PlatformThatFallsWithSamus_Instr_3(uint16 k, const uint16 *jp); +const uint16 *PlatformThatFallsWithSamus_Instr_4(uint16 k, const uint16 *jp); +const uint16 *Reflec_Instr_1(uint16 k, const uint16 *jp); +const uint16 *Sidehopper_Func_1(uint16 k, const uint16 *jp); uint16 Sidehopper_Func_2(void); -uint16 Sidehopper_Instr_1(uint16 k, uint16 j); -uint16 Skree_Instr_1(uint16 k, uint16 j); -uint16 Waver_Instr_1(uint16 k, uint16 j); -uint16 WreckedShipOrangeZoomer_Func_1(uint16 k, uint16 j); -uint16 Zoomer_Instr_SetPreinstr(uint16 k, uint16 j); +const uint16 *Sidehopper_Instr_1(uint16 k, const uint16 *jp); +const uint16 *Skree_Instr_1(uint16 k, const uint16 *jp); +const uint16 *Waver_Instr_1(uint16 k, const uint16 *jp); +const uint16 *WreckedShipOrangeZoomer_Func_1(uint16 k, const uint16 *jp); +const uint16 *Zoomer_Instr_SetPreinstr(uint16 k, const uint16 *jp); uint8 MaridiaSnail_Func_17(uint16 k); uint8 MaridiaSnail_Func_18(uint16 k); uint8 MaridiaSnail_Func_19(uint16 k); @@ -3983,61 +3970,59 @@ void WreckedShipOrangeZoomer_Main(void); void sub_A3E168(uint16 k); // Bank A4 -uint16 Crocomire_Func_10(uint16 k, uint16 j); -uint16 Crocomire_Func_11(uint16 k, uint16 j); -uint16 Crocomire_Func_12(uint16 k, uint16 j); -uint16 Crocomire_Func_13(uint16 k, uint16 j); -uint16 Crocomire_Func_14(uint16 k, uint16 j); -uint16 Crocomire_Func_15(uint16 k, uint16 j); -uint16 Crocomire_Func_16(uint16 k, uint16 j); -uint16 Crocomire_Func_17(uint16 k, uint16 j); -uint16 Crocomire_Func_18(uint16 k, uint16 j); -uint16 Crocomire_Func_19(uint16 k, uint16 j); -uint16 Crocomire_Func_2(uint16 k, uint16 j); -uint16 Crocomire_Func_20(uint16 k); -uint16 Crocomire_Func_21(uint16 k, uint16 j); -uint16 Crocomire_Func_22(uint16 k, uint16 j); -uint16 Crocomire_Func_23(uint16 k, uint16 j); -uint16 Crocomire_Func_24(uint16 k, uint16 j); -uint16 Crocomire_Func_25(uint16 k, uint16 j); -uint16 Crocomire_Func_26(uint16 k, uint16 j); -uint16 Crocomire_Func_3(uint16 k, uint16 j); -uint16 Crocomire_Func_4(uint16 k, uint16 j); -uint16 Crocomire_Func_5(uint16 k, uint16 j); +const uint16 *Crocomire_Func_10(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Func_11(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Func_12(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Func_13(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Func_14(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Func_15(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Func_16(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Func_17(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Func_18(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Func_19(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Func_2(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Func_20(uint16 k); +const uint16 *Crocomire_Func_21(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Func_22(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Func_23(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Func_24(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Func_25(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Func_26(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Func_3(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Func_4(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Func_5(uint16 k, const uint16 *jp); uint16 Crocomire_Func_67(void); -uint16 Crocomire_Func_7(uint16 k, uint16 j); -uint16 Crocomire_Func_8(uint16 k, uint16 j); -uint16 Crocomire_Func_87(uint16 j, uint16 a); -uint16 Crocomire_Func_9(uint16 k, uint16 j); -uint16 Crocomire_Instr_1(uint16 k, uint16 j); -uint16 Crocomire_Instr_10(uint16 k, uint16 j); -uint16 Crocomire_Instr_11(uint16 k, uint16 j); -uint16 Crocomire_Instr_12(uint16 k, uint16 j); -uint16 Crocomire_Instr_13(uint16 k, uint16 j); -uint16 Crocomire_Instr_14(uint16 k, uint16 j); -uint16 Crocomire_Instr_15(uint16 k, uint16 j); -uint16 Crocomire_Instr_16(uint16 k, uint16 j); -uint16 Crocomire_Instr_17(uint16 k, uint16 j); -uint16 Crocomire_Instr_18(uint16 k, uint16 j); -uint16 Crocomire_Instr_19(uint16 k, uint16 j); -uint16 Crocomire_Instr_2(uint16 k, uint16 j); -uint16 Crocomire_Instr_20(uint16 k, uint16 j); -uint16 Crocomire_Instr_21(uint16 k, uint16 j); -uint16 Crocomire_Instr_22(uint16 k, uint16 j); -uint16 Crocomire_Instr_23(uint16 k, uint16 j); -uint16 Crocomire_Instr_24(uint16 k, uint16 j); -uint16 Crocomire_Instr_25(uint16 k, uint16 j); -uint16 Crocomire_Instr_26(uint16 k, uint16 j); -uint16 Crocomire_Instr_27(uint16 k, uint16 j); -uint16 Crocomire_Instr_3(uint16 k, uint16 j); -uint16 Crocomire_Instr_4(uint16 k, uint16 j); -uint16 Crocomire_Instr_5(uint16 k, uint16 j); -uint16 Crocomire_Instr_6(uint16 k, uint16 j); -uint16 Crocomire_Instr_7(uint16 k, uint16 j); -uint16 Crocomire_Instr_8(uint16 k, uint16 j); -uint16 Crocomire_Instr_9(uint16 k, uint16 j); -uint16 EnemyInstr_Goto_A4(uint16 k, uint16 j); -uint16 EnemyInstr_Sleep_A4(uint16 k, uint16 j); +const uint16 *Crocomire_Func_7(uint16 k, const uint16 *j); +const uint16 *Crocomire_Func_8(uint16 k, const uint16 *j); +const uint16 *Crocomire_Func_87(const uint16 *jp, uint16 a); +const uint16 *Crocomire_Func_9(uint16 k, const uint16 *j); +const uint16 *Crocomire_Instr_1(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Instr_10(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Instr_11(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Instr_12(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Instr_13(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Instr_14(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Instr_15(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Instr_16(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Instr_17(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Instr_18(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Instr_19(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Instr_2(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Instr_20(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Instr_21(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Instr_22(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Instr_23(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Instr_24(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Instr_25(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Instr_26(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Instr_27(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Instr_3(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Instr_4(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Instr_5(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Instr_6(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Instr_7(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Instr_8(uint16 k, const uint16 *jp); +const uint16 *Crocomire_Instr_9(uint16 k, const uint16 *jp); void CrocomireTongue_Init(void); void CrocomireTongue_Main(void); void Crocomire_8BA4(void); @@ -4107,45 +4092,36 @@ void Enemy_NormalTouchAI_A4(void); void GetCurEnemyIndex(void); // Bank A5 -uint16 Draygon_Instr_1(uint16 k, uint16 j); -uint16 Draygon_Instr_10(uint16 k, uint16 j); -uint16 Draygon_Instr_11(uint16 k, uint16 j); -uint16 Draygon_Instr_12(uint16 k, uint16 j); -uint16 Draygon_Instr_13(uint16 k, uint16 j); -uint16 Draygon_Instr_14(uint16 k, uint16 j); -uint16 Draygon_Instr_15(uint16 k, uint16 j); -uint16 Draygon_Instr_16(uint16 k, uint16 j); -uint16 Draygon_Instr_17(uint16 k, uint16 j); -uint16 Draygon_Instr_18(uint16 k, uint16 j); -uint16 Draygon_Instr_19(uint16 k, uint16 j); -uint16 Draygon_Instr_2(uint16 k, uint16 j); -uint16 Draygon_Instr_20(uint16 k, uint16 j); -uint16 Draygon_Instr_21(uint16 k, uint16 j); -uint16 Draygon_Instr_22(uint16 k, uint16 j); -uint16 Draygon_Instr_23(uint16 k, uint16 j); -uint16 Draygon_Instr_24(uint16 k, uint16 j); -uint16 Draygon_Instr_25(uint16 k, uint16 j); -uint16 Draygon_Instr_26(uint16 k, uint16 j); -uint16 Draygon_Instr_27(uint16 k, uint16 j); -uint16 Draygon_Instr_28(uint16 k, uint16 j); -uint16 Draygon_Instr_29(uint16 k, uint16 j); -uint16 Draygon_Instr_3(uint16 k, uint16 j); -uint16 Draygon_Instr_30(uint16 k, uint16 j); -uint16 Draygon_Instr_4(uint16 k, uint16 j); -uint16 Draygon_Instr_5(uint16 k, uint16 j); -uint16 Draygon_Instr_53(uint16 k, uint16 j); -uint16 Draygon_Instr_54(uint16 k, uint16 j); -uint16 Draygon_Instr_55(uint16 k, uint16 j); -uint16 Draygon_Instr_6(uint16 k, uint16 j); -uint16 Draygon_Instr_7(uint16 k, uint16 j); -uint16 Draygon_Instr_8(uint16 k, uint16 j); -uint16 Draygon_Instr_9(uint16 k, uint16 j); -uint16 EnemyInstr_DecTimerAndGoto2_A5(uint16 k, uint16 j); -uint16 EnemyInstr_Goto_A5(uint16 k, uint16 j); -uint16 EnemyInstr_SetTimer_A5(uint16 k, uint16 j); -uint16 EnemyInstr_Sleep_A5(uint16 k, uint16 j); -uint16 EnemyInstr_StopScript_A5(uint16 k, uint16 j); -uint16 EnemyInstr_WaitNframes_A5(uint16 k, uint16 j); +const uint16 *Draygon_Instr_1(uint16 k, const uint16 *jp); +const uint16 *Draygon_Instr_10(uint16 k, const uint16 *jp); +const uint16 *Draygon_Instr_11(uint16 k, const uint16 *jp); +const uint16 *Draygon_Instr_12(uint16 k, const uint16 *jp); +const uint16 *Draygon_Instr_13(uint16 k, const uint16 *jp); +const uint16 *Draygon_Instr_14(uint16 k, const uint16 *jp); +const uint16 *Draygon_Instr_15(uint16 k, const uint16 *jp); +const uint16 *Draygon_Instr_16(uint16 k, const uint16 *jp); +const uint16 *Draygon_Instr_17(uint16 k, const uint16 *jp); +const uint16 *Draygon_Instr_18(uint16 k, const uint16 *jp); +const uint16 *Draygon_Instr_19(uint16 k, const uint16 *jp); +const uint16 *Draygon_Instr_2(uint16 k, const uint16 *jp); +const uint16 *Draygon_Instr_20(uint16 k, const uint16 *jp); +const uint16 *Draygon_Instr_21(uint16 k, const uint16 *jp); +const uint16 *Draygon_Instr_22(uint16 k, const uint16 *jp); +const uint16 *Draygon_Instr_23(uint16 k, const uint16 *jp); +const uint16 *Draygon_Instr_24(uint16 k, const uint16 *jp); +const uint16 *Draygon_Instr_25(uint16 k, const uint16 *jp); +const uint16 *Draygon_Instr_26(uint16 k, const uint16 *jp); +const uint16 *Draygon_Instr_27(uint16 k, const uint16 *jp); +const uint16 *Draygon_Instr_28(uint16 k, const uint16 *jp); +const uint16 *Draygon_Instr_29(uint16 k, const uint16 *jp); +const uint16 *Draygon_Instr_3(uint16 k, const uint16 *jp); +const uint16 *Draygon_Instr_30(uint16 k, const uint16 *jp); +const uint16 *Draygon_Instr_4(uint16 k, const uint16 *jp); +const uint16 *Draygon_Instr_5(uint16 k, const uint16 *jp); +const uint16 *Draygon_Instr_6(uint16 k, const uint16 *jp); +const uint16 *Draygon_Instr_7(uint16 k, const uint16 *jp); +const uint16 *Draygon_Instr_8(uint16 k, const uint16 *jp); +const uint16 *Draygon_Instr_9(uint16 k, const uint16 *jp); void CreateADudShot_A5(void); void Draygon_Func_1(void); void Draygon_Func_10(void); @@ -4230,86 +4206,78 @@ void sub_A5960D(void); void sub_A5E9F5(void); // Bank A6 -uint16 BabyMetroid_DBCB_DoubleRet(uint16 a); -uint16 BabyMetroid_Incr2(uint16 k); uint16 BabyMetroid_Instr_1(uint16 k); uint16 BabyMetroid_Instr_2(uint16 k); uint16 BabyMetroid_Instr_3(uint16 k); -uint16 BabyMetroid_Instr_4(uint16 k); -uint16 CeresDoor_Goto(uint16 j); -uint16 CeresDoor_Incr(uint16 j); -uint16 CeresDoor_Instr_1(uint16 k, uint16 j); -uint16 CeresDoor_Instr_2(uint16 k, uint16 j); -uint16 CeresDoor_Instr_3(uint16 k, uint16 j); -uint16 CeresDoor_Instr_4(uint16 k, uint16 j); -uint16 CeresDoor_Instr_5(uint16 k, uint16 j); -uint16 CeresDoor_Instr_6(uint16 k, uint16 j); -uint16 CeresDoor_Instr_7(uint16 k, uint16 j); -uint16 CeresDoor_Instr_8(uint16 k, uint16 j); +uint16 BabyMetroid_Goto(uint16 k); +const uint16 *CeresDoor_Instr_1(uint16 k, const uint16 *jp); +const uint16 *CeresDoor_Instr_2(uint16 k, const uint16 *jp); +const uint16 *CeresDoor_Instr_3(uint16 k, const uint16 *jp); +const uint16 *CeresDoor_Instr_4(uint16 k, const uint16 *jp); +const uint16 *CeresDoor_Instr_5(uint16 k, const uint16 *jp); +const uint16 *CeresDoor_Instr_6(uint16 k, const uint16 *jp); +const uint16 *CeresDoor_Instr_7(uint16 k, const uint16 *jp); +const uint16 *CeresDoor_Instr_8(uint16 k, const uint16 *jp); uint16 CeresRidley_AC30(uint16 a); uint16 CeresRidley_Func_30(uint16 a); uint16 CeresRidley_Func_31(uint16 a); -uint16 CeresSteam_Instr_1(uint16 k, uint16 j); -uint16 CeresSteam_Instr_2(uint16 k, uint16 j); -uint16 CeresSteam_Instr_3(uint16 k, uint16 j); -uint16 CeresSteam_Instr_4(uint16 k, uint16 j); -uint16 CeresSteam_Instr_5(uint16 k, uint16 j); -uint16 EnemyInstr_Goto_A6(uint16 k, uint16 j); -uint16 EnemyInstr_Sleep_A6(uint16 k, uint16 j); -uint16 FakeKraid_Instr_1(uint16 k, uint16 j); -uint16 FakeKraid_Instr_2(uint16 k, uint16 j); -uint16 FakeKraid_Instr_3(uint16 k, uint16 j); -uint16 FakeKraid_Instr_4(uint16 k, uint16 j); -uint16 FakeKraid_Instr_5(uint16 k, uint16 j); -uint16 FireGeyser_Instr_1(uint16 k, uint16 j); -uint16 FireGeyser_Instr_10(uint16 k, uint16 j); -uint16 FireGeyser_Instr_11(uint16 k, uint16 j); -uint16 FireGeyser_Instr_12(uint16 k, uint16 j); -uint16 FireGeyser_Instr_13(uint16 k, uint16 j); -uint16 FireGeyser_Instr_14(uint16 k, uint16 j); -uint16 FireGeyser_Instr_15(uint16 k, uint16 j); -uint16 FireGeyser_Instr_16(uint16 k, uint16 j); -uint16 FireGeyser_Instr_17(uint16 k, uint16 j); -uint16 FireGeyser_Instr_18(uint16 k, uint16 j); -uint16 FireGeyser_Instr_19(uint16 k, uint16 j); -uint16 FireGeyser_Instr_2(uint16 k, uint16 j); -uint16 FireGeyser_Instr_20(uint16 k, uint16 j); -uint16 FireGeyser_Instr_21(uint16 k, uint16 j); -uint16 FireGeyser_Instr_22(uint16 k, uint16 j); -uint16 FireGeyser_Instr_23(uint16 k, uint16 j); -uint16 FireGeyser_Instr_24(uint16 k, uint16 j); -uint16 FireGeyser_Instr_3(uint16 k, uint16 j); -uint16 FireGeyser_Instr_4(uint16 k, uint16 j); -uint16 FireGeyser_Instr_5(uint16 k, uint16 j); -uint16 FireGeyser_Instr_6(uint16 k, uint16 j); -uint16 FireGeyser_Instr_7(uint16 k, uint16 j); -uint16 FireGeyser_Instr_8(uint16 k, uint16 j); -uint16 FireGeyser_Instr_9(uint16 k, uint16 j); +const uint16 *CeresSteam_Instr_1(uint16 k, const uint16 *jp); +const uint16 *CeresSteam_Instr_2(uint16 k, const uint16 *jp); +const uint16 *CeresSteam_Instr_3(uint16 k, const uint16 *jp); +const uint16 *CeresSteam_Instr_4(uint16 k, const uint16 *jp); +const uint16 *CeresSteam_Instr_5(uint16 k, const uint16 *jp); +const uint16 *FakeKraid_Instr_1(uint16 k, const uint16 *jp); +const uint16 *FakeKraid_Instr_2(uint16 k, const uint16 *jp); +const uint16 *FakeKraid_Instr_3(uint16 k, const uint16 *jp); +const uint16 *FakeKraid_Instr_4(uint16 k, const uint16 *jp); +const uint16 *FakeKraid_Instr_5(uint16 k, const uint16 *jp); +const uint16 *FireGeyser_Instr_1(uint16 k, const uint16 *jp); +const uint16 *FireGeyser_Instr_10(uint16 k, const uint16 *jp); +const uint16 *FireGeyser_Instr_11(uint16 k, const uint16 *jp); +const uint16 *FireGeyser_Instr_12(uint16 k, const uint16 *jp); +const uint16 *FireGeyser_Instr_13(uint16 k, const uint16 *jp); +const uint16 *FireGeyser_Instr_14(uint16 k, const uint16 *jp); +const uint16 *FireGeyser_Instr_15(uint16 k, const uint16 *jp); +const uint16 *FireGeyser_Instr_16(uint16 k, const uint16 *jp); +const uint16 *FireGeyser_Instr_17(uint16 k, const uint16 *jp); +const uint16 *FireGeyser_Instr_18(uint16 k, const uint16 *jp); +const uint16 *FireGeyser_Instr_19(uint16 k, const uint16 *jp); +const uint16 *FireGeyser_Instr_2(uint16 k, const uint16 *jp); +const uint16 *FireGeyser_Instr_20(uint16 k, const uint16 *jp); +const uint16 *FireGeyser_Instr_21(uint16 k, const uint16 *jp); +const uint16 *FireGeyser_Instr_22(uint16 k, const uint16 *jp); +const uint16 *FireGeyser_Instr_23(uint16 k, const uint16 *jp); +const uint16 *FireGeyser_Instr_24(uint16 k, const uint16 *jp); +const uint16 *FireGeyser_Instr_3(uint16 k, const uint16 *jp); +const uint16 *FireGeyser_Instr_4(uint16 k, const uint16 *jp); +const uint16 *FireGeyser_Instr_5(uint16 k, const uint16 *jp); +const uint16 *FireGeyser_Instr_6(uint16 k, const uint16 *jp); +const uint16 *FireGeyser_Instr_7(uint16 k, const uint16 *jp); +const uint16 *FireGeyser_Instr_8(uint16 k, const uint16 *jp); +const uint16 *FireGeyser_Instr_9(uint16 k, const uint16 *jp); uint16 NuclearWaffle_Func_5(uint16 a); uint16 NuclearWaffle_Func_6(uint16 a); -uint16 Ridley_E90C(uint16 k, uint16 j, uint16 a); +const uint16 *Ridley_E90C(uint16 k, const uint16 *j, uint16 a); uint16 Ridley_Func_122(void); uint16 Ridley_Func_7(void); -uint16 Ridley_Instr_1(uint16 k, uint16 j); -uint16 Ridley_Instr_10(uint16 k, uint16 j); -uint16 Ridley_Instr_11(uint16 k, uint16 j); -uint16 Ridley_Instr_12(uint16 k, uint16 j); -uint16 Ridley_Instr_13(uint16 k, uint16 j); -uint16 Ridley_Instr_14(uint16 k, uint16 j); -uint16 Ridley_Instr_15(uint16 k, uint16 j); -uint16 Ridley_Instr_16(uint16 k, uint16 j); -uint16 Ridley_Instr_2(uint16 k, uint16 j); -uint16 Ridley_Instr_3(uint16 k, uint16 j); -uint16 Ridley_Instr_4(uint16 k, uint16 j); -uint16 Ridley_Instr_5(uint16 k, uint16 j); -uint16 Ridley_Instr_6(uint16 k, uint16 j); -uint16 Ridley_Instr_7(uint16 k, uint16 j); -uint16 Ridley_Instr_8(uint16 k, uint16 j); -uint16 Ridley_Instr_9(uint16 k, uint16 j); +const uint16 *Ridley_Instr_1(uint16 k, const uint16 *jp); +const uint16 *Ridley_Instr_10(uint16 k, const uint16 *jp); +const uint16 *Ridley_Instr_11(uint16 k, const uint16 *jp); +const uint16 *Ridley_Instr_12(uint16 k, const uint16 *jp); +const uint16 *Ridley_Instr_13(uint16 k, const uint16 *jp); +const uint16 *Ridley_Instr_14(uint16 k, const uint16 *jp); +const uint16 *Ridley_Instr_15(uint16 k, const uint16 *jp); +const uint16 *Ridley_Instr_16(uint16 k, const uint16 *jp); +const uint16 *Ridley_Instr_2(uint16 k, const uint16 *jp); +const uint16 *Ridley_Instr_3(uint16 k, const uint16 *jp); +const uint16 *Ridley_Instr_4(uint16 k, const uint16 *jp); +const uint16 *Ridley_Instr_5(uint16 k, const uint16 *jp); +const uint16 *Ridley_Instr_6(uint16 k, const uint16 *jp); +const uint16 *Ridley_Instr_7(uint16 k, const uint16 *jp); +const uint16 *Ridley_Instr_8(uint16 k, const uint16 *jp); +const uint16 *Ridley_Instr_9(uint16 k, const uint16 *jp); uint16 SpikeyPlatform_Func_5(uint16 k); uint16 Zebetites_Func_9(void); -uint16 sub_A6E4E9(uint16 j); -uint16 sub_A6E514(uint16 j); uint8 CeresRidley_Func_12(void); uint8 CeresRidley_Func_8(uint16 a); uint8 HandleTypewriterText(void); @@ -4589,22 +4557,18 @@ void sub_A6DF60(void); // Bank A7 PairU16 Phantoon_SetColorBasedOnHp_FindEntry(uint16 k); -uint16 EnemyInstr_Call_A7(uint16 k, uint16 j); -uint16 EnemyInstr_DecTimerAndGoto2_A7(uint16 k, uint16 j); -uint16 EnemyInstr_Goto_A7(uint16 k, uint16 j); -uint16 EnemyInstr_SetTimer_A7(uint16 k, uint16 j); -uint16 EnemyInstr_Sleep_A7(uint16 k, uint16 j); +const uint16 *EnemyInstr_Call_A7(uint16 k, const uint16 *jp); uint16 Kraid_CheckIfDead(void); uint16 Kraid_ExecuteInstr(void); -uint16 Kraid_Instr_1(uint16 k, uint16 j); -uint16 Kraid_Instr_9(uint16 k, uint16 j); -uint16 Kraid_Instr_DecYpos(uint16 k, uint16 j); -uint16 Kraid_Instr_IncrYpos_Shake(uint16 k, uint16 j); -uint16 Kraid_Instr_MoveHimRight(uint16 k, uint16 j); -uint16 Kraid_Instr_PlaySound_0x76(uint16 k, uint16 j); -uint16 Kraid_Instr_XposMinus3(uint16 k, uint16 j); -uint16 Kraid_Instr_XposMinus3b(uint16 k, uint16 j); -uint16 Kraid_Instr_XposPlus3(uint16 k, uint16 j); +const uint16 *Kraid_Instr_1(uint16 k, const uint16 *jp); +const uint16 *Kraid_Instr_9(uint16 k, const uint16 *jp); +const uint16 *Kraid_Instr_DecYpos(uint16 k, const uint16 *jp); +const uint16 *Kraid_Instr_IncrYpos_Shake(uint16 k, const uint16 *jp); +const uint16 *Kraid_Instr_MoveHimRight(uint16 k, const uint16 *jp); +const uint16 *Kraid_Instr_PlaySound_0x76(uint16 k, const uint16 *jp); +const uint16 *Kraid_Instr_XposMinus3(uint16 k, const uint16 *jp); +const uint16 *Kraid_Instr_XposMinus3b(uint16 k, const uint16 *jp); +const uint16 *Kraid_Instr_XposPlus3(uint16 k, const uint16 *jp); uint16 Kraid_ProcessKraidInstr(void); uint16 Phantoon_CalculateNthTransitionColorComponentFromXtoY(uint16 a, uint16 k, uint16 j); uint16 Phantoon_Func_10_CalculateNthTransitionColorFromXtoY(uint16 a, uint16 k, uint16 j); @@ -4836,86 +4800,80 @@ void sub_A7A92A(void); // Bank A8 uint16 Beetom_Func_2(void); -uint16 Beetom_Instr_1(uint16 k, uint16 j); -uint16 EnemyInstr_DecTimerAndGoto2_A8(uint16 k, uint16 j); -uint16 EnemyInstr_DisableOffScreenProcessing_A8(uint16 k, uint16 j); -uint16 EnemyInstr_EnableOffScreenProcessing_A8(uint16 k, uint16 j); -uint16 EnemyInstr_Goto_A8(uint16 k, uint16 j); -uint16 EnemyInstr_SetTimer_A8(uint16 k, uint16 j); -uint16 EnemyInstr_Sleep_A8(uint16 k, uint16 j); +const uint16 *Beetom_Instr_1(uint16 k, const uint16 *jp); uint16 Fune_Func_3(void); -uint16 Fune_Instr_1(uint16 k, uint16 j); -uint16 Fune_Instr_2(uint16 k, uint16 j); -uint16 Fune_Instr_3(uint16 k, uint16 j); -uint16 Fune_Instr_4(uint16 k, uint16 j); -uint16 Fune_Instr_5(uint16 k, uint16 j); -uint16 Fune_Instr_6(uint16 k, uint16 j); -uint16 Fune_Instr_7(uint16 k, uint16 j); -uint16 KiHunter_Instr_1(uint16 k, uint16 j); -uint16 KiHunter_Instr_2(uint16 k, uint16 j); -uint16 KiHunter_Instr_3(uint16 k, uint16 j); -uint16 KiHunter_Instr_4(uint16 k, uint16 j); -uint16 KiHunter_Instr_5(uint16 k, uint16 j); -uint16 MiniDraygon_Instr_1(uint16 k, uint16 j); -uint16 MiniDraygon_Instr_2(uint16 k, uint16 j); -uint16 MiniDraygon_Instr_3(uint16 k, uint16 j); -uint16 MiniDraygon_Instr_4(uint16 k, uint16 j); -uint16 NorfairLavaMan_Instr_1(uint16 k, uint16 j); -uint16 NorfairLavaMan_Instr_10(uint16 k, uint16 j); -uint16 NorfairLavaMan_Instr_11(uint16 k, uint16 j); -uint16 NorfairLavaMan_Instr_12(uint16 k, uint16 j); -uint16 NorfairLavaMan_Instr_13(uint16 k, uint16 j); -uint16 NorfairLavaMan_Instr_14(uint16 k, uint16 j); -uint16 NorfairLavaMan_Instr_15(uint16 k, uint16 j); -uint16 NorfairLavaMan_Instr_16(uint16 k, uint16 j); -uint16 NorfairLavaMan_Instr_2(uint16 k, uint16 j); -uint16 NorfairLavaMan_Instr_3(uint16 k, uint16 j); -uint16 NorfairLavaMan_Instr_4(uint16 k, uint16 j); -uint16 NorfairLavaMan_Instr_5(uint16 k, uint16 j); -uint16 NorfairLavaMan_Instr_6(uint16 k, uint16 j); -uint16 NorfairLavaMan_Instr_7(uint16 k, uint16 j); -uint16 NorfairLavaMan_Instr_8(uint16 k, uint16 j); -uint16 NorfairLavaMan_Instr_9(uint16 k, uint16 j); +const uint16 *Fune_Instr_1(uint16 k, const uint16 *jp); +const uint16 *Fune_Instr_2(uint16 k, const uint16 *jp); +const uint16 *Fune_Instr_3(uint16 k, const uint16 *jp); +const uint16 *Fune_Instr_4(uint16 k, const uint16 *jp); +const uint16 *Fune_Instr_5(uint16 k, const uint16 *jp); +const uint16 *Fune_Instr_6(uint16 k, const uint16 *jp); +const uint16 *Fune_Instr_7(uint16 k, const uint16 *jp); +const uint16 *KiHunter_Instr_1(uint16 k, const uint16 *jp); +const uint16 *KiHunter_Instr_2(uint16 k, const uint16 *jp); +const uint16 *KiHunter_Instr_3(uint16 k, const uint16 *jp); +const uint16 *KiHunter_Instr_4(uint16 k, const uint16 *jp); +const uint16 *KiHunter_Instr_5(uint16 k, const uint16 *jp); +const uint16 *MiniDraygon_Instr_1(uint16 k, const uint16 *jp); +const uint16 *MiniDraygon_Instr_2(uint16 k, const uint16 *jp); +const uint16 *MiniDraygon_Instr_3(uint16 k, const uint16 *jp); +const uint16 *MiniDraygon_Instr_4(uint16 k, const uint16 *jp); +const uint16 *NorfairLavaMan_Instr_1(uint16 k, const uint16 *jp); +const uint16 *NorfairLavaMan_Instr_10(uint16 k, const uint16 *jp); +const uint16 *NorfairLavaMan_Instr_11(uint16 k, const uint16 *jp); +const uint16 *NorfairLavaMan_Instr_12(uint16 k, const uint16 *jp); +const uint16 *NorfairLavaMan_Instr_13(uint16 k, const uint16 *jp); +const uint16 *NorfairLavaMan_Instr_14(uint16 k, const uint16 *jp); +const uint16 *NorfairLavaMan_Instr_15(uint16 k, const uint16 *jp); +const uint16 *NorfairLavaMan_Instr_16(uint16 k, const uint16 *jp); +const uint16 *NorfairLavaMan_Instr_2(uint16 k, const uint16 *jp); +const uint16 *NorfairLavaMan_Instr_3(uint16 k, const uint16 *jp); +const uint16 *NorfairLavaMan_Instr_4(uint16 k, const uint16 *jp); +const uint16 *NorfairLavaMan_Instr_5(uint16 k, const uint16 *jp); +const uint16 *NorfairLavaMan_Instr_6(uint16 k, const uint16 *jp); +const uint16 *NorfairLavaMan_Instr_7(uint16 k, const uint16 *jp); +const uint16 *NorfairLavaMan_Instr_8(uint16 k, const uint16 *jp); +const uint16 *NorfairLavaMan_Instr_9(uint16 k, const uint16 *jp); uint16 WalkingLavaSeahorse_Func_2(uint16 k); -uint16 WalkingLavaSeahorse_Instr_1(uint16 k, uint16 j); -uint16 WalkingLavaSeahorse_Instr_2(uint16 k, uint16 j); -uint16 WalkingLavaSeahorse_Instr_3(uint16 k, uint16 j); -uint16 WalkingLavaSeahorse_Instr_4(uint16 k, uint16 j); -uint16 WalkingLavaSeahorse_Instr_5(uint16 k, uint16 j); -uint16 WalkingLavaSeahorse_Instr_6(uint16 k, uint16 j); +const uint16 *WalkingLavaSeahorse_Instr_1(uint16 k, const uint16 *jp); +const uint16 *WalkingLavaSeahorse_Instr_2(uint16 k, const uint16 *jp); +const uint16 *WalkingLavaSeahorse_Instr_3(uint16 k, const uint16 *jp); +const uint16 *WalkingLavaSeahorse_Instr_4(uint16 k, const uint16 *jp); +const uint16 *WalkingLavaSeahorse_Instr_5(uint16 k, const uint16 *jp); +const uint16 *WalkingLavaSeahorse_Instr_6(uint16 k, const uint16 *jp); uint16 WreckedShipGhost_Func_8(void); -uint16 WreckedShipRobot_CommonInstr(uint16 k, uint16 j); -uint16 WreckedShipRobot_D10C(uint16 k, uint16 j); -uint16 WreckedShipRobot_D147(uint16 k, uint16 j); -uint16 WreckedShipRobot_Instr_1(uint16 k, uint16 j); -uint16 WreckedShipRobot_Instr_10(uint16 k, uint16 j); -uint16 WreckedShipRobot_Instr_11(uint16 k, uint16 j); -uint16 WreckedShipRobot_Instr_12(uint16 k, uint16 j); -uint16 WreckedShipRobot_Instr_13(uint16 k, uint16 j); -uint16 WreckedShipRobot_Instr_14(uint16 k, uint16 j); -uint16 WreckedShipRobot_Instr_15(uint16 k, uint16 j); -uint16 WreckedShipRobot_Instr_16(uint16 k, uint16 j); -uint16 WreckedShipRobot_Instr_17(uint16 k, uint16 j); -uint16 WreckedShipRobot_Instr_18(uint16 k, uint16 j); -uint16 WreckedShipRobot_Instr_2(uint16 k, uint16 j); -uint16 WreckedShipRobot_Instr_3(uint16 k, uint16 j); -uint16 WreckedShipRobot_Instr_4(uint16 k, uint16 j); -uint16 WreckedShipRobot_Instr_5(uint16 k, uint16 j); -uint16 WreckedShipRobot_Instr_6(uint16 k, uint16 j); -uint16 WreckedShipRobot_Instr_7(uint16 k, uint16 j); -uint16 WreckedShipRobot_Instr_8(uint16 k, uint16 j); -uint16 WreckedShipRobot_Instr_9(uint16 k, uint16 j); -uint16 WreckedShipSpark_Instr_1(uint16 k, uint16 j); -uint16 WreckedShipSpark_Instr_2(uint16 k, uint16 j); +const uint16 *WreckedShipRobot_CommonInstr(uint16 k, const uint16 *jp); +const uint16 *WreckedShipRobot_D10C(uint16 k, const uint16 *jp); +const uint16 *WreckedShipRobot_D147(uint16 k, const uint16 *jp); +const uint16 *WreckedShipRobot_Instr_1(uint16 k, const uint16 *jp); +const uint16 *WreckedShipRobot_Instr_10(uint16 k, const uint16 *jp); +const uint16 *WreckedShipRobot_Instr_11(uint16 k, const uint16 *jp); +const uint16 *WreckedShipRobot_Instr_12(uint16 k, const uint16 *jp); +const uint16 *WreckedShipRobot_Instr_13(uint16 k, const uint16 *jp); +const uint16 *WreckedShipRobot_Instr_14(uint16 k, const uint16 *jp); +const uint16 *WreckedShipRobot_Instr_15(uint16 k, const uint16 *jp); +const uint16 *WreckedShipRobot_Instr_16(uint16 k, const uint16 *jp); +const uint16 *WreckedShipRobot_Instr_17(uint16 k, const uint16 *jp); +const uint16 *WreckedShipRobot_Instr_18(uint16 k, const uint16 *jp); +const uint16 *WreckedShipRobot_Instr_2(uint16 k, const uint16 *jp); +const uint16 *WreckedShipRobot_Instr_3(uint16 k, const uint16 *jp); +const uint16 *WreckedShipRobot_Instr_4(uint16 k, const uint16 *jp); +const uint16 *WreckedShipRobot_Instr_5(uint16 k, const uint16 *jp); +const uint16 *WreckedShipRobot_Instr_6(uint16 k, const uint16 *jp); +const uint16 *WreckedShipRobot_Instr_7(uint16 k, const uint16 *jp); +const uint16 *WreckedShipRobot_Instr_8(uint16 k, const uint16 *jp); +const uint16 *WreckedShipRobot_Instr_9(uint16 k, const uint16 *jp); +const uint16 *WreckedShipSpark_Instr_1(uint16 k, const uint16 *jp); +const uint16 *WreckedShipSpark_Instr_2(uint16 k, const uint16 *jp); uint16 YappingMaw_Func_16(uint16 a); uint16 YappingMaw_Func_17(uint16 a); -uint16 YappingMaw_Instr_1(uint16 k, uint16 j); -uint16 YappingMaw_Instr_2(uint16 k, uint16 j); -uint16 YappingMaw_Instr_3(uint16 k, uint16 j); -uint16 YappingMaw_Instr_4(uint16 k, uint16 j); -uint16 YappingMaw_Instr_5(uint16 k, uint16 j); -uint16 YappingMaw_Instr_6(uint16 k, uint16 j); -uint16 YappingMaw_Instr_7(uint16 k, uint16 j); +const uint16 *YappingMaw_Instr_1(uint16 k, const uint16 *jp); +const uint16 *YappingMaw_Instr_2(uint16 k, const uint16 *jp); +const uint16 *YappingMaw_Instr_3(uint16 k, const uint16 *jp); +const uint16 *YappingMaw_Instr_4(uint16 k, const uint16 *jp); +const uint16 *YappingMaw_Instr_5(uint16 k, const uint16 *jp); +const uint16 *YappingMaw_Instr_6(uint16 k, const uint16 *jp); +const uint16 *YappingMaw_Instr_7(uint16 k, const uint16 *jp); void Beetom_Func_1(void); void Beetom_Func_10(void); void Beetom_Func_11(void); @@ -5161,72 +5119,71 @@ void sub_A8F6DC(uint16 k, uint16 j); // Bank A9 uint16 ComputeCosMult(uint16 a); uint16 ComputeSinMult(uint16 a); -uint16 EnemyInstr_Sleep_A9(uint16 k, uint16 j); -uint16 HandleRoomPaletteInstructionList(uint16 a); +uint16 HandleMotherBrainInstructionList(uint16 a); uint16 MotherBrain_DetermineShotReactionType(void); uint16 MotherBrain_Func_1_DoubleRetTmp(void); uint16 MotherBrain_Instr_AimRingsAtSamus(uint16 k); uint16 MotherBrain_Instr_AimRingsAtShitroid(uint16 k); uint16 MotherBrain_Instr_DisableNeckMovement(uint16 k); -uint16 MotherBrain_Instr_Down2Right15(uint16 k, uint16 j); -uint16 MotherBrain_Instr_Down4Right6(uint16 k, uint16 j); +const uint16 *MotherBrain_Instr_Down2Right15(uint16 k, const uint16 *jp); +const uint16 *MotherBrain_Instr_Down4Right6(uint16 k, const uint16 *jp); uint16 MotherBrain_Instr_EnableNeckMovementGoto(uint16 k); uint16 MotherBrain_Instr_Goto(uint16 k); uint16 MotherBrain_Instr_Goto2(uint16 k); uint16 MotherBrain_Instr_GotoEitherOr(uint16 k); -uint16 MotherBrain_Instr_IncrBeamAttackPhase(uint16 k, uint16 j); +const uint16 *MotherBrain_Instr_IncrBeamAttackPhase(uint16 k, const uint16 *jp); uint16 MotherBrain_Instr_IncrShitroidAttackCtr(uint16 k); uint16 MotherBrain_Instr_MaybeGoto(uint16 k); uint16 MotherBrain_Instr_MaybeGoto2(uint16 k); -uint16 MotherBrain_Instr_MoveBodyUp10Left4(uint16 k, uint16 j); -uint16 MotherBrain_Instr_MoveBodyUp12Right2(uint16 k, uint16 j); -uint16 MotherBrain_Instr_MoveBodyUp16Left4(uint16 k, uint16 j); -uint16 MotherBrain_Instr_MoveDown1(uint16 k, uint16 j); -uint16 MotherBrain_Instr_MoveDown10Right2(uint16 k, uint16 j); -uint16 MotherBrain_Instr_MoveDown12Left4(uint16 k, uint16 j); -uint16 MotherBrain_Instr_MoveDown16Right2(uint16 k, uint16 j); -uint16 MotherBrain_Instr_MoveDown1Left3(uint16 k, uint16 j); -uint16 MotherBrain_Instr_MoveDown2Right1(uint16 k, uint16 j); -uint16 MotherBrain_Instr_MoveDown4Right2(uint16 k, uint16 j); -uint16 MotherBrain_Instr_MoveLeft2(uint16 k, uint16 j); -uint16 MotherBrain_Instr_MoveRight2(uint16 k, uint16 j); -uint16 MotherBrain_Instr_MoveUp1(uint16 k, uint16 j); -uint16 MotherBrain_Instr_MoveUp1Right3_Sfx(uint16 k, uint16 j); -uint16 MotherBrain_Instr_MoveUp2Left15_Sfx(uint16 k, uint16 j); -uint16 MotherBrain_Instr_MoveUp2Right1(uint16 k, uint16 j); -uint16 MotherBrain_Instr_MoveUp4Left6(uint16 k, uint16 j); +const uint16 *MotherBrain_Instr_MoveBodyUp10Left4(uint16 k, const uint16 *jp); +const uint16 *MotherBrain_Instr_MoveBodyUp12Right2(uint16 k, const uint16 *jp); +const uint16 *MotherBrain_Instr_MoveBodyUp16Left4(uint16 k, const uint16 *jp); +const uint16 *MotherBrain_Instr_MoveDown1(uint16 k, const uint16 *jp); +const uint16 *MotherBrain_Instr_MoveDown10Right2(uint16 k, const uint16 *jp); +const uint16 *MotherBrain_Instr_MoveDown12Left4(uint16 k, const uint16 *jp); +const uint16 *MotherBrain_Instr_MoveDown16Right2(uint16 k, const uint16 *jp); +const uint16 *MotherBrain_Instr_MoveDown1Left3(uint16 k, const uint16 *jp); +const uint16 *MotherBrain_Instr_MoveDown2Right1(uint16 k, const uint16 *jp); +const uint16 *MotherBrain_Instr_MoveDown4Right2(uint16 k, const uint16 *jp); +const uint16 *MotherBrain_Instr_MoveLeft2(uint16 k, const uint16 *jp); +const uint16 *MotherBrain_Instr_MoveRight2(uint16 k, const uint16 *jp); +const uint16 *MotherBrain_Instr_MoveUp1(uint16 k, const uint16 *jp); +const uint16 *MotherBrain_Instr_MoveUp1Right3_Sfx(uint16 k, const uint16 *jp); +const uint16 *MotherBrain_Instr_MoveUp2Left15_Sfx(uint16 k, const uint16 *jp); +const uint16 *MotherBrain_Instr_MoveUp2Right1(uint16 k, const uint16 *jp); +const uint16 *MotherBrain_Instr_MoveUp4Left6(uint16 k, const uint16 *jp); uint16 MotherBrain_Instr_QueueSfx2(uint16 k); uint16 MotherBrain_Instr_QueueSfx3(uint16 k); uint16 MotherBrain_Instr_QueueShitroidAttackSfx(uint16 k); uint16 MotherBrain_Instr_SetMainShakeTimer50(uint16 k); -uint16 MotherBrain_Instr_SetPose_Crouched(uint16 k, uint16 j); -uint16 MotherBrain_Instr_SetPose_CrouchedTrans(uint16 k, uint16 j); -uint16 MotherBrain_Instr_SetPose_DeathBeamMode(uint16 k, uint16 j); -uint16 MotherBrain_Instr_SetPose_LeaningDown(uint16 k, uint16 j); -uint16 MotherBrain_Instr_SetPose_Standing(uint16 k, uint16 j); -uint16 MotherBrain_Instr_SetPose_Walking(uint16 k, uint16 j); +const uint16 *MotherBrain_Instr_SetPose_Crouched(uint16 k, const uint16 *jp); +const uint16 *MotherBrain_Instr_SetPose_CrouchedTrans(uint16 k, const uint16 *jp); +const uint16 *MotherBrain_Instr_SetPose_DeathBeamMode(uint16 k, const uint16 *jp); +const uint16 *MotherBrain_Instr_SetPose_LeaningDown(uint16 k, const uint16 *jp); +const uint16 *MotherBrain_Instr_SetPose_Standing(uint16 k, const uint16 *jp); +const uint16 *MotherBrain_Instr_SetPose_Walking(uint16 k, const uint16 *jp); uint16 MotherBrain_Instr_SetShitroidAttackCtr0(uint16 k); uint16 MotherBrain_Instr_SetupFxForRainbowBeam(uint16 k); uint16 MotherBrain_Instr_SpawnBlueRingEproj(uint16 k); uint16 MotherBrain_Instr_SpawnBombEproj(uint16 k); -uint16 MotherBrain_Instr_SpawnDeathBeamEproj(uint16 k, uint16 j); +const uint16 *MotherBrain_Instr_SpawnDeathBeamEproj(uint16 k, const uint16 *jp); uint16 MotherBrain_Instr_SpawnDroolEproj(uint16 k); -uint16 MotherBrain_Instr_SpawnEprojToOffset(uint16 k, uint16 j); +const uint16 *MotherBrain_Instr_SpawnEprojToOffset(uint16 k, const uint16 *jp); uint16 MotherBrain_Instr_SpawnLaserEproj(uint16 k); uint16 MotherBrain_Instr_SpawnPurpleBreath(uint16 k); uint16 MotherBrain_Instr_SpawnRainbowEproj(uint16 k); -uint16 MotherBrain_Instr_Up2Left1_Sfx(uint16 k, uint16 j); -uint16 MotherBrain_Instr_Up2Left1_Sfx2(uint16 k, uint16 j); -uint16 MotherBrain_Instr_Up4Left2(uint16 k, uint16 j); +const uint16 *MotherBrain_Instr_Up2Left1_Sfx(uint16 k, const uint16 *jp); +const uint16 *MotherBrain_Instr_Up2Left1_Sfx2(uint16 k, const uint16 *jp); +const uint16 *MotherBrain_Instr_Up4Left2(uint16 k, const uint16 *jp); uint16 Shitroid_HandleCrySoundEffect(uint16 k, uint16 a); -uint16 Shitroid_Instr_1(uint16 k, uint16 j); -uint16 Shitroid_Instr_2(uint16 k, uint16 j); -uint16 Shitroid_Instr_3(uint16 k, uint16 j); -uint16 Shitroid_Instr_4(uint16 k, uint16 j); -uint16 Shitroid_Instr_5(uint16 k, uint16 j); -uint16 Shitroid_Instr_6(uint16 k, uint16 j); +const uint16 *Shitroid_Instr_1(uint16 k, const uint16 *jp); +const uint16 *Shitroid_Instr_2(uint16 k, const uint16 *jp); +const uint16 *Shitroid_Instr_3(uint16 k, const uint16 *jp); +const uint16 *Shitroid_Instr_4(uint16 k, const uint16 *jp); +const uint16 *Shitroid_Instr_5(uint16 k, const uint16 *jp); +const uint16 *Shitroid_Instr_6(uint16 k, const uint16 *jp); uint16 sub_A9C46C(uint16 a, uint16 j); -uint16 sub_A9ECD0(uint16 k, uint16 j); +const uint16 *sub_A9ECD0(uint16 k, const uint16 *jp); uint8 DeadMonsters_Func_3(uint16 k); uint8 DeadTorizo_Func_0(void); uint8 MotherBrain_MakeHerCrouch(void); @@ -5250,7 +5207,7 @@ uint8 Shitroid_CheckIfOnScreen(uint16 k); uint8 Shitroid_Func_1(uint16 k, uint16 j); uint8 Shitroid_Func_2(uint16 k); uint8 Shitroid_Func_27(uint16 k); -void CopyMoveCorpseRottingRotEntry(uint16 a); +void CopyMoveCorpseRottingRotEntry(LongPtr r20, uint16 a); void CorpseRottingRotEntryFinishedHook(void); void DeadMonsters_Func_1(uint16 k); void DeadMonsters_Func_2(uint16 k); @@ -5306,7 +5263,7 @@ void Enemy_IncreaseYpos(uint16 k, uint16 a); void Enemy_NormalFrozenAI_A9(void); void Enemy_SetInstrList(uint16 k, uint16 a); void HandleSamusRainbowPaletteAnimation(uint16 k); -void InitializeCorpseRottingDataTable(uint16 k, uint16 a); +void InitializeCorpseRottingDataTable(uint16 *table, uint16 a); void InitializeEnemyCorpseRotting(uint16 k, uint16 j); void MotherBomb_FiringDeathBeam(void); void MotherBomb_FiringDeathBeam_0(void); @@ -5665,94 +5622,87 @@ void Zoomer_CorpseRottingMoveFunc_2(uint16 j, uint16 k); void Zoomer_CorpseRottingMoveFunc_4(uint16 j, uint16 k); // Bank AA -uint16 EnemyInstr_CopyToVram_AA(uint16 k, uint16 j); -uint16 EnemyInstr_DecTimerAndGoto2_AA(uint16 k, uint16 j); -uint16 EnemyInstr_Goto_AA(uint16 k, uint16 j); -uint16 EnemyInstr_SetTimer_AA(uint16 k, uint16 j); -uint16 EnemyInstr_Sleep_AA(uint16 k, uint16 j); -uint16 EnemyInstr_StopScript_AA(uint16 k, uint16 j); -uint16 EnemyInstr_WaitNframes_AA(uint16 k, uint16 j); -uint16 Enemy_ClearAiPreInstr_AA(uint16 k, uint16 j); -uint16 Enemy_SetAiPreInstr_AA(uint16 k, uint16 j); -uint16 Shaktool_D956(uint16 k, uint16 j, uint16 a); -uint16 Shaktool_Instr_1(uint16 k, uint16 j); -uint16 Shaktool_Instr_10(uint16 k, uint16 j); -uint16 Shaktool_Instr_11(uint16 k, uint16 j); -uint16 Shaktool_Instr_12(uint16 k, uint16 j); -uint16 Shaktool_Instr_13(uint16 k, uint16 j); -uint16 Shaktool_Instr_14(uint16 k, uint16 j); -uint16 Shaktool_Instr_2(uint16 k, uint16 j); -uint16 Shaktool_Instr_3(uint16 k, uint16 j); -uint16 Shaktool_Instr_4(uint16 k, uint16 j); -uint16 Shaktool_Instr_5(uint16 k, uint16 j); -uint16 Shaktool_Instr_6(uint16 k, uint16 j); -uint16 Shaktool_Instr_7(uint16 k, uint16 j); -uint16 Shaktool_Instr_8(uint16 k, uint16 j); -uint16 Shaktool_Instr_9(uint16 k, uint16 j); +const uint16 *Enemy_ClearAiPreInstr_AA(uint16 k, const uint16 *jp); +const uint16 *Enemy_SetAiPreInstr_AA(uint16 k, const uint16 *jp); +const uint16 *Shaktool_D956(uint16 k, const uint16 *j, uint16 a); +const uint16 *Shaktool_Instr_1(uint16 k, const uint16 *jp); +const uint16 *Shaktool_Instr_10(uint16 k, const uint16 *jp); +const uint16 *Shaktool_Instr_11(uint16 k, const uint16 *jp); +const uint16 *Shaktool_Instr_12(uint16 k, const uint16 *jp); +const uint16 *Shaktool_Instr_13(uint16 k, const uint16 *jp); +const uint16 *Shaktool_Instr_14(uint16 k, const uint16 *jp); +const uint16 *Shaktool_Instr_2(uint16 k, const uint16 *jp); +const uint16 *Shaktool_Instr_3(uint16 k, const uint16 *jp); +const uint16 *Shaktool_Instr_4(uint16 k, const uint16 *jp); +const uint16 *Shaktool_Instr_5(uint16 k, const uint16 *jp); +const uint16 *Shaktool_Instr_6(uint16 k, const uint16 *jp); +const uint16 *Shaktool_Instr_7(uint16 k, const uint16 *jp); +const uint16 *Shaktool_Instr_8(uint16 k, const uint16 *jp); +const uint16 *Shaktool_Instr_9(uint16 k, const uint16 *jp); uint16 Torizo_Func_12(uint16 k); -uint16 Torizo_Instr_1(uint16 k, uint16 j); -uint16 Torizo_Instr_10(uint16 k, uint16 j); -uint16 Torizo_Instr_11(uint16 k, uint16 j); -uint16 Torizo_Instr_12(uint16 k, uint16 j); -uint16 Torizo_Instr_13(uint16 k, uint16 j); -uint16 Torizo_Instr_14(uint16 k, uint16 j); -uint16 Torizo_Instr_15(uint16 k, uint16 j); -uint16 Torizo_Instr_16(uint16 k, uint16 j); -uint16 Torizo_Instr_17(uint16 k, uint16 j); -uint16 Torizo_Instr_18(uint16 k, uint16 j); -uint16 Torizo_Instr_19(uint16 k, uint16 j); -uint16 Torizo_Instr_2(uint16 k, uint16 j); -uint16 Torizo_Instr_20(uint16 k, uint16 j); -uint16 Torizo_Instr_21(uint16 k, uint16 j); -uint16 Torizo_Instr_22(uint16 k, uint16 j); -uint16 Torizo_Instr_23(uint16 k, uint16 j); -uint16 Torizo_Instr_24(uint16 k, uint16 j); -uint16 Torizo_Instr_25(uint16 k, uint16 j); -uint16 Torizo_Instr_26(uint16 k, uint16 j); -uint16 Torizo_Instr_27(uint16 k, uint16 j); -uint16 Torizo_Instr_28(uint16 k, uint16 j); -uint16 Torizo_Instr_29(uint16 k, uint16 j); -uint16 Torizo_Instr_3(uint16 k, uint16 j); -uint16 Torizo_Instr_30(uint16 k, uint16 j); -uint16 Torizo_Instr_31(uint16 k, uint16 j); -uint16 Torizo_Instr_32(uint16 k, uint16 j); -uint16 Torizo_Instr_33(uint16 k, uint16 j); -uint16 Torizo_Instr_34(uint16 k, uint16 j); -uint16 Torizo_Instr_35(uint16 k, uint16 j); -uint16 Torizo_Instr_36(uint16 k, uint16 j); -uint16 Torizo_Instr_37(uint16 k, uint16 j); -uint16 Torizo_Instr_38(uint16 k, uint16 j); -uint16 Torizo_Instr_39(uint16 k, uint16 j); -uint16 Torizo_Instr_4(uint16 k, uint16 j); -uint16 Torizo_Instr_40(uint16 k, uint16 j); -uint16 Torizo_Instr_41(uint16 k, uint16 j); -uint16 Torizo_Instr_42(uint16 k, uint16 j); -uint16 Torizo_Instr_43(uint16 k, uint16 j); -uint16 Torizo_Instr_44(uint16 k, uint16 j); -uint16 Torizo_Instr_45(uint16 k, uint16 j); -uint16 Torizo_Instr_46(uint16 k, uint16 j); -uint16 Torizo_Instr_47(uint16 k, uint16 j); -uint16 Torizo_Instr_48(uint16 k, uint16 j); -uint16 Torizo_Instr_49(uint16 k, uint16 j); -uint16 Torizo_Instr_5(uint16 k, uint16 j); -uint16 Torizo_Instr_50(uint16 k, uint16 j); -uint16 Torizo_Instr_51(uint16 k, uint16 j); -uint16 Torizo_Instr_52(uint16 k, uint16 j); -uint16 Torizo_Instr_53(uint16 k, uint16 j); -uint16 Torizo_Instr_54(uint16 k, uint16 j); -uint16 Torizo_Instr_55(uint16 k, uint16 j); -uint16 Torizo_Instr_56(uint16 k, uint16 j); -uint16 Torizo_Instr_57(uint16 k, uint16 j); -uint16 Torizo_Instr_58(uint16 k, uint16 j); -uint16 Torizo_Instr_59(uint16 k, uint16 j); -uint16 Torizo_Instr_6(uint16 k, uint16 j); -uint16 Torizo_Instr_60(uint16 k, uint16 j); -uint16 Torizo_Instr_61(uint16 k, uint16 j); -uint16 Torizo_Instr_62(uint16 k, uint16 j); -uint16 Torizo_Instr_63(uint16 k, uint16 j); -uint16 Torizo_Instr_7(uint16 k, uint16 j); -uint16 Torizo_Instr_8(uint16 k, uint16 j); -uint16 Torizo_Instr_9(uint16 k, uint16 j); +const uint16 *Torizo_Instr_1(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_10(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_11(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_12(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_13(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_14(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_15(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_16(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_17(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_18(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_19(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_2(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_20(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_21(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_22(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_23(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_24(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_25(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_26(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_27(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_28(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_29(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_3(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_30(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_31(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_32(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_33(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_34(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_35(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_36(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_37(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_38(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_39(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_4(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_40(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_41(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_42(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_43(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_44(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_45(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_46(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_47(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_48(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_49(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_5(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_50(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_51(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_52(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_53(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_54(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_55(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_56(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_57(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_58(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_59(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_6(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_60(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_61(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_62(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_63(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_7(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_8(uint16 k, const uint16 *jp); +const uint16 *Torizo_Instr_9(uint16 k, const uint16 *jp); void ChozoStatue_Init(void); void ChozoStatue_Main(void); void Enemy_GrappleReact_CancelBeam_AA(void); @@ -5840,35 +5790,30 @@ void MotherBrain_SealWall(void); void TurnOffLightsForShitroidDeath(void); // Bank B2 -uint16 EnemyInstr_DecTimerAndGoto2_B2(uint16 k, uint16 j); -uint16 EnemyInstr_Goto_B2(uint16 k, uint16 j); -uint16 EnemyInstr_SetTimer_B2(uint16 k, uint16 j); -uint16 EnemyInstr_Sleep_B2(uint16 k, uint16 j); -uint16 EnemyInstr_WaitNframes_B2(uint16 k, uint16 j); uint16 SpacePirates_Func_10(void); uint16 SpacePirates_Func_8(void); uint16 SpacePirates_Func_9(void); -uint16 SpacePirates_Instr_11(uint16 k, uint16 j); -uint16 SpacePirates_Instr_12(uint16 k, uint16 j); -uint16 SpacePirates_Instr_13(uint16 k, uint16 j); -uint16 SpacePirates_Instr_14(uint16 k, uint16 j); -uint16 SpacePirates_Instr_15(uint16 k, uint16 j); -uint16 SpacePirates_Instr_16(uint16 k, uint16 j); -uint16 SpacePirates_Instr_17(uint16 k, uint16 j); -uint16 SpacePirates_Instr_18(uint16 k, uint16 j); -uint16 SpacePirates_Instr_19(uint16 k, uint16 j); -uint16 SpacePirates_Instr_20(uint16 k, uint16 j); -uint16 SpacePirates_Instr_21(uint16 k, uint16 j); -uint16 SpacePirates_Instr_FireLaserL(uint16 k, uint16 j); -uint16 SpacePirates_Instr_FireLaserR(uint16 k, uint16 j); -uint16 SpacePirates_Instr_MovePixelsDownAndChangeDirFaceLeft(uint16 k, uint16 j); -uint16 SpacePirates_Instr_MovePixelsDownAndChangeDirFaceRight(uint16 k, uint16 j); -uint16 SpacePirates_Instr_PlaySfx(uint16 k, uint16 j); -uint16 SpacePirates_Instr_PrepareWallJumpL(uint16 k, uint16 j); -uint16 SpacePirates_Instr_PrepareWallJumpR(uint16 k, uint16 j); -uint16 SpacePirates_Instr_RandomNewDirFaceL(uint16 k, uint16 j); -uint16 SpacePirates_Instr_RandomNewDirFaceR(uint16 k, uint16 j); -uint16 SpacePirates_Instr_SetEnemyFunc(uint16 k, uint16 j); +const uint16 *SpacePirates_Instr_11(uint16 k, const uint16 *jp); +const uint16 *SpacePirates_Instr_12(uint16 k, const uint16 *jp); +const uint16 *SpacePirates_Instr_13(uint16 k, const uint16 *jp); +const uint16 *SpacePirates_Instr_14(uint16 k, const uint16 *jp); +const uint16 *SpacePirates_Instr_15(uint16 k, const uint16 *jp); +const uint16 *SpacePirates_Instr_16(uint16 k, const uint16 *jp); +const uint16 *SpacePirates_Instr_17(uint16 k, const uint16 *jp); +const uint16 *SpacePirates_Instr_18(uint16 k, const uint16 *jp); +const uint16 *SpacePirates_Instr_19(uint16 k, const uint16 *jp); +const uint16 *SpacePirates_Instr_20(uint16 k, const uint16 *jp); +const uint16 *SpacePirates_Instr_21(uint16 k, const uint16 *jp); +const uint16 *SpacePirates_Instr_FireLaserL(uint16 k, const uint16 *jp); +const uint16 *SpacePirates_Instr_FireLaserR(uint16 k, const uint16 *jp); +const uint16 *SpacePirates_Instr_MovePixelsDownAndChangeDirFaceLeft(uint16 k, const uint16 *jp); +const uint16 *SpacePirates_Instr_MovePixelsDownAndChangeDirFaceRight(uint16 k, const uint16 *jp); +const uint16 *SpacePirates_Instr_PlaySfx(uint16 k, const uint16 *jp); +const uint16 *SpacePirates_Instr_PrepareWallJumpL(uint16 k, const uint16 *jp); +const uint16 *SpacePirates_Instr_PrepareWallJumpR(uint16 k, const uint16 *jp); +const uint16 *SpacePirates_Instr_RandomNewDirFaceL(uint16 k, const uint16 *jp); +const uint16 *SpacePirates_Instr_RandomNewDirFaceR(uint16 k, const uint16 *jp); +const uint16 *SpacePirates_Instr_SetEnemyFunc(uint16 k, const uint16 *jp); void Enemy_GrappleReact_CancelBeam_B2(void); void Enemy_NormalFrozenAI_B2(void); void NinjaSpacePirates_Init(void); @@ -5910,30 +5855,26 @@ void sub_B2F554(void); void sub_B2F5B3(void); // Bank B3 -uint16 Botwoon_Instr_1(uint16 k, uint16 j); -uint16 Botwoon_Instr_10(uint16 k, uint16 j); -uint16 Botwoon_Instr_2(uint16 k, uint16 j); -uint16 Botwoon_Instr_3(uint16 k, uint16 j); -uint16 Botwoon_Instr_4(uint16 k, uint16 j); -uint16 Botwoon_Instr_5(uint16 k, uint16 j); -uint16 Botwoon_Instr_6(uint16 k, uint16 j); -uint16 Botwoon_Instr_7(uint16 k, uint16 j); -uint16 Botwoon_Instr_8(uint16 k, uint16 j); -uint16 Botwoon_Instr_9(uint16 k, uint16 j); -uint16 Botwoon_Instr_QueueSpitSfx(uint16 k, uint16 j); -uint16 Botwoon_Instr_SetSpitting(uint16 k, uint16 j); -uint16 EnemyInstr_DecTimerAndGoto2_B3(uint16 k, uint16 j); -uint16 EnemyInstr_Goto_B3(uint16 k, uint16 j); -uint16 EnemyInstr_SetTimer_B3(uint16 k, uint16 j); -uint16 EnemyInstr_Sleep_B3(uint16 k, uint16 j); -uint16 Enemy_ClearAiPreInstr_B3(uint16 k, uint16 j); -uint16 Enemy_SetAiPreInstr_B3(uint16 k, uint16 j); -uint16 EscapeDachora_Instr_1(uint16 k, uint16 j); -uint16 EscapeDachora_Instr_2(uint16 k, uint16 j); -uint16 EscapeDachora_Instr_3(uint16 k, uint16 j); -uint16 EscapeDachora_Instr_4(uint16 k, uint16 j); -uint16 EscapeEtecoon_Instr_1(uint16 k, uint16 j); -uint16 EscapeEtecoon_Instr_2(uint16 k, uint16 j); +const uint16 *Botwoon_Instr_1(uint16 k, const uint16 *jp); +const uint16 *Botwoon_Instr_10(uint16 k, const uint16 *jp); +const uint16 *Botwoon_Instr_2(uint16 k, const uint16 *jp); +const uint16 *Botwoon_Instr_3(uint16 k, const uint16 *jp); +const uint16 *Botwoon_Instr_4(uint16 k, const uint16 *jp); +const uint16 *Botwoon_Instr_5(uint16 k, const uint16 *jp); +const uint16 *Botwoon_Instr_6(uint16 k, const uint16 *jp); +const uint16 *Botwoon_Instr_7(uint16 k, const uint16 *jp); +const uint16 *Botwoon_Instr_8(uint16 k, const uint16 *jp); +const uint16 *Botwoon_Instr_9(uint16 k, const uint16 *jp); +const uint16 *Botwoon_Instr_QueueSpitSfx(uint16 k, const uint16 *jp); +const uint16 *Botwoon_Instr_SetSpitting(uint16 k, const uint16 *jp); +const uint16 *Enemy_ClearAiPreInstr_B3(uint16 k, const uint16 *jp); +const uint16 *Enemy_SetAiPreInstr_B3(uint16 k, const uint16 *jp); +const uint16 *EscapeDachora_Instr_1(uint16 k, const uint16 *jp); +const uint16 *EscapeDachora_Instr_2(uint16 k, const uint16 *jp); +const uint16 *EscapeDachora_Instr_3(uint16 k, const uint16 *jp); +const uint16 *EscapeDachora_Instr_4(uint16 k, const uint16 *jp); +const uint16 *EscapeEtecoon_Instr_1(uint16 k, const uint16 *jp); +const uint16 *EscapeEtecoon_Instr_2(uint16 k, const uint16 *jp); void Botwoon_Func_1(uint16 k); void Botwoon_Func_10(uint16 k); void Botwoon_Func_11(uint16 k); @@ -6037,7 +5978,6 @@ void SpriteObject_Instr_Goto(void); void SpriteObject_Instr_RepeatLast(void); void SpriteObject_Instr_Terminate(void); void VerifySRAM(void); -void DecompressToMem_IpArg(const void* p); #define fnDrawTimer 0x809F6C #define fnnullsub_1 0x818AB7 @@ -9514,4 +9454,4 @@ void DecompressToMem_IpArg(const void* p); #define fnSpriteObject_Instr_Goto 0xB4BD12 #define fnlocret_828C81 0x828C81 #define fnlocret_8B9585 0x8B9585 -#define FUNC16(x) ((fn##x) & 0xffff) +#define FUNC16(x) ((fn##x) & 0xffff) \ No newline at end of file diff --git a/src/ida_types.h b/src/ida_types.h index 90d78b8..3e29e4a 100644 --- a/src/ida_types.h +++ b/src/ida_types.h @@ -246,11 +246,6 @@ typedef struct LoadBg_E { uint16 field_2; }LoadBg_E; -/* 24 */ -typedef struct LoadBg_28 { - uint16 field_0; - uint16 field_2; -}LoadBg_28; /* 25 */ typedef struct LoadBg_4 { @@ -1059,11 +1054,6 @@ typedef struct StartDmaCopy { VoidP das; } StartDmaCopy; -/* 102 */ -typedef struct DecompressToParams { - LongPtr field_0; -} DecompressToParams; - /* 103 */ typedef struct OpcodeData3 { uint16 field_0; @@ -1190,16 +1180,19 @@ typedef struct DemoRoomData { } DemoRoomData; /* 118 */ -typedef struct PauseScreenSpriteAnimationData { - VoidP unused; - VoidP lr_highlight; - VoidP item_selector; - VoidP unused2; - VoidP unused3; - VoidP map_scroll_arrow_up; - VoidP map_scroll_arrow_down; - VoidP map_scroll_arrow_right; - VoidP map_scroll_arrow_left; +typedef union PauseScreenSpriteAnimationData { + struct { + VoidP unused; + VoidP lr_highlight; + VoidP item_selector; + VoidP unused2; + VoidP unused3; + VoidP map_scroll_arrow_up; + VoidP map_scroll_arrow_down; + VoidP map_scroll_arrow_right; + VoidP map_scroll_arrow_left; + }; + VoidP arr[9]; } PauseScreenSpriteAnimationData; /* 119 */ @@ -1559,6 +1552,7 @@ enum Consts_81 { addr_kMenuTilemap_ClearSamusA = 0xB69A, addr_kMenuTilemap_DataCleared = 0xB6DA, addr_kAreaSelectForegroundTilemap = 0xB71A, + addr_kAreaSelectBackgroundTilemaps = 0xBF1A, }; enum Consts_82 { addr_kPauseMenuMapData = 0x9717, @@ -2034,8 +2028,10 @@ enum Consts_9B { addr_kSamusPalette_PowerSuit = 0x9400, addr_kSamusPalette_VariaSuit = 0x9520, addr_kSamusPalette_GravitySuit = 0x9800, + addr_word_9BA120 = 0xA120, addr_word_9BA380 = 0xA380, addr_word_9BA3A0 = 0xA3A0, + }; enum Consts_A0 { addr_kSpritemap_Nothing_A0 = 0x804D, @@ -2208,6 +2204,7 @@ enum Consts_A4 { addr_kCrocomire_Ilist_BCD8 = 0xBCD8, addr_kCrocomire_Ilist_BD2A = 0xBD2A, addr_kCrocomire_Ilist_BD8E = 0xBD8E, + addr_kCrocomire_Ilist_BDA2 = 0xBDA2, addr_kCrocomire_Ilist_BDAE = 0xBDAE, addr_kCrocomire_Ilist_BDB2 = 0xBDB2, addr_kCrocomire_Ilist_BDB6 = 0xBDB6, @@ -2685,6 +2682,7 @@ enum Consts_B3 { addr_kBrinstarYellowPipeBug_Ilist_8F24 = 0x8F24, addr_kBrinstarYellowPipeBug_Ilist_8F38 = 0x8F38, addr_kBotwoon_Ilist_9389 = 0x9389, + addr_stru_B3E150 = 0xE150, addr_loc_B3E28C = 0xE28C, addr_kEscapeEtecoon_Ilist_E556 = 0xE556, addr_kEscapeEtecoon_Ilist_E582 = 0xE582, @@ -2704,10 +2702,6 @@ enum Consts_B7 { addr_kMotherBrain_Misc_TileData = 0xCE00, }; -enum Consts_B9 { - addr_byte_B9FA38 = 0xFA38, - addr_byte_B9FE3E = 0xFE3E, -}; static inline OamEnt *gOamEnt(int v) { return (OamEnt *)&g_ram[0x370 + v]; } static inline VramWriteEntry *gVramWriteEntry(int a) { return (VramWriteEntry *)&g_ram[0xd0 + a]; } @@ -2718,7 +2712,6 @@ struct StateHeaderTiles; static inline StateHeaderTiles *get_StateHeaderTiles(ui struct EnemyDef_A2; static inline EnemyDef_A2 *get_EnemyDef_A2(uint16 a) { return (EnemyDef_A2 *)RomPtr(0xA00000 | a); } struct EnemyTileset; static inline EnemyTileset *get_EnemyTileset(uint16 a) { return (EnemyTileset *)RomPtr(0xB40000 | a); } struct RoomPlmEntry; static inline RoomPlmEntry *get_RoomPlmEntry(uint16 a) { return (RoomPlmEntry *)RomPtr(0x8F0000 | a); } -struct PlmHeader_Size6; static inline PlmHeader_Size6 *get_PlmHeader_Size6(uint16 a) { return (PlmHeader_Size6 *)RomPtr(0x8F0000 | a); } struct EnemyProjectileDef; static inline EnemyProjectileDef *get_EnemyProjectileDef(uint16 a) { return (EnemyProjectileDef *)RomPtr(0x860000 | a); } struct Vulnerability; static inline Vulnerability *get_Vulnerability(uint16 a) { return (Vulnerability *)RomPtr(0xB40000 | a); } struct ExtendedSpriteMap; static inline ExtendedSpriteMap *get_ExtendedSpriteMap(uint8 db, uint16 a) { return (ExtendedSpriteMap *)RomPtr(db << 16 | a); } @@ -2735,14 +2728,14 @@ struct LoadBg_E; static inline LoadBg_E *get_LoadBg_E(uint16 a) { return (LoadBg struct Mode7VramWriteQueue; static inline Mode7VramWriteQueue *get_Mode7VramWriteQueue(uint16 a) { return (Mode7VramWriteQueue *)RomPtr(0xA60000 | a); } struct ProjectileInstr; static inline ProjectileInstr *get_ProjectileInstr(uint16 a) { return (ProjectileInstr *)RomPtr(0x930000 | a); } struct PlmHeader_Size4; static inline PlmHeader_Size4 *get_PlmHeader_Size4(uint16 a) { return (PlmHeader_Size4 *)RomPtr(0x840000 | a); } +struct PlmHeader_Size6; static inline PlmHeader_Size6 *get_PlmHeader_Size6(uint16 a) { return (PlmHeader_Size6 *)RomPtr(0x840000 | a); } struct RoomDefStateSelect_E6E5_Finish; static inline RoomDefStateSelect_E6E5_Finish *get_RoomDefStateSelect_E6E5_Finish(uint16 a) { return (RoomDefStateSelect_E6E5_Finish *)RomPtr(0x8F0000 | a); } struct SamusSpeedTableEntry; static inline SamusSpeedTableEntry *get_SamusSpeedTableEntry(uint16 a) { return (SamusSpeedTableEntry *)RomPtr(0x900000 | a); } struct SpriteDrawEnt; static inline SpriteDrawEnt *get_SpriteDrawEnt(uint16 a) { return (SpriteDrawEnt *)RomPtr(0xA60000 | a); } struct SamusTileAnimationDefs; static inline SamusTileAnimationDefs *get_SamusTileAnimationDefs(uint16 a) { return (SamusTileAnimationDefs *)RomPtr(0x920000 | a); } -struct LoadBg_28; static inline LoadBg_28 *get_LoadBg_28(uint16 a) { return (LoadBg_28 *)RomPtr(0x8F0000 | a); } struct PalFxDef; static inline PalFxDef *get_PalFxDef(uint16 a) { return (PalFxDef *)RomPtr(0x8D0000 | a); } struct Mode7ObjectDef; static inline Mode7ObjectDef *get_Mode7ObjectDef(uint16 a) { return (Mode7ObjectDef *)RomPtr(0x8B0000 | a); } static inline Ram7800_Default *gRam7800_Default(uint16 a) { return (Ram7800_Default *)&g_ram[0x7800 + a]; } - +static inline Mode7CgvmWriteQueue *get_Mode7CgvmWriteQueue_RAM(uint16 a) { return (Mode7CgvmWriteQueue *)RomPtr_RAM(a); } #pragma pack(pop) diff --git a/src/move_defines.py b/src/move_defines.py new file mode 100644 index 0000000..e744ed0 --- /dev/null +++ b/src/move_defines.py @@ -0,0 +1,31 @@ +import re, glob + + +def process(s): + lines = s.splitlines() + + defines = [] + insert_pos = None + + for i, line in enumerate(lines): + if line.startswith('#define '): + lines[i] = None + defines.append(line.replace('RomPtr(', 'RomFixedPtr(')) + + if line.startswith('#include') and lines[i+1].strip()[:8] in ('', '#define ') and len(defines) == 0 and insert_pos == None: + insert_pos = i + 1 + + assert insert_pos != None + lines = lines[:insert_pos] + ['\n'] + defines + lines[insert_pos:] + + return "\n".join(a for a in lines if a != None) + + +for filename in list(glob.glob('sm_*.c')): + print(filename) + s = open(filename, 'r').read() + s2 = process(s) + if s != s2: + open(filename, 'w').write(s2) + + diff --git a/src/sm.vcxproj b/src/sm.vcxproj index 77a6c48..c7355e7 100644 --- a/src/sm.vcxproj +++ b/src/sm.vcxproj @@ -127,6 +127,7 @@ Default 4996 stdc11 + true $(CoreLibraryDependencies);%(AdditionalDependencies) diff --git a/src/sm_80.c b/src/sm_80.c index 0497229..58a5692 100644 --- a/src/sm_80.c +++ b/src/sm_80.c @@ -8,6 +8,14 @@ #include "spc_player.h" +#define kMusicPointers (*(LongPtr*)RomFixedPtr(0x8fe7e1)) +#define kTimerDigitsSpritemapPtr ((uint16*)RomFixedPtr(0x809fd4)) +#define kLoadStationLists ((uint16*)RomFixedPtr(0x80c4b5)) +#define off_80CD46 ((uint16*)RomFixedPtr(0x80cd46)) + + + + void APU_UploadBank(void) { // 0x808028 if (!g_use_my_apu_code) return; @@ -27,7 +35,6 @@ uint16 NextRandom(void) { // 0x808111 void ReleaseButtonsFilter(uint16 v0) { // 0x808146 timed_held_input_timer_reset = v0; - R18_ = ~joypad1_newkeys & joypad1_lastkeys; bool v1 = ((uint16)~joypad1_newkeys & joypad1_lastkeys) == joypad_released_keys; joypad_released_keys = ~joypad1_newkeys & joypad1_lastkeys; if (!v1) { @@ -156,8 +163,7 @@ CoroutineRet Vector_RESET_Async(void) { // 0x80841C WriteReg(MEMSEL, 1u); reg_MEMSEL = 1; // Removed code to wait 4 frames - for (int i = 8190; i >= 0; i -= 2) - *(uint16 *)RomPtr_RAM(i) = 0; + memset(g_ram, 0, 8192); COROUTINE_AWAIT(2, InitializeIoDisplayLogo_Async()); COROUTINE_MANUAL_POS(3); // Soft reset position mov24(&R0_, 0xCF8000); @@ -413,83 +419,69 @@ void ClearOamExt(void) { // 0x808B1A } void QueueMode7Transfers(uint8 db, uint16 k) { // 0x808B4F - int16 v4; // dx - + const uint8 *p = RomPtrWithBank(db, k); uint16 v2 = mode7_vram_write_queue_tail; - for (int i = k - 1; ; i += 7) { - while (1) { - v4 = *(uint16 *)RomPtrWithBank(db, i); - if (v4 >= 0) - break; - uint8 *v6 = RomPtrWithBank(db, i); - *(uint16 *)(&mode7_write_queue[0].field_0 + v2) = *(uint16 *)(v6 + 1); - *(uint16 *)((char *)&mode7_write_queue[0].field_1 + v2 + 1) = *(uint16 *)(v6 + 3); - *(uint16 *)&mode7_write_queue[0].gap3[v2 + 1] = *(uint16 *)(v6 + 5); - *(uint16 *)&mode7_write_queue[0].gap3[v2 + 3] = *(uint16 *)(v6 + 7); - *(uint16 *)((char *)&mode7_write_queue[1].field_1 + v2) = v6[9]; - i += 9; - v2 += 9; - } - if ((v4 & 0x4000) == 0) + for (;;) { + int f = GET_BYTE(p); + if (f & 0x80) { + *(uint16 *)(&mode7_write_queue[0].field_0 + v2) = GET_WORD(p); + *(uint16 *)((char *)&mode7_write_queue[0].field_1 + v2 + 1) = GET_WORD(p + 2); + *(uint16 *)&mode7_write_queue[0].gap3[v2 + 1] = GET_WORD(p + 4); + *(uint16 *)&mode7_write_queue[0].gap3[v2 + 3] = GET_WORD(p + 6); + *(uint16 *)((char *)&mode7_write_queue[1].field_1 + v2) = p[8]; + p += 9, v2 += 9; + } else if (f & 0x40) { + *(uint16 *)(&mode7_write_queue[0].field_0 + v2) = GET_WORD(p); + *(uint16 *)((char *)&mode7_write_queue[0].field_1 + v2 + 1) = GET_WORD(p + 2); + *(uint16 *)&mode7_write_queue[0].gap3[v2 + 1] = GET_WORD(p + 4); + *(uint16 *)&mode7_write_queue[0].gap3[v2 + 3] = p[6]; + p += 7, v2 += 7; + } else { break; - uint8 *v5 = RomPtrWithBank(db, i); - *(uint16 *)(&mode7_write_queue[0].field_0 + v2) = *(uint16 *)(v5 + 1); - *(uint16 *)((char *)&mode7_write_queue[0].field_1 + v2 + 1) = *(uint16 *)(v5 + 3); - *(uint16 *)&mode7_write_queue[0].gap3[v2 + 1] = *(uint16 *)(v5 + 5); - *(uint16 *)&mode7_write_queue[0].gap3[v2 + 3] = v5[7]; - v2 += 7; + } } mode7_vram_write_queue_tail = v2; } void NMI_ProcessMode7Queue(void) { // 0x808BBA if (mode7_vram_write_queue_tail) { - NMI_ProcessMode7QueueInner(0x2D0u); + NMI_ProcessMode7QueueInner(&g_ram[0x2D0]); *(uint16 *)&mode7_write_queue[0].field_0 = 0; mode7_vram_write_queue_tail = 0; } } -static inline Mode7CgvmWriteQueue *get_Mode7CgvmWriteQueue_RAM(uint16 a) { return (Mode7CgvmWriteQueue *)RomPtr_RAM(a); } -void NMI_ProcessMode7QueueInner(uint16 k) { // 0x808BD3 - char v2; - char v3; - char v4; - Mode7CgvmWriteQueue *v5; - uint8 *v1; - +void NMI_ProcessMode7QueueInner(const uint8 *p) { // 0x808BD3 while (1) { + uint8 v2; while (1) { - v1 = RomPtr_RAM(k); - v2 = *v1; - if ((*v1 & 0x80) == 0) + v2 = *p; + if ((v2 & 0x80) == 0) break; - v4 = 2 * v2; - WriteReg(DMAP1, ((uint8)v4 >> 1) & 0x1F); - v5 = get_Mode7CgvmWriteQueue_RAM(k); + WriteReg(DMAP1, v2 & 0x1F); + Mode7CgvmWriteQueue *v5 = (Mode7CgvmWriteQueue *)p; WriteRegWord(A1T1L, v5->src_addr.addr); WriteReg(A1B1, v5->src_addr.bank); WriteRegWord(DAS1L, v5->count); - if (v4 < 0) + if (v2 & 0x40) WriteReg(BBAD1, 0x19); else WriteReg(BBAD1, 0x18); WriteRegWord(VMADDL, v5->vram_addr); WriteReg(VMAIN, v5->vmain); WriteReg(MDMAEN, 2u); - k += 9; + p += sizeof(Mode7CgvmWriteQueue); } - v3 = 2 * v2; - if (v3 >= 0) + if (!(v2 & 0x40)) break; - WriteReg(DMAP1, ((uint8)v3 >> 1) & 0x1F); - WriteRegWord(A1T1L, *(uint16 *)(v1 + 1)); - WriteReg(A1B1, v1[3]); - WriteRegWord(DAS1L, *((uint16 *)v1 + 2)); + WriteReg(DMAP1, v2 & 0x1F); + WriteRegWord(A1T1L, *(uint16 *)(p + 1)); + WriteReg(A1B1, p[3]); + WriteRegWord(DAS1L, *((uint16 *)p + 2)); WriteReg(BBAD1, 0x22); - WriteReg(CGADD, v1[6]); + WriteReg(CGADD, p[6]); WriteReg(MDMAEN, 2u); - k += 7; + p += 7; } } @@ -660,7 +652,7 @@ uint8 HasQueuedMusic(void) { // 0x808EF4 } return 1; } -#define kMusicPointers (*(LongPtr*)RomPtr(0x8fe7e1)) + void HandleMusicQueue(void) { // 0x808F0C bool v0 = music_timer-- == 1; if ((music_timer & 0x8000u) == 0) { @@ -743,20 +735,17 @@ void QueueSfx1_Max6(uint16 a) { // 0x809049 } void QueueSfx1_Internal(uint16 a) { // 0x809051 - uint16 v2; - sfx_max_queued[0] = a; if ((uint8)((sfx_writepos[0] - sfx_readpos[0]) & 0xF) < (uint8)a) { - LOBYTE(v2) = HIBYTE(a); - HIBYTE(v2) = (sfx_writepos[0] - sfx_readpos[0]) & 0xF; + uint8 v2 = GET_HIBYTE(a); if (!debug_disable_sounds && game_state < 0x28u && (power_bomb_explosion_status & 0x8000u) == 0) { - uint16 v1 = sfx_writepos[0]; - uint16 v3 = sfx_writepos[0] + 1; - if ((uint8)(sfx_writepos[0] + 1) >= 0x10u) + uint8 v1 = sfx_writepos[0]; + uint8 v3 = sfx_writepos[0] + 1; + if (v3 >= 0x10u) v3 = 0; if (v3 == sfx_readpos[0]) { - if (v2 < *(uint16 *)&sfx1_queue[v1]) - *(uint16 *)&sfx1_queue[v1] = v2; + if (v2 < sfx1_queue[v1]) + sfx1_queue[v1] = v2; } else { sfx1_queue[sfx_writepos[0]] = v2; sfx_writepos[0] = v3; @@ -787,21 +776,17 @@ void QueueSfx2_Max6(uint16 a) { // 0x8090CB } void QueueSfx2_Internal(uint16 a) { // 0x8090D3 - uint16 v1; - uint16 v2; - sfx_max_queued[1] = a; if ((uint8)((sfx_writepos[1] - sfx_readpos[1]) & 0xF) < (uint8)a) { - LOBYTE(v2) = HIBYTE(a); - HIBYTE(v2) = (sfx_writepos[1] - sfx_readpos[1]) & 0xF; + uint8 v2 = GET_HIBYTE(a); if (!debug_disable_sounds && game_state < 0x28u && (power_bomb_explosion_status & 0x8000u) == 0) { - LOBYTE(v1) = sfx_writepos[1]; + uint8 v1 = sfx_writepos[1]; uint8 v3 = sfx_writepos[1] + 1; - if ((uint8)(sfx_writepos[1] + 1) >= 0x10u) + if (v3 >= 0x10u) v3 = 0; if (v3 == sfx_readpos[1]) { - if (v2 < *(uint16 *)&sfx2_queue[v1]) - *(uint16 *)&sfx2_queue[v1] = v2; + if (v2 < sfx2_queue[v1]) + sfx2_queue[v1] = v2; } else { sfx2_queue[sfx_writepos[1]] = v2; sfx_writepos[1] = v3; @@ -834,17 +819,15 @@ void QueueSfx3_Max6(uint16 a) { // 0x80914D void QueueSfx3_Internal(uint16 a) { // 0x809155 sfx_max_queued[2] = a; if ((uint8)((sfx_writepos[2] - sfx_readpos[2]) & 0xF) < (uint8)a) { - uint16 v2 = 0; - LOBYTE(v2) = HIBYTE(a); - HIBYTE(v2) = (sfx_writepos[2] - sfx_readpos[2]) & 0xF; + uint8 v2 = GET_HIBYTE(a); if (!debug_disable_sounds && game_state < 0x28u && (power_bomb_explosion_status & 0x8000u) == 0) { - uint16 v1 = sfx_writepos[2]; - int v3 = sfx_writepos[2] + 1; + uint8 v1 = sfx_writepos[2]; + uint8 v3 = sfx_writepos[2] + 1; if (v3 >= 0x10u) v3 = 0; if (v3 == sfx_readpos[2]) { - if (v2 < *(uint16 *)&sfx3_queue[v1]) - *(uint16 *)&sfx3_queue[v1] = v2; + if (v2 < sfx3_queue[v1]) + sfx3_queue[v1] = v2; } else { sfx3_queue[sfx_writepos[2]] = v2; sfx_writepos[2] = v3; @@ -949,44 +932,36 @@ void NmiUpdatePalettesAndOam(void) { // 0x80933A void NmiTransferSamusToVram(void) { // 0x809376 WriteReg(VMAIN, 0x80); if ((uint8)nmi_copy_samus_halves) { - nmicopy1_var_d = nmi_copy_samus_top_half_src; + const uint8 *rp = RomPtr_92(nmi_copy_samus_top_half_src); WriteRegWord(VMADDL, 0x6000); WriteRegWord(DMAP1, 0x1801); - uint16 v0 = *(uint16 *)RomPtr_92(nmicopy1_var_d); + uint16 v0 = GET_WORD(rp + 0); WriteRegWord(A1T1L, v0); - R20_ = v0; - uint8 *v1 = RomPtr_92(nmicopy1_var_d); - WriteRegWord(A1B1, *((uint16 *)v1 + 1)); - uint16 v2 = *(uint16 *)(RomPtr_92(nmicopy1_var_d) + 3); + WriteRegWord(A1B1, GET_WORD(rp + 2)); + uint16 v2 = GET_WORD(rp + 3); WriteRegWord(DAS1L, v2); - R20_ += v2; WriteReg(MDMAEN, 2u); WriteRegWord(VMADDL, 0x6100); - WriteRegWord(A1T1L, R20_); - uint8 *v3 = RomPtr_92(nmicopy1_var_d); - if (*(uint16 *)(v3 + 5)) { - WriteRegWord(DAS1L, *(uint16 *)(v3 + 5)); + WriteRegWord(A1T1L, v0 + v2); + if (GET_WORD(rp + 5)) { + WriteRegWord(DAS1L, GET_WORD(rp + 5)); WriteReg(MDMAEN, 2u); } } if (HIBYTE(nmi_copy_samus_halves)) { - nmicopy1_var_d = nmi_copy_samus_bottom_half_src; + const uint8 *rp = RomPtr_92(nmi_copy_samus_bottom_half_src); WriteRegWord(VMADDL, 0x6080); WriteRegWord(DMAP1, 0x1801); - uint16 v4 = *(uint16 *)RomPtr_92(nmicopy1_var_d); + uint16 v4 = GET_WORD(rp + 0); WriteRegWord(A1T1L, v4); - R20_ = v4; - uint8 *v5 = RomPtr_92(nmicopy1_var_d); - WriteRegWord(A1B1, *((uint16 *)v5 + 1)); - uint16 v6 = *(uint16 *)(RomPtr_92(nmicopy1_var_d) + 3); + WriteRegWord(A1B1, GET_WORD(rp + 2)); + uint16 v6 = GET_WORD(rp + 3); WriteRegWord(DAS1L, v6); - R20_ += v6; WriteReg(MDMAEN, 2u); WriteRegWord(VMADDL, 0x6180); - WriteRegWord(A1T1L, R20_); - uint8 *v7 = RomPtr_92(nmicopy1_var_d); - if (*(uint16 *)(v7 + 5)) { - WriteRegWord(DAS1L, *(uint16 *)(v7 + 5)); + WriteRegWord(A1T1L, v4 + v6); + if (GET_WORD(rp + 5)) { + WriteRegWord(DAS1L, GET_WORD(rp + 5)); WriteReg(MDMAEN, 2u); } } @@ -1331,29 +1306,28 @@ void AddMissilesToHudTilemap(void) { } void AddSuperMissilesToHudTilemap(void) { // 0x809A0E - AddToTilemapInner(0x1C, addr_kHudTilemaps_Missiles + 12); + AddToTilemapInner(0x1C, (const uint16*)RomPtr_80(addr_kHudTilemaps_Missiles + 12)); } void AddPowerBombsToHudTilemap(void) { // 0x809A1E - AddToTilemapInner(0x22, addr_kHudTilemaps_Missiles + 20); + AddToTilemapInner(0x22, (const uint16 *)RomPtr_80(addr_kHudTilemaps_Missiles + 20)); } void AddGrappleToHudTilemap(void) { // 0x809A2E - AddToTilemapInner(0x28, addr_kHudTilemaps_Missiles + 28); + AddToTilemapInner(0x28, (const uint16 *)RomPtr_80(addr_kHudTilemaps_Missiles + 28)); } void AddXrayToHudTilemap(void) { // 0x809A3E - AddToTilemapInner(0x2E, addr_kHudTilemaps_Missiles + 36); + AddToTilemapInner(0x2E, (const uint16 *)RomPtr_80(addr_kHudTilemaps_Missiles + 36)); } -void AddToTilemapInner(uint16 k, uint16 j) { // 0x809A4C +void AddToTilemapInner(uint16 k, const uint16 *j) { // 0x809A4C int v2 = k >> 1; if ((hud_tilemap[v2] & 0x3FF) == 15) { - uint16 *v3 = (uint16 *)RomPtr_80(j); - hud_tilemap[v2] = *v3; - hud_tilemap[v2 + 1] = v3[1]; - hud_tilemap[v2 + 32] = v3[2]; - hud_tilemap[v2 + 33] = v3[3]; + hud_tilemap[v2] = j[0]; + hud_tilemap[v2 + 1] = j[1]; + hud_tilemap[v2 + 32] = j[2]; + hud_tilemap[v2 + 33] = j[3]; } } @@ -1384,11 +1358,11 @@ void InitializeHud(void) { // 0x809A79 R0_.addr = addr_kDigitTilesetsWeapon; *(uint16 *)&R0_.bank = 128; if (samus_max_missiles) - DrawThreeHudDigits(samus_missiles, 0x94); + DrawThreeHudDigits(R0_, samus_missiles, 0x94); if (samus_max_super_missiles) - DrawTwoHudDigits(samus_super_missiles, 0x9C); + DrawTwoHudDigits(R0_, samus_super_missiles, 0x9C); if (samus_max_power_bombs) - DrawTwoHudDigits(samus_power_bombs, 0xA2); + DrawTwoHudDigits(R0_, samus_power_bombs, 0xA2); ToggleHudItemHighlight(hud_item_index, 0x1000); ToggleHudItemHighlight(samus_prev_hud_item_index, 0x1400); HandleHudTilemap(); @@ -1399,11 +1373,10 @@ static const uint16 kEnergyTankIconTilemapOffsets[14] = { 0x42, 0x44, 0x46, 0x48 void HandleHudTilemap(void) { // 0x809B44 R0_.bank = 0; if (reserve_health_mode == 1) { - uint16 v0 = addr_kHudTilemaps_AutoReserve; + const uint16 *v1 = (const uint16 *)RomPtr_80(addr_kHudTilemaps_AutoReserve); if (!samus_reserve_health) - v0 = addr_kHudTilemaps_AutoReserve + 12; - uint16 *v1 = (uint16 *)RomPtr_80(v0); - hud_tilemap[8] = *v1; + v1 += 6; + hud_tilemap[8] = v1[0]; hud_tilemap[9] = v1[1]; hud_tilemap[40] = v1[2]; hud_tilemap[41] = v1[3]; @@ -1429,23 +1402,23 @@ void HandleHudTilemap(void) { // 0x809B44 v2 += 2; } while ((int16)(v2 - 28) < 0); R0_.addr = addr_kDigitTilesetsHealth; - DrawTwoHudDigits(R18_, 0x8C); + DrawTwoHudDigits(R0_, R18_, 0x8C); } R0_.addr = addr_kDigitTilesetsWeapon; if (samus_max_missiles && samus_missiles != samus_prev_missiles) { samus_prev_missiles = samus_missiles; - DrawThreeHudDigits(samus_missiles, 0x94); + DrawThreeHudDigits(R0_, samus_missiles, 0x94); } if (samus_max_super_missiles && samus_super_missiles != samus_prev_super_missiles) { samus_prev_super_missiles = samus_super_missiles; if ((joypad_dbg_flags & 0x1F40) != 0) - DrawThreeHudDigits(samus_prev_super_missiles, 0x9C); + DrawThreeHudDigits(R0_, samus_prev_super_missiles, 0x9C); else - DrawTwoHudDigits(samus_prev_super_missiles, 0x9C); + DrawTwoHudDigits(R0_, samus_prev_super_missiles, 0x9C); } if (samus_max_power_bombs && samus_power_bombs != samus_prev_power_bombs) { samus_prev_power_bombs = samus_power_bombs; - DrawTwoHudDigits(samus_power_bombs, 0xA2); + DrawTwoHudDigits(R0_, samus_power_bombs, 0xA2); } if (hud_item_index != samus_prev_hud_item_index) { ToggleHudItemHighlight(hud_item_index, 0x1000); @@ -1498,19 +1471,19 @@ void ToggleHudItemHighlight(uint16 a, uint16 k) { // 0x809CEA } } -void DrawThreeHudDigits(uint16 a, uint16 k) { // 0x809D78 +void DrawThreeHudDigits(LongPtr r0, uint16 a, uint16 k) { // 0x809D78 uint16 v2 = 2 * (a / 100); - hud_tilemap[k >> 1] = *(uint16 *)IndirPtr(&R0_, v2); + hud_tilemap[k >> 1] = IndirReadWord(r0, v2); uint16 RegWord = (a % 100); - DrawTwoHudDigits(RegWord, k + 2); + DrawTwoHudDigits(r0, RegWord, k + 2); } -void DrawTwoHudDigits(uint16 a, uint16 k) { // 0x809D98 +void DrawTwoHudDigits(LongPtr r0, uint16 a, uint16 k) { // 0x809D98 uint16 RegWord = a / 10; int v3 = k >> 1; - hud_tilemap[v3] = *(uint16 *)IndirPtr(&R0_, 2 * RegWord); + hud_tilemap[v3] = IndirReadWord(r0, 2 * RegWord); uint16 v4 = 2 * (a % 10); - hud_tilemap[v3 + 1] = *(uint16 *)IndirPtr(&R0_, v4); + hud_tilemap[v3 + 1] = IndirReadWord(r0, v4); } static Func_U8 *const kTimerProcessFuncs[7] = { // 0x809DE7 @@ -1524,7 +1497,7 @@ static Func_U8 *const kTimerProcessFuncs[7] = { // 0x809DE7 }; uint8 ProcessTimer(void) { - return kTimerProcessFuncs[(uint16)(2 * (uint8)timer_status) >> 1](); + return kTimerProcessFuncs[(uint8)timer_status](); } uint8 ProcessTimer_CeresStart(void) { // 0x809E09 @@ -1639,7 +1612,6 @@ void DrawTimer(void) { // 0x809F6C DrawTwoTimerDigits(*(uint16 *)&timer_centiseconds, 0x14); } -#define kTimerDigitsSpritemapPtr ((uint16*)RomPtr(0x809fd4)) void DrawTwoTimerDigits(uint16 a, uint16 k) { // 0x809F95 char v2; @@ -2203,7 +2175,7 @@ void UpdateLevelOrBackgroundDataColumn(uint16 k) { // 0x80A9DE uint16 v9 = 0; loopcounter = 16; do { - tmp_block_to_update = *(uint16 *)IndirPtr(©withflip_src, v9); + tmp_block_to_update = IndirReadWord(copywithflip_src, v9); uint16 v10 = tmp_block_to_update & 0x3FF; uint16 v17 = v9; uint16 v11 = tmp_vram_base_addr; @@ -2297,7 +2269,7 @@ void UpdateLevelOrBackgroundDataRow(uint16 v0) { // 0x80AB78 uint16 v9 = 0; loopcounter = 17; do { - tmp_block_to_update = *(uint16 *)IndirPtr(©withflip_src, v9); + tmp_block_to_update = IndirReadWord(copywithflip_src, v9); uint16 v10 = tmp_block_to_update & 0x3FF; uint16 v17 = v9; uint16 v11 = tmp_vram_base_addr; @@ -2558,86 +2530,82 @@ uint8 DoorTransition_Up(void) { // 0x80AF89 void ConfigureMode7RotationMatrix(void) { // 0x80B0C2 if (irq_enable_mode7) { if ((nmi_frame_counter_word & 7) == 0) { - reg_M7B = kSinCosTable8bit_Sext[((uint16)(2 * (uint8)mode7_rotation_angle) >> 1) + 64]; + reg_M7B = kSinCosTable8bit_Sext[((uint8)mode7_rotation_angle) + 64]; reg_M7C = -reg_M7B; - reg_M7A = kSinCosTable8bit_Sext[((uint16)(2 * (uint8)(mode7_rotation_angle + 64)) >> 1) + 64]; + reg_M7A = kSinCosTable8bit_Sext[((uint8)(mode7_rotation_angle + 64)) + 64]; reg_M7D = reg_M7A; ++mode7_rotation_angle; } } } -uint8 DecompNextByte(void) { - uint8 v2 = *RomPtrWithBank(decompress_src.bank, decompress_src.addr); - if (decompress_src.addr++ == 0xFFFF) { - decompress_src.addr = 0x8000; - decompress_src.bank++; - } - return v2; +static uint32 decompress_src; + +static uint8 DecompNextByte() { + uint8 b = *RomPtrWithBank(decompress_src >> 16, decompress_src); + if ((decompress_src++ & 0xffff) == 0xffff) + decompress_src += 0x8000; + return b; } -void DecompressToMem(void) { // 0x80B119 - HIBYTE(decompress_want_xor) = 0; - uint16 dst_pos = 0; +void DecompressToMem(uint32 src, uint8 *decompress_dst) { // 0x80B119 + decompress_src = src; + + int src_pos, dst_pos = 0; while (1) { int len; - uint8 v2 = DecompNextByte(), cmd, b; - decompress_last_byte = v2; - if (v2 == 0xFF) + uint8 cmd, b; + b = DecompNextByte(); + if (b == 0xFF) break; - if ((v2 & 0xE0) == 0xE0) { - cmd = (8 * decompress_last_byte) & 0xE0; - len = ((decompress_last_byte & 3) << 8 | DecompNextByte()) + 1; + if ((b & 0xE0) == 0xE0) { + cmd = (8 * b) & 0xE0; + len = ((b & 3) << 8 | DecompNextByte()) + 1; } else { - cmd = v2 & 0xE0; - len = (decompress_last_byte & 0x1F) + 1; + cmd = b & 0xE0; + len = (b & 0x1F) + 1; } if (cmd & 0x80) { - decompress_want_xor = cmd & 0x20; - if (cmd >= 0xC0u) { - decompress_last_byte = DecompNextByte(); - decompress_tmp1 = 0; - *(uint16 *)&decompress_last_byte = dst_pos - *(uint16 *)&decompress_last_byte; + uint8 want_xor = cmd & 0x20 ? 0xff : 0; + if (cmd >= 0xC0) { + src_pos = dst_pos - DecompNextByte(); } else { - decompress_last_byte = DecompNextByte(); - decompress_tmp1 = DecompNextByte(); + src_pos = DecompNextByte(); + src_pos += DecompNextByte() * 256; } do { - uint16 v27 = *(uint16 *)&decompress_last_byte; - b = *IndirPtr(&decompress_dst, *(uint16 *)&decompress_last_byte); - *(uint16 *)&decompress_last_byte = v27 + 1; - if (decompress_want_xor) - b = ~b; - IndirWriteByte(&decompress_dst, dst_pos++, b); + b = decompress_dst[src_pos++] ^ want_xor; + decompress_dst[dst_pos++] = b; } while (--len); } else { switch (cmd) { case 0x20: b = DecompNextByte(); do { - IndirWriteByte(&decompress_dst, dst_pos++, b); + decompress_dst[dst_pos++] = b; } while (--len); break; - case 0x40: - decompress_last_byte = DecompNextByte(); - decompress_tmp1 = DecompNextByte(); + case 0x40: { + b = DecompNextByte(); + uint8 b2 = DecompNextByte(); do { - IndirWriteByte(&decompress_dst, dst_pos++, decompress_last_byte); + decompress_dst[dst_pos++] = b; if (!--len) break; - IndirWriteByte(&decompress_dst, dst_pos++, decompress_tmp1); + decompress_dst[dst_pos++] = b2; } while (--len); break; + } case 0x60: b = DecompNextByte(); do { - IndirWriteByte(&decompress_dst, dst_pos++, b++); + decompress_dst[dst_pos++] = b++; } while (--len); break; default: do { b = DecompNextByte(); - IndirWriteByte(&decompress_dst, dst_pos++, b); + decompress_dst[dst_pos++] = b; } while (--len); break; } @@ -2645,168 +2613,83 @@ void DecompressToMem(void) { // 0x80B119 } } -void DecompressToVRAM(void) { // 0x80B271 - uint16 v0; // r8 - VoidP addr; - int16 v5; - int16 v7; - int16 v10; - int16 v13; - int16 v14; - int16 v16; - int16 v21; - int16 v28; - int16 v29; - int16 v30; - int16 v31; - int16 v32; - int16 v33; - int16 v34; - uint8 v35; +static uint8 ReadPpuByte(uint16 addr) { + WriteRegWord(VMADDL, addr >> 1); + ReadRegWord(RDVRAML); // latch + uint16 data = ReadRegWord(RDVRAML); + return (addr & 1) ? GET_HIBYTE(data) : data; +} - uint8 bank = decompress_src.bank; - HIBYTE(decompress_want_xor) = 0; - addr = decompress_dst.addr; +void DecompressToVRAM(uint32 src, uint16 dst_addr) { // 0x80B271 + decompress_src = src; + int src_pos, dst_pos = dst_addr; while (1) { - uint8 v2 = DecompNextByte(); - decompress_last_byte = v2; - if (v2 == 0xFF) + int len; + uint8 b = DecompNextByte(), cmd; + if (b == 0xFF) break; - uint8 v4 = v2 & 0xE0; - if (v4 == 0xE0) { - v35 = (8 * decompress_last_byte) & 0xE0; - HIBYTE(v5) = decompress_last_byte & 3; - LOBYTE(v5) = DecompNextByte(); + if ((b & 0xE0) == 0xE0) { + cmd = (8 * b) & 0xE0; + len = ((b & 3) << 8 | DecompNextByte()) + 1; } else { - v35 = v4; - v5 = decompress_last_byte & 0x1F; + cmd = b & 0xE0; + len = (b & 0x1F) + 1; } - v7 = v5 + 1; - LOBYTE(v0) = v35; - if ((uint8)sign8(v0)) { - if (v35 >= 0xC0u) { - LOBYTE(decompress_want_xor) = v35 & 0x20; - v34 = v5 + 1; - uint8 v25 = DecompNextByte(); - v21 = v34; - decompress_last_byte = v25; - decompress_tmp1 = 0; - *(uint16 *)&decompress_last_byte = addr - *(uint16 *)&decompress_last_byte; + if (cmd & 0x80) { + uint8 want_xor = cmd & 0x20 ? 0xff : 0; + if (cmd >= 0xC0) { + src_pos = dst_pos - DecompNextByte(); } else { - LOBYTE(decompress_want_xor) = v35 & 0x20; - v32 = v5 + 1; - uint8 v17 = DecompNextByte(); - decompress_last_byte = v17; - uint8 v19 = DecompNextByte(); - v21 = v32; - decompress_tmp1 = v19; - *(uint16 *)&decompress_last_byte += decompress_dst.addr; + src_pos = DecompNextByte(); + src_pos += DecompNextByte() * 256; + src_pos += dst_addr; } do { - v33 = v21; - WriteRegWord(VMADDL, *(uint16 *)&decompress_last_byte >> 1); - ReadRegWord(RDVRAML); - uint16 RegWord = ReadRegWord(RDVRAML); - uint8 v23 = RegWord; - if (decompress_last_byte & 1) - v23 = HIBYTE(RegWord); - ++ *(uint16 *)&decompress_last_byte; - if (decompress_want_xor) - v23 = ~v23; - WriteRegWord(VMADDL, addr >> 1); - HIBYTE(v0) = (uint16)(addr >> 1) >> 8; - if (addr & 1) - WriteReg(VMDATAH, v23); - else - WriteReg(VMDATAL, v23); - ++addr; - --v21; - } while (v33 != 1); + b = ReadPpuByte(src_pos++) ^ want_xor; + WriteRegWord(VMADDL, dst_pos >> 1); + WriteReg(VMDATAL + (dst_pos++ & 1), b); + } while (--len); } else { - switch (v35) { - case ' ': - v29 = v5 + 1; - LOBYTE(v5) = DecompNextByte(); - v10 = v29; + switch (cmd) { + case 0x20: + b = DecompNextByte(); do { - HIBYTE(v0) = HIBYTE(v5); - if (addr & 1) - WriteReg(VMDATAH, v5); - else - WriteReg(VMDATAL, v5); - ++addr; - --v10; - } while (v10); + WriteReg(VMDATAL + (dst_pos++ & 1), b); + } while (--len); break; - case '@': - v30 = v5 + 1; - LOBYTE(v5) = DecompNextByte(); - decompress_last_byte = v5; - LOBYTE(v5) = DecompNextByte(); - v13 = v30; - decompress_tmp1 = v5; + case 0x40: { + b = DecompNextByte(); + uint8 b2 = DecompNextByte(); do { - HIBYTE(v0) = HIBYTE(v5); - if (addr & 1) - WriteReg(VMDATAH, decompress_last_byte); - else - WriteReg(VMDATAL, decompress_last_byte); - ++addr; - v14 = v13 - 1; - if (!v14) + WriteReg(VMDATAL + (dst_pos++ & 1), b); + if (!--len) break; - HIBYTE(v0) = HIBYTE(v5); - if (addr & 1) - WriteReg(VMDATAH, decompress_tmp1); - else - WriteReg(VMDATAL, decompress_tmp1); - ++addr; - v13 = v14 - 1; - } while (v13); + WriteReg(VMDATAL + (dst_pos++ & 1), b2); + } while (--len); break; - case '`': - v31 = v5 + 1; - LOBYTE(v5) = DecompNextByte(); - v16 = v31; + } + case 0x60: + b = DecompNextByte(); do { - HIBYTE(v0) = HIBYTE(v5); - if (addr & 1) - WriteReg(VMDATAH, v5); - else - WriteReg(VMDATAL, v5); - ++addr; - LOBYTE(v5) = v5 + 1; - --v16; - } while (v16); + WriteReg(VMDATAL + (dst_pos++ & 1), b++); + } while (--len); break; default: do { - v28 = v7; - LOBYTE(v5) = DecompNextByte(); - HIBYTE(v0) = HIBYTE(v5); - if (addr & 1) - WriteReg(VMDATAH, v5); - else - WriteReg(VMDATAL, v5); - ++addr; - v7 = v28 - 1; - } while (v28 != 1); + b = DecompNextByte(); + WriteReg(VMDATAL + (dst_pos++ & 1), b++); + } while (--len); break; } } } } -#define kLoadStationLists ((uint16*)RomPtr(0x80c4b5)) void LoadFromLoadStation(void) { // 0x80C437 save_station_lockout_flag = 1; R18_ = 2 * load_station_index; - uint16 *v0 = (uint16 *)RomPtr_80( - kLoadStationLists[area_index] - + 2 - * (load_station_index - + 6 * load_station_index)); + const uint16 *v0 = (const uint16 *)RomPtr_80(kLoadStationLists[area_index] + 14 * load_station_index); room_ptr = *v0; door_def_ptr = v0[1]; door_bts = v0[2]; @@ -2820,16 +2703,13 @@ void LoadFromLoadStation(void) { // 0x80C437 samus_prev_x_pos = samus_x_pos; reg_BG1HOFS = 0; reg_BG1VOFS = 0; - LOBYTE(area_index) = RomPtr_8F(room_ptr)[1]; + LOBYTE(area_index) = get_RoomDefHeader(room_ptr)->area_index_; LOBYTE(debug_disable_minimap) = 0; } -#define off_80CD46 ((uint16*)RomPtr(0x80cd46)) void SetElevatorsAsUsed(void) { // 0x80CD07 - uint8 *v0 = RomPtr_80( - off_80CD46[area_index] - + 4 * (((uint8)elevator_door_properties_orientation & 0xFu) - 1)); - used_save_stations_and_elevators[*v0] |= v0[1]; + const uint8 *v0 = RomPtr_80(off_80CD46[area_index] + 4 * (((uint8)elevator_door_properties_orientation & 0xF) - 1)); + used_save_stations_and_elevators[v0[0]] |= v0[1]; used_save_stations_and_elevators[v0[2]] |= v0[3]; -} +} \ No newline at end of file diff --git a/src/sm_81.c b/src/sm_81.c index befc0f0..fdcba76 100644 --- a/src/sm_81.c +++ b/src/sm_81.c @@ -6,23 +6,31 @@ #include "funcs.h" #include "enemy_types.h" -#define kOffsetToSaveSlot ((uint16*)RomPtr(0x81812b)) -#define kPackedBytesPerArea_Count ((uint8*)RomPtr(0x818131)) -#define kPackedBytesPerArea_PackedOffs ((uint16*)RomPtr(0x818138)) -#define kPackedBytesPerArea_UnpackedOffs ((uint16*)RomPtr(0x8182d6)) -#define kMenuPalettes ((uint16*)RomPtr(0x8ee400)) -#define kZebesAndStarsTilemap ((uint16*)RomPtr(0x8edc00)) -#define kAreaMapForegroundSetDefs ((uint16*)RomPtr(0x81a4e6)) -#define kAreaMapForegroundColors ((uint16*)RomPtr(0x81a40e)) -#define kBg2RoomSelectMapTilemap ((uint16*)RomPtr(0xb6e000)) -#define kFileSelectExpandingSquareTilemap ((uint16*)RomPtr(0x81b14b)) -#define kMapIconDataPointers ((MapIconDataPointers*)RomPtr(0x82c7cb)) -#define g_word_82C749 ((uint16*)RomPtr(0x82c749)) -#define kRoomState_aa82_aa8f (*(RoomDefRoomstate*)RomPtr(0x8faa8f)) -#define kLeftMapScrollArrowData (*(MapScrollArrowData*)RomPtr(0x81af32)) -#define kRightMapScrollArrowData (*(MapScrollArrowData*)RomPtr(0x81af3c)) -#define kUpMapScrollArrowData (*(MapScrollArrowData*)RomPtr(0x81af46)) -#define kDownMapScrollArrowData (*(MapScrollArrowData*)RomPtr(0x81af50)) + +#define kOffsetToSaveSlot ((uint16*)RomFixedPtr(0x81812b)) +#define kPackedBytesPerArea_Count ((uint8*)RomFixedPtr(0x818131)) +#define kPackedBytesPerArea_PackedOffs ((uint16*)RomFixedPtr(0x818138)) +#define kPackedBytesPerArea_UnpackedOffs ((uint16*)RomFixedPtr(0x8182d6)) +#define kMenuPalettes ((uint16*)RomFixedPtr(0x8ee400)) +#define kZebesAndStarsTilemap ((uint16*)RomFixedPtr(0x8edc00)) +#define kAreaMapForegroundSetDefs ((uint16*)RomFixedPtr(0x81a4e6)) +#define kAreaMapForegroundColors ((uint16*)RomFixedPtr(0x81a40e)) +#define kBg2RoomSelectMapTilemap ((uint16*)RomFixedPtr(0xb6e000)) +#define kFileSelectExpandingSquareTilemap ((uint16*)RomFixedPtr(0x81b14b)) +#define kMapIconDataPointers ((MapIconDataPointers*)RomFixedPtr(0x82c7cb)) +#define g_word_82C749 ((uint16*)RomFixedPtr(0x82c749)) +#define kRoomState_aa82_aa8f (*(RoomDefRoomstate*)RomFixedPtr(0x8faa8f)) +#define kLeftMapScrollArrowData (*(MapScrollArrowData*)RomFixedPtr(0x81af32)) +#define kRightMapScrollArrowData (*(MapScrollArrowData*)RomFixedPtr(0x81af3c)) +#define kUpMapScrollArrowData (*(MapScrollArrowData*)RomFixedPtr(0x81af46)) +#define kDownMapScrollArrowData (*(MapScrollArrowData*)RomFixedPtr(0x81af50)) +#define g_off_82C569 ((uint16*)RomFixedPtr(0x82c569)) +#define kSamusSpritemapTable ((uint16*)RomFixedPtr(0x92808d)) +#define g_off_93A1A1 ((uint16*)RomFixedPtr(0x93a1a1)) +#define kExpandingSquareVels ((ExpandingSquareVels*)RomFixedPtr(0x81aa34)) + + + static const uint16 kFileSelectMap_AreaIndexes[6] = { 0, 3, 5, 1, 4, 2 }; void SoftReset(void) { @@ -30,18 +38,14 @@ void SoftReset(void) { } void SaveToSram(uint16 a) { // 0x818000 - char v0 = a; - uint16 v2; - int16 v7; - int16 v11; + uint16 v7; + uint16 v11; - R20_ = 0; - R18_ = 2 * (v0 & 3); + uint16 R20 = 0; + uint16 R18 = 2 * (a & 3); for (int i = 94; i >= 0; i -= 2) player_data_saved[i >> 1] = *(uint16 *)((char *)&equipped_items + i); - LOBYTE(v2) = HIBYTE(area_index); - HIBYTE(v2) = area_index; - uint16 v3 = v2; + uint16 v3 = area_index * 256; uint16 v4 = 0; do { explored_map_tiles_saved[v3 >> 1] = *(uint16 *)&map_tiles_explored[v4]; @@ -51,18 +55,18 @@ void SaveToSram(uint16 a) { // 0x818000 PackMapToSave(); sram_save_station_index = load_station_index; sram_area_index = area_index; - uint16 v5 = kOffsetToSaveSlot[R18_ >> 1]; + uint16 v5 = kOffsetToSaveSlot[R18 >> 1]; uint16 *v6 = player_data_saved; do { v7 = *v6++; *(uint16 *)(&g_sram[2 * (v5 >> 1)]) = v7; - R20_ += v7; + R20 += v7; v5 += 2; } while (v6 != plm_instruction_timer); - uint16 v8 = R18_; - uint16 v9 = R20_; - int v10 = R18_ >> 1; - *(uint16 *)(&g_sram[2 * v10]) = R20_; + uint16 v8 = R18; + uint16 v9 = R20; + int v10 = R18 >> 1; + *(uint16 *)(&g_sram[2 * v10]) = R20; *(uint16 *)(&g_sram[2 * v10 + 0x1FF0]) = v9; v11 = ~v9; *(uint16 *)(&g_sram[2 * v10 + 8]) = v11; @@ -124,7 +128,7 @@ void UnpackMapFromSave(void) { // 0x8182E4 *(uint16 *)&R3_.bank = 126; do { uint16 v4 = R20_ + *RomPtr_81(R0_.addr); - IndirWriteByte(&R3_, v4, compressed_map_data[v3]); + IndirWriteByte(R3_, v4, compressed_map_data[v3]); ++R0_.addr; ++v3; --R18_; @@ -145,7 +149,7 @@ void PackMapToSave(void) { // 0x81834B *(uint16 *)&R3_.bank = 126; do { int v3 = R24_ + *RomPtr_81(R0_.addr); - compressed_map_data[v1] = *IndirPtr(&R3_, v3); + compressed_map_data[v1] = IndirReadByte(R3_, v3); ++R0_.addr; ++v1; --R22_; @@ -160,7 +164,7 @@ void DrawSpritemap(uint8 db, uint16 j) { // 0x81879F char v13; char v15; - uint16 *v2 = (uint16 *)RomPtrWithBank(db, j); + const uint16 *v2 = (const uint16 *)RomPtrWithBank(db, j); if (*v2) { R24_ = *v2; uint16 v3 = j + 2; @@ -172,8 +176,8 @@ void DrawSpritemap(uint8 db, uint16 j) { // 0x81879F uint16 v5 = oam_next_ptr; while (1) { - uint8 *v6 = RomPtrWithBank(db, v3); - v7 = R20_ + *(uint16 *)v6; + const uint8 *v6 = RomPtrWithBank(db, v3); + v7 = R20_ + GET_WORD(v6); v8 = gOamEnt(v5); *(uint16 *)&v8->xcoord = v7; if ((v7 & 0x100) != 0) { @@ -212,7 +216,7 @@ LABEL_21: { LABEL_22: v8->ycoord = v15; - *(uint16 *)&v8->charnum = R22_ | *(uint16 *)(v6 + 3) & 0xF1FF; + *(uint16 *)&v8->charnum = R22_ | GET_WORD(v6 + 3) & 0xF1FF; v4 = v5 + 4; if (((v5 + 4) & 0xFE00) != 0) { oam_next_ptr = v4; @@ -235,20 +239,19 @@ void DrawSpritemapOffScreen(uint16 j) { // 0x818853 char v12; char v14; - uint16 *v1 = (uint16 *)RomPtr_8C(j); + const uint16 *v1 = (const uint16 *)RomPtr_8C(j); if (*v1) { R24_ = *v1; uint16 v2 = j + 2; uint16 v3 = oam_next_ptr; if ((oam_next_ptr & 0xFE00) != 0) { -LABEL_25: oam_next_ptr = v3; return; } uint16 v4 = oam_next_ptr; while (1) { - uint8 *v5 = RomPtrWithBank(0x8c, v2); - v6 = R20_ + *(uint16 *)v5; + const uint8 *v5 = RomPtrWithBank(0x8c, v2); + v6 = R20_ + GET_WORD(v5); v7 = gOamEnt(v4); *(uint16 *)&v7->xcoord = v6; if ((v6 & 0x100) != 0) { @@ -287,8 +290,10 @@ LABEL_22: v7->ycoord = v14; *(uint16 *)&v7->charnum = R22_ | *(uint16 *)(v5 + 3) & 0xF1FF; v3 = v4 + 4; - if (((v4 + 4) & 0xFE00) != 0) - goto LABEL_25; + if (((v4 + 4) & 0xFE00) != 0) { + oam_next_ptr = v3; + return; + } v4 += 4; v2 += 5; if (!--R24_) { @@ -305,255 +310,178 @@ void SetXCoordToInvalidPos(uint16 k) { // 0x818907 *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v1]) |= kOamExtra_X8Small_And_Large[v1]; } -#define g_off_82C569 ((uint16*)RomPtr(0x82c569)) void DrawMenuSpritemap(uint16 a, uint16 k, uint16 j) { // 0x81891F - int16 v8; - OamEnt *v9; - - R18_ = j; - R20_ = k; - uint16 v3 = g_off_82C569[a]; - uint16 *v4 = (uint16 *)RomPtr_82(v3); - if (*v4) { - R24_ = *v4; - uint16 v5 = v3 + 2; - uint16 v6 = oam_next_ptr; + const uint8 *pp = RomPtr_82(g_off_82C569[a]); + if (GET_WORD(pp + 0)) { + int n = GET_WORD(pp + 0); + pp += 2; + int v6 = oam_next_ptr; do { - uint8 *v7 = RomPtr_82(v5); - v8 = R20_ + *(uint16 *)v7; - v9 = gOamEnt(v6); - *(uint16 *)&v9->xcoord = v8; + int v10 = v6 >> 1; + uint16 *dst = (uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v10]); + uint16 v8 = k + GET_WORD(pp + 0); + OamEnt *v9 = gOamEnt(v6); + v9->xcoord = v8; if ((v8 & 0x100) != 0) { - int v10 = v6 >> 1; - if (*(int16 *)v7 >= 0) { - *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v10]) |= kOamExtra_X8Small_And_Large[v10]; + if (*(int16 *)pp >= 0) { + *dst |= kOamExtra_X8Small_And_Large[v10]; } else { - *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v10]) |= kOamExtra_Address_And_X8Large[v10 + 1]; + *dst |= kOamExtra_Address_And_X8Large[v10 + 1]; } - - } else if (*(int16 *)v7 < 0) { - int v12 = v6 >> 1; - *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v12]) |= kOamExtra_X8Small_And_Large[v12 + 1]; + } else if (*(int16 *)pp < 0) { + *dst |= kOamExtra_X8Small_And_Large[v10 + 1]; } - *(uint16 *)&v9->ycoord = R18_ + *((uint16 *)v7 + 1); - *(uint16 *)&v9->charnum = R3_.addr | *(uint16 *)(v7 + 3) & 0xF1FF; - v5 += 5; + v9->ycoord = j + GET_BYTE(pp + 2); + *(uint16 *)&v9->charnum = R3_.addr | GET_WORD(pp + 3) & 0xF1FF; + pp += 5; v6 = (v6 + 4) & 0x1FF; - --R24_; - } while (R24_); + } while (--n); oam_next_ptr = v6; } } -#define kSamusSpritemapTable ((uint16*)RomPtr(0x92808d)) void DrawSamusSpritemap(uint16 a, uint16 k, uint16 j) { // 0x8189AE - int16 v8; - OamEnt *v9; - uint16 v15; - - R18_ = j; - R20_ = k; uint16 v3 = kSamusSpritemapTable[a]; if (v3 == 0) return; - uint16 *v4 = (uint16 *)RomPtr_92(v3); - if (*v4) { - R24_ = *v4; - uint16 v5 = v3 + 2; - uint16 v6 = oam_next_ptr; - do { - uint8 *v7 = RomPtr_92(v5); - v8 = R20_ + *(uint16 *)v7; - v9 = gOamEnt(v6); - *(uint16 *)&v9->xcoord = v8; - if ((v8 & 0x100) != 0) { - int v10 = v6 >> 1; - if (*(int16 *)v7 >= 0) { - *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v10]) |= kOamExtra_X8Small_And_Large[v10]; - } else { - *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v10]) |= kOamExtra_Address_And_X8Large[v10 + 1]; - } - } else if (*(int16 *)v7 < 0) { - int v12 = v6 >> 1; - *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v12]) |= kOamExtra_X8Small_And_Large[v12 + 1]; + const uint8 *pp = RomPtr_92(v3); + int n = GET_WORD(pp + 0); + pp += 2; + uint16 v6 = oam_next_ptr; + for(; n; n--) { + int v10 = v6 >> 1; + uint16 *dst = (uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v10]); + uint16 v8 = k + GET_WORD(pp + 0); + OamEnt *v9 = gOamEnt(v6); + v9->xcoord = v8; + if ((v8 & 0x100) != 0) { + if (*(int16 *)pp >= 0) { + *dst |= kOamExtra_X8Small_And_Large[v10]; + } else { + *dst |= kOamExtra_Address_And_X8Large[v10 + 1]; } - *(uint16 *)&v9->ycoord = R18_ + *((uint16 *)v7 + 1); - *(uint16 *)&v9->charnum = *(uint16 *)(v7 + 3); - v5 += 5; - v15 = (v6 + 4) & 0x1FF; - v6 = v15; - --R24_; - } while (R24_); - oam_next_ptr = v15; + } else if (*(int16 *)pp < 0) { + *dst |= kOamExtra_X8Small_And_Large[v10 + 1]; + } + v9->ycoord = j + GET_BYTE(pp + 2); + *(uint16 *)&v9->charnum = GET_WORD(pp + 3); + pp += 5; + v6 = (v6 + 4) & 0x1FF; } + oam_next_ptr = v6; } -#define g_off_93A1A1 ((uint16*)RomPtr(0x93a1a1)) void DrawBeamGrappleSpritemap(uint16 a) { // 0x818A37 - uint16 v1 = g_off_93A1A1[a]; - R24_ = *(uint16 *)RomPtr_93(v1); - sub_818A5F(v1 + 2); + sub_818A5F(RomPtr_93(g_off_93A1A1[a])); } void DrawProjectileSpritemap(uint16 k) { // 0x818A4B - uint16 v1 = projectile_spritemap_pointers[k >> 1]; - uint16 *v2 = (uint16 *)RomPtr_93(v1); - if (*v2) { - R24_ = *v2; - sub_818A5F(v1 + 2); - } + sub_818A5F(RomPtr_93(projectile_spritemap_pointers[k >> 1])); } -void sub_818A5F(uint16 j) { // 0x818A5F - uint16 v0 = j; - int16 v3; - OamEnt *v4; - uint16 v10; - - uint16 v1 = oam_next_ptr; +void sub_818A5F(const uint8 *pp) { // 0x818A5F + int n = GET_WORD(pp); + if (!n) + return; + pp += 2; + uint16 idx = oam_next_ptr; do { - uint8 *v2 = RomPtr_93(v0); - v3 = R20_ + *(uint16 *)v2; - v4 = gOamEnt(v1); - *(uint16 *)&v4->xcoord = v3; - if ((v3 & 0x100) != 0) { - int v5 = v1 >> 1; - *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v5]) |= kOamExtra_X8Small_And_Large[v5]; - } - if (*(int16 *)v2 < 0) { - int v7 = v1 >> 1; - *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v7]) |= kOamExtra_X8Small_And_Large[v7 + 1]; - } - *(uint16 *)&v4->ycoord = R18_ + *((uint16 *)v2 + 1); - *(uint16 *)&v4->charnum = *(uint16 *)(v2 + 3); - v0 += 5; - v10 = (v1 + 4) & 0x1FF; - v1 = v10; - --R24_; - } while (R24_); - oam_next_ptr = v10; + int v5 = idx >> 1; + uint16 v3 = R20_ + GET_WORD(pp); + OamEnt *v4 = gOamEnt(idx); + v4->xcoord = v3; + uint16 *dst = (uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v5]); + if ((v3 & 0x100) != 0) + *dst |= kOamExtra_X8Small_And_Large[v5]; + if (*(int16 *)pp < 0) + *dst |= kOamExtra_X8Small_And_Large[v5 + 1]; + v4->ycoord = R18_ + GET_BYTE(pp + 2); + *(uint16 *)&v4->charnum = GET_WORD(pp + 3); + pp += 5; + idx = (idx + 4) & 0x1FF; + } while (--n); + oam_next_ptr = idx; } void DrawSpritemapWithBaseTile(uint8 db, uint16 j) { // 0x818AB8 - int16 v5; - OamEnt *v6; - uint16 v12; - if (j == 0) return; // bug fix - uint16 *v1 = (uint16 *)RomPtrWithBank(db, j); - if (*v1) { - uint16 v2 = j + 2; - R24_ = *v1; - uint16 v3 = oam_next_ptr; - do { - uint8 *v4 = RomPtrWithBank(db, v2); - v5 = R20_ + *(uint16 *)v4; - v6 = gOamEnt(v3); - *(uint16 *)&v6->xcoord = v5; - if ((v5 & 0x100) != 0) { - int v7 = v3 >> 1; - *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v7]) |= kOamExtra_X8Small_And_Large[v7]; - } - if (*(int16 *)v4 < 0) { - int v9 = v3 >> 1; - *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v9]) |= kOamExtra_X8Small_And_Large[v9 + 1]; - } - v6->ycoord = R18_ + v4[2]; - *(uint16 *)&v6->charnum = R3_.addr | (R0_.addr + *(uint16 *)(v4 + 3)); - bool v11 = 0;// __CFADD__(v2, 5); - v2 += 5; - v12 = (v11 + v3 + 4) & 0x1FF; - v3 = v12; - --R24_; - } while (R24_); - oam_next_ptr = v12; + uint8 *pp = (uint8 *)RomPtrWithBank(db, j); + int n = GET_WORD(pp); + uint16 v3 = oam_next_ptr; + pp += 2; + for(; n != 0; n--) { + int v7 = v3 >> 1; + OamEnt *oam = gOamEnt(v3); + uint16 v5 = R20_ + GET_WORD(pp + 0); + oam->xcoord = v5; + uint16 *dst = (uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v7]); + if ((v5 & 0x100) != 0) + *dst |= kOamExtra_X8Small_And_Large[v7]; + if (*(int16 *)pp < 0) + *dst |= kOamExtra_X8Small_And_Large[v7 + 1]; + oam->ycoord = R18_ + pp[2]; + *(uint16 *)&oam->charnum = R3_.addr | (R0_.addr + GET_WORD(pp + 3)); + pp += 5; + v3 = (v3 + 4) & 0x1FF; } + oam_next_ptr = v3; } void DrawSpritemapWithBaseTile2(uint8 db, uint16 j) { // 0x818B22 - int16 v6; - OamEnt *v7; - - uint16 *v2 = (uint16 *)RomPtrWithBank(db, j); - if (*v2) { - uint16 v3 = j + 2; - R24_ = *v2; - uint16 v4 = oam_next_ptr; - while (1) { - uint8 *v5 = RomPtrWithBank(db, v3); - v6 = R20_ + *(uint16 *)v5; - v7 = gOamEnt(v4); - *(uint16 *)&v7->xcoord = v6; - if ((v6 & 0x100) != 0) { - int v8 = v4 >> 1; - *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v8]) |= kOamExtra_X8Small_And_Large[v8]; - } - if (*(int16 *)v5 < 0) { - int v10 = v4 >> 1; - *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v10]) |= kOamExtra_X8Small_And_Large[v10 + 1]; - } - int y = v5[2] + LOBYTE(R18_); - if ((v5[2] & 0x80) ? (y & 0x100) == 0 : (y & 0x100) != 0) - y = 0xf0; - v7->ycoord = y; - *(uint16 *)&v7->charnum = R3_.addr | (R0_.addr + *(uint16 *)(v5 + 3)); - v3 += 5; - uint16 v16 = (v4 + 4) & 0x1FF; - v4 = v16; - if (!--R24_) { - oam_next_ptr = v16; - return; - } - } + const uint8 *pp = RomPtrWithBank(db, j); + uint16 v4 = oam_next_ptr; + int n = GET_WORD(pp); + pp += 2; + for (; n != 0; n--) { + int v8 = v4 >> 1; + OamEnt *oam = gOamEnt(v4); + uint16 v6 = R20_ + GET_WORD(pp + 0); + oam->xcoord = v6; + uint16 *dst = (uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v8]); + if ((v6 & 0x100) != 0) + *dst |= kOamExtra_X8Small_And_Large[v8]; + if (*(int16 *)pp < 0) + *dst |= kOamExtra_X8Small_And_Large[v8 + 1]; + int y = pp[2] + LOBYTE(R18_); + if ((pp[2] & 0x80) ? (y & 0x100) == 0 : (y & 0x100) != 0) + y = 0xf0; + oam->ycoord = y; + *(uint16 *)&oam->charnum = R3_.addr | (R0_.addr + GET_WORD(pp + 3)); + pp += 5; + v4 = (v4 + 4) & 0x1FF; } + oam_next_ptr = v4; } -void DrawSpritemapWithBaseTileOffscreen(uint8 db, uint16 j) { // 0x818B96 - int16 v6; - OamEnt *v7; - char v12; - - uint16 *v2 = (uint16 *)RomPtrWithBank(db, j); - if (*v2) { - uint16 v3 = j + 2; - R24_ = *v2; - uint16 v4 = oam_next_ptr; - while (1) { - uint8 *v5 = RomPtrWithBank(db, v3); - v6 = R20_ + *(uint16 *)v5; - v7 = gOamEnt(v4); - *(uint16 *)&v7->xcoord = v6; - if ((v6 & 0x100) != 0) { - int v8 = v4 >> 1; - *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v8]) |= kOamExtra_X8Small_And_Large[v8]; - } - if (*(int16 *)v5 < 0) { - int v10 = v4 >> 1; - *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v10]) |= kOamExtra_X8Small_And_Large[v10 + 1]; - } - v12 = v5[2]; - - bool v13 = __CFADD__uint8((uint8)R18_, v12); - v12 += R18_; - - if (!!sign8(v5[2]) == (v13 != 0)) - v12 = -16; - - v7->ycoord = v12; - *(uint16 *)&v7->charnum = R3_.addr | (R0_.addr + *(uint16 *)(v5 + 3)); - v3 += 5; - uint16 v16 = (v4 + 4) & 0x1FF; - v4 = v16; - if (!--R24_) { - oam_next_ptr = v16; - return; - } - } +void DrawSpritemapWithBaseTileOffscreen(uint8 db, uint16 j, uint16 r20_x, uint16 r18_y) { // 0x818B96 + const uint8 *pp = RomPtrWithBank(db, j); + uint16 v4 = oam_next_ptr; + int n = GET_WORD(pp); pp += 2; + for (; n; n--) { + int v8 = v4 >> 1; + int v6 = r20_x + GET_WORD(pp + 0); + OamEnt *v7 = gOamEnt(v4); + v7->xcoord = v6; + uint16 *dst = (uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v8]); + if ((v6 & 0x100) != 0) + *dst |= kOamExtra_X8Small_And_Large[v8]; + if (*(int16 *)pp < 0) + *dst |= kOamExtra_X8Small_And_Large[v8 + 1]; + uint8 v12 = pp[2]; + bool v13 = __CFADD__uint8((uint8)R18_, v12); + v12 += r18_y; + if (!!sign8(pp[2]) == v13) + v12 = 0xf0; + v7->ycoord = v12; + *(uint16 *)&v7->charnum = R3_.addr | (R0_.addr + GET_WORD(pp + 3)); + pp += 5; + v4 = (v4 + 4) & 0x1FF; } + oam_next_ptr = v4; } void DrawEnemyProjectileSpritemapWithBaseTile(uint8 db, uint16 j) { // 0x818C0A @@ -562,14 +490,14 @@ void DrawEnemyProjectileSpritemapWithBaseTile(uint8 db, uint16 j) { // 0x818C0A char v10; char v12; // cf - uint16 *v2 = (uint16 *)RomPtrWithBank(db, j); + const uint16 *v2 = (const uint16 *)RomPtrWithBank(db, j); if (*v2) { R24_ = *v2; uint16 v3 = j + 2; uint16 v4 = oam_next_ptr; while (1) { - uint8 *v5 = RomPtrWithBank(db, v3); - v6 = R20_ + *(uint16 *)v5; + const uint8 *v5 = RomPtrWithBank(db, v3); + v6 = R20_ + GET_WORD(v5); v7 = gOamEnt(v4); *(uint16 *)&v7->xcoord = v6; if ((v6 & 0x100) != 0) { @@ -597,7 +525,7 @@ LABEL_10: int v13 = v4 >> 1; *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v13]) |= kOamExtra_X8Small_And_Large[v13 + 1]; } - *(uint16 *)&v7->charnum = R28_ | (R26_ + v12 + *(uint16 *)(v5 + 3)); + *(uint16 *)&v7->charnum = R28_ | (R26_ + v12 + GET_WORD(v5 + 3)); v4 = (v4 + 4) & 0x1FF; v3 += 5; if (!--R24_) { @@ -614,14 +542,14 @@ void DrawEnemyProjectileSpritemapWithBaseTileOffscreen(uint8 db, uint16 j) { // char v10; char v12; // cf - uint16 *v2 = (uint16 *)RomPtrWithBank(db, j); + const uint16 *v2 = (const uint16 *)RomPtrWithBank(db, j); if (*v2) { R24_ = *v2; uint16 v3 = j + 2; uint16 v4 = oam_next_ptr; while (1) { - uint8 *v5 = RomPtrWithBank(db, v3); - v6 = R20_ + *(uint16 *)v5; + const uint8 *v5 = RomPtrWithBank(db, v3); + v6 = R20_ + GET_WORD(v5); v7 = gOamEnt(v4); *(uint16 *)&v7->xcoord = v6; if ((v6 & 0x100) != 0) { @@ -650,7 +578,7 @@ LABEL_10: int v13 = v4 >> 1; *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v13]) |= kOamExtra_X8Small_And_Large[v13 + 1]; } - *(uint16 *)&v7->charnum = R28_ | (R26_ + v12 + *(uint16 *)(v5 + 3)); + *(uint16 *)&v7->charnum = R28_ | (R26_ + v12 + GET_WORD(v5 + 3)); v4 = (v4 + 4) & 0x1FF; v3 += 5; if (!--R24_) { @@ -759,14 +687,14 @@ void LoadDebugGameOverMenuTilemaps(void) { // 0x818E7F vram_write_queue_tail = v1 + 7; uint16 v3 = v1 + 7; for (int i = 0; ; i += 8) { - uint16 v5 = *(uint16 *)IndirPtr(&R0_, i); + uint16 v5 = IndirReadWord(R0_, i); if (v5 == 0xFFFF) break; VramWriteEntry *v6 = gVramWriteEntry(v3); v6->size = v5; - v6->src.addr = *(uint16 *)IndirPtr(&R0_, i + 2); - *(uint16 *)&v6->src.bank = *(uint16 *)IndirPtr(&R0_, i + 4); - v6->vram_dst = *(uint16 *)IndirPtr(&R0_, i + 6); + v6->src.addr = IndirReadWord(R0_, i + 2); + *(uint16 *)&v6->src.bank = IndirReadWord(R0_, i + 4); + v6->vram_dst = IndirReadWord(R0_, i + 6); v3 += 7; } vram_write_queue_tail = v3; @@ -2106,16 +2034,11 @@ void FileSelectMap_3_LoadAreaSelectBackgroundTilemap(void) { // 0x81A582 } void LoadAreaSelectBackgroundTilemap(uint16 j) { // 0x81A58A - VramWriteEntry *v2; - int16 v3; - uint16 v1 = vram_write_queue_tail; - v2 = gVramWriteEntry(vram_write_queue_tail); + VramWriteEntry *v2 = gVramWriteEntry(vram_write_queue_tail); v2->size = 2048; - LOBYTE(v3) = HIBYTE(j); - HIBYTE(v3) = j; - v2->src.addr = 8 * v3 - 16614; - *(uint16 *)&v2->src.bank = 129; + v2->src.addr = 8 * 256 * j + addr_kAreaSelectBackgroundTilemaps; + v2->src.bank = 0x81; v2->vram_dst = (reg_BG3SC & 0xFC) << 8; vram_write_queue_tail = v1 + 7; } @@ -2329,7 +2252,6 @@ uint16 WraparoundFrom6to0(uint16 a) { // 0x81A89F } void SelectFileSelectMapArea(void) { // 0x81A8A9 - VoidP *v1; char v2; // cf int16 v3; int16 v4; @@ -2344,19 +2266,18 @@ void SelectFileSelectMapArea(void) { // 0x81A8A9 area_index = kFileSelectMap_AreaIndexes[file_select_map_area_index]; R18_ = *(uint16 *)&used_save_stations_and_elevators[(uint16)(2 * area_index)]; uint16 v0 = 0; - *(uint16 *)&R0_.bank = 130; + R0_.bank = 130; R0_.addr = addr_kMapIconDataPointers + 64; - v1 = (VoidP *)IndirPtr(&R0_, 2 * area_index); - while (!*v1) - ; - R0_.addr = *v1; + R0_.addr = IndirReadWord(R0_, 2 * area_index); + if (!R0_.addr) + InvalidInterrupt_Crash(); R20_ = 16; while (1) { v2 = R18_ & 1; R18_ >>= 1; if (!v2) goto LABEL_10; - v3 = *(uint16 *)IndirPtr(&R0_, 4 * v0); + v3 = IndirReadWord(R0_, 4 * v0); if (v3 == -2) goto LABEL_10; if (v3 != -1) @@ -2366,7 +2287,7 @@ LABEL_10: ++v0; if (!--R20_) { while (1) { - v4 = *(uint16 *)IndirPtr(&R0_, 4 * v0); + v4 = IndirReadWord(R0_, 4 * v0); if (v4 != -2) { if (v4 != -1) goto LABEL_16; @@ -2409,52 +2330,38 @@ static const uint16 kAreaSelectMapLabelPositions[12] = { // 0x81A97E 0x87, 0x8b, }; void DrawAreaSelectMapLabels(void) { - VoidP v0; - int16 v3; - char v4; // cf - int v5; - R3_.addr = 0; DrawMenuSpritemap(g_word_82C749[0], 0x80, 0x10); - R28_ = 0; - do { - v0 = 512; - if (R28_ == file_select_map_area_index) - v0 = 0; - R3_.addr = v0; - uint16 v1 = 2 * kFileSelectMap_AreaIndexes[R28_]; - R36 = *(uint16 *)&used_save_stations_and_elevators[v1]; - uint16 v2 = *(VoidP *)((char *)&kMapIconDataPointers[4].crateria + v1); - g_word_7E001E = 16; - while (1) { - v3 = *(uint16 *)RomPtr_82(v2); - if (v3 == -1) - break; - v4 = R36 & 1; - R36 >>= 1; - if (v4 && v3 != -2) + for(int i = 0; i < 6; i++) { + R3_.addr = (i == file_select_map_area_index) ? 0 : 512; + uint16 v1 = 2 * kFileSelectMap_AreaIndexes[i]; + uint16 r36 = *(uint16 *)&used_save_stations_and_elevators[v1]; + const uint16 *v2 = (const uint16 *)RomPtr_82(*(VoidP *)((char *)&kMapIconDataPointers[4].crateria + v1)); + int R30 = 16; + while (*v2 != 0xffff) { + int v4 = r36 & 1; + r36 >>= 1; + if (v4 && *v2 != 0xfffe) goto LABEL_11; - v2 += 4; - if (!--g_word_7E001E) { - if (enable_debug && *(uint16 *)RomPtr_82(v2) != 0xFFFF) { -LABEL_11: - v5 = (uint16)(4 * kFileSelectMap_AreaIndexes[R28_]) >> 1; + v2 += 2; + if (!--R30) { + if (enable_debug && *v2 != 0xFFFF) { +LABEL_11:; + int j = 4 * kFileSelectMap_AreaIndexes[i] >> 1; DrawMenuSpritemap( - g_word_82C749[0] + kFileSelectMap_AreaIndexes[R28_] + 1, - kAreaSelectMapLabelPositions[v5], - kAreaSelectMapLabelPositions[v5 + 1]); + g_word_82C749[0] + kFileSelectMap_AreaIndexes[i] + 1, + kAreaSelectMapLabelPositions[j], + kAreaSelectMapLabelPositions[j + 1]); break; } break; } } - ++R28_; - } while (sign16(R28_ - 6)); + } } static const uint16 kRoomSelectMapExpandingSquareTimers[6] = { 0x33, 0x35, 0x2d, 0x33, 0x33, 0x22 }; -#define kExpandingSquareVels ((ExpandingSquareVels*)RomPtr(0x81aa34)) void FileSelectMap_7_PrepExpandSquareTransToRoomMap(void) { // 0x81AAAC VramWriteEntry *v1; @@ -2648,14 +2555,14 @@ void FileSelectMap_10_RoomSelectMap(void) { // 0x81AD7F ; R0_.addr = *v2; v3 = 4 * load_station_index; - R18_ = *(uint16 *)IndirPtr(&R0_, 4 * load_station_index); - R20_ = *(uint16 *)IndirPtr(&R0_, v3 + 2); + R18_ = IndirReadWord(R0_, 4 * load_station_index); + R20_ = IndirReadWord(R0_, v3 + 2); if (!sign16(load_station_index - 16)) goto LABEL_23; do { if (!sign16(++load_station_index - 16)) { while (1) { - v5 = *(uint16 *)IndirPtr(&R0_, 4 * load_station_index); + v5 = IndirReadWord(R0_, 4 * load_station_index); if (v5 == -1) break; if (v5 != -2) @@ -2668,12 +2575,12 @@ LABEL_23: } v4 = R24_ & 1; R24_ >>= 1; - } while (!v4 || *(uint16 *)IndirPtr(&R0_, 4 * load_station_index) >= 0xFFFEu); + } while (!v4 || IndirReadWord(R0_, 4 * load_station_index) >= 0xFFFEu); LABEL_25:; uint16 v6 = 4 * load_station_index; - uint8 *v7 = IndirPtr(&R0_, 4 * load_station_index); - if (sign16(*(uint16 *)v7 - reg_BG1HOFS) || !sign16(*(uint16 *)v7 - 256 - reg_BG1HOFS)) { - v8 = reg_BG1HOFS + *(uint16 *)IndirPtr(&R0_, v6) - R18_; + uint16 w7 = IndirReadWord(R0_, 4 * load_station_index); + if (sign16(w7 - reg_BG1HOFS) || !sign16(w7 - 256 - reg_BG1HOFS)) { + v8 = reg_BG1HOFS + IndirReadWord(R0_, v6) - R18_; if (v8 >= 0) { if ((int16)(v8 - map_min_x_scroll) >= 0) v8 = map_min_x_scroll; @@ -2683,9 +2590,9 @@ LABEL_25:; reg_BG1HOFS = v8; } uint16 v9 = v6 + 2; - uint8 *v10 = IndirPtr(&R0_, v9); - if (sign16(*(uint16 *)v10 - reg_BG1VOFS) || !sign16(*(uint16 *)v10 - 161 - reg_BG1VOFS)) { - uint16 v11 = reg_BG1VOFS + *(uint16 *)IndirPtr(&R0_, v9) - R20_; + uint16 v10 = IndirReadWord(R0_, v9); + if (sign16(v10 - reg_BG1VOFS) || !sign16(v10 - 161 - reg_BG1VOFS)) { + uint16 v11 = reg_BG1VOFS + IndirReadWord(R0_, v9) - R20_; if ((int16)(v11 - map_min_y_scroll) >= 0) v11 = map_min_y_scroll; reg_BG1VOFS = v11; @@ -2945,4 +2852,4 @@ void LoadMenuTilemap(uint16 k, uint16 j) { // 0x81B3E2 k += 2; j += 2; } -} +} \ No newline at end of file diff --git a/src/sm_82.c b/src/sm_82.c index f662c67..a19caab 100644 --- a/src/sm_82.c +++ b/src/sm_82.c @@ -6,7 +6,65 @@ #include "funcs.h" #include "enemy_types.h" -#define kDemoRoomData ((uint16*)RomPtr(0x82876c)) + +#define kDemoRoomData ((uint16*)RomFixedPtr(0x82876c)) +#define kPauseScreenSpriteAnimationData_0 (*(PauseScreenSpriteAnimationData*)RomFixedPtr(0x82c0b2)) +#define kPauseScreenSpriteAnimationData_1 (*(PauseScreenSpriteAnimationData*)RomFixedPtr(0x82c0c4)) +#define kPauseScreenSpriteAnimationData_2 (*(PauseScreenSpriteAnimationData*)RomFixedPtr(0x82c0d6)) +#define kPauseScreenSpriteAnimationData_3 (*(PauseScreenSpriteAnimationData*)RomFixedPtr(0x82c0e8)) +#define kPAuseSpritePaletteIndexValues ((uint16*)RomFixedPtr(0x82c0fa)) +#define kPausePtsToAnimationSpritemapBaseIds ((uint16*)RomFixedPtr(0x82c1e4)) +#define kInitialPalette ((uint16*)RomFixedPtr(0x9a8000)) +#define kDemoRoomData ((uint16*)RomFixedPtr(0x82876c)) +#define kPauseScreenPalettes ((uint16*)RomFixedPtr(0xb6f000)) +#define kPauseLrHighlightAnimData ((uint8*)RomFixedPtr(0x82c10c)) +#define kPauseAreaLabelTilemap ((uint16*)RomFixedPtr(0x82965f)) +#define kPauseMenuMapTilemaps ((LongPtr*)RomFixedPtr(0x82964a)) +#define kPauseMenuMapData ((uint16*)RomFixedPtr(0x829717)) +#define kEquipmentTilemaps_Tanks ((uint16*)RomFixedPtr(0x82c088)) +#define kEquipmentTilemaps_Weapons ((uint16*)RomFixedPtr(0x82c08c)) +#define kEquipmentTilemaps_Suits ((uint16*)RomFixedPtr(0x82c096)) +#define kEquipmentTilemaps_Boots ((uint16*)RomFixedPtr(0x82c0a2)) +#define kHyperBeamWeaponsTilemaps ((uint16*)RomFixedPtr(0x82c0a8)) +#define kEquipmentBitmasks_Weapons ((uint16*)RomFixedPtr(0x82c04c)) +#define kEquipmentBitmasks_Suits ((uint16*)RomFixedPtr(0x82c056)) +#define kEquipmentBitmasks_Boots ((uint16*)RomFixedPtr(0x82c062)) +#define kPauseAnimatedPalette ((uint16*)RomFixedPtr(0x82a987)) +#define kPauseReserveTankAnimationData ((uint8*)RomFixedPtr(0x82c165)) +#define kEquipmentTilemapOffs_Tanks ((uint16*)RomFixedPtr(0x82c068)) +#define kEquipmentTilemapOffs_Weapons ((uint16*)RomFixedPtr(0x82c06c)) +#define kEquipmentTilemapOffs_Suits ((uint16*)RomFixedPtr(0x82c076)) +#define kEquipmentTilemapOffs_Boots ((uint16*)RomFixedPtr(0x82c082)) +#define kEquipmentTilemaps_Tanks ((uint16*)RomFixedPtr(0x82c088)) +#define kEquipmentTilemaps_Weapons ((uint16*)RomFixedPtr(0x82c08c)) +#define kEquipmentTilemaps_Suits ((uint16*)RomFixedPtr(0x82c096)) +#define kEquipmentTilemaps_Boots ((uint16*)RomFixedPtr(0x82c0a2)) +#define kEquipmentScreenWireframeCmp ((uint16*)RomFixedPtr(0x82b257)) +#define kEquipmentScreenWireframePtrs ((uint16*)RomFixedPtr(0x82b25f)) +#define kEquipmentScreenPtrsToItemXYpos ((uint16*)RomFixedPtr(0x82c18e)) +#define kEquipmentPtrsToRamTilemapOffsets ((uint16*)RomFixedPtr(0x82c02c)) +#define kEquipmentPtrsToBitmasks ((uint16*)RomFixedPtr(0x82c034)) +#define kEquipmentPtrsToBitsets ((uint16*)RomFixedPtr(0x82c03c)) +#define kEquipmentPtrsToEquipmentTilemaps ((uint16*)RomFixedPtr(0x82c044)) +#define kMapIconDataPointers ((MapIconDataPointers*)RomFixedPtr(0x82c7cb)) +#define g_stru_82B9A0 ((MapScrollArrowData*)RomFixedPtr(0x82b9a0)) +#define g_stru_82B9AA ((MapScrollArrowData*)RomFixedPtr(0x82b9aa)) +#define g_stru_82B9B4 ((MapScrollArrowData*)RomFixedPtr(0x82b9b4)) +#define g_stru_82B9BE (*(MapScrollArrowData*)RomFixedPtr(0x82b9be)) +#define file_copy_arrow_stuff ((FileCopyArrowStuff*)RomFixedPtr(0x82bb0c)) +#define kMapElevatorDests ((uint16*)RomFixedPtr(0x82c74d)) +#define kStateHeaderGraphicsSets ((uint16*)RomFixedPtr(0x8fe7a7)) +#define kCommonSpritesPalette1 ((uint16*)RomFixedPtr(0x9afc00)) +#define kMenuPalettes ((uint16*)RomFixedPtr(0x8ee400)) +#define kOptionsMenuSpecialPtrs ((uint16*)RomFixedPtr(0x82f0ae)) +#define off_82F2ED ((uint16*)RomFixedPtr(0x82f2ed)) +#define off_82F54A ((uint16*)RomFixedPtr(0x82f54a)) +#define g_word_82F639 ((uint16*)RomFixedPtr(0x82f639)) +#define g_off_82F647 ((uint16*)RomFixedPtr(0x82f647)) + + + + void CallDemoRoomDataFunc(uint32 ea) { switch (ea) { case fnDemoRoom_ChargeBeamRoomScroll21: DemoRoom_ChargeBeamRoomScroll21(); return; @@ -225,7 +283,6 @@ void InitPpuForGameplay(void) { // 0x8281DD memset7E(ram4000.bg2_tilemap, 0x2C0F, 0xFE); } -#define kInitialPalette ((uint16*)RomPtr(0x9a8000)) void LoadInitialPalette(void) { // 0x8282C5 int16 v0; @@ -471,7 +528,6 @@ CoroutineRet GameState_44_TransitionFromDemo(void) { // 0x8285FB return kCoroutineNone; } -#define kDemoRoomData ((uint16*)RomPtr(0x82876c)) void CheckForNextDemo(void) { // 0x828637 R18_ = 2 * (demo_scene + 8 * demo_scene); @@ -870,16 +926,16 @@ uint8 CreateOptionsMenuObject_(uint16 a, uint16 j) { if ((v3 & 0x8000u) != 0) return 1; } - uint8 *v5 = RomPtr_82(j); + const uint8 *v5 = RomPtr_82(j); int v6 = v3 >> 1; - optionsmenu_arr1[v6] = *((uint16 *)v5 + 1); - optionsmenu_instr_ptr[v6] = *((uint16 *)v5 + 2); + optionsmenu_arr1[v6] = GET_WORD(v5 + 2); + optionsmenu_instr_ptr[v6] = GET_WORD(v5 + 4); optionsmenu_instr_timer[v6] = 1; optionsmenu_cur_data[v6] = 0; optionsmenu_arr5[v6] = 0; optionsmenu_arr6[v6] = 0; optionsmenu_arr7[v6] = 0; - CallOptionsEntryFunc(*(uint16 *)v5 | 0x820000, v3); + CallOptionsEntryFunc(GET_WORD(v5) | 0x820000, v3); return 0; } @@ -927,20 +983,19 @@ void OptionsMenuFunc2(uint16 k) { // 0x828C2B uint16 v1 = optionsmenu_index; int v2 = optionsmenu_index >> 1; if (optionsmenu_instr_timer[v2]-- == 1) { - uint16 v4 = optionsmenu_instr_ptr[v2], v6; + uint16 v4 = optionsmenu_instr_ptr[v2]; + uint16 *v5; while (1) { - uint16 *v5 = (uint16 *)RomPtr_82(v4); - v6 = *v5; - if ((*v5 & 0x8000u) == 0) + v5 = (uint16 *)RomPtr_82(v4); + if ((v5[0] & 0x8000u) == 0) break; - R18_ = *v5; - v4 = CallOptionsInstr(v6 | 0x820000, v1, v4 + 2); + v4 = CallOptionsInstr(v5[0] | 0x820000, v1, v4 + 2); if (!v4) return; } int v7 = v1 >> 1; - optionsmenu_instr_timer[v7] = v6; - optionsmenu_cur_data[v7] = *((uint16 *)RomPtr_82(v4) + 1); + optionsmenu_instr_timer[v7] = v5[0]; + optionsmenu_cur_data[v7] = v5[1]; optionsmenu_instr_ptr[v7] = v4 + 4; } } @@ -1188,7 +1243,6 @@ void LoadEqupmentScreenReserveHealthTilemap(void) { // 0x828F70 } } -#define kPauseScreenPalettes ((uint16*)RomPtr(0xb6f000)) void BackupGameplayPalettesAndLoadForPause(void) { // 0x828FD4 int16 v0; int16 v2; @@ -1328,7 +1382,6 @@ void PauseMenu_5(void) { // 0x829186 ++menu_index; } } -#define kPauseLrHighlightAnimData ((uint8*)RomPtr(0x82c10c)) void PauseMenu_3_MapToEquipment_Load(void) { // 0x8291AB DisplayMapElevatorDestinations(); EquipmentScreenSetupReserveMode(); @@ -1502,7 +1555,6 @@ CoroutineRet GameState_18_Unpausing(void) { // 0x8293A1 return kCoroutineNone; } -#define kPauseAreaLabelTilemap ((uint16*)RomPtr(0x82965f)) void LoadPauseMenuMapTilemapAndAreaLabel(void) { // 0x8293C3 reg_BG1HOFS = reg_BG4HOFS; reg_BG1VOFS = reg_BG4VOFS; @@ -1528,13 +1580,9 @@ void LoadPauseMenuMapTilemapAndAreaLabel(void) { // 0x8293C3 WriteReg(MDMAEN, 2u); } -#define kPauseMenuMapTilemaps ((LongPtr*)RomPtr(0x82964a)) -#define kPauseMenuMapData ((uint16*)RomPtr(0x829717)) void LoadPauseMenuMapTilemap(void) { // 0x82943D - uint16 v5; uint16 v6; int16 v9; - uint16 v13; uint16 v0 = area_index; if (!sign16(area_index - 7)) @@ -1544,28 +1592,20 @@ void LoadPauseMenuMapTilemap(void) { // 0x82943D *(uint16 *)&R0_.bank = *(uint16 *)(&kPauseMenuMapTilemaps[0].bank + (uint16)(3 * v0)); R3_.addr = ADDR16_OF_RAM(ram4000); *(uint16 *)&R3_.bank = 126; - R8_ = 130; - R6_ = kPauseMenuMapData[v0]; + R6_.bank = 130; + R6_.addr = kPauseMenuMapData[v0]; if (map_station_byte_array[area_index]) { - uint8 *v4 = IndirPtr(&R6_, 0); - LOBYTE(v5) = HIBYTE(*(uint16 *)v4); - HIBYTE(v5) = *(uint16 *)v4; - R38 = v5; - ++R6_; - ++R6_; + R38 = swap16(IndirReadWord(R6_, 0)); + R6_.addr += 2; v6 = ADDR16_OF_RAM(*map_tiles_explored); - *(uint16 *)((char *)&R10_ + 1) = 0; - *(uint16 *)((char *)&R8_ + 1) = v6; - uint8 *v7 = IndirPtr((char *)&R8_ + 1, 0); - LOBYTE(v5) = HIBYTE(*(uint16 *)v7); - HIBYTE(v5) = *(uint16 *)v7; - R40 = v5; - ++ *(uint16 *)((char *)&R8_ + 1); - ++ *(uint16 *)((char *)&R8_ + 1); + R9_.bank = 0; + R9_.addr = v6; + R40 = swap16(IndirReadWord(R9_, 0)); + R9_.addr += 2; uint16 v8 = 0; v9 = 16; do { - uint16 v10 = *(uint16 *)IndirPtr(&R0_, v8); + uint16 v10 = IndirReadWord(R0_, v8); bool v11 = R40 >> 15; R40 *= 2; if (v11) { @@ -1577,21 +1617,13 @@ void LoadPauseMenuMapTilemap(void) { // 0x82943D if (!v11) v10 = 31; } - IndirWriteWord(&R3_, v8, v10); + IndirWriteWord(R3_, v8, v10); if (!--v9) { v9 = 16; - uint8 *v12 = IndirPtr(&R6_, 0); - LOBYTE(v13) = HIBYTE(*(uint16 *)v12); - HIBYTE(v13) = *(uint16 *)v12; - R38 = v13; - ++R6_; - ++R6_; - uint8 *v14 = IndirPtr((char *)&R8_ + 1, 0); - LOBYTE(v13) = HIBYTE(*(uint16 *)v14); - HIBYTE(v13) = *(uint16 *)v14; - R40 = v13; - ++ *(uint16 *)((char *)&R8_ + 1); - ++ *(uint16 *)((char *)&R8_ + 1); + R38 = swap16(IndirReadWord(R6_, 0)); + R6_.addr += 2; + R40 = swap16(IndirReadWord(R9_, 0)); + R9_.addr += 2; } v8 += 2; } while ((int16)(v8 - 4096) < 0); @@ -1603,11 +1635,10 @@ void LoadPauseMenuMapTilemap(void) { // 0x82943D uint8 t = map_tiles_explored[v2]; map_tiles_explored[v2] <<= 1; if (!(t & 0x80)) { - IndirWriteWord(&R3_, v1, 0x1F); + IndirWriteWord(R3_, v1, 0x1F); } else { ++map_tiles_explored[v2]; - uint8 *v3 = IndirPtr(&R0_, v1); - IndirWriteWord(&R3_, v1, *(uint16 *)v3 & 0xFBFF); + IndirWriteWord(R3_, v1, IndirReadWord(R0_, v1) & 0xFBFF); } v1 += 2; LOBYTE(R18_) = R18_ + 1; @@ -1622,10 +1653,8 @@ void LoadPauseMenuMapTilemap(void) { // 0x82943D void DrawRoomSelectMap(void) { // 0x829517 uint16 v3; // r8 - uint16 v6; unsigned int v7; // kr00_4 int16 v10; - uint16 v14; VramWriteEntry *v17; reg_BG12NBA = 51; @@ -1639,28 +1668,21 @@ void DrawRoomSelectMap(void) { // 0x829517 *(uint16 *)&R0_.bank = *(uint16 *)(&kPauseMenuMapTilemaps[0].bank + (uint16)(3 * v0)); R3_.addr = ADDR16_OF_RAM(ram3000); R3_.bank = 126; - R8_ = 130; - R6_ = kPauseMenuMapData[v0]; + R6_.bank = 130; + R6_.addr = kPauseMenuMapData[v0]; if (map_station_byte_array[area_index]) { - uint8 *v5 = IndirPtr(&R6_, 0); - LOBYTE(v6) = HIBYTE(*(uint16 *)v5); - HIBYTE(v6) = *(uint16 *)v5; - R38 = v6; - ++R6_; - ++R6_; + R38 = swap16(IndirReadWord(R6_, 0)); + ++R6_.addr; + ++R6_.addr; v7 = 2039; - *(uint16 *)((char *)&R10_ + 1) = HIWORD(v7); - *(uint16 *)((char *)&R8_ + 1) = v7; - uint8 *v8 = IndirPtr((char *)&R8_ + 1, 0); - LOBYTE(v6) = HIBYTE(*(uint16 *)v8); - HIBYTE(v6) = *(uint16 *)v8; - R40 = v6; - ++ *(uint16 *)((char *)&R8_ + 1); - ++ *(uint16 *)((char *)&R8_ + 1); + R9_.bank = HIWORD(v7); + R9_.addr = v7; + R40 = swap16(IndirReadWord(R9_, 0)); + R9_.addr += 2; uint16 v9 = 0; v10 = 16; do { - uint16 v11 = *(uint16 *)IndirPtr(&R0_, v9); + uint16 v11 = IndirReadWord(R0_, v9); bool v12 = R40 >> 15; R40 *= 2; if (v12) { @@ -1672,21 +1694,13 @@ void DrawRoomSelectMap(void) { // 0x829517 if (!v12) v11 = 31; } - IndirWriteWord(&R3_, v9, v11); + IndirWriteWord(R3_, v9, v11); if (!--v10) { v10 = 16; - uint8 *v13 = IndirPtr(&R6_, 0); - LOBYTE(v14) = HIBYTE(*(uint16 *)v13); - HIBYTE(v14) = *(uint16 *)v13; - R38 = v14; - ++R6_; - ++R6_; - uint8 *v15 = IndirPtr((char *)&R8_ + 1, 0); - LOBYTE(v14) = HIBYTE(*(uint16 *)v15); - HIBYTE(v14) = *(uint16 *)v15; - R40 = v14; - ++ *(uint16 *)((char *)&R8_ + 1); - ++ *(uint16 *)((char *)&R8_ + 1); + R38 = swap16(IndirReadWord(R6_, 0)); + R6_.addr += 2; + R40 = swap16(IndirReadWord(R9_, 0)); + R9_.addr += 2; } v9 += 2; } while ((int16)(v9 - 4096) < 0); @@ -1698,10 +1712,10 @@ void DrawRoomSelectMap(void) { // 0x829517 uint8 what = map_tiles_explored[v2]; map_tiles_explored[v2] <<= 1; if (!(what & 0x80)) { - IndirWriteWord(&R3_, v1, 0xF); + IndirWriteWord(R3_, v1, 0xF); } else { ++map_tiles_explored[v2]; - IndirWriteWord(&R3_, v1, *(uint16 *)IndirPtr(&R0_, v1) & ~0x400); + IndirWriteWord(R3_, v1, IndirReadWord(R0_, v1) & ~0x400); } v1 += 2; LOBYTE(R18_) = R18_ + 1; @@ -1723,14 +1737,9 @@ void DrawRoomSelectMap(void) { // 0x829517 } void DrawRoomSelectMapAreaLabel(void) { // 0x829628 - uint16 v0 = kPauseAreaLabelTilemap[area_index]; - uint16 v1 = 0; - do { - uint8 *v2 = RomPtr_82(v0); - IndirWriteWord(&R0_, v1, *(uint16 *)v2 & 0xEFFF); - v0 += 2; - v1 += 2; - } while ((int16)(v1 - 24) < 0); + const uint8 *v2 = RomPtr_82(kPauseAreaLabelTilemap[area_index]); + for(int i = 0; i < 24; i += 2) + IndirWriteWord(R0_, i, *(uint16 *)(v2 + i) & 0xEFFF); } void SetupMapScrollingForPauseMenu(uint16 a) { // 0x829E27 @@ -1763,26 +1772,26 @@ void SetupMapScrollingForPauseMenu(uint16 a) { // 0x829E27 void DetermineMapScrollLimits(void) { // 0x829EC4 if (has_area_map) { - R8_ = 130; - R6_ = addr_kPauseMenuMapData; - R6_ = *(uint16 *)IndirPtr(&R6_, 2 * area_index); + R6_.bank = 130; + R6_.addr = addr_kPauseMenuMapData; + R6_.addr = IndirReadWord(R6_, 2 * area_index); } else { - R8_ = 0; - R6_ = 2039; + R6_.bank = 0; + R6_.addr = 2039; } - R0_.bank = R8_; - R0_.addr = R6_; + R0_.bank = R6_.bank; + R0_.addr = R6_.addr; uint16 v0 = DetermineLeftmostMapColumn(); map_min_x_scroll = MultiplyBy8(v0); if (area_index == 4) map_min_x_scroll -= 24; - R0_.addr = R6_ + 131; + R0_.addr = R6_.addr + 131; uint16 v1 = DetermineRightmostMapColumn(); map_max_x_scroll = MultiplyBy8(v1); - R0_.addr = R6_; + R0_.addr = R6_.addr; uint16 v2 = DetermineTopmostMapColumn(); map_min_y_scroll = MultiplyBy8(v2); - R0_.addr = R6_ + 124; + R0_.addr = R6_.addr + 124; uint16 v3 = DetermineBottommostMapColumn(); map_max_y_scroll = MultiplyBy8(v3); } @@ -1804,7 +1813,7 @@ LABEL_2: LOBYTE(v0) = result & 7; LOBYTE(R18_) = k0x80Shr[v0]; uint16 v2 = 0; - while (((uint8)R18_ & *IndirPtr(&R0_, v2)) == 0) { + while (((uint8)R18_ & IndirReadByte(R0_, v2)) == 0) { v2 += 4; if ((int16)(v2 - 128) >= 0) { if ((int16)(++result - 64) >= 0) @@ -1826,7 +1835,7 @@ uint16 DetermineRightmostMapColumn(void) { // 0x829FA9 LABEL_2: LOBYTE(R18_) = k0x80Shr_0[result & 7]; uint16 v1 = 0; - while (((uint8)R18_ & *IndirPtr(&R0_, v1)) == 0) { + while (((uint8)R18_ & IndirReadByte(R0_, v1)) == 0) { v1 += 4; if ((int16)(v1 - 128) >= 0) { if ((--result & 0x8000u) != 0) @@ -1848,7 +1857,7 @@ uint16 DetermineTopmostMapColumn(void) { // 0x82A009 R3_.bank = R0_.bank; uint16 result = 0; uint16 v1 = 0; - while (!*IndirPtr(&R0_, v1) && !*IndirPtr(&R3_, v1)) { + while (!IndirReadByte(R0_, v1) && !IndirReadByte(R3_, v1)) { if ((int16)(++v1 - 4) >= 0) { v1 = 0; R0_.addr += 4; @@ -1865,7 +1874,7 @@ uint16 DetermineBottommostMapColumn(void) { // 0x82A053 R3_.bank = R0_.bank; uint16 result = 31; uint16 v1 = 0; - while (!*IndirPtr(&R0_, v1) && !*IndirPtr(&R3_, v1)) { + while (!IndirReadByte(R0_, v1) && !IndirReadByte(R3_, v1)) { if ((int16)(++v1 - 4) >= 0) { v1 = 0; R0_.addr -= 4; @@ -1921,31 +1930,23 @@ void ResetPauseMenuAnimations(void) { // 0x82A0F7 pausemenu_palette_animation_timer = 1; pausemenu_palette_animation_frame = 0; } -#define kEquipmentTilemaps_Tanks ((uint16*)RomPtr(0x82c088)) -#define kEquipmentTilemaps_Weapons ((uint16*)RomPtr(0x82c08c)) -#define kEquipmentTilemaps_Suits ((uint16*)RomPtr(0x82c096)) -#define kEquipmentTilemaps_Boots ((uint16*)RomPtr(0x82c0a2)) -#define kHyperBeamWeaponsTilemaps ((uint16*)RomPtr(0x82c0a8)) -#define kEquipmentBitmasks_Weapons ((uint16*)RomPtr(0x82c04c)) -#define kEquipmentBitmasks_Suits ((uint16*)RomPtr(0x82c056)) -#define kEquipmentBitmasks_Boots ((uint16*)RomPtr(0x82c062)) void LoadEquipmentScreenEquipmentTilemaps(void) { // 0x82A12B if (samus_max_reserve_health) { R3_.addr = addr_kEquipmentTilemapOffs_Tanks; *(uint16 *)&R3_.bank = 130; - R0_.addr = *(uint16 *)IndirPtr(&R3_, 0); + R0_.addr = IndirReadWord(R3_, 0); R22_ = 14; Copy_R22_Bytes(kEquipmentTilemaps_Tanks[0]); R3_.addr = addr_kEquipmentTilemapOffs_Tanks; *(uint16 *)&R3_.bank = 130; - R0_.addr = *(uint16 *)IndirPtr(&R3_, 2u); + R0_.addr = IndirReadWord(R3_, 2u); R22_ = 14; Copy_R22_Bytes(kEquipmentTilemaps_Tanks[1]); } uint16 v0 = 0; R3_.addr = addr_kEquipmentTilemapOffs_Weapons; *(uint16 *)&R3_.bank = 130; - R0_.addr = *(uint16 *)IndirPtr(&R3_, 0); + R0_.addr = IndirReadWord(R3_, 0); if (hyper_beam_flag) { uint16 v3 = 0; do { @@ -1953,7 +1954,7 @@ void LoadEquipmentScreenEquipmentTilemaps(void) { // 0x82A12B R22_ = 10; Copy_R22_Bytes(v4); v3 += 2; - R0_.addr = *(uint16 *)IndirPtr(&R3_, v3); + R0_.addr = IndirReadWord(R3_, v3); } while ((int16)(v3 - 10) < 0); } else { do { @@ -1972,13 +1973,13 @@ void LoadEquipmentScreenEquipmentTilemaps(void) { // 0x82A12B Copy_R22_Bytes(addr_kEquipmentScreenTilemap_Blank); } v0 += 2; - R0_.addr = *(uint16 *)IndirPtr(&R3_, v0); + R0_.addr = IndirReadWord(R3_, v0); } while ((int16)(v0 - 12) < 0); } uint16 v5 = 0; R3_.addr = addr_kEquipmentTilemapOffs_Suits; *(uint16 *)&R3_.bank = 130; - R0_.addr = *(uint16 *)IndirPtr(&R3_, 0); + R0_.addr = IndirReadWord(R3_, 0); do { int v6 = v5 >> 1; if ((collected_items & kEquipmentBitmasks_Suits[v6]) != 0) { @@ -1995,12 +1996,12 @@ void LoadEquipmentScreenEquipmentTilemaps(void) { // 0x82A12B Copy_R22_Bytes(addr_kEquipmentScreenTilemap_Blank); } v5 += 2; - R0_.addr = *(uint16 *)IndirPtr(&R3_, v5); + R0_.addr = IndirReadWord(R3_, v5); } while ((int16)(v5 - 12) < 0); uint16 v8 = 0; R3_.addr = addr_kEquipmentTilemapOffs_Boots; *(uint16 *)&R3_.bank = 130; - R0_.addr = *(uint16 *)IndirPtr(&R3_, 0); + R0_.addr = IndirReadWord(R3_, 0); do { int v9 = v8 >> 1; if ((collected_items & kEquipmentBitmasks_Boots[v9]) != 0) { @@ -2016,32 +2017,29 @@ void LoadEquipmentScreenEquipmentTilemaps(void) { // 0x82A12B Copy_R22_Bytes(addr_kEquipmentScreenTilemap_Blank); } v8 += 2; - R0_.addr = *(uint16 *)IndirPtr(&R3_, v8); + R0_.addr = IndirReadWord(R3_, v8); } while ((int16)(v8 - 6) < 0); } void Copy_R22_Bytes(uint16 k) { // 0x82A27E - R0_.bank = 126; + R0_.bank = 0x7E; uint16 v1 = 0; do { - uint16 *v2 = (uint16 *)RomPtr_82(k); - IndirWriteWord(&R0_, v1, *v2); + const uint16 *v2 = (const uint16 *)RomPtr_82(k); + IndirWriteWord(R0_, v1, *v2); k += 2; v1 += 2; - --R22_; - --R22_; + R22_ -= 2; } while (R22_); } void SetPaletteOfR22TilemapBytesToR18(void) { // 0x82A29D - R0_.bank = 126; + R0_.bank = 0x7E; uint16 v0 = 0; do { - uint8 *v1 = IndirPtr(&R0_, v0); - IndirWriteWord(&R0_, v0, R18_ | *(uint16 *)v1 & 0xE3FF); + IndirWriteWord(R0_, v0, R18_ | IndirReadWord(R0_, v0) & 0xE3FF); v0 += 2; - --R22_; - --R22_; + R22_ -= 2; } while (R22_); } @@ -2423,47 +2421,25 @@ void UpdatePauseMenuLRStartVramTilemap(void) { // 0x82A84D vram_write_queue_tail = v0 + 2; } -#define kPauseScreenSpriteAnimationData_0 (*(PauseScreenSpriteAnimationData*)RomPtr(0x82c0b2)) -#define kPauseScreenSpriteAnimationData_1 (*(PauseScreenSpriteAnimationData*)RomPtr(0x82c0c4)) -#define kPauseScreenSpriteAnimationData_2 (*(PauseScreenSpriteAnimationData*)RomPtr(0x82c0d6)) -#define kPauseScreenSpriteAnimationData_3 (*(PauseScreenSpriteAnimationData*)RomPtr(0x82c0e8)) -#define kPAuseSpritePaletteIndexValues ((uint16*)RomPtr(0x82c0fa)) -#define kPausePtsToAnimationSpritemapBaseIds ((uint16*)RomPtr(0x82c1e4)) - -void DrawPauseScreenSpriteAnim(uint16 a, uint16 k, uint16 j) { // 0x82A881 - int16 v9; - int16 v10; - int16 v12; - - R18_ = k; - R20_ = j; - uint16 v3 = 2 * (a - 1); - uint16 v4 = *(VoidP *)((char *)&kPauseScreenSpriteAnimationData_0.unused + v3); - uint8 *v5 = RomPtr_RAM(v4); - bool v6 = *(uint16 *)v5 == 1; - bool v7 = (int16)-- * (uint16 *)v5 < 0; - if (v6 || v7) { - R24_ = v4; - uint8 *v8 = RomPtr_RAM(*(VoidP *)((char *)&kPauseScreenSpriteAnimationData_1.unused + v3)); - v9 = *(uint16 *)v8 + 1; - *(uint16 *)v8 = v9; - R22_ = *(uint16 *)v8 + 2 * v9; - v10 = *RomPtr_82(R22_ + *(VoidP *)((char *)&kPauseScreenSpriteAnimationData_3.unused + v3)); +void DrawPauseScreenSpriteAnim(uint16 a, uint16 input_k, uint16 input_j) { // 0x82A881 + int t = a - 1; + uint16 *v8 = (uint16*)RomPtr_RAM(kPauseScreenSpriteAnimationData_1.arr[t]); + uint16 *v5 = (uint16*)RomPtr_RAM(kPauseScreenSpriteAnimationData_0.arr[t]); + const uint8 *v3 = RomPtr_82(kPauseScreenSpriteAnimationData_3.arr[t]); + if ((int16)--(*v5) <= 0) { + uint16 v10 = v3[3 * ++(*v8)]; if (v10 == 255) { - *(uint16 *)RomPtr_RAM(*(VoidP *)((char *)&kPauseScreenSpriteAnimationData_1.unused + v3)) = 0; - v10 = *RomPtr_82(*(VoidP *)((char *)&kPauseScreenSpriteAnimationData_3.unused + v3)); + *v8 = 0; + v10 = v3[0]; } - *(uint16 *)RomPtr_RAM(R24_) = v10; + *v5 = v10; } - R24_ = 3 * *(uint16 *)RomPtr_RAM(*(VoidP *)((char *)&kPauseScreenSpriteAnimationData_1.unused + v3)); - v12 = R24_ + *(VoidP *)((char *)&kPauseScreenSpriteAnimationData_3.unused + v3) + 1; R3_.addr = kPAuseSpritePaletteIndexValues[3]; - R24_ = *RomPtr_82(v12 + 1); - R26_ = 2 * *RomPtr_RAM(*(VoidP *)((char *)&kPauseScreenSpriteAnimationData_2.unused + v3)); - uint8 *v11 = RomPtr_82(R26_ + kPausePtsToAnimationSpritemapBaseIds[v3 >> 1]); - DrawMenuSpritemap(R24_ + *(uint16 *)v11, R18_, R20_ - 1); + int r24 = v3[3 * *v8 + 2]; + int r26 = 2 * *RomPtr_RAM(kPauseScreenSpriteAnimationData_2.arr[t]); + const uint8 *v11 = RomPtr_82(r26 + kPausePtsToAnimationSpritemapBaseIds[t]); + DrawMenuSpritemap(r24 + GET_WORD(v11), input_k, input_j - 1); } -#define kPauseAnimatedPalette ((uint16*)RomPtr(0x82a987)) void HandlePauseScreenPaletteAnimation(void) { // 0x82A92B uint16 v2; uint16 j; @@ -2490,7 +2466,6 @@ void HandlePauseScreenPaletteAnimation(void) { // 0x82A92B } } } -#define kPauseReserveTankAnimationData ((uint8*)RomPtr(0x82c165)) void EquipmentScreenSetupReserveMode(void) { // 0x82AB47 VoidP v0; int16 v3; @@ -2513,7 +2488,7 @@ void EquipmentScreenSetupReserveMode(void) { // 0x82AB47 uint16 v2 = 0; do { v3 = ram3800.cinematic_bg_tilemap[v1 + 327] & 0xFC00; - ram3800.cinematic_bg_tilemap[v1 + 327] = *(uint16 *)IndirPtr(&R0_, v2) | v3; + ram3800.cinematic_bg_tilemap[v1 + 327] = IndirReadWord(R0_, v2) | v3; v2 += 2; ++v1; --R18_; @@ -2748,10 +2723,11 @@ void EquipmentScreenCategory_Tanks_0(void) { } void EquipmentScreenHudReserveAutoTilemap_On_BUGGY(void) { // 0x82AEFD + // loads garbage... uint16 v0 = -26229; if (!samus_reserve_health) v0 = -26217; - uint16 *v1 = (uint16 *)RomPtr_82(v0); + const uint16 *v1 = (const uint16 *)RomPtr_82(v0); hud_tilemap[8] = *v1; hud_tilemap[9] = v1[1]; hud_tilemap[40] = v1[2]; @@ -2827,14 +2803,6 @@ void EquipmentScreenCategory_Weapons_MoveButtons(void) { // 0x82AFDB } } } -#define kEquipmentTilemapOffs_Tanks ((uint16*)RomPtr(0x82c068)) -#define kEquipmentTilemapOffs_Weapons ((uint16*)RomPtr(0x82c06c)) -#define kEquipmentTilemapOffs_Suits ((uint16*)RomPtr(0x82c076)) -#define kEquipmentTilemapOffs_Boots ((uint16*)RomPtr(0x82c082)) -#define kEquipmentTilemaps_Tanks ((uint16*)RomPtr(0x82c088)) -#define kEquipmentTilemaps_Weapons ((uint16*)RomPtr(0x82c08c)) -#define kEquipmentTilemaps_Suits ((uint16*)RomPtr(0x82c096)) -#define kEquipmentTilemaps_Boots ((uint16*)RomPtr(0x82c0a2)) void EquipmentScreenCategory_Weapons_PlazmaSpazerCheck(void) { // 0x82B068 int t = equipped_beams & ~R36; @@ -2926,8 +2894,6 @@ void WriteSamusWireframeTilemapAndQueue(void) { // 0x82B1E0 vram_write_queue_tail = v0 + 2; } -#define kEquipmentScreenWireframeCmp ((uint16*)RomPtr(0x82b257)) -#define kEquipmentScreenWireframePtrs ((uint16*)RomPtr(0x82b25f)) void WriteSamusWireframeTilemap(void) { // 0x82B20C uint16 i; @@ -2943,7 +2909,7 @@ void WriteSamusWireframeTilemap(void) { // 0x82B20C uint16 v3 = v2; R18_ = 8; do { - *(uint16 *)((char *)ram3800.cinematic_bg_tilemap + v2) = *(uint16 *)IndirPtr(&R0_, v1); + *(uint16 *)((char *)ram3800.cinematic_bg_tilemap + v2) = IndirReadWord(R0_, v1); v2 += 2; v1 += 2; --R18_; @@ -2953,14 +2919,12 @@ void WriteSamusWireframeTilemap(void) { // 0x82B20C } while (R20_); } -#define kEquipmentScreenPtrsToItemXYpos ((uint16*)RomPtr(0x82c18e)) void EquipmentScreenDrawItemSelector(void) { // 0x82B267 if (samus_max_reserve_health | (uint16)(collected_items | collected_beams)) { - R18_ = kEquipmentScreenPtrsToItemXYpos[(uint16)(2 * (uint8)pausemenu_equipment_category_item) >> 1]; - uint16 v0 = *(uint16 *)RomPtr_82(R18_ + 4 * HIBYTE(pausemenu_equipment_category_item)) - 1; - uint16 v1 = *(uint16 *)RomPtr_82(R18_ + 4 * HIBYTE(pausemenu_equipment_category_item) + 2); - DrawPauseScreenSpriteAnim(3u, v0, v1); + uint16 *t = (uint16*)RomPtr_82(kEquipmentScreenPtrsToItemXYpos[(uint8)pausemenu_equipment_category_item] + + 4 * HIBYTE(pausemenu_equipment_category_item)); + DrawPauseScreenSpriteAnim(3, t[0] - 1, t[1]); } } @@ -3162,10 +3126,6 @@ uint16 EquipmentScreenCategory_Boots_MoveUpInBoots(uint16 k) { // 0x82B53F pausemenu_equipment_category_item = result; return result; } -#define kEquipmentPtrsToRamTilemapOffsets ((uint16*)RomPtr(0x82c02c)) -#define kEquipmentPtrsToBitmasks ((uint16*)RomPtr(0x82c034)) -#define kEquipmentPtrsToBitsets ((uint16*)RomPtr(0x82c03c)) -#define kEquipmentPtrsToEquipmentTilemaps ((uint16*)RomPtr(0x82c044)) void EquipmentScreenCategory_ButtonResponse(void) { // 0x82B568 if ((joypad1_newkeys & kButton_A) != 0) { QueueSfx1_Max6(0x38u); @@ -3230,7 +3190,6 @@ void DrawMapIcons(void) { // 0x82B672 kMap_Criteria_SavePoints[1] - reg_BG1VOFS); } } -#define kMapIconDataPointers ((MapIconDataPointers*)RomPtr(0x82c7cb)) void DrawFileSelectMapIcons(void) { // 0x82B6DD int16 v0; @@ -3245,8 +3204,8 @@ void DrawFileSelectMapIcons(void) { // 0x82B6DD *(uint16 *)&R0_.bank = 130; R0_.addr = *(VoidP *)((char *)&kMapIconDataPointers[4].crateria + (uint16)(2 * area_index)); v0 = 4 * load_station_index; - uint16 v1 = *(uint16 *)IndirPtr(&R0_, 4 * load_station_index) - reg_BG1HOFS; - uint16 v2 = *(uint16 *)IndirPtr(&R0_, v0 + 2) - reg_BG1VOFS; + uint16 v1 = IndirReadWord(R0_, 4 * load_station_index) - reg_BG1HOFS; + uint16 v2 = IndirReadWord(R0_, v0 + 2) - reg_BG1VOFS; if ((samus_position_indicator_animation_loop_counter & 1) == 0) DrawMenuSpritemap(0x12, v1, v2); DrawMenuSpritemap(a, v1, v2); @@ -3267,21 +3226,17 @@ void DrawFileSelectMapIcons(void) { // 0x82B6DD void DrawSaveStationMapIcon(uint16 a, uint16 k) { // 0x82B798 static const uint8 kShlBit[8] = { 1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80 }; - - - R32 = k; R34 = a; if (area_index == sram_area_index) { R36 = *(uint16 *)&used_save_stations_and_elevators[(uint16)(2 * area_index)]; LOBYTE(R36) = R36 & kShlBit[load_station_index]; - uint16 v2 = *(uint16 *)RomPtr_82(R32 + 2 * area_index); + uint16 v2 = *(uint16 *)RomPtr_82(k + 2 * area_index); if (v2) DrawMapIconsOfType(v2); } } void DrawDebugSaveMapIcons(uint16 a, uint16 k) { // 0x82B7D1 - R32 = k; R34 = a; R36 = *(uint16 *)&used_save_stations_and_elevators[(uint16)(2 * area_index)]; uint16 v2 = *(uint16 *)RomPtr_82(k + 2 * area_index); @@ -3290,7 +3245,6 @@ void DrawDebugSaveMapIcons(uint16 a, uint16 k) { // 0x82B7D1 } void DrawDebugElevatorMapIcons(uint16 a, uint16 k) { // 0x82B7EB - R32 = k; R34 = a; R36 = *(uint16 *)&used_save_stations_and_elevators[(uint16)(2 * area_index) + 1]; uint16 v2 = *(uint16 *)RomPtr_82(k + 2 * area_index); @@ -3299,7 +3253,6 @@ void DrawDebugElevatorMapIcons(uint16 a, uint16 k) { // 0x82B7EB } void DrawSimpleMapIcons(uint16 a, uint16 k) { // 0x82B805 - R32 = k; R34 = a; R36 = -1; uint16 v2 = *(uint16 *)RomPtr_82(k + 2 * area_index); @@ -3312,17 +3265,15 @@ void DrawMapIconsOfType(uint16 a) { // 0x82B81C int16 v4; while (1) { - uint16 *v2 = (uint16 *)RomPtr_82(a); + const uint16 *v2 = (const uint16 *)RomPtr_82(a); if ((*v2 & 0x8000u) != 0) break; v3 = R36 & 1; R36 >>= 1; if (v3) { - v4 = CheckIfMapPositionIsExplored(*v2, v2[1]); - if (v4) { - uint8 *v5 = RomPtr_82(a); - DrawMenuSpritemap(R34, *(uint16 *)v5 - reg_BG1HOFS, *((uint16 *)v5 + 1) - reg_BG1VOFS); - } + v4 = CheckIfMapPositionIsExplored(v2[0], v2[1]); + if (v4) + DrawMenuSpritemap(R34, v2[0] - reg_BG1HOFS, v2[1] - reg_BG1VOFS); } a += 4; } @@ -3345,57 +3296,45 @@ uint16 CheckIfMapPositionIsExplored(uint16 k, uint16 j) { // 0x82B855 } void DrawBossMapIcons(uint16 a, uint16 k) { // 0x82B892 - int16 v4; - char v5; // cf - - R32 = k; - R34 = a; - R36 = boss_bits_for_area[area_index]; - uint8 *v2 = RomPtr_82(k + 2 * area_index); - if (*(uint16 *)v2) { - for (int i = *(uint16 *)v2; ; i += 4) { - v4 = *(uint16 *)RomPtr_82(i); - if (v4 == -1) - return; - if (v4 != -2) { - R3_.addr = 3584; - v5 = R36 & 1; - R36 >>= 1; - if (v5) { - { - uint8 *v7 = RomPtr_82(i); - DrawMenuSpritemap(0x62, *(uint16 *)v7 - reg_BG1HOFS, *((uint16 *)v7 + 1) - reg_BG1VOFS); - R3_.addr = 3072; - } -LABEL_7:; - uint8 *v6 = RomPtr_82(i); - DrawMenuSpritemap(R34, *(uint16 *)v6 - reg_BG1HOFS, *((uint16 *)v6 + 1) - reg_BG1VOFS); - continue; - } - if (has_area_map) - goto LABEL_7; + int bits = boss_bits_for_area[area_index]; + int t = *(uint16 *)RomPtr_82(k + 2 * area_index); + if (t == 0) + return; + const uint16 *v4 = (const uint16 *)RomPtr_82(t); + for (; ; v4 += 2) { + if (v4[0] == 0xffff) + return; + if (v4[0] != 0xfffe) { + R3_.addr = 3584; + int v5 = bits & 1; + bits >>= 1; + if (v5) { + DrawMenuSpritemap(0x62, v4[0] - reg_BG1HOFS, v4[1] - reg_BG1VOFS); + R3_.addr = 3072; + DrawMenuSpritemap(a, v4[0] - reg_BG1HOFS, v4[1] - reg_BG1VOFS); + continue; + } + if (has_area_map) { + DrawMenuSpritemap(a, v4[0] - reg_BG1HOFS, v4[1] - reg_BG1VOFS); + continue; } - R36 >>= 1; } + bits >>= 1; } } void DrawMapScrollArrowAndCheckToScroll(uint8 db, uint16 k) { // 0x82B90A - uint16 *v1 = (uint16 *)RomPtrWithBank(db, k); + const uint16 *v1 = (const uint16 *)RomPtrWithBank(db, k); DrawPauseScreenSpriteAnim(v1[2], *v1, v1[1]); - uint8 *v2 = RomPtrWithBank(db, k); - if ((joypad1_lastkeys & *((uint16 *)v2 + 3)) != 0 && !map_scrolling_direction) - map_scrolling_direction = *((uint16 *)v2 + 4); + const uint8 *v2 = RomPtrWithBank(db, k); + if ((joypad1_lastkeys & GET_WORD(v2 + 6)) != 0 && !map_scrolling_direction) + map_scrolling_direction = GET_WORD(v2 + 8); } void sub_82B932(void) { // 0x82B932 HandleMapScrollArrows(); } -#define g_stru_82B9A0 ((MapScrollArrowData*)RomPtr(0x82b9a0)) -#define g_stru_82B9AA ((MapScrollArrowData*)RomPtr(0x82b9aa)) -#define g_stru_82B9B4 ((MapScrollArrowData*)RomPtr(0x82b9b4)) -#define g_stru_82B9BE (*(MapScrollArrowData*)RomPtr(0x82b9be)) void HandleMapScrollArrows(void) { // 0x82B934 if (sign16(map_min_x_scroll - 24 - reg_BG1HOFS)) @@ -3472,7 +3411,6 @@ void DrawMenuSelectionMissile(void) { // 0x82BA6E enemy_projectile_id[5], enemy_projectile_id[10]); } -#define file_copy_arrow_stuff ((FileCopyArrowStuff*)RomPtr(0x82bb0c)) void DrawFileCopyArrow(void) { // 0x82BABA uint16 v0; if ((int16)(enemy_projectile_id[16] - enemy_projectile_id[17]) >= 0) { @@ -3496,15 +3434,14 @@ void DrawFileCopyArrow(void) { // 0x82BABA file_copy_arrow_stuff[v0].xpos, file_copy_arrow_stuff[v0].ypos); } -#define kMapElevatorDests ((uint16*)RomPtr(0x82c74d)) void DisplayMapElevatorDestinations(void) { // 0x82BB30 R3_.addr = 0; if (map_station_byte_array[area_index]) { for (int i = kMapElevatorDests[area_index]; ; i += 6) { - uint8 *v1 = RomPtr_82(i); - if (*(uint16 *)v1 == 0xFFFF) + const uint8 *v1 = RomPtr_82(i); + if (GET_WORD(v1) == 0xFFFF) break; - DrawMenuSpritemap(*((uint16 *)v1 + 2), *(uint16 *)v1 - reg_BG1HOFS, *((uint16 *)v1 + 1) - reg_BG1VOFS); + DrawMenuSpritemap(GET_WORD(v1 + 4), GET_WORD(v1) - reg_BG1HOFS, GET_WORD(v1 + 2) - reg_BG1VOFS); } } } @@ -3529,15 +3466,15 @@ void sub_82BB7F(uint16 a) { // 0x82BB7F uint16 current_instruction = enemy_data[0].current_instruction; enemy_data[0].instruction_timer = a - 1; if (a == 1) { - uint8 *v2 = RomPtr_82(enemy_data[0].current_instruction); - if (*((uint16 *)v2 + 3) == 0xFFFF) { + const uint8 *v2 = RomPtr_82(enemy_data[0].current_instruction); + if (GET_WORD(v2 + 6) == 0xFFFF) { sub_82BBDD(); - } else if ((int16)(*((uint16 *)v2 + 3) + 1) >= 0) { - enemy_data[0].instruction_timer = *((uint16 *)v2 + 3); + } else if ((int16)(GET_WORD(v2 + 6) + 1) >= 0) { + enemy_data[0].instruction_timer = GET_WORD(v2 + 6); enemy_data[0].current_instruction += 6; DrawBabyMetroid(current_instruction + 6); } else { - R18_ = *((uint16 *)v2 + 3); + R18_ = GET_WORD(v2 + 6); CallBabyMetroidPlaySfx(R18_ | 0x820000); } } else { @@ -3553,24 +3490,20 @@ void sub_82BBDD(void) { // 0x82BBDD void DrawBabyMetroid(uint16 k) { // 0x82BB9E uint16 v1 = *((uint16 *)RomPtr_82(k) + 2); - uint16 v2 = 0; - do { - palette_buffer[(v2 >> 1) + 192] = *(uint16 *)RomPtr_82(v1); - v1 += 2; - v2 += 2; - } while ((int16)(v2 - 32) < 0); + for(int i = 0; i < 32; i += 2) + palette_buffer[(i >> 1) + 192] = *(uint16 *)RomPtr_82(v1 + i); R3_.addr = 2048; - uint8 *v3 = RomPtr_82(k); - DrawMenuSpritemap(*((uint16 *)v3 + 1), 0x7C, 0x50); + const uint8 *v3 = RomPtr_82(k); + DrawMenuSpritemap(GET_WORD(v3 + 2), 0x7C, 0x50); R3_.addr = 2560; DrawMenuSpritemap(0x64, 0x7C, 0x50); } void FinishProcessingGameOverBabyMetroidAsm(void) { // 0x82BBF0 - uint16 current_instruction = enemy_data[0].current_instruction; - enemy_data[0].instruction_timer = *((uint16 *)RomPtr_82(enemy_data[0].current_instruction) + 4); + uint16 t = *((uint16 *)RomPtr_82(enemy_data[0].current_instruction) + 4); + enemy_data[0].instruction_timer = t; enemy_data[0].current_instruction += 8; - if (*(uint16 *)RomPtr_82(current_instruction + 8) == 0xFFFF) + if (t == 0xFFFF) sub_82BBDD(); else DrawBabyMetroid(enemy_data[0].current_instruction); @@ -3666,44 +3599,22 @@ uint8 AdvancePaletteFadeForAllPalettes(void) { // 0x82DA02 } uint16 CalculateNthTransitionColorFromXtoY(uint16 a, uint16 k, uint16 j) { // 0x82DA4A - int16 v3; - char v4; // t0 - int16 v8; - - uint16 v7 = CalculateNthTransitionColorComponentFromXtoY(a, k & 0x1F, j & 0x1F); - v8 = v7 | (32 * CalculateNthTransitionColorComponentFromXtoY(a, (k >> 5) & 0x1F, (j >> 5) & 0x1F)); - v3 = 4 - * CalculateNthTransitionColorComponentFromXtoY( - a, - ((uint16)(k >> 2) >> 8) & 0x1F, - ((uint16)(j >> 2) >> 8) & 0x1F); - v4 = v3; - LOBYTE(v3) = HIBYTE(v3); - HIBYTE(v3) = v4; - return v8 | v3; + return CalculateNthTransitionColorComponentFromXtoY(a, k & 0x1F, j & 0x1F) | + CalculateNthTransitionColorComponentFromXtoY(a, (k >> 5) & 0x1F, (j >> 5) & 0x1F) << 5 | + CalculateNthTransitionColorComponentFromXtoY(a, (k >> 10) & 0x1F, (j >> 10) & 0x1F) << 10; } uint16 CalculateNthTransitionColorComponentFromXtoY(uint16 a, uint16 k, uint16 j) { // 0x82DAA6 - int16 v4; - char v6; // t0 - int16 v8; - if (!a) return k; - v4 = a - 1; + uint16 v4 = a - 1; if (v4 == palette_change_denom) return j; R20_ = v4 + 1; R18_ = j - k; - uint16 v5 = abs16(j - k); - v6 = v5; - LOBYTE(v5) = HIBYTE(v5); - HIBYTE(v5) = v6; - uint16 RegWord = SnesDivide(v5 & 0xFF00, palette_change_denom - R20_ + 1); + uint16 RegWord = SnesDivide((abs16(j - k) << 8) & 0xFF00, palette_change_denom - R20_ + 1); R18_ = sign16(R18_) ? -RegWord : RegWord; - LOBYTE(v8) = HIBYTE(k); - HIBYTE(v8) = k; - return (uint16)(R18_ + v8) >> 8; + return (uint16)(R18_ + (k << 8)) >> 8; } uint8 sub_82DAF7(uint16 a) { // 0x82DAF7 @@ -3941,7 +3852,7 @@ void LoadDoorHeader(void) { // 0x82DE12 else samus_distance_from_door = 200; } - *(uint16 *)((char *)&R18_ + 1) = samus_distance_from_door; + R19_ = samus_distance_from_door; samus_door_transition_subspeed = R18_; samus_door_transition_speed = R20_; } @@ -3965,7 +3876,6 @@ void LoadRoomHeader(void) { // 0x82DE6F uint16 prod = Mult8x8(room_width_in_blocks, room_height_in_blocks); room_size_in_blocks = 2 * prod; } -#define kStateHeaderGraphicsSets ((uint16*)RomPtr(0x8fe7a7)) void LoadStateHeader(void) { // 0x82DEF2 StateHeaderTiles *StateHeaderTiles; // r10 RoomDefRoomstate *RoomDefRoomstate; // r11 @@ -4085,7 +3995,6 @@ void PlayRoomMusicTrackAfterAFrames(uint16 a) { // 0x82E118 } } -#define kCommonSpritesPalette1 ((uint16*)RomPtr(0x9afc00)) void LoadColorsForSpritesBeamsAndEnemies(void) { // 0x82E139 uint16 j; uint16 k; @@ -4292,9 +4201,6 @@ CoroutineRet DoorTransitionFunction_SetupScrolling(void) { // 0x82E38E } CoroutineRet DoorTransitionFunction_PlaceSamusLoadTiles(void) { // 0x82E3C0 - static const LongPtr unk_82E421 = LONGPTR(0x7e7000); - static const LongPtr unk_82E432 = LONGPTR(0x7e2000); - static const LongPtr unk_82E443 = LONGPTR(0x7ec200); static const CopyToVramAtNextInterruptArgs unk_82E449 = { LONGPTR(0x7e2000), 0x0000, 0x2000 }; static const CopyToVramAtNextInterruptArgs unk_82E453 = { LONGPTR(0x7e4000), 0x1000, 0x2000 }; static const CopyToVramAtNextInterruptArgs unk_82E45D = { LONGPTR(0x7e6000), 0x2000, 0x1000 }; @@ -4315,18 +4221,15 @@ CoroutineRet DoorTransitionFunction_PlaceSamusLoadTiles(void) { // 0x82E3C0 v0 = 22; irqhandler_next_handler = v0; WaitUntilEndOfVblankAndEnableIrq(); - if ((cre_bitset & 2) != 0 && door_def_ptr != (uint16)addr_kDoorDef_947a) { - mov24(&decompress_src, 0xb98000); - DecompressToMem_IpArg(&unk_82E421); + if ((cre_bitset & 2) != 0 && door_def_ptr != addr_kDoorDef_947a) { + DecompressToMem(0xb98000, g_ram + 0x7000); } - copy24(&decompress_src, &tileset_tiles_pointer); - DecompressToMem_IpArg(&unk_82E432); - copy24(&decompress_src, &tileset_compr_palette_ptr); - DecompressToMem_IpArg(&unk_82E443); + DecompressToMem(Load24(&tileset_tiles_pointer), g_ram + 0x2000); + DecompressToMem(Load24(&tileset_compr_palette_ptr), g_ram + 0xc200); CopyToVramAtNextInterrupt(&unk_82E449); CopyToVramAtNextInterrupt(&unk_82E453); CopyToVramAtNextInterrupt(&unk_82E45D); - if ((cre_bitset & 6) != 0 && door_def_ptr != (uint16)addr_kDoorDef_947a) { + if ((cre_bitset & 6) != 0 && door_def_ptr != addr_kDoorDef_947a) { CopyToVramAtNextInterrupt(&unk_82E477); CopyToVramAtNextInterrupt(&unk_82E481); CopyToVramAtNextInterrupt(&unk_82E48B); @@ -4349,7 +4252,7 @@ static Func_Y_Y *const kUpdateBackgroundCommands[8] = { }; CoroutineRet DoorTransitionFunction_LoadMoreThings_Async(void) { - int16 bg_data_ptr; + uint16 bg_data_ptr; COROUTINE_BEGIN(coroutine_state_1, 0); @@ -4377,7 +4280,7 @@ CoroutineRet DoorTransitionFunction_LoadMoreThings_Async(void) { WaitForIrqDoorTransitionVramUpdate(); } bg_data_ptr = get_RoomDefRoomstate(roomdefroomstate_ptr)->bg_data_ptr; - if (bg_data_ptr < 0) { + if (bg_data_ptr & 0x8000) { do { int v1 = *(uint16 *)RomPtr_8F(bg_data_ptr) >> 1; bg_data_ptr = kUpdateBackgroundCommands[v1](bg_data_ptr + 2); @@ -4444,22 +4347,17 @@ uint16 UpdateBackgroundCommand_E_DoorDependentTransferToVRAM(uint16 j) { // 0x8 } uint16 UpdateBackgroundCommand_2_TransferToVram(uint16 j) { // 0x82E5EB - uint8 *v1 = RomPtr_8F(j); - door_transition_vram_update_dst = *(uint16 *)(v1 + 3); + const uint8 *v1 = RomPtr_8F(j); + door_transition_vram_update_dst = GET_WORD(v1 + 3); copy24(&door_transition_vram_update_src, (LongPtr *)v1); - door_transition_vram_update_size = *(uint16 *)(v1 + 5); + door_transition_vram_update_size = GET_WORD(v1 + 5); WaitForIrqDoorTransitionVramUpdate(); return j + 7; } uint16 UpdateBackgroundCommand_4_Decompression(uint16 j) { // 0x82E616 - LongPtr *v1; - - v1 = (LongPtr *)RomPtr_8F(j); - copy24(&decompress_src, v1); - *(VoidP *)((char *)&decompress_dst.addr + 1) = 32256; - decompress_dst.addr = v1[1].addr; - DecompressToMem(); + const uint8 *v1 = RomPtr_8F(j); + DecompressToMem(Load24((LongPtr *)v1), g_ram + GET_WORD(v1 + 3)); return j + 5; } @@ -4556,18 +4454,11 @@ void LoadDestinationRoomThings(void) { // 0x82E76B void LoadCRETilesTilesetTilesAndPalette(void) { // 0x82E783 elevator_flags = 0; WriteRegWord(VMAIN, 0x80); - mov24(&decompress_src, 0xb98000); - decompress_dst.addr = addr_unk_605000; - WriteRegWord(VMADDL, 0x2800); - DecompressToVRAM(); - copy24(&decompress_src, &tileset_tiles_pointer); + WriteRegWord(VMADDL, addr_unk_605000 >> 1); + DecompressToVRAM(0xb98000, addr_unk_605000); WriteRegWord(VMADDL, 0); - decompress_dst.addr = 0; - DecompressToVRAM(); - *(VoidP *)((char *)&decompress_src.addr + 1) = *(VoidP *)((char *)&tileset_compr_palette_ptr.addr + 1); - decompress_src.addr = tileset_compr_palette_ptr.addr; - static const LongPtr unk_82E7CD = LONGPTR(0x7ec200); - DecompressToMem_IpArg(&unk_82E7CD); + DecompressToVRAM(Load24(&tileset_tiles_pointer), 0); + DecompressToMem(Load24(&tileset_compr_palette_ptr), &g_ram[0xc200]); } void LoadLevelDataAndOtherThings(void) { // 0x82E7D3 @@ -4580,19 +4471,12 @@ void LoadLevelDataAndOtherThings(void) { // 0x82E7D3 uint16 m; char v10; char v11; - uint16 n; char v14; - static const LongPtr unk_82E849 = LONGPTR(0x7ea000); - static const LongPtr unk_82E85A = LONGPTR(0x7ea800); - static const LongPtr unk_82E86D = LONGPTR(0x7ea000); - for (int i = 25598; i >= 0; i -= 2) level_data[i >> 1] = 0x8000; - copy24(&decompress_src, &room_compr_level_data_ptr); - static const DecompressToParams unk_82E7F8 = { LONGPTR(0x7f0000) }; - DecompressToMem_IpArg(&unk_82E7F8); + DecompressToMem(Load24(&room_compr_level_data_ptr), g_ram + 0x10000); uint16 v1 = ram7F_start; for (j = ram7F_start + ram7F_start + (ram7F_start >> 1); ; custom_background[v1 >> 1] = level_data[j >> 1]) { j -= 2; @@ -4608,13 +4492,10 @@ void LoadLevelDataAndOtherThings(void) { // 0x82E7D3 break; } if (area_index == 6) { - copy24(&decompress_src, &tileset_tile_table_pointer); - DecompressToMem_IpArg(&unk_82E86D); + DecompressToMem(Load24(&tileset_tile_table_pointer), g_ram + 0xa000); } else { - mov24(&decompress_src, 0xb9a09d); - DecompressToMem_IpArg(&unk_82E849); - copy24(&decompress_src, &tileset_tile_table_pointer); - DecompressToMem_IpArg(&unk_82E85A); + DecompressToMem(0xb9a09d, g_ram + 0xa000); + DecompressToMem(Load24(&tileset_tile_table_pointer), g_ram + 0xa800); } RoomDefRoomstate = get_RoomDefRoomstate(roomdefroomstate_ptr); rdf_scroll_ptr = RoomDefRoomstate->rdf_scroll_ptr; @@ -4654,7 +4535,7 @@ void LoadLevelDataAndOtherThings(void) { // 0x82E7D3 void SpawnDoorClosingPLM(void) { // 0x82E8EB if (!CheckIfColoredDoorCapSpawned()) { - uint16 *v0 = (uint16 *)RomPtr_8F(2 * door_direction + addr_kDoorClosingPlmIds); + const uint16 *v0 = (const uint16 *)RomPtr_8F(2 * door_direction + addr_kDoorClosingPlmIds); if (*v0) { R18_ = *v0; R20_ = *(uint16 *)&get_DoorDef(door_def_ptr)->x_pos_plm; @@ -4664,15 +4545,9 @@ void SpawnDoorClosingPLM(void) { // 0x82E8EB } uint8 CheckIfColoredDoorCapSpawned(void) { // 0x82E91C - DoorDef *DoorDef; - int16 x_pos_plm; - int16 v2; - int16 v6; - - DoorDef = get_DoorDef(door_def_ptr); - uint16 prod = Mult8x8(DoorDef->y_pos_plm, room_width_in_blocks); - x_pos_plm = DoorDef->x_pos_plm; - v2 = 2 * (prod + x_pos_plm); + DoorDef *DD = get_DoorDef(door_def_ptr); + uint16 prod = Mult8x8(DD->y_pos_plm, room_width_in_blocks); + uint16 v2 = 2 * (prod + DD->x_pos_plm); uint16 v3 = 78; while (v2 != plm_block_indices[v3 >> 1]) { v3 -= 2; @@ -4682,18 +4557,17 @@ uint8 CheckIfColoredDoorCapSpawned(void) { // 0x82E91C int v5 = v3 >> 1; if (!plm_header_ptr[v5]) return 0; - v6 = plm_room_arguments[v5]; + int16 v6 = plm_room_arguments[v5]; if (v6 >= 0) { int idx = PrepareBitAccess(v6); if ((bitmask & opened_door_bit_array[idx]) != 0) return 0; } - int v7 = v3 >> 1; - plm_instruction_timer[v7] = 1; - uint16 v8 = plm_header_ptr[v7]; + plm_instruction_timer[v5] = 1; + uint16 v8 = plm_header_ptr[v5]; if (!v8) return 0; - plm_instr_list_ptrs[v3 >> 1] = get_PlmHeader_Size4(v8)[1].func_ptr; + plm_instr_list_ptrs[v5] = get_PlmHeader_Size6(v8)->instr_list_2_ptr; return 1; } @@ -4709,7 +4583,7 @@ static Func_Y_Y *const kLoadLibraryBackgroundFuncs[8] = { // 0x82E97C }; void LoadLibraryBackground(void) { - int16 bg_data_ptr; + uint16 bg_data_ptr; ClearFXTilemap(); if (fx_tilemap_ptr) { @@ -4722,7 +4596,7 @@ void LoadLibraryBackground(void) { WriteReg(MDMAEN, 2u); } bg_data_ptr = get_RoomDefRoomstate(roomdefroomstate_ptr)->bg_data_ptr; - if (bg_data_ptr < 0) { + if (bg_data_ptr & 0x8000) { do { uint16 v1 = *(uint16 *)RomPtr_8F(bg_data_ptr); bg_data_ptr += 2; @@ -4743,7 +4617,7 @@ uint16 LoadLibraryBackgroundFunc_E_DoorDependentTransferToVram(uint16 j) { // 0 } uint16 LoadLibraryBackgroundFunc_2_TransferToVram(uint16 j) { // 0x82E9F9 - uint16 *LoadBg_28 = (uint16 *)get_LoadBg_28(j); + uint16 *LoadBg_28 = (uint16 *)RomPtr_8F(j); WriteRegWord(VMADDL, *(uint16 *)((char *)LoadBg_28 + 3)); WriteRegWord(DMAP1, 0x1801); WriteRegWord(A1T1L, *LoadBg_28); @@ -4755,13 +4629,8 @@ uint16 LoadLibraryBackgroundFunc_2_TransferToVram(uint16 j) { // 0x82E9F9 } uint16 LoadLibraryBackgroundFunc_4_Decompress(uint16 j) { // 0x82EA2D - LongPtr *LoadBg_28; - - LoadBg_28 = (LongPtr *)get_LoadBg_28(j); - copy24(&decompress_src, LoadBg_28); - *(VoidP *)((char *)&decompress_dst.addr + 1) = 32256; - decompress_dst.addr = LoadBg_28[1].addr; - DecompressToMem(); + const uint8 *p = RomPtr_8F(j); + DecompressToMem(Load24((LongPtr *)p), g_ram + GET_WORD(p + 3)); return j + 5; } @@ -4797,10 +4666,6 @@ void LoadLevelScrollAndCre(void) { // 0x82EA73 char v11; char v12; - static const LongPtr unk_82EAA0 = LONGPTR(0x7f0000); - static const LongPtr unk_82EAF9 = LONGPTR(0x7ea000); - static const LongPtr unk_82EB0A = LONGPTR(0x7ea800); - static const LongPtr unk_82EB1D = LONGPTR(0x7ea000); for (int i = 6398; i >= 0; i -= 2) { level_data[i >> 1] = 0x8000; @@ -4808,8 +4673,7 @@ void LoadLevelScrollAndCre(void) { // 0x82EA73 level_data[(i >> 1) + 3200 * 2] = 0x8000; level_data[(i >> 1) + 3200 * 3] = 0x8000; } - copy24(&decompress_src, &room_compr_level_data_ptr); - DecompressToMem_IpArg(&unk_82EAA0); + DecompressToMem(Load24(&room_compr_level_data_ptr), g_ram + 0x10000); uint16 v1 = ram7F_start; for (j = ram7F_start + ram7F_start + (ram7F_start >> 1); ; custom_background[v1 >> 1] = level_data[j >> 1]) { j -= 2; @@ -4827,15 +4691,12 @@ void LoadLevelScrollAndCre(void) { // 0x82EA73 break; } if (area_index == 6) { - copy24(&decompress_src, &tileset_tile_table_pointer); - DecompressToMem_IpArg(&unk_82EB1D); + DecompressToMem(Load24(&tileset_tile_table_pointer), g_ram + 0xa000); } else { if ((cre_bitset & 2) != 0) { - mov24(&decompress_src, 0xb9a09d); - DecompressToMem_IpArg(&unk_82EAF9); + DecompressToMem(0xb9a09d, g_ram + 0xa000); } - copy24(&decompress_src, &tileset_tile_table_pointer); - DecompressToMem_IpArg(&unk_82EB0A); + DecompressToMem(Load24(&tileset_tile_table_pointer), g_ram + 0xa800); } RoomDefRoomstate = get_RoomDefRoomstate(roomdefroomstate_ptr); rdf_scroll_ptr = RoomDefRoomstate->rdf_scroll_ptr; @@ -4868,7 +4729,7 @@ void CreatePlmsExecuteDoorAsmRoomSetup(void) { // 0x82EB6C RoomDefRoomstate *RoomDefRoomstate; RoomDefRoomstate = get_RoomDefRoomstate(roomdefroomstate_ptr); if (RoomDefRoomstate->room_plm_header_ptr) { - for (int i = RoomDefRoomstate->room_plm_header_ptr; get_PlmHeader_Size6(i)->func_ptr; i += 6) + for (int i = RoomDefRoomstate->room_plm_header_ptr; get_RoomPlmEntry(i)->plm_header_ptr_; i += 6) SpawnRoomPLM(i); } RunDoorSetupCode(); @@ -4916,16 +4777,8 @@ void GameOptionsMenuFunc_0(void) { // 0x82EBDB } } -#define kMenuPalettes ((uint16*)RomPtr(0x8ee400)) void GameOptionsMenu_1_LoadingOptionsScreen(void) { // 0x82EC11 uint16 j; - - static const DecompressToParams unk_82EC74 = { LONGPTR(0x7fc000) }; - static const DecompressToParams unk_82EC85 = { LONGPTR(0x7fc800) }; - static const DecompressToParams unk_82EC96 = { LONGPTR(0x7fd000) }; - static const DecompressToParams unk_82ECA7 = { LONGPTR(0x7fd800) }; - static const DecompressToParams unk_82ECB8 = { LONGPTR(0x7fe000) }; - reg_BG12NBA = 0; reg_TM = 19; reg_TS = 0; @@ -4948,16 +4801,11 @@ void GameOptionsMenu_1_LoadingOptionsScreen(void) { // 0x82EC11 debug_invincibility = 0; for (int i = 510; i >= 0; i -= 2) palette_buffer[i >> 1] = kMenuPalettes[i >> 1]; - mov24(&decompress_src, 0x978DF4); - DecompressToMem_IpArg(&unk_82EC74); - mov24(&decompress_src, 0x978FCD); - DecompressToMem_IpArg(&unk_82EC85); - mov24(&decompress_src, 0x9791C4); - DecompressToMem_IpArg(&unk_82EC96); - mov24(&decompress_src, 0x97938D); - DecompressToMem_IpArg(&unk_82ECA7); - mov24(&decompress_src, 0x97953A); - DecompressToMem_IpArg(&unk_82ECB8); + DecompressToMem(0x978DF4, g_ram + 0x1c000); + DecompressToMem(0x978FCD, g_ram + 0x1c800); + DecompressToMem(0x9791C4, g_ram + 0x1d000); + DecompressToMem(0x97938D, g_ram + 0x1d800); + DecompressToMem(0x97953A, g_ram + 0x1e000); for (j = 1023; (j & 0x8000u) == 0; --j) ram3000.pause_menu_map_tilemap[j] = custom_background[j + 5375]; menu_option_index = 0; @@ -5206,10 +5054,9 @@ void GameOptionsMenu_8_SpecialSettings(void) { GameOptionsMenuItemFunc_4(); } } -#define kOptionsMenuSpecialPtrs ((uint16*)RomPtr(0x82f0ae)) void GameOptionsMenuSpecialSettings_0(void) { // 0x82F08E uint8 *v0 = RomPtr_RAM(kOptionsMenuSpecialPtrs[menu_option_index]); - if (*(uint16 *)v0) + if (GET_WORD(v0)) *(uint16 *)v0 = 0; else *(uint16 *)v0 = 1; @@ -5341,14 +5188,13 @@ void sub_82F296(uint16 j) { // 0x82F296 enemy_projectile_x_vel[v1 + 3] = 56; enemy_projectile_x_vel[v1 + 11] = 3584; } -#define off_82F2ED ((uint16*)RomPtr(0x82f2ed)) void OptionsPreInstr_F2A9(uint16 v0) { // 0x82F2A9 if (game_state == kGameState_2_GameOptionsMenu) { int v2 = game_options_screen_index; uint16 v3 = off_82F2ED[v2]; if (v3) { R18_ = off_82F2ED[v2]; - uint16 *v4 = (uint16 *)RomPtr_82(v3 + 4 * menu_option_index); + const uint16 *v4 = (const uint16 *)RomPtr_82(v3 + 4 * menu_option_index); int v5 = v0 >> 1; enemy_projectile_y_pos[v5 + 13] = *v4; enemy_projectile_x_vel[v5 + 3] = v4[1]; @@ -5444,7 +5290,6 @@ void OptionsPreInstr_F42C(uint16 k) { // 0x82F42C enemy_projectile_y_vel[v1 + 17] = addr_off_82F4B6; } } -#define off_82F54A ((uint16*)RomPtr(0x82f54a)) void LoadControllerOptionsFromControllerBindings(void) { // 0x82F4DC int16 v2; @@ -5496,8 +5341,6 @@ uint8 OptionsMenuFunc8(void) { } while (v2 < 12); return 0; } -#define g_word_82F639 ((uint16*)RomPtr(0x82f639)) -#define g_off_82F647 ((uint16*)RomPtr(0x82f647)) static const uint16 g_word_82F6AD[6] = { // 0x82F587 0, 0xe, @@ -5513,7 +5356,7 @@ void OptionsMenuFunc6(void) { v4 = v0; int v1 = v0 >> 1; uint16 v2 = g_word_82F639[v1]; - uint16 *v3 = (uint16 *)RomPtr_82(g_off_82F647[(uint16)(2 * enemy_projectile_F[v1 + 13]) >> 1]); + const uint16 *v3 = (const uint16 *)RomPtr_82(g_off_82F647[(uint16)(2 * enemy_projectile_F[v1 + 13]) >> 1]); *(uint16 *)((char *)ram3000.pause_menu_map_tilemap + v2) = *v3; *(uint16 *)((char *)&ram3000.pause_menu_map_tilemap[1] + v2) = v3[1]; *(uint16 *)((char *)&ram3000.pause_menu_map_tilemap[2] + v2) = v3[2]; @@ -5560,4 +5403,4 @@ void OptionsMenuControllerFunc_0(void) { // 0x82F6B9 enemy_projectile_F[v4 + 13] = R18_; enemy_projectile_F[(v2 >> 1) + 13] = R20_; OptionsMenuFunc6(); -} +} \ No newline at end of file diff --git a/src/sm_84.c b/src/sm_84.c index af4d181..2753088 100644 --- a/src/sm_84.c +++ b/src/sm_84.c @@ -4,22 +4,30 @@ #include "sm_rtl.h" #include "funcs.h" -void CallPlmPreInstr(uint32 ea, uint16 k); -uint16 CallPlmInstr(uint32 ea, uint16 j, uint16 k); -#define kGoldenTorizoPalette1 ((uint16*)RomPtr(0x848032)) -#define kGoldenTorizoPalette2 ((uint16*)RomPtr(0x848132)) -#define kXrayBlockDrawingInstrs ((uint16*)RomPtr(0x84839d)) -#define kGrayDoorPreInstrs ((uint16*)RomPtr(0x84be4b)) -#define kDowardGatePlmListPtrs ((uint16*)RomPtr(0x84c70a)) -#define kDowardGateLeftBlockBts ((uint16*)RomPtr(0x84c71a)) -#define kDowardGateRightBlockBts ((uint16*)RomPtr(0x84c72a)) -#define kUpwardGatePlmListPtrs ((uint16*)RomPtr(0x84c764)) -#define kUpwardGateLeftBlockBts ((uint16*)RomPtr(0x84c774)) -#define kUpwardGateRightBlockBts ((uint16*)RomPtr(0x84c784)) -#define off_84DB28 ((uint16*)RomPtr(0x84db28)) -#define off_84E05F ((uint16*)RomPtr(0x84e05f)) -#define off_84E077 ((uint16*)RomPtr(0x84e077)) +#define kGoldenTorizoPalette1 ((uint16*)RomFixedPtr(0x848032)) +#define kGoldenTorizoPalette2 ((uint16*)RomFixedPtr(0x848132)) +#define kXrayBlockDrawingInstrs ((uint16*)RomFixedPtr(0x84839d)) +#define kGrayDoorPreInstrs ((uint16*)RomFixedPtr(0x84be4b)) +#define kDowardGatePlmListPtrs ((uint16*)RomFixedPtr(0x84c70a)) +#define kDowardGateLeftBlockBts ((uint16*)RomFixedPtr(0x84c71a)) +#define kDowardGateRightBlockBts ((uint16*)RomFixedPtr(0x84c72a)) +#define kUpwardGatePlmListPtrs ((uint16*)RomFixedPtr(0x84c764)) +#define kUpwardGateLeftBlockBts ((uint16*)RomFixedPtr(0x84c774)) +#define kUpwardGateRightBlockBts ((uint16*)RomFixedPtr(0x84c784)) +#define off_84DB28 ((uint16*)RomFixedPtr(0x84db28)) +#define off_84E05F ((uint16*)RomFixedPtr(0x84e05f)) +#define off_84E077 ((uint16*)RomFixedPtr(0x84e077)) +#define fnPlmPreInstr_Empty4 0x848AA6 +#define kPlmVramAddresses ((uint16*)RomFixedPtr(0x8487cd)) +#define kPlmTileDataOffs ((uint16*)RomFixedPtr(0x8487d5)) +#define kPlmStartingTileNumber ((uint16*)RomFixedPtr(0x8487dd)) + + + +void CallPlmPreInstr(uint32 ea, uint16 k); +const uint8 *CallPlmInstr(uint32 ea, const uint8 *j, uint16 k); + void SetGoldenTorizoPalette(uint16 a) { // 0x848000 int16 v1; @@ -39,13 +47,12 @@ void SetGoldenTorizoPalette(uint16 a) { // 0x848000 void LoadRoomPlmGfx(void) { // 0x848232 plm_item_gfx_index = 0; - uint16 v0 = 0, v1; + int v0 = 0; do { - v1 = v0; if (plm_item_gfx_ptrs[v0 >> 1]) // bugfix - PlmInstr_LoadItemPlmGfx(plm_item_gfx_ptrs[v0 >> 1], v0); + PlmInstr_LoadItemPlmGfx(RomPtr_84(plm_item_gfx_ptrs[v0 >> 1]), v0); v0 += 2; - } while (v1 != 6); + } while (v0 != 8); } void ClearSoundsWhenGoingThroughDoor(void) { // 0x848250 @@ -73,34 +80,18 @@ void CalculatePlmBlockCoords(uint16 k) { // 0x848290 } void WriteLevelDataBlockTypeAndBts(uint16 k, uint16 a) { // 0x8482B4 - R18_ = a; - uint8 *v2 = RomPtr_7F(k); + uint8 *v2 = &g_ram[0x10000 + k]; v2[3] = HIBYTE(a) | v2[3] & 0xF; - BTS[k >> 1] = R18_; + BTS[k >> 1] = a; } void WriteRowOfLevelDataBlockAndBTS(uint16 k, uint16 arg0, uint16 arg1, uint16 arg2) { // 0x8482D6 - uint16 v1 = k; - - R18_ = arg0; - R20_ = arg1; - R22_ = arg2; - uint16 v2 = plm_block_indices[v1 >> 1]; + uint16 v2 = plm_block_indices[k >> 1]; uint16 v8 = v2 >> 1; - uint16 v3 = R18_; - uint16 v4 = R22_; - do { - level_data[v2 >> 1] = v3; - v2 += 2; - --v4; - } while (v4); - uint16 v5 = v8; - uint8 v6 = R20_; - uint16 v7 = R22_; - do { - BTS[v5++] = v6; - --v7; - } while (v7); + for (int i = 0; i < arg2; i++) { + level_data[(v2 + i * 2) >> 1] = arg0; + BTS[v8 + i] = arg1; + } } void LoadXrayBlocks(void) { // 0x84831A @@ -110,14 +101,14 @@ void LoadXrayBlocks(void) { // 0x84831A for (int i = 78; i >= 0; i -= 2) { int v1 = i >> 1; - if (plm_header_ptr[v1] >= (uint16)FUNC16(PlmPreInstr_GotoLinkIfTriggered)) { + if (plm_header_ptr[v1] >= FUNC16(PlmPreInstr_GotoLinkIfTriggered)) { uint16 k = i; uint16 v2 = item_bit_array[PrepareBitAccess(plm_room_arguments[v1])]; i = k; if ((bitmask & v2) == 0) { CalculatePlmBlockCoords(k); - uint8 *v3 = RomPtr_84(kXrayBlockDrawingInstrs[plm_variables[k >> 1] >> 1]); - LoadBlockToXrayTilemap(*((uint16 *)v3 + 1) & 0xFFF, plm_x_block, plm_y_block); + const uint8 *v3 = RomPtr_84(kXrayBlockDrawingInstrs[plm_variables[k >> 1] >> 1]); + LoadBlockToXrayTilemap(GET_WORD(v3 + 2) & 0xFFF, plm_x_block, plm_y_block); i = k; } } @@ -125,13 +116,13 @@ void LoadXrayBlocks(void) { // 0x84831A RoomDefRoomstate = get_RoomDefRoomstate(roomdefroomstate_ptr); if (RoomDefRoomstate->xray_special_casing_ptr) { for (j = RoomDefRoomstate->xray_special_casing_ptr; ; j += 4) { - uint8 *v6 = RomPtr_8F(j); - v7 = *(uint16 *)v6; - if (!*(uint16 *)v6) + const uint8 *v6 = RomPtr_8F(j); + v7 = GET_WORD(v6); + if (!GET_WORD(v6)) break; R18_ = (uint8)v7; R20_ = v6[1]; - LoadBlockToXrayTilemap(*((uint16 *)v6 + 1), (uint8)v7, R20_); + LoadBlockToXrayTilemap(GET_WORD(v6 + 2), (uint8)v7, R20_); } } } @@ -371,29 +362,31 @@ CoroutineRet PlmHandler_Async(void) { // 0x8485B4 CallPlmPreInstr(plm_pre_instrs[plm_id >> 1] | 0x840000, plm_id); if (--plm_instruction_timer[plm_id >> 1]) continue; - uint16 v4, *v5; - v4 = plm_instr_list_ptrs[plm_id >> 1]; + const uint8 *base, *v5; + base = RomPtr_84(0x8000) - 0x8000; + v5 = base + plm_instr_list_ptrs[plm_id >> 1]; while (1) { - v5 = (uint16 *)RomPtr_84(v4); - if ((*v5 & 0x8000u) == 0) + if ((GET_WORD(v5) & 0x8000) == 0) break; - R18_ = *v5; - v4 = CallPlmInstr(*v5 | 0x840000, v4 + 2, plm_id); - if (!v4) + v5 = CallPlmInstr(GET_WORD(v5) | 0x840000, v5 + 2, plm_id); + if (!v5) goto NEXT_PLM; + if ((uintptr_t)v5 < 0x10000) + v5 = base + (uintptr_t)v5; // If the plm handler wanted to display a message, then display it. if (queued_message_box_index != 0) { - plm_instr_list_ptrs[plm_id >> 1] = v4; + plm_instr_list_ptrs[plm_id >> 1] = v5 - base; COROUTINE_AWAIT(1, DisplayMessageBox_Async(queued_message_box_index)); queued_message_box_index = 0; - v4 = plm_instr_list_ptrs[plm_id >> 1]; + base = RomPtr_84(0x8000) - 0x8000; + v5 = base + plm_instr_list_ptrs[plm_id >> 1]; } } int v7; v7 = plm_id >> 1; - plm_instruction_timer[v7] = v5[0]; - plm_instruction_draw_ptr[v7] = v5[1]; - plm_instr_list_ptrs[v7] = v4 + 4; + plm_instruction_timer[v7] = GET_WORD(v5); + plm_instruction_draw_ptr[v7] = GET_WORD(v5 + 2); + plm_instr_list_ptrs[v7] = v5 + 4 - base; ProcessPlmDrawInstruction(plm_id); CalculatePlmBlockCoords(plm_id); DrawPlm(plm_id); @@ -403,7 +396,6 @@ NEXT_PLM:; COROUTINE_END(0); } -#define fnPlmPreInstr_Empty4 0x848AA6 void CallPlmPreInstr(uint32 ea, uint16 k) { switch (ea) { case fnPlmPreInstr_nullsub_60: return; @@ -467,7 +459,7 @@ void CallPlmPreInstr(uint32 ea, uint16 k) { } } -uint16 CallPlmInstr(uint32 ea, uint16 j, uint16 k) { +const uint8 *CallPlmInstr(uint32 ea, const uint8 *j, uint16 k) { switch (ea) { case fnPlmInstr_Sleep: return PlmInstr_Sleep(j, k); case fnPlmInstr_Delete: return PlmInstr_Delete(j, k); @@ -579,13 +571,13 @@ uint16 CallPlmInstr(uint32 ea, uint16 j, uint16 k) { case fnPlmInstr_SetBtsTo1: return PlmInstr_SetBtsTo1(j, k); case fnPlmInstr_DisableSamusControls: return PlmInstr_DisableSamusControls(j, k); case fnPlmInstr_EnableSamusControls: return PlmInstr_EnableSamusControls(j, k); - default: return Unreachable(); + default: Unreachable(); return NULL; } } -static inline uint8_t *RomPtr_84orRAM(uint16_t addr) { +static inline uint8 *RomPtr_84orRAM(uint16_t addr) { if (addr & 0x8000) { - return RomPtr(0x840000 | addr); + return (uint8*)RomPtr(0x840000 | addr); } else { assert(addr < 0x2000); return RomPtr_RAM(addr); @@ -593,85 +585,44 @@ static inline uint8_t *RomPtr_84orRAM(uint16_t addr) { } void ProcessPlmDrawInstruction(uint16 v0) { // 0x84861E - int16 v4; - int16 v8; - int16 v9; - int16 v10; - uint16 v5; - int v1 = v0 >> 1; - uint16 v2 = plm_instruction_draw_ptr[v1]; - R18_ = plm_block_indices[v1]; - uint16 v3 = R18_; + uint16 *p = (uint16 *)RomPtr_84orRAM(plm_instruction_draw_ptr[v1]); + uint16 dst = plm_block_indices[v1], dst_base = dst; while (1) { - v4 = *(uint16 *)RomPtr_84orRAM(v2); - if (v4 < 0) { - R22_ = (uint8)v4; - v5 = v2 + 2; - do { - level_data[v3 >> 1] = *(uint16 *)RomPtr_84orRAM(v5); - v5 += 2; - v3 += room_width_in_blocks * 2; - --R22_; - } while (R22_); + uint16 v4 = *p++; + if (v4 & 0x8000) { + for (int i = 0, t = room_width_in_blocks * 2; i < (uint8)v4; i++) + level_data[(dst + i * t) >> 1] = *p++; } else { - R22_ = (uint8)v4; - v5 = v2 + 2; - do { - level_data[v3 >> 1] = *(uint16 *)RomPtr_84orRAM(v5); - v5 += 2; - v3 += 2; - --R22_; - } while (R22_); + for (int i = 0; i < (uint8)v4; i++) + level_data[(dst + i * 2) >> 1] = *p++; } - if (!*(uint16 *)RomPtr_84orRAM(v5)) + if (!*p) break; - uint16 v6 = v5 - 1; - uint8 *v7 = RomPtr_84orRAM(v6); - v8 = (int8)HIBYTE(*(uint16 *)v7); - R20_ = R18_ + 2 * v8; - LOBYTE(v8) = HIBYTE(*(uint16 *)(v7 + 1)); - if ((v8 & 0x80) == 0) { - v8 = (uint8)v8; - if ((uint8)v8) { - v10 = (uint8)v8; - v8 = 0; - do { - v8 += room_width_in_blocks; - --v10; - } while (v10); - } - } else { - v9 = -(v8 | 0xFF00); - v8 = 0; - do { - v8 -= room_width_in_blocks; - --v9; - } while (v9); - } - v3 = R20_ + 2 * v8; - v2 = v6 + 3; + dst = dst_base + 2 * ((int8)*p + (int8)(*p >> 8) * room_width_in_blocks); + p++; } } -uint16 PlmInstr_Sleep(uint16 j, uint16 k) { // 0x8486B4 - plm_instr_list_ptrs[k >> 1] = j - 2; +const uint8 *PlmInstr_Sleep(const uint8 *plmp, uint16 k) { // 0x8486B4 + const uint8 *base = RomPtr_84(0x8000) - 0x8000; + plm_instr_list_ptrs[k >> 1] = plmp - base - 2; return 0; } -uint16 PlmInstr_Delete(uint16 j, uint16 k) { // 0x8486BC +const uint8 *PlmInstr_Delete(const uint8 *plmp, uint16 k) { // 0x8486BC plm_header_ptr[k >> 1] = 0; return 0; } -uint16 PlmInstr_PreInstr(uint16 j, uint16 k) { // 0x8486C1 - plm_pre_instrs[k >> 1] = *(uint16 *)RomPtr_84(j); - return j + 2; +const uint8 *PlmInstr_PreInstr(const uint8 *plmp, uint16 k) { // 0x8486C1 + plm_pre_instrs[k >> 1] = GET_WORD(plmp); + return plmp + 2; } -uint16 PlmInstr_ClearPreInstr(uint16 j, uint16 k) { // 0x8486CA +const uint8 *PlmInstr_ClearPreInstr(const uint8 *plmp, uint16 k) { // 0x8486CA plm_pre_instrs[k >> 1] = FUNC16(PlmPreInstr_Empty); - return j; + return plmp; } void CallPlmInstrFunc(uint32 ea) { @@ -682,309 +633,276 @@ void CallPlmInstrFunc(uint32 ea) { } } -uint16 PlmInstr_CallFunction(uint16 j, uint16 k) { // 0x84870B - uint8 *v2 = RomPtr_84(j); - copy24((LongPtr *)&R18_, (LongPtr *)v2); +const uint8 *PlmInstr_CallFunction(const uint8 *plmp, uint16 k) { // 0x84870B + copy24((LongPtr *)&R18_, (LongPtr *)plmp); CallPlmInstrFunc(Load24(&R18_)); - return j + 3; + return plmp + 3; } -uint16 PlmInstr_Goto(uint16 j, uint16 k) { // 0x848724 - return *(uint16 *)RomPtr_84(j); +const uint8 *PlmInstr_Goto(const uint8 *plmp, uint16 k) { // 0x848724 + return INSTRB_RETURN_ADDR(GET_WORD(plmp)); } -uint16 PlmInstr_DecrementAndBranchNonzero(uint16 j, uint16 k) { // 0x84873F - int v2 = k >> 1; - if (plm_timers[v2]-- == 1) - return j + 2; +const uint8 *PlmInstr_DecrementAndBranchNonzero(const uint8 *plmp, uint16 k) { // 0x84873F + if (plm_timers[k >> 1]-- == 1) + return plmp + 2; else - return PlmInstr_Goto(j, k); + return PlmInstr_Goto(plmp, k); } -uint16 PlmInstr_SetTimer(uint16 j, uint16 k) { // 0x84874E - *((uint8 *)plm_timers + k) = *RomPtr_84(j); - return j + 1; +const uint8 *PlmInstr_SetTimer(const uint8 *plmp, uint16 k) { // 0x84874E + *((uint8 *)plm_timers + k) = *plmp; + return plmp + 1; } -#define kPlmVramAddresses ((uint16*)RomPtr(0x8487cd)) -#define kPlmTileDataOffs ((uint16*)RomPtr(0x8487d5)) -#define kPlmStartingTileNumber ((uint16*)RomPtr(0x8487dd)) - -uint16 PlmInstr_LoadItemPlmGfx(uint16 j, uint16 k) { // 0x848764 - VramWriteEntry *v5; // r10 +const uint8 *PlmInstr_LoadItemPlmGfx(const uint8 *plmp, uint16 k) { // 0x848764 uint16 v2 = plm_item_gfx_index; plm_variables[k >> 1] = plm_item_gfx_index; - plm_item_gfx_index = ((uint8)v2 + 2) & 6; + plm_item_gfx_index = (v2 + 2) & 6; int v3 = v2 >> 1; - R18_ = kPlmVramAddresses[v3]; - R20_ = kPlmTileDataOffs[v3]; - R22_ = kPlmStartingTileNumber[v3]; - plm_item_gfx_ptrs[v3] = j; - uint16 v4 = vram_write_queue_tail; - v5 = gVramWriteEntry(vram_write_queue_tail); + int R18 = kPlmVramAddresses[v3]; + int R20 = kPlmTileDataOffs[v3]; + int R22 = kPlmStartingTileNumber[v3]; + const uint8 *base = RomPtr_84(0x8000) - 0x8000; + plm_item_gfx_ptrs[v3] = plmp - base; + int v4 = vram_write_queue_tail; + VramWriteEntry *v5 = gVramWriteEntry(vram_write_queue_tail); v5->size = 256; - v5->src.addr = *(uint16 *)RomPtr_84(j); - *(uint16 *)&v5->src.bank = 137; - v5->vram_dst = R18_; + v5->src.addr = GET_WORD(plmp); + v5->src.bank = 0x89; + v5->vram_dst = R18; vram_write_queue_tail = v4 + 7; - uint16 result = j + 2; - uint16 v7 = R20_; - R24_ = R20_ + 16; + plmp += 2; + int v7 = R20; + int R24 = R20 + 16; do { - *(uint16 *)((char *)&tile_table.tables[0].top_left + v7) = R22_ + (*RomPtr_84(result) << 10); - ++R22_; - ++result; + *(uint16 *)((char *)&tile_table.tables[0].top_left + v7) = R22 + (plmp[0] << 10); + ++R22; + plmp++; v7 += 2; - } while (v7 != R24_); - return result; + } while (v7 != R24); + return plmp; } -uint16 PlmInstr_CopyFromRamToVram(uint16 j, uint16 k) { // 0x8487E5 - VramWriteEntry *v4; - +const uint8 *PlmInstr_CopyFromRamToVram(const uint8 *plmp, uint16 k) { // 0x8487E5 uint16 v2 = vram_write_queue_tail; - uint8 *v3 = RomPtr_84(j); - v4 = gVramWriteEntry(vram_write_queue_tail); - v4->size = *(uint16 *)v3; - v4->src.addr = *((uint16 *)v3 + 1); - *(VoidP *)((char *)&v4->src.addr + 1) = *(uint16 *)(v3 + 3); - v4->vram_dst = *(uint16 *)(v3 + 5); + VramWriteEntry *v4 = gVramWriteEntry(vram_write_queue_tail); + v4->size = GET_WORD(plmp); + v4->src.addr = GET_WORD(plmp + 2); + v4->src.bank = plmp[4]; + v4->vram_dst = GET_WORD(plmp + 5); vram_write_queue_tail = v2 + 7; - return j + 7; + return plmp + 7; } -uint16 PlmInstr_GotoIfBossBitSet(uint16 j, uint16 k) { // 0x84880E - uint8 *v2 = RomPtr_84(j); - uint16 v3 = j + 1; - if (CheckBossBitForCurArea((uint8) * (uint16 *)v2)) - return PlmInstr_Goto(v3, k); +const uint8 *PlmInstr_GotoIfBossBitSet(const uint8 *plmp, uint16 k) { // 0x84880E + if (CheckBossBitForCurArea(plmp[0])) + return PlmInstr_Goto(plmp + 1, k); else - return v3 + 2; + return plmp + 3; } -uint16 PlmInstr_GotoIfEventSet(uint16 j, uint16 k) { // 0x84882D - uint16 *v2 = (uint16 *)RomPtr_84(j); - uint16 v3 = j + 2; - if (CheckEventHappened(*v2)) - return PlmInstr_Goto(v3, k); +const uint8 *PlmInstr_GotoIfEventSet(const uint8 *plmp, uint16 k) { // 0x84882D + if (CheckEventHappened(GET_WORD(plmp))) + return PlmInstr_Goto(plmp + 2, k); else - return v3 + 2; + return plmp + 4; } -uint16 PlmInstr_SetEvent(uint16 j, uint16 k) { // 0x84883E - uint16 *v2 = (uint16 *)RomPtr_84(j); - SetEventHappened(*v2); - return j + 2; +const uint8 *PlmInstr_SetEvent(const uint8 *plmp, uint16 k) { // 0x84883E + SetEventHappened(GET_WORD(plmp)); + return plmp + 2; } -uint16 PlmInstr_GotoIfChozoSet(uint16 j, uint16 k) { // 0x848848 - int16 v3; - - int v2 = k >> 1; - v3 = plm_room_arguments[v2]; +const uint8 *PlmInstr_GotoIfChozoSet(const uint8 *plmp, uint16 k) { // 0x848848 + uint16 v3 = plm_room_arguments[k >> 1]; int idx = PrepareBitAccess(v3); - if (v3 >= 0 && ((bitmask & room_chozo_bits[idx]) != 0)) - return PlmInstr_Goto(j, k); + if (!sign16(v3) && ((bitmask & room_chozo_bits[idx]) != 0)) + return PlmInstr_Goto(plmp, k); else - return j + 2; + return plmp + 2; } -uint16 PlmInstr_SetRoomChozoBit(uint16 j, uint16 k) { // 0x848865 - int16 v3; - - int v2 = k >> 1; - v3 = plm_room_arguments[v2]; - if (v3 >= 0) { +const uint8 *PlmInstr_SetRoomChozoBit(const uint8 *plmp, uint16 k) { // 0x848865 + uint16 v3 = plm_room_arguments[k >> 1]; + if (!sign16(v3)) { int idx = PrepareBitAccess(v3); room_chozo_bits[idx] |= bitmask; } - return j; + return plmp; } -uint16 PlmInstr_GotoIfItemBitSet(uint16 j, uint16 k) { // 0x84887C - int16 v2; - - v2 = plm_room_arguments[k >> 1]; +const uint8 *PlmInstr_GotoIfItemBitSet(const uint8 *plmp, uint16 k) { // 0x84887C + uint16 v2 = plm_room_arguments[k >> 1]; int idx = PrepareBitAccess(v2); - if (v2 >= 0 && (bitmask & item_bit_array[idx]) != 0) - return PlmInstr_Goto(j, k); + if (!sign16(v2) && (bitmask & item_bit_array[idx]) != 0) + return PlmInstr_Goto(plmp, k); else - return j + 2; + return plmp + 2; } -uint16 PlmInstr_SetItemBit(uint16 j, uint16 k) { // 0x848899 - int16 v2; - - v2 = plm_room_arguments[k >> 1]; - if (v2 >= 0) { +const uint8 *PlmInstr_SetItemBit(const uint8 *plmp, uint16 k) { // 0x848899 + uint16 v2 = plm_room_arguments[k >> 1]; + if (!sign16(v2)) { uint16 v3 = PrepareBitAccess(v2); item_bit_array[v3] |= bitmask; } - return j; + return plmp; } -uint16 PlmInstr_PickupBeamAndShowMessage(uint16 j, uint16 k) { // 0x8488B0 - uint8 *v2 = RomPtr_84(j); - collected_beams |= *(uint16 *)v2; - equipped_beams |= *(uint16 *)v2; - equipped_beams &= ~((2 * (uint8) * (uint16 *)v2) & 8); - equipped_beams &= ~((*(uint16 *)v2 >> 1) & 4); +const uint8 *PlmInstr_PickupBeamAndShowMessage(const uint8 *plmp, uint16 k) { // 0x8488B0 + uint16 t = GET_WORD(plmp); + collected_beams |= t; + equipped_beams |= t; + equipped_beams &= ~((t << 1) & 8); + equipped_beams &= ~((t >> 1) & 4); UpdateBeamTilesAndPalette(); PlayRoomMusicTrackAfterAFrames(0x168u); - uint8 *v3 = RomPtr_84(j); - DisplayMessageBox(v3[2]); - return j + 3; + DisplayMessageBox(plmp[2]); + return plmp + 3; } -uint16 PlmInstr_PickupEquipmentAndShowMessage(uint16 j, uint16 k) { // 0x8488F3 - uint8 *v2 = RomPtr_84(j); - equipped_items |= *(uint16 *)v2; - collected_items |= *(uint16 *)v2; +const uint8 *PlmInstr_PickupEquipmentAndShowMessage(const uint8 *plmp, uint16 k) { // 0x8488F3 + uint16 t = GET_WORD(plmp); + equipped_items |= t; + collected_items |= t; PlayRoomMusicTrackAfterAFrames(0x168u); - DisplayMessageBox(v2[2]); - return j + 3; + DisplayMessageBox(plmp[2]); + return plmp + 3; } -uint16 PlmInstr_PickupEquipmentAddGrappleShowMessage(uint16 j, uint16 k) { // 0x84891A - uint8 *v2 = RomPtr_84(j); - equipped_items |= *(uint16 *)v2; - collected_items |= *(uint16 *)v2; +const uint8 *PlmInstr_PickupEquipmentAddGrappleShowMessage(const uint8 *plmp, uint16 k) { // 0x84891A + uint16 t = GET_WORD(plmp); + equipped_items |= t; + collected_items |= t; AddGrappleToHudTilemap(); PlayRoomMusicTrackAfterAFrames(0x168u); DisplayMessageBox(5u); - return j + 2; + return plmp + 2; } -uint16 PlmInstr_PickupEquipmentAddXrayShowMessage(uint16 j, uint16 k) { // 0x848941 - uint8 *v2 = RomPtr_84(j); - equipped_items |= *(uint16 *)v2; - collected_items |= *(uint16 *)v2; +const uint8 *PlmInstr_PickupEquipmentAddXrayShowMessage(const uint8 *plmp, uint16 k) { // 0x848941 + uint16 t = GET_WORD(plmp); + equipped_items |= t; + collected_items |= t; AddXrayToHudTilemap(); PlayRoomMusicTrackAfterAFrames(0x168u); DisplayMessageBox(6u); - return j + 2; + return plmp + 2; } -uint16 PlmInstr_CollectHealthEnergyTank(uint16 j, uint16 k) { // 0x848968 - samus_max_health += *(uint16 *)RomPtr_84(j); +const uint8 *PlmInstr_CollectHealthEnergyTank(const uint8 *plmp, uint16 k) { // 0x848968 + samus_max_health += GET_WORD(plmp); samus_health = samus_max_health; PlayRoomMusicTrackAfterAFrames(0x168u); DisplayMessageBox(1u); - return j + 2; + return plmp + 2; } -uint16 PlmInstr_CollectHealthReserveTank(uint16 j, uint16 k) { // 0x848986 - samus_max_reserve_health += *(uint16 *)RomPtr_84(j); +const uint8 *PlmInstr_CollectHealthReserveTank(const uint8 *plmp, uint16 k) { // 0x848986 + samus_max_reserve_health += GET_WORD(plmp); if (!reserve_health_mode) ++reserve_health_mode; PlayRoomMusicTrackAfterAFrames(0x168u); DisplayMessageBox(0x19u); - return j + 2; + return plmp + 2; } -uint16 PlmInstr_CollectAmmoMissileTank(uint16 j, uint16 k) { // 0x8489A9 - uint8 *v2 = RomPtr_84(j); - samus_max_missiles += *(uint16 *)v2; - samus_missiles += *(uint16 *)v2; +const uint8 *PlmInstr_CollectAmmoMissileTank(const uint8 *plmp, uint16 k) { // 0x8489A9 + uint16 t = GET_WORD(plmp); + samus_max_missiles += t; + samus_missiles += t; AddMissilesToHudTilemap(); PlayRoomMusicTrackAfterAFrames(0x168u); DisplayMessageBox(2u); - return j + 2; + return plmp + 2; } -uint16 PlmInstr_CollectAmmoSuperMissileTank(uint16 j, uint16 k) { // 0x8489D2 - uint8 *v2 = RomPtr_84(j); - samus_max_super_missiles += *(uint16 *)v2; - samus_super_missiles += *(uint16 *)v2; +const uint8 *PlmInstr_CollectAmmoSuperMissileTank(const uint8 *plmp, uint16 k) { // 0x8489D2 + uint16 t = GET_WORD(plmp); + samus_max_super_missiles += t; + samus_super_missiles += t; AddSuperMissilesToHudTilemap(); PlayRoomMusicTrackAfterAFrames(0x168u); DisplayMessageBox(3u); - return j + 2; + return plmp + 2; } -uint16 PlmInstr_CollectAmmoPowerBombTank(uint16 j, uint16 k) { // 0x8489FB - uint8 *v2 = RomPtr_84(j); - samus_max_power_bombs += *(uint16 *)v2; - samus_power_bombs += *(uint16 *)v2; +const uint8 *PlmInstr_CollectAmmoPowerBombTank(const uint8 *plmp, uint16 k) { // 0x8489FB + uint16 t = GET_WORD(plmp); + samus_max_power_bombs += t; + samus_power_bombs += t; AddPowerBombsToHudTilemap(); PlayRoomMusicTrackAfterAFrames(0x168u); DisplayMessageBox(4u); - return j + 2; + return plmp + 2; } -uint16 PlmInstr_SetLinkReg(uint16 j, uint16 k) { // 0x848A24 - plm_instruction_list_link_reg[k >> 1] = *(uint16 *)RomPtr_84(j); - return j + 2; +const uint8 *PlmInstr_SetLinkReg(const uint8 *plmp, uint16 k) { // 0x848A24 + plm_instruction_list_link_reg[k >> 1] = GET_WORD(plmp); + return plmp + 2; } -uint16 PlmInstr_Call(uint16 j, uint16 k) { // 0x848A2E - plm_instruction_list_link_reg[k >> 1] = j + 2; - return *(uint16 *)RomPtr_84(j); +const uint8 *PlmInstr_Call(const uint8 *plmp, uint16 k) { // 0x848A2E + const uint8 *base = RomPtr_84(0x8000) - 0x8000; + plm_instruction_list_link_reg[k >> 1] = plmp - base + 2; + return INSTRB_RETURN_ADDR(GET_WORD(plmp)); } -uint16 PlmInstr_Return(uint16 j, uint16 k) { // 0x848A3A - return plm_instruction_list_link_reg[k >> 1]; +const uint8 *PlmInstr_Return(const uint8 *plmp, uint16 k) { // 0x848A3A + return RomPtr_84(plm_instruction_list_link_reg[k >> 1]); } -uint16 PlmInstr_GotoIfDoorBitSet(uint16 j, uint16 k) { // 0x848A72 - int16 v2; - - v2 = plm_room_arguments[k >> 1]; +const uint8 *PlmInstr_GotoIfDoorBitSet(const uint8 *plmp, uint16 k) { // 0x848A72 + uint16 v2 = plm_room_arguments[k >> 1]; if (sign16(v2)) - return j + 2; + return plmp + 2; int idx = PrepareBitAccess(v2); - if (v2 >= 0 && (bitmask & opened_door_bit_array[idx]) != 0) - return *(uint16 *)RomPtr_84(j); + if (!sign16(v2) && (bitmask & opened_door_bit_array[idx]) != 0) + return INSTRB_RETURN_ADDR(GET_WORD(plmp)); else - return j + 2; + return plmp + 2; } -uint16 PlmInstr_IncrementDoorHitCounterAndJGE(uint16 j, uint16 k) { // 0x848A91 - int16 v5; - +const uint8 *PlmInstr_IncrementDoorHitCounterAndJGE(const uint8 *plmp, uint16 k) { // 0x848A91 int v2 = k >> 1; - uint16 v3 = plm_variables[v2] + 1; - plm_variables[v2] = v3; - if ((uint8)v3 < *RomPtr_84(j)) - return j + 3; - v5 = plm_room_arguments[v2]; - if (v5 >= 0) { + if ((uint8)++plm_variables[v2] < plmp[0]) + return plmp + 3; + uint16 v5 = plm_room_arguments[v2]; + if (!sign16(v5)) { int idx = PrepareBitAccess(v5); - v5 = bitmask | opened_door_bit_array[idx]; - opened_door_bit_array[idx] = v5; - v5 = WORD(opened_door_bit_array[idx]); + opened_door_bit_array[idx] |= bitmask; + plm_room_arguments[v2] = WORD(opened_door_bit_array[idx]) | 0x8000; } - int v6 = k >> 1; - plm_room_arguments[v6] = v5 | 0x8000; - plm_pre_instrs[v6] = addr_PlmPreInstr_Empty4; - return PlmInstr_Goto(j + 1, k); + plm_pre_instrs[v2] = addr_PlmPreInstr_Empty4; + return PlmInstr_Goto(plmp + 1, k); } -uint16 PlmInstr_IncrementArgumentAndJGE(uint16 j, uint16 k) { // 0x848ACD +const uint8 *PlmInstr_IncrementArgumentAndJGE(const uint8 *plmp, uint16 k) { // 0x848ACD uint8 v2 = *((uint8 *)plm_room_arguments + k) + 1; - if (v2 >= *RomPtr_84(j)) { + if (v2 >= plmp[0]) { int v4 = k >> 1; plm_room_arguments[v4] = -1; plm_pre_instrs[v4] = addr_locret_848AE0; - return PlmInstr_Goto(j + 1, k); + return PlmInstr_Goto(plmp + 1, k); } else { plm_room_arguments[k >> 1] = v2; - return j + 3; + return plmp + 3; } } -uint16 PlmInstr_SetBTS(uint16 j, uint16 k) { // 0x848AF1 - BTS[plm_block_indices[k >> 1] >> 1] = *RomPtr_84(j); - return j + 1; +const uint8 *PlmInstr_SetBTS(const uint8 *plmp, uint16 k) { // 0x848AF1 + BTS[plm_block_indices[k >> 1] >> 1] = plmp[0]; + return plmp + 1; } -uint16 PlmInstr_DrawPlmBlock(uint16 j, uint16 k) { // 0x848B05 - return PlmInstr_DrawPlmBlock_(j, k); +const uint8 *PlmInstr_DrawPlmBlock(const uint8 *plmp, uint16 k) { // 0x848B05 + return PlmInstr_DrawPlmBlock_(plmp, k); } -uint16 PlmInstr_DrawPlmBlock_(uint16 j, uint16 k) { // 0x848B17 +const uint8 *PlmInstr_DrawPlmBlock_(const uint8 *plmp, uint16 k) { // 0x848B17 int v2 = k >> 1; uint16 v3 = plm_variable[v2]; level_data[plm_block_indices[v2] >> 1] = v3; @@ -993,7 +911,8 @@ uint16 PlmInstr_DrawPlmBlock_(uint16 j, uint16 k) { // 0x848B17 custom_draw_instr_zero_terminator = 0; plm_instruction_timer[v2] = 1; plm_instruction_draw_ptr[v2] = ADDR16_OF_RAM(custom_draw_instr_num_blocks); - plm_instr_list_ptrs[v2] = j; + const uint8 *base = RomPtr_84(0x8000) - 0x8000; + plm_instr_list_ptrs[v2] = plmp - base; ProcessPlmDrawInstruction(k); uint16 v4 = plm_id; CalculatePlmBlockCoords(plm_id); @@ -1001,57 +920,44 @@ uint16 PlmInstr_DrawPlmBlock_(uint16 j, uint16 k) { // 0x848B17 return 0; } -uint16 PlmInstr_ProcessAirScrollUpdate(uint16 j, uint16 k) { // 0x848B55 - uint16 v4; - char *v5; - +const uint8 *PlmInstr_ProcessAirScrollUpdate(const uint8 *plmp, uint16 k) { // 0x848B55 int v2 = k >> 1; plm_variable[v2] = 0; uint16 v3 = plm_room_arguments[v2]; - HIBYTE(v4) = 0; while (1) { - v5 = (char *)RomPtr_8F(v3); - if (*v5 < 0) + const uint8 *v5 = RomPtr_8F(v3); + if (v5[0] & 0x80) break; - LOBYTE(v4) = *v5; - scrolls[v4] = v5[1]; + scrolls[v5[0]] = v5[1]; v3 += 2; } - uint16 result = j; int v7 = plm_block_indices[k >> 1] >> 1; level_data[v7] = level_data[v7] & 0xFFF | 0x3000; - return result; + return plmp; } -uint16 PlmInstr_ProcessSolidScrollUpdate(uint16 j, uint16 k) { // 0x848B93 - uint16 v4; - char *v5; - +const uint8 *PlmInstr_ProcessSolidScrollUpdate(const uint8 *plmp, uint16 k) { // 0x848B93 int v2 = k >> 1; plm_variable[v2] = 0; uint16 v3 = plm_room_arguments[v2]; - HIBYTE(v4) = 0; while (1) { - v5 = (char *)RomPtr_8F(v3); - if (*v5 < 0) + const uint8 *v5 = RomPtr_8F(v3); + if (v5[0] & 0x80) break; - LOBYTE(v4) = *v5; - scrolls[v4] = v5[1]; + scrolls[v5[0]] = v5[1]; v3 += 2; } - uint16 result = j; int v7 = plm_block_indices[k >> 1] >> 1; level_data[v7] = level_data[v7] & 0xFFF | 0xB000; - return result; + return plmp; } -uint16 PlmInstr_QueueMusic(uint16 j, uint16 k) { // 0x848BD1 - uint8 *v2 = RomPtr_84(j); - QueueMusic_Delayed8(*v2); - return j + 1; +const uint8 *PlmInstr_QueueMusic(const uint8 *plmp, uint16 k) { // 0x848BD1 + QueueMusic_Delayed8(plmp[0]); + return plmp + 1; } -uint16 PlmInstr_ClearMusicQueueAndQueueTrack(uint16 j, uint16 k) { // 0x848BDD +const uint8 *PlmInstr_ClearMusicQueueAndQueueTrack(const uint8 *plmp, uint16 k) { // 0x848BDD for (int i = 14; i >= 0; i -= 2) { int v3 = i >> 1; music_queue_track[v3] = 0; @@ -1060,151 +966,132 @@ uint16 PlmInstr_ClearMusicQueueAndQueueTrack(uint16 j, uint16 k) { // 0x848BDD music_queue_read_pos = music_queue_write_pos; music_timer = 0; music_entry = 0; - uint8 *v4 = RomPtr_84(j); - QueueMusic_Delayed8(*v4); - return j + 1; + QueueMusic_Delayed8(plmp[0]); + return plmp + 1; } -uint16 PlmInstr_QueueSfx1_Max6(uint16 j, uint16 k) { // 0x848C07 - uint16 *v2 = (uint16 *)RomPtr_84(j); - QueueSfx1_Max6(*v2); - return j + 1; +const uint8 *PlmInstr_QueueSfx1_Max6(const uint8 *plmp, uint16 k) { // 0x848C07 + QueueSfx1_Max6(plmp[0]); + return plmp + 1; } -uint16 PlmInstr_QueueSfx2_Max6(uint16 j, uint16 k) { // 0x848C10 - uint16 *v2 = (uint16 *)RomPtr_84(j); - QueueSfx2_Max6(*v2); - return j + 1; +const uint8 *PlmInstr_QueueSfx2_Max6(const uint8 *plmp, uint16 k) { // 0x848C10 + QueueSfx2_Max6(plmp[0]); + return plmp + 1; } -uint16 PlmInstr_QueueSfx3_Max6(uint16 j, uint16 k) { // 0x848C19 - uint16 *v2 = (uint16 *)RomPtr_84(j); - QueueSfx3_Max6(*v2); - return j + 1; +const uint8 *PlmInstr_QueueSfx3_Max6(const uint8 *plmp, uint16 k) { // 0x848C19 + QueueSfx3_Max6(plmp[0]); + return plmp + 1; } -uint16 PlmInstr_QueueSfx1_Max15(uint16 j, uint16 k) { // 0x848C22 - uint16 *v2 = (uint16 *)RomPtr_84(j); - QueueSfx1_Max15(*v2); - return j + 1; +const uint8 *PlmInstr_QueueSfx1_Max15(const uint8 *plmp, uint16 k) { // 0x848C22 + QueueSfx1_Max15(plmp[0]); + return plmp + 1; } -uint16 PlmInstr_QueueSfx2_Max15(uint16 j, uint16 k) { // 0x848C2B - uint16 *v2 = (uint16 *)RomPtr_84(j); - QueueSfx2_Max15(*v2); - return j + 1; +const uint8 *PlmInstr_QueueSfx2_Max15(const uint8 *plmp, uint16 k) { // 0x848C2B + QueueSfx2_Max15(plmp[0]); + return plmp + 1; } -uint16 PlmInstr_QueueSfx3_Max15(uint16 j, uint16 k) { // 0x848C34 - uint16 *v2 = (uint16 *)RomPtr_84(j); - QueueSfx3_Max15(*v2); - return j + 1; +const uint8 *PlmInstr_QueueSfx3_Max15(const uint8 *plmp, uint16 k) { // 0x848C34 + QueueSfx3_Max15(plmp[0]); + return plmp + 1; } -uint16 PlmInstr_QueueSfx1_Max3(uint16 j, uint16 k) { // 0x848C3D - uint16 *v2 = (uint16 *)RomPtr_84(j); - QueueSfx1_Max3(*v2); - return j + 1; +const uint8 *PlmInstr_QueueSfx1_Max3(const uint8 *plmp, uint16 k) { // 0x848C3D + QueueSfx1_Max3(plmp[0]); + return plmp + 1; } -uint16 PlmInstr_QueueSfx2_Max3(uint16 j, uint16 k) { // 0x848C46 - uint16 *v2 = (uint16 *)RomPtr_84(j); - QueueSfx2_Max3(*v2); - return j + 1; +const uint8 *PlmInstr_QueueSfx2_Max3(const uint8 *plmp, uint16 k) { // 0x848C46 + QueueSfx2_Max3(plmp[0]); + return plmp + 1; } -uint16 PlmInstr_QueueSfx_Max3(uint16 j, uint16 k) { // 0x848C4F - uint16 *v2 = (uint16 *)RomPtr_84(j); - QueueSfx3_Max3(*v2); - return j + 1; +const uint8 *PlmInstr_QueueSfx_Max3(const uint8 *plmp, uint16 k) { // 0x848C4F + QueueSfx3_Max3(plmp[0]); + return plmp + 1; } -uint16 PlmInstr_QueueSfx1_Max9(uint16 j, uint16 k) { // 0x848C58 - uint16 *v2 = (uint16 *)RomPtr_84(j); - QueueSfx1_Max9(*v2); - return j + 1; +const uint8 *PlmInstr_QueueSfx1_Max9(const uint8 *plmp, uint16 k) { // 0x848C58 + QueueSfx1_Max9(plmp[0]); + return plmp + 1; } -uint16 PlmInstr_QueueSfx2_Max9(uint16 j, uint16 k) { // 0x848C61 - uint16 *v2 = (uint16 *)RomPtr_84(j); - QueueSfx2_Max9(*v2); - return j + 1; +const uint8 *PlmInstr_QueueSfx2_Max9(const uint8 *plmp, uint16 k) { // 0x848C61 + QueueSfx2_Max9(plmp[0]); + return plmp + 1; } -uint16 PlmInstr_QueueSfx3_Max9(uint16 j, uint16 k) { // 0x848C6A - uint16 *v2 = (uint16 *)RomPtr_84(j); - QueueSfx3_Max9(*v2); - return j + 1; +const uint8 *PlmInstr_QueueSfx3_Max9(const uint8 *plmp, uint16 k) { // 0x848C6A + QueueSfx3_Max9(plmp[0]); + return plmp + 1; } -uint16 PlmInstr_QueueSfx1_Max1(uint16 j, uint16 k) { // 0x848C73 - uint16 *v2 = (uint16 *)RomPtr_84(j); - QueueSfx1_Max1(*v2); - return j + 1; +const uint8 *PlmInstr_QueueSfx1_Max1(const uint8 *plmp, uint16 k) { // 0x848C73 + QueueSfx1_Max1(plmp[0]); + return plmp + 1; } -uint16 PlmInstr_QueueSfx2_Max1(uint16 j, uint16 k) { // 0x848C7C - uint16 *v2 = (uint16 *)RomPtr_84(j); - QueueSfx2_Max1(*v2); - return j + 1; +const uint8 *PlmInstr_QueueSfx2_Max1(const uint8 *plmp, uint16 k) { // 0x848C7C + QueueSfx2_Max1(plmp[0]); + return plmp + 1; } -uint16 PlmInstr_QueueSfx3_Max1(uint16 j, uint16 k) { // 0x848C85 - uint16 *v2 = (uint16 *)RomPtr_84(j); - QueueSfx3_Max1(*v2); - return j + 1; +const uint8 *PlmInstr_QueueSfx3_Max1(const uint8 *plmp, uint16 k) { // 0x848C85 + QueueSfx3_Max1(plmp[0]); + return plmp + 1; } -uint16 PlmInstr_ActivateMapStation(uint16 j, uint16 k) { // 0x848C8F +const uint8 *PlmInstr_ActivateMapStation(const uint8 *plmp, uint16 k) { // 0x848C8F *(uint16 *)&map_station_byte_array[area_index] |= 0xFFu; DisplayMessageBox(0x14u); has_area_map = 1; - return j; + return plmp; } -uint16 PlmInstr_ActivateEnergyStation(uint16 j, uint16 k) { // 0x848CAF +const uint8 *PlmInstr_ActivateEnergyStation(const uint8 *plmp, uint16 k) { // 0x848CAF if (samus_max_health != samus_health) { DisplayMessageBox(0x15u); samus_health = samus_max_health; } CallSomeSamusCode(1u); - return j; + return plmp; } -uint16 PlmInstr_ActivateMissileStation(uint16 j, uint16 k) { // 0x848CD0 +const uint8 *PlmInstr_ActivateMissileStation(const uint8 *plmp, uint16 k) { // 0x848CD0 if (samus_max_missiles != samus_missiles) { DisplayMessageBox(0x16u); samus_missiles = samus_max_missiles; } CallSomeSamusCode(1u); - return j; + return plmp; } -uint16 PlmInstr_ActivateSaveStationAndGotoIfNo(uint16 j, uint16 k) { // 0x848CF1 +const uint8 *PlmInstr_ActivateSaveStationAndGotoIfNo(const uint8 *plmp, uint16 k) { // 0x848CF1 int r = DisplayMessageBox_Poll(23); if (r < 0) - return j - 2; // restart plm instr - + return plmp - 2; // restart plm instr if (r == 2) - return *(uint16 *)RomPtr_84(j); + return INSTRB_RETURN_ADDR(GET_WORD(plmp)); SpawnEnemyProjectileWithRoomGfx(addr_kEproj_SaveStationElectricity, 0); load_station_index = plm_room_arguments[plm_id >> 1] & 7; PrepareBitAccess(load_station_index); used_save_stations_and_elevators[(uint16)(2 * area_index)] |= bitmask; SaveToSram(selected_save_slot); - return j + 2; + return plmp + 2; } -uint16 PlmInstr_GotoIfSamusNear(uint16 j, uint16 k) { // 0x848D41 - uint8 v4; - +const uint8 *PlmInstr_GotoIfSamusNear(const uint8 *plmp, uint16 k) { // 0x848D41 CalculatePlmBlockCoords(k); uint8 v2 = abs16((samus_x_pos >> 4) - plm_x_block); - uint8 *v3 = RomPtr_84(j); - if ((v2 < *v3 || v2 == *v3) && (v4 = abs16((samus_y_pos >> 4) - plm_y_block), v4 < v3[1] || v4 == v3[1])) - return *((uint16 *)v3 + 1); + uint8 v4 = abs16((samus_y_pos >> 4) - plm_y_block); + if (v2 <= plmp[0] && v4 <= plmp[1]) + return INSTRB_RETURN_ADDR(GET_WORD(plmp + 2)); else - return j + 4; + return plmp + 4; } void DrawPlm(uint16 k) { // 0x848DAA @@ -1224,28 +1111,28 @@ void DrawPlm(uint16 k) { // 0x848DAA uint16 v35; uint16 a; - *(uint16 *)((char *)&R8_ + 1) = addr_unk_605000; + R9_.addr = addr_unk_605000; R12_ = addr_unk_6053E0; uint16 v1 = plm_instruction_draw_ptr[k >> 1]; - g_word_7E001E = plm_x_block; - R32 = plm_y_block; + R30_ = plm_x_block; + R32_ = plm_y_block; LABEL_2: R26_ = layer1_y_pos >> 4; - if (!sign16((layer1_y_pos >> 4) + 15 - R32)) { + if (!sign16((layer1_y_pos >> 4) + 15 - R32_)) { v2 = *(uint16 *)RomPtr_84orRAM(v1); if (v2 < 0) { R20_ = v2 & 0x7FFF; - if (layer1_x_pos >> 4 == g_word_7E001E || (int16)((layer1_x_pos >> 4) - g_word_7E001E) < 0) { + if (layer1_x_pos >> 4 == R30_ || (int16)((layer1_x_pos >> 4) - R30_) < 0) { v20 = (layer1_x_pos >> 4) + 17; - if (v20 != g_word_7E001E && (int16)(v20 - g_word_7E001E) >= 0) { - R24_ = g_word_7E001E; + if (v20 != R30_ && (int16)(v20 - R30_) >= 0) { + R24_ = R30_; R18_ = 0; R22_ = R26_ + 16; - if ((int16)(R26_ - R32) < 0) { - R26_ = R32; + if ((int16)(R26_ - R32_) < 0) { + R26_ = R32_; } else { - R18_ = R26_ - R32; - if (sign16(R32 + R20_ - R26_)) + R18_ = R26_ - R32_; + if (sign16(R32_ + R20_ - R26_)) return; bool v21 = R20_ == R18_; bool v22 = (int16)(R20_ - R18_) < 0; @@ -1272,36 +1159,36 @@ LABEL_2: uint16 v26; v26 = 0; while (1) { - g_word_7E001E = *(uint16 *)RomPtr_84orRAM(R3_.addr); + R30_ = *(uint16 *)RomPtr_84orRAM(R3_.addr); uint16 v27, v29; - v27 = g_word_7E001E & 0x3FF; - v28 = g_word_7E001E & 0xC00; - if ((g_word_7E001E & 0xC00) != 0) { + v27 = R30_ & 0x3FF; + v28 = R30_ & 0xC00; + if ((R30_ & 0xC00) != 0) { if (v28 == 1024) { - IndirWriteWord(&R0_, v26, tile_table.tables[v27].top_right ^ 0x4000); - IndirWriteWord(&R6_, v26, tile_table.tables[v27].top_left ^ 0x4000); + IndirWriteWord(R0_, v26, tile_table.tables[v27].top_right ^ 0x4000); + IndirWriteWord(R6_, v26, tile_table.tables[v27].top_left ^ 0x4000); v29 = v26 + 2; - IndirWriteWord(&R0_, v29, tile_table.tables[v27].bottom_right ^ 0x4000); - IndirWriteWord(&R6_, v29, tile_table.tables[v27].bottom_left ^ 0x4000); + IndirWriteWord(R0_, v29, tile_table.tables[v27].bottom_right ^ 0x4000); + IndirWriteWord(R6_, v29, tile_table.tables[v27].bottom_left ^ 0x4000); } else if (v28 == 2048) { - IndirWriteWord(&R0_, v26, tile_table.tables[v27].bottom_left ^ 0x8000); - IndirWriteWord(&R6_, v26, tile_table.tables[v27].bottom_right ^ 0x8000); + IndirWriteWord(R0_, v26, tile_table.tables[v27].bottom_left ^ 0x8000); + IndirWriteWord(R6_, v26, tile_table.tables[v27].bottom_right ^ 0x8000); v29 = v26 + 2; - IndirWriteWord(&R0_, v29, tile_table.tables[v27].top_left ^ 0x8000); - IndirWriteWord(&R6_, v29, tile_table.tables[v27].top_right ^ 0x8000); + IndirWriteWord(R0_, v29, tile_table.tables[v27].top_left ^ 0x8000); + IndirWriteWord(R6_, v29, tile_table.tables[v27].top_right ^ 0x8000); } else { - IndirWriteWord(&R0_, v26, tile_table.tables[v27].bottom_right ^ 0xC000); - IndirWriteWord(&R6_, v26, tile_table.tables[v27].bottom_left ^ 0xC000); + IndirWriteWord(R0_, v26, tile_table.tables[v27].bottom_right ^ 0xC000); + IndirWriteWord(R6_, v26, tile_table.tables[v27].bottom_left ^ 0xC000); v29 = v26 + 2; - IndirWriteWord(&R0_, v29, tile_table.tables[v27].top_right ^ 0xC000); - IndirWriteWord(&R6_, v29, tile_table.tables[v27].top_left ^ 0xC000); + IndirWriteWord(R0_, v29, tile_table.tables[v27].top_right ^ 0xC000); + IndirWriteWord(R6_, v29, tile_table.tables[v27].top_left ^ 0xC000); } } else { - IndirWriteWord(&R0_, v26, tile_table.tables[v27].top_left); - IndirWriteWord(&R6_, v26, tile_table.tables[v27].top_right); + IndirWriteWord(R0_, v26, tile_table.tables[v27].top_left); + IndirWriteWord(R6_, v26, tile_table.tables[v27].top_right); v29 = v26 + 2; - IndirWriteWord(&R0_, v29, tile_table.tables[v27].bottom_left); - IndirWriteWord(&R6_, v29, tile_table.tables[v27].bottom_right); + IndirWriteWord(R0_, v29, tile_table.tables[v27].bottom_left); + IndirWriteWord(R6_, v29, tile_table.tables[v27].bottom_right); } v26 = v29 + 2; ++R3_.addr; @@ -1317,9 +1204,9 @@ LABEL_70: addr = R3_.addr + 2 * R22_; v31 = *(uint16 *)RomPtr_84orRAM(addr); if (v31) { - g_word_7E001E = plm_x_block + (int8)v31; + R30_ = plm_x_block + (int8)v31; uint16 v32 = addr + 1; - R32 = plm_y_block + (int8)*RomPtr_84orRAM(v32); + R32_ = plm_y_block + (int8)*RomPtr_84orRAM(v32); v1 = v32 + 1; goto LABEL_2; } @@ -1333,21 +1220,21 @@ LABEL_70: } else { R20_ = v2 & 0x7FFF; R28_ = 0; - if (sign16(R32 - R26_)) + if (sign16(R32_ - R26_)) return; - R26_ = R32; + R26_ = R32_; R18_ = 0; - R24_ = g_word_7E001E; + R24_ = R30_; R22_ = ((uint16)(layer1_x_pos + 15) >> 4) - 1; - if ((int16)(R22_ - g_word_7E001E) >= 0 && R22_ != g_word_7E001E) { - R18_ = R22_ - g_word_7E001E; - if (g_word_7E001E + R20_ == R22_ || (int16)(g_word_7E001E + R20_ - R22_) < 0) + if ((int16)(R22_ - R30_) >= 0 && R22_ != R30_) { + R18_ = R22_ - R30_; + if (R30_ + R20_ == R22_ || (int16)(R30_ + R20_ - R22_) < 0) return; R20_ -= R18_; R24_ = R22_; } R22_ += 17; - if (!sign16(R22_ - g_word_7E001E)) { + if (!sign16(R22_ - R30_)) { R22_ = R20_ + R24_ - 1 - R22_; if ((R22_ & 0x8000u) != 0 || (R20_ -= R22_) != 0) { v35 = k; @@ -1362,13 +1249,13 @@ LABEL_70: if ((bg1_x_offset & 0x100) != 0) a -= 1024; } else { - v5 = *(uint16 *)((char *)&R8_ + 1) + 2 * v4; + v5 = R9_.addr + 2 * v4; uint16 RegWord = prod; a = RegWord + v5; if ((bg1_x_offset & 0x100) != 0) a += 1024; } - g_word_7E001E = 2 * R20_; + R30_ = 2 * R20_; R34 = a & 0x1F; if (((2 * R20_ + (a & 0x1F) - 1) & 0xFFE0) != 0) { if ((int16)(v3 - 228) >= 0 || (int16)(32 - R34) < 0) @@ -1381,7 +1268,7 @@ LABEL_70: v10[1].vram_dst = a & 0xFFE0 ^ 0x400; v10[3].vram_dst = v10[1].vram_dst + 32; v10[2].vram_dst = v10->vram_dst + 32; - g_word_7E001E = 4 * R20_; + R30_ = 4 * R20_; uint16 v11 = 4 * R20_ - v10->size; v10[1].size = v11; v10[3].size = v11; @@ -1392,12 +1279,12 @@ LABEL_70: v10[1].src.addr = v13; uint16 v14 = v10[1].size + v13; v10[2].src.addr = v14; - R6_ = v14; + R6_.addr = v14; v10[3].src.addr = v10[2].size + v14; v10->src.bank = 126; R0_.bank = 126; v10[1].src.bank = 126; - LOBYTE(R8_) = 126; + R6_.bank = 126; v10[2].src.bank = 126; v10[3].src.bank = 126; vram_write_queue_tail = v3 + 28; @@ -1411,39 +1298,38 @@ LABEL_70: R3_.addr = R18_ + v1 + 2; uint16 v16 = 0; while (1) { - g_word_7E001E = *(uint16 *)RomPtr_84orRAM(R3_.addr); - uint16 v17 = g_word_7E001E & 0x3FF, v19; - v18 = g_word_7E001E & 0xC00; - if ((g_word_7E001E & 0xC00) != 0) { + R30_ = *(uint16 *)RomPtr_84orRAM(R3_.addr); + uint16 v17 = R30_ & 0x3FF, v19; + v18 = R30_ & 0xC00; + if ((R30_ & 0xC00) != 0) { if (v18 == 1024) { - IndirWriteWord(&R0_, v16, tile_table.tables[v17].top_right ^ 0x4000); - IndirWriteWord(&R6_, v16, tile_table.tables[v17].bottom_right ^ 0x4000); + IndirWriteWord(R0_, v16, tile_table.tables[v17].top_right ^ 0x4000); + IndirWriteWord(R6_, v16, tile_table.tables[v17].bottom_right ^ 0x4000); v19 = v16 + 2; - IndirWriteWord(&R0_, v19, tile_table.tables[v17].top_left ^ 0x4000); - IndirWriteWord(&R6_, v19, tile_table.tables[v17].bottom_left ^ 0x4000); + IndirWriteWord(R0_, v19, tile_table.tables[v17].top_left ^ 0x4000); + IndirWriteWord(R6_, v19, tile_table.tables[v17].bottom_left ^ 0x4000); } else if (v18 == 2048) { - IndirWriteWord(&R0_, v16, tile_table.tables[v17].bottom_left ^ 0x8000); - IndirWriteWord(&R6_, v16, tile_table.tables[v17].top_left ^ 0x8000); + IndirWriteWord(R0_, v16, tile_table.tables[v17].bottom_left ^ 0x8000); + IndirWriteWord(R6_, v16, tile_table.tables[v17].top_left ^ 0x8000); v19 = v16 + 2; - IndirWriteWord(&R0_, v19, tile_table.tables[v17].bottom_right ^ 0x8000); - IndirWriteWord(&R6_, v19, tile_table.tables[v17].top_right ^ 0x8000); + IndirWriteWord(R0_, v19, tile_table.tables[v17].bottom_right ^ 0x8000); + IndirWriteWord(R6_, v19, tile_table.tables[v17].top_right ^ 0x8000); } else { - IndirWriteWord(&R0_, v16, tile_table.tables[v17].bottom_right ^ 0xC000); - IndirWriteWord(&R6_, v16, tile_table.tables[v17].top_right ^ 0xC000); + IndirWriteWord(R0_, v16, tile_table.tables[v17].bottom_right ^ 0xC000); + IndirWriteWord(R6_, v16, tile_table.tables[v17].top_right ^ 0xC000); v19 = v16 + 2; - IndirWriteWord(&R0_, v19, tile_table.tables[v17].bottom_left ^ 0xC000); - IndirWriteWord(&R6_, v19, tile_table.tables[v17].top_left ^ 0xC000); + IndirWriteWord(R0_, v19, tile_table.tables[v17].bottom_left ^ 0xC000); + IndirWriteWord(R6_, v19, tile_table.tables[v17].top_left ^ 0xC000); } } else { - IndirWriteWord(&R0_, v16, tile_table.tables[v17].top_left); - IndirWriteWord(&R6_, v16, tile_table.tables[v17].bottom_left); + IndirWriteWord(R0_, v16, tile_table.tables[v17].top_left); + IndirWriteWord(R6_, v16, tile_table.tables[v17].bottom_left); v19 = v16 + 2; - IndirWriteWord(&R0_, v19, tile_table.tables[v17].top_right); - IndirWriteWord(&R6_, v19, tile_table.tables[v17].bottom_right); + IndirWriteWord(R0_, v19, tile_table.tables[v17].top_right); + IndirWriteWord(R6_, v19, tile_table.tables[v17].bottom_right); } v16 = v19 + 2; - ++R3_.addr; - ++R3_.addr; + R3_.addr += 2; plm_draw_tilemap_index += 8; if (!sign16(plm_draw_tilemap_index - 512)) break; @@ -1472,7 +1358,7 @@ void CalculatePlmDrawTilemapVramDst(uint16 k) { // 0x8491DC if ((bg1_x_offset & 0x100) != 0) a -= 1024; } else { - v2 = *(uint16 *)((char *)&R8_ + 1) + 2 * v1; + v2 = R9_.addr + 2 * v1; uint16 v3 = prod; a = v3 + v2; if ((bg1_x_offset & 0x100) != 0) @@ -1495,16 +1381,16 @@ void PartiallyQueueVramForSingleScreenPlm(uint16 a, uint16 k) { // 0x849220 R0_.addr = v4; uint16 v5 = v2->size + v4; v2[1].src.addr = v5; - R6_ = v5; + R6_.addr = v5; v2->src.bank = 126; v2[1].src.bank = 126; R0_.bank = 126; - LOBYTE(R8_) = 126; + R6_.bank = 126; } -uint16 PlmInstr_MovePlmDownOneBlock(uint16 j, uint16 k) { // 0x84AB00 +const uint8 *PlmInstr_MovePlmDownOneBlock(const uint8 *plmp, uint16 k) { // 0x84AB00 plm_block_indices[k >> 1] += 2 * room_width_in_blocks; - return j; + return plmp; } uint8 PlmSetup_CrumbleBotwoonWall(uint16 j) { // 0x84AB28 @@ -1512,22 +1398,19 @@ uint8 PlmSetup_CrumbleBotwoonWall(uint16 j) { // 0x84AB28 return 0; } -uint16 PlmInstr_Scroll_0_1_Blue(uint16 j, uint16 k) { // 0x84AB51 +const uint8 *PlmInstr_Scroll_0_1_Blue(const uint8 *plmp, uint16 k) { // 0x84AB51 *(uint16 *)scrolls = 257; - return j; + return plmp; } -uint16 PlmInstr_MovePlmDownOneBlock_0(uint16 j, uint16 k) { // 0x84AB59 - plm_block_indices[k >> 1] += room_width_in_blocks - + room_width_in_blocks; - return j; +const uint8 *PlmInstr_MovePlmDownOneBlock_0(const uint8 *plmp, uint16 k) { // 0x84AB59 + plm_block_indices[k >> 1] += 2 * room_width_in_blocks; + return plmp; } -uint16 PlmInstr_ABD6(uint16 j, uint16 k) { // 0x84ABD6 - int v1 = k >> 1; - ++plm_block_indices[v1]; - ++plm_block_indices[v1]; - return j; +const uint8 *PlmInstr_ABD6(const uint8 *plmp, uint16 k) { // 0x84ABD6 + plm_block_indices[k >> 1] += 2; + return plmp; } void PlmPreInstr_PositionSamusAndInvincible(uint16 k) { // 0x84AC89 @@ -1537,55 +1420,55 @@ void PlmPreInstr_PositionSamusAndInvincible(uint16 k) { // 0x84AC89 samus_invincibility_timer |= 0x10u; } -uint16 PlmInstr_DealDamage_2(uint16 j, uint16 k) { // 0x84AC9D +const uint8 *PlmInstr_DealDamage_2(const uint8 *plmp, uint16 k) { // 0x84AC9D samus_periodic_damage += 2; - return j; + return plmp; } -uint16 PlmInstr_GiveInvincibility(uint16 j, uint16 k) { // 0x84ACB1 +const uint8 *PlmInstr_GiveInvincibility(const uint8 *plmp, uint16 k) { // 0x84ACB1 samus_invincibility_timer = 48; - return j; + return plmp; } -uint16 PlmInstr_Draw0x38FramesOfRightTreadmill(uint16 j, uint16 k) { // 0x84AD43 +const uint8 *PlmInstr_Draw0x38FramesOfRightTreadmill(const uint8 *plmp, uint16 k) { // 0x84AD43 WriteRowOfLevelDataBlockAndBTS(k, 0x30ff, 0x8, 0x38); - return j; + return plmp; } -uint16 PlmInstr_Draw0x38FramesOfLeftTreadmill(uint16 j, uint16 k) { // 0x84AD58 +const uint8 *PlmInstr_Draw0x38FramesOfLeftTreadmill(const uint8 *plmp, uint16 k) { // 0x84AD58 WriteRowOfLevelDataBlockAndBTS(k, 0x30ff, 0x9, 0x38); - return j; + return plmp; } -uint16 PlmInstr_GotoIfSamusHealthFull(uint16 j, uint16 k) { // 0x84AE35 +const uint8 *PlmInstr_GotoIfSamusHealthFull(const uint8 *plmp, uint16 k) { // 0x84AE35 if (samus_max_health != samus_health) - return j + 2; + return plmp + 2; CallSomeSamusCode(1u); - return *(uint16 *)RomPtr_84(j); + return INSTRB_RETURN_ADDR(GET_WORD(plmp)); } -uint16 PlmInstr_GotoIfMissilesFull(uint16 j, uint16 k) { // 0x84AEBF +const uint8 *PlmInstr_GotoIfMissilesFull(const uint8 *plmp, uint16 k) { // 0x84AEBF if (samus_max_missiles != samus_missiles) - return j + 2; + return plmp + 2; CallSomeSamusCode(1u); - return *(uint16 *)RomPtr_84(j); + return INSTRB_RETURN_ADDR(GET_WORD(plmp)); } -uint16 PlmInstr_PlaceSamusOnSaveStation(uint16 j, uint16 k) { // 0x84B00E +const uint8 *PlmInstr_PlaceSamusOnSaveStation(const uint8 *plmp, uint16 k) { // 0x84B00E samus_x_pos = (samus_x_pos + 8) & 0xFFF0; MakeSamusFaceForward(); - return j; + return plmp; } -uint16 PlmInstr_DisplayGameSavedMessageBox(uint16 j, uint16 k) { // 0x84B024 +const uint8 *PlmInstr_DisplayGameSavedMessageBox(const uint8 *plmp, uint16 k) { // 0x84B024 DisplayMessageBox(0x18u); - return j; + return plmp; } -uint16 PlmInstr_EnableMovementAndSetSaveStationUsed(uint16 j, uint16 k) { // 0x84B030 +const uint8 *PlmInstr_EnableMovementAndSetSaveStationUsed(const uint8 *plmp, uint16 k) { // 0x84B030 CallSomeSamusCode(1u); save_station_lockout_flag = 1; - return j; + return plmp; } uint8 PlmSetup_SetrupWreckedShipEntrance(uint16 j) { // 0x84B04A @@ -1951,8 +1834,8 @@ uint8 PlmSetup_QuicksandSurfaceB_0(uint16 j) { // 0x84B500 R20_ = 0; return 1; } else { - if (word_84B53D[j >> 1] < *(uint16 *)((char *)&R18_ + 1)) - *(uint16 *)((char *)&R18_ + 1) = word_84B53D[j >> 1]; + if (word_84B53D[j >> 1] < R19_) + R19_ = word_84B53D[j >> 1]; ++flag_samus_in_quicksand; } } @@ -2206,9 +2089,9 @@ uint8 PlmSetup_B9C1_CrittersEscapeBlock(uint16 j) { // 0x84B978 return 0; } -uint16 PlmInstr_SetCrittersEscapedEvent(uint16 j, uint16 k) { // 0x84B9B9 +const uint8 *PlmInstr_SetCrittersEscapedEvent(const uint8 *plmp, uint16 k) { // 0x84B9B9 SetEventHappened(0xFu); - return j; + return plmp; } uint8 PlmSetup_B9ED_CrittersEscapeBlock(uint16 j) { // 0x84B9C5 @@ -2234,11 +2117,11 @@ uint8 sub_84B9F1(uint16 j) { // 0x84B9F1 return 0; } -uint16 PlmInstr_JumpIfSamusHasNoBombs(uint16 j, uint16 k) { // 0x84BA6F +const uint8 *PlmInstr_JumpIfSamusHasNoBombs(const uint8 *plmp, uint16 k) { // 0x84BA6F if ((collected_items & 0x1000) != 0) - return j + 2; + return plmp + 2; else - return *(uint16 *)RomPtr_84(j); + return INSTRB_RETURN_ADDR(GET_WORD(plmp)); } void UNUSED_sub_84BAD1(uint16 j) { // 0x84BAD1 @@ -2254,9 +2137,9 @@ uint8 PlmSetup_BB30_CrateriaMainstreetEscape(uint16 j) { // 0x84BB09 return 0; } -uint16 PlmInstr_MovePlmRight4Blocks(uint16 j, uint16 k) { // 0x84BB25 +const uint8 *PlmInstr_MovePlmRight4Blocks(const uint8 *plmp, uint16 k) { // 0x84BB25 plm_block_indices[k >> 1] += 8; - return j; + return plmp; } void PlmPreInstr_WakePlmIfTriggered(uint16 k) { // 0x84BB52 @@ -2293,18 +2176,17 @@ void PlmPreInstr_WakePlmIfTriggeredOrSamusAbovePlm(uint16 k) { // 0x84BBA4 } } -uint16 PlmInstr_ClearTrigger(uint16 j, uint16 k) { // 0x84BBDD +const uint8 *PlmInstr_ClearTrigger(const uint8 *plmp, uint16 k) { // 0x84BBDD plm_timers[k >> 1] = 0; - return j; + return plmp; } -uint16 PlmInstr_SpawnEnemyProjectile(uint16 j, uint16 k) { // 0x84BBE1 - uint16 *v2 = (uint16 *)RomPtr_84(j); - SpawnEnemyProjectileWithRoomGfx(*v2, *v2); - return j + 2; +const uint8 *PlmInstr_SpawnEnemyProjectile(const uint8 *plmp, uint16 k) { // 0x84BBE1 + SpawnEnemyProjectileWithRoomGfx(GET_WORD(plmp), 0); + return plmp + 2; } -uint16 PlmInstr_WakeEnemyProjectileAtPlmPos(uint16 j, uint16 k) { // 0x84BBF0 +const uint8 *PlmInstr_WakeEnemyProjectileAtPlmPos(const uint8 *plmp, uint16 k) { // 0x84BBF0 int i; uint16 v2 = plm_block_indices[k >> 1]; @@ -2314,9 +2196,8 @@ uint16 PlmInstr_WakeEnemyProjectileAtPlmPos(uint16 j, uint16 k) { // 0x84BBF0 } int v4 = i >> 1; enemy_projectile_instr_timers[v4] = 1; - ++enemy_projectile_instr_list_ptr[v4]; - ++enemy_projectile_instr_list_ptr[v4]; - return j + 2; + enemy_projectile_instr_list_ptr[v4] += 2; + return plmp + 2; } void PlmPreInstr_GoToLinkInstrIfShot(uint16 k) { // 0x84BD0F @@ -2439,9 +2320,9 @@ void PlmPreInstr_GotoLinkIfCrittersEscaped(uint16 k) { // 0x84BE30 PlmPreInstr_PlayDudSound(k); } -uint16 PlmInstr_SetGreyDoorPreInstr(uint16 j, uint16 k) { // 0x84BE3F +const uint8 *PlmInstr_SetGreyDoorPreInstr(const uint8 *plmp, uint16 k) { // 0x84BE3F plm_pre_instrs[k >> 1] = kGrayDoorPreInstrs[plm_variable[k >> 1] >> 1]; - return j; + return plmp; } uint8 PlmSetup_C806_LeftGreenGateTrigger(uint16 j) { // 0x84C54D @@ -2650,9 +2531,9 @@ uint8 PlmSetup_Door_Strange(uint16 j) { // 0x84C7E2 return 0; } -uint16 PlmInstr_SetBtsTo1(uint16 j, uint16 k) { // 0x84CD93 - *(uint16 *)&BTS[plm_block_indices[k >> 1] >> 1] = (BTS[(plm_block_indices[k >> 1] >> 1) + 1] << 8) | 1; - return j; +const uint8 *PlmInstr_SetBtsTo1(const uint8 *plmp, uint16 k) { // 0x84CD93 + BTS[plm_block_indices[k >> 1] >> 1] = 1; + return plmp; } uint8 PlmSetup_D028_D02C_Unused(uint16 j) { // 0x84CDC2 @@ -2836,9 +2717,9 @@ uint8 PlmSetup_D138(uint16 j) { // 0x84D12B return 0; } -uint16 PlmInstr_FxBaseYPos_0x2D2(uint16 j, uint16 k) { // 0x84D155 +const uint8 *PlmInstr_FxBaseYPos_0x2D2(const uint8 *plmp, uint16 k) { // 0x84D155 fx_base_y_pos = 722; - return j; + return plmp; } void PlmPreInstr_DeletePlmAndSpawnTriggerIfBlockDestroyed(uint16 k) { // 0x84D15C @@ -2870,36 +2751,27 @@ uint8 PlmSetup_D6DA_LowerNorfairChozoHandTrigger(uint16 j) { // 0x84D18F } void PlmPreInstr_IncrementRoomArgIfShotBySuperMissile(uint16 k) { // 0x84D1E6 - int16 v3; - int v1 = k >> 1; uint16 v2 = plm_timers[v1]; - if (v2) { - v3 = v2 & 0xF00; - if (v3 == 512 || v3 == 256) { - plm_timers[v1] = 0; - ++plm_room_arguments[v1]; - } - } + if ((v2 & 0xF00) == 512 || (v2 & 0xF00) == 256) + plm_room_arguments[v1]++; plm_timers[v1] = 0; } -uint16 PlmInstr_GotoIfRoomArgLess(uint16 j, uint16 k) { // 0x84D2F9 - uint8 *v2 = RomPtr_84(j); - if (plm_room_arguments[k >> 1] >= *(uint16 *)v2) - return j + 4; +const uint8 *PlmInstr_GotoIfRoomArgLess(const uint8 *plmp, uint16 k) { // 0x84D2F9 + if (plm_room_arguments[k >> 1] >= GET_WORD(plmp)) + return plmp + 4; else - return *((uint16 *)v2 + 1); + return INSTRB_RETURN_ADDR(GET_WORD(plmp + 2)); } -uint16 PlmInstr_SpawnFourMotherBrainGlass(uint16 j, uint16 k) { // 0x84D30B +const uint8 *PlmInstr_SpawnFourMotherBrainGlass(const uint8 *plmp, uint16 k) { // 0x84D30B QueueSfx3_Max15(0x2Eu); - uint16 *v2 = (uint16 *)RomPtr_84(j); - SpawnMotherBrainGlassShatteringShard(*v2); - SpawnMotherBrainGlassShatteringShard(v2[1]); - SpawnMotherBrainGlassShatteringShard(v2[2]); - SpawnMotherBrainGlassShatteringShard(v2[3]); - return j + 8; + SpawnMotherBrainGlassShatteringShard(GET_WORD(plmp + 0)); + SpawnMotherBrainGlassShatteringShard(GET_WORD(plmp + 2)); + SpawnMotherBrainGlassShatteringShard(GET_WORD(plmp + 4)); + SpawnMotherBrainGlassShatteringShard(GET_WORD(plmp + 6)); + return plmp + 8; } void SpawnMotherBrainGlassShatteringShard(uint16 a) { // 0x84D331 @@ -2916,46 +2788,26 @@ void PlmPreInstr_WakePlmIfSamusHasBombs(uint16 k) { // 0x84D33B } } -uint16 PlmInstr_SpawnTorizoStatueBreaking(uint16 j, uint16 k) { // 0x84D357 - uint16 *v2 = (uint16 *)RomPtr_84(j); - SpawnEnemyProjectileWithRoomGfx(0xA993, *v2); - return j + 2; +const uint8 *PlmInstr_SpawnTorizoStatueBreaking(const uint8 *plmp, uint16 k) { // 0x84D357 + SpawnEnemyProjectileWithRoomGfx(0xA993, GET_WORD(plmp)); + return plmp + 2; } -uint16 PlmInstr_QueueSong1MusicTrack(uint16 j, uint16 k) { // 0x84D3C7 +const uint8 *PlmInstr_QueueSong1MusicTrack(const uint8 *plmp, uint16 k) { // 0x84D3C7 QueueMusic_Delayed8(6u); - return j; + return plmp; } -uint16 PlmInstr_TransferWreckedShipChozoSpikesToSlopes(uint16 j, uint16 k) { // 0x84D3D7 +const uint8 *PlmInstr_TransferWreckedShipChozoSpikesToSlopes(const uint8 *plmp, uint16 k) { // 0x84D3D7 WriteLevelDataBlockTypeAndBts(0x1608, 0x1012); WriteLevelDataBlockTypeAndBts(0x160A, 0x1013); - return j; + return plmp; } -uint16 PlmInstr_TransferWreckedShipSlopesToChozoSpikes(uint16 j, uint16 k) { // 0x84D3F4 +const uint8 *PlmInstr_TransferWreckedShipSlopesToChozoSpikes(const uint8 *plmp, uint16 k) { // 0x84D3F4 WriteLevelDataBlockTypeAndBts(0x1608, 0xA000); WriteLevelDataBlockTypeAndBts(0x160A, 0xA000); - return j; -} - -void UNUSED_sub_84D409(uint16 k) { // 0x84D409 - int v1 = k >> 1; - if ((plm_timers[v1] & 0xF00) == 1280) { - plm_instr_list_ptrs[v1] = plm_instruction_list_link_reg[v1]; - plm_instruction_timer[v1] = 1; - } - plm_timers[v1] = 0; -} - -void UNUSED_sub_84D476(void) { // 0x84D476 - fx_target_y_pos = 722; - fx_y_vel = 112; - fx_timer = 32; -} - -void UNUSED_sub_84D489(void) { // 0x84D489 - fx_base_y_pos = 722; + return plmp; } void PlmPreInstr_WakeOnKeyPress(uint16 k) { // 0x84D4BF @@ -2967,24 +2819,24 @@ void PlmPreInstr_WakeOnKeyPress(uint16 k) { // 0x84D4BF } } -uint16 PlmInstr_EnableWaterPhysics(uint16 j, uint16 k) { // 0x84D525 +const uint8 *PlmInstr_EnableWaterPhysics(const uint8 *plmp, uint16 k) { // 0x84D525 fx_liquid_options &= ~4u; - return j; + return plmp; } -uint16 PlmInstr_SpawnN00bTubeCrackEnemyProjectile(uint16 j, uint16 k) { // 0x84D52C +const uint8 *PlmInstr_SpawnN00bTubeCrackEnemyProjectile(const uint8 *plmp, uint16 k) { // 0x84D52C uint16 v2 = 0; // undefined SpawnEnemyProjectileWithRoomGfx(0xD904, v2); - return j; + return plmp; } -uint16 PlmInstr_DiagonalEarthquake(uint16 j, uint16 k) { // 0x84D536 +const uint8 *PlmInstr_DiagonalEarthquake(const uint8 *plmp, uint16 k) { // 0x84D536 earthquake_type = 11; earthquake_timer = 64; - return j; + return plmp; } -uint16 PlmInstr_Spawn10shardsAnd6n00bs(uint16 j, uint16 k) { // 0x84D543 +const uint8 *PlmInstr_Spawn10shardsAnd6n00bs(const uint8 *plmp, uint16 k) { // 0x84D543 SpawnEnemyProjectileWithRoomGfx(addr_kEproj_N00bTubeShards, 0); SpawnEnemyProjectileWithRoomGfx(addr_kEproj_N00bTubeShards, 2u); SpawnEnemyProjectileWithRoomGfx(addr_kEproj_N00bTubeShards, 4u); @@ -3001,17 +2853,17 @@ uint16 PlmInstr_Spawn10shardsAnd6n00bs(uint16 j, uint16 k) { // 0x84D543 SpawnEnemyProjectileWithRoomGfx(addr_kEproj_N00bTubeReleasedAirBubbles, 6u); SpawnEnemyProjectileWithRoomGfx(addr_kEproj_N00bTubeReleasedAirBubbles, 8u); SpawnEnemyProjectileWithRoomGfx(addr_kEproj_N00bTubeReleasedAirBubbles, 0xA); - return j; + return plmp; } -uint16 PlmInstr_DisableSamusControls(uint16 j, uint16 k) { // 0x84D5E6 +const uint8 *PlmInstr_DisableSamusControls(const uint8 *plmp, uint16 k) { // 0x84D5E6 CallSomeSamusCode(0); - return j; + return plmp; } -uint16 PlmInstr_EnableSamusControls(uint16 j, uint16 k) { // 0x84D5EE +const uint8 *PlmInstr_EnableSamusControls(const uint8 *plmp, uint16 k) { // 0x84D5EE CallSomeSamusCode(1); - return j; + return plmp; } uint8 PlmSetup_MotherBrainGlass(uint16 j) { // 0x84D5F6 @@ -3095,31 +2947,29 @@ void PlmPreInstr_WakePlmIfRoomArgumentDoorIsSet(uint16 k) { // 0x84D753 } } -uint16 PlmInstr_ShootEyeDoorProjectileWithProjectileArg(uint16 j, uint16 k) { // 0x84D77A - uint16 *v2 = (uint16 *)RomPtr_84(j); - SpawnEnemyProjectileWithRoomGfx(addr_kEproj_EyeDoorProjectile, *v2); +const uint8 *PlmInstr_ShootEyeDoorProjectileWithProjectileArg(const uint8 *plmp, uint16 k) { // 0x84D77A + SpawnEnemyProjectileWithRoomGfx(addr_kEproj_EyeDoorProjectile, GET_WORD(plmp)); QueueSfx2_Max6(0x4Cu); - return j + 2; + return plmp + 2; } -uint16 PlmInstr_SpawnEyeDoorSweatEnemyProjectile(uint16 j, uint16 k) { // 0x84D790 - uint16 *v2 = (uint16 *)RomPtr_84(j); - SpawnEnemyProjectileWithRoomGfx(addr_kEproj_EyeDoorSweat, *v2); - return j + 2; +const uint8 *PlmInstr_SpawnEyeDoorSweatEnemyProjectile(const uint8 *plmp, uint16 k) { // 0x84D790 + SpawnEnemyProjectileWithRoomGfx(addr_kEproj_EyeDoorSweat, GET_WORD(plmp)); + return plmp + 2; } -uint16 PlmInstr_SpawnTwoEyeDoorSmoke(uint16 j, uint16 k) { // 0x84D79F +const uint8 *PlmInstr_SpawnTwoEyeDoorSmoke(const uint8 *plmp, uint16 k) { // 0x84D79F SpawnEnemyProjectileWithRoomGfx(0xE517, 0x30A); SpawnEnemyProjectileWithRoomGfx(0xE517, 0x30A); - return j; + return plmp; } -uint16 PlmInstr_SpawnEyeDoorSmokeProjectile(uint16 j, uint16 k) { // 0x84D7B6 +const uint8 *PlmInstr_SpawnEyeDoorSmokeProjectile(const uint8 *plmp, uint16 k) { // 0x84D7B6 SpawnEnemyProjectileWithRoomGfx(addr_kEproj_EyeDoorSmoke, 0xB); - return j; + return plmp; } -uint16 PlmInstr_MoveUpAndMakeBlueDoorFacingRight(uint16 j, uint16 k) { // 0x84D7C3 +const uint8 *PlmInstr_MoveUpAndMakeBlueDoorFacingRight(const uint8 *plmp, uint16 k) { // 0x84D7C3 int v2 = k >> 1; uint16 v3 = (__PAIR32__(plm_block_indices[v2] - room_width_in_blocks, plm_block_indices[v2]) - __PAIR32__(room_width_in_blocks, room_width_in_blocks)) >> 16; @@ -3127,10 +2977,10 @@ uint16 PlmInstr_MoveUpAndMakeBlueDoorFacingRight(uint16 j, uint16 k) { // 0x84D uint16 v4 = v3; WriteLevelDataBlockTypeAndBts(v3, 0xC041); sub_84D7EF(v4); - return j; + return plmp; } -uint16 PlmInstr_MoveUpAndMakeBlueDoorFacingLeft(uint16 j, uint16 k) { // 0x84D7DA +const uint8 *PlmInstr_MoveUpAndMakeBlueDoorFacingLeft(const uint8 *plmp, uint16 k) { // 0x84D7DA int v2 = k >> 1; uint16 v3 = (__PAIR32__(plm_block_indices[v2] - room_width_in_blocks, plm_block_indices[v2]) - __PAIR32__(room_width_in_blocks, room_width_in_blocks)) >> 16; @@ -3138,7 +2988,7 @@ uint16 PlmInstr_MoveUpAndMakeBlueDoorFacingLeft(uint16 j, uint16 k) { // 0x84D7 uint16 v4 = v3; WriteLevelDataBlockTypeAndBts(v3, 0xC040); sub_84D7EF(v4); - return j; + return plmp; } void sub_84D7EF(uint16 k) { // 0x84D7EF @@ -3146,9 +2996,7 @@ void sub_84D7EF(uint16 k) { // 0x84D7EF WriteLevelDataBlockTypeAndBts(v1, 0xD0FF); uint16 v2 = room_width_in_blocks * 2 + v1; WriteLevelDataBlockTypeAndBts(v2, 0xD0FE); - WriteLevelDataBlockTypeAndBts( - room_width_in_blocks * 2 + v2, - 0xD0FDu); + WriteLevelDataBlockTypeAndBts(room_width_in_blocks * 2 + v2, 0xD0FDu); } uint8 PlmSetup_EyeDoorEye(uint16 j) { // 0x84DA8C @@ -3156,11 +3004,7 @@ uint8 PlmSetup_EyeDoorEye(uint16 j) { // 0x84DA8C if ((bitmask & opened_door_bit_array[idx]) == 0) { int v1 = j >> 1; WriteLevelDataBlockTypeAndBts(plm_block_indices[v1], 0xC044); - WriteLevelDataBlockTypeAndBts( - room_width_in_blocks - + room_width_in_blocks - + plm_block_indices[v1], - 0xD0FFu); + WriteLevelDataBlockTypeAndBts(2 * room_width_in_blocks + plm_block_indices[v1], 0xD0FFu); } return 0; } @@ -3216,17 +3060,15 @@ void SetPlmVarPtr(uint16 k, uint16 a) { *(uint16 *)&g_ram[plm_variable[k >> 1]] = a; } -uint16 PlmInstr_DamageDraygonTurret(uint16 j, uint16 k) { // 0x84DB8E +const uint8 *PlmInstr_DamageDraygonTurret(const uint8 *plmp, uint16 k) { // 0x84DB8E SetPlmVarPtr(k, 1); uint16 v2 = plm_block_indices[k >> 1]; WriteLevelDataBlockTypeAndBts(v2, 0xA003); - WriteLevelDataBlockTypeAndBts( - room_width_in_blocks * 2 + v2, - 0xA003u); - return j; + WriteLevelDataBlockTypeAndBts(room_width_in_blocks * 2 + v2, 0xA003u); + return plmp; } -uint16 PlmInstr_DamageDraygonTurretFacingDownRight(uint16 j, uint16 k) { // 0x84DBB8 +const uint8 *PlmInstr_DamageDraygonTurretFacingDownRight(const uint8 *plmp, uint16 k) { // 0x84DBB8 SetPlmVarPtr(k, 1); uint16 v2 = plm_block_indices[k >> 1]; WriteLevelDataBlockTypeAndBts(v2, 0xA003); @@ -3235,10 +3077,10 @@ uint16 PlmInstr_DamageDraygonTurretFacingDownRight(uint16 j, uint16 k) { // 0x8 uint16 v4 = room_width_in_blocks * 2 + v3; WriteLevelDataBlockTypeAndBts(v4, 0xA003); WriteLevelDataBlockTypeAndBts(v4 + 2, 0); - return j; + return plmp; } -uint16 PlmInstr_DamageDraygonTurretFacingUpRight(uint16 j, uint16 k) { // 0x84DBF7 +const uint8 *PlmInstr_DamageDraygonTurretFacingUpRight(const uint8 *plmp, uint16 k) { // 0x84DBF7 SetPlmVarPtr(k, 1); uint16 v2 = plm_block_indices[k >> 1]; WriteLevelDataBlockTypeAndBts(v2, 0xA003); @@ -3246,20 +3088,18 @@ uint16 PlmInstr_DamageDraygonTurretFacingUpRight(uint16 j, uint16 k) { // 0x84D uint16 v4 = room_width_in_blocks * 2 + v2; WriteLevelDataBlockTypeAndBts(v4, 0xA003); WriteLevelDataBlockTypeAndBts(v4 + 2, 0xA003); - return j; + return plmp; } -uint16 PlmInstr_DamageDraygonTurret2(uint16 j, uint16 k) { // 0x84DC36 +const uint8 *PlmInstr_DamageDraygonTurret2(const uint8 *plmp, uint16 k) { // 0x84DC36 SetPlmVarPtr(k, 1); uint16 v2 = plm_block_indices[k >> 1]; WriteLevelDataBlockTypeAndBts(v2, 0xA003); - WriteLevelDataBlockTypeAndBts( - room_width_in_blocks * 2 + v2, - 0xA003u); - return j; + WriteLevelDataBlockTypeAndBts(room_width_in_blocks * 2 + v2, 0xA003u); + return plmp; } -uint16 PlmInstr_DamageDraygonTurretFacingDownLeft(uint16 j, uint16 k) { // 0x84DC60 +const uint8 *PlmInstr_DamageDraygonTurretFacingDownLeft(const uint8 *plmp, uint16 k) { // 0x84DC60 SetPlmVarPtr(k, 1); uint16 v2 = plm_block_indices[k >> 1]; WriteLevelDataBlockTypeAndBts(v2, 0xA003); @@ -3267,10 +3107,10 @@ uint16 PlmInstr_DamageDraygonTurretFacingDownLeft(uint16 j, uint16 k) { // 0x84 uint16 v4 = room_width_in_blocks * 2 + v2; WriteLevelDataBlockTypeAndBts(v4, 0xA003); WriteLevelDataBlockTypeAndBts(v4 - 2, 0); - return j; + return plmp; } -uint16 PlmInstr_DamageDraygonTurretFacingUpLeft(uint16 j, uint16 k) { // 0x84DC9F +const uint8 *PlmInstr_DamageDraygonTurretFacingUpLeft(const uint8 *plmp, uint16 k) { // 0x84DC9F SetPlmVarPtr(k, 1); uint16 v2 = plm_block_indices[k >> 1]; WriteLevelDataBlockTypeAndBts(v2, 0xA003); @@ -3278,7 +3118,7 @@ uint16 PlmInstr_DamageDraygonTurretFacingUpLeft(uint16 j, uint16 k) { // 0x84DC uint16 v4 = v2 + room_width_in_blocks * 2; WriteLevelDataBlockTypeAndBts(v4, 0xA003); WriteLevelDataBlockTypeAndBts(v4 - 2, 0xA003); - return j; + return plmp; } uint8 PlmSetup_DraygonCannonFacingRight(uint16 j) { // 0x84DE94 @@ -3354,20 +3194,21 @@ void PlmPreInstr_WakeIfTriggered(uint16 k) { // 0x84DFE6 } } -uint16 PlmInstr_DrawItemFrame0(uint16 j, uint16 k) { // 0x84E04F +const uint8 *PlmInstr_DrawItemFrame0(const uint8 *plmp, uint16 k) { // 0x84E04F plm_instruction_draw_ptr[k >> 1] = off_84E05F[plm_variables[k >> 1] >> 1]; - return PlmInstr_DrawItemFrame_Common(j, k); + return PlmInstr_DrawItemFrame_Common(plmp, k); } -uint16 PlmInstr_DrawItemFrame1(uint16 j, uint16 k) { // 0x84E067 +const uint8 *PlmInstr_DrawItemFrame1(const uint8 *plmp, uint16 k) { // 0x84E067 plm_instruction_draw_ptr[k >> 1] = off_84E077[plm_variables[k >> 1] >> 1]; - return PlmInstr_DrawItemFrame_Common(j, k); + return PlmInstr_DrawItemFrame_Common(plmp, k); } -uint16 PlmInstr_DrawItemFrame_Common(uint16 j, uint16 k) { // 0x84E07F +const uint8 *PlmInstr_DrawItemFrame_Common(const uint8 *plmp, uint16 k) { // 0x84E07F int v2 = k >> 1; plm_instruction_timer[v2] = 4; - plm_instr_list_ptrs[v2] = j; + const uint8 *base = RomPtr_84(0x8000) - 0x8000; + plm_instr_list_ptrs[v2] = plmp - base; ProcessPlmDrawInstruction(k); uint16 v3 = plm_id; CalculatePlmBlockCoords(plm_id); @@ -3375,14 +3216,14 @@ uint16 PlmInstr_DrawItemFrame_Common(uint16 j, uint16 k) { // 0x84E07F return 0; } -uint16 PlmInstr_ClearChargeBeamCounter(uint16 j, uint16 k) { // 0x84E29D +const uint8 *PlmInstr_ClearChargeBeamCounter(const uint8 *plmp, uint16 k) { // 0x84E29D flare_counter = 0; - return j; + return plmp; } -uint16 PlmInstr_E63B(uint16 j, uint16 k) { // 0x84E63B +const uint8 *PlmInstr_E63B(const uint8 *plmp, uint16 k) { // 0x84E63B fx_y_vel = -32; - return j; + return plmp; } uint8 sub_84EE4D(uint16 j) { // 0x84EE4D @@ -3457,4 +3298,4 @@ uint8 sub_84EEAB(uint16 v0) { // 0x84EEAB plm_timers[i >> 1] = 255; } return 0; -} +} \ No newline at end of file diff --git a/src/sm_85.c b/src/sm_85.c index a1622d0..cb6a86d 100644 --- a/src/sm_85.c +++ b/src/sm_85.c @@ -3,6 +3,11 @@ #include "variables.h" #include "funcs.h" + +#define kMessageBoxDefs ((MsgBoxConfig*)RomFixedPtr(0x85869b)) + + + int DisplayMessageBox_Poll(uint16 a) { if (a == message_box_index) { message_box_index = 0; @@ -130,7 +135,6 @@ void CallMsgBoxModify(uint32 ea) { default: Unreachable(); } } -#define kMessageBoxDefs ((MsgBoxConfig*)RomPtr(0x85869b)) void InitializeMessageBox(void) { // 0x858241 bg3_tilemap_offset = 2 * (message_box_index - 1); uint16 v0 = message_box_index - 1; @@ -182,11 +186,11 @@ uint16 WriteMessageTilemap(void) { // 0x8582B8 ram3000.pause_menu_map_tilemap[i] = 0; bg3_tilemap_offset = 2 * (message_box_index - 1); R0_.addr = *(VoidP *)((char *)&kMessageBoxDefs[0].message_tilemap + (uint16)(6 * (message_box_index - 1))); - *(uint16 *)((char *)&R8_ + 1) = *(VoidP *)((char *)&kMessageBoxDefs[1].message_tilemap + R9_.addr = *(VoidP *)((char *)&kMessageBoxDefs[1].message_tilemap + (uint16)(6 * (message_box_index - 1))) - R0_.addr; - R22_ = *(uint16 *)((char *)&R8_ + 1) >> 1; - *(uint16 *)((char *)&R8_ + 1) += 128; + R22_ = R9_.addr >> 1; + R9_.addr += 128; uint16 v1 = 32; uint16 v2 = 0; do { @@ -224,7 +228,7 @@ void SetupPpuForActiveMessageBox(void) { // 0x85831E WriteRegWord(DMAP1, 0x1801); WriteRegWord(A1T1L, ADDR16_OF_RAM(ram3000) + 512); WriteRegWord(A1B1, 0x7E); - WriteRegWord(DAS1L, *(uint16 *)((char *)&R8_ + 1)); + WriteRegWord(DAS1L, R9_.addr); WriteRegWord(DAS10, 0); WriteRegWord(A2A1H, 0); WriteReg(VMAIN, 0x80); @@ -432,4 +436,4 @@ void RestorePpuForMessageBox(void) { // 0x85861A WriteReg(CGDATA, HIBYTE(palette_buffer[25])); WriteReg(CGDATA, palette_buffer[26]); WriteReg(CGDATA, HIBYTE(palette_buffer[26])); -} +} \ No newline at end of file diff --git a/src/sm_86.c b/src/sm_86.c index 58e32a1..39ef24c 100644 --- a/src/sm_86.c +++ b/src/sm_86.c @@ -5,17 +5,42 @@ #include "funcs.h" #include "enemy_types.h" -#define kScreenShakeOffsets ((uint16*)RomPtr(0x86846b)) -#define kAlignYPos_Tab0 ((uint8*)RomPtr(0x948b2b)) -#define kAlignPos_Tab1 ((uint8*)RomPtr(0x94892b)) -#define off_868A75 ((uint16*)RomPtr(0x868a75)) -#define word_869105 ((uint16*)RomPtr(0x869105)) -#define off_86A64D ((uint16*)RomPtr(0x86a64d)) -#define stru_86BB50 (*(EnemyProjectileDef*)RomPtr(0x86bb50)) -#define off_86BB1E ((uint16*)RomPtr(0x86bb1e)) -#define kCommonEnemySpeeds_Quadratic_Copy ((uint16*)RomPtr(0xa0cbc7)) -#define off_86C040 ((uint16*)RomPtr(0x86c040)) -#define off_86C929 ((uint16*)RomPtr(0x86c929)) + +#define kScreenShakeOffsets ((uint16*)RomFixedPtr(0x86846b)) +#define kAlignYPos_Tab0 ((uint8*)RomFixedPtr(0x948b2b)) +#define kAlignPos_Tab1 ((uint8*)RomFixedPtr(0x94892b)) +#define off_868A75 ((uint16*)RomFixedPtr(0x868a75)) +#define word_869105 ((uint16*)RomFixedPtr(0x869105)) +#define off_86A64D ((uint16*)RomFixedPtr(0x86a64d)) +#define stru_86BB50 (*(EnemyProjectileDef*)RomFixedPtr(0x86bb50)) +#define off_86BB1E ((uint16*)RomFixedPtr(0x86bb1e)) +#define kCommonEnemySpeeds_Quadratic_Copy ((uint16*)RomFixedPtr(0xa0cbc7)) +#define off_86C040 ((uint16*)RomFixedPtr(0x86c040)) +#define off_86C929 ((uint16*)RomFixedPtr(0x86c929)) +#define CHECK_locret_868728(i) (unk_868729[i] & 0x80 ? -1 : 0) +#define g_word_869059 ((uint16*)RomFixedPtr(0x869059)) +#define off_86A2E2 ((uint16*)RomFixedPtr(0x86a2e2)) +#define kEprojInit_BombTorizoStatueBreaking_InstrList ((uint16*)RomFixedPtr(0x86a7ab)) +#define off_86B209 ((uint16*)RomFixedPtr(0x86b209)) +#define kEproj_MotherBrainRoomTurrets_DirectionIndexes ((uint16*)RomFixedPtr(0x86bee1)) +#define kEproj_MotherBrainRoomTurrets_AllowedRotations ((uint16*)RomFixedPtr(0x86bec9)) +#define kEproj_MotherBrainRoomTurrets_InstrLists ((uint16*)RomFixedPtr(0x86beb9)) +#define g_off_86C040 ((uint16*)RomFixedPtr(0x86c040)) +#define kEprojInit_MotherBrainGlassShatteringShard_InstrPtrs ((uint16*)RomFixedPtr(0x86ce41)) +#define kEprojInit_N00bTubeShards_InstrPtrs ((uint16*)RomFixedPtr(0x86d760)) +#define off_86D96A ((uint16*)RomFixedPtr(0x86d96a)) +#define kSporeMovementData ((uint8*)RomFixedPtr(0x86dd6c)) +#define word_86DEB6 ((uint16*)RomFixedPtr(0x86deb6)) +#define off_86E42C ((uint16*)RomFixedPtr(0x86e42c)) +#define word_86E47E ((uint16*)RomFixedPtr(0x86e47e)) +#define kEprojInit_BotwoonsBody_InstrLists ((uint16*)RomFixedPtr(0x86e9f1)) +#define off_86EF04 ((uint16*)RomFixedPtr(0x86ef04)) +#define off_86EFD5 ((uint16*)RomFixedPtr(0x86efd5)) +#define kEnemyDef_F3D3 (*(EnemyDef_B2*)RomFixedPtr(0xa0f3d3)) +#define g_word_86F3D4 ((uint16*)RomFixedPtr(0x86f3d4)) // bug:: oob read + + + void EnableEnemyProjectiles(void) { // 0x868000 enemy_projectile_enable_flag |= 0x8000u; @@ -484,7 +509,7 @@ void EprojRunOne(uint16 k) { // 0x868125 if (enemy_projectile_instr_timers[v2]-- == 1) { uint16 v4 = enemy_projectile_instr_list_ptr[v2], v6; while (1) { - uint16 *v5 = (uint16 *)RomPtr_86(v4); + const uint16 *v5 = (const uint16 *)RomPtr_86(v4); v6 = *v5; if ((*v5 & 0x8000u) == 0) break; @@ -532,7 +557,7 @@ void CallEprojFunc(uint32 ea, uint32 k) { } uint16 EprojInstr_CallFunc(uint16 k, uint16 j) { // 0x868171 - uint8 *v2 = RomPtr_86(j); + const uint8 *v2 = RomPtr_86(j); copy24((LongPtr *)&R18_, (LongPtr *)v2); uint32 ea = Load24((LongPtr *)&R18_); @@ -580,13 +605,13 @@ uint16 EprojInstr_MoveRandomlyWithinRadius(uint16 k, uint16 j) { // 0x8681DF R18_ = NextRandom(); do { Random = NextRandom(); - uint8 *v3 = RomPtr_86(j); + const uint8 *v3 = RomPtr_86(j); v4 = (*v3 & Random) - v3[1]; } while (v4 < 0); enemy_projectile_x_pos[k >> 1] += sign16(R18_) ? -(uint8)v4 : (uint8)v4; do { LOBYTE(v6) = NextRandom(); - uint8 *v5 = RomPtr_86(j); + const uint8 *v5 = RomPtr_86(j); LOBYTE(v6) = (v5[2] & v6) - v5[3]; } while ((v6 & 0x80) != 0); v6 = (uint8)v6; @@ -670,10 +695,10 @@ uint16 EprojInstr_CalculateDirectionTowardsSamus(uint16 k, uint16 j) { // 0x868 } uint16 EprojInstr_WriteColorsToPalette(uint16 k, uint16 j) { // 0x8682D5 - uint8 *v2 = RomPtr_86(j); - uint16 v3 = *((uint16 *)v2 + 1); + const uint8 *v2 = RomPtr_86(j); + uint16 v3 = GET_WORD(v2 + 2); R18_ = v2[4]; - uint16 v4 = *(uint16 *)v2; + uint16 v4 = GET_WORD(v2); do { palette_buffer[v3 >> 1] = *(uint16 *)RomPtr_86(v4); v4 += 2; @@ -684,91 +709,91 @@ uint16 EprojInstr_WriteColorsToPalette(uint16 k, uint16 j) { // 0x8682D5 } uint16 EprojInstr_QueueMusic(uint16 k, uint16 j) { // 0x8682FD - uint8 *v2 = RomPtr_86(j); + const uint8 *v2 = RomPtr_86(j); QueueMusic_Delayed8(*v2); return j + 1; } uint16 EprojInstr_QueueSfx1_Max6(uint16 k, uint16 j) { // 0x868309 - uint16 *v2 = (uint16 *)RomPtr_86(j); + const uint16 *v2 = (uint16 *)RomPtr_86(j); QueueSfx1_Max6(*v2); return j + 1; } uint16 EprojInstr_QueueSfx2_Max6(uint16 k, uint16 j) { // 0x868312 - uint16 *v2 = (uint16 *)RomPtr_86(j); + const uint16 *v2 = (uint16 *)RomPtr_86(j); QueueSfx2_Max6(*v2); return j + 1; } uint16 EprojInstr_QueueSfx3_Max6(uint16 k, uint16 j) { // 0x86831B - uint16 *v2 = (uint16 *)RomPtr_86(j); + const uint16 *v2 = (uint16 *)RomPtr_86(j); QueueSfx3_Max6(*v2); return j + 1; } uint16 EprojInstr_QueueSfx1_Max15(uint16 k, uint16 j) { // 0x868324 - uint16 *v2 = (uint16 *)RomPtr_86(j); + const uint16 *v2 = (uint16 *)RomPtr_86(j); QueueSfx1_Max15(*v2); return j + 1; } uint16 EprojInstr_QueueSfx2_Max15(uint16 k, uint16 j) { // 0x86832D - uint16 *v2 = (uint16 *)RomPtr_86(j); + const uint16 *v2 = (uint16 *)RomPtr_86(j); QueueSfx2_Max15(*v2); return j + 1; } uint16 EprojInstr_QueueSfx3_Max15(uint16 k, uint16 j) { // 0x868336 - uint16 *v2 = (uint16 *)RomPtr_86(j); + const uint16 *v2 = (uint16 *)RomPtr_86(j); QueueSfx3_Max15(*v2); return j + 1; } uint16 EprojInstr_QueueSfx1_Max3(uint16 k, uint16 j) { // 0x86833F - uint16 *v2 = (uint16 *)RomPtr_86(j); + const uint16 *v2 = (uint16 *)RomPtr_86(j); QueueSfx1_Max3(*v2); return j + 1; } uint16 EprojInstr_QueueSfx2_Max3(uint16 k, uint16 j) { // 0x868348 - uint16 *v2 = (uint16 *)RomPtr_86(j); + const uint16 *v2 = (uint16 *)RomPtr_86(j); QueueSfx2_Max3(*v2); return j + 1; } uint16 EprojInstr_QueueSfx3_Max3(uint16 k, uint16 j) { // 0x868351 - uint16 *v2 = (uint16 *)RomPtr_86(j); + const uint16 *v2 = (uint16 *)RomPtr_86(j); QueueSfx3_Max3(*v2); return j + 1; } uint16 EprojInstr_QueueSfx1_Max9(uint16 k, uint16 j) { // 0x86835A - uint16 *v2 = (uint16 *)RomPtr_86(j); + const uint16 *v2 = (uint16 *)RomPtr_86(j); QueueSfx1_Max9(*v2); return j + 1; } uint16 EprojInstr_QueueSfx2_Max9(uint16 k, uint16 j) { // 0x868363 - uint16 *v2 = (uint16 *)RomPtr_86(j); + const uint16 *v2 = (uint16 *)RomPtr_86(j); QueueSfx2_Max9(*v2); return j + 1; } uint16 EprojInstr_QueueSfx3_Max9(uint16 k, uint16 j) { // 0x86836C - uint16 *v2 = (uint16 *)RomPtr_86(j); + const uint16 *v2 = (uint16 *)RomPtr_86(j); QueueSfx3_Max9(*v2); return j + 1; } uint16 EprojInstr_QueueSfx1_Max1(uint16 k, uint16 j) { // 0x868375 - uint16 *v2 = (uint16 *)RomPtr_86(j); + const uint16 *v2 = (uint16 *)RomPtr_86(j); QueueSfx1_Max1(*v2); return j + 1; } uint16 EprojInstr_QueueSfx2_Max1(uint16 k, uint16 j) { // 0x86837E - uint16 *v2 = (uint16 *)RomPtr_86(j); + const uint16 *v2 = (uint16 *)RomPtr_86(j); QueueSfx2_Max1(*v2); return j + 1; } uint16 EprojInstr_QueueSfx3_Max1(uint16 k, uint16 j) { // 0x868387 - uint16 *v2 = (uint16 *)RomPtr_86(j); + const uint16 *v2 = (uint16 *)RomPtr_86(j); QueueSfx3_Max1(*v2); return j + 1; } @@ -842,14 +867,14 @@ uint8 EprojColl_Unknown8536(void) { // 0x86853C if (BTS[cur_block_index]) { uint16 v1; if ((BTS[cur_block_index] & 0x80) != 0) { - temp_collision_DD4 = BTS[cur_block_index] | 0xFF00; + uint16 temp_collision_DD4 = BTS[cur_block_index] | 0xFF00; v1 = cur_block_index; do { v1 -= room_width_in_blocks; ++temp_collision_DD4; } while (temp_collision_DD4); } else { - temp_collision_DD4 = BTS[cur_block_index]; + uint16 temp_collision_DD4 = BTS[cur_block_index]; v1 = cur_block_index; do { v1 += room_width_in_blocks; @@ -892,19 +917,18 @@ static const uint8 unk_868729[20] = { // 0x8685C2 }; -#define CHECK_locret_868728(i) (unk_868729[i] & 0x80 ? -1 : 0) uint8 EprojColl_85C2(uint16 a, uint16 k) { - temp_collision_DD4 = 4 * a; - temp_collision_DD6 = BTS[k] >> 6; + uint16 temp_collision_DD4 = 4 * a; + uint16 temp_collision_DD6 = BTS[k] >> 6; uint16 v2 = 4 * a + (temp_collision_DD6 ^ ((uint8)(R34 & 8) >> 3)); - if (!R32) { + if (!R32_) { int v3 = enemy_projectile_index >> 1; - if ((((uint8)enemy_projectile_y_pos[v3] - (uint8)g_word_7E001E) & 8) != 0 + if ((((uint8)enemy_projectile_y_pos[v3] - (uint8)R30_) & 8) != 0 || CHECK_locret_868728(v2) >= 0) { uint16 v4 = v2 ^ 2; - if ((((uint8)g_word_7E001E + (uint8)enemy_projectile_y_pos[v3] - 1) & 8) == 0 + if ((((uint8)R30_ + (uint8)enemy_projectile_y_pos[v3] - 1) & 8) == 0 || CHECK_locret_868728(v4) >= 0) { return 0; } @@ -912,15 +936,15 @@ uint8 EprojColl_85C2(uint16 a, uint16 k) { goto LABEL_17; } if (!R26_) { - if ((((uint8)g_word_7E001E + (uint8)enemy_projectile_y_pos[enemy_projectile_index >> 1] - 1) & 8) == 0) { + if ((((uint8)R30_ + (uint8)enemy_projectile_y_pos[enemy_projectile_index >> 1] - 1) & 8) == 0) { if (CHECK_locret_868728(v2) >= 0) return 0; goto LABEL_17; } goto LABEL_14; } - if (R26_ != R32 - || (((uint8)enemy_projectile_y_pos[enemy_projectile_index >> 1] - (uint8)g_word_7E001E) & 8) == 0) { + if (R26_ != R32_ + || (((uint8)enemy_projectile_y_pos[enemy_projectile_index >> 1] - (uint8)R30_) & 8) == 0) { LABEL_14: if (CHECK_locret_868728(v2) < 0) goto LABEL_17; @@ -942,10 +966,10 @@ LABEL_17:; uint8 EprojColl_8676(uint16 a, uint16 k, uint16 j) { // 0x868676 uint16 v2 = enemy_projectile_index; - temp_collision_DD4 = 4 * a; - temp_collision_DD6 = BTS[k] >> 6; + uint16 temp_collision_DD4 = 4 * a; + uint16 temp_collision_DD6 = BTS[k] >> 6; uint16 v3 = 4 * a + (temp_collision_DD6 ^ ((uint8)(R34 & 8) >> 2)); - if (!R32) { + if (!R32_) { printf("Y unknown!\n"); int v4 = v2 >> 1; if ((((uint8)enemy_projectile_x_pos[v4] - (uint8)R28_) & 8) != 0 @@ -966,7 +990,7 @@ uint8 EprojColl_8676(uint16 a, uint16 k, uint16 j) { // 0x868676 } goto LABEL_14; } - if (R26_ != R32 || (((uint8)enemy_projectile_x_pos[enemy_projectile_index >> 1] - (uint8)R28_) & 8) == 0) { + if (R26_ != R32_ || (((uint8)enemy_projectile_x_pos[enemy_projectile_index >> 1] - (uint8)R28_) & 8) == 0) { LABEL_14: if (CHECK_locret_868728(v3) < 0) goto LABEL_17; @@ -978,9 +1002,9 @@ LABEL_17:; uint16 v8; enemy_projectile_y_subpos[v7] = 0; if ((R20_ & 0x8000u) != 0) - v8 = g_word_7E001E + (R34 | 7) + 1; + v8 = R30_ + (R34 | 7) + 1; else - v8 = (R34 & 0xFFF8) - g_word_7E001E; + v8 = (R34 & 0xFFF8) - R30_; enemy_projectile_y_pos[v7] = v8; return 1; } @@ -1008,8 +1032,8 @@ uint8 EprojColl_874E(void) { // 0x86874E int v10 = v0 >> 1; v11 = enemy_projectile_x_pos[v10] >> 4; if (v11 == mod) { - temp_collision_DD4 = ((uint8)R24_ - (uint8)g_word_7E001E) & 0xF ^ 0xF; - temp_collision_DD6 = 16 * (BTS[v9] & 0x1F); + uint16 temp_collision_DD4 = ((uint8)R24_ - (uint8)R30_) & 0xF ^ 0xF; + uint16 temp_collision_DD6 = 16 * (BTS[v9] & 0x1F); v12 = BTS[v9] << 8; if (v12 < 0 && ((v12 & 0x4000) != 0 ? (v13 = enemy_projectile_x_pos[v10] ^ 0xF) : (v13 = enemy_projectile_x_pos[v10]), @@ -1032,8 +1056,8 @@ uint8 EprojColl_874E(void) { // 0x86874E int v2 = v0 >> 1; v3 = enemy_projectile_x_pos[v2] >> 4; if (v3 == mod) { - temp_collision_DD4 = ((uint8)g_word_7E001E + (uint8)R24_ - 1) & 0xF; - temp_collision_DD6 = 16 * (BTS[v1] & 0x1F); + uint16 temp_collision_DD4 = ((uint8)R30_ + (uint8)R24_ - 1) & 0xF; + uint16 temp_collision_DD6 = 16 * (BTS[v1] & 0x1F); v5 = BTS[v1] << 8; if (v5 >= 0 && ((v5 & 0x4000) != 0 ? (v6 = enemy_projectile_x_pos[v2] ^ 0xF) : (v6 = enemy_projectile_x_pos[v2]), @@ -1117,13 +1141,13 @@ uint8 EnemyProjectileBlockCollisition_Horiz(uint16 k) { // 0x8688B6 v2 = enemy_projectile_x_vel[v1]; if (v2 < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = v2; - g_word_7E001E = HIBYTE(enemy_projectile_radius[v1]); + R19_ = v2; + R30_ = HIBYTE(enemy_projectile_radius[v1]); R28_ = LOBYTE(enemy_projectile_radius[v1]); - R26_ = (enemy_projectile_y_pos[v1] - g_word_7E001E) & 0xFFF0; - R26_ = (uint16)(g_word_7E001E + enemy_projectile_y_pos[v1] - 1 - R26_) >> 4; - R32 = R26_; - uint16 prod = Mult8x8((uint16)(enemy_projectile_y_pos[v1] - g_word_7E001E) >> 4, room_width_in_blocks); + R26_ = (enemy_projectile_y_pos[v1] - R30_) & 0xFFF0; + R26_ = (uint16)(R30_ + enemy_projectile_y_pos[v1] - 1 - R26_) >> 4; + R32_ = R26_; + uint16 prod = Mult8x8((uint16)(enemy_projectile_y_pos[v1] - R30_) >> 4, room_width_in_blocks); uint16 v3 = (__PAIR32__(R20_, R18_) + __PAIR32__(enemy_projectile_x_pos[v1], enemy_projectile_1A27[v1])) >> 16; R22_ = R18_ + enemy_projectile_1A27[v1]; R24_ = v3; @@ -1168,20 +1192,20 @@ uint8 EnemyProjectileBlockCollisition_Vertical(uint16 k) { // 0x86897B v2 = enemy_projectile_y_vel[v1]; if (v2 < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = v2; - g_word_7E001E = HIBYTE(enemy_projectile_radius[v1]); + R19_ = v2; + R30_ = HIBYTE(enemy_projectile_radius[v1]); R28_ = LOBYTE(enemy_projectile_radius[v1]); R26_ = (enemy_projectile_x_pos[v1] - R28_) & 0xFFF0; R26_ = (uint16)(R28_ + enemy_projectile_x_pos[v1] - 1 - R26_) >> 4; - R32 = R26_; + R32_ = R26_; uint16 v3 = (__PAIR32__(R20_, R18_) + __PAIR32__(enemy_projectile_y_pos[v1], enemy_projectile_y_subpos[v1])) >> 16; R22_ = R18_ + enemy_projectile_y_subpos[v1]; R24_ = v3; uint16 v4; if ((R20_ & 0x8000u) != 0) - v4 = v3 - g_word_7E001E; + v4 = v3 - R30_; else - v4 = g_word_7E001E + v3 - 1; + v4 = R30_ + v3 - 1; R34 = v4; uint16 prod = Mult8x8(v4 >> 4, room_width_in_blocks); v5 = (uint16)(enemy_projectile_x_pos[v1] - R28_) >> 4; @@ -1196,12 +1220,12 @@ uint8 EnemyProjectileBlockCollisition_Vertical(uint16 k) { // 0x86897B int v9 = k >> 1; enemy_projectile_y_subpos[v9] = 0; if ((R20_ & 0x8000u) != 0) { - uint16 v11 = g_word_7E001E + (R34 | 0xF) + 1; + uint16 v11 = R30_ + (R34 | 0xF) + 1; if (v11 < enemy_projectile_y_pos[v9] || v11 == enemy_projectile_y_pos[v9]) enemy_projectile_y_pos[v9] = v11; return 1; } else { - uint16 v10 = (R34 & 0xFFF0) - g_word_7E001E; + uint16 v10 = (R34 & 0xFFF0) - R30_; if (v10 >= enemy_projectile_y_pos[v9]) enemy_projectile_y_pos[v9] = v10; return 1; @@ -1444,7 +1468,6 @@ void EprojInit_CrocomireProjectile(uint16 j) { // 0x869023 } static const int16 word_869059[9] = { -16, 0, 32, -16, 0, 32, -16, 0, 32 }; // bug: oob read -#define g_word_869059 ((uint16*)RomPtr(0x869059)) void EprojPreInstr_CrocomireProjectile(uint16 k) { // 0x86906B EnemyProjectileBlockCollisition_Horiz(k); enemy_projectile_gfx_idx[0] = 2560; @@ -1600,12 +1623,13 @@ uint16 MoveEprojWithVelocityX(uint16 k) { // 0x869311 void SetAreaDependentEprojPropertiesEx(uint16 k, uint16 j) { // 0x86932F uint16 v2; + uint16 *p = (uint16 *)RomPtr_86(k); if (area_index == 2) { - v2 = *((uint16 *)RomPtr_86(k) + 1); + v2 = p[1]; } else if (area_index == 5) { - v2 = *((uint16 *)RomPtr_86(k) + 2); + v2 = p[2]; } else { - v2 = *(uint16 *)RomPtr_86(k); + v2 = p[0]; } enemy_projectile_properties[j >> 1] = v2; } @@ -2342,7 +2366,6 @@ void EprojPreInstr_PirateClawThrownRight(uint16 k) { // 0x86A124 } static const int16 word_86A2D6[6] = { 64, 72, 80, -64, -72, -80 }; -#define off_86A2E2 ((uint16*)RomPtr(0x86a2e2)) void EprojInit_A379(uint16 j) { // 0x86A2A1 int v1 = j >> 1; @@ -2494,7 +2517,6 @@ void EprojInit_A977(uint16 j) { // 0x86A6C7 static const int16 kEprojInit_BombTorizoExplosiveSwipe_Tab0[11] = { -30, -40, -47, -31, -21, -1, -28, -43, -48, -31, -21 }; static const int16 kEprojInit_BombTorizoExplosiveSwipe_Tab1[11] = { -52, -28, -11, 9, 21, 20, -52, -27, -10, 9, 20 }; -#define kEprojInit_BombTorizoStatueBreaking_InstrList ((uint16*)RomPtr(0x86a7ab)) static const int16 kEprojInit_BombTorizoStatueBreaking_Xpos[16] = { 8, 0x18, -8, 8, 0x18, -8, 8, 0x18, 8, -8, 0x18, 8, -8, 0x18, 8, -8 }; static const int16 kEprojInit_BombTorizoStatueBreaking_Ypos[8] = { -8, -8, 8, 8, 8, 0x18, 0x18, 0x18 }; static const int16 kEprojInit_BombTorizoStatueBreaking_Yvel[8] = { 256, 256, 256, 256, 256, 256, 256, 256 }; @@ -2661,7 +2683,7 @@ void EprojPreInstr_AB07(uint16 k) { // 0x86AA8C uint16 v2 = 8 * (samus_x_pos - enemy_projectile_x_pos[v1]); if (((samus_x_pos - enemy_projectile_x_pos[v1]) & 0x1000) != 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = v2; + R19_ = v2; bool v3 = __CFADD__uint16(enemy_projectile_1A27[v1], R18_); enemy_projectile_1A27[v1] += R18_; enemy_projectile_x_pos[v1] += v3 + R20_; @@ -2670,7 +2692,7 @@ void EprojPreInstr_AB07(uint16 k) { // 0x86AA8C uint16 v4 = 8 * (samus_y_pos - 36 - enemy_projectile_y_pos[v1]); if (((samus_y_pos - 36 - enemy_projectile_y_pos[v1]) & 0x1000) != 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = v4; + R19_ = v4; v3 = __CFADD__uint16(enemy_projectile_y_subpos[v1], R18_); enemy_projectile_y_subpos[v1] += R18_; enemy_projectile_y_pos[v1] += v3 + R20_; @@ -2678,19 +2700,15 @@ void EprojPreInstr_AB07(uint16 k) { // 0x86AA8C uint16 EprojInstr_SpawnEnemyDrops(uint16 k, uint16 j) { // 0x86AB8A int v2 = k >> 1; - uint16 v3; R18_ = enemy_projectile_x_pos[v2]; R20_ = enemy_projectile_y_pos[v2]; - if (area_index) - v3 = *((uint16 *)RomPtr_86(j) + 1); - else - v3 = *(uint16 *)RomPtr_86(j); - SpawnEnemyDrops(v3, k); + uint16 *p = (uint16 *)RomPtr_86(j); + SpawnEnemyDrops(area_index ? p[1] : p[0], k); return j + 4; } void Eproj_InitXYVelRandom(uint16 j, uint16 k) { // 0x86ABAE - uint16 *v2 = (uint16 *)RomPtr_86(k); + const uint16 *v2 = (const uint16 *)RomPtr_86(k); int v3 = j >> 1; enemy_projectile_instr_list_ptr[v3] = *v2; enemy_projectile_x_pos[v3] = v2[1] + R18_; @@ -2778,15 +2796,16 @@ uint16 EprojInstr_GotoDependingOnXDirection(uint16 k, uint16 j) { // 0x86AD92 v3 = enemy_projectile_x_vel[v2]; if (v3 < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = v3; + R19_ = v3; uint16 v4 = enemy_projectile_1A27[v2]; bool v5 = __CFADD__uint16(R18_, v4); enemy_projectile_1A27[v2] = R18_ + v4; enemy_projectile_x_pos[v2] += R20_ + v5; + uint16 *t = (uint16 *)RomPtr_86(j); if ((enemy_projectile_x_vel[v2] & 0x8000u) == 0) - return *((uint16 *)RomPtr_86(j) + 1); + return t[1]; else - return *(uint16 *)RomPtr_86(j); + return t[0]; } void EprojInit_TorizoSonicBoom(uint16 j) { // 0x86AE15 @@ -2972,7 +2991,6 @@ uint16 sub_86B183(uint16 k, uint16 j) { // 0x86B183 } static const int16 word_86B205[2] = { -0x1e, 0x1e }; -#define off_86B209 ((uint16*)RomPtr(0x86b209)) void EprojInit_GoldenTorizoSuperMissile(uint16 j) { // 0x86B1CE uint16 v4; @@ -3331,7 +3349,7 @@ void EprojPreInstr_TourianStatueUnlockingParticle(uint16 k) { // 0x86B982 v2 = enemy_projectile_x_vel[v1]; if (v2 < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = v2; + R19_ = v2; uint16 v3 = enemy_projectile_1A27[v1]; bool v4 = __CFADD__uint16(R18_, v3); enemy_projectile_1A27[v1] = R18_ + v3; @@ -3342,7 +3360,7 @@ void EprojPreInstr_TourianStatueUnlockingParticle(uint16 k) { // 0x86B982 v5 = enemy_projectile_y_vel[v1]; if (v5 < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = v5; + R19_ = v5; uint16 v6 = enemy_projectile_y_subpos[v1]; v4 = __CFADD__uint16(R18_, v6); enemy_projectile_y_subpos[v1] = R18_ + v6; @@ -3366,7 +3384,7 @@ void EprojPreInstr_TourianStatueSoul(uint16 k) { // 0x86B9FD v2 = enemy_projectile_y_vel[v1]; if (v2 < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = v2; + R19_ = v2; uint16 v3 = enemy_projectile_y_subpos[v1]; bool v4 = __CFADD__uint16(R18_, v3); enemy_projectile_y_subpos[v1] = R18_ + v3; @@ -3571,9 +3589,6 @@ void EprojPreInstr_BE12(uint16 k) { // 0x86BE12 } } -#define kEproj_MotherBrainRoomTurrets_DirectionIndexes ((uint16*)RomPtr(0x86bee1)) -#define kEproj_MotherBrainRoomTurrets_AllowedRotations ((uint16*)RomPtr(0x86bec9)) -#define kEproj_MotherBrainRoomTurrets_InstrLists ((uint16*)RomPtr(0x86beb9)) static const int16 kEprojInit_MotherBrainRoomTurrets_X[12] = { 0x398, 0x348, 0x328, 0x2d8, 0x288, 0x268, 0x218, 0x1c8, 0x1a8, 0x158, 0x108, 0xe8 }; static const int16 EprojInit_MotherBrainRoomTurrets_Y[12] = { 0x30, 0x40, 0x40, 0x30, 0x40, 0x40, 0x30, 0x40, 0x40, 0x30, 0x40, 0x40 }; @@ -3614,7 +3629,6 @@ void EprojInit_MotherBrainRoomTurretBullets(uint16 j) { // 0x86BF59 enemy_projectile_y_pos[v1] = R20_ + enemy_projectile_y_pos[v4]; } -#define g_off_86C040 ((uint16*)RomPtr(0x86c040)) void EprojPreInstr_MotherBrainRoomTurrets(uint16 k) { // 0x86BFDF if (Eproj_MotherBrainRoomTurretBullets_CheckIfTurretOnScreen(k) & 1) { @@ -3826,7 +3840,7 @@ uint16 Math_MultByCos(uint16 a) { // 0x86C272 } uint16 Math_MultBySinCos(uint16 a) { // 0x86C27A - R46 = kSinCosTable8bit_Sext[((uint16)((2 * a) & 0x1FE) >> 1) + 64]; + R46 = kSinCosTable8bit_Sext[(a & 0xff) + 64]; R40 = abs16(R46); Math_Mult16U(); uint16 r = *(uint16 *)((char *)&R42 + 1); @@ -4269,7 +4283,6 @@ void MotherBrainTubeFallingFunc_Falling(uint16 k) { // 0x86CC08 } } -#define kEprojInit_MotherBrainGlassShatteringShard_InstrPtrs ((uint16*)RomPtr(0x86ce41)) static const int16 kEprojInit_MotherBrainGlassShatteringShard_X[3] = { 8, -40, -16 }; static const int16 kEprojInit_MotherBrainGlassShatteringShard_Y[3] = { 32, 32, 32 }; @@ -4308,7 +4321,7 @@ void EprojPreInstr_MotherBrainGlassShatteringShard(uint16 k) { // 0x86CE9B v2 = enemy_projectile_x_vel[v1]; if (v2 < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = v2; + R19_ = v2; uint16 v3 = enemy_projectile_1A27[v1]; bool v4 = __CFADD__uint16(R18_, v3); enemy_projectile_1A27[v1] = R18_ + v3; @@ -4318,7 +4331,7 @@ void EprojPreInstr_MotherBrainGlassShatteringShard(uint16 k) { // 0x86CE9B v5 = enemy_projectile_y_vel[v1]; if (v5 < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = v5; + R19_ = v5; uint16 v6 = enemy_projectile_y_subpos[v1]; v4 = __CFADD__uint16(R18_, v6); enemy_projectile_y_subpos[v1] = R18_ + v6; @@ -4646,7 +4659,6 @@ static const int16 kEprojInit_N00bTubeShards_X[10] = { -56, -64, -20, -40, -64, static const int16 kEprojInit_N00bTubeShards_Y[10] = { 8, -12, -26, -24, -32, 28, 16, -8, -24, 16 }; static const int16 kEprojInit_N00bTubeShards_Xvel[10] = { -384, -384, -160, -288, -288, -320, -96, -352, 0, -64 }; static const int16 kEprojInit_N00bTubeShards_Yvel[10] = { 320, -256, -416, -288, -288, 448, 576, -96, -288, 384 }; -#define kEprojInit_N00bTubeShards_InstrPtrs ((uint16*)RomPtr(0x86d760)) void EprojInit_N00bTubeShards(uint16 j) { // 0x86D6C9 CalculatePlmBlockCoords(plm_id); @@ -4686,7 +4698,7 @@ void sub_86D7BF(uint16 k) { // 0x86D7BF void sub_86D7DE(uint16 k) { // 0x86D7DE R18_ = 0; R20_ = 0; - *(uint16 *)((char *)&R18_ + 1) = 192; + R19_ = 192; int v1 = k >> 1; uint16 v2 = enemy_projectile_y_subpos[v1]; bool v3 = __CFADD__uint16(R18_, v2); @@ -4704,7 +4716,7 @@ void EprojPreInstr_N00bTubeShards(uint16 k) { // 0x86D7FD v2 = enemy_projectile_x_vel[v1]; if (v2 < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = v2; + R19_ = v2; uint16 v3 = enemy_projectile_E[v1]; bool v4 = __CFADD__uint16(R18_, v3); enemy_projectile_E[v1] = R18_ + v3; @@ -4714,7 +4726,7 @@ void EprojPreInstr_N00bTubeShards(uint16 k) { // 0x86D7FD v5 = enemy_projectile_y_vel[v1]; if (v5 < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = v5; + R19_ = v5; uint16 v6 = enemy_projectile_y_subpos[v1]; v4 = __CFADD__uint16(R18_, v6); enemy_projectile_y_subpos[v1] = R18_ + v6; @@ -4732,7 +4744,7 @@ void sub_86D83D(uint16 k) { // 0x86D83D uint16 v3 = kSinCosTable8bit_Sext[v2 + 64]; if ((kSinCosTable8bit_Sext[v2 + 64] & 0x8000u) != 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = (int16)v3 >> 2; + R19_ = (int16)v3 >> 2; uint16 v5 = enemy_projectile_index; int v6 = enemy_projectile_index >> 1; uint16 v7 = enemy_projectile_E[v6]; @@ -4745,7 +4757,7 @@ void sub_86D83D(uint16 k) { // 0x86D83D v8 = enemy_projectile_y_vel[v6]; if (v8 < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = v8; + R19_ = v8; uint16 v9 = enemy_projectile_y_subpos[v6]; v4 = __CFADD__uint16(R18_, v9); enemy_projectile_y_subpos[v6] = R18_ + v9; @@ -4761,7 +4773,7 @@ void sub_86D89F(uint16 k) { // 0x86D89F uint16 v3 = kSinCosTable8bit_Sext[v2 + 64]; if ((kSinCosTable8bit_Sext[v2 + 64] & 0x8000u) != 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = (int16)v3 >> 2; + R19_ = (int16)v3 >> 2; int v5 = enemy_projectile_index >> 1; uint16 v6 = enemy_projectile_E[v5]; bool v4 = __CFADD__uint16(R18_, v6); @@ -4779,7 +4791,7 @@ void sub_86D8DF(uint16 k) { // 0x86D8DF v7 = enemy_projectile_y_vel[v5]; if (v7 < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = v7; + R19_ = v7; uint16 v8 = enemy_projectile_y_subpos[v5]; bool v4 = __CFADD__uint16(R18_, v8); enemy_projectile_y_subpos[v5] = R18_ + v8; @@ -4787,7 +4799,6 @@ void sub_86D8DF(uint16 k) { // 0x86D8DF enemy_projectile_x_pos[v5] = enemy_projectile_F[v5]; } -#define off_86D96A ((uint16*)RomPtr(0x86d96a)) void sub_86D992(uint16 v0) { // 0x86D992 uint16 v1 = enemy_projectile_init_param; @@ -5032,7 +5043,6 @@ void EprojInit_SporeSpawners(uint16 j) { // 0x86DCD4 enemy_projectile_y_pos[v1] = 520; } -#define kSporeMovementData ((uint8*)RomPtr(0x86dd6c)) void EprojPreInstr_Spores(uint16 k) { // 0x86DCEE int v1 = k >> 1; @@ -5061,7 +5071,6 @@ void EprojPreInstr_SporeSpawners(uint16 k) { // 0x86DD46 } } -#define word_86DEB6 ((uint16*)RomPtr(0x86deb6)) void EprojInit_NamiFuneFireball(uint16 j) { // 0x86DED6 int v2 = j >> 1; @@ -5208,8 +5217,6 @@ uint16 sub_86E0B0(uint16 k) { // 0x86E0B0 || (int16)(layer1_y_pos + 256 - enemy_projectile_y_pos[v1]) < 0; } -#define off_86E42C ((uint16*)RomPtr(0x86e42c)) -#define word_86E47E ((uint16*)RomPtr(0x86e47e)) void EprojInst_DustCloudOrExplosion(uint16 v0) { // 0x86E468 int v1 = v0 >> 1; @@ -5220,7 +5227,7 @@ void EprojInst_DustCloudOrExplosion(uint16 v0) { // 0x86E468 void EprojInit_EyeDoorSmoke(uint16 j) { // 0x86E4A6 int v1 = j >> 1; - enemy_projectile_instr_list_ptr[v1] = off_86E42C[(uint16)(2 * (uint8)enemy_projectile_init_param) >> 1]; + enemy_projectile_instr_list_ptr[v1] = off_86E42C[(uint8)enemy_projectile_init_param]; int v2 = (uint16)(8 * HIBYTE(enemy_projectile_init_param)) >> 1; R18_ = word_86E47E[v2 + 2] + (word_86E47E[v2] & random_number); R20_ = word_86E47E[v2 + 3] + (word_86E47E[v2 + 1] & *(uint16 *)((char *)&random_number + 1)); @@ -5361,7 +5368,6 @@ void Eproj_AngleToSamus(uint16 j) { // 0x86E7AB enemy_projectile_F[v1] = R28_; } -#define kEprojInit_BotwoonsBody_InstrLists ((uint16*)RomPtr(0x86e9f1)) void EprojInit_BotwoonsBody(uint16 j) { // 0x86EA31 int v1 = j >> 1; @@ -5398,7 +5404,7 @@ void CallBotwoonEprojFunc(uint32 ea, uint16 k) { void EprojPreInstr_BotwoonsBody(uint16 k) { // 0x86EA80 if (*(uint16 *)&extra_enemy_ram8000[0].pad[32]) { int v1 = k >> 1; - if (enemy_projectile_x_vel[v1] == (uint16)FUNC16(Eproj_BotwoonsBody_Main)) + if (enemy_projectile_x_vel[v1] == FUNC16(Eproj_BotwoonsBody_Main)) enemy_projectile_x_vel[v1] = FUNC16(Eproj_BotwonsBodyFunction_Dying); } CallBotwoonEprojFunc(enemy_projectile_x_vel[k >> 1] | 0x860000, k); @@ -5565,7 +5571,6 @@ uint16 EprojInstr_QueueSfx2_B(uint16 k, uint16 j) { // 0x86EEA3 return j; } -#define off_86EF04 ((uint16*)RomPtr(0x86ef04)) uint16 EprojInstr_EEAF(uint16 k, uint16 j) { // 0x86EEAF uint16 v2 = RandomDropRoutine(k); @@ -5618,7 +5623,6 @@ void EprojInit_F337(uint16 j) { // 0x86EF29 } } -#define off_86EFD5 ((uint16*)RomPtr(0x86efd5)) void EprojInit_EnemyDeathExplosion(uint16 j) { // 0x86EF89 EnemyData *v1 = gEnemyData(cur_enemy_index); @@ -5745,11 +5749,11 @@ uint16 RandomDropRoutine(uint16 k) { // 0x86F106 health_drop_bias_flag = v5; LABEL_7: if ((uint8)health_drop_bias_flag) { - uint8 *v6 = RomPtr_B4(v2); + const uint8 *v6 = RomPtr_B4(v2); LOBYTE(R18_) = v6[1] + *v6; LOBYTE(R22_) = 3; } else { - uint8 *v7 = RomPtr_B4(v2); + const uint8 *v7 = RomPtr_B4(v2); LOBYTE(R18_) = v7[3]; LOBYTE(R22_) = 8; if (samus_health != samus_max_health || samus_reserve_health != samus_max_reserve_health) { @@ -5780,7 +5784,7 @@ LABEL_7: v9 = R22_ & 1; LOBYTE(R22_) = (uint8)R22_ >> 1; if (v9) { - uint8 *v10 = RomPtr_B4(v2); + const uint8 *v10 = RomPtr_B4(v2); uint16 RegWord = Mult8x8(R20_, *v10); int divved = SnesDivide(RegWord, R18_); uint16 v12 = R24_; @@ -5796,7 +5800,7 @@ LABEL_26: v9 = R22_ & 1; LOBYTE(R22_) = (uint8)R22_ >> 1; if (v9) { - uint8 *v14 = RomPtr_B4(v2); + const uint8 *v14 = RomPtr_B4(v2); if ((uint16)(R24_ + *v14) >= R26_) return byte_86F25E[i]; R24_ += *v14; @@ -5815,16 +5819,16 @@ void RespawnEnemy(uint16 v0) { // 0x86F264 int16 v7; cur_enemy_index = v0; - uint8 *v1 = RomPtr_A1(room_enemy_population_ptr + (v0 >> 2)); + const uint8 *v1 = RomPtr_A1(room_enemy_population_ptr + (v0 >> 2)); EnemyData *v2 = gEnemyData(v0); - v2->enemy_ptr = *(uint16 *)v1; - v2->x_pos = *((uint16 *)v1 + 1); - v2->y_pos = *((uint16 *)v1 + 2); - v2->current_instruction = *((uint16 *)v1 + 3); - v2->properties = *((uint16 *)v1 + 4); - v2->extra_properties = *((uint16 *)v1 + 5); - v2->parameter_1 = *((uint16 *)v1 + 6); - v2->parameter_2 = *((uint16 *)v1 + 7); + v2->enemy_ptr = GET_WORD(v1); + v2->x_pos = GET_WORD(v1 + 2); + v2->y_pos = GET_WORD(v1 + 4); + v2->current_instruction = GET_WORD(v1 + 6); + v2->properties = GET_WORD(v1 + 8); + v2->extra_properties = GET_WORD(v1 + 10); + v2->parameter_1 = GET_WORD(v1 + 12); + v2->parameter_2 = GET_WORD(v1 + 14); v3 = gEnemySpawnData(v0); EnemyData *v4 = gEnemyData(v0); v4->palette_index = v3->palette_index; @@ -5847,18 +5851,16 @@ void RespawnEnemy(uint16 v0) { // 0x86F264 v2->x_width = EnemyDef_A2->x_radius; v2->y_height = EnemyDef_A2->y_radius; v2->health = EnemyDef_A2->health; - v2->layer = RomPtr_A0(enemy_ptr)[57]; + v2->layer = EnemyDef_A2->layer; v7 = *(uint16 *)&EnemyDef_A2->bank; *(uint16 *)&v2->bank = v7; enemy_ai_pointer.bank = v7; CallEnemyAi(Load24(&enemy_ai_pointer)); } -#define kEnemyDef_F3D3 (*(EnemyDef_B2*)RomPtr(0xa0f3d3)) void EprojInit_Sparks(uint16 j) { // 0x86F391 static const uint16 word_86F3D4[14] = { 0xffff, 0xb800, 0xffff, 0xc000, 0xffff, 0xe000, 0xffff, 0xff00, 0, 0x100, 0, 0x2000, 0, 0x4000 }; -#define g_word_86F3D4 ((uint16*)RomPtr(0x86f3d4)) // bug:: oob read int v2 = j >> 1; enemy_projectile_instr_list_ptr[v2] = addr_kEnemyDef_F353; EnemyData *v3 = gEnemyData(cur_enemy_index); @@ -5912,4 +5914,4 @@ void EprojPreInstr_Sparks(uint16 k) { // 0x86F3F0 R24_ = enemy_projectile_gfx_idx[v1]; CreateSpriteAtPos(); } -} +} \ No newline at end of file diff --git a/src/sm_87.c b/src/sm_87.c index cf54e92..2bafee1 100644 --- a/src/sm_87.c +++ b/src/sm_87.c @@ -3,6 +3,10 @@ #include "funcs.h" #include "variables.h" + + + + void EnableAnimtiles(void) { // 0x878000 animtiles_enable_flag |= 0x8000; } @@ -28,7 +32,7 @@ void SpawnAnimtiles(uint16 j) { // 0x878027 int v2 = v1 >> 1; animtiles_ids[v2] = v0; animtiles_timers[v2] = 0; - uint16 *v3 = (uint16 *)RomPtr_87(v0); + const uint16 *v3 = (const uint16 *)RomPtr_87(v0); animtiles_instr_list_ptrs[v2] = *v3; animtiles_src_ptr[v2] = 0; animtiles_sizes[v2] = v3[1]; @@ -84,7 +88,7 @@ void ProcessAnimtilesObject(void) { // 0x878085 if (animtiles_instr_timers[v1]-- == 1) { uint16 v3 = animtiles_instr_list_ptrs[v1], v5; while (1) { - uint16 *v4 = (uint16 *)RomPtr_87(v3); + const uint16 *v4 = (const uint16 *)RomPtr_87(v3); v5 = *v4; if ((*v4 & 0x8000u) == 0) break; @@ -136,31 +140,31 @@ uint16 AnimtilesInstr_SetTimer(uint16 k, uint16 j) { // 0x8780E3 } uint16 AnimtilesInstr_QueueMusic(uint16 k, uint16 j) { // 0x8780F0 - uint8 *v2 = RomPtr_87(j); + const uint8 *v2 = RomPtr_87(j); QueueMusic_Delayed8(*v2); return j + 1; } uint16 AnimtilesInstr_QueueSfx1(uint16 k, uint16 j) { // 0x8780FC - uint8 *v2 = RomPtr_87(j); + const uint8 *v2 = RomPtr_87(j); QueueSfx1_Max6(*v2); return j + 1; } uint16 AnimtilesInstr_QueueSfx2(uint16 k, uint16 j) { // 0x878108 - uint8 *v2 = RomPtr_87(j); + const uint8 *v2 = RomPtr_87(j); QueueSfx2_Max6(*v2); return j + 1; } uint16 AnimtilesInstr_QueueSfx3(uint16 k, uint16 j) { // 0x878114 - uint8 *v2 = RomPtr_87(j); + const uint8 *v2 = RomPtr_87(j); QueueSfx3_Max6(*v2); return j + 1; } uint16 AnimtilesInstr_GotoIfBossBitSet(uint16 k, uint16 j) { // 0x878120 - uint8 *v2 = RomPtr_87(j); + const uint8 *v2 = RomPtr_87(j); uint16 v3 = j + 1; if (CheckBossBitForCurArea((uint8) * (uint16 *)v2) & 1) return AnimtilesInstr_Goto(k, v3); @@ -169,13 +173,13 @@ uint16 AnimtilesInstr_GotoIfBossBitSet(uint16 k, uint16 j) { // 0x878120 } uint16 AnimtilesInstr_SetBossBit(uint16 k, uint16 j) { // 0x878133 - uint8 *v2 = RomPtr_87(j); + const uint8 *v2 = RomPtr_87(j); SetBossBitForCurArea(*v2); return j + 1; } uint16 AnimtilesInstr_GotoIfEventHappened(uint16 k, uint16 j) { // 0x87813F - uint16 *v2 = (uint16 *)RomPtr_87(j); + const uint16 *v2 = (const uint16 *)RomPtr_87(j); uint16 v3 = j + 2; if (CheckEventHappened(*v2) & 1) return AnimtilesInstr_Goto(k, v3); @@ -184,7 +188,7 @@ uint16 AnimtilesInstr_GotoIfEventHappened(uint16 k, uint16 j) { // 0x87813F } uint16 AnimtilesInstr_SetEventHappened(uint16 k, uint16 j) { // 0x878150 - uint16 *v2 = (uint16 *)RomPtr_87(j); + const uint16 *v2 = (const uint16 *)RomPtr_87(j); SetEventHappened(*v2); return j + 2; } @@ -206,7 +210,7 @@ uint16 AnimtilesInstr_WaitUntilAreaBossDead_DoubleRet(uint16 k, uint16 j) { // } uint16 AnimtilesInstr_GotoIfBossBitSetInArea(uint16 k, uint16 j) { // 0x878303 - uint8 *v2 = RomPtr_87(j); + const uint8 *v2 = RomPtr_87(j); uint16 v3 = j + 2; if ((*v2 & boss_bits_for_area[v2[1]]) != 0) return AnimtilesInstr_Goto(k, v3); @@ -215,13 +219,13 @@ uint16 AnimtilesInstr_GotoIfBossBitSetInArea(uint16 k, uint16 j) { // 0x878303 } uint16 AnimtilesInstr_SpawnTourianStatueEyeGlow(uint16 k, uint16 j) { // 0x878320 - uint16 *v2 = (uint16 *)RomPtr_87(j); + const uint16 *v2 = (const uint16 *)RomPtr_87(j); SpawnEnemyProjectileWithRoomGfx(addr_kEproj_TourianStatueEyeGlow, *v2); return j + 2; } uint16 AnimtilesInstr_SpawnTourianStatueSoul(uint16 k, uint16 j) { // 0x87832F - uint16 *v2 = (uint16 *)RomPtr_87(j); + const uint16 *v2 = (const uint16 *)RomPtr_87(j); SpawnEnemyProjectileWithRoomGfx(addr_kEproj_TourianStatueSoul, *v2); return j + 2; } @@ -252,7 +256,7 @@ uint16 AnimtilesInstr_Clear3PaletteColors(uint16 k, uint16 j) { // 0x87835B } uint16 AnimtilesInstr_SpawnPalfxObj(uint16 k, uint16 j) { // 0x878372 - uint16 *v2 = (uint16 *)RomPtr_87(j); + const uint16 *v2 = (const uint16 *)RomPtr_87(j); SpawnPalfxObject(*v2); return j + 2; } @@ -266,4 +270,4 @@ uint16 AnimtilesInstr_Write8PaletteColors(uint16 k, uint16 j) { // 0x87837F v2 += 2; } return j + 2; -} +} \ No newline at end of file diff --git a/src/sm_88.c b/src/sm_88.c index d9533cd..a8a4bd2 100644 --- a/src/sm_88.c +++ b/src/sm_88.c @@ -4,6 +4,22 @@ #include "sm_rtl.h" #include "funcs.h" + +#define g_byte_88A206 ((uint8*)RomFixedPtr(0x88a206)) +#define g_byte_88A286 ((uint8*)RomFixedPtr(0x88a286)) +#define kPowerBombExplosionColors ((uint8*)RomFixedPtr(0x888d85)) +#define g_byte_889079 ((uint8*)RomFixedPtr(0x889079)) +#define g_word_88A938 ((uint16*)RomFixedPtr(0x88a938)) +#define kHdmaScrollEntrys ((HdmaScrollEntry*)RomFixedPtr(0x88aec1)) +#define g_word_88B589 ((uint16*)RomFixedPtr(0x88b589)) +#define g_word_88B60A ((uint16*)RomFixedPtr(0x88b60a)) +#define g_word_88D992 ((uint16*)RomFixedPtr(0x88d992)) +#define g_byte_88E3C9 ((uint8*)RomFixedPtr(0x88e3c9)) +#define g_word_88E833 ((uint16*)RomFixedPtr(0x88e833)) +#define g_byte_88EA8B ((uint8*)RomFixedPtr(0x88ea8b)) + + + static Func_Y_Y *const kLayerBlendFuncTable[27] = { nullsub_9, nullsub_9, @@ -235,7 +251,7 @@ void HandleLayerBlendingXrayCantShowBlocks(void) { // 0x8881A4 reg_TSW = 4; next_gameplay_CGWSEL = 34; next_gameplay_CGADSUB = next_gameplay_CGADSUB & 0x80 | 0x61; - if (room_ptr == (uint16)addr_kRoom_cefb) + if (room_ptr == addr_kRoom_cefb) reg_TM = 17; } @@ -257,7 +273,7 @@ static Func_V *const kLayerBlendPowerBombFuncs[4] = { // 0x8881FE LayerBlendPowerBombFunc_6, }; void HandleLayerBlendingPowerBomb(uint16 j) { - if (room_ptr == (uint16)addr_kRoom_a66a) + if (room_ptr == addr_kRoom_a66a) j = 6; kLayerBlendPowerBombFuncs[j >> 1](); } @@ -323,12 +339,12 @@ void sub_8882AC(void) { // 0x8882AC void InitializeSpecialEffectsForNewRoom(void) { // 0x8882C1 earthquake_sfx_index = 0; earthquake_sfx_timer = 0; - if (room_ptr == (uint16)addr_kRoom_9804 - || room_ptr == (uint16)addr_kRoom_96ba - || room_ptr == (uint16)addr_kRoom_b32e - || room_ptr == (uint16)addr_kRoom_b457 - || room_ptr == (uint16)addr_kRoom_dd58 - || room_ptr == (uint16)addr_kRoom_dede) { + if (room_ptr == addr_kRoom_9804 + || room_ptr == addr_kRoom_96ba + || room_ptr == addr_kRoom_b32e + || room_ptr == addr_kRoom_b457 + || room_ptr == addr_kRoom_dd58 + || room_ptr == addr_kRoom_dede) { earthquake_sfx_timer = -1; } debug_disable_minimap = 0; @@ -400,8 +416,6 @@ void InitializeSpecialEffectsForNewRoom(void) { // 0x8882C1 } uint16 SpawnHdmaObjectInner(uint16 k, uint16 *p) { // 0x888477 - uint16 v4; - int v2 = k >> 1; hdma_object_pre_instructions[v2] = FUNC16(nullsub_293); hdma_object_pre_instruction_bank[v2] = 136; @@ -412,9 +426,7 @@ uint16 SpawnHdmaObjectInner(uint16 k, uint16 *p) { // 0x888477 hdma_object_B[v2] = 0; hdma_object_C[v2] = 0; hdma_object_D[v2] = 0; - LOBYTE(v4) = HIBYTE(R18_); - HIBYTE(v4) = R18_; - hdma_object_channels_bitmask[v2] = v4; + hdma_object_channels_bitmask[v2] = swap16(R18_); hdma_object_bank_slot[v2] = R24_ | R20_; WriteRegWord((SnesRegs)(R20_ + 17152), *p); return k; @@ -588,7 +600,7 @@ void HdmaobjInstructionHandler(uint16 k) { // 0x88851C uint16 v4 = hdma_object_instruction_list_pointers[v2]; uint16 v6; while (1) { - uint16 *v5 = (uint16 *)RomPtrWithBank(v8, v4); + const uint16 *v5 = (const uint16 *)RomPtrWithBank(v8, v4); v6 = *v5; if ((*v5 & 0x8000u) == 0) break; @@ -610,8 +622,8 @@ uint16 HdmaobjInstr_Delete(uint16 k, uint16 j) { // 0x888569 } uint16 HdmaobjInstr_SetPreInstr(uint8 db, uint16 k, uint16 j) { // 0x888570 - uint8 *v2 = RomPtrWithBank(db, j); - hdma_object_pre_instructions[k >> 1] = *(uint16 *)v2; + const uint8 *v2 = RomPtrWithBank(db, j); + hdma_object_pre_instructions[k >> 1] = GET_WORD(v2); *((uint8 *)hdma_object_pre_instruction_bank + k) = v2[2]; return j + 3; } @@ -649,7 +661,7 @@ void CallHdmaobjInstrFunc(uint32 ea, uint16 k) { } uint16 HdmaobjInstr_CallFarFunc(uint8 db, uint16 k, uint16 j) { // 0x8885B4 - uint8 *v2 = RomPtrWithBank(db, j); + const uint8 *v2 = RomPtrWithBank(db, j); copy24((LongPtr *)&R18_, (LongPtr *)v2); CallHdmaobjInstrFunc(Load24(&R18_), k); return j + 3; @@ -686,13 +698,13 @@ uint16 HdmaobjInstr_SetTimer(uint8 db, uint16 k, uint16 j) { // 0x888616 } uint16 HdmaobjInstr_SetHdmaControl(uint8 db, uint16 k, uint16 j) { // 0x888622 - uint8 *v2 = RomPtrWithBank(db, j); + const uint8 *v2 = RomPtrWithBank(db, j); WriteReg((SnesRegs)(LOBYTE(hdma_object_bank_slot[k >> 1]) + DMAP0), *v2); return j + 1; } uint16 HdmaobjInstr_SetHdmaTarget(uint8 db, uint16 k, uint16 j) { // 0x888637 - uint8 *v2 = RomPtrWithBank(db, j); + const uint8 *v2 = RomPtrWithBank(db, j); WriteReg((SnesRegs)(LOBYTE(hdma_object_bank_slot[k >> 1]) + BBAD0), *v2); return j + 1; } @@ -703,13 +715,13 @@ uint16 HdmaobjInstr_SetHdmaTablePtr(uint8 db, uint16 k, uint16 j) { // 0x88864C } uint16 HdmaobjInstr_SetHdmaTableBank(uint8 db, uint16 k, uint16 j) { // 0x888655 - uint8 *v2 = RomPtrWithBank(db, j); + const uint8 *v2 = RomPtrWithBank(db, j); WriteReg((SnesRegs)(LOBYTE(hdma_object_bank_slot[k >> 1]) + A1B0), *v2); return j + 1; } uint16 HdmaobjInstr_SetIndirectHdmaDataBank(uint8 db, uint16 k, uint16 j) { // 0x88866A - uint8 *v2 = RomPtrWithBank(db, j); + const uint8 *v2 = RomPtrWithBank(db, j); WriteReg((SnesRegs)(LOBYTE(hdma_object_bank_slot[k >> 1]) + DAS00), *v2); return j + 1; } @@ -909,7 +921,7 @@ void HdmaobjPreInstr_XrayFunc3_DeactivateBeam(uint16 k) { // 0x888934 int16 v1; VramWriteEntry *v4; - mov24((LongPtr *)&demo_enable, 0x980001); + mov24(&hdma_ptr_1, 0x980001); *(uint16 *)((char *)&demo_num_input_frames + 1) = 0; demo_input_prev = 0; demo_input_prev_new = 0; @@ -979,7 +991,7 @@ void HdmaobjPreInstr_XrayFunc5_DeactivateBeam(uint16 k) { // 0x888A08 xray_angle = 0; demo_input = 0; demo_input_new = 0; - mov24((LongPtr *)&demo_enable, 0x980001); + mov24(&hdma_ptr_1, 0x980001); *(uint16 *)((char *)&demo_num_input_frames + 1) = 0; demo_input_prev = 0; demo_input_prev_new = 0; @@ -995,7 +1007,7 @@ void HdmaobjPreInstr_XrayFunc5_DeactivateBeam(uint16 k) { // 0x888A08 R0_.bank = 126; R0_.addr = ADDR16_OF_RAM(*hdma_table_1); for (int i = 510; i >= 0; i -= 2) - IndirWriteWord(&R0_, i, 0xFF); + IndirWriteWord(R0_, i, 0xFF); if (samus_auto_cancel_hud_item_index) { hud_item_index = 0; samus_auto_cancel_hud_item_index = 0; @@ -1082,9 +1094,9 @@ void HdmaobjPreInstr_PowerBombExplode_Stage5_Afterglow(uint16 k) { // 0x888B98 } } -void CalculatePowerBombHdma_LeftOfScreen(uint16 k, uint16 j) { // 0x888BEA +void CalculatePowerBombHdma_LeftOfScreen(uint16 k, const uint8 *j) { // 0x888BEA do { - uint8 w = *RomPtr_88(j); + uint8 w = *j; uint8 c = power_bomb_explosion_x_pos_plus_0x100; if (__CFADD__uint8(w, c)) { power_bomb_explosion_right_hdma[k] = w + c; @@ -1098,9 +1110,9 @@ void CalculatePowerBombHdma_LeftOfScreen(uint16 k, uint16 j) { // 0x888BEA } while (k != 192); } -void CalculatePowerBombHdma_OnScreen(uint16 k, uint16 j) { // 0x888C12 +void CalculatePowerBombHdma_OnScreen(uint16 k, const uint8 *j) { // 0x888C12 do { - uint8 w = *RomPtr_88(j); + uint8 w = *j; if (!w) break; uint8 c = power_bomb_explosion_x_pos_plus_0x100; @@ -1113,9 +1125,9 @@ void CalculatePowerBombHdma_OnScreen(uint16 k, uint16 j) { // 0x888C12 } while (k != 192); } -void CalculatePowerBombHdma_RightOfScreen(uint16 k, uint16 j) { // 0x888C3A +void CalculatePowerBombHdma_RightOfScreen(uint16 k, const uint8 *j) { // 0x888C3A do { - uint8 w = *RomPtr_88(j); + uint8 w = *j; if ((uint8)power_bomb_explosion_x_pos_plus_0x100 < w) { power_bomb_explosion_left_hdma[k] = power_bomb_explosion_x_pos_plus_0x100 - w; power_bomb_explosion_right_hdma[k] = -1; @@ -1144,7 +1156,6 @@ void CalculatePowerBombHdmaObjectTablePtrs(uint16 k) { // 0x888C62 hdma_object_table_pointers[(k >> 1) + 1] = R22_ + addr_kIndirectHdmaTable_PowerBombExplodeRight; } -#define g_byte_88A206 ((uint8*)RomPtr(0x88a206)) static uint16 k_out; @@ -1243,48 +1254,41 @@ uint16 CalculatePowerBombHdmaScaled_RightOfScreen(uint16 k, uint16 j, uint8 mult k_out = LOBYTE(k); return v9 << 8 | v8; } -#define g_byte_88A286 ((uint8*)RomPtr(0x88a286)) -#define kPowerBombExplosionColors ((uint8*)RomPtr(0x888d85)) void HdmaobjPreInstr_PowerBombExplode_ExplosionYellow(uint16 k) { // 0x888DE9 - int16 v2; + uint16 v2; if ((power_bomb_explosion_status & 0x8000u) == 0) return; - - uint16 v8 = k; CalculatePowerBombHdmaObjectTablePtrs(k); - LOBYTE(R18_) = Mult8x8(HIBYTE(power_bomb_explosion_radius), g_byte_88A286[0]) >> 8; - int kk = LOBYTE(R18_); + int kk = Mult8x8(GET_HIBYTE(power_bomb_explosion_radius), g_byte_88A286[0]) >> 8; - if (HIBYTE(power_bomb_explosion_x_pos_plus_0x100)) { - if (HIBYTE(power_bomb_explosion_x_pos_plus_0x100) == 1) - v2 = CalculatePowerBombHdmaScaled_OnScreen(kk, 96, HIBYTE(power_bomb_explosion_radius)); + if (GET_HIBYTE(power_bomb_explosion_x_pos_plus_0x100)) { + if (GET_HIBYTE(power_bomb_explosion_x_pos_plus_0x100) == 1) + v2 = CalculatePowerBombHdmaScaled_OnScreen(kk, 96, GET_HIBYTE(power_bomb_explosion_radius)); else - v2 = CalculatePowerBombHdmaScaled_RightOfScreen(kk, 96, HIBYTE(power_bomb_explosion_radius)); + v2 = CalculatePowerBombHdmaScaled_RightOfScreen(kk, 96, GET_HIBYTE(power_bomb_explosion_radius)); } else { - v2 = CalculatePowerBombHdmaScaled_LeftOfScreen(kk, 96, HIBYTE(power_bomb_explosion_radius)); + v2 = CalculatePowerBombHdmaScaled_LeftOfScreen(kk, 96, GET_HIBYTE(power_bomb_explosion_radius)); } int i = k_out; do { - power_bomb_explosion_left_hdma[(uint8)i] = v2; - power_bomb_explosion_right_hdma[(uint8)i] = HIBYTE(v2); - LOBYTE(i) = i - 1; - } while ((i & 0x80) == 0); - for (uint8 v3 = R18_ + 1; v3 != 0xc0; v3++) { + power_bomb_explosion_left_hdma[i] = v2; + power_bomb_explosion_right_hdma[i] = GET_HIBYTE(v2); + } while ((--i & 0x80) == 0); + for (int v3 = kk + 1; v3 != 0xc0; v3++) { power_bomb_explosion_left_hdma[v3] = 255; power_bomb_explosion_right_hdma[v3] = 0; } - LOBYTE(R18_) = HIBYTE(power_bomb_explosion_radius) >> 3; - int pos = 3 * LOBYTE(R18_); - reg_COLDATA[0] = kPowerBombExplosionColors[pos + 0] | 0x20; - reg_COLDATA[1] = kPowerBombExplosionColors[pos + 1] | 0x40; - reg_COLDATA[2] = kPowerBombExplosionColors[pos + 2] | 0x80; + int t = 3 * (GET_HIBYTE(power_bomb_explosion_radius) >> 3); + reg_COLDATA[0] = kPowerBombExplosionColors[t + 0] | 0x20; + reg_COLDATA[1] = kPowerBombExplosionColors[t + 1] | 0x40; + reg_COLDATA[2] = kPowerBombExplosionColors[t + 2] | 0x80; power_bomb_explosion_radius += power_bomb_pre_explosion_radius_speed; if (power_bomb_explosion_radius < 0x8600u) { power_bomb_pre_explosion_radius_speed += kPowerBombExplosionRadiusAccel; } else { - int v7 = v8 >> 1; + int v7 = k >> 1; hdma_object_instruction_timers[v7] = 1; hdma_object_instruction_list_pointers[v7] += 2; hdma_object_timers[v7] = 0; @@ -1296,20 +1300,19 @@ void HdmaobjPreInstr_PowerBombExplode_ExplosionWhite(uint16 k) { // 0x888EB2 return; CalculatePowerBombHdmaObjectTablePtrs(k); - uint16 v1 = pre_scaled_power_bomb_explosion_shape_def_ptr; - if (HIBYTE(power_bomb_explosion_x_pos_plus_0x100)) { - if (HIBYTE(power_bomb_explosion_x_pos_plus_0x100) == 1) + const uint8 *v1 = RomPtr_88(pre_scaled_power_bomb_explosion_shape_def_ptr); + if (GET_HIBYTE(power_bomb_explosion_x_pos_plus_0x100)) { + if (GET_HIBYTE(power_bomb_explosion_x_pos_plus_0x100) == 1) CalculatePowerBombHdma_OnScreen(0, v1); else CalculatePowerBombHdma_RightOfScreen(0, v1); } else { CalculatePowerBombHdma_LeftOfScreen(0, v1); } - LOBYTE(R18_) = HIBYTE(power_bomb_explosion_radius) >> 3; - uint8 v2 = 3 * (HIBYTE(power_bomb_explosion_radius) >> 3); - reg_COLDATA[0] = kPowerBombExplosionColors[v2] | 0x20; - reg_COLDATA[1] = kPowerBombExplosionColors[v2 + 1] | 0x40; - reg_COLDATA[2] = kPowerBombExplosionColors[v2 + 2] | 0x80; + int t = 3 * (GET_HIBYTE(power_bomb_explosion_radius) >> 3); + reg_COLDATA[0] = kPowerBombExplosionColors[t] | 0x20; + reg_COLDATA[1] = kPowerBombExplosionColors[t + 1] | 0x40; + reg_COLDATA[2] = kPowerBombExplosionColors[t + 2] | 0x80; pre_scaled_power_bomb_explosion_shape_def_ptr += 192; if (pre_scaled_power_bomb_explosion_shape_def_ptr == addr_byte_889F06) { int v3 = k >> 1; @@ -1343,16 +1346,13 @@ void CalculatePowerBombHdmaTablePointers(uint16 v0) { // 0x888F56 } } -#define g_byte_889079 ((uint8*)RomPtr(0x889079)) void HdmaobjPreInstr_PowerBombExplode_PreExplosionWhite(uint16 k) { // 0x8890DF if ((power_bomb_explosion_status & 0x8000u) == 0) return; CalculatePowerBombHdmaTablePointers(k); uint16 v1 = 96, v2; - LOBYTE(R18_) = Mult8x8(HIBYTE(power_bomb_pre_explosion_flash_radius), g_byte_88A286[0]) >> 8; - - int kk = LOBYTE(R18_); + int kk = Mult8x8(HIBYTE(power_bomb_pre_explosion_flash_radius), g_byte_88A286[0]) >> 8; if (HIBYTE(power_bomb_explosion_x_pos_plus_0x100)) { if (HIBYTE(power_bomb_explosion_x_pos_plus_0x100) == 1) v2 = CalculatePowerBombHdmaScaled_OnScreen(kk, v1, HIBYTE(power_bomb_pre_explosion_flash_radius)); @@ -1367,15 +1367,14 @@ void HdmaobjPreInstr_PowerBombExplode_PreExplosionWhite(uint16 k) { // 0x8890DF power_bomb_explosion_right_hdma[i] = HIBYTE(v2); i--; } while ((i & 0x80) == 0); - for(uint8 v3 = R18_ + 1; v3 != 0xc0; v3++) { + for(uint8 v3 = kk + 1; v3 != 0xc0; v3++) { power_bomb_explosion_left_hdma[v3] = 255; power_bomb_explosion_right_hdma[v3] = 0; } - LOBYTE(R18_) = (HIBYTE(power_bomb_pre_explosion_flash_radius) >> 3) & 0xF; - int pos = 3 * LOBYTE(R18_); - reg_COLDATA[0] = g_byte_889079[pos + 0] | 0x20; - reg_COLDATA[1] = g_byte_889079[pos + 1] | 0x40; - reg_COLDATA[2] = g_byte_889079[pos + 2] | 0x80; + int t = (HIBYTE(power_bomb_pre_explosion_flash_radius) >> 3) & 0xF; + reg_COLDATA[0] = g_byte_889079[t * 3 + 0] | 0x20; + reg_COLDATA[1] = g_byte_889079[t * 3 + 1] | 0x40; + reg_COLDATA[2] = g_byte_889079[t * 3 + 2] | 0x80; power_bomb_pre_explosion_flash_radius += power_bomb_pre_explosion_radius_speed; if (power_bomb_pre_explosion_flash_radius < 0x9200) { power_bomb_pre_explosion_radius_speed -= kPowerBombPreExplosionRadiusAccel; @@ -1390,19 +1389,19 @@ void HdmaobjPreInstr_PowerBombExplode_PreExplosionYellow(uint16 k) { // 0x8891A if ((power_bomb_explosion_status & 0x8000u) == 0) return; CalculatePowerBombHdmaTablePointers(k); - uint16 v1 = pre_scaled_power_bomb_explosion_shape_def_ptr; - if (HIBYTE(power_bomb_explosion_x_pos_plus_0x100)) { - if (HIBYTE(power_bomb_explosion_x_pos_plus_0x100) == 1) + const uint8 *v1 = RomPtr_88(pre_scaled_power_bomb_explosion_shape_def_ptr); + if (GET_HIBYTE(power_bomb_explosion_x_pos_plus_0x100)) { + if (GET_HIBYTE(power_bomb_explosion_x_pos_plus_0x100) == 1) CalculatePowerBombHdma_OnScreen(0, v1); else CalculatePowerBombHdma_RightOfScreen(0, v1); } else { CalculatePowerBombHdma_LeftOfScreen(0, v1); } - LOBYTE(R18_) = (HIBYTE(power_bomb_pre_explosion_flash_radius) >> 3) & 0xF; - reg_COLDATA[0] = g_byte_889079[(uint8)(3 * R18_)] | 0x20; - reg_COLDATA[1] = g_byte_889079[(uint8)(3 * R18_) + 1] | 0x40; - reg_COLDATA[2] = g_byte_889079[(uint8)(3 * R18_) + 2] | 0x80; + int t = (GET_HIBYTE(power_bomb_pre_explosion_flash_radius) >> 3) & 0xF; + reg_COLDATA[0] = g_byte_889079[3 * t] | 0x20; + reg_COLDATA[1] = g_byte_889079[3 * t + 1] | 0x40; + reg_COLDATA[2] = g_byte_889079[3 * t + 2] | 0x80; pre_scaled_power_bomb_explosion_shape_def_ptr += 192; if (pre_scaled_power_bomb_explosion_shape_def_ptr == 0xA206) { hdma_object_instruction_timers[k >> 1] = 1; @@ -1498,19 +1497,19 @@ void CalculateCrystalFlashHdmaObjectTablePtrs(uint16 k) { // 0x88A42F uint16 CalculateCrystalFlashHdmaDataTablesScaled_LeftOfScreen(uint16 k, uint16 j) { // 0x88A493 uint8 right, left; do { - LOBYTE(R20_) = Mult8x8(HIBYTE(power_bomb_explosion_radius), g_byte_88A206[(uint8)j + 32]) >> 8; - uint8 w = Mult8x8(HIBYTE(power_bomb_explosion_radius), g_byte_88A206[(uint8)j]) >> 8; + uint8 r20 = Mult8x8(GET_HIBYTE(power_bomb_explosion_radius), g_byte_88A206[(uint8)j + 32]) >> 8; + uint8 w = Mult8x8(GET_HIBYTE(power_bomb_explosion_radius), g_byte_88A206[(uint8)j]) >> 8; uint8 c = power_bomb_explosion_x_pos_plus_0x100; left = (w + c >= 256) ? 0 : 255; right = (w + c >= 256) ? w + c : 0; while (1) { power_bomb_explosion_left_hdma[(uint8)k] = left; power_bomb_explosion_right_hdma[(uint8)k] = right; - if ((uint8)k == (uint8)R20_) + if ((uint8)k == r20) break; - LOBYTE(k) = k - 1; + k--; } - LOBYTE(j) = j + 1; + j--; } while ((j & 0x80) == 0); k_out = LOBYTE(k); return right << 8 | left; @@ -1519,19 +1518,19 @@ uint16 CalculateCrystalFlashHdmaDataTablesScaled_LeftOfScreen(uint16 k, uint16 j uint16 CalculateCrystalFlashHdmaDataTablesScaled_OnScreen(uint16 k, uint16 j) { // 0x88A4D1 uint8 right, left; do { - LOBYTE(R20_) = Mult8x8(HIBYTE(power_bomb_explosion_radius), g_byte_88A206[(uint8)j + 32]) >> 8; - uint8 w = Mult8x8(HIBYTE(power_bomb_explosion_radius), g_byte_88A206[(uint8)j]) >> 8; + uint8 r20 = Mult8x8(GET_HIBYTE(power_bomb_explosion_radius), g_byte_88A206[(uint8)j + 32]) >> 8; + uint8 w = Mult8x8(GET_HIBYTE(power_bomb_explosion_radius), g_byte_88A206[(uint8)j]) >> 8; uint8 c = power_bomb_explosion_x_pos_plus_0x100; right = c + w < 256 ? c + w : 255; left = c - w >= 0 ? c - w : 0; while (1) { power_bomb_explosion_left_hdma[(uint8)k] = left; power_bomb_explosion_right_hdma[(uint8)k] = right; - if ((uint8)k == (uint8)R20_) + if ((uint8)k == r20) break; - LOBYTE(k) = k - 1; + k--; } - LOBYTE(j) = j + 1; + j--; } while ((j & 0x80) == 0); k_out = LOBYTE(k); return right << 8 | left; @@ -1540,19 +1539,19 @@ uint16 CalculateCrystalFlashHdmaDataTablesScaled_OnScreen(uint16 k, uint16 j) { uint16 CalculateCrystalFlashHdmaDataTablesScaled_RightOfScreen(uint16 k, uint16 j) { // 0x88A513 uint8 left, right; do { - LOBYTE(R20_) = Mult8x8(HIBYTE(power_bomb_explosion_radius), g_byte_88A206[(uint8)j + 32]) >> 8; - uint8 w = Mult8x8(HIBYTE(power_bomb_explosion_radius), g_byte_88A206[(uint8)j]) >> 8; + uint8 r20 = Mult8x8(GET_HIBYTE(power_bomb_explosion_radius), g_byte_88A206[(uint8)j + 32]) >> 8; + uint8 w = Mult8x8(GET_HIBYTE(power_bomb_explosion_radius), g_byte_88A206[(uint8)j]) >> 8; uint8 c = power_bomb_explosion_x_pos_plus_0x100; right = (c < w) ? 255 : 0; left = (c < w) ? c - w : 255; while (1) { power_bomb_explosion_left_hdma[(uint8)k] = left; power_bomb_explosion_right_hdma[(uint8)k] = right; - if ((uint8)k == (uint8)R20_) + if ((uint8)k == r20) break; - LOBYTE(k) = k - 1; + k--; } - LOBYTE(j) = j + 1; + j--; } while ((j & 0x80) == 0); k_out = LOBYTE(k); return right << 8 | left; @@ -1563,11 +1562,10 @@ void HdmaobjPreInstr_CrystalFlash_Stage1_Explosion(uint16 k) { // 0x88A552 return; CalculateCrystalFlashHdmaObjectTablePtrs(k); - int kk = LOBYTE(R18_); uint16 v2; - LOBYTE(R18_) = Mult8x8(HIBYTE(power_bomb_explosion_radius), g_byte_88A286[0]) >> 8; - if (HIBYTE(power_bomb_explosion_x_pos_plus_0x100)) { - if (HIBYTE(power_bomb_explosion_x_pos_plus_0x100) == 1) + int kk = Mult8x8(GET_HIBYTE(power_bomb_explosion_radius), g_byte_88A286[0]) >> 8; + if (GET_HIBYTE(power_bomb_explosion_x_pos_plus_0x100)) { + if (GET_HIBYTE(power_bomb_explosion_x_pos_plus_0x100) == 1) v2 = CalculateCrystalFlashHdmaDataTablesScaled_OnScreen(kk, 96); else v2 = CalculateCrystalFlashHdmaDataTablesScaled_RightOfScreen(kk, 96); @@ -1577,15 +1575,14 @@ void HdmaobjPreInstr_CrystalFlash_Stage1_Explosion(uint16 k) { // 0x88A552 int i = k_out; do { power_bomb_explosion_left_hdma[(uint8)i] = v2; - power_bomb_explosion_right_hdma[(uint8)i] = HIBYTE(v2); + power_bomb_explosion_right_hdma[(uint8)i] = GET_HIBYTE(v2); i--; } while ((i & 0x80u) == 0); - for (uint8 v3 = R18_ + 1; v3 != 0xc0; v3++) { + for (uint8 v3 = kk + 1; v3 != 0xc0; v3++) { power_bomb_explosion_left_hdma[v3] = 255; power_bomb_explosion_right_hdma[v3] = 0; } - LOBYTE(R18_) = HIBYTE(power_bomb_explosion_radius) >> 3; - int pos = LOBYTE(R18_) * 3; + int pos = (HIBYTE(power_bomb_explosion_radius) >> 3) * 3; reg_COLDATA[0] = kPowerBombExplosionColors[pos + 0] | 0x20; reg_COLDATA[1] = kPowerBombExplosionColors[pos + 1] | 0x40; reg_COLDATA[2] = kPowerBombExplosionColors[pos + 2] | 0x80; @@ -1616,8 +1613,8 @@ void HdmaobjPreInstr_FxType22_BG3Yscroll(uint16 k) { // 0x88A643 DamageSamusInTopRow(); R0_.addr = addr_word_88A8E8; R3_.addr = addr_word_88A8E8__plus__2; - R6_ = addr_word_88A8E8__plus__4; - *(uint16 *)((char *)&R8_ + 1) = addr_word_88A8E8__plus__6; + R6_.addr = addr_word_88A8E8__plus__4; + R9_.addr = addr_word_88A8E8__plus__6; R24_ = 78; Unreachable(); k = SetupSomeHdmaTablesBG3(); @@ -1628,7 +1625,6 @@ uint16 HdmaobjInstr_SetFlagB(uint16 k, uint16 j) { // 0x88A66C hdma_object_B[k >> 1] = 1; return j; } -#define g_word_88A938 ((uint16*)RomPtr(0x88a938)) static const int16 g_word_88C46E[16] = { // 0x88A673 0, 1, 1, 0, 0, -1, -1, 0, 0, 1, 1, 0, 0, -1, -1, 0, @@ -1757,7 +1753,7 @@ uint16 SetupSomeHdmaTablesBG3(void) { // 0x88A81C R18_ = layer1_y_pos + 32; uint16 v2 = 0; while ((int16)(v1 - *(uint16 *)&RomPtr_88(R0_.addr)[v2]) < 0 - || (int16)(v1 - *(uint16 *)&RomPtr_88(*(uint16 *)((char *)&R8_ + 1))[v2]) >= 0) { + || (int16)(v1 - *(uint16 *)&RomPtr_88(R9_.addr)[v2]) >= 0) { v2 += 6; if ((int16)(v2 - R24_) >= 0) return v0; @@ -1769,7 +1765,7 @@ uint16 SetupSomeHdmaTablesBG3(void) { // 0x88A81C v3 = R18_ & 0x1F; R22_ = v3; *(uint16 *)&mother_brain_indirect_hdma[3] = *(uint16 *)&RomPtr_88(R3_.addr)[v2] - v3; - *(uint16 *)&mother_brain_indirect_hdma[4] = R22_ + *(uint16 *)&RomPtr_88(R6_)[v2] - g_word_7E0598; + *(uint16 *)&mother_brain_indirect_hdma[4] = R22_ + *(uint16 *)&RomPtr_88(R6_.addr)[v2] - g_word_7E0598; while (1) { R20_ = mother_brain_indirect_hdma[v0]; R18_ += R20_; @@ -1778,13 +1774,13 @@ uint16 SetupSomeHdmaTablesBG3(void) { // 0x88A81C if (!sign16(g_word_7E0598 - 224)) break; while ((int16)(R18_ - *(uint16 *)&RomPtr_88(R0_.addr)[v2]) < 0 - || (int16)(R18_ - *(uint16 *)&RomPtr_88(*(uint16 *)((char *)&R8_ + 1))[v2]) >= 0) { + || (int16)(R18_ - *(uint16 *)&RomPtr_88(R9_.addr)[v2]) >= 0) { v2 += 6; if ((int16)(v2 - R24_) >= 0) return v0; } *(uint16 *)&mother_brain_indirect_hdma[v0] = *(uint16 *)&RomPtr_88(R3_.addr)[v2]; - *(uint16 *)&mother_brain_indirect_hdma[v0 + 1] = *(uint16 *)&RomPtr_88(R6_)[v2] - g_word_7E0598; + *(uint16 *)&mother_brain_indirect_hdma[v0 + 1] = *(uint16 *)&RomPtr_88(R6_.addr)[v2] - g_word_7E0598; } return v0; } @@ -1803,7 +1799,6 @@ void HdmaobjPreInstr_SkyLandBG2Xscroll2(uint16 k) { // 0x88ADBA if (!time_is_frozen_flag) HdmaobjPreInstr_SkyLandBG2XscrollInner(k); } -#define kHdmaScrollEntrys ((HdmaScrollEntry*)RomPtr(0x88aec1)) void HdmaobjPreInstr_SkyLandBG2XscrollInner(uint16 k) { // 0x88ADC2 uint16 i; @@ -1812,7 +1807,7 @@ void HdmaobjPreInstr_SkyLandBG2XscrollInner(uint16 k) { // 0x88ADC2 do { uint16 scroll_subspeed = kHdmaScrollEntrys[v1].scroll_subspeed; uint8 *v3 = &g_ram[kHdmaScrollEntrys[v1].hdma_data_table_entry]; - bool v4 = __CFADD__uint16(*(uint16 *)v3, scroll_subspeed); + bool v4 = __CFADD__uint16(GET_WORD(v3), scroll_subspeed); *(uint16 *)v3 += scroll_subspeed; *((uint16 *)v3 + 1) += v4 + kHdmaScrollEntrys[v1++].scroll_speed; } while (sign16(v1 * 8 - 184)); @@ -1889,10 +1884,10 @@ void RoomMainAsm_ScrollingSky(void) { // 0x88AFA3 int v2 = 8 * (uint8)tt; int y1 = (uint8)(tt >> 8); int y2 = (uint8)((tt >> 8) + 1); - VoidP v3 = *(uint16 *)IndirPtr(&R0_, 2 * y1) + v2; + VoidP v3 = IndirReadWord(R0_, 2 * y1) + v2; v1[0].src.addr = v3; v1[1].src.addr = v3 + 64; - VoidP v5 = *(uint16 *)IndirPtr(&R0_, 2 * y2) + v2; + VoidP v5 = IndirReadWord(R0_, 2 * y2) + v2; v1[2].src.addr = v5; v1[3].src.addr = v5 + 64; v1[0].src.bank = 0x8a; @@ -2120,7 +2115,6 @@ void HdmaobjPreInstr_LavaAcidBG3YScroll(uint16 k) { // 0x88B3B0 int16 v2; int16 v3; int16 v4; - uint16 v7; int16 v8; fx_layer_blending_config_c = fx_layer_blending_config_b; @@ -2147,9 +2141,7 @@ LABEL_8: QueueSfx2_Max6(kLavaSoundEffects[random_number & 7]); } } - LOBYTE(v7) = HIBYTE(random_number); - HIBYTE(v7) = random_number; - random_number = v7; + random_number = swap16(random_number); if ((lava_acid_y_pos & 0x8000u) == 0) { v8 = lava_acid_y_pos - layer1_y_pos + 256; if (v8 < 0) { @@ -2166,7 +2158,7 @@ LABEL_17: goto LABEL_17; } if ((uint16)v3 < 0x100u) { - v4 = (uint8)~(uint8)v3; + v4 = (uint8)~v3; goto LABEL_8; } } @@ -2203,7 +2195,6 @@ void Handle_LavaAcidBG2YScroll_Func1(uint16 v0) { // 0x88B51D v1 -= 2; } while ((v1 & 0x80) == 0); } -#define g_word_88B589 ((uint16*)RomPtr(0x88b589)) void Handle_LavaAcidBG2YScroll_Func2(uint16 v0) { // 0x88B53B WriteReg((SnesRegs)(*((uint8 *)hdma_object_bank_slot + v0) + 17153), 0xF); int v1 = v0 >> 1; @@ -2221,7 +2212,6 @@ void Handle_LavaAcidBG2YScroll_Func2(uint16 v0) { // 0x88B53B --R18_; } while ((R18_ & 0x8000u) == 0); } -#define g_word_88B60A ((uint16*)RomPtr(0x88b60a)) void Handle_LavaAcidBG2YScroll_Func3(uint16 v0) { // 0x88B5A9 WriteReg((SnesRegs)(*((uint8 *)hdma_object_bank_slot + v0) + BBAD0), 0x10); int v1 = v0 >> 1; @@ -2447,7 +2437,6 @@ void FxTypeFunc_A_Rain(void) { // 0x88D950 SpawnAnimtiles(addr_kAnimtiles_Rain); } -#define g_word_88D992 ((uint16*)RomPtr(0x88d992)) uint16 HdmaobjInstr_1938_RandomNumber(uint16 k, uint16 j) { // 0x88D981 hdma_object_D[k >> 1] = g_word_88D992[(uint16)((random_number >> 1) & 6) >> 1]; @@ -2838,12 +2827,11 @@ uint8 VariaSuitPickup_1(void) { // 0x88E0D7 hdma_table_1[i >> 1] = suit_pickup_light_beam_pos; if (sign16((uint8)suit_pickup_light_beam_pos - 97)) { ++substate; - suit_pickup_light_beam_pos = -31636; + suit_pickup_light_beam_pos = 0x846C; } return 1; } -#define g_byte_88E3C9 ((uint8*)RomPtr(0x88e3c9)) uint8 VariaSuitPickup_2_LightBeamWidens(void) { // 0x88E113 char v1; @@ -2954,7 +2942,7 @@ uint8 GravitySuitPickup_6(void) { // 0x88E25F reg_COLDATA[2] = 0x80; reg_COLDATA[1] = 64; reg_COLDATA[0] = 32; - mov24((LongPtr *)&demo_enable, 0x980001); + mov24(&hdma_ptr_1, 0x980001); *(uint16 *)((char *)&demo_num_input_frames + 1) = 0; demo_input_prev = 0; demo_input_prev_new = 0; @@ -3119,10 +3107,10 @@ void HdmaobjPreInstr_E567(uint16 v0) { // 0x88E567 if (enemy_data[1].parameter_1) { if ((enemy_data[1].parameter_1 & 1) != 0) { R28_ = 4; - g_word_7E001E = 128; + R30_ = 128; } else { R28_ = 8; - g_word_7E001E = 64; + R30_ = 64; } int v2 = v0 >> 1; if (hdma_object_B[v2]-- == 1) { @@ -3161,7 +3149,7 @@ void HdmaobjPreInstr_E567(uint16 v0) { // 0x88E567 *(uint16 *)((char *)&g_word_7E9100 + v11) = R18_ + reg_BG2HOFS; } v4 = v8 + 2; - } while ((int16)(v4 - g_word_7E001E) < 0); + } while ((int16)(v4 - R30_) < 0); if ((enemy_data[1].parameter_1 & 1) != 0) { for (int i = 126; i >= 0; i -= 2) *(uint16 *)((char *)&g_word_7E9180 + i) = reg_BG2HOFS + reg_BG2HOFS - *(uint16 *)((char *)&g_word_7E9100 + i); @@ -3211,7 +3199,6 @@ void HdmaobjPreInstr_E7BC(uint16 k) { // 0x88E7BC } } -#define g_word_88E833 ((uint16*)RomPtr(0x88e833)) void sub_88E7ED(void) { // 0x88E7ED uint16 v0 = g_word_88E833[hdma_object_A[0] >> 1]; @@ -3305,7 +3292,6 @@ void HdmaobjPreInstr_E9E6(uint16 k) { // 0x88E9E6 sub_88E987(k); } -#define g_byte_88EA8B ((uint8*)RomPtr(0x88ea8b)) void HdmaobjPreInstr_EA3C(uint16 k) { // 0x88EA3C fx_layer_blending_config_c = 16; @@ -3434,7 +3420,7 @@ void HdmaobjPreInstr_ECB6(uint16 k) { // 0x88ECB6 if (g_word_7E0D9C) { R28_ = 4; - g_word_7E001E = 128; + R30_ = 128; R18_ = 2 * loop_counter_transfer_enemies_to_vram; int v3 = k >> 1; hdma_object_A[v3] = (2 * loop_counter_transfer_enemies_to_vram + hdma_object_A[v3]) & 0x1FF; @@ -3469,7 +3455,7 @@ void HdmaobjPreInstr_ECB6(uint16 k) { // 0x88ECB6 hdma_table_1[v10 >> 1] = R18_ + reg_BG3HOFS; } v4 = v8 + 2; - } while ((int16)(v4 - g_word_7E001E) < 0); + } while ((int16)(v4 - R30_) < 0); for (int i = 126; i >= 0; i -= 2) hdma_table_1[(i >> 1) + 64] = reg_BG3HOFS + reg_BG3HOFS - hdma_table_1[i >> 1]; } else { @@ -3477,4 +3463,4 @@ void HdmaobjPreInstr_ECB6(uint16 k) { // 0x88ECB6 hdma_object_instruction_list_pointers[v2] += 2; hdma_object_instruction_timers[v2] = 1; } -} +} \ No newline at end of file diff --git a/src/sm_89.c b/src/sm_89.c index 295cb77..9a846d7 100644 --- a/src/sm_89.c +++ b/src/sm_89.c @@ -4,7 +4,15 @@ #include "variables.h" #include "funcs.h" -#define g_word_89AA02 ((uint16*)RomPtr(0x89aa02)) + +#define g_word_89AA02 ((uint16*)RomFixedPtr(0x89aa02)) +#define kFxTypeTilemapPtrs ((uint16*)RomFixedPtr(0x83abf0)) +#define kAreaPalFxListPointers ((uint16*)RomFixedPtr(0x83ac46)) +#define kAreaAnimtilesListPtrs ((uint16*)RomFixedPtr(0x83ac56)) +#define g_word_89AD5F ((uint16*)RomFixedPtr(0x89ad5f)) + + + void LoadFxEntry(uint16 v0) { // 0x89AB02 FxDef *FxDef; @@ -30,7 +38,6 @@ void LoadFxEntry(uint16 v0) { // 0x89AB02 void nullsub_106(void) {} -#define kFxTypeTilemapPtrs ((uint16*)RomPtr(0x83abf0)) static Func_V *const kFxTypeFuncPtrs[23] = { // 0x89AB82 nullsub_106, FxTypeFunc_2_Lava, @@ -56,8 +63,6 @@ static Func_V *const kFxTypeFuncPtrs[23] = { // 0x89AB82 FxTypeFunc_CeresElevator, FxTypeFunc_2C_Haze, }; -#define kAreaPalFxListPointers ((uint16*)RomPtr(0x83ac46)) -#define kAreaAnimtilesListPtrs ((uint16*)RomPtr(0x83ac56)) void LoadFXHeader(void) { int i; FxDef *v6; @@ -105,7 +110,7 @@ void LoadFXHeader(void) { v6 = get_FxDef(current_fx_entry_ptr); uint16 v7 = v6->type; if (v6->type) { - *(uint16 *)((char *)&R18_ + 1) = -30720; + R19_ = -30720; kFxTypeFuncPtrs[v7 >> 1](); } v8 = get_FxDef(current_fx_entry_ptr); @@ -118,7 +123,7 @@ void LoadFXHeader(void) { current_fx_palette_fx_bitset >>= 1; if (!v10) break; - uint8 *v11 = RomPtr_83(current_region_animated_palette_fx); + const uint8 *v11 = RomPtr_83(current_region_animated_palette_fx); SpawnPalfxObject(*(uint16 *)&v11[j]); j += 2; } @@ -134,7 +139,7 @@ void LoadFXHeader(void) { current_fx_palette_fx_bitset >>= 1; if (!v10) break; - uint8 *v14 = RomPtr_83(current_region_animated_palette_fx); + const uint8 *v14 = RomPtr_83(current_region_animated_palette_fx); SpawnAnimtiles(*(uint16 *)&v14[k]); k += 2; } @@ -142,7 +147,6 @@ void LoadFXHeader(void) { } } } -#define g_word_89AD5F ((uint16*)RomPtr(0x89ad5f)) void RoomCode_CeresElevatorShaft(void) { // 0x89ACC3 int16 v1; @@ -179,4 +183,4 @@ void RoomCode_CeresElevatorShaft(void) { // 0x89ACC3 *(uint16 *)room_main_asm_variables = v1; } } -} +} \ No newline at end of file diff --git a/src/sm_8b.c b/src/sm_8b.c index f7d7496..049f581 100644 --- a/src/sm_8b.c +++ b/src/sm_8b.c @@ -4,32 +4,37 @@ #include "funcs.h" #include "variables.h" -#define kPalettes_Intro ((uint16*)RomPtr(0x8ce3e9)) -#define kPalettes_Intro2 ((uint16*)RomPtr(0x8ce5e9)) -#define kPalettes_Intro4 ((uint16*)RomPtr(0x8ce7e9)) -#define kPalettes_Intro5 ((uint16*)RomPtr(0x8ce9e9)) -#define kPalettes_Intro6 ((uint16*)RomPtr(0x8cebe9)) -#define kPalettes_Intro3 ((uint16*)RomPtr(0x8cede9)) -#define g_word_8CD81B ((uint16*)RomPtr(0x8cd81b)) -#define g_word_8BA72B ((uint16*)RomPtr(0x8ba72b)) -#define kLevelData_MotherBrainRoomFromCutscene ((uint16*)RomPtr(0x8cbec3)) -#define kLevelData_RoomWithBabyMetroidHatching ((uint16*)RomPtr(0x8cc083)) -#define g_word_8CDC9B ((uint16*)RomPtr(0x8cdc9b)) -#define g_word_8CDEDB ((uint16*)RomPtr(0x8cdedb)) -#define g_word_8CEFE9 ((uint16*)RomPtr(0x8cefe9)) -#define g_off_8BE70D ((uint16*)RomPtr(0x8be70d)) -#define g_word_8BE717 ((uint16*)RomPtr(0x8be717)) -#define g_word_8BE721 ((uint16*)RomPtr(0x8be721)) -#define g_word_8BE737 ((uint16*)RomPtr(0x8be737)) -#define g_word_8BE741 ((uint16*)RomPtr(0x8be741)) -#define g_word_8BE9CF ((uint16*)RomPtr(0x8be9cf)) -#define kCinematicFunction_Intro_Func142_Tab0 ((uint16*)RomPtr(0x8be45a)) -#define kCinematicFunction_Intro_Func144_Tab0 ((uint16*)RomPtr(0x8be5e7)) -#define g_word_8CDF5B ((uint16*)RomPtr(0x8cdf5b)) -#define g_word_8BE9A7 ((uint16*)RomPtr(0x8be9a7)) -#define g_word_8BF6B8 ((uint16*)RomPtr(0x8bf6b8)) -#define g_word_8BF6D8 ((uint16*)RomPtr(0x8bf6d8)) -#define g_word_8CE1E9 ((uint16*)RomPtr(0x8ce1e9)) + +#define kPalettes_Intro ((uint16*)RomFixedPtr(0x8ce3e9)) +#define kPalettes_Intro2 ((uint16*)RomFixedPtr(0x8ce5e9)) +#define kPalettes_Intro4 ((uint16*)RomFixedPtr(0x8ce7e9)) +#define kPalettes_Intro5 ((uint16*)RomFixedPtr(0x8ce9e9)) +#define kPalettes_Intro6 ((uint16*)RomFixedPtr(0x8cebe9)) +#define kPalettes_Intro3 ((uint16*)RomFixedPtr(0x8cede9)) +#define g_word_8CD81B ((uint16*)RomFixedPtr(0x8cd81b)) +#define g_word_8BA72B ((uint16*)RomFixedPtr(0x8ba72b)) +#define kLevelData_MotherBrainRoomFromCutscene ((uint16*)RomFixedPtr(0x8cbec3)) +#define kLevelData_RoomWithBabyMetroidHatching ((uint16*)RomFixedPtr(0x8cc083)) +#define g_word_8CDC9B ((uint16*)RomFixedPtr(0x8cdc9b)) +#define g_word_8CDEDB ((uint16*)RomFixedPtr(0x8cdedb)) +#define g_word_8CEFE9 ((uint16*)RomFixedPtr(0x8cefe9)) +#define g_off_8BE70D ((uint16*)RomFixedPtr(0x8be70d)) +#define g_word_8BE717 ((uint16*)RomFixedPtr(0x8be717)) +#define g_word_8BE721 ((uint16*)RomFixedPtr(0x8be721)) +#define g_word_8BE737 ((uint16*)RomFixedPtr(0x8be737)) +#define g_word_8BE741 ((uint16*)RomFixedPtr(0x8be741)) +#define g_word_8BE9CF ((uint16*)RomFixedPtr(0x8be9cf)) +#define kCinematicFunction_Intro_Func142_Tab0 ((uint16*)RomFixedPtr(0x8be45a)) +#define kCinematicFunction_Intro_Func144_Tab0 ((uint16*)RomFixedPtr(0x8be5e7)) +#define g_word_8CDF5B ((uint16*)RomFixedPtr(0x8cdf5b)) +#define g_word_8BE9A7 ((uint16*)RomFixedPtr(0x8be9a7)) +#define g_word_8BF6B8 ((uint16*)RomFixedPtr(0x8bf6b8)) +#define g_word_8BF6D8 ((uint16*)RomFixedPtr(0x8bf6d8)) +#define g_word_8CE1E9 ((uint16*)RomFixedPtr(0x8ce1e9)) +#define g_off_8CBC5D ((uint16*)RomFixedPtr(0x8cbc5d)) + + + void SetupPpuForTitleSequence(void) { // 0x8B8000 WriteReg(INIDISP, 0x80); @@ -423,21 +428,14 @@ void HandleMode7TransformationNoRotation(void) { // 0x8B8518 } void HandleMode7TransformationMatrix(void) { // 0x8B8532 - uint16 v0; - uint16 v1; - - R38 = kSinCosTable8bit_Sext[((uint16)(2 * (uint8)(cinematic_var5 + 64)) >> 1) + 64]; + R38 = kSinCosTable8bit_Sext[((uint8)(cinematic_var5 + 64)) + 64]; R40 = cinematic_var6; Smult16x16Shr16(); - HIBYTE(v0) = R42; - LOBYTE(v0) = HIBYTE(R44); - reg_M7A = v0; - reg_M7D = v0; - R38 = kSinCosTable8bit_Sext[((uint16)(2 * (uint8)cinematic_var5) >> 1) + 64]; + reg_M7D = reg_M7A = PAIR16(R42, HIBYTE(R44)); + R38 = kSinCosTable8bit_Sext[((uint8)cinematic_var5) + 64]; R40 = cinematic_var6; Smult16x16Shr16(); - HIBYTE(v1) = R42; - LOBYTE(v1) = HIBYTE(R44); + uint16 v1 = PAIR16(R42, HIBYTE(R44)); reg_M7B = v1; reg_M7C = -v1; reg_BG1HOFS = cinematic_var8; @@ -561,7 +559,7 @@ void ProcessCinematicBgObject_DrawChar(uint16 k, uint16 j) { // 0x8B884D cinematicbg_var1 = cinematicbg_var1 == 0; SpawnTextGlowObject(j); - uint8 *v2 = RomPtr_8C(cinematicbg_instr_ptr[k >> 1]); + const uint8 *v2 = RomPtr_8C(cinematicbg_instr_ptr[k >> 1]); if (*((int16 *)v2 + 3) < 0) { cinematicbg_arr7[15] = 8; v3 = 8 * (v2[3] + 2); @@ -570,7 +568,7 @@ void ProcessCinematicBgObject_DrawChar(uint16 k, uint16 j) { // 0x8B884D v3 = 8 * v2[9]; } cinematicbg_arr8[15] = v3 - 8; - if (*((uint16 *)v2 + 2) != 0xD67D && cinematicbg_var1) + if (GET_WORD(v2 + 4) != 0xD67D && cinematicbg_var1) QueueSfx3_Max6(0xDu); ProcessCinematicBgObject_DrawToTextTilemap(0x1E, j); } @@ -579,7 +577,7 @@ void ProcessCinematicBgObject_DrawToTextTilemap(uint16 k, uint16 j) { // 0x8B88 uint16 jorg = j; uint16 TilemapOffsetForTile = CinematicGetTilemapOffsetForTile(); - uint8 *v3 = RomPtr_8C(j); + const uint8 *v3 = RomPtr_8C(j); R18_ = v3[2]; R24_ = R18_; R20_ = v3[3]; @@ -605,7 +603,7 @@ void ProcessCinematicBgObject_DrawToBgTilemap(uint16 k, uint16 j) { // 0x8B88FD uint16 jorg = j; uint16 TilemapOffsetForTile = CinematicGetTilemapOffsetForTile(); - uint8 *v3 = RomPtr_8C(j); + const uint8 *v3 = RomPtr_8C(j); R18_ = v3[2]; R24_ = R18_; R20_ = v3[3]; @@ -632,7 +630,7 @@ uint16 CinematicGetTilemapOffsetForTile(void) { // 0x8B8943 void ProcessCinematicBgObject_Unk1(uint16 k, uint16 j) { // 0x8B896B Mult0x80Add(); - uint8 *v2 = RomPtr_8C(j); + const uint8 *v2 = RomPtr_8C(j); R18_ = v2[2]; R20_ = v2[3]; uint16 v3 = j + 4; @@ -654,7 +652,7 @@ void ProcessCinematicBgObject_Unk1(uint16 k, uint16 j) { // 0x8B896B void ProcessCinematicBgObject_Unk2(uint16 k, uint16 j) { // 0x8B89CF Mult0x80Add(); - uint8 *v2 = RomPtr_8C(j); + const uint8 *v2 = RomPtr_8C(j); R18_ = v2[2]; R20_ = v2[3]; uint16 v3 = j + 4; @@ -680,118 +678,77 @@ void Mult0x80Add(void) { // 0x8B8A2C } void Samus_CalcPos_Mode7(void) { // 0x8B8A52 - uint16 v0; - int16 v1; - uint16 v2; - int16 v3; - R34 = samus_x_pos - reg_M7X; R36 = reg_M7Y - samus_y_pos; R38 = samus_x_pos - reg_M7X; R40 = reg_M7A; Smult16x16Shr16(); - HIBYTE(v0) = R42; - LOBYTE(v0) = HIBYTE(R44); - R26_ = v0; + R26_ = PAIR16(R42, HIBYTE(R44)); R38 = reg_M7B; R40 = R36; Smult16x16Shr16(); - HIBYTE(v1) = R42; - LOBYTE(v1) = HIBYTE(R44); - R26_ += v1; + R26_ += PAIR16(R42, HIBYTE(R44)); samus_x_pos = R26_ + reg_M7X; R38 = reg_M7C; R40 = R34; Smult16x16Shr16(); - HIBYTE(v2) = R42; - LOBYTE(v2) = HIBYTE(R44); - R26_ = v2; + R26_ = PAIR16(R42, HIBYTE(R44)); R38 = reg_M7A; R40 = R36; Smult16x16Shr16(); - HIBYTE(v3) = R42; - LOBYTE(v3) = HIBYTE(R44); - R26_ += v3; + R26_ += PAIR16(R42, HIBYTE(R44)); samus_y_pos = reg_M7Y - R26_; } void CalcExplosion_Mode7(uint16 k) { // 0x8B8AD9 - uint16 v2; - int16 v3; - uint16 v4; - int16 v5; - int v1 = k >> 1; R34 = projectile_x_pos[v1] - reg_M7X; R36 = reg_M7Y - projectile_y_pos[v1]; R38 = R34; R40 = reg_M7A; Smult16x16Shr16(); - HIBYTE(v2) = R42; - LOBYTE(v2) = HIBYTE(R44); - R26_ = v2; + R26_ = PAIR16(R42, HIBYTE(R44)); R38 = reg_M7B; R40 = R36; Smult16x16Shr16(); - HIBYTE(v3) = R42; - LOBYTE(v3) = HIBYTE(R44); - R26_ += v3; + R26_ += PAIR16(R42, HIBYTE(R44)); R20_ = R26_ + reg_M7X - layer1_x_pos; R38 = reg_M7C; R40 = R34; Smult16x16Shr16(); - HIBYTE(v4) = R42; - LOBYTE(v4) = HIBYTE(R44); - R26_ = v4; + R26_ = PAIR16(R42, HIBYTE(R44)); R38 = reg_M7A; R40 = R36; Smult16x16Shr16(); - HIBYTE(v5) = R42; - LOBYTE(v5) = HIBYTE(R44); - R26_ += v5; + R26_ += PAIR16(R42, HIBYTE(R44)); R18_ = reg_M7Y - R26_ - layer1_y_pos; } void CalcCeresSteamPos_Mode7(void) { // 0x8B8B66 - uint16 v0; - int16 v1; - uint16 v2; - int16 v3; - R34 = R18_ - reg_M7X; R36 = reg_M7Y - R20_; R38 = R18_ - reg_M7X; R40 = reg_M7A; Smult16x16Shr16(); - HIBYTE(v0) = R42; - LOBYTE(v0) = HIBYTE(R44); - R26_ = v0; + R26_ = PAIR16(R42, HIBYTE(R44)); R38 = reg_M7B; R40 = R36; Smult16x16Shr16(); - HIBYTE(v1) = R42; - LOBYTE(v1) = HIBYTE(R44); - R26_ += v1; + R26_ += PAIR16(R42, HIBYTE(R44)); R18_ = R26_ + reg_M7X; R38 = reg_M7C; R40 = R34; Smult16x16Shr16(); - HIBYTE(v2) = R42; - LOBYTE(v2) = HIBYTE(R44); - R26_ = v2; + R26_ = PAIR16(R42, HIBYTE(R44)); R38 = reg_M7A; R40 = R36; Smult16x16Shr16(); - HIBYTE(v3) = R42; - LOBYTE(v3) = HIBYTE(R44); - R26_ += v3; + R26_ += PAIR16(R42, HIBYTE(R44)); R20_ = reg_M7Y - R26_; } void CopyPalettesToFadingPalettes(void) { // 0x8B8BE9 - int16 v0; - - v0 = 256; + int v0 = 256; uint16 v1 = 0; do { tilemap_stuff[(v1 >> 1) + 256] = palette_buffer[v1 >> 1]; @@ -801,35 +758,22 @@ void CopyPalettesToFadingPalettes(void) { // 0x8B8BE9 } void DecomposePaletteDataForFading(void) { // 0x8B8C09 - int16 v1; - uint16 v3; - char v5; // t2 - char v7; // tt - uint16 v0 = 0; - v1 = 256; + int v1 = 256; do { int v2 = v0 >> 1; R18_ = tilemap_stuff[v2 + 256]; - LOBYTE(v3) = 0; - HIBYTE(v3) = R18_ & 0x1F; - tilemap_stuff[v2 + 512] = v3; - tilemap_stuff[v2 + 1280] = 8 * HIBYTE(v3); - uint16 v4 = 8 * (R18_ & 0x3E0); - tilemap_stuff[v2 + 768] = v4; - v5 = v4; - LOBYTE(v4) = HIBYTE(v4); - HIBYTE(v4) = v5; - tilemap_stuff[v2 + 1536] = 8 * v4; - uint16 v6 = (uint16)(R18_ & 0x7C00) >> 2; - tilemap_stuff[v2 + 1024] = v6; - v7 = v6; - LOBYTE(v6) = HIBYTE(v6); - HIBYTE(v6) = v7; - tilemap_stuff[v2 + 1792] = 8 * v6; + int v3 = (R18_ & 0x1F); + tilemap_stuff[v2 + 512] = v3 << 8; + tilemap_stuff[v2 + 1280] = v3 << 3; + int v4 = (R18_ & 0x3E0) >> 5; + tilemap_stuff[v2 + 768] = v4 << 8; + tilemap_stuff[v2 + 1536] = v4 << 3; + int v6 = (R18_ & 0x7C00) >> 10; + tilemap_stuff[v2 + 1024] = v6 << 8; + tilemap_stuff[v2 + 1792] = v6 << 3; v0 += 2; - --v1; - } while (v1); + } while (--v1); } void ClearYColorsFromIndexX(uint16 k, uint16 j) { // 0x8B8C5E @@ -840,8 +784,7 @@ void ClearYColorsFromIndexX(uint16 k, uint16 j) { // 0x8B8C5E tilemap_stuff[v2 + 768] = 0; tilemap_stuff[v2 + 1024] = 0; k += 2; - --j; - } while (j); + } while (--j); } void FadeOutYColorsFromIndexX(uint16 k, uint16 j) { // 0x8B8C83 @@ -851,8 +794,7 @@ void FadeOutYColorsFromIndexX(uint16 k, uint16 j) { // 0x8B8C83 tilemap_stuff[v2 + 768] -= tilemap_stuff[v2 + 1536]; tilemap_stuff[v2 + 1024] -= tilemap_stuff[v2 + 1792]; k += 2; - --j; - } while (j); + } while (--j); } void FadeInYColorsFromIndexX(uint16 k, uint16 j) { // 0x8B8CB2 @@ -862,40 +804,34 @@ void FadeInYColorsFromIndexX(uint16 k, uint16 j) { // 0x8B8CB2 tilemap_stuff[v2 + 768] = (tilemap_stuff[v2 + 1536] + tilemap_stuff[v2 + 768]) & 0x1FFF; tilemap_stuff[v2 + 1024] = (tilemap_stuff[v2 + 1792] + tilemap_stuff[v2 + 1024]) & 0x1FFF; k += 2; - --j; - } while (j); + } while (--j); } void ComposeFadingPalettes(void) { // 0x8B8CEA - int16 v1; - uint16 v0 = 0; - v1 = 256; + int v1 = 256; do { int v2 = v0 >> 1; - R18_ = HIBYTE(tilemap_stuff[v2 + 512]) & 0x1F; - R18_ |= (tilemap_stuff[v2 + 768] >> 3) & 0x3E0; - uint16 v3 = R18_ | (4 * tilemap_stuff[v2 + 1024]) & 0x7C00; + int R18 = HIBYTE(tilemap_stuff[v2 + 512]) & 0x1F; + R18 |= (tilemap_stuff[v2 + 768] >> 3) & 0x3E0; + uint16 v3 = R18 | (tilemap_stuff[v2 + 1024] << 2) & 0x7C00; tilemap_stuff[v2] = v3; palette_buffer[v2] = v3; v0 += 2; - --v1; - } while (v1); + } while (--v1); } void CinematicFunction_Intro_Func20(uint16 j) { // 0x8B8D23 uint16 *tt = (uint16 *)RomPtr_8B(j); uint16 v2 = tt[0]; - R18_ = tt[1]; + int R18 = tt[1]; uint16 *dst = ram4000.intro_japanese_text_tiles; do { - R22_ = tt[2]; - memcpy(dst + (v2 >> 1), (uint16 *)RomPtr_7F(R22_ + 0xa000), 16); - R22_ = tt[3]; - memcpy(dst + ((v2 + 768) >> 1), (uint16 *)RomPtr_7F(R22_ + 0xa000), 16); + memcpy(dst + (v2 >> 1), (uint16 *)&g_ram[tt[2] + 0x1a000], 16); + memcpy(dst + ((v2 + 768) >> 1), (uint16 *)&g_ram[tt[3] + 0x1a000], 16); v2 += 16; tt += 2; - } while (--R18_); + } while (--R18); } void TransferJapaneseTextTilesToVram(void) { // 0x8B8DE6 @@ -1142,11 +1078,7 @@ CoroutineRet InitializeIoDisplayLogo_Async(void) { // 0x8B9146 reg_COLDATA[2] = 0x80; WriteReg(SETINI, 0); reg_SETINI = 0; - mov24(&decompress_src, 0x9580D8); - { - static const LongPtr unk_8B92A1 = LONGPTR(0x7f5000); - DecompressToMem_IpArg(&unk_8B92A1); - } + DecompressToMem(0x9580D8, g_ram + 0x15000); WriteReg(VMADDL, 0); WriteReg(VMADDH, 0x60); WriteReg(VMAIN, 0x80); @@ -1304,16 +1236,16 @@ void CallCinematicSpriteObjectSetup(uint32 ea, uint16 j) { } uint8 SpawnCimenaticSpriteObjectInner(uint16 k, uint16 j) { // 0x8B93AC - uint8 *v2 = RomPtr_8B(k); + const uint8 *v2 = RomPtr_8B(k); int v3 = j >> 1; - cinematicspr_preinstr_func[v3] = *((uint16 *)v2 + 1); - cinematicspr_instr_ptr[v3] = *((uint16 *)v2 + 2); + cinematicspr_preinstr_func[v3] = GET_WORD(v2 + 2); + cinematicspr_instr_ptr[v3] = GET_WORD(v2 + 4); cinematicspr_instr_timer[v3] = 1; cinematicspr_whattodraw[v3] = 0; cinematicspr_goto_timer[v3] = 0; cinematicspr_arr6[v3] = 0; cinematicspr_arr7[v3] = 0; - CallCinematicSpriteObjectSetup(*(uint16 *)v2 | 0x8B0000, j); + CallCinematicSpriteObjectSetup(GET_WORD(v2) | 0x8B0000, j); return 0; } @@ -1460,7 +1392,7 @@ void ProcessCinematicSpriteInstructionList(uint16 k) { // 0x8B9409 if (cinematicspr_instr_timer[v2]-- == 1) { uint16 v4 = cinematicspr_instr_ptr[v2], v6; while (1) { - uint16 *v5 = (uint16 *)RomPtr_8B(v4); + const uint16 *v5 = (const uint16 *)RomPtr_8B(v4); v6 = *v5; if ((*v5 & 0x8000u) == 0) break; @@ -1629,7 +1561,7 @@ void ProcessMode7ObjectInstructions(uint16 k) { // 0x8B9537 if (mode7_obj_instr_timer[v2]-- == 1) { uint16 v4 = mode7_obj_instr_ptr[v2], v6; while (1) { - uint16 *v5 = (uint16 *)RomPtr_8B(v4); + const uint16 *v5 = (const uint16 *)RomPtr_8B(v4); v6 = *v5; if ((*v5 & 0x8000u) == 0) break; @@ -1639,8 +1571,8 @@ void ProcessMode7ObjectInstructions(uint16 k) { // 0x8B9537 return; } mode7_obj_instr_timer[v1 >> 1] = v6; - uint8 *v7 = RomPtr_8B(v4); - QueueMode7Transfers(0x8b, *((uint16 *)v7 + 1)); + const uint8 *v7 = RomPtr_8B(v4); + QueueMode7Transfers(0x8b, GET_WORD(v7 + 2)); mode7_obj_instr_ptr[v1 >> 1] = v4 + 4; } } @@ -1721,14 +1653,14 @@ uint8 SpawnCinematicBgObject(uint16 j, uint16 a) { // 0x8B95F0 if ((v3 & 0x8000u) != 0) return 1; } - uint8 *v5 = RomPtr_8B(j); + const uint8 *v5 = RomPtr_8B(j); int v6 = v3 >> 1; - cinematicbg_preinstr[v6] = *((uint16 *)v5 + 1); - cinematicbg_instr_ptr[v6] = *((uint16 *)v5 + 2); + cinematicbg_preinstr[v6] = GET_WORD(v5 + 2); + cinematicbg_instr_ptr[v6] = GET_WORD(v5 + 4); cinematicbg_instr_timer[v6] = 1; cinematicbg_arr1[v6] = 0; cinematicbg_arr6[v6] = 0; - CallCinematicBgObjectSetup(*(uint16 *)v5 | 0x8B0000, v3); + CallCinematicBgObjectSetup(GET_WORD(v5) | 0x8B0000, v3); return 0; } @@ -1789,7 +1721,7 @@ void ProcessCinematicBgObjectsInstrs(uint16 k) { // 0x8B9659 if (cinematicbg_instr_timer[v2]-- == 1) { uint16 v4 = cinematicbg_instr_ptr[v2], v6; while (1) { - uint16 *v5 = (uint16 *)RomPtr_8C(v4); + const uint16 *v5 = (const uint16 *)RomPtr_8C(v4); v6 = *v5; if ((*v5 & 0x8000u) == 0) break; @@ -1800,9 +1732,9 @@ void ProcessCinematicBgObjectsInstrs(uint16 k) { // 0x8B9659 } int v7 = v1 >> 1; cinematicbg_instr_timer[v7] = v6; - uint8 *v8 = RomPtr_8C(v4); - R18_ = *((uint16 *)v8 + 1); - cinematicbg_arr1[v7] = *((uint16 *)v8 + 2); + const uint8 *v8 = RomPtr_8C(v4); + R18_ = GET_WORD(v8 + 2); + cinematicbg_arr1[v7] = GET_WORD(v8 + 4); ProcessCinematicBgObject(v1); cinematicbg_instr_ptr[v7] = v4 + 6; } @@ -1897,7 +1829,7 @@ void ProcessTextGlowObject(void) { // 0x8B9849 R20_ = 2 * LOBYTE(enemy_projectile_pre_instr[v1 + 10]); R22_ = R20_ + Mult8x8(*((uint8 *)enemy_projectile_1A27 + v0), 0x40); uint16 v4 = R22_; - uint8 *v5 = RomPtr_8C(v3); + const uint8 *v5 = RomPtr_8C(v3); R18_ = v5[2]; R24_ = R18_; R20_ = v5[3]; @@ -1958,12 +1890,12 @@ void CallCreditsObjectFunc(uint32 ea, uint16 k) { } void CreditsObject_Init(uint16 j) { // 0x8B9932 - uint8 *v1 = RomPtr_8B(j); - cinematic_var24 = *((uint16 *)v1 + 1); - cinematic_var21 = *((uint16 *)v1 + 2); + const uint8 *v1 = RomPtr_8B(j); + cinematic_var24 = GET_WORD(v1 + 2); + cinematic_var21 = GET_WORD(v1 + 4); cinematic_var22 = 1; cinematic_var23 = 0; - CallCreditsObjectFunc(*(uint16 *)v1 | 0x8B0000, 0); + CallCreditsObjectFunc(GET_WORD(v1) | 0x8B0000, 0); } void CreditsObject_Process(void) { // 0x8B9955 @@ -1995,7 +1927,7 @@ void CreditsObject_ProcessOne(void) { // 0x8B996A if (!sign16(v0 - enemy_projectile_pre_instr[0] - 8)) { enemy_projectile_pre_instr[0] = cinematic_var10; for (i = cinematic_var21; ; ) { - uint16 *v2 = (uint16 *)RomPtr_8C(i); + const uint16 *v2 = (const uint16 *)RomPtr_8C(i); uint16 v3 = *v2; if ((*v2 & 0x8000u) == 0) break; @@ -2017,7 +1949,7 @@ void CreditsObject_Func1(uint16 j) { // 0x8B99C1 R20_ = 31; uint16 v2 = *((uint16 *)RomPtr_8C(j) + 1); do { - *(uint16 *)((char *)ram3000.pause_menu_map_tilemap + RegWord) = *(uint16 *)IndirPtr(&R0_, v2); + *(uint16 *)((char *)ram3000.pause_menu_map_tilemap + RegWord) = IndirReadWord(R0_, v2); RegWord += 2; v2 += 2; --R20_; @@ -2273,18 +2205,10 @@ void LoadTitleSequenceGraphics(void) { // 0x8B9B87 palette_buffer[v0 >> 1] = g_word_8CE1E9[v0 >> 1]; v0 += 2; } while ((int16)(v0 - 512) < 0); - mov24(&decompress_src, 0x94E000); - static const LongPtr unk_8B9BB4 = LONGPTR(0x7f0000); - static const LongPtr unk_8B9BC5 = LONGPTR(0x7f4000); - static const LongPtr unk_8B9BD6 = LONGPTR(0x7f5000); - static const LongPtr unk_8B9BE7 = LONGPTR(0x7f9000); - DecompressToMem_IpArg(&unk_8B9BB4); - mov24(&decompress_src, 0x96FC04); - DecompressToMem_IpArg(&unk_8B9BC5); - mov24(&decompress_src, 0x9580D8); - DecompressToMem_IpArg(&unk_8B9BD6); - mov24(&decompress_src, 0x95A5E1); - DecompressToMem_IpArg(&unk_8B9BE7); + DecompressToMem(0x94E000, g_ram + 0x10000); + DecompressToMem(0x96FC04, g_ram + 0x14000); + DecompressToMem(0x9580D8, g_ram + 0x15000); + DecompressToMem(0x95A5E1, g_ram + 0x19000); WriteReg(VMADDL, 0); WriteReg(VMADDH, 0); WriteReg(VMAIN, 0x80); @@ -2592,7 +2516,6 @@ void CinematicFunc_Func9(void) { // 0x8B9FAE } void ConfigureTitleSequenceGradientHDMA(void) { // 0x8BA00A -#define g_off_8CBC5D ((uint16*)RomPtr(0x8cbc5d)) uint16 v0 = g_off_8CBC5D[(uint16)((uint8)(cinematic_var6 & 0xF0) >> 3) >> 1]; for (int i = 0; ; i += 2) { uint16 v2 = *(uint16 *)RomPtr_8C(v0); @@ -2690,25 +2613,12 @@ void CinematicFunction_Intro_Initial(void) { // 0x8BA395 palette_buffer[v1 >> 1] = kPalettes_Intro[v1 >> 1]; v1 += 2; } while ((int16)(v1 - 512) < 0); - static const LongPtr unk_8BA3FC = LONGPTR(0x7f0000); - static const LongPtr unk_8BA40D = LONGPTR(0x7f8000); - static const LongPtr unk_8BA41E = LONGPTR(0x7f9000); - static const LongPtr unk_8BA42F = LONGPTR(0x7f9800); - static const LongPtr unk_8BA440 = LONGPTR(0x7fb800); - static const LongPtr unk_8BA451 = LONGPTR(0x7fe000); - - mov24(&decompress_src, 0x95f90e); - DecompressToMem_IpArg(&unk_8BA3FC); - mov24(&decompress_src, 0x95d089); - DecompressToMem_IpArg(&unk_8BA40D); - mov24(&decompress_src, 0x9788cc); - DecompressToMem_IpArg(&unk_8BA41E); - mov24(&decompress_src, 0x96ff14); - DecompressToMem_IpArg(&unk_8BA42F); - mov24(&decompress_src, 0x95e4c2); - DecompressToMem_IpArg(&unk_8BA440); - mov24(&decompress_src, 0x978d12); - DecompressToMem_IpArg(&unk_8BA451); + DecompressToMem(0x95f90e, g_ram + 0x10000); + DecompressToMem(0x95d089, g_ram + 0x18000); + DecompressToMem(0x9788cc, g_ram + 0x19000); + DecompressToMem(0x96ff14, g_ram + 0x19800); + DecompressToMem(0x95e4c2, g_ram + 0x1b800); + DecompressToMem(0x978d12, g_ram + 0x1e000); WriteReg(VMADDL, 0); WriteReg(VMADDH, 0); WriteReg(VMAIN, 0x80); @@ -2751,9 +2661,7 @@ void CinematicFunction_Intro_Initial(void) { // 0x8BA395 static const StartDmaCopy unk_8BA529 = { 1, 1, 0x18, LONGPTR(0x7fb800), 0x2400 }; SetupDmaTransfer(&unk_8BA529); WriteReg(MDMAEN, 2u); - mov24(&decompress_src, 0x95D713); - static const LongPtr unk_8BA546 = LONGPTR(0x7fa000); - DecompressToMem_IpArg(&unk_8BA546); + DecompressToMem(0x95D713, g_ram + 0x1a000); EnableNMI(); screen_fade_delay = 3; screen_fade_counter = 3; @@ -3603,8 +3511,8 @@ void CinematicFunction_Intro_Fadestuff2(void) { // 0x8BB458 } void CinematicBgPreInstr_SamusBlink(uint16 k) { // 0x8BB4BC - if (cinematic_function == (uint16)FUNC16(CinematicFunction_Intro_Func15b) - || cinematic_function == (uint16)FUNC16(nullsub_121)) { + if (cinematic_function == FUNC16(CinematicFunction_Intro_Func15b) + || cinematic_function == FUNC16(nullsub_121)) { int v1 = k >> 1; cinematicbg_instr_ptr[v1] = -10733; cinematicbg_instr_timer[v1] = 1; @@ -3928,7 +3836,7 @@ void CinematicFunction_Intro_Func44(uint16 k) { // 0x8BB8D8 cinematicbg_arr8[v1] += __CFADD__uint16(v3, 0x8000); R18_ = samus_x_pos - 5; if (sign16(cinematicbg_arr7[v1] + 8 - (samus_x_pos - 5))) { - if (cinematicspr_preinstr_func[0] != (uint16)FUNC16(CinematicFunction_Intro_Func39)) + if (cinematicspr_preinstr_func[0] != FUNC16(CinematicFunction_Intro_Func39)) return; } else { samus_invincibility_timer = 11; @@ -4020,8 +3928,6 @@ void CinematicFunction_Intro_Func50(uint16 k) { // 0x8BBA5E } void CinematicFunction_Intro_Func51(uint16 k) { // 0x8BBA73 - int16 v2; - int v1 = k >> 1; if (cinematicbg_arr8[v1] == 145) { SpawnCinematicSpriteObject(addr_kCinematicSpriteObjectDef_8BCEF1, 0); @@ -4036,13 +3942,8 @@ void CinematicFunction_Intro_Func51(uint16 k) { // 0x8BBA73 } else if (sign16(cinematic_var17 - 544)) { cinematic_var17 += 32; } - LOBYTE(v2) = HIBYTE(cinematic_var17); - HIBYTE(v2) = cinematic_var17; - R20_ = v2 & 0xFF00; - uint16 v3 = HIBYTE(cinematic_var17); - if ((cinematic_var17 & 0x8000u) != 0) - v3 = HIBYTE(cinematic_var17) | 0xFF00; - R18_ = v3; + R20_ = cinematic_var17 << 8; + R18_ = (int8)(cinematic_var17 >> 8); uint16 v4 = cinematicspr_arr7[v1]; bool v5 = __CFADD__uint16(R20_, v4); cinematicspr_arr7[v1] = R20_ + v4; @@ -4065,10 +3966,6 @@ void CinematicFunction_Intro_Func52(uint16 k) { // 0x8BBB0D } void CinematicFunction_Intro_Func53(uint16 k) { // 0x8BBB24 - int16 v4; - int16 v5; - int16 v8; - if (cinematic_var13) { int v2 = k >> 1; if (sign16(cinematicspr_goto_timer[v2] - 128)) { @@ -4083,14 +3980,9 @@ void CinematicFunction_Intro_Func53(uint16 k) { // 0x8BBB24 } else if (sign16(cinematic_var14 - 640)) { cinematic_var14 += 32; } - LOBYTE(v4) = HIBYTE(cinematic_var14); - HIBYTE(v4) = cinematic_var14; - R20_ = v4 & 0xFF00; - v5 = HIBYTE(cinematic_var14); - if ((cinematic_var14 & 0x8000u) != 0) - v5 = HIBYTE(cinematic_var14) | 0xFF00; - R18_ = v5; - if (v5 >= 0) + R20_ = cinematic_var14 << 8; + R18_ = (int8)GET_HIBYTE(cinematic_var14); + if (!sign16(R18_)) cinematic_var15 = -1; else cinematic_var15 = 1; @@ -4104,13 +3996,8 @@ void CinematicFunction_Intro_Func53(uint16 k) { // 0x8BBB24 } else if (sign16(cinematic_var17 - 544)) { cinematic_var17 += 32; } - LOBYTE(v8) = HIBYTE(cinematic_var17); - HIBYTE(v8) = cinematic_var17; - R20_ = v8 & 0xFF00; - uint16 v9 = HIBYTE(cinematic_var17); - if ((cinematic_var17 & 0x8000u) != 0) - v9 = HIBYTE(cinematic_var17) | 0xFF00; - R18_ = v9; + R20_ = cinematic_var17 << 8; + R18_ = (int8)GET_HIBYTE(cinematic_var17); uint16 v10 = cinematicspr_arr7[v2]; v7 = __CFADD__uint16(R20_, v10); cinematicspr_arr7[v2] = R20_ + v10; @@ -4166,41 +4053,35 @@ void CinematicFunction_Intro_Func54(void) { // 0x8BBCA0 palette_buffer[v0 >> 1] = kPalettes_Intro2[v0 >> 1]; v0 += 2; } while ((int16)(v0 - 512) < 0); - static const DecompressToParams unk_8BBCCA = { LONGPTR(0x7f0000) }; - static const DecompressToParams unk_8BBCDB = { LONGPTR(0x7f4000) }; - static const DecompressToParams unk_8BBCEC = { LONGPTR(0x7f5000) }; - mov24(&decompress_src, 0x95A82F); - DecompressToMem_IpArg(&unk_8BBCCA); - mov24(&decompress_src, 0x96FE69); - DecompressToMem_IpArg(&unk_8BBCDB); - mov24(&decompress_src, 0x96D10A); - DecompressToMem_IpArg(&unk_8BBCEC); - WriteReg(VMADDL, 0); - WriteReg(VMADDH, 0); + DecompressToMem(0x95A82F, g_ram + 0x10000); + DecompressToMem(0x96FE69, g_ram + 0x14000); + DecompressToMem(0x96D10A, g_ram + 0x15000); + WriteRegWord(VMADDL, 0); WriteReg(VMAIN, 0x80); static const StartDmaCopy unk_8BBD04 = { 1, 0, 0x19, LONGPTR(0x7f0000), 0x4000 }; SetupDmaTransfer(&unk_8BBD04); WriteReg(MDMAEN, 2u); + WriteReg(VMAIN, 0); - WriteReg(VMADDL, 0); - WriteReg(VMADDH, 0); + WriteRegWord(VMADDL, 0); v1 = 0x4000; do { WriteReg(VMDATAL, 0x8C); --v1; } while (v1); - WriteReg(VMADDL, 0); - WriteReg(VMADDH, 0); + + WriteRegWord(VMADDL, 0); WriteReg(VMAIN, 0); static const StartDmaCopy unk_8BBD3C = { 1, 0, 0x18, LONGPTR(0x7f4000), 0x0300 }; SetupDmaTransfer(&unk_8BBD3C); WriteReg(MDMAEN, 2u); - WriteReg(VMADDL, 0); - WriteReg(VMADDH, 0x60); + + WriteRegWord(VMADDL, 0x6000); WriteReg(VMAIN, 0x80); static const StartDmaCopy unk_8BBD5C = { 1, 1, 0x18, LONGPTR(0x7f5000), 0x4000 }; SetupDmaTransfer(&unk_8BBD5C); WriteReg(MDMAEN, 2u); + WriteRegWord(M7A, 0x100); reg_M7A = 256; WriteRegWord(M7B, 0); @@ -4464,15 +4345,9 @@ void CinematicFunctionBlackoutFromCeres(void) { // 0x8BC11B palette_buffer[v2 >> 1] = kPalettes_Intro2[v2 >> 1]; v2 += 2; } while ((int16)(v2 - 512) < 0); - static const DecompressToParams unk_8BC162 = { LONGPTR(0x7f0000) }; - static const DecompressToParams unk_8BC173 = { LONGPTR(0x7f4000) }; - static const DecompressToParams unk_8BC184 = { LONGPTR(0x7f5000) }; - mov24(&decompress_src, 0x95A82F); - DecompressToMem_IpArg(&unk_8BC162); - mov24(&decompress_src, 0x96FE69); - DecompressToMem_IpArg(&unk_8BC173); - mov24(&decompress_src, 0x96D10A); - DecompressToMem_IpArg(&unk_8BC184); + DecompressToMem(0x95A82F, g_ram + 0x10000); + DecompressToMem(0x96FE69, g_ram + 0x14000); + DecompressToMem(0x96D10A, g_ram + 0x15000); WriteReg(VMADDL, 0); WriteReg(VMADDH, 0); WriteReg(VMAIN, 0x80); @@ -4619,7 +4494,7 @@ void CinematicFunction_Intro_Func78(uint16 j) { // 0x8BC434 } void CinematicSprPreInstr_C489(uint16 k) { // 0x8BC489 - if (cinematic_function == (uint16)FUNC16(CinematicFunction_Intro_Func77)) { + if (cinematic_function == FUNC16(CinematicFunction_Intro_Func77)) { cinematicspr_preinstr_func[k >> 1] = FUNC16(CinematicFunction_nullsub_116); } else { bool v1 = (--cinematic_var4 & 0x8000u) != 0; @@ -4739,15 +4614,11 @@ void CinematicFunction_Intro_Func85(void) { // 0x8BC627 } void CinematicFunction_Intro_Func86(void) { // 0x8BC699 - static const DecompressToParams unk_8BC6BB = { LONGPTR(0x7f9000) }; - static const DecompressToParams unk_8BC6CC = { LONGPTR(0x7f5000) }; SetupPpu_4_Mode1(); for (int i = 656; i >= 0; i -= 2) *(uint16 *)((char *)&cinematic_var5 + (uint16)i) = 0; - mov24(&decompress_src, 0x978ADB); - DecompressToMem_IpArg(&unk_8BC6BB); - mov24(&decompress_src, 0x96EC76); - DecompressToMem_IpArg(&unk_8BC6CC); + DecompressToMem(0x978ADB, g_ram + 0x19000); + DecompressToMem(0x96EC76, g_ram + 0x15000); WriteReg(VMADDL, 0); WriteReg(VMADDH, 0); WriteReg(VMAIN, 0); @@ -4837,21 +4708,16 @@ void CinematicFunction_Intro_Func89(uint16 j) { // 0x8BC83B } void CinematicFunction_Intro_Func90(uint16 k) { // 0x8BC84E - if (cinematic_function == (uint16)FUNC16(nullsub_124)) + if (cinematic_function == FUNC16(nullsub_124)) cinematicspr_preinstr_func[k >> 1] = FUNC16(CinematicFunction_Intro_Func91); } void CinematicFunction_Intro_Func91(uint16 k) { // 0x8BC85D - char v3; // t0 - int v1 = k >> 1; uint16 v2 = cinematicspr_goto_timer[v1] + 64; cinematicspr_goto_timer[v1] = v2; - v3 = v2; - LOBYTE(v2) = HIBYTE(v2); - HIBYTE(v2) = v3; - R20_ = v2 & 0xFF00; - R18_ = (uint8)v2; + R20_ = v2 << 8; + R18_ = (uint8)(v2 >> 8); uint16 v4 = cinematicspr_arr7[v1]; bool v5 = v4 < R20_; cinematicspr_arr7[v1] = v4 - R20_; @@ -4871,21 +4737,16 @@ void CinematicFunction_Intro_Func92(uint16 j) { // 0x8BC897 } void CinematicFunction_Intro_Func93(uint16 k) { // 0x8BC8AA - if (cinematic_function == (uint16)FUNC16(nullsub_124)) + if (cinematic_function == FUNC16(nullsub_124)) cinematicspr_preinstr_func[k >> 1] = FUNC16(CinematicFunction_Intro_Func94); } void CinematicFunction_Intro_Func94(uint16 k) { // 0x8BC8B9 - char v3; // t0 - int v1 = k >> 1; uint16 v2 = cinematicspr_goto_timer[v1] + 32; cinematicspr_goto_timer[v1] = v2; - v3 = v2; - LOBYTE(v2) = HIBYTE(v2); - HIBYTE(v2) = v3; - R20_ = v2 & 0xFF00; - R18_ = (uint8)v2; + R20_ = v2 << 8; + R18_ = (uint8)(v2 >> 8); uint16 v4 = cinematicspr_arr7[v1]; bool v5 = v4 < R20_; cinematicspr_arr7[v1] = v4 - R20_; @@ -4899,21 +4760,16 @@ void CinematicFunction_Intro_Func94(uint16 k) { // 0x8BC8B9 } void CinematicFunction_Intro_Func96(uint16 k) { // 0x8BC8F9 - if (cinematic_function == (uint16)FUNC16(nullsub_124)) + if (cinematic_function == FUNC16(nullsub_124)) cinematicspr_preinstr_func[k >> 1] = FUNC16(CinematicFunction_Intro_Func97); } void CinematicFunction_Intro_Func97(uint16 k) { // 0x8BC908 - char v3; // t0 - int v1 = k >> 1; uint16 v2 = cinematicspr_goto_timer[v1] + 32; cinematicspr_goto_timer[v1] = v2; - v3 = v2; - LOBYTE(v2) = HIBYTE(v2); - HIBYTE(v2) = v3; - R20_ = v2 & 0xFF00; - R18_ = (uint8)v2; + R20_ = v2 << 8; + R18_ = (uint8)(v2 >> 8); uint16 v4 = cinematicspr_arr7[v1]; bool v5 = v4 < R20_; cinematicspr_arr7[v1] = v4 - R20_; @@ -5091,15 +4947,9 @@ void CinematicFunctionEscapeFromCebes(void) { // 0x8BD480 palette_buffer[v2 >> 1] = kPalettes_Intro3[v2 >> 1]; v2 += 2; } while ((int16)(v2 - 512) < 0); - static const DecompressToParams unk_8BD4C2 = { LONGPTR(0x7f0000) }; - static const DecompressToParams unk_8BD4D3 = { LONGPTR(0x7f4000) }; - static const DecompressToParams unk_8BD4E4 = { LONGPTR(0x7f8000) }; - mov24(&decompress_src, 0x98bcd6); - DecompressToMem_IpArg(&unk_8BD4C2); - mov24(&decompress_src, 0x99a56f); - DecompressToMem_IpArg(&unk_8BD4D3); - mov24(&decompress_src, 0x99d17e); - DecompressToMem_IpArg(&unk_8BD4E4); + DecompressToMem(0x98bcd6, g_ram + 0x10000); + DecompressToMem(0x99a56f, g_ram + 0x14000); + DecompressToMem(0x99d17e, g_ram + 0x18000); WriteReg(VMADDL, 0); WriteReg(VMADDH, 0); WriteReg(VMAIN, 0x80); @@ -5124,41 +4974,21 @@ void CinematicFunctionEscapeFromCebes(void) { // 0x8BD480 static const StartDmaCopy unk_8BD55C = { 1, 0, 0x19, LONGPTR(0x7f0000), 0x4000 }; SetupDmaTransfer(&unk_8BD55C); WriteReg(MDMAEN, 2u); - static const DecompressToParams unk_8BD579 = { LONGPTR(0x7f8000) }; - static const DecompressToParams unk_8BD58A = { LONGPTR(0x7f0000) }; - static const DecompressToParams unk_8BD59B = { LONGPTR(0x7f4000) }; - static const DecompressToParams unk_8BD5BD = { LONGPTR(0x7fe000) }; - static const DecompressToParams unk_8BD5CE = { LONGPTR(0x7fe800) }; - static const DecompressToParams unk_8BD5DF = { LONGPTR(0x7ff000) }; - static const DecompressToParams unk_8BD5F0 = { LONGPTR(0x7ff800) }; - static const DecompressToParams unk_8BD601 = { LONGPTR(0x7ea000) }; - static const DecompressToParams unk_8BD612 = { LONGPTR(0x7e2000) }; - static const DecompressToParams unk_8BD623 = { LONGPTR(0x7e6000) }; - mov24(&decompress_src, 0x988304); - DecompressToMem_IpArg(&unk_8BD579); - mov24(&decompress_src, 0x95a82f); - DecompressToMem_IpArg(&unk_8BD58A); - mov24(&decompress_src, 0x96fe69); - DecompressToMem_IpArg(&unk_8BD59B); + DecompressToMem(0x988304, g_ram + 0x18000); + DecompressToMem(0x95a82f, g_ram + 0x10000); + DecompressToMem(0x96fe69, g_ram + 0x14000); uint16 v3 = 768; do { *(uint16 *)((char *)&g_ram[0x14000] + v3) = 0x8c8c; v3 += 2; } while ((int16)(v3 - 0x4000) < 0); - mov24(&decompress_src, 0x98b5c1); - DecompressToMem_IpArg(&unk_8BD5BD); - mov24(&decompress_src, 0x98b857); - DecompressToMem_IpArg(&unk_8BD5CE); - mov24(&decompress_src, 0x98baed); - DecompressToMem_IpArg(&unk_8BD5DF); - mov24(&decompress_src, 0x98bccd); - DecompressToMem_IpArg(&unk_8BD5F0); - mov24(&decompress_src, 0x97e7de); - DecompressToMem_IpArg(&unk_8BD601); - mov24(&decompress_src, 0x99d65b); - DecompressToMem_IpArg(&unk_8BD612); - mov24(&decompress_src, 0x99d932); - DecompressToMem_IpArg(&unk_8BD623); + DecompressToMem(0x98b5c1, g_ram + 0x1e000); + DecompressToMem(0x98b857, g_ram + 0x1e800); + DecompressToMem(0x98baed, g_ram + 0x1f000); + DecompressToMem(0x98bccd, g_ram + 0x1f800); + DecompressToMem(0x97e7de, g_ram + 0xa000); + DecompressToMem(0x99d65b, g_ram + 0x2000); + DecompressToMem(0x99d932, g_ram + 0x6000); WriteRegWord(M7A, 0x100); reg_M7A = 256; WriteRegWord(M7B, 0); @@ -5235,9 +5065,7 @@ void CinematicFunction_Intro_Func112(void) { // 0x8BD731 static const StartDmaCopy unk_8BD766 = { 1, 1, 0x18, LONGPTR(0x7e2000), 0x4000 }; SetupDmaTransfer(&unk_8BD766); WriteReg(MDMAEN, 2u); - mov24(&decompress_src, 0x98ED4F); - static const DecompressToParams unk_8BD783 = { LONGPTR(0x7e2000) }; - DecompressToMem_IpArg(&unk_8BD783); + DecompressToMem(0x98ED4F, g_ram + 0x2000); WriteReg(VMADDL, 0); WriteReg(VMADDH, 0); WriteReg(VMAIN, 0x80); @@ -5287,9 +5115,7 @@ void CinematicFunction_Intro_Func115(void) { // 0x8BD837 static const StartDmaCopy unk_8BD86C = { 1, 1, 0x18, LONGPTR(0x7e6000), 0x4000 }; SetupDmaTransfer(&unk_8BD86C); WriteReg(MDMAEN, 2u); - mov24(&decompress_src, 0x999101); - static const DecompressToParams unk_8BD889 = { LONGPTR(0x7e6000) }; - DecompressToMem_IpArg(&unk_8BD889); + DecompressToMem(0x999101, g_ram + 0x6000); WriteReg(VMADDL, 0); WriteReg(VMADDH, 0); WriteReg(VMAIN, 0x80); @@ -5619,30 +5445,14 @@ void CinematicFunction_Intro_Func126(void) { // 0x8BDE80 palette_buffer[v0 >> 1] = kPalettes_Intro5[v0 >> 1]; v0 += 2; } while ((int16)(v0 - 256) < 0); - static const DecompressToParams unk_8BDEAA = { LONGPTR(0x7f0000) }; - static const DecompressToParams unk_8BDEBB = { LONGPTR(0x7e2000) }; - static const DecompressToParams unk_8BDECC = { LONGPTR(0x7e6000) }; - static const DecompressToParams unk_8BDEDD = { LONGPTR(0x7fc000) }; - static const DecompressToParams unk_8BDEEE = { LONGPTR(0x7fe000) }; - static const DecompressToParams unk_8BDEFF = { LONGPTR(0x7f4000) }; - static const DecompressToParams unk_8BDF10 = { LONGPTR(0x7fe800) }; - static const DecompressToParams unk_8BDF21 = { LONGPTR(0x7ff000) }; - mov24(&decompress_src, 0x979803); - DecompressToMem_IpArg(&unk_8BDEAA); - mov24(&decompress_src, 0x97B957); - DecompressToMem_IpArg(&unk_8BDEBB); - mov24(&decompress_src, 0x97D7FC); - DecompressToMem_IpArg(&unk_8BDECC); - mov24(&decompress_src, 0x97E7DE); - DecompressToMem_IpArg(&unk_8BDEDD); - mov24(&decompress_src, 0x9796F4); - DecompressToMem_IpArg(&unk_8BDEEE); - mov24(&decompress_src, 0x97F987); - DecompressToMem_IpArg(&unk_8BDEFF); - mov24(&decompress_src, 0x99DA9F); - DecompressToMem_IpArg(&unk_8BDF10); - mov24(&decompress_src, 0x99DAB1); - DecompressToMem_IpArg(&unk_8BDF21); + DecompressToMem(0x979803, g_ram + 0x10000); + DecompressToMem(0x97B957, g_ram + 0x2000); + DecompressToMem(0x97D7FC, g_ram + 0x6000); + DecompressToMem(0x97E7DE, g_ram + 0x1c000); + DecompressToMem(0x9796F4, g_ram + 0x1e000); + DecompressToMem(0x97F987, g_ram + 0x14000); + DecompressToMem(0x99DA9F, g_ram + 0x1e800); + DecompressToMem(0x99DAB1, g_ram + 0x1f000); WriteReg(VMADDL, 0); WriteReg(VMADDH, 0x20); WriteReg(VMAIN, 0x80); @@ -5680,12 +5490,8 @@ void CinematicFunction_Intro_Func126(void) { // 0x8BDE80 SetupDmaTransfer(&unk_8BDFD9); WriteReg(MDMAEN, 2u); - mov24(&decompress_src, 0x99E089); - static const DecompressToParams unk_8BDFF6 = { LONGPTR(0x7e6000) }; - DecompressToMem_IpArg(&unk_8BDFF6); - mov24(&decompress_src, 0x99ECC4); - static const DecompressToParams unk_8BE007 = { LONGPTR(0x7e8000) }; - DecompressToMem_IpArg(&unk_8BE007); + DecompressToMem(0x99E089, g_ram + 0x6000); + DecompressToMem(0x99ECC4, g_ram + 0x8000); if (sign16(game_time_hours - 3)) { WriteReg(VMADDL, 0); WriteReg(VMADDH, 0); @@ -5725,9 +5531,7 @@ void CinematicFunction_Intro_Func126(void) { // 0x8BDE80 for (int i = 510; i >= 0; i -= 2) hdma_table_1[i >> 1] = 0; CinematicFunction_Intro_Func127(); - mov24(&decompress_src, 0x97EEFF); - static const DecompressToParams unk_8BE0CB = { LONGPTR(0x7f0000) }; - DecompressToMem_IpArg(&unk_8BE0CB); + DecompressToMem(0x97EEFF, g_ram + 0x10000); ClearCinematicBgObjects(0x7F); CinematicFunction_Intro_Func128(0x7F); EnableTextGlowObjects_(); @@ -6055,7 +5859,7 @@ uint16 CalcItemPercentageCount(uint16 k, uint16 instrp) { // 0x8BE627 uint16 v0 = 4; R18_ = 0; do { - uint16 *v1 = (uint16 *)RomPtr_RAM(g_off_8BE70D[v0]); + const uint16 *v1 = (const uint16 *)RomPtr_RAM(g_off_8BE70D[v0]); R18_ += SnesDivide(*v1, g_word_8BE717[v0]); --v0; } while ((v0 & 0x8000u) == 0); @@ -6166,7 +5970,7 @@ void CinematicFunction_Intro_Func149(void) { // 0x8BE812 uint8 *v3 = RomPtr_RAM(v0); if (*(int16 *)v3 < 0) { uint8 *v1 = RomPtr_RAM(v0); - v2 = *((uint16 *)v1 + 5) - 1; + v2 = GET_WORD(v1 + 10) - 1; *((uint16 *)v1 + 5) = v2; if (v2 < 0) { *((uint16 *)v1 + 5) = 32; @@ -6174,25 +5978,25 @@ void CinematicFunction_Intro_Func149(void) { // 0x8BE812 } } else { int v4 = (uint16)(8 * (uint8) * (uint16 *)v3) >> 1; - if (sign16((*(uint16 *)v3 & 0xFF00) - 1024)) { + if (sign16((GET_WORD(v3) & 0xFF00) - 1024)) { *((uint16 *)v3 + 6) += g_word_8BE9CF[v4]; - v5 = *((uint16 *)v3 + 7); + v5 = GET_WORD(v3 + 14); } else { *((uint16 *)v3 + 6) += g_word_8BE9CF[v4] + g_word_8BE9CF[v4]; v5 = g_word_8BE9CF[v4 + 1] + *((uint16 *)v3 + 7); } *((uint16 *)v3 + 7) = g_word_8BE9CF[v4 + 1] + v5; - uint16 v23 = *((uint16 *)v3 + 6); + uint16 v23 = GET_WORD(v3 + 12); R18_ = (int8)HIBYTE(v23); R20_ = (v23 << 8) & 0xFF00; - v8 = *((uint16 *)v3 + 2); + v8 = GET_WORD(v3 + 4); bool v9 = __CFADD__uint16(R20_, v8); *((uint16 *)v3 + 2) = R20_ + v8; *((uint16 *)v3 + 1) += R18_ + v9; - uint16 v24 = *((uint16 *)v3 + 7); + uint16 v24 = GET_WORD(v3 + 14); R18_ = (int8)HIBYTE(v24); R20_ = (v24 << 8) & 0xFF00; - v12 = *((uint16 *)v3 + 4); + v12 = GET_WORD(v3 + 8); v9 = __CFADD__uint16(R20_, v12); *((uint16 *)v3 + 4) = R20_ + v12; *((uint16 *)v3 + 3) += R18_ + v9; @@ -6207,10 +6011,10 @@ void CinematicFunction_Intro_Func149(void) { // 0x8BE812 uint8 *v15 = RomPtr_RAM(v14); uint8 *v16 = v15; if (*(int16 *)v15 >= 0) { - v17 = *((uint16 *)v15 + 1); + v17 = GET_WORD(v15 + 2); if (v15[3] || ((v17 - 4) & 0xFF00) != 0 - || (v18 = gOamEnt(v13), *(uint16 *)&v18->xcoord = v17 - 4, v19 = *((uint16 *)v16 + 3), v16[7]) + || (v18 = gOamEnt(v13), *(uint16 *)&v18->xcoord = v17 - 4, v19 = GET_WORD(v16 + 6), v16[7]) || ((v19 - 4) & 0xFF00) != 0) { uint8 *v21 = RomPtr_RAM(v14); *((uint16 *)v21 + 5) = 32; @@ -6223,15 +6027,15 @@ void CinematicFunction_Intro_Func149(void) { // 0x8BE812 *(uint16 *)v21 = *v21; } else { *(uint16 *)&v18->ycoord = v19 - 4; - v20 = *((uint16 *)v16 + 5) - 1; + v20 = GET_WORD(v16 + 10) - 1; *((uint16 *)v16 + 5) = v20; if (v20 <= 0) { - v22 = *(uint16 *)v16; + v22 = GET_WORD(v16); *((uint16 *)v16 + 5) = g_word_8BE9CF[((uint16)(8 * (uint8) * (uint16 *)v16) >> 1) + 2]; *(uint16 *)v16 = v22 + 512; } if (v16[1]) { - *(uint16 *)&gOamEnt(v13)->charnum = g_word_8BE9A7[(uint16)HIBYTE(*(uint16 *)v16) >> 1]; + *(uint16 *)&gOamEnt(v13)->charnum = g_word_8BE9A7[(uint16)GET_HIBYTE(GET_WORD(v16)) >> 1]; v13 += 4; } } @@ -6566,7 +6370,7 @@ uint16 CinematicSprInstr_Func187(uint16 k, uint16 j) { // 0x8BF32B void CinematicSprPreInstr_F35A(uint16 k) { // 0x8BF35A - if (cinematic_function == (uint16)FUNC16(CinematicFunction_Intro_Func121)) { + if (cinematic_function == FUNC16(CinematicFunction_Intro_Func121)) { int v1 = k >> 1; cinematicspr_preinstr_func[v1] = FUNC16(CinematicFunction_Intro_Func189); cinematicspr_arr7[v1] = 0x4000; @@ -6601,7 +6405,7 @@ uint16 CinematicSprInstr_Func190(uint16 k, uint16 j) { // 0x8BF3B0 } void CinematicFunction_Intro_Func191(uint16 k) { // 0x8BF3B9 - if (cinematic_function == (uint16)FUNC16(CinematicFunction_Intro_Func126)) { + if (cinematic_function == FUNC16(CinematicFunction_Intro_Func126)) { int v1 = k >> 1; cinematicspr_instr_timer[v1] = 1; cinematicspr_instr_ptr[v1] = addr_off_8BEE9B; @@ -6705,7 +6509,7 @@ void CinematicFunction_Intro_Func206(uint16 k) { // 0x8BF4E0 } void CinematicFunction_Intro_Func207(uint16 k) { // 0x8BF507 - if (cinematic_function == (uint16)FUNC16(nullsub_125)) { + if (cinematic_function == FUNC16(nullsub_125)) { int v1 = k >> 1; cinematicspr_instr_timer[v1] = 1; cinematicspr_instr_ptr[v1] = addr_off_8BEE9B; @@ -6852,4 +6656,4 @@ uint16 CinematicFunction_Intro_Func219(uint16 k, uint16 j) { // 0x8BF6FE cinematic_function = FUNC16(CinematicFunction_Intro_Func129); cinematic_var4 = 60; return j; -} +} \ No newline at end of file diff --git a/src/sm_8d.c b/src/sm_8d.c index 906244e..1d510dc 100644 --- a/src/sm_8d.c +++ b/src/sm_8d.c @@ -3,6 +3,10 @@ #include "variables.h" #include "funcs.h" + + + + void EnablePaletteFx(void) { // 0x8DC4C2 flag_for_palette_fx_objects |= 0x8000u; } @@ -114,7 +118,7 @@ void PalFx_ProcessOne(uint16 k) { // 0x8DC54A if (palettefx_instr_timers[v2]-- == 1) { uint16 j = palettefx_instr_list_ptrs[v2], v6; while (1) { - uint16 *v5 = (uint16 *)RomPtr_8D(j); + const uint16 *v5 = (const uint16 *)RomPtr_8D(j); v6 = *v5; if ((*v5 & 0x8000u) == 0) break; @@ -128,18 +132,18 @@ void PalFx_ProcessOne(uint16 k) { // 0x8DC54A int v8 = v1 >> 1; palettefx_instr_timers[v8] = v6; uint16 v9 = palettefx_color_indexes[v8]; - uint8 *v10; + const uint8 *v10; do { while (1) { v10 = RomPtr_8D(j); - v11 = *((uint16 *)v10 + 1); + v11 = GET_WORD(v10 + 2); if (v11 & 0x8000) break; palette_buffer[v9 >> 1] = v11; v9 += 2; j += 2; } - R18_ = *((uint16 *)v10 + 1); + R18_ = GET_WORD(v10 + 2); v12 = CallPalInstr((uint16)v11 | 0x8D0000, v9, j); v9 = v12.k; j = v12.j; @@ -232,25 +236,25 @@ PairU16 PalInstr_SetColorIndex(uint16 k, uint16 j) { // 0x8DC655 } PairU16 PalInstr_QueueMusic(uint16 k, uint16 j) { // 0x8DC65E - uint8 *v2 = RomPtr_8D(j); + const uint8 *v2 = RomPtr_8D(j); QueueMusic_Delayed8(*v2); return MakePairU16(k, j + 1); } PairU16 PalInstr_QueueSfx1(uint16 k, uint16 j) { // 0x8DC66A - uint16 *v2 = (uint16 *)RomPtr_8D(j); + const uint16 *v2 = (const uint16 *)RomPtr_8D(j); QueueSfx1_Max6(*v2); return MakePairU16(k, j + 1); } PairU16 PalInstr_QueueSfx2(uint16 k, uint16 j) { // 0x8DC673 - uint16 *v2 = (uint16 *)RomPtr_8D(j); + const uint16 *v2 = (const uint16 *)RomPtr_8D(j); QueueSfx2_Max6(*v2); return MakePairU16(k, j + 1); } PairU16 PalInstr_QueueSfx3(uint16 k, uint16 j) { // 0x8DC67C - uint16 *v2 = (uint16 *)RomPtr_8D(j); + const uint16 *v2 = (const uint16 *)RomPtr_8D(j); QueueSfx3_Max6(*v2); return MakePairU16(k, j + 1); } @@ -260,7 +264,7 @@ void PalInit_E1BC(uint16 k, uint16 j) { // 0x8DE204 } void PalPreInstr_E1BC(uint16 k) { // 0x8DE20B - if (cinematic_function == (uint16)FUNC16(CinematicFunction_Intro_Page2)) { + if (cinematic_function == FUNC16(CinematicFunction_Intro_Page2)) { int v1 = k >> 1; palettefx_instr_list_ptrs[v1] = addr_off_8DE192; palettefx_instr_timers[v1] = 1; @@ -351,4 +355,4 @@ void PalPreInstr_F621(uint16 k) { // 0x8DF621 void PalInit_F779_Brinstar8(uint16 k, uint16 j) { // 0x8DF730 if ((*(uint16 *)&boss_bits_for_area[area_index] & 2) != 0) palettefx_ids[j >> 1] = 0; -} +} \ No newline at end of file diff --git a/src/sm_8f.c b/src/sm_8f.c index 78a15fe..e7de84a 100644 --- a/src/sm_8f.c +++ b/src/sm_8f.c @@ -4,6 +4,10 @@ #include "sm_rtl.h" #include "funcs.h" + + + + static const SpawnHardcodedPlmArgs unk_8F9198 = { 0x3d, 0x0b, 0xbb30 }; static const SpawnHardcodedPlmArgs unk_8F91AD = { 0x10, 0x87, 0xb964 }; static const SpawnHardcodedPlmArgs unk_8F91B6 = { 0x0f, 0x0a, 0xb9ed }; @@ -526,7 +530,7 @@ void RoomCode_Elevatube(void) { // 0x8FE2B6 R20_ = 0; if (*(int16 *)&room_main_asm_variables[4] < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = *(uint16 *)&room_main_asm_variables[4]; + R19_ = *(uint16 *)&room_main_asm_variables[4]; v0 = (__PAIR32__(R20_, R18_) + *(uint32 *)room_main_asm_variables) >> 16; *(uint16 *)room_main_asm_variables += R18_; *(uint16 *)&room_main_asm_variables[2] = v0; @@ -731,9 +735,9 @@ uint16 RoomDefStateSelect_Finish(uint16 k) { // 0x8FE5E6 } uint16 RoomDefStateSelect_Door(uint16 k) { // 0x8FE5EB - uint8 *v1 = RomPtr_8F(k); - if (*(uint16 *)v1 == door_def_ptr) - return RoomDefStateSelect_Finish(*((uint16 *)v1 + 1)); + const uint8 *v1 = RomPtr_8F(k); + if (GET_WORD(v1) == door_def_ptr) + return RoomDefStateSelect_Finish(GET_WORD(v1 + 2)); else return k + 4; } @@ -741,22 +745,22 @@ uint16 RoomDefStateSelect_Door(uint16 k) { // 0x8FE5EB uint16 RoomDefStateSelect_TourianBoss01(uint16 k) { // 0x8FE5FF if (!(CheckBossBitForCurArea(1u) & 1)) return k + 2; - uint16 *v1 = (uint16 *)RomPtr_8F(k); + const uint16 *v1 = (const uint16 *)RomPtr_8F(k); return RoomDefStateSelect_Finish(*v1); } uint16 RoomDefStateSelect_IsEventSet(uint16 k) { // 0x8FE612 - uint8 *v1 = RomPtr_8F(k); + const uint8 *v1 = RomPtr_8F(k); if (CheckEventHappened(*v1)) - return RoomDefStateSelect_Finish(*(uint16 *)(v1 + 1)); + return RoomDefStateSelect_Finish(GET_WORD(v1 + 1)); else return k + 3; } uint16 RoomDefStateSelect_IsBossDead(uint16 k) { // 0x8FE629 - uint8 *v1 = RomPtr_8F(k); + const uint8 *v1 = RomPtr_8F(k); if (CheckBossBitForCurArea(*v1) & 1) - return RoomDefStateSelect_Finish(*(uint16 *)(v1 + 1)); + return RoomDefStateSelect_Finish(GET_WORD(v1 + 1)); else return k + 3; } @@ -764,14 +768,14 @@ uint16 RoomDefStateSelect_IsBossDead(uint16 k) { // 0x8FE629 uint16 RoomDefStateSelect_MorphBallMissiles(uint16 k) { // 0x8FE652 if ((collected_items & 4) == 0 || !samus_max_missiles) return k + 2; - uint16 *v1 = (uint16 *)RomPtr_8F(k); + const uint16 *v1 = (const uint16 *)RomPtr_8F(k); return RoomDefStateSelect_Finish(*v1); } uint16 RoomDefStateSelect_PowerBombs(uint16 k) { // 0x8FE669 if (!samus_max_power_bombs) return k + 2; - uint16 *v1 = (uint16 *)RomPtr_8F(k); + const uint16 *v1 = (const uint16 *)RomPtr_8F(k); return RoomDefStateSelect_Finish(*v1); } @@ -987,4 +991,4 @@ void RoomCode_RidleyRoomShaking(void) { // 0x8FE950 reg_BG1VOFS += kRoomCode_RidleyRoomShaking_Y[v1]; reg_BG2VOFS += kRoomCode_RidleyRoomShaking_Y[v1]; } -} +} \ No newline at end of file diff --git a/src/sm_90.c b/src/sm_90.c index 9ac2817..b0deb82 100644 --- a/src/sm_90.c +++ b/src/sm_90.c @@ -5,6 +5,18 @@ #include "sm_rtl.h" #include "funcs.h" + +#define kSamusFramesForUnderwaterSfx ((uint8*)RomFixedPtr(0x90a514)) +#define kPauseMenuMapData ((uint16*)RomFixedPtr(0x829717)) +#define kPauseMenuMapTilemaps ((LongPtr*)RomFixedPtr(0x82964a)) +#define kBeamTilePtrs ((uint16*)RomFixedPtr(0x90c3b1)) +#define kBeamPalettePtrs ((uint16*)RomFixedPtr(0x90c3c9)) +#define off_90B5BB ((uint16*)RomFixedPtr(0x90b5bb)) +#define off_90B609 ((uint16*)RomFixedPtr(0x90b609)) +#define kFlareAnimDelays ((uint16*)RomFixedPtr(0x90c481)) + + + static const uint16 kUnchargedProjectile_Sfx[12] = { 0xb, 0xd, 0xc, 0xe, 0xf, 0x12, 0x10, 0x11, 0x13, 0x16, 0x14, 0x15 }; static const uint16 kChargedProjectile_Sfx[12] = { 0x17, 0x19, 0x18, 0x1a, 0x1b, 0x1e, 0x1c, 0x1d, 0x1f, 0x22, 0x20, 0x21 }; static const uint16 kNonBeamProjectile_Sfx[9] = { 0, 3, 4, 0, 0, 0, 0, 0, 0 }; @@ -226,15 +238,15 @@ static Func_Y_Y *const kAnimDelayFuncs[16] = { // 0x9082DC void Samus_HandleAnimDelay(void) { int16 v2; - byte_7E0002 = -111; + R0_.bank = -111; uint16 v0 = samus_anim_frame; R0_.addr = kSamusAnimationDelayData[samus_pose]; - if ((*IndirPtr(&R0_, samus_anim_frame) & 0x80) != 0) { + if ((IndirReadByte(R0_, samus_anim_frame) & 0x80) != 0) { uint16 v1 = Samus_HandleSpeedBoosterAnimDelay(v0); if (v1) { v2 = kAnimDelayFuncs[v1 & 0xF](v0); if (v2 >= 0) - samus_anim_frame_timer = samus_anim_frame_buffer + *IndirPtr(&R0_, v2); + samus_anim_frame_timer = samus_anim_frame_buffer + IndirReadByte(R0_, v2); } } else { Samus_HandleNormalAnimDelay(v0); @@ -260,7 +272,7 @@ uint16 Samus_AnimDelayFunc_7(uint16 j) { // 0x908360 } uint16 Samus_AnimDelayFunc_8_AutoJumpHack(uint16 j) { // 0x908370 - if (samus_input_handler == (uint16)FUNC16(Samus_InputHandler_E91D)) + if (samus_input_handler == FUNC16(Samus_InputHandler_E91D)) return Samus_AnimDelayFunc_13_TransToPose(j); if (samus_new_pose != kPose_4B_FaceR_Jumptrans && samus_new_pose != kPose_4C_FaceL_Jumptrans @@ -274,16 +286,16 @@ uint16 Samus_AnimDelayFunc_8_AutoJumpHack(uint16 j) { // 0x908370 uint16 Samus_AnimDelayFunc_9_TransToPose(uint16 j) { // 0x90839A uint16 v1 = j + 1; - R18_ = *(uint16 *)IndirPtr(&R0_, v1); + R18_ = IndirReadWord(R0_, v1); if ((R18_ & equipped_items) != 0) { if (samus_y_speed || samus_y_subspeed) - samus_new_pose_transitional = *IndirPtr(&R0_, v1 + 5); + samus_new_pose_transitional = IndirReadByte(R0_, v1 + 5); else - samus_new_pose_transitional = *IndirPtr(&R0_, v1 + 4); + samus_new_pose_transitional = IndirReadByte(R0_, v1 + 4); } else if (samus_y_speed || samus_y_subspeed) { - samus_new_pose_transitional = *IndirPtr(&R0_, v1 + 3); + samus_new_pose_transitional = IndirReadByte(R0_, v1 + 3); } else { - samus_new_pose_transitional = *IndirPtr(&R0_, v1 + 2); + samus_new_pose_transitional = IndirReadByte(R0_, v1 + 2); } samus_hurt_switch_index = 3; return -1; @@ -291,9 +303,9 @@ uint16 Samus_AnimDelayFunc_9_TransToPose(uint16 j) { // 0x90839A uint16 UNUSED_Samus_AnimDelayFunc_10(uint16 j) { // 0x9083F6 if (samus_y_speed || samus_y_subspeed) - samus_new_pose_transitional = *IndirPtr(&R0_, j + 2); + samus_new_pose_transitional = IndirReadByte(R0_, j + 2); else - samus_new_pose_transitional = *IndirPtr(&R0_, j + 1); + samus_new_pose_transitional = IndirReadByte(R0_, j + 1); samus_hurt_switch_index = 3; return -1; } @@ -326,23 +338,23 @@ LABEL_10: uint16 Samus_AnimDelayFunc_12_TransToPose(uint16 j) { // 0x90848B uint16 v1 = j + 1; - R18_ = *(uint16 *)IndirPtr(&R0_, v1); + R18_ = IndirReadWord(R0_, v1); if ((R18_ & equipped_items) != 0) - samus_new_pose_transitional = *IndirPtr(&R0_, v1 + 3); + samus_new_pose_transitional = IndirReadByte(R0_, v1 + 3); else - samus_new_pose_transitional = *IndirPtr(&R0_, v1 + 2); + samus_new_pose_transitional = IndirReadByte(R0_, v1 + 2); samus_hurt_switch_index = 3; return -1; } uint16 Samus_AnimDelayFunc_13_TransToPose(uint16 j) { // 0x9084B6 - samus_new_pose_transitional = *IndirPtr(&R0_, j + 1); + samus_new_pose_transitional = IndirReadByte(R0_, j + 1); samus_hurt_switch_index = 3; return -1; } uint16 Samus_AnimDelayFunc_14_Goto(uint16 j) { // 0x9084C7 - R18_ = *IndirPtr(&R0_, j + 1); + R18_ = IndirReadByte(R0_, j + 1); samus_anim_frame -= R18_; return samus_anim_frame; } @@ -354,16 +366,16 @@ uint16 Samus_AnimDelayFunc_15_GotoStart(uint16 j) { // 0x9084DB } void Samus_HandleNormalAnimDelay(uint16 j) { // 0x9084E3 - byte_7E0002 = -111; + R0_.bank = -111; if (samus_has_momentum_flag && samus_movement_type == 1) { uint16 *kDefaultAnimFramePtr = (uint16 *)RomPtr(0x91B5D1); if ((equipped_items & 0x2000) != 0) - R0_.addr = kSpeedBoostToAnimFramePtr[(uint16)(2 * HIBYTE(speed_boost_counter)) >> 1]; + R0_.addr = kSpeedBoostToAnimFramePtr[HIBYTE(speed_boost_counter)]; else R0_.addr = *kDefaultAnimFramePtr; } - samus_anim_frame_timer = samus_anim_frame_buffer + *IndirPtr(&R0_, j); + samus_anim_frame_timer = samus_anim_frame_buffer + IndirReadByte(R0_, j); } @@ -371,17 +383,17 @@ void Samus_HandleNormalAnimDelay(uint16 j) { // 0x9084E3 uint16 Samus_HandleSpeedBoosterAnimDelay(uint16 j) { // 0x90852C uint16 *kDefaultAnimFramePtr = (uint16 *)RomPtr(0x91B5D1); - byte_7E0002 = 0x91; + R0_.bank = 0x91; if (!samus_has_momentum_flag || (button_config_run_b & joypad1_lastkeys) == 0 || samus_movement_type != 1) - return *IndirPtr(&R0_, j); + return IndirReadByte(R0_, j); if ((equipped_items & 0x2000) == 0) { samus_anim_frame = 0; R0_.addr = *kDefaultAnimFramePtr; - samus_anim_frame_timer = samus_anim_frame_buffer + *IndirPtr(&R0_, 0); + samus_anim_frame_timer = samus_anim_frame_buffer + IndirReadByte(R0_, 0); return 0; } if ((uint8)--speed_boost_counter) - return *IndirPtr(&R0_, j); + return IndirReadByte(R0_, j); uint16 v2 = speed_boost_counter; if ((speed_boost_counter & 0x400) == 0) { v2 = speed_boost_counter + 256; @@ -397,7 +409,7 @@ uint16 Samus_HandleSpeedBoosterAnimDelay(uint16 j) { // 0x90852C speed_boost_counter = kSpeedBoostToCtr[v3] | speed_boost_counter & 0xFF00; samus_anim_frame = 0; R0_.addr = kSpeedBoostToAnimFramePtr[v3]; - samus_anim_frame_timer = samus_anim_frame_buffer + *IndirPtr(&R0_, 0); + samus_anim_frame_timer = samus_anim_frame_buffer + IndirReadByte(R0_, 0); return 0; } @@ -1008,7 +1020,7 @@ void Samus_BombJumpRisingYMovement_(void) { if ((uint8)bomb_jump_dir != 2) samus_x_accel_mode = 2; } else if (sign16(samus_y_speed - 1)) { - if (samus_input_handler != (uint16)FUNC16(Samus_InputHandler_E91D)) + if (samus_input_handler != FUNC16(Samus_InputHandler_E91D)) samus_input_handler = FUNC16(Samus_InputHandler_E913); } } @@ -2124,7 +2136,6 @@ void Samus_Movement_02_NormalJumping(void) { // 0x90A42E } // Warning: OOB -#define kSamusFramesForUnderwaterSfx ((uint8*)RomPtr(0x90a514)) void Samus_Movement_03_SpinJumping(void) { // 0x90A436 static const uint16 kSamusPhys_JumpMinYVelAir = 0x280; @@ -2442,7 +2453,7 @@ void DisableMinimapAndMarkBossRoomAsExplored(void) { // 0x90A7E2 return; } for (int i = g_stru_90A83A[v2].ptrs; ; i += 4) { - uint16 *v4 = (uint16 *)RomPtr_90(i); + const uint16 *v4 = (const uint16 *)RomPtr_90(i); if ((*v4 & 0x8000u) != 0) break; R18_ = *v4; @@ -2471,10 +2482,8 @@ void InitializeMiniMapBroken(void) { // 0x90A8EF } -#define kPauseMenuMapData ((uint16*)RomPtr(0x829717)) void UpdateMinimap(void) { // 0x90A91B int16 v4; - uint16 v5; int16 v10; int16 v11; @@ -2490,8 +2499,8 @@ void UpdateMinimap(void) { // 0x90A91B R22_ = room_y_coordinate_on_map + (uint8)((uint16)(samus_y_pos & 0xFF00) >> 8) + 1; uint16 v2 = R20_ + 4 * (R34 + R22_); map_tiles_explored[v2] |= kShr0x80[((uint8)room_x_coordinate_on_map + v0) & 7]; - R32 = v1; - g_word_7E001E = v2; + R32_ = v1; + R30_ = v2; uint16 v3 = v2 - 4; v4 = v1 - 2; if ((int16)(v1 - 2) < 0) { @@ -2501,36 +2510,21 @@ void UpdateMinimap(void) { // 0x90A91B } R50 = v3; bg3_tilemap_offset = 2 * v4; - LOBYTE(v5) = HIBYTE(*(uint16 *)&map_tiles_explored[v3]); - HIBYTE(v5) = *(uint16 *)&map_tiles_explored[v3]; int v6 = bg3_tilemap_offset >> 1; - R24_ = kShr0xFc00[v6] & v5; - LOBYTE(v5) = HIBYTE(*(uint16 *)&map_tiles_explored[v3 + 4]); - HIBYTE(v5) = *(uint16 *)&map_tiles_explored[v3 + 4]; - R26_ = kShr0xFc00[v6] & v5; - LOBYTE(v5) = HIBYTE(*(uint16 *)&map_tiles_explored[v3 + 8]); - HIBYTE(v5) = *(uint16 *)&map_tiles_explored[v3 + 8]; - R28_ = kShr0xFc00[v6] & v5; - *(uint16 *)((char *)&R10_ + 1) = 130; - *(uint16 *)((char *)&R8_ + 1) = kPauseMenuMapData[area_index]; - *(uint16 *)((char *)&R14_ + 1) = *(uint16 *)((char *)&R8_ + 1); - *(uint16 *)((char *)&R8_ + 1) += v3; - uint8 *v7 = IndirPtr((char *)&R8_ + 1, 0); - LOBYTE(v5) = HIBYTE(*(uint16 *)v7); - HIBYTE(v5) = *(uint16 *)v7; - R38 = v5; - *(uint16 *)((char *)&R8_ + 1) += 4; - uint8 *v8 = IndirPtr((char *)&R8_ + 1, 0); - LOBYTE(v5) = HIBYTE(*(uint16 *)v8); - HIBYTE(v5) = *(uint16 *)v8; - R40 = v5; - *(uint16 *)((char *)&R8_ + 1) += 4; - uint8 *v9 = IndirPtr((char *)&R8_ + 1, 0); - LOBYTE(v5) = HIBYTE(*(uint16 *)v9); - HIBYTE(v5) = *(uint16 *)v9; - R42 = v5; + R24_ = kShr0xFc00[v6] & swap16(*(uint16 *)&map_tiles_explored[v3]); + R26_ = kShr0xFc00[v6] & swap16(*(uint16 *)&map_tiles_explored[v3 + 4]); + R28_ = kShr0xFc00[v6] & swap16(*(uint16 *)&map_tiles_explored[v3 + 8]); + R9_.bank = 130; + R9_.addr = kPauseMenuMapData[area_index]; + *(uint16 *)((char *)&R14_ + 1) = R9_.addr; + R9_.addr += v3; + R38 = swap16(IndirReadWord(R9_, 0)); + R9_.addr += 4; + R40 = swap16(IndirReadWord(R9_, 0)); + R9_.addr += 4; + R42 = swap16(IndirReadWord(R9_, 0)); if ((R50 & 3) == 3) { - v10 = R46 ? bg3_tilemap_offset >> 1 : R32; + v10 = R46 ? bg3_tilemap_offset >> 1 : R32_; if (!sign16(v10 - 6)) { if (R34) LOBYTE(R48) = R50 - 124; @@ -2553,7 +2547,6 @@ void UpdateMinimap(void) { // 0x90A91B } } -#define kPauseMenuMapTilemaps ((LongPtr*)RomPtr(0x82964a)) void UpdateMinimapInside(void) { // 0x90AA43 uint16 v0; int16 v1; @@ -2569,46 +2562,46 @@ void UpdateMinimapInside(void) { // 0x90AA43 else v1 = remaining_enemy_spritemap_entries - 34; uint16 v2 = 2 * v1; - *(uint16 *)&byte_7E0002 = *(uint16 *)((char *)kPauseMenuMapTilemaps + 2 + (uint16)(3 * area_index)); - R3_.bank = *(uint16 *)&byte_7E0002; - R8_ = *(uint16 *)&byte_7E0002; + *(uint16 *)&R0_.bank = *(uint16 *)((char *)kPauseMenuMapTilemaps + 2 + (uint16)(3 * area_index)); + R3_.bank = *(uint16 *)&R0_.bank; + R6_.bank = *(uint16 *)&R0_.bank; R0_.addr = *(uint16 *)((char *)kPauseMenuMapTilemaps + (uint16)(3 * area_index)); R3_.addr = R0_.addr + 64; - R6_ = R0_.addr + 128; + R6_.addr = R0_.addr + 128; R18_ = 5; uint16 v3 = 0; do { bool v4 = R38 >> 15; R38 *= 2; - if (!v4 || (v5 = *(uint16 *)IndirPtr(&R0_, v2), !has_area_map)) + if (!v4 || (v5 = IndirReadWord(R0_, v2), !has_area_map)) v5 = 31; int v6 = v3 >> 1; hud_tilemap[v6 + 26] = v5 & 0xC3FF | 0x2C00; v4 = R24_ >> 15; R24_ *= 2; if (v4) - hud_tilemap[v6 + 26] = *(uint16 *)IndirPtr(&R0_, v2) & 0xC3FF | 0x2800; + hud_tilemap[v6 + 26] = IndirReadWord(R0_, v2) & 0xC3FF | 0x2800; v4 = R40 >> 15; R40 *= 2; - if (!v4 || (v7 = *(uint16 *)IndirPtr(&R3_, v2), !has_area_map)) + if (!v4 || (v7 = IndirReadWord(R3_, v2), !has_area_map)) v7 = 31; hud_tilemap[v6 + 58] = v7 & 0xC3FF | 0x2C00; v4 = R26_ >> 15; R26_ *= 2; if (v4) { - hud_tilemap[v6 + 58] = *(uint16 *)IndirPtr(&R3_, v2) & 0xC3FF | 0x2800; + hud_tilemap[v6 + 58] = IndirReadWord(R3_, v2) & 0xC3FF | 0x2800; if (R18_ == 3 && (hud_tilemap[v6 + 58] & 0x1FF) == 40) MarkMapTileAboveSamusAsExplored(); } v4 = R42 >> 15; R42 *= 2; - if (!v4 || (v8 = *(uint16 *)IndirPtr(&R6_, v2), !has_area_map)) + if (!v4 || (v8 = IndirReadWord(R6_, v2), !has_area_map)) v8 = 31; hud_tilemap[v6 + 90] = v8 & 0xC3FF | 0x2C00; v4 = R28_ >> 15; R28_ *= 2; if (v4) - hud_tilemap[v6 + 90] = *(uint16 *)IndirPtr(&R6_, v2) & 0xC3FF | 0x2800; + hud_tilemap[v6 + 90] = IndirReadWord(R6_, v2) & 0xC3FF | 0x2800; v3 += 2; v2 += 2; if ((v2 & 0x3F) == 0) @@ -2620,46 +2613,40 @@ void UpdateMinimapInside(void) { // 0x90AA43 } void MarkMapTileAboveSamusAsExplored(void) { // 0x90AB5F - *((uint8 *)&music_data_index + g_word_7E001E) |= kShr0x80[R32]; + *((uint8 *)&music_data_index + R30_) |= kShr0x80[R32_]; } void AdjustMapBitsForMapPageSpill(void) { // 0x90AB75 uint16 v0 = (uint8)R48; - *(uint16 *)((char *)&R8_ + 1) = *(uint16 *)((char *)&R14_ + 1) + (uint8)R48; + R9_.addr = *(uint16 *)((char *)&R14_ + 1) + (uint8)R48; LOBYTE(R44) = map_tiles_explored[(uint8)R48]; - HIBYTE(R44) = *IndirPtr((char *)&R8_ + 1, 0); + HIBYTE(R44) = IndirReadByte(R9_, 0); if ((uint8)R34 == 32) { - uint16 v1 = R44; - HIBYTE(R38) = HIBYTE(v1); - HIBYTE(R24_) = v1; + HIBYTE(R38) = HIBYTE(R44); + HIBYTE(R24_) = R44; } else { - uint16 v2 = R44; - LOBYTE(R38) = HIBYTE(v2); - LOBYTE(R24_) = v2; + LOBYTE(R38) = HIBYTE(R44); + LOBYTE(R24_) = R44; } LOBYTE(R44) = map_tiles_explored[v0 + 4]; - *(uint16 *)((char *)&R8_ + 1) += 4; - HIBYTE(R44) = *IndirPtr((char *)&R8_ + 1, 0); + R9_.addr += 4; + HIBYTE(R44) = IndirReadByte(R9_, 0); if ((uint8)R34 == 32) { - uint16 v3 = R44; - HIBYTE(R40) = HIBYTE(v3); - HIBYTE(R26_) = v3; + HIBYTE(R40) = HIBYTE(R44); + HIBYTE(R26_) = R44; } else { - uint16 v4 = R44; - LOBYTE(R40) = HIBYTE(v4); - LOBYTE(R26_) = v4; + LOBYTE(R40) = HIBYTE(R44); + LOBYTE(R26_) = R44; } LOBYTE(R44) = map_tiles_explored[v0 + 8]; - *(uint16 *)((char *)&R8_ + 1) += 4; - HIBYTE(R44) = *IndirPtr((char *)&R8_ + 1, 0); + R9_.addr += 4; + HIBYTE(R44) = IndirReadByte(R9_, 0); if ((uint8)R34 == 32) { - uint16 v5 = R44; - HIBYTE(R42) = HIBYTE(v5); - HIBYTE(R28_) = v5; + HIBYTE(R42) = HIBYTE(R44); + HIBYTE(R28_) = R44; } else { - uint16 v6 = R44; - LOBYTE(R42) = HIBYTE(v6); - LOBYTE(R28_) = v6; + LOBYTE(R42) = HIBYTE(R44); + LOBYTE(R28_) = R44; } } @@ -2697,8 +2684,6 @@ LABEL_3: return 0; } -#define kBeamTilePtrs ((uint16*)RomPtr(0x90c3b1)) -#define kBeamPalettePtrs ((uint16*)RomPtr(0x90c3c9)) void UpdateBeamTilesAndPalette(void) { // 0x90AC8D uint16 v0 = 2 * (equipped_beams & 0xFFF); @@ -2723,7 +2708,7 @@ void WriteBeamPalette_Y(uint16 j) { // 0x90ACCD uint16 v1 = 0; uint16 v2 = 0; do { - palette_buffer[(v2 >> 1) + 224] = *(uint16 *)IndirPtr(&R0_, v1); + palette_buffer[(v2 >> 1) + 224] = IndirReadWord(R0_, v1); v2 += 2; v1 += 2; } while ((int16)(v1 - 32) < 0); @@ -2735,7 +2720,7 @@ void LoadProjectilePalette(uint16 a) { // 0x90ACFC uint16 v1 = 0; uint16 v2 = 0; do { - palette_buffer[(v2 >> 1) + 224] = *(uint16 *)IndirPtr(&R0_, v1); + palette_buffer[(v2 >> 1) + 224] = IndirReadWord(R0_, v1); v2 += 2; v1 += 2; } while ((int16)(v1 - 32) < 0); @@ -3355,9 +3340,9 @@ void Missile_Func1(uint16 k) { // 0x90B2F6 v3 = R18_ - 0x3CD5; else v3 = R18_ - 0x3CFD; - uint8 *v4 = RomPtr_90(v3); - projectile_bomb_x_speed[v1] += *(uint16 *)v4; - projectile_bomb_y_speed[v1] += *((uint16 *)v4 + 1); + const uint8 *v4 = RomPtr_90(v3); + projectile_bomb_x_speed[v1] += GET_WORD(v4); + projectile_bomb_y_speed[v1] += GET_WORD(v4 + 2); } else { uint16 v2 = word_90C301 + projectile_variables[v1]; projectile_variables[v1] = v2; @@ -3372,15 +3357,11 @@ void Missile_Func1(uint16 k) { // 0x90B2F6 } void SuperMissileBlockCollDetect_Y(void) { // 0x90B366 - int16 v1; - int16 v2; - char v3; // t0 - int v0 = projectile_index >> 1; if ((projectile_type[v0] & 0xF00) == 512 || (projectile_type[v0] & 0xF00) == 2048) { uint8 v5 = projectile_variables[v0]; if (*((uint8 *)projectile_variables + projectile_index + 1)) { - v1 = abs16(projectile_bomb_y_speed[v0]) & 0xFF00; + uint16 v1 = abs16(projectile_bomb_y_speed[v0]) & 0xFF00; if (sign16(v1 - 2816)) { int v4 = projectile_index >> 1; if ((projectile_type[v4] & 0xF00) != 2048) { @@ -3388,10 +3369,7 @@ void SuperMissileBlockCollDetect_Y(void) { // 0x90B366 return; } } else { - v3 = v1; - LOBYTE(v2) = HIBYTE(v1); - HIBYTE(v2) = v3; - R18_ = v2 - 10; + R18_ = (v1 >> 8) - 10; if ((projectile_bomb_y_speed[v0] & 0x8000u) == 0) { uint16 v6 = projectile_index; projectile_y_pos[v5 >> 1] = projectile_y_pos[v0] - R18_; @@ -3424,15 +3402,11 @@ void Projectile_Func4(uint16 k) { // 0x90B4A6 } void SuperMissileBlockCollDetect_X(void) { // 0x90B406 - int16 v1; - int16 v2; - char v3; // t0 - int v0 = projectile_index >> 1; if ((projectile_type[v0] & 0xF00) == 512 || (projectile_type[v0] & 0xF00) == 2048) { uint8 v5 = projectile_variables[v0]; if (*((uint8 *)projectile_variables + projectile_index + 1)) { - v1 = abs16(projectile_bomb_x_speed[v0]) & 0xFF00; + uint16 v1 = abs16(projectile_bomb_x_speed[v0]) & 0xFF00; if (sign16(v1 - 2816)) { int v4 = projectile_index >> 1; if ((projectile_type[v4] & 0xF00) != 2048) { @@ -3440,10 +3414,7 @@ void SuperMissileBlockCollDetect_X(void) { // 0x90B406 return; } } else { - v3 = v1; - LOBYTE(v2) = HIBYTE(v1); - HIBYTE(v2) = v3; - R18_ = v2 - 10; + R18_ = (v1 >> 8) - 10; if ((projectile_bomb_x_speed[v0] & 0x8000u) == 0) { uint16 v6 = projectile_index; projectile_x_pos[v5 >> 1] = projectile_x_pos[v0] - R18_; @@ -3480,8 +3451,6 @@ void ProjInstr_MoveLeftProjectileTrailUp(uint16 j) { // 0x90B5B3 } void SpawnProjectileTrail(uint16 k) { // 0x90B657 -#define off_90B5BB ((uint16*)RomPtr(0x90b5bb)) -#define off_90B609 ((uint16*)RomPtr(0x90b609)) int16 v2; uint16 v1 = projectile_type[k >> 1]; @@ -3549,7 +3518,7 @@ void HandleProjectileTrails(void) { // 0x90B6A9 if (v3) goto LABEL_10; for (i = projectiletrail_left_instr_list_ptr[v1]; ; i += 2) { - uint16 *v5 = (uint16 *)RomPtr_90(i); + const uint16 *v5 = (const uint16 *)RomPtr_90(i); v6 = *v5; if ((*v5 & 0x8000u) == 0) break; @@ -3570,7 +3539,7 @@ LABEL_14:; if (v15) goto LABEL_21; for (j = projectiletrail_right_instr_list_ptr[v13]; ; j += 2) { - uint16 *v17 = (uint16 *)RomPtr_90(j); + const uint16 *v17 = (const uint16 *)RomPtr_90(j); v18 = *v17; if ((*v17 & 0x8000u) == 0) break; @@ -3904,7 +3873,6 @@ uint8 InitProjectilePositionDirection(void) { // 0x90BA56 } void HandleChargingBeamGfxAudio(void) { // 0x90BAFC -#define kFlareAnimDelays ((uint16*)RomPtr(0x90c481)) int16 v1; int16 v4; uint16 v9; @@ -3940,7 +3908,7 @@ void HandleChargingBeamGfxAudio(void) { // 0x90BAFC QueueSfx1_Max9(8u); uint16 v0 = 0; do { - byte_7E0002 = -112; + R0_.bank = -112; v1 = *(uint16 *)((char *)&flare_animation_timer + v0) - 1; *(uint16 *)((char *)&flare_animation_timer + v0) = v1; if (v1 < 0) { @@ -3948,17 +3916,17 @@ void HandleChargingBeamGfxAudio(void) { // 0x90BAFC *(uint16 *)((char *)&flare_animation_frame + v0) = v2; uint16 v3 = v2; R0_.addr = kFlareAnimDelays[v0 >> 1]; - v4 = *IndirPtr(&R0_, v2); + v4 = IndirReadByte(R0_, v2); if (v4 == 255) { *(uint16 *)((char *)&flare_animation_frame + v0) = 0; v3 = 0; } else if (v4 == 254) { - R18_ = *IndirPtr(&R0_, v3 + 1); + R18_ = IndirReadByte(R0_, v3 + 1); uint16 v5 = *(uint16 *)((char *)&flare_animation_frame + v0) - R18_; *(uint16 *)((char *)&flare_animation_frame + v0) = v5; v3 = v5; } - *(uint16 *)((char *)&flare_animation_timer + v0) = *IndirPtr(&R0_, v3); + *(uint16 *)((char *)&flare_animation_timer + v0) = IndirReadByte(R0_, v3); } v9 = v0; DrawFlareAnimationComponent(v0); @@ -3982,7 +3950,7 @@ void DrawFlareAnimationComponent(uint16 k) { // 0x90BBE1 int16 v2; uint16 v1; - byte_7E0002 = -109; + R0_.bank = -109; R18_ = *((uint8 *)&flare_animation_frame + k); if (samus_pose_x_dir == 4) v1 = word_93A22B[k >> 1]; @@ -4172,9 +4140,6 @@ void ProjectileReflection(void) { // 0x90BE00 } void HudSelectionHandler_MissilesOrSuperMissiles(void) { // 0x90BE62 - uint16 v2; - char v6; - if ((button_config_shoot_x & joypad1_newkeys) == 0 && (button_config_shoot_x & joypad1_newinput_samusfilter) == 0 || !(Samus_CanFireSuperMissile() & 1)) { return; @@ -4205,12 +4170,9 @@ LABEL_10:; int v1 = R20_ >> 1; projectile_timers[v1] = 4; uint16 v3 = hud_item_index; - LOBYTE(v2) = HIBYTE(v3); - v6 = v3; - HIBYTE(v2) = hud_item_index; - R18_ = v2; - projectile_type[v1] |= v2 | 0x8000; - uint16 v4 = 2 * (v6 & 0xF); + R18_ = swap16(hud_item_index); + projectile_type[v1] |= R18_ | 0x8000; + uint16 v4 = 2 * (v3 & 0xF); if (!cinematic_function) QueueSfx1_Max6(kNonBeamProjectile_Sfx[v4 >> 1]); InitializeProjectileSpeedOfType(); @@ -4259,9 +4221,6 @@ void Missile_Func2(void) { // 0x90BF46 } void HudSelectionHandler_MorphBall(void) { // 0x90BF9D - uint16 v3; - char v6; - if ((button_config_shoot_x & joypad1_lastkeys) != 0) { if (hud_item_index == 3) { if ((power_bomb_flag & 0x8000u) == 0) { @@ -4278,13 +4237,11 @@ void HudSelectionHandler_MorphBall(void) { // 0x90BF9D } } R20_ = v2; - LOBYTE(v3) = HIBYTE(hud_item_index); - HIBYTE(v3) = hud_item_index; - R18_ = v3; + R18_ = swap16(hud_item_index); int v4 = v2 >> 1; - uint16 v5 = v3 | projectile_type[v4]; + uint16 v5 = R18_ | projectile_type[v4]; projectile_type[v4] = v5; - v6 = HIBYTE(v5); + uint8 v6 = HIBYTE(v5); projectile_dir[v4] = 0; projectile_x_pos[v4] = samus_x_pos; projectile_y_pos[v4] = samus_y_pos; @@ -4486,7 +4443,7 @@ uint8 SwitchToHudHandler_PowerBombs(void) { // 0x90C577 uint8 SwitchToHudHandler_Grapple(void) { // 0x90C58A if ((equipped_items & 0x4000) == 0) return 1; - if (grapple_beam_function == (uint16)FUNC16(GrappleBeamFunc_Inactive)) { + if (grapple_beam_function == FUNC16(GrappleBeamFunc_Inactive)) { Samus_LoadSuitPalette(); flare_counter = 0; ClearFlareAnimationState(); @@ -4553,7 +4510,7 @@ void Samus_ArmCannon_Draw(void) { // 0x90C663 if (arm_cannon_frame && (!samus_invincibility_timer || (nmi_frame_counter_word & 1) == 0)) { uint16 v0 = kPlayerPoseToPtr[samus_pose]; - uint8 *v1 = RomPtr_90(v0); + const uint8 *v1 = RomPtr_90(v0); v2 = *v1; if ((v2 & 0x80) != 0) { if (samus_anim_frame) @@ -4566,7 +4523,7 @@ void Samus_ArmCannon_Draw(void) { // 0x90C663 R22_ = v0 + 2; } R24_ = kDrawArmCannon_Char[v3 >> 1]; - uint8 *v4 = RomPtr_90(R22_ + 2 * samus_anim_frame); + const uint8 *v4 = RomPtr_90(R22_ + 2 * samus_anim_frame); R18_ = (int8)v4[0]; R20_ = (int8)v4[1]; R22_ = *(&kPoseParams[0].y_offset_to_gfx + (uint16)(8 * samus_pose)); @@ -4586,7 +4543,7 @@ void Samus_ArmCannon_Draw(void) { // 0x90C663 } } } - uint8 *v11 = RomPtr_90(kPlayerPoseToPtr[samus_pose]); + const uint8 *v11 = RomPtr_90(kPlayerPoseToPtr[samus_pose]); v12 = *v11; if ((v12 & 0x80) != 0) { if (samus_anim_frame) @@ -4706,8 +4663,8 @@ uint8 FireSba_FireWave(void) { // 0x90CD1A uint8 FireSba_FireIce(void) { // 0x90CD9B static const uint16 kIcePlasmaSbaProjectileOriginAngles[8] = { 0, 0x40, 0x80, 0xc0, 0x20, 0x60, 0xa0, 0xe0 }; - if (projectile_bomb_pre_instructions[0] == (uint16)FUNC16(ProjPreInstr_IceSba2) - || projectile_bomb_pre_instructions[0] == (uint16)FUNC16(ProjPreInstr_IceSba)) { + if (projectile_bomb_pre_instructions[0] == FUNC16(ProjPreInstr_IceSba2) + || projectile_bomb_pre_instructions[0] == FUNC16(ProjPreInstr_IceSba)) { return 0; } for (int i = 6; i >= 0; i -= 2) { @@ -4764,7 +4721,7 @@ uint8 FireSba_FirePlasma(void) { // 0x90CE98 static const uint16 kIcePlasmaSbaProjectileOriginAngles[8] = { 0, 0x40, 0x80, 0xc0, 0x20, 0x60, 0xa0, 0xe0 }; - if (projectile_bomb_pre_instructions[0] == (uint16)FUNC16(ProjPreInstr_PlasmaSba)) + if (projectile_bomb_pre_instructions[0] == FUNC16(ProjPreInstr_PlasmaSba)) return 0; for (int i = 6; i >= 0; i -= 2) { int v2 = i >> 1; @@ -5064,7 +5021,7 @@ static Func_V *const kSamus_MoveHandler_ShinesparkCrash[3] = { // 0x90D346 void Samus_MoveHandler_ShinesparkCrash(void) { samus_shine_timer = 15; - kSamus_MoveHandler_ShinesparkCrash[(uint16)(2 * HIBYTE(speed_echoes_index)) >> 1](); + kSamus_MoveHandler_ShinesparkCrash[HIBYTE(speed_echoes_index)](); for (int i = 2; i >= 0; i -= 2) { int v1 = i >> 1; Projectile_SinLookup(speed_echo_xspeed[v1], (uint8)speed_echoes_index); @@ -5220,7 +5177,7 @@ uint8 Hdmaobj_CrystalFlash(void) { // 0x90D5A2 samus_prev_pose = samus_pose; *(uint16 *)&samus_prev_pose_x_dir = *(uint16 *)&samus_pose_x_dir; samus_movement_handler = FUNC16(SamusMoveHandler_CrystalFlashStart); - if (samus_input_handler != (uint16)FUNC16(Samus_InputHandler_E91D)) + if (samus_input_handler != FUNC16(Samus_InputHandler_E91D)) samus_input_handler = FUNC16(nullsub_152); timer_for_shinesparks_startstop = 9; which_item_to_pickup = 0; @@ -5312,7 +5269,7 @@ void kSamusMoveHandler_CrystalFlashFinish(void) { // 0x90D75B power_bomb_flag = 0; samus_shine_timer = -1; samus_movement_handler = FUNC16(Samus_MovementHandler_Normal); - if (samus_input_handler != (uint16)FUNC16(Samus_InputHandler_E91D)) { + if (samus_input_handler != FUNC16(Samus_InputHandler_E91D)) { samus_input_handler = FUNC16(Samus_InputHandler_E913); samus_invincibility_timer = 0; samus_knockback_timer = 0; @@ -5385,10 +5342,6 @@ static const uint16 kBombSpread_Tab2[5] = { 0, 1, 2, 1, 0 }; static const uint16 kBombSpread_Tab3[5] = { 0, 0, 0x8000, 0, 0 }; void ProjPreInstr_SpreadBomb(uint16 k) { // 0x90D8F7 - int16 v13; - int16 v17; - uint16 v9; - int v1 = k >> 1; if ((projectile_dir[v1] & 0xF0) != 0) { ClearProjectile(k); @@ -5422,13 +5375,11 @@ void ProjPreInstr_SpreadBomb(uint16 k) { // 0x90D8F7 } k = projectile_index; int v8 = projectile_index >> 1; - LOBYTE(v9) = HIBYTE(projectile_bomb_x_speed[v8]); - HIBYTE(v9) = projectile_bomb_x_speed[v8]; - R20_ = v9 & 0xFF00; - v9 = (uint8)v9; - R18_ = v9; - if ((v9 & 0x80) != 0) { - R18_ = v9 & 0x7F; + uint16 t = projectile_bomb_x_speed[v8]; + R20_ = t << 8; + R18_ = t >> 8; + if (t & 0x8000) { + R18_ = R18_ & 0x7F; uint16 v11 = projectile_bomb_x_subpos[v8]; v3 = v11 < R20_; projectile_bomb_x_subpos[v8] = v11 - R20_; @@ -5442,26 +5393,22 @@ void ProjPreInstr_SpreadBomb(uint16 k) { // 0x90D8F7 } if (BlockCollSpreadBomb(k) & 1) { int v12 = projectile_index >> 1; - v17 = projectile_bomb_x_speed[v12]; - LOBYTE(v13) = HIBYTE(v17); - HIBYTE(v13) = v17; - R20_ = v13 & 0xFF00; - R18_ = HIBYTE(v17) & 0x7F; - uint16 v15; - if (v17 >= 0) { - projectile_bomb_x_speed[v12] = v17 | 0x8000; + uint16 t = projectile_bomb_x_speed[v12]; + R20_ = t << 8; + R18_ = (t >> 8) & 0x7F; + if (t & 0x8000) { + projectile_bomb_x_speed[v12] = t | 0x8000; uint16 v16 = projectile_bomb_x_subpos[v12]; bool v3 = v16 < R20_; projectile_bomb_x_subpos[v12] = v16 - R20_; - v15 = projectile_x_pos[v12] - (v3 + R18_); + projectile_x_pos[v12] -= v3 + R18_; } else { - projectile_bomb_x_speed[v12] = v17 & 0x7FFF; + projectile_bomb_x_speed[v12] = t & 0x7FFF; uint16 v14 = projectile_bomb_x_subpos[v12]; bool v3 = __CFADD__uint16(R20_, v14); projectile_bomb_x_subpos[v12] = R20_ + v14; - v15 = R18_ + v3 + projectile_x_pos[v12]; + projectile_x_pos[v12] += R18_ + v3; } - projectile_x_pos[v12] = v15; } } @@ -5528,7 +5475,7 @@ void ProjPreInstr_WaveSba(uint16 k) { // 0x90DA08 void BombSpread(void) { // 0x90D849 - if (bomb_functions[0] != (uint16)FUNC16(ProjPreInstr_SpreadBomb)) { + if (bomb_functions[0] != FUNC16(ProjPreInstr_SpreadBomb)) { uint16 v0 = 10; do { int v1 = v0 >> 1; @@ -5753,7 +5700,7 @@ void HudSelectionHandler_Normal(void) { // 0x90DD3D HudSelectionHandler_TurningAround, }; uint16 v0; - if (grapple_beam_function == (uint16)FUNC16(GrappleBeamFunc_Inactive)) { + if (grapple_beam_function == FUNC16(GrappleBeamFunc_Inactive)) { if (time_is_frozen_flag) v0 = 10; else @@ -5771,7 +5718,7 @@ void HudSelectionHandler_Grappling(void) { // 0x90DD6F void HudSelectionHandler_TurningAround(void) { // 0x90DD74 if (new_projectile_direction_changed_pose) { HudSelectionHandler_Normal(); - } else if (grapple_beam_function != (uint16)FUNC16(GrappleBeamFunc_Inactive)) { + } else if (grapple_beam_function != FUNC16(GrappleBeamFunc_Inactive)) { grapple_beam_function = FUNC16(GrappleBeamFunc_Cancel); } } @@ -5783,7 +5730,7 @@ void HudSelectionHandler_CrouchEtcTrans(void) { // 0x90DD8C if (!sign16(samus_pose - kPose_DB)) return; if (byte_90DDAA[(uint16)(samus_pose - 53)]) { - if (grapple_beam_function != (uint16)FUNC16(GrappleBeamFunc_Inactive)) { + if (grapple_beam_function != FUNC16(GrappleBeamFunc_Inactive)) { grapple_beam_function = FUNC16(GrappleBeamFunc_Cancel); HudSelectionHandler_Normal(); } @@ -5794,7 +5741,7 @@ LABEL_4: } void HudSelectionHandler_JumpEtc(void) { // 0x90DDB6 - if (grapple_beam_function != (uint16)FUNC16(GrappleBeamFunc_Inactive)) { + if (grapple_beam_function != FUNC16(GrappleBeamFunc_Inactive)) { grapple_beam_function = FUNC16(GrappleBeamFunc_Cancel); HudSelectionHandler_Normal(); } @@ -5899,7 +5846,7 @@ uint8 Samus_HitInterrupt_Turning(void) { // 0x90DEE2 } uint8 Samus_HitInterrupt_Falling(void) { // 0x90DEEA - if (frame_handler_gamma != (uint16)FUNC16(Samus_Func9)) + if (frame_handler_gamma != FUNC16(Samus_Func9)) return Samus_HitInterrupt_Stand(); samus_special_transgfx_index = 0; knockback_dir = 0; @@ -6061,7 +6008,7 @@ static Func_V *const kSamus_MoveHandler_BombJumpMain[4] = { // 0x90E032 void Samus_MoveHandler_BombJumpMain(void) { if (bomb_jump_dir) - kSamus_MoveHandler_BombJumpMain[(uint16)(2 * (uint8)bomb_jump_dir) >> 1](); + kSamus_MoveHandler_BombJumpMain[(uint8)bomb_jump_dir](); else Samus_MoveHandler_BombJumpFunc1(); } @@ -6081,7 +6028,7 @@ void Samus_VerticalBombJump(void) { // 0x90E066 void Samus_MoveHandler_BombJumpFunc1(void) { // 0x90E07D samus_movement_handler = FUNC16(Samus_MovementHandler_Normal); - if (samus_input_handler != (uint16)FUNC16(Samus_InputHandler_E91D)) + if (samus_input_handler != FUNC16(Samus_InputHandler_E91D)) samus_input_handler = FUNC16(Samus_InputHandler_E913); bomb_jump_dir = 0; } @@ -6217,7 +6164,7 @@ void Samus_Func6(void) { // 0x90E21C } } void Samus_GrabbedByDraygonFrameHandler(void) { // 0x90E2A1 - if (grapple_beam_function == (uint16)FUNC16(GrappleBeamFunc_ConnectedLockedInPlace)) { + if (grapple_beam_function == FUNC16(GrappleBeamFunc_ConnectedLockedInPlace)) { samus_new_pose = -1; samus_momentum_routine_index = 0; } @@ -6361,97 +6308,68 @@ void Samus_CalcDisplacementMoveRight(void) { // 0x90E4AD } void Samus_CalcSpeed_X(void) { // 0x90E4E6 - int16 v1; - uint16 v3; - char v4; // t1 - uint16 v5; - char v6; // tt - uint16 v7; - char v8; // t1 - uint16 v9; - char v10; // tt - uint16 v0 = samus_x_speed_divisor; if (!sign16(samus_x_speed_divisor - 5)) v0 = 4; - v1 = 2 * v0; - if (v1) { - switch (v1) { - case 2: { - bool v2 = __CFADD__uint16(samus_x_extra_run_subspeed, R20_); - R20_ += samus_x_extra_run_subspeed; - LOBYTE(v3) = (uint16)(samus_x_extra_run_speed + v2 + R18_) >> 8; - HIBYTE(v3) = samus_x_extra_run_speed + v2 + R18_; - v3 >>= 1; - v4 = v3; - LOBYTE(v3) = HIBYTE(v3); - HIBYTE(v3) = v4; - R18_ = (uint8)v3; - samus_total_x_speed = (uint8)v3; - R22_ = v3 & 0xFF00; - R20_ = (v3 & 0xFF00) + (R20_ >> 1); - samus_total_x_subspeed = R20_; - break; - } - case 4: { - bool v2 = __CFADD__uint16(samus_x_extra_run_subspeed, R20_); - R20_ += samus_x_extra_run_subspeed; - LOBYTE(v5) = (uint16)(samus_x_extra_run_speed + v2 + R18_) >> 8; - HIBYTE(v5) = samus_x_extra_run_speed + v2 + R18_; - v5 >>= 2; - v6 = v5; - LOBYTE(v5) = HIBYTE(v5); - HIBYTE(v5) = v6; - R18_ = (uint8)v5; - samus_total_x_speed = (uint8)v5; - R22_ = v5 & 0xFF00; - R20_ = (v5 & 0xFF00) + (R20_ >> 2); - samus_total_x_subspeed = R20_; - break; - } - case 6: { - bool v2 = __CFADD__uint16(samus_x_extra_run_subspeed, R20_); - R20_ += samus_x_extra_run_subspeed; - LOBYTE(v7) = (uint16)(samus_x_extra_run_speed + v2 + R18_) >> 8; - HIBYTE(v7) = samus_x_extra_run_speed + v2 + R18_; - v7 >>= 3; - v8 = v7; - LOBYTE(v7) = HIBYTE(v7); - HIBYTE(v7) = v8; - R18_ = (uint8)v7; - samus_total_x_speed = (uint8)v7; - R22_ = v7 & 0xFF00; - R20_ = (v7 & 0xFF00) + (R20_ >> 3); - samus_total_x_subspeed = R20_; - break; - } - case 8: { - bool v2 = __CFADD__uint16(samus_x_extra_run_subspeed, R20_); - R20_ += samus_x_extra_run_subspeed; - LOBYTE(v9) = (uint16)(samus_x_extra_run_speed + v2 + R18_) >> 8; - HIBYTE(v9) = samus_x_extra_run_speed + v2 + R18_; - v9 >>= 4; - v10 = v9; - LOBYTE(v9) = HIBYTE(v9); - HIBYTE(v9) = v10; - R18_ = (uint8)v9; - samus_total_x_speed = (uint8)v9; - R22_ = v9 & 0xFF00; - R20_ = (v9 & 0xFF00) + (R20_ >> 4); - samus_total_x_subspeed = R20_; - break; - } - default: - Unreachable(); - while (1) - ; - } - } else { + switch (v0) { + case 0: { bool v2 = __CFADD__uint16(samus_x_extra_run_subspeed, R20_); R20_ += samus_x_extra_run_subspeed; samus_total_x_subspeed = R20_; R18_ += samus_x_extra_run_speed + v2; samus_total_x_speed = R18_; + break; + } + case 1: { + bool v2 = __CFADD__uint16(samus_x_extra_run_subspeed, R20_); + R20_ += samus_x_extra_run_subspeed; + uint16 t = samus_x_extra_run_speed + v2 + R18_; + uint16 v3 = swap16(swap16(t) >> 1); + R18_ = (uint8)v3; + samus_total_x_speed = (uint8)v3; + R22_ = v3 & 0xFF00; + R20_ = R22_ + (R20_ >> 1); + samus_total_x_subspeed = R20_; + break; + } + case 2: { + bool v2 = __CFADD__uint16(samus_x_extra_run_subspeed, R20_); + R20_ += samus_x_extra_run_subspeed; + uint16 t = samus_x_extra_run_speed + v2 + R18_; + uint16 v5 = swap16(swap16(t) >> 2); + R18_ = (uint8)v5; + samus_total_x_speed = (uint8)v5; + R22_ = v5 & 0xFF00; + R20_ = (v5 & 0xFF00) + (R20_ >> 2); + samus_total_x_subspeed = R20_; + break; + } + case 3: { + bool v2 = __CFADD__uint16(samus_x_extra_run_subspeed, R20_); + R20_ += samus_x_extra_run_subspeed; + uint16 t = samus_x_extra_run_speed + v2 + R18_; + uint16 v7 = swap16(swap16(t) >> 3); + R18_ = (uint8)v7; + samus_total_x_speed = (uint8)v7; + R22_ = v7 & 0xFF00; + R20_ = (v7 & 0xFF00) + (R20_ >> 3); + samus_total_x_subspeed = R20_; + break; + } + case 4: { + bool v2 = __CFADD__uint16(samus_x_extra_run_subspeed, R20_); + R20_ += samus_x_extra_run_subspeed; + uint16 t = samus_x_extra_run_speed + v2 + R18_; + uint16 v9 = swap16(swap16(t) >> 4); + R18_ = (uint8)v9; + samus_total_x_speed = (uint8)v9; + R22_ = v9 & 0xFF00; + R20_ = (v9 & 0xFF00) + (R20_ >> 4); + samus_total_x_subspeed = R20_; + break; + } + default: + Unreachable(); } } @@ -6664,7 +6582,7 @@ void Samus_Func16(void) { // 0x90E86A void Samus_Func18(void) { // 0x90E8AA Samus_FrameHandlerBeta_Func17(); - if (frame_handler_gamma == (uint16)FUNC16(DrawTimer_) && game_state != kGameState_35_TimeUp) + if (frame_handler_gamma == FUNC16(DrawTimer_) && game_state != kGameState_35_TimeUp) game_state = kGameState_35_TimeUp; } @@ -6877,8 +6795,6 @@ void Samus_JumpCheck(void) { // 0x90EAB3 } void Samus_Func10(void) { // 0x90EB02 - int16 v0; - projectile_init_speed_samus_moved_left = 0; projectile_init_speed_samus_moved_left_fract = 0; projectile_init_speed_samus_moved_right = 0; @@ -6889,9 +6805,7 @@ void Samus_Func10(void) { // 0x90EB02 projectile_init_speed_samus_moved_down_fract = 0; samus_anim_frame_skip = 0; new_projectile_direction_changed_pose = 0; - LOBYTE(v0) = HIBYTE(UNUSED_word_7E0DFA); - HIBYTE(v0) = UNUSED_word_7E0DFA; - UNUSED_word_7E0DFA = v0 & 0xFF00; + UNUSED_word_7E0DFA <<= 8; WORD(g_ram[0xa10]) = *(uint16 *)&samus_pose_x_dir; } @@ -6949,8 +6863,8 @@ void sub_90EB86(void) { // 0x90EB86 sub_90EB55(); return; } - if (grapple_beam_function == (uint16)FUNC16(GrappleBeamFunc_Firing) - || grapple_beam_function == (uint16)FUNC16(UNUSED_sub_9BC759)) { + if (grapple_beam_function == FUNC16(GrappleBeamFunc_Firing) + || grapple_beam_function == FUNC16(UNUSED_sub_9BC759)) { GrappleBeamFunc_BF1B(); } HandleGrappleBeamFlare(); @@ -7326,7 +7240,7 @@ uint8 SamusCode_02_ReachCeresElevator(void) { // 0x90F125 } uint8 SamusCode_03(void) { // 0x90F152 - if (grapple_beam_function != (uint16)FUNC16(GrappleBeamFunc_Inactive)) { + if (grapple_beam_function != FUNC16(GrappleBeamFunc_Inactive)) { grapple_beam_function = FUNC16(GrappleBeam_Func2); return 0; } @@ -7429,7 +7343,7 @@ uint8 SamusCode_0B_DrawHandlerDefault(void) { // 0x90F295 uint8 SamusCode_0C_UnlockFromMapStation(void) { // 0x90F29E SamusFunc_E633(); - if (frame_handler_beta == (uint16)FUNC16(j_HandleDemoRecorder_2)) { + if (frame_handler_beta == FUNC16(j_HandleDemoRecorder_2)) { frame_handler_alfa = FUNC16(Samus_FrameHandlerAlfa_Func11); frame_handler_beta = FUNC16(Samus_FrameHandlerBeta_Func17); } @@ -7457,7 +7371,7 @@ uint8 SamusCode_0F_EnableTimerHandling(void) { // 0x90F2D8 } uint8 SamusCode_10(void) { // 0x90F2E0 - if (frame_handler_beta != (uint16)FUNC16(j_HandleDemoRecorder_2_0)) { + if (frame_handler_beta != FUNC16(j_HandleDemoRecorder_2_0)) { frame_handler_alfa = FUNC16(Samus_FrameHandlerAlfa_Func11); frame_handler_beta = FUNC16(Samus_FrameHandlerBeta_Func17); } @@ -7574,7 +7488,7 @@ uint8 SamusCode_1A(void) { // 0x90F409 } uint8 SamusCode_1B_CheckedLockSamus(void) { // 0x90F411 - if (frame_handler_beta == (uint16)FUNC16(j_HandleDemoRecorder_2_0)) + if (frame_handler_beta == FUNC16(j_HandleDemoRecorder_2_0)) return 1; else return SamusCode_00_LockSamus(); @@ -7688,8 +7602,8 @@ void Samus_ShootCheck(void) { // 0x90F576 } } if (CheckEventHappened(0xEu) & 1 - && frame_handler_gamma == (uint16)FUNC16(DrawTimer_) + && frame_handler_gamma == FUNC16(DrawTimer_) && game_state != kGameState_35_TimeUp) { game_state = kGameState_35_TimeUp; } -} +} \ No newline at end of file diff --git a/src/sm_91.c b/src/sm_91.c index 7faae2d..cff32f7 100644 --- a/src/sm_91.c +++ b/src/sm_91.c @@ -4,6 +4,34 @@ #include "funcs.h" #include "sm_rtl.h" + +#define unk_91CAF2 (*(SpawnHdmaObject_Args*)RomFixedPtr(0x91caf2)) +#define stru_91D2D6 ((XrayBlockData*)RomFixedPtr(0x91d2d6)) +#define stru_91D2D6 ((XrayBlockData*)RomFixedPtr(0x91d2d6)) +#define off_91D727 ((uint16*)RomFixedPtr(0x91d727)) +#define kSamusPalette_HyperBeam ((uint16*)RomFixedPtr(0x91d829)) +#define kSamusPalette_NonPseudoScrew ((uint16*)RomFixedPtr(0x91d7d5)) +#define kSamusPalette_PseudoScrew ((uint16*)RomFixedPtr(0x91d7ff)) +#define word_9BA3C0 ((uint16*)RomFixedPtr(0x9ba3c0)) +#define kSamus_SpeedBoostingPalettes ((uint16*)RomFixedPtr(0x91d998)) +#define kSamus_HyperBeamPalettes ((uint16*)RomFixedPtr(0x91d99e)) +#define kSamusPal_ScrewAttack ((uint16*)RomFixedPtr(0x91da4a)) +#define kSamusPal_SpeedBoost ((uint16*)RomFixedPtr(0x91daa9)) +#define kSamusPal_SpeedBoostShine ((uint16*)RomFixedPtr(0x91db10)) +#define kSamusPal_Shinespark ((uint16*)RomFixedPtr(0x91db75)) +#define stru_91DC00 ((SamusCrystalFlashPalTable*)RomFixedPtr(0x91dc00)) +#define off_91DC28 ((uint16*)RomFixedPtr(0x91dc28)) +#define word_91E921 ((uint16*)RomFixedPtr(0x91e921)) +#define word_91E9F3 ((uint16*)RomFixedPtr(0x91e9f3)) +#define word_91EB74 ((uint16*)RomFixedPtr(0x91eb74)) +#define kSamusTurnPose_Standing ((uint8*)RomFixedPtr(0x91f9c2)) +#define kSamusTurnPose_Crouching ((uint8*)RomFixedPtr(0x91f9cc)) +#define kSamusTurnPose_Jumping ((uint8*)RomFixedPtr(0x91f9d6)) +#define kSamusTurnPose_Falling ((uint8*)RomFixedPtr(0x91f9e0)) +#define kSamusTurnPose_Moonwalk ((uint8*)RomFixedPtr(0x91f9ea)) + + + static Func_V *const kSamusInputHandlers[28] = { Samus_Input_00_Standing, Samus_Input_01_Running, @@ -376,9 +404,9 @@ void ProcessDemoInputObject(void) { // 0x9183F2 return; } demo_input_instr_timer = *v1; - uint8 *v3 = RomPtr_91(v0); - demo_input = *((uint16 *)v3 + 1); - demo_input_new = *((uint16 *)v3 + 2); + const uint8 *v3 = RomPtr_91(v0); + demo_input = GET_WORD(v3 + 2); + demo_input_new = GET_WORD(v3 + 4); demo_input_instr_ptr = v0 + 6; } } @@ -637,12 +665,9 @@ static Func_V *const kXrayHdmaFuncs[5] = { // 0x91BE11 }; void CalculateXrayHdmaTable_OriginOffScreen(uint16 k, uint16 j) { - int16 v2; - uint16 v3; + int v3; - LOBYTE(v2) = HIBYTE(k); - HIBYTE(v2) = k; - R22_ = v2 & 0xFF00; + R22_ = (k << 8); R24_ = j; R26_ = R18_ - R20_; R26_ += (R26_ & 0x8000u) != 0 ? 0x100 : 0; @@ -677,11 +702,11 @@ LABEL_16:; uint16 v4 = R26_; if (!sign16(R26_ - 128)) v4 = R26_ - 128; - g_word_7E001E = kTanTable[v4]; + R30_ = kTanTable[v4]; uint16 v5 = R28_; if (!sign16(R28_ - 128)) v5 = R28_ - 128; - R32 = kTanTable[v5]; + R32_ = kTanTable[v5]; kXrayHdmaFuncs[v3 >> 1](); } @@ -693,8 +718,8 @@ void XrayHdmaFunc_BeamAimedR(void) { // 0x91BEC2 R34 = R22_; R36 = R22_; while (1) { - bool v1 = __CFADD__uint16(g_word_7E001E, R34); - R34 += g_word_7E001E; + bool v1 = __CFADD__uint16(R30_, R34); + R34 += R30_; if (v1) break; v0 -= 2; @@ -703,28 +728,28 @@ void XrayHdmaFunc_BeamAimedR(void) { // 0x91BEC2 goto LABEL_10; } } - IndirWriteWord(&R0_, v0, HIBYTE(R34) | 0xFF00); + IndirWriteWord(R0_, v0, HIBYTE(R34) | 0xFF00); R18_ = v0 + 2; v2 = v0 - 2; while (1) { - bool v1 = __CFADD__uint16(g_word_7E001E, R34); - R34 += g_word_7E001E; + bool v1 = __CFADD__uint16(R30_, R34); + R34 += R30_; if (v1) break; - IndirWriteWord(&R0_, v2, HIBYTE(R34) | 0xFF00); + IndirWriteWord(R0_, v2, HIBYTE(R34) | 0xFF00); v2 -= 2; if (v2 < 0) goto LABEL_10; } do { - IndirWriteWord(&R0_, v2, 0xFF); + IndirWriteWord(R0_, v2, 0xFF); v2 -= 2; } while (v2 >= 0); LABEL_10:; uint16 v3 = 2 * R24_; while (1) { - bool v1 = __CFADD__uint16(R32, R36); - R36 += R32; + bool v1 = __CFADD__uint16(R32_, R36); + R36 += R32_; if (v1) break; v3 += 2; @@ -733,29 +758,29 @@ LABEL_10:; goto LABEL_19; } } - IndirWriteWord(&R0_, v3, HIBYTE(R36) | 0xFF00); + IndirWriteWord(R0_, v3, HIBYTE(R36) | 0xFF00); R20_ = v3 - 2; uint16 v4; v4 = v3 - 2 + 4; while (1) { - bool v1 = __CFADD__uint16(R32, R36); - R36 += R32; + bool v1 = __CFADD__uint16(R32_, R36); + R36 += R32_; if (v1) break; - IndirWriteWord(&R0_, v4, HIBYTE(R36) | 0xFF00); + IndirWriteWord(R0_, v4, HIBYTE(R36) | 0xFF00); v4 += 2; if ((int16)(v4 - 460) >= 0) goto LABEL_19; } do { - IndirWriteWord(&R0_, v4, 0xFF); + IndirWriteWord(R0_, v4, 0xFF); v4 += 2; } while ((int16)(v4 - 460) < 0); LABEL_19:; uint16 v5 = R18_; do { do { - IndirWriteWord(&R0_, v5, 0xFF00); + IndirWriteWord(R0_, v5, 0xFF00); v5 += 2; } while ((int16)(v5 - R20_) < 0); } while (v5 == R20_); @@ -769,8 +794,8 @@ void XrayHdmaFunc_BeamAimedL(void) { // 0x91BF72 R34 = R22_; R36 = R22_; while (1) { - bool v1 = R36 >= R32; - R36 -= R32; + bool v1 = R36 >= R32_; + R36 -= R32_; if (!v1) break; v0 -= 2; @@ -779,28 +804,28 @@ void XrayHdmaFunc_BeamAimedL(void) { // 0x91BF72 goto LABEL_10; } } - IndirWriteWord(&R0_, v0, R36 & 0xFF00); + IndirWriteWord(R0_, v0, R36 & 0xFF00); R18_ = v0 + 2; v2 = v0 - 2; while (1) { - bool v1 = R36 >= R32; - R36 -= R32; + bool v1 = R36 >= R32_; + R36 -= R32_; if (!v1) break; - IndirWriteWord(&R0_, v2, R36 & 0xFF00); + IndirWriteWord(R0_, v2, R36 & 0xFF00); v2 -= 2; if (v2 < 0) goto LABEL_10; } do { - IndirWriteWord(&R0_, v2, 0xFF); + IndirWriteWord(R0_, v2, 0xFF); v2 -= 2; } while (v2 >= 0); LABEL_10:; uint16 v3 = 2 * R24_; while (1) { - bool v1 = R34 >= g_word_7E001E; - R34 -= g_word_7E001E; + bool v1 = R34 >= R30_; + R34 -= R30_; if (!v1) break; v3 += 2; @@ -809,29 +834,29 @@ LABEL_10:; goto LABEL_19; } } - IndirWriteWord(&R0_, v3, R34 & 0xFF00); + IndirWriteWord(R0_, v3, R34 & 0xFF00); R20_ = v3 - 2; uint16 v4; v4 = v3 - 2 + 4; while (1) { - bool v1 = R34 >= g_word_7E001E; - R34 -= g_word_7E001E; + bool v1 = R34 >= R30_; + R34 -= R30_; if (!v1) break; - IndirWriteWord(&R0_, v4, R34 & 0xFF00); + IndirWriteWord(R0_, v4, R34 & 0xFF00); v4 += 2; if ((int16)(v4 - 460) >= 0) goto LABEL_19; } do { - IndirWriteWord(&R0_, v4, 0xFF); + IndirWriteWord(R0_, v4, 0xFF); v4 += 2; } while ((int16)(v4 - 460) < 0); LABEL_19:; uint16 v5 = R18_; do { do { - IndirWriteWord(&R0_, v5, 0xFF00); + IndirWriteWord(R0_, v5, 0xFF00); v5 += 2; } while ((int16)(v5 - R20_) < 0); } while (v5 == R20_); @@ -858,7 +883,7 @@ void XrayHdmaFunc_BeamAimedU(void) { off_91C063[v0 >> 1](2 * (R24_ - 1)); uint16 v1 = R18_; do { - IndirWriteWord(&R0_, v1, 0xFF); + IndirWriteWord(R0_, v1, 0xFF); v1 += 2; } while ((int16)(v1 - 460) < 0); } @@ -871,8 +896,8 @@ void XrayHdmaFunc_BeamAimedUUR(uint16 v0) { // 0x91C069 v6 = v0; while (1) { - bool v1 = __CFADD__uint16(g_word_7E001E, R34); - R34 += g_word_7E001E; + bool v1 = __CFADD__uint16(R30_, R34); + R34 += R30_; if (v1) break; v0 -= 2; @@ -881,22 +906,22 @@ void XrayHdmaFunc_BeamAimedUUR(uint16 v0) { // 0x91C069 goto LABEL_12; } } - IndirWriteByte(&R0_, v0, HIBYTE(R34)); + IndirWriteByte(R0_, v0, HIBYTE(R34)); v2 = v0 - 2; if (v2 >= 0) { R18_ = v2 + 4; while (1) { - bool v1 = __CFADD__uint16(g_word_7E001E, R34); - R34 += g_word_7E001E; + bool v1 = __CFADD__uint16(R30_, R34); + R34 += R30_; if (v1) break; - IndirWriteByte(&R0_, v2, HIBYTE(R34)); + IndirWriteByte(R0_, v2, HIBYTE(R34)); v2 -= 2; if (v2 < 0) goto LABEL_12; } do { - IndirWriteByte(&R0_, v2, 0xFF); + IndirWriteByte(R0_, v2, 0xFF); v2 -= 2; } while (v2 >= 0); } else { @@ -905,8 +930,8 @@ void XrayHdmaFunc_BeamAimedUUR(uint16 v0) { // 0x91C069 LABEL_12: v3 = v6 + 1; while (1) { - bool v1 = __CFADD__uint16(R32, R36); - R36 += R32; + bool v1 = __CFADD__uint16(R32_, R36); + R36 += R32_; if (v1) break; v3 -= 2; @@ -915,22 +940,22 @@ LABEL_12: goto LABEL_23; } } - IndirWriteByte(&R0_, v3, HIBYTE(R36)); + IndirWriteByte(R0_, v3, HIBYTE(R36)); v4 = v3 - 2; if (v4 >= 0) { R20_ = v4 + 4; while (1) { - bool v1 = __CFADD__uint16(R32, R36); - R36 += R32; + bool v1 = __CFADD__uint16(R32_, R36); + R36 += R32_; if (v1) break; - IndirWriteByte(&R0_, v4, HIBYTE(R36)); + IndirWriteByte(R0_, v4, HIBYTE(R36)); v4 -= 2; if (v4 < 0) goto LABEL_23; } do { - IndirWriteByte(&R0_, v4, 0xFF); + IndirWriteByte(R0_, v4, 0xFF); v4 -= 2; } while (v4 >= 0); } else { @@ -939,7 +964,7 @@ LABEL_12: LABEL_23:; uint16 v5 = R18_; do { - IndirWriteByte(&R0_, v5, 0); + IndirWriteByte(R0_, v5, 0); v5 += 2; } while ((int16)(v5 - R20_) < 0); R18_ = R20_ - 1; @@ -952,8 +977,8 @@ void XrayHdmaFunc_BeamAimedUU(uint16 j) { // 0x91C123 uint16 v5 = j; while (1) { - bool v1 = R34 >= g_word_7E001E; - R34 -= g_word_7E001E; + bool v1 = R34 >= R30_; + R34 -= R30_; if (!v1) break; j -= 2; @@ -962,22 +987,22 @@ void XrayHdmaFunc_BeamAimedUU(uint16 j) { // 0x91C123 goto LABEL_12; } } - IndirWriteByte(&R0_, j, HIBYTE(R34)); + IndirWriteByte(R0_, j, HIBYTE(R34)); v2 = j - 2; if (v2 >= 0) { R18_ = v2 + 4; while (1) { - bool v1 = R34 >= g_word_7E001E; - R34 -= g_word_7E001E; + bool v1 = R34 >= R30_; + R34 -= R30_; if (!v1) break; - IndirWriteByte(&R0_, v2, HIBYTE(R34)); + IndirWriteByte(R0_, v2, HIBYTE(R34)); v2 -= 2; if (v2 < 0) goto LABEL_12; } do { - IndirWriteByte(&R0_, v2, 0); + IndirWriteByte(R0_, v2, 0); v2 -= 2; } while (v2 >= 0); } else { @@ -986,8 +1011,8 @@ void XrayHdmaFunc_BeamAimedUU(uint16 j) { // 0x91C123 LABEL_12: v3 = v5 + 1; while (1) { - bool v1 = __CFADD__uint16(R32, R36); - R36 += R32; + bool v1 = __CFADD__uint16(R32_, R36); + R36 += R32_; if (v1) break; v3 -= 2; @@ -996,22 +1021,22 @@ LABEL_12: return; } } - IndirWriteByte(&R0_, v3, HIBYTE(R36)); + IndirWriteByte(R0_, v3, HIBYTE(R36)); v4 = v3 - 2; if (v4 >= 0) { R20_ = v4 + 4; while (1) { - bool v1 = __CFADD__uint16(R32, R36); - R36 += R32; + bool v1 = __CFADD__uint16(R32_, R36); + R36 += R32_; if (v1) break; - IndirWriteByte(&R0_, v4, HIBYTE(R36)); + IndirWriteByte(R0_, v4, HIBYTE(R36)); v4 -= 2; if (v4 < 0) return; } do { - IndirWriteByte(&R0_, v4, 0xFF); + IndirWriteByte(R0_, v4, 0xFF); v4 -= 2; } while (v4 >= 0); } else { @@ -1026,8 +1051,8 @@ void XrayHdmaFunc_BeamAimedUUL(uint16 j) { // 0x91C1CA uint16 v6 = j; while (1) { - bool v1 = R34 >= g_word_7E001E; - R34 -= g_word_7E001E; + bool v1 = R34 >= R30_; + R34 -= R30_; if (!v1) break; j -= 2; @@ -1036,22 +1061,22 @@ void XrayHdmaFunc_BeamAimedUUL(uint16 j) { // 0x91C1CA goto LABEL_12; } } - IndirWriteByte(&R0_, j, HIBYTE(R34)); + IndirWriteByte(R0_, j, HIBYTE(R34)); v2 = j - 2; if (v2 >= 0) { R18_ = v2 + 4; while (1) { - bool v1 = R34 >= g_word_7E001E; - R34 -= g_word_7E001E; + bool v1 = R34 >= R30_; + R34 -= R30_; if (!v1) break; - IndirWriteByte(&R0_, v2, HIBYTE(R34)); + IndirWriteByte(R0_, v2, HIBYTE(R34)); v2 -= 2; if (v2 < 0) goto LABEL_12; } do { - IndirWriteByte(&R0_, v2, 0); + IndirWriteByte(R0_, v2, 0); v2 -= 2; } while (v2 >= 0); } else { @@ -1060,8 +1085,8 @@ void XrayHdmaFunc_BeamAimedUUL(uint16 j) { // 0x91C1CA LABEL_12: v3 = v6 + 1; while (1) { - bool v1 = R36 >= R32; - R36 -= R32; + bool v1 = R36 >= R32_; + R36 -= R32_; if (!v1) break; v3 -= 2; @@ -1070,22 +1095,22 @@ LABEL_12: goto LABEL_23; } } - IndirWriteByte(&R0_, v3, HIBYTE(R34)); + IndirWriteByte(R0_, v3, HIBYTE(R34)); v4 = v3 - 2; if (v4 >= 0) { R20_ = v4 + 4; while (1) { - bool v1 = R36 >= R32; - R36 -= R32; + bool v1 = R36 >= R32_; + R36 -= R32_; if (!v1) break; - IndirWriteByte(&R0_, v4, HIBYTE(R36)); + IndirWriteByte(R0_, v4, HIBYTE(R36)); v4 -= 2; if (v4 < 0) goto LABEL_23; } do { - IndirWriteByte(&R0_, v4, 0); + IndirWriteByte(R0_, v4, 0); v4 -= 2; } while (v4 >= 0); } else { @@ -1094,7 +1119,7 @@ LABEL_12: LABEL_23:; uint16 v5 = R20_; do { - IndirWriteByte(&R0_, v5, 0xFF); + IndirWriteByte(R0_, v5, 0xFF); v5 += 2; } while ((int16)(v5 - R18_) < 0); } @@ -1121,7 +1146,7 @@ void XrayHdmaFunc_BeamAimedD(void) { off_91C2B7[v0 >> 1](R24_ * 2); v1 = R18_; do { - IndirWriteWord(&R0_, v1, 0xFF); + IndirWriteWord(R0_, v1, 0xFF); v1 -= 2; } while (v1 >= 0); } @@ -1129,8 +1154,8 @@ void XrayHdmaFunc_BeamAimedD(void) { void XrayHdmaFunc_BeamAimedDDR(uint16 j) { // 0x91C2BD uint16 v6 = j; while (1) { - bool v1 = __CFADD__uint16(R32, R36); - R36 += R32; + bool v1 = __CFADD__uint16(R32_, R36); + R36 += R32_; if (v1) break; j += 2; @@ -1139,23 +1164,23 @@ void XrayHdmaFunc_BeamAimedDDR(uint16 j) { // 0x91C2BD goto LABEL_12; } } - IndirWriteWord(&R0_, j, *(uint16 *)((char *)&R36 + 1)); + IndirWriteWord(R0_, j, *(uint16 *)((char *)&R36 + 1)); uint16 v2; v2 = j + 2; if ((int16)(v2 - 460) < 0) { R18_ = v2 - 4; while (1) { - bool v1 = __CFADD__uint16(R32, R36); - R36 += R32; + bool v1 = __CFADD__uint16(R32_, R36); + R36 += R32_; if (v1) break; - IndirWriteWord(&R0_, v2, *(uint16 *)((char *)&R36 + 1)); + IndirWriteWord(R0_, v2, *(uint16 *)((char *)&R36 + 1)); v2 += 2; if ((int16)(v2 - 460) >= 0) goto LABEL_12; } do { - IndirWriteWord(&R0_, v2, 0xFF); + IndirWriteWord(R0_, v2, 0xFF); v2 += 2; } while ((int16)(v2 - 460) < 0); } else { @@ -1164,8 +1189,8 @@ void XrayHdmaFunc_BeamAimedDDR(uint16 j) { // 0x91C2BD LABEL_12:; uint16 v3 = v6 + 1; while (1) { - bool v1 = __CFADD__uint16(g_word_7E001E, R34); - R34 += g_word_7E001E; + bool v1 = __CFADD__uint16(R30_, R34); + R34 += R30_; if (v1) break; v3 += 2; @@ -1174,23 +1199,23 @@ LABEL_12:; goto LABEL_23; } } - IndirWriteByte(&R0_, v3, HIBYTE(R34)); + IndirWriteByte(R0_, v3, HIBYTE(R34)); uint16 v4; v4 = v3 + 2; if ((int16)(v4 - 460) < 0) { R20_ = v4 - 4; while (1) { - bool v1 = __CFADD__uint16(g_word_7E001E, R34); - R34 += g_word_7E001E; + bool v1 = __CFADD__uint16(R30_, R34); + R34 += R30_; if (v1) break; - IndirWriteByte(&R0_, v4, HIBYTE(R34)); + IndirWriteByte(R0_, v4, HIBYTE(R34)); v4 += 2; if ((int16)(v4 - 460) >= 0) goto LABEL_23; } do { - IndirWriteByte(&R0_, v4, 0xFF); + IndirWriteByte(R0_, v4, 0xFF); v4 += 2; } while ((int16)(v4 - 460) < 0); } else { @@ -1199,7 +1224,7 @@ LABEL_12:; LABEL_23:; uint16 v5 = R18_; do { - IndirWriteByte(&R0_, v5, 0); + IndirWriteByte(R0_, v5, 0); v5 -= 2; } while ((int16)(v5 - R20_) >= 0); R18_ = R20_ - 1; @@ -1207,10 +1232,10 @@ LABEL_23:; void XrayHdmaFunc_BeamAimedDD(uint16 j) { // 0x91C381 uint16 v5 = j; - if (R32) { + if (R32_) { while (1) { - bool v1 = R36 >= R32; - R36 -= R32; + bool v1 = R36 >= R32_; + R36 -= R32_; if (!v1) break; j += 2; @@ -1219,22 +1244,22 @@ void XrayHdmaFunc_BeamAimedDD(uint16 j) { // 0x91C381 goto LABEL_15; } } - IndirWriteWord(&R0_, j, *(uint16 *)((char *)&R36 + 1)); + IndirWriteWord(R0_, j, *(uint16 *)((char *)&R36 + 1)); uint16 v2 = j + 2; if ((int16)(v2 - 460) < 0) { R18_ = v2 - 4; while (1) { - bool v1 = R36 >= R32; - R36 -= R32; + bool v1 = R36 >= R32_; + R36 -= R32_; if (!v1) break; - IndirWriteWord(&R0_, v2, *(uint16 *)((char *)&R36 + 1)); + IndirWriteWord(R0_, v2, *(uint16 *)((char *)&R36 + 1)); v2 += 2; if ((int16)(v2 - 460) >= 0) goto LABEL_15; } do { - IndirWriteWord(&R0_, v2, 0); + IndirWriteWord(R0_, v2, 0); v2 += 2; } while ((int16)(v2 - 460) < 0); } else { @@ -1243,15 +1268,15 @@ void XrayHdmaFunc_BeamAimedDD(uint16 j) { // 0x91C381 } else { R18_ = j; do { - IndirWriteWord(&R0_, j, 0); + IndirWriteWord(R0_, j, 0); j += 2; } while ((int16)(j - 460) < 0); } LABEL_15:; uint16 v3 = v5 + 1; while (1) { - bool v1 = __CFADD__uint16(g_word_7E001E, R34); - R34 += g_word_7E001E; + bool v1 = __CFADD__uint16(R30_, R34); + R34 += R30_; if (v1) break; v3 += 2; @@ -1260,22 +1285,22 @@ LABEL_15:; return; } } - IndirWriteByte(&R0_, v3, HIBYTE(R34)); + IndirWriteByte(R0_, v3, HIBYTE(R34)); uint16 v4 = v3 + 2; if ((int16)(v4 - 460) < 0) { R20_ = v4 - 4; while (1) { - bool v1 = __CFADD__uint16(g_word_7E001E, R34); - R34 += g_word_7E001E; + bool v1 = __CFADD__uint16(R30_, R34); + R34 += R30_; if (v1) break; - IndirWriteByte(&R0_, v4, HIBYTE(R34)); + IndirWriteByte(R0_, v4, HIBYTE(R34)); v4 += 2; if ((int16)(v4 - 460) >= 0) return; } do { - IndirWriteByte(&R0_, v4, 0xFF); + IndirWriteByte(R0_, v4, 0xFF); v4 += 2; } while ((int16)(v4 - 460) < 0); } else { @@ -1286,8 +1311,8 @@ LABEL_15:; void XrayHdmaFunc_BeamAimedDDL(uint16 j) { // 0x91C446 uint16 v6 = j; while (1) { - bool v1 = R36 >= R32; - R36 -= R32; + bool v1 = R36 >= R32_; + R36 -= R32_; if (!v1) break; j += 2; @@ -1296,23 +1321,23 @@ void XrayHdmaFunc_BeamAimedDDL(uint16 j) { // 0x91C446 goto LABEL_12; } } - IndirWriteWord(&R0_, j, *(uint16 *)((char *)&R36 + 1)); + IndirWriteWord(R0_, j, *(uint16 *)((char *)&R36 + 1)); uint16 v2; v2 = j + 2; if ((int16)(v2 - 460) < 0) { R18_ = v2 - 4; while (1) { - bool v1 = R36 >= R32; - R36 -= R32; + bool v1 = R36 >= R32_; + R36 -= R32_; if (!v1) break; - IndirWriteWord(&R0_, v2, *(uint16 *)((char *)&R36 + 1)); + IndirWriteWord(R0_, v2, *(uint16 *)((char *)&R36 + 1)); v2 += 2; if ((int16)(v2 - 460) >= 0) goto LABEL_12; } do { - IndirWriteWord(&R0_, v2, 0); + IndirWriteWord(R0_, v2, 0); v2 += 2; } while ((int16)(v2 - 460) < 0); } else { @@ -1321,8 +1346,8 @@ void XrayHdmaFunc_BeamAimedDDL(uint16 j) { // 0x91C446 LABEL_12:; uint16 v3 = v6 + 1; while (1) { - bool v1 = R34 >= g_word_7E001E; - R34 -= g_word_7E001E; + bool v1 = R34 >= R30_; + R34 -= R30_; if (!v1) break; v3 += 2; @@ -1331,23 +1356,23 @@ LABEL_12:; goto LABEL_23; } } - IndirWriteByte(&R0_, v3, HIBYTE(R34)); + IndirWriteByte(R0_, v3, HIBYTE(R34)); uint16 v4; v4 = v3 + 2; if ((int16)(v4 - 460) < 0) { R20_ = v4 - 4; while (1) { - bool v1 = R34 >= g_word_7E001E; - R34 -= g_word_7E001E; + bool v1 = R34 >= R30_; + R34 -= R30_; if (!v1) break; - IndirWriteByte(&R0_, v4, HIBYTE(R34)); + IndirWriteByte(R0_, v4, HIBYTE(R34)); v4 += 2; if ((int16)(v4 - 460) >= 0) goto LABEL_23; } do { - IndirWriteByte(&R0_, v4, 0); + IndirWriteByte(R0_, v4, 0); v4 += 2; } while ((int16)(v4 - 460) < 0); } else { @@ -1356,7 +1381,7 @@ LABEL_12:; LABEL_23:; uint16 v5 = R20_; do { - IndirWriteByte(&R0_, v5, 0xFF); + IndirWriteByte(R0_, v5, 0xFF); v5 -= 2; } while ((int16)(v5 - R18_) >= 0); } @@ -1365,30 +1390,27 @@ void XrayHdmaFunc_BeamHoriz(void) { // 0x91C505 int16 v1; uint16 v0 = 2 * (R24_ - 1); - IndirWriteWord(&R0_, v0, 0xFF00); + IndirWriteWord(R0_, v0, 0xFF00); v1 = v0 - 2; do { - if (*(uint16 *)IndirPtr(&R0_, v1) == 255) + if (IndirReadWord(R0_, v1) == 255) break; - IndirWriteWord(&R0_, v1, 0xFF); + IndirWriteWord(R0_, v1, 0xFF); v1 -= 2; } while (v1 >= 0); uint16 v2 = 2 * R24_; do { - if (*(uint16 *)IndirPtr(&R0_, v2) == 255) + if (IndirReadWord(R0_, v2) == 255) break; - IndirWriteWord(&R0_, v2, 0xFF); + IndirWriteWord(R0_, v2, 0xFF); v2 += 2; } while ((int16)(v2 - 460) < 0); } void CalculateXrayHdmaTable_OriginOnScreen(uint16 k, uint16 j) { // 0x91C54B - int16 v2; - uint16 v3; + int v3; - LOBYTE(v2) = HIBYTE(k); - HIBYTE(v2) = k; - R22_ = v2 & 0xFF00; + R22_ = k << 8; R24_ = j; R26_ = R18_ - R20_; R26_ += (R26_ & 0x8000u) != 0 ? 0x100 : 0; @@ -1423,11 +1445,11 @@ LABEL_16:; uint16 v4 = R26_; if (!sign16(R26_ - 128)) v4 = R26_ - 128; - g_word_7E001E = kTanTable[v4]; + R30_ = kTanTable[v4]; uint16 v5 = R28_; if (!sign16(R28_ - 128)) v5 = R28_ - 128; - R32 = kTanTable[v5]; + R32_ = kTanTable[v5]; grapple_beam_unkD1E = 0; static Func_V *const kXrayHdmaOnScreen_Funcs[5] = { XrayHdmaOnScreen_BeamAimedR, @@ -1444,38 +1466,38 @@ void XrayHdmaOnScreen_BeamAimedR(void) { // 0x91C5FF int16 v1; uint16 v0 = 2 * (R24_ - 1); - IndirWriteWord(&R0_, v0, HIBYTE(R22_) | 0xFF00); + IndirWriteWord(R0_, v0, HIBYTE(R22_) | 0xFF00); v1 = v0 - 2; R34 = R22_; R36 = R22_; while (1) { - bool v2 = __CFADD__uint16(g_word_7E001E, R34); - R34 += g_word_7E001E; + bool v2 = __CFADD__uint16(R30_, R34); + R34 += R30_; if (v2) break; - IndirWriteWord(&R0_, v1, HIBYTE(R34) | 0xFF00); + IndirWriteWord(R0_, v1, HIBYTE(R34) | 0xFF00); v1 -= 2; if (v1 < 0) goto LABEL_6; } do { - IndirWriteWord(&R0_, v1, 0xFF); + IndirWriteWord(R0_, v1, 0xFF); v1 -= 2; } while (v1 >= 0); LABEL_6:; uint16 v3 = 2 * R24_; while (1) { - bool v2 = __CFADD__uint16(R32, R36); - R36 += R32; + bool v2 = __CFADD__uint16(R32_, R36); + R36 += R32_; if (v2) break; - IndirWriteWord(&R0_, v3, HIBYTE(R36) | 0xFF00); + IndirWriteWord(R0_, v3, HIBYTE(R36) | 0xFF00); v3 += 2; if ((int16)(v3 - 460) >= 0) return; } do { - IndirWriteWord(&R0_, v3, 0xFF); + IndirWriteWord(R0_, v3, 0xFF); v3 += 2; } while ((int16)(v3 - 460) < 0); } @@ -1484,46 +1506,46 @@ void XrayHdmaOnScreen_BeamAimedL(void) { // 0x91C660 int16 v1; uint16 v0 = 2 * (R24_ - 1); - IndirWriteWord(&R0_, v0, R22_ & 0xFF00); + IndirWriteWord(R0_, v0, R22_ & 0xFF00); v1 = v0 - 2; R34 = R22_; R36 = R22_; while (1) { - bool v2 = R36 >= R32; - R36 -= R32; + bool v2 = R36 >= R32_; + R36 -= R32_; if (!v2) break; - IndirWriteWord(&R0_, v1, R36 & 0xFF00); + IndirWriteWord(R0_, v1, R36 & 0xFF00); v1 -= 2; if (v1 < 0) goto LABEL_6; } do { - IndirWriteWord(&R0_, v1, 0xFF); + IndirWriteWord(R0_, v1, 0xFF); v1 -= 2; } while (v1 >= 0); LABEL_6:; uint16 v3 = 2 * R24_; while (1) { - bool v2 = R34 >= g_word_7E001E; - R34 -= g_word_7E001E; + bool v2 = R34 >= R30_; + R34 -= R30_; if (!v2) break; - IndirWriteWord(&R0_, v3, R34 & 0xFF00); + IndirWriteWord(R0_, v3, R34 & 0xFF00); v3 += 2; if ((int16)(v3 - 460) >= 0) return; } do { - IndirWriteWord(&R0_, v3, 0xFF); + IndirWriteWord(R0_, v3, 0xFF); v3 += 2; } while ((int16)(v3 - 460) < 0); } void XrayHdmaOnScreen_BeamAimedU(void) { // 0x91C6C1 uint16 v0 = 2 * (R24_ - 1); - IndirWriteByte(&R0_, v0++, HIBYTE(R22_)); - IndirWriteByte(&R0_, v0, HIBYTE(R22_)); + IndirWriteByte(R0_, v0++, HIBYTE(R22_)); + IndirWriteByte(R0_, v0, HIBYTE(R22_)); uint16 v1 = v0 - 3; uint16 v2; R34 = R22_; @@ -1543,9 +1565,9 @@ void XrayHdmaOnScreen_BeamAimedU(void) { // 0x91C6C1 off_91C716[v2 >> 1](v1); uint16 v3 = 2 * R24_; do { - if (*(uint16 *)IndirPtr(&R0_, v3) == 255) + if (IndirReadWord(R0_, v3) == 255) break; - IndirWriteWord(&R0_, v3, 0xFF); + IndirWriteWord(R0_, v3, 0xFF); v3 += 2; } while ((int16)(v3 - 460) < 0); } @@ -1556,39 +1578,39 @@ void XrayHdmaOnScreen_BeamAimedUUR(uint16 v0) { // 0x91C71C v4 = v0; while (1) { - bool v1 = __CFADD__uint16(g_word_7E001E, R34); - R34 += g_word_7E001E; + bool v1 = __CFADD__uint16(R30_, R34); + R34 += R30_; if (v1) break; - IndirWriteByte(&R0_, v0, HIBYTE(R34)); + IndirWriteByte(R0_, v0, HIBYTE(R34)); v0 -= 2; if ((v0 & 0x8000u) != 0) goto LABEL_7; } grapple_beam_unkD1E = v0; do { - IndirWriteByte(&R0_, v0, 0xFF); + IndirWriteByte(R0_, v0, 0xFF); v0 -= 2; } while ((v0 & 0x8000u) == 0); LABEL_7: v2 = v4 + 1; while (1) { - bool v1 = __CFADD__uint16(R32, R36); - R36 += R32; + bool v1 = __CFADD__uint16(R32_, R36); + R36 += R32_; if (v1) break; - IndirWriteByte(&R0_, v2, HIBYTE(R36)); + IndirWriteByte(R0_, v2, HIBYTE(R36)); v2 -= 2; if (v2 < 0) return; } do { - IndirWriteByte(&R0_, v2, 0xFF); + IndirWriteByte(R0_, v2, 0xFF); v2 -= 2; } while (v2 >= 0); if (grapple_beam_unkD1E) { for (int i = grapple_beam_unkD1E - 2; i >= 0; i -= 2) - IndirWriteWord(&R0_, i, 0xFF); + IndirWriteWord(R0_, i, 0xFF); } } @@ -1598,33 +1620,33 @@ void XrayHdmaOnScreen_BeamAimedUU(uint16 v0) { // 0x91C77F v3 = v0; while (1) { - bool v1 = R34 >= g_word_7E001E; - R34 -= g_word_7E001E; + bool v1 = R34 >= R30_; + R34 -= R30_; if (!v1) break; - IndirWriteByte(&R0_, v0, HIBYTE(R34)); + IndirWriteByte(R0_, v0, HIBYTE(R34)); v0 -= 2; if (v0 < 0) goto LABEL_6; } do { - IndirWriteByte(&R0_, v0, 0); + IndirWriteByte(R0_, v0, 0); v0 -= 2; } while (v0 >= 0); LABEL_6: v2 = v3 + 1; while (1) { - bool v1 = __CFADD__uint16(R32, R36); - R36 += R32; + bool v1 = __CFADD__uint16(R32_, R36); + R36 += R32_; if (v1) break; - IndirWriteByte(&R0_, v2, HIBYTE(R36)); + IndirWriteByte(R0_, v2, HIBYTE(R36)); v2 -= 2; if (v2 < 0) return; } do { - IndirWriteByte(&R0_, v2, 0xFF); + IndirWriteByte(R0_, v2, 0xFF); v2 -= 2; } while (v2 >= 0); } @@ -1636,39 +1658,39 @@ void XrayHdmaOnScreen_BeamAimedUUL(uint16 j) { // 0x91C7CB uint16 v4 = j; while (1) { - bool v1 = R34 >= g_word_7E001E; - R34 -= g_word_7E001E; + bool v1 = R34 >= R30_; + R34 -= R30_; if (!v1) break; - IndirWriteByte(&R0_, j, HIBYTE(R34)); + IndirWriteByte(R0_, j, HIBYTE(R34)); j -= 2; if ((j & 0x8000u) != 0) goto LABEL_6; } do { - IndirWriteByte(&R0_, j, 0); + IndirWriteByte(R0_, j, 0); j -= 2; } while ((j & 0x8000u) == 0); LABEL_6: v2 = v4 + 1; while (1) { - bool v1 = R36 >= R32; - R36 -= R32; + bool v1 = R36 >= R32_; + R36 -= R32_; if (!v1) break; - IndirWriteByte(&R0_, v2, HIBYTE(R36)); + IndirWriteByte(R0_, v2, HIBYTE(R36)); v2 -= 2; if (v2 < 0) return; } v5 = v2; do { - IndirWriteByte(&R0_, v2, 0); + IndirWriteByte(R0_, v2, 0); v2 -= 2; } while (v2 >= 0); v3 = v5 - 1; do { - IndirWriteByte(&R0_, v3, 0xFF); + IndirWriteByte(R0_, v3, 0xFF); v3 -= 2; } while (v3 >= 0); } @@ -1678,8 +1700,8 @@ void XrayHdmaOnScreen_BeamAimedD(void) { // 0x91C822 uint16 v2; uint16 v0 = 2 * (R24_ - 1); - IndirWriteByte(&R0_, v0++, HIBYTE(R22_)); - IndirWriteByte(&R0_, v0, HIBYTE(R22_)); + IndirWriteByte(R0_, v0++, HIBYTE(R22_)); + IndirWriteByte(R0_, v0, HIBYTE(R22_)); uint16 v1 = v0 + 1; R34 = R22_; R36 = R22_; @@ -1698,9 +1720,9 @@ void XrayHdmaOnScreen_BeamAimedD(void) { // 0x91C822 off_91C874[v2 >> 1](v1); v3 = 2 * (R24_ - 2); do { - if (*(uint16 *)IndirPtr(&R0_, v3) == 255) + if (IndirReadWord(R0_, v3) == 255) break; - IndirWriteWord(&R0_, v3, 0xFF); + IndirWriteWord(R0_, v3, 0xFF); v3 -= 2; } while (v3 >= 0); } @@ -1708,41 +1730,41 @@ void XrayHdmaOnScreen_BeamAimedD(void) { // 0x91C822 void XrayHdmaOnScreen_BeamAimedDDR(uint16 j) { // 0x91C87A uint16 v4 = j; while (1) { - bool v1 = __CFADD__uint16(R32, R36); - R36 += R32; + bool v1 = __CFADD__uint16(R32_, R36); + R36 += R32_; if (v1) break; - IndirWriteWord(&R0_, j, *(uint16 *)((char *)&R36 + 1)); + IndirWriteWord(R0_, j, *(uint16 *)((char *)&R36 + 1)); j += 2; if ((int16)(j - 460) >= 0) goto LABEL_7; } grapple_beam_unkD1E = j; do { - IndirWriteWord(&R0_, j, 0xFF); + IndirWriteWord(R0_, j, 0xFF); j += 2; } while ((int16)(j - 460) < 0); LABEL_7:; uint16 v2 = v4 + 1; while (1) { - bool v1 = __CFADD__uint16(g_word_7E001E, R34); - R34 += g_word_7E001E; + bool v1 = __CFADD__uint16(R30_, R34); + R34 += R30_; if (v1) break; - IndirWriteByte(&R0_, v2, HIBYTE(R34)); + IndirWriteByte(R0_, v2, HIBYTE(R34)); v2 += 2; if ((int16)(v2 - 460) >= 0) return; } do { - IndirWriteByte(&R0_, v2, 0xFF); + IndirWriteByte(R0_, v2, 0xFF); v2 += 2; } while ((int16)(v2 - 460) < 0); if (grapple_beam_unkD1E) { uint16 v3 = grapple_beam_unkD1E + 2; if ((int16)(grapple_beam_unkD1E - 458) < 0) { do { - IndirWriteWord(&R0_, v3, 0xFF); + IndirWriteWord(R0_, v3, 0xFF); v3 += 2; } while ((int16)(v3 - 460) < 0); } @@ -1752,33 +1774,33 @@ LABEL_7:; void XrayHdmaOnScreen_BeamAimedDD(uint16 j) { // 0x91C8E8 uint16 v3 = j; while (1) { - bool v1 = R36 >= R32; - R36 -= R32; + bool v1 = R36 >= R32_; + R36 -= R32_; if (!v1) break; - IndirWriteWord(&R0_, j, *(uint16 *)((char *)&R36 + 1)); + IndirWriteWord(R0_, j, *(uint16 *)((char *)&R36 + 1)); j += 2; if ((int16)(j - 460) >= 0) goto LABEL_6; } do { - IndirWriteWord(&R0_, j, 0); + IndirWriteWord(R0_, j, 0); j += 2; } while ((int16)(j - 460) < 0); LABEL_6:; uint16 v2 = v3 + 1; while (1) { - bool v1 = __CFADD__uint16(g_word_7E001E, R34); - R34 += g_word_7E001E; + bool v1 = __CFADD__uint16(R30_, R34); + R34 += R30_; if (v1) break; - IndirWriteByte(&R0_, v2, HIBYTE(R34)); + IndirWriteByte(R0_, v2, HIBYTE(R34)); v2 += 2; if ((int16)(v2 - 460) >= 0) return; } do { - IndirWriteByte(&R0_, v2, 0xFF); + IndirWriteByte(R0_, v2, 0xFF); v2 += 2; } while ((int16)(v2 - 460) < 0); } @@ -1786,39 +1808,39 @@ LABEL_6:; void XrayHdmaOnScreen_BeamAimedDDL(uint16 j) { // 0x91C939 uint16 v4 = j; while (1) { - bool v1 = R36 >= R32; - R36 -= R32; + bool v1 = R36 >= R32_; + R36 -= R32_; if (!v1) break; - IndirWriteWord(&R0_, j, *(uint16 *)((char *)&R36 + 1)); + IndirWriteWord(R0_, j, *(uint16 *)((char *)&R36 + 1)); j += 2; if ((int16)(j - 460) >= 0) goto LABEL_6; } do { - IndirWriteWord(&R0_, j, 0); + IndirWriteWord(R0_, j, 0); j += 2; } while ((int16)(j - 460) < 0); LABEL_6:; uint16 v2 = v4 + 1; while (1) { - bool v1 = R34 >= g_word_7E001E; - R34 -= g_word_7E001E; + bool v1 = R34 >= R30_; + R34 -= R30_; if (!v1) break; - IndirWriteByte(&R0_, v2, HIBYTE(R34)); + IndirWriteByte(R0_, v2, HIBYTE(R34)); v2 += 2; if ((int16)(v2 - 460) >= 0) return; } uint16 v5 = v2; do { - IndirWriteByte(&R0_, v2, 0); + IndirWriteByte(R0_, v2, 0); v2 += 2; } while ((int16)(v2 - 460) < 0); uint16 v3 = v5 - 1; do { - IndirWriteByte(&R0_, v3, 0xFF); + IndirWriteByte(R0_, v3, 0xFF); v3 += 2; } while ((int16)(v3 - 460) < 0); } @@ -1828,23 +1850,22 @@ void XrayHdmaOnScreen_BeamHoriz(void) { // 0x91C998 uint16 v0 = 2 * (R24_ - 1); if (R18_ == 64) - IndirWriteWord(&R0_, v0, HIBYTE(R22_) | 0xFF00); + IndirWriteWord(R0_, v0, HIBYTE(R22_) | 0xFF00); else - IndirWriteWord(&R0_, v0, R22_ & 0xFF00); + IndirWriteWord(R0_, v0, R22_ & 0xFF00); v1 = v0 - 2; do { - IndirWriteWord(&R0_, v1, 0xFF); + IndirWriteWord(R0_, v1, 0xFF); v1 -= 2; } while (v1 >= 0); uint16 v2 = 2 * R24_; do { - IndirWriteWord(&R0_, v2, 0xFF); + IndirWriteWord(R0_, v2, 0xFF); v2 += 2; } while ((int16)(v2 - 460) < 0); } void XrayRunHandler(void) { // 0x91CAD6 -#define unk_91CAF2 (*(SpawnHdmaObject_Args*)RomPtr(0x91caf2)) if (!time_is_frozen_flag && (button_config_run_b & joypad1_lastkeys) != 0) { if (Xray_Initialize() & 1) SpawnHdmaObject(0x91, &unk_91CAF2); @@ -1901,14 +1922,14 @@ void Xray_SetupStage4(void) { // 0x91CB8E R18_ = 16; R26_ = R24_ & 0x7E0; R28_ = R24_ & 0x1F; - g_word_7E001E = 0; + R30_ = 0; do { - if (!sign16(g_word_7E001E + R28_ - 32)) { + if (!sign16(R30_ + R28_ - 32)) { R26_ = (R26_ + 1024) & 0x7E0; R28_ = 0; - g_word_7E001E = 0; + R30_ = 0; } - uint16 v0 = g_word_7E001E + R28_ + R26_; + uint16 v0 = R30_ + R28_ + R26_; uint16 v11 = ram4000.xray_tilemaps[v0 + 4096]; uint16 v10 = ram4000.xray_tilemaps[v0 + 4097]; uint16 v9 = ram4000.xray_tilemaps[v0 + 4128]; @@ -1920,11 +1941,11 @@ void Xray_SetupStage4(void) { // 0x91CB8E *(uint16 *)((char *)&ram4000.xray_tilemaps[1] + v2) = v10; *(uint16 *)((char *)ram4000.xray_tilemaps + v2) = v11; R22_ += 4; - g_word_7E001E += 2; + R30_ += 2; --R18_; } while (R18_); Xray_SetupStage4_Func1(); - R32 = R24_ & 0x400; + R32_ = R24_ & 0x400; R24_ = (R24_ & 0x400) + ((R24_ + 64) & 0x3FF); R22_ += 64; --R20_; @@ -1963,13 +1984,13 @@ void Xray_SetupStage4(void) { // 0x91CB8E void Xray_SetupStage4_Func1(void) { // 0x91CCF1 int16 v0; - R32 = R26_; - v0 = g_word_7E001E + R28_; - if (!sign16(g_word_7E001E + R28_ - 32)) { - R32 = (R32 + 1024) & 0x7E0; + R32_ = R26_; + v0 = R30_ + R28_; + if (!sign16(R30_ + R28_ - 32)) { + R32_ = (R32_ + 1024) & 0x7E0; v0 = 0; } - uint16 v1 = R32 + v0; + uint16 v1 = R32_ + v0; uint16 v6 = ram4000.xray_tilemaps[v1 + 4096]; uint16 v5 = ram4000.xray_tilemaps[v1 + 4097]; uint16 v4 = ram4000.xray_tilemaps[v1 + 4128]; @@ -2029,7 +2050,6 @@ uint16 Xray_Func21(uint16 j) { // 0x91CDCB return j; } -#define stru_91D2D6 ((XrayBlockData*)RomPtr(0x91d2d6)) PairU16 Xray_HandleXrayedBlock(uint16 k) { // 0x91CDD6 uint16 value; @@ -2143,7 +2163,6 @@ void Xray_Func6C(void) { // 0x91CED0 Xray_Func20(); } -#define stru_91D2D6 ((XrayBlockData*)RomPtr(0x91d2d6)) void Xray_Func20(void) { // 0x91CEFD int i; @@ -2225,7 +2244,7 @@ uint16 Xray_Func11(uint16 j) { // 0x91CF6F } void Xray_Func12(uint16 j) { // 0x91CFBF - uint8 *v1 = RomPtr_91(R3_.addr); + const uint8 *v1 = RomPtr_91(R3_.addr); Xray_Func13(*(uint16 *)&v1[j]); } @@ -2370,10 +2389,10 @@ void Xray_SetupStage7(void) { // 0x91D1A0 v1->vram_dst = ((reg_BG2SC & 0xFC) << 8) + 1024; vram_write_queue_tail = v0 + 7; } - mov24((LongPtr *)&demo_enable, 0x9800E4); - mov24((LongPtr *)((char *)&demo_num_input_frames + 1), 0x98C8E4); - mov24((LongPtr *)&demo_input_prev_new, 0x999098); - *(uint16 *)((char *)&demo_backup_prev_controller_input + 1) = 0; + mov24(&hdma_ptr_1, 0x9800E4); + mov24(&hdma_ptr_2, 0x98C8E4); + mov24(&hdma_ptr_3, 0x999098); + hdma_var_1 = 0; demo_input_pre_instr = 0; demo_input_instr_timer = 0; demo_input_instr_ptr = 0; @@ -2386,7 +2405,7 @@ void Xray_SetupStage7(void) { // 0x91D1A0 } void HdmaobjPreInstr_XraySetup(uint16 k) { // 0x91D27F - int16 v1; + uint16 v1; v1 = 4096; if (fx_type == 36) { @@ -2410,10 +2429,6 @@ void Xray_SetupStage8_SetBackdropColor(void) { // 0x91D2BC palette_buffer[0] = 3171; } -void sub_91D2D1(void) { // 0x91D2D1 - ; -} - void GameState_28_Unused_(void) { // 0x91D4DA Unreachable(); } @@ -2509,13 +2524,12 @@ void InitializeSuitPickupHdma(void) { // 0x91D692 reg_COLDATA[0] = suit_pickup_color_math_R; reg_COLDATA[1] = suit_pickup_color_math_G; reg_COLDATA[2] = suit_pickup_color_math_B; - mov24((LongPtr *)&demo_enable, 0x9800E4); - mov24((LongPtr *)((char *)&demo_num_input_frames + 1), 0x98C8E4); - mov24((LongPtr *)&demo_input_prev_new, 0x999098); - *(uint16 *)((char *)&demo_backup_prev_controller_input + 1) = 0; + mov24(&hdma_ptr_1, 0x9800E4); + mov24(&hdma_ptr_2, 0x98C8E4); + mov24(&hdma_ptr_3, 0x999098); + hdma_var_1 = 0; } -#define off_91D727 ((uint16*)RomPtr(0x91d727)) static Func_U8 *const off_91D72D[11] = { // 0x91D6F7 Samus_HandleScrewAttackSpeedBoostingPals, @@ -2539,9 +2553,7 @@ void Samus_HandlePalette(void) { } HandleMiscSamusPalette(); } -#define kSamusPalette_HyperBeam ((uint16*)RomPtr(0x91d829)) -#define kSamusPalette_NonPseudoScrew ((uint16*)RomPtr(0x91d7d5)) -#define kSamusPalette_PseudoScrew ((uint16*)RomPtr(0x91d7ff)) + uint8 HandleBeamChargePalettes(void) { // 0x91D743 if (charged_shot_glow_timer) { if (hyper_beam_flag) { @@ -2550,7 +2562,7 @@ uint8 HandleBeamChargePalettes(void) { // 0x91D743 charged_shot_glow_timer = 0; return 1; } - CopyToSamusSuitPalette(kSamusPalette_HyperBeam[(uint8)(charged_shot_glow_timer & 0x1E) >> 1]); + CopyToSamusSuitPalette(kSamusPalette_HyperBeam[(charged_shot_glow_timer & 0x1E) >> 1]); } --charged_shot_glow_timer; return 0; @@ -2562,15 +2574,14 @@ uint8 HandleBeamChargePalettes(void) { // 0x91D743 } else { return 1; } - } else if (grapple_beam_function == (uint16)FUNC16(GrappleBeamFunc_Inactive) + } else if (grapple_beam_function == FUNC16(GrappleBeamFunc_Inactive) && flare_counter && !sign16(flare_counter - 60)) { if (samus_contact_damage_index == 4) R36 = kSamusPalette_PseudoScrew[samus_suit_palette_index >> 1]; else R36 = kSamusPalette_NonPseudoScrew[samus_suit_palette_index >> 1]; - uint16 v0 = *(uint16 *)RomPtr_91(R36 + samus_charge_palette_index); - CopyToSamusSuitPalette(v0); + CopyToSamusSuitPalette(*(uint16 *)RomPtr_91(R36 + samus_charge_palette_index)); uint16 v1 = samus_charge_palette_index + 2; if (!sign16(samus_charge_palette_index - 10)) v1 = 0; @@ -2582,12 +2593,7 @@ uint8 HandleBeamChargePalettes(void) { // 0x91D743 } } -#define word_9BA3C0 ((uint16*)RomPtr(0x9ba3c0)) uint8 HandleVisorPalette(void) { // 0x91D83F - int16 v2; - uint16 v3; - char v4; // t0 - if (timer_for_shine_timer == 8) return 0; if (fx_layer_blending_config_a == 40 || fx_layer_blending_config_a == 42) { @@ -2597,13 +2603,10 @@ uint8 HandleVisorPalette(void) { // 0x91D83F return 0; samus_visor_palette_timer_index = v1 | 5; palette_buffer[196] = word_9BA3C0[HIBYTE(v1) >> 1]; - v2 = HIBYTE(v1) + 2; + int v2 = HIBYTE(v1) + 2; if (sign16(v2 - 12)) { - v4 = v2; - LOBYTE(v3) = HIBYTE(v2); - HIBYTE(v3) = v4; - R18_ = v3; - samus_visor_palette_timer_index = v3 | (uint8)samus_visor_palette_timer_index; + R18_ = swap16(v2); + samus_visor_palette_timer_index = R18_ | (uint8)samus_visor_palette_timer_index; } else { samus_visor_palette_timer_index = (uint8)samus_visor_palette_timer_index | 0x600; } @@ -2614,8 +2617,6 @@ uint8 HandleVisorPalette(void) { // 0x91D83F } } -#define kSamus_SpeedBoostingPalettes ((uint16*)RomPtr(0x91d998)) -#define kSamus_HyperBeamPalettes ((uint16*)RomPtr(0x91d99e)) void HandleMiscSamusPalette(void) { // 0x91D8A5 if (!samus_special_super_palette_flags) { @@ -2624,7 +2625,7 @@ void HandleMiscSamusPalette(void) { // 0x91D8A5 return; if (samus_hurt_flash_counter == 2) { if (!cinematic_function - && (frame_handler_beta != (uint16)FUNC16(j_HandleDemoRecorder_2_0) + && (frame_handler_beta != FUNC16(j_HandleDemoRecorder_2_0) || samus_pose != kPose_54_FaceL_Knockback)) { QueueSfx1_Max6(0x35u); goto LABEL_14; @@ -2646,7 +2647,7 @@ LABEL_17:; uint16 v1 = samus_hurt_flash_counter + 1; samus_hurt_flash_counter = v1; if (v1 == 40) { - if (grapple_beam_function == (uint16)FUNC16(GrappleBeamFunc_Inactive)) { + if (grapple_beam_function == FUNC16(GrappleBeamFunc_Inactive)) { if (samus_movement_type == kMovementType_03_SpinJumping || samus_movement_type == kMovementType_14_WallJumping) { CallSomeSamusCode(0x1Cu); } else if (!sign16(flare_counter - 16) && (button_config_shoot_x & joypad1_lastkeys) != 0) { @@ -2677,8 +2678,6 @@ LABEL_17:; } } -#define kSamusPal_ScrewAttack ((uint16*)RomPtr(0x91da4a)) -#define kSamusPal_SpeedBoost ((uint16*)RomPtr(0x91daa9)) uint8 Samus_HandleScrewAttackSpeedBoostingPals(void) { // 0x91D9B2 if ((samus_suit_palette_index & 4) == 0) { @@ -2738,7 +2737,6 @@ LABEL_10: return 1; } -#define kSamusPal_SpeedBoostShine ((uint16*)RomPtr(0x91db10)) uint8 Samus_SpeedBoosterShinePals(void) { // 0x91DAC7 uint16 v0 = samus_shine_timer; @@ -2764,7 +2762,6 @@ uint8 Samus_SpeedBoosterShinePals(void) { // 0x91DAC7 } } -#define kSamusPal_Shinespark ((uint16*)RomPtr(0x91db75)) uint8 Samus_HandleShinesparkingPals(void) { // 0x91DB3A bool v0 = (--samus_shine_timer & 0x8000u) != 0; if (!samus_shine_timer || v0) { @@ -2783,8 +2780,6 @@ uint8 Samus_HandleShinesparkingPals(void) { // 0x91DB3A } } -#define stru_91DC00 ((SamusCrystalFlashPalTable*)RomPtr(0x91dc00)) -#define off_91DC28 ((uint16*)RomPtr(0x91dc28)) uint8 Samus_HandleCrystalFlashPals(void) { // 0x91DB93 if ((samus_shine_timer & 0x8000u) != 0) { WriteBeamPalette_A(equipped_beams); @@ -2816,27 +2811,11 @@ uint8 Samus_HandleCrystalFlashPals(void) { // 0x91DB93 } void Samus_Copy10PalColors(uint16 v0) { // 0x91DC34 - uint16 *v1 = (uint16 *)RomPtr_9B(v0); - palette_buffer[224] = *v1; - palette_buffer[225] = v1[1]; - palette_buffer[226] = v1[2]; - palette_buffer[227] = v1[3]; - palette_buffer[228] = v1[4]; - palette_buffer[229] = v1[5]; - palette_buffer[230] = v1[6]; - palette_buffer[231] = v1[7]; - palette_buffer[232] = v1[8]; - palette_buffer[233] = v1[9]; + memcpy(&palette_buffer[224], RomPtr_9B(v0), 20); } void Samus_Copy6PalColors(uint16 j) { // 0x91DC82 - uint16 *v1 = (uint16 *)RomPtr_9B(j); - palette_buffer[234] = *v1; - palette_buffer[235] = v1[1]; - palette_buffer[236] = v1[2]; - palette_buffer[237] = v1[3]; - palette_buffer[238] = v1[4]; - palette_buffer[239] = v1[5]; + memcpy(&palette_buffer[234], RomPtr_9B(j), 12); } uint8 Samus_HandleXrayPals(void) { // 0x91DCB4 @@ -2880,43 +2859,11 @@ uint8 nullsub_164(void) { // 0x91DD31 } void CopyToSamusSuitPalette(uint16 k) { // 0x91DD5B - uint16 *v1 = (uint16 *)RomPtr_9B(k); - palette_buffer[192] = *v1; - palette_buffer[193] = v1[1]; - palette_buffer[194] = v1[2]; - palette_buffer[195] = v1[3]; - palette_buffer[196] = v1[4]; - palette_buffer[197] = v1[5]; - palette_buffer[198] = v1[6]; - palette_buffer[199] = v1[7]; - palette_buffer[200] = v1[8]; - palette_buffer[201] = v1[9]; - palette_buffer[202] = v1[10]; - palette_buffer[203] = v1[11]; - palette_buffer[204] = v1[12]; - palette_buffer[205] = v1[13]; - palette_buffer[206] = v1[14]; - palette_buffer[207] = v1[15]; + memcpy(&palette_buffer[192], (uint16 *)RomPtr_9B(k), 32); } void CopyToSamusSuitTargetPalette(uint16 k) { // 0x91DDD7 - uint16 *v1 = (uint16 *)RomPtr_9B(k); - target_palettes[192] = *v1; - target_palettes[193] = v1[1]; - target_palettes[194] = v1[2]; - target_palettes[195] = v1[3]; - target_palettes[196] = v1[4]; - target_palettes[197] = v1[5]; - target_palettes[198] = v1[6]; - target_palettes[199] = v1[7]; - target_palettes[200] = v1[8]; - target_palettes[201] = v1[9]; - target_palettes[202] = v1[10]; - target_palettes[203] = v1[11]; - target_palettes[204] = v1[12]; - target_palettes[205] = v1[13]; - target_palettes[206] = v1[14]; - target_palettes[207] = v1[15]; + memcpy(&target_palettes[192], (uint16 *)RomPtr_9B(k), 32); } void Samus_CancelSpeedBoost(void) { // 0x91DE53 @@ -3149,11 +3096,11 @@ uint8 Xray_Initialize(void) { // 0x91E16D DisablePLMs(); DisableAnimtiles(); DisablePaletteFx(); - mov24((LongPtr *)&demo_enable, 0x980001); + mov24(&hdma_ptr_1, 0x980001); *(uint16 *)((char *)&demo_num_input_frames + 1) = 0; demo_input_prev = -26424; - mov24((LongPtr *)&demo_input_prev_new, 0x999098); - *(uint16 *)((char *)&demo_backup_prev_controller_input + 1) = 0; + mov24(&hdma_ptr_3, 0x999098); + hdma_var_1 = 0; demo_input_pre_instr = 0; demo_input_instr_timer = 0; demo_input_instr_ptr = 0; @@ -3392,7 +3339,7 @@ void SamusFunc_E633(void) { speed_echo_ypos[0] = 0; speed_echo_ypos[1] = 0; } - if (grapple_beam_function == (uint16)FUNC16(GrappleBeamFunc_Inactive)) { + if (grapple_beam_function == FUNC16(GrappleBeamFunc_Inactive)) { if ((equipped_beams & 0x1000) != 0) { if (!sign16(flare_counter - 16)) QueueSfx1_Max6(0x41u); @@ -3515,7 +3462,7 @@ static Func_V *const kSamus_HandleTransFromBlockColl[6] = { // 0x91E8B6 void Samus_HandleTransFromBlockColl(void) { if (input_to_pose_calc) - kSamus_HandleTransFromBlockColl[(uint16)(2 * (uint8)input_to_pose_calc) >> 1](); + kSamus_HandleTransFromBlockColl[(uint8)input_to_pose_calc](); } void Samus_HandleTransFromBlockColl_3(void) { // 0x91E8D8 samus_new_pose = samus_pose; @@ -3527,7 +3474,6 @@ void Samus_HandleTransFromBlockColl_4(void) { // 0x91E8E5 samus_momentum_routine_index = 5; } -#define word_91E921 ((uint16*)RomPtr(0x91e921)) uint8 nullsub_18_U8(void) { return 0; @@ -3556,13 +3502,12 @@ void Samus_HandleTransFromBlockColl_2(void) { void Samus_HandleTransFromBlockColl_1(void) { // 0x91E931 if (HIBYTE(input_to_pose_calc) != 4) { - if (off_91E951[(uint16)(2 * HIBYTE(input_to_pose_calc)) >> 1]() & 1) + if (off_91E951[HIBYTE(input_to_pose_calc)]() & 1) samus_momentum_routine_index = 0; else samus_momentum_routine_index = 5; } } -#define word_91E9F3 ((uint16*)RomPtr(0x91e9f3)) uint8 Samus_HandleTransFromBlockColl_1_0(void) { // 0x91E95D int16 v0; @@ -3674,7 +3619,6 @@ void Samus_HandleTransFromBlockColl_5(void) { // 0x91EABE samus_momentum_routine_index = 5; } -#define word_91EB74 ((uint16*)RomPtr(0x91eb74)) uint8 Samus_CheckWalkedIntoSomething(void) { // 0x91EADE int16 v0; @@ -3916,7 +3860,7 @@ uint8 Samus_HandleTransitionsB_1_11(void) { // 0x91EDA4 } uint8 Samus_HandleTransitionsB_1_6(void) { // 0x91EDA6 - if (frame_handler_gamma == (uint16)FUNC16(Samus_Func9)) + if (frame_handler_gamma == FUNC16(Samus_Func9)) return 0; else return Samus_HandleTransitionsB_1_0(); @@ -3978,7 +3922,7 @@ void Samus_HandleTransitionsB_2(void) { // 0x91EE69 void Samus_HandleTransitionsB_3(void) { // 0x91EE80 bomb_jump_dir = (uint8)bomb_jump_dir | 0x800; samus_movement_handler = FUNC16(Samus_MoveHandler_BombJumpStart); - if (samus_input_handler != (uint16)FUNC16(Samus_InputHandler_E91D)) + if (samus_input_handler != FUNC16(Samus_InputHandler_E91D)) samus_input_handler = FUNC16(nullsub_152); } @@ -4105,7 +4049,7 @@ static Func_V *const kSamus_HandleTransitionsA_5[7] = { // 0x91EFC4 Samus_HandleTransitionsA_5_6, }; void Samus_HandleTransitionsA_5(void) { - kSamus_HandleTransitionsA_5[(uint16)(2 * (uint8)input_to_pose_calc) >> 1](); + kSamus_HandleTransitionsA_5[(uint8)input_to_pose_calc](); } void Samus_HandleTransitionsA_5_4(void) { // 0x91EFDF @@ -4142,7 +4086,7 @@ void Samus_HandleTransitionsA_5_1(void) { HandleLandingSoundEffectsAndGfx(); if (HIBYTE(input_to_pose_calc) == 4) { SamusFunc_F1D3(); - } else if (!(kSamus_HandleTransitionsA_5_1[(uint16)(2 * HIBYTE(input_to_pose_calc)) >> 1]() & 1)) { + } else if (!(kSamus_HandleTransitionsA_5_1[HIBYTE(input_to_pose_calc)]() & 1)) { UNUSED_word_7E0A18 = 0; samus_x_accel_mode = 0; samus_x_base_speed = 0; @@ -4289,7 +4233,7 @@ void SamusFunc_F1D3(void) { // 0x91F1D3 } uint8 Samus_HandleTransitionsA_5_1_0(void) { // 0x91F1EC - if (samus_input_handler != (uint16)FUNC16(Samus_InputHandler_E91D)) + if (samus_input_handler != FUNC16(Samus_InputHandler_E91D)) samus_input_handler = FUNC16(HandleAutoJumpHack); return 0; } @@ -4402,7 +4346,7 @@ void Samus_HandleTransitionsC_1(void) { // 0x91F31D samus_is_falling_flag = 1; samus_y_dir = 2; Samus_AlignBottomWithPrevPose(); - if (samus_input_handler != (uint16)FUNC16(Samus_InputHandler_E91D)) + if (samus_input_handler != FUNC16(Samus_InputHandler_E91D)) samus_input_handler = FUNC16(Samus_InputHandler_E913); } @@ -4803,11 +4747,6 @@ uint8 SamusFunc_F468_DamageBoost_(void) { // 0x91F8CB return 0; } -#define kSamusTurnPose_Standing ((uint8*)RomPtr(0x91f9c2)) -#define kSamusTurnPose_Crouching ((uint8*)RomPtr(0x91f9cc)) -#define kSamusTurnPose_Jumping ((uint8*)RomPtr(0x91f9d6)) -#define kSamusTurnPose_Falling ((uint8*)RomPtr(0x91f9e0)) -#define kSamusTurnPose_Moonwalk ((uint8*)RomPtr(0x91f9ea)) uint8 SamusFunc_F468_TurningAroundOnGround(void) { // 0x91F8D3 if (samus_prev_pose && samus_prev_pose != kPose_9B_FaceF_VariaGravitySuit) { uint16 v0 = *(&kPoseParams[0].direction_shots_fired + (uint16)(8 * samus_prev_pose)); @@ -5275,4 +5214,4 @@ uint8 HandleCollDueToChangedPose_Block_CollBoth(void) { // 0x91FFA7 samus_prev_y_pos = samus_y_pos; } return 0; -} +} \ No newline at end of file diff --git a/src/sm_92.c b/src/sm_92.c index ffabc28..cd63ae6 100644 --- a/src/sm_92.c +++ b/src/sm_92.c @@ -4,9 +4,13 @@ #include "variables.h" #include "funcs.h" -#define kSamus_AnimationDefinitionPtrs ((uint16*)RomPtr(0x92d94e)) -#define kSamus_TileDefs_TopHalf ((uint16*)RomPtr(0x92d91e)) -#define kSamus_TileDefs_BottomHalf ((uint16*)RomPtr(0x92d938)) + +#define kSamus_AnimationDefinitionPtrs ((uint16*)RomFixedPtr(0x92d94e)) +#define kSamus_TileDefs_TopHalf ((uint16*)RomFixedPtr(0x92d91e)) +#define kSamus_TileDefs_BottomHalf ((uint16*)RomFixedPtr(0x92d938)) + + + void SetSamusTilesDefsForCurAnim(void) { // 0x928000 int16 v2; @@ -62,4 +66,4 @@ void DrawSamusSuitExploding(void) { // 0x92EDBE else R18_ = g_word_7E0DE4 + 2076; DrawSamusSpritemap(R18_, samus_x_pos, samus_y_pos); -} +} \ No newline at end of file diff --git a/src/sm_93.c b/src/sm_93.c index 89e6694..9b2cffe 100644 --- a/src/sm_93.c +++ b/src/sm_93.c @@ -3,22 +3,25 @@ #include "variables.h" #include "funcs.h" -#define kProjectileData_UnchargedBeams ((uint16*)RomPtr(0x9383c1)) -#define kProjectileData_ChargedBeams ((uint16*)RomPtr(0x9383d9)) -#define kProjectileData_NonBeams ((uint16*)RomPtr(0x9383f1)) -#define kShinesparkEchoSpazer_ProjectileData ((uint16*)RomPtr(0x938403)) -#define kRunInstrForSuperMissile ((uint16*)RomPtr(0x93842b)) -#define g_stru_938691 (*(ProjectileDamagesAndInstrPtr*)RomPtr(0x938691)) -#define g_stru_938679 (*(ProjectileDamagesAndInstrPtr*)RomPtr(0x938679)) -#define kProjInstrList_Explosion (*(ProjectileDamagesAndInstrPtr*)RomPtr(0x938681)) -#define g_off_938413 ((uint16*)RomPtr(0x938413)) + +#define kProjectileData_UnchargedBeams ((uint16*)RomFixedPtr(0x9383c1)) +#define kProjectileData_ChargedBeams ((uint16*)RomFixedPtr(0x9383d9)) +#define kProjectileData_NonBeams ((uint16*)RomFixedPtr(0x9383f1)) +#define kShinesparkEchoSpazer_ProjectileData ((uint16*)RomFixedPtr(0x938403)) +#define kRunInstrForSuperMissile ((uint16*)RomFixedPtr(0x93842b)) +#define g_stru_938691 (*(ProjectileDamagesAndInstrPtr*)RomFixedPtr(0x938691)) +#define g_stru_938679 (*(ProjectileDamagesAndInstrPtr*)RomFixedPtr(0x938679)) +#define kProjInstrList_Explosion (*(ProjectileDamagesAndInstrPtr*)RomFixedPtr(0x938681)) +#define g_off_938413 ((uint16*)RomFixedPtr(0x938413)) + + + void InitializeProjectile(uint16 k) { // 0x938000 ProjectileDataTable *ProjectileDataTable; - int16 damage; int v1 = k >> 1; - R18_ = 2 * (projectile_dir[v1] & 0xF); + int R18 = 2 * (projectile_dir[v1] & 0xF); uint16 v2 = projectile_type[v1], v3; if ((v2 & 0xF00) != 0) { v3 = kProjectileData_NonBeams[HIBYTE(v2) & 0xF]; @@ -28,44 +31,36 @@ void InitializeProjectile(uint16 k) { // 0x938000 v3 = kProjectileData_UnchargedBeams[projectile_type[v1] & 0xF]; } ProjectileDataTable = get_ProjectileDataTable(v3); - damage = ProjectileDataTable->damage; - projectile_damage[v1] = ProjectileDataTable->damage; - if (damage < 0) + if (sign16(ProjectileDataTable->damage)) InvalidInterrupt_Crash(); - uint8 *v6 = RomPtr_93(R18_ + v3 + 2); - uint16 v7 = *(uint16 *)v6; - projectile_bomb_instruction_ptr[v1] = *(uint16 *)v6; - uint8 *v8 = RomPtr_93(v7); + projectile_damage[v1] = ProjectileDataTable->damage; + uint16 v7 = GET_WORD(RomPtr_93(v3 + R18 + 2)); + projectile_bomb_instruction_ptr[v1] = v7; + const uint8 *v8 = RomPtr_93(v7); projectile_x_radius[v1] = v8[4]; projectile_y_radius[v1] = v8[5]; projectile_bomb_instruction_timers[v1] = 1; } void InitializeInstrForSuperMissile(uint16 v0) { // 0x938071 - int16 v4; - int v1 = v0 >> 1; - uint16 v2 = kRunInstrForSuperMissile[HIBYTE(projectile_type[v1]) & 0xF]; - uint8 *v3 = RomPtr_93(v2); - v4 = *(uint16 *)v3; - projectile_damage[v1] = *(uint16 *)v3; - if (v4 < 0) + const uint8 *v3 = RomPtr_93(kRunInstrForSuperMissile[HIBYTE(projectile_type[v1]) & 0xF]); + uint16 v4 = GET_WORD(v3); + projectile_damage[v1] = v4; + if (sign16(v4)) InvalidInterrupt_Crash(); - projectile_bomb_instruction_ptr[v1] = *(uint16 *)RomPtr_93(v2 + 2); + projectile_bomb_instruction_ptr[v1] = GET_WORD(v3 + 2); projectile_bomb_instruction_timers[v1] = 1; } void InitializeInstrForMissile(uint16 v0) { // 0x9380A0 - int16 v4; - int v1 = v0 >> 1; - uint16 v2 = kProjectileData_NonBeams[HIBYTE(projectile_type[v1]) & 0xF]; - uint8 *v3 = RomPtr_93(v2); - v4 = *(uint16 *)v3; - projectile_damage[v1] = *(uint16 *)v3; - if (v4 < 0) + const uint8 *v3 = RomPtr_93(kProjectileData_NonBeams[HIBYTE(projectile_type[v1]) & 0xF]); + uint16 v4 = GET_WORD(v3); + projectile_damage[v1] = GET_WORD(v3); + if (sign16(v4)) InvalidInterrupt_Crash(); - projectile_bomb_instruction_ptr[v1] = *(uint16 *)RomPtr_93(v2 + 2); + projectile_bomb_instruction_ptr[v1] = GET_WORD(v3 + 2); projectile_bomb_instruction_timers[v1] = 1; } @@ -101,30 +96,25 @@ void InitializeBombExplosion(uint16 k) { // 0x93814E } void InitializeShinesparkEchoOrSpazerSba(uint16 k) { // 0x938163 - int16 v4; - int v1 = k >> 1; - R18_ = 2 * (projectile_dir[v1] & 0xF); - uint16 v2 = kShinesparkEchoSpazer_ProjectileData[LOBYTE(projectile_type[v1]) - 34]; - uint8 *v3 = RomPtr_93(v2); - v4 = *(uint16 *)v3; - projectile_damage[v1] = *(uint16 *)v3; - if (v4 < 0) + int R18 = 2 * (projectile_dir[v1] & 0xF); + const uint8 *v3 = RomPtr_93(kShinesparkEchoSpazer_ProjectileData[LOBYTE(projectile_type[v1]) - 34]); + uint16 v4 = GET_WORD(v3); + projectile_damage[v1] = GET_WORD(v3); + if (sign16(v4)) InvalidInterrupt_Crash(); - projectile_bomb_instruction_ptr[v1] = *(uint16 *)RomPtr_93(R18_ + v2 + 2); + projectile_bomb_instruction_ptr[v1] = GET_WORD(v3 + 2 + R18); projectile_bomb_instruction_timers[v1] = 1; } void InitializeSbaProjectile(uint16 k) { // 0x9381A4 - int16 v3; - int v1 = k >> 1; - uint8 *v2 = RomPtr_93(g_off_938413[projectile_type[v1] & 0xF]); - v3 = *(uint16 *)v2; - projectile_damage[v1] = *(uint16 *)v2; - if (v3 < 0) + const uint8 *v2 = RomPtr_93(g_off_938413[projectile_type[v1] & 0xF]); + uint16 v3 = GET_WORD(v2); + projectile_damage[v1] = GET_WORD(v2); + if (sign16(v3)) InvalidInterrupt_Crash(); - projectile_bomb_instruction_ptr[v1] = *((uint16 *)v2 + 1); + projectile_bomb_instruction_ptr[v1] = GET_WORD(v2 + 2); projectile_bomb_instruction_timers[v1] = 1; } @@ -181,11 +171,11 @@ uint16 Proj93Instr_Goto(uint16 k, uint16 j) { // 0x938239 } uint16 Proj93Instr_GotoIfLess(uint16 k, uint16 j) { // 0x938240 - uint8 *v2 = RomPtr_93(j); - if ((int16)(*(uint16 *)v2 - projectile_variables[k >> 1]) >= 0) - return *((uint16 *)RomPtr_93(j) + 1); + const uint8 *v2 = RomPtr_93(j); + if ((int16)(GET_WORD(v2) - projectile_variables[k >> 1]) >= 0) + return GET_WORD(v2 + 2); else - return *((uint16 *)v2 + 2); + return GET_WORD(v2 + 4); } void DrawPlayerExplosions2(void) { // 0x938254 @@ -289,4 +279,4 @@ LABEL_16: v0 -= 2; projectile_index = v0; } while ((v0 & 0x8000u) == 0); -} +} \ No newline at end of file diff --git a/src/sm_94.c b/src/sm_94.c index 1a97782..1d6407d 100644 --- a/src/sm_94.c +++ b/src/sm_94.c @@ -4,6 +4,15 @@ #include "variables.h" #include "funcs.h" + +#define fnkPlmHeaderDefPtrs 0x949139 +#define off_9492D9 ((uint16*)RomFixedPtr(0x9492d9)) +#define off_9492E9 ((uint16*)RomFixedPtr(0x9492e9)) +#define kPlmHeaderDefPtrs ((uint16*)RomFixedPtr(0x949139)) +#define off_94936B ((uint16*)RomFixedPtr(0x94936b)) + + + static const uint8 kAlignPos_Tab1[512] = { 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, @@ -119,11 +128,7 @@ static const uint16 kBlockColl_Horiz_Slope_NonSquare_Tab[64] = { 0x6000, 0x50, }; -#define fnkPlmHeaderDefPtrs 0x949139 -#define off_9492D9 ((uint16*)RomPtr(0x9492d9)) -#define off_9492E9 ((uint16*)RomPtr(0x9492e9)) -#define kPlmHeaderDefPtrs ((uint16*)RomPtr(0x949139)) uint16 PostGrappleColl_Horiz_Slope_NonSquare(uint16 k) { // 0x948000 int16 v1; @@ -137,8 +142,8 @@ uint16 PostGrappleColl_Horiz_Slope_NonSquare(uint16 k) { // 0x948000 v1 = samus_x_pos >> 4; if (v1 != mod) return -1; - temp_collision_DD4 = R32 & 0xF; - temp_collision_DD6 = 16 * (BTS[k] & 0x1F); + uint16 temp_collision_DD4 = R32_ & 0xF; + uint16 temp_collision_DD6 = 16 * (BTS[k] & 0x1F); if ((BTS[k] & 0x40) != 0) { if (BTS[k] & 0x80) v3 = samus_y_pos ^ 0xF; @@ -146,7 +151,7 @@ uint16 PostGrappleColl_Horiz_Slope_NonSquare(uint16 k) { // 0x948000 v3 = samus_y_pos; uint16 v4 = temp_collision_DD6 + (v3 & 0xF); uint16 result = (kAlignPos_Tab1[v4] & 0x1F) - temp_collision_DD4 - 1; - if ((kAlignPos_Tab1[v4] & 0x1F) - temp_collision_DD4 != 1 && (result & 0x8000u) != 0) + if ((kAlignPos_Tab1[v4] & 0x1F) - temp_collision_DD4 != 1 && (result & 0x8000) != 0) return -1; return result; } @@ -156,8 +161,8 @@ uint16 PostGrappleColl_Horiz_Slope_NonSquare(uint16 k) { // 0x948000 v5 = samus_x_pos >> 4; if (v5 != mod) return -1; - temp_collision_DD4 = R32 & 0xF; - temp_collision_DD6 = 16 * (BTS[k] & 0x1F); + uint16 temp_collision_DD4 = R32_ & 0xF; + uint16 temp_collision_DD6 = 16 * (BTS[k] & 0x1F); if (BTS[k] & 0x40) return PostGrappleColl_Horiz_Solid(); if (BTS[k] & 0x80) @@ -186,8 +191,8 @@ uint16 PostGrappleColl_Vert_Slope_NonSquare(uint16 k) { // 0x9480E0 v1 = samus_x_pos >> 4; if (v1 != mod) return -1; - temp_collision_DD4 = R32 & 0xF; - temp_collision_DD6 = 16 * (BTS[k] & 0x1F); + uint16 temp_collision_DD4 = R32_ & 0xF; + uint16 temp_collision_DD6 = 16 * (BTS[k] & 0x1F); v3 = BTS[k]; if (v3 & 0x80) { if ((v3 & 0x40) != 0) @@ -196,7 +201,7 @@ uint16 PostGrappleColl_Vert_Slope_NonSquare(uint16 k) { // 0x9480E0 v4 = samus_x_pos; uint16 v5 = temp_collision_DD6 + (v4 & 0xF); uint16 result = (kAlignYPos_Tab0[v5] & 0x1F) - temp_collision_DD4 - 1; - if ((kAlignYPos_Tab0[v5] & 0x1F) - temp_collision_DD4 != 1 && (result & 0x8000u) != 0) + if ((kAlignYPos_Tab0[v5] & 0x1F) - temp_collision_DD4 != 1 && (result & 0x8000) != 0) return -1; return result; } @@ -206,8 +211,8 @@ uint16 PostGrappleColl_Vert_Slope_NonSquare(uint16 k) { // 0x9480E0 v6 = samus_x_pos >> 4; if (v6 != mod) return -1; - temp_collision_DD4 = R32 & 0xF; - temp_collision_DD6 = 16 * (BTS[k] & 0x1F); + uint16 temp_collision_DD4 = R32_ & 0xF; + uint16 temp_collision_DD6 = 16 * (BTS[k] & 0x1F); v7 = BTS[k]; if (v7 & 0x80) return PostGrappleColl_Vert_Solid(); @@ -224,9 +229,9 @@ uint16 PostGrappleColl_Vert_Slope_NonSquare(uint16 k) { // 0x9480E0 } uint16 PostGrappleColl_Horiz_Slope_Square(uint16 k) { // 0x9481B8 - temp_collision_DD4 = 4 * (BTS[k] & 0x1F); - temp_collision_DD6 = BTS[k] >> 6; - uint16 v1 = temp_collision_DD4 + (temp_collision_DD6 ^ ((uint8)(R32 & 8) >> 3)); + uint16 temp_collision_DD4 = 4 * (BTS[k] & 0x1F); + uint16 temp_collision_DD6 = BTS[k] >> 6; + uint16 v1 = temp_collision_DD4 + (temp_collision_DD6 ^ ((uint8)(R32_ & 8) >> 3)); if (!R26_) { if ((((uint8)samus_y_radius + (uint8)samus_y_pos - 1) & 8) == 0) { if (!kTab948E54[v1]) @@ -244,15 +249,15 @@ LABEL_7: return -1; LABEL_10: if (samus_collision_direction & 1) - return R32 & 7; + return R32_ & 7; else - return R32 & 7 ^ 7; + return R32_ & 7 ^ 7; } uint16 PostGrappleColl_Vertical_Slope_Square(uint16 k) { // 0x948230 - temp_collision_DD4 = 4 * (BTS[k] & 0x1F); - temp_collision_DD6 = BTS[k] >> 6; - uint16 v1 = temp_collision_DD4 + (temp_collision_DD6 ^ ((uint8)(R32 & 8) >> 2)); + uint16 temp_collision_DD4 = 4 * (BTS[k] & 0x1F); + uint16 temp_collision_DD6 = BTS[k] >> 6; + uint16 v1 = temp_collision_DD4 + (temp_collision_DD6 ^ ((uint8)(R32_ & 8) >> 2)); if (!R26_) { if ((((uint8)samus_x_radius + (uint8)samus_x_pos - 1) & 8) == 0) { if (!kTab948E54[v1]) @@ -270,9 +275,9 @@ LABEL_7: return -1; LABEL_10: if (samus_collision_direction & 1) - return R32 & 7; + return R32_ & 7; else - return R32 & 7 ^ 7; + return R32_ & 7 ^ 7; } uint16 ClearCarry_0(void) { // 0x9482A7 @@ -280,25 +285,25 @@ uint16 ClearCarry_0(void) { // 0x9482A7 } uint16 PostGrappleColl_Horiz_Slope(void) { // 0x9482A9 - if ((BTS[cur_block_index] & 0x1Fu) < 5) + if ((BTS[cur_block_index] & 0x1F) < 5) return PostGrappleColl_Horiz_Slope_Square(cur_block_index); else return PostGrappleColl_Horiz_Slope_NonSquare(cur_block_index); } uint16 PostGrappleColl_Horiz_Solid(void) { // 0x9482BE - return R32 & 0xF; + return R32_ & 0xF; } uint16 PostGrappleColl_Vert_Slope(void) { // 0x9482C5 - if ((BTS[cur_block_index] & 0x1Fu) < 5) + if ((BTS[cur_block_index] & 0x1F) < 5) return PostGrappleColl_Vertical_Slope_Square(cur_block_index); else return PostGrappleColl_Vert_Slope_NonSquare(cur_block_index); } uint16 PostGrappleColl_Vert_Solid(void) { // 0x9482DA - return R32 & 0xF; + return R32_ & 0xF; } static Func_U16 *const kPostGrappleColl_Horiz[16] = { // 0x948321 @@ -357,8 +362,8 @@ void PostGrappleCollisionDetect_Right(void) { // 0x94834F uint16 prod = Mult8x8((uint16)(samus_y_pos - samus_y_radius) >> 4, room_width_in_blocks); R22_ = samus_x_subpos; R24_ = samus_x_pos; - R32 = samus_x_radius + samus_x_pos - 1; - v0 = R32 >> 4; + R32_ = samus_x_radius + samus_x_pos - 1; + v0 = R32_ >> 4; cur_block_index = prod + v0; uint16 v1 = 2 * cur_block_index; do { @@ -370,7 +375,7 @@ void PostGrappleCollisionDetect_Right(void) { // 0x94834F } v1 += room_width_in_blocks * 2; --R26_; - } while ((R26_ & 0x8000u) == 0); + } while ((R26_ & 0x8000) == 0); } void PostGrappleCollisionDetect_Left(void) { // 0x9483B1 @@ -383,7 +388,7 @@ void PostGrappleCollisionDetect_Left(void) { // 0x9483B1 uint16 prod = Mult8x8((uint16)(samus_y_pos - samus_y_radius) >> 4, room_width_in_blocks); R22_ = samus_x_subpos; R24_ = samus_x_pos; - R32 = samus_x_pos - samus_x_radius; + R32_ = samus_x_pos - samus_x_radius; v0 = (uint16)(samus_x_pos - samus_x_radius) >> 4; cur_block_index = prod + v0; uint16 v1 = 2 * cur_block_index; @@ -396,7 +401,7 @@ void PostGrappleCollisionDetect_Left(void) { // 0x9483B1 } v1 += room_width_in_blocks * 2; --R26_; - } while ((R26_ & 0x8000u) == 0); + } while ((R26_ & 0x8000) == 0); } void PostGrappleCollisionDetect_Down(void) { // 0x94840F @@ -408,8 +413,8 @@ void PostGrappleCollisionDetect_Down(void) { // 0x94840F Samus_GetXposSpan(); R22_ = samus_y_subpos; R24_ = samus_y_pos; - R32 = samus_y_radius + samus_y_pos - 1; - uint16 prod = Mult8x8(R32 >> 4, room_width_in_blocks); + R32_ = samus_y_radius + samus_y_pos - 1; + uint16 prod = Mult8x8(R32_ >> 4, room_width_in_blocks); v0 = (uint16)(samus_x_pos - samus_x_radius) >> 4; cur_block_index = prod + v0; uint16 v1 = 2 * cur_block_index; @@ -422,7 +427,7 @@ void PostGrappleCollisionDetect_Down(void) { // 0x94840F } v1 += 2; --R26_; - } while ((R26_ & 0x8000u) == 0); + } while ((R26_ & 0x8000) == 0); } void PostGrappleCollisionDetect_Up(void) { // 0x94846A @@ -434,7 +439,7 @@ void PostGrappleCollisionDetect_Up(void) { // 0x94846A Samus_GetXposSpan(); R22_ = samus_y_subpos; R24_ = samus_y_pos; - R32 = samus_y_pos - samus_y_radius; + R32_ = samus_y_pos - samus_y_radius; uint16 prod = Mult8x8((uint16)(samus_y_pos - samus_y_radius) >> 4, room_width_in_blocks); v0 = (uint16)(samus_x_pos - samus_x_radius) >> 4; cur_block_index = prod + v0; @@ -448,7 +453,7 @@ void PostGrappleCollisionDetect_Up(void) { // 0x94846A } v1 += 2; --R26_; - } while ((R26_ & 0x8000u) == 0); + } while ((R26_ & 0x8000) == 0); } void PostGrappleCollisionDetect_X(void) { // 0x9484C4 @@ -462,14 +467,11 @@ void PostGrappleCollisionDetect_Y(void) { // 0x9484CD } uint8 BlockColl_Horiz_Slope_NonSquare(void) { // 0x9484D6 - uint16 v2; - if ((current_slope_bts & 0x80) != 0 || __PAIR32__(samus_y_speed, samus_y_subspeed)) return 0; uint16 v1 = 4 * (current_slope_bts & 0x1F); - HIBYTE(v2) = R18_; - LOBYTE(v2) = HIBYTE(R20_); - if ((R18_ & 0x8000u) == 0) { + uint16 v2 = PAIR16(R18_, HIBYTE(R20_)); + if ((R18_ & 0x8000) == 0) { Multiply16x16(v2, kBlockColl_Horiz_Slope_NonSquare_Tab[(v1 >> 1) + 1]); R20_ = mult_product_lo; R18_ = mult_product_hi; @@ -480,7 +482,6 @@ uint8 BlockColl_Horiz_Slope_NonSquare(void) { // 0x9484D6 return 0; } - uint8 BlockColl_Vert_Slope_NonSquare(uint16 k) { // 0x9486FE int16 v1; int16 v3; @@ -499,8 +500,8 @@ uint8 BlockColl_Vert_Slope_NonSquare(uint16 k) { // 0x9486FE uint16 mod = SnesModulus(cur_block_index, room_width_in_blocks); v8 = samus_x_pos >> 4; if (v8 == mod) { - temp_collision_DD4 = ((uint8)samus_y_radius + (uint8)R24_ - 1) & 0xF; - temp_collision_DD6 = 16 * (BTS[k] & 0x1F); + uint16 temp_collision_DD4 = ((uint8)samus_y_radius + (uint8)R24_ - 1) & 0xF; + uint16 temp_collision_DD6 = 16 * (BTS[k] & 0x1F); v9 = BTS[k]; if (!(v9 & 0x80) && ((v9 & 0x40) != 0 ? (v10 = samus_x_pos ^ 0xF) : (v10 = samus_x_pos), @@ -524,8 +525,8 @@ uint8 BlockColl_Vert_Slope_NonSquare(uint16 k) { // 0x9486FE uint16 mod = SnesModulus(cur_block_index, room_width_in_blocks); v1 = samus_x_pos >> 4; if (v1 == mod) { - temp_collision_DD4 = ((uint8)R24_ - (uint8)samus_y_radius) & 0xF ^ 0xF; - temp_collision_DD6 = 16 * (BTS[k] & 0x1F); + uint16 temp_collision_DD4 = ((uint8)R24_ - (uint8)samus_y_radius) & 0xF ^ 0xF; + uint16 temp_collision_DD6 = 16 * (BTS[k] & 0x1F); v3 = BTS[k]; if ((v3 & 0x80) && ((v3 & 0x40) != 0 ? (v4 = samus_x_pos ^ 0xF) : (v4 = samus_x_pos), @@ -549,28 +550,18 @@ uint8 BlockColl_Vert_Slope_NonSquare(uint16 k) { // 0x9486FE } void Samus_AlignYPosSlope(void) { // 0x9487F4 - int16 v0; - char v1; - int16 v2; - int16 v3; - char v4; - int16 v6; - if ((enable_horiz_slope_coll & 2) != 0) { R26_ = samus_x_pos; R28_ = samus_y_radius + samus_y_pos - 1; - g_word_7E001E = 0; - R32 = 0; - CalculateBlockAt(); - if ((level_data[cur_block_index] & 0xF000) == 4096 - && (BTS[cur_block_index] & 0x1Fu) >= 5) { - temp_collision_DD4 = ((uint8)samus_y_radius + (uint8)samus_y_pos - 1) & 0xF; - temp_collision_DD6 = 16 * (BTS[cur_block_index] & 0x1F); - v0 = BTS[cur_block_index]; + CalculateBlockAt(R26_, R28_, 0, 0); + if ((level_data[cur_block_index] & 0xF000) == 4096 && (BTS[cur_block_index] & 0x1F) >= 5) { + uint16 temp_collision_DD4 = (samus_y_radius + samus_y_pos - 1) & 0xF; + uint16 temp_collision_DD6 = 16 * (BTS[cur_block_index] & 0x1F); + uint8 v0 = BTS[cur_block_index]; if (!(v0 & 0x80)) { - v1 = (v0 & 0x40) != 0 ? samus_x_pos ^ 0xF : samus_x_pos; - v2 = (kAlignYPos_Tab0[(uint16)(temp_collision_DD6 + (v1 & 0xF))] & 0x1F) - temp_collision_DD4 - 1; - if (v2 < 0) { + uint16 v1 = (v0 & 0x40) != 0 ? samus_x_pos ^ 0xF : samus_x_pos; + uint16 v2 = (kAlignYPos_Tab0[temp_collision_DD6 + (v1 & 0xF)] & 0x1F) - temp_collision_DD4 - 1; + if ((int16)v2 < 0) { samus_y_pos += v2; samus_pos_adjusted_by_slope_flag = 1; } @@ -578,22 +569,15 @@ void Samus_AlignYPosSlope(void) { // 0x9487F4 } R26_ = samus_x_pos; R28_ = samus_y_pos - samus_y_radius; - g_word_7E001E = 0; - R32 = 0; - CalculateBlockAt(); - if ((level_data[cur_block_index] & 0xF000) == 4096 - && (BTS[cur_block_index] & 0x1Fu) >= 5) { - temp_collision_DD4 = ((uint8)samus_y_pos - (uint8)samus_y_radius) & 0xF ^ 0xF; - temp_collision_DD6 = 16 * (BTS[cur_block_index] & 0x1F); - v3 = BTS[cur_block_index]; + CalculateBlockAt(R26_, R28_, 0, 0); + if ((level_data[cur_block_index] & 0xF000) == 4096 && (BTS[cur_block_index] & 0x1F) >= 5) { + uint16 temp_collision_DD4 = (samus_y_pos - samus_y_radius) & 0xF ^ 0xF; + uint16 temp_collision_DD6 = 16 * (BTS[cur_block_index] & 0x1F); + uint8 v3 = BTS[cur_block_index]; if (v3 & 0x80) { - if ((v3 & 0x40) != 0) - v4 = samus_x_pos ^ 0xF; - else - v4 = samus_x_pos; - uint16 v5 = temp_collision_DD6 + (v4 & 0xF); - v6 = (kAlignYPos_Tab0[v5] & 0x1F) - temp_collision_DD4 - 1; - if ((kAlignYPos_Tab0[v5] & 0x1F) - temp_collision_DD4 == 1 || v6 < 0) { + uint16 v4 = (v3 & 0x40) != 0 ? samus_x_pos ^ 0xF : samus_x_pos; + uint16 v6 = (kAlignYPos_Tab0[temp_collision_DD6 + (v4 & 0xF)] & 0x1F) - temp_collision_DD4 - 1; + if ((int16)v6 <= 0) { samus_y_pos -= v6; samus_pos_adjusted_by_slope_flag = 1; } @@ -606,9 +590,9 @@ uint8 BlockColl_Horiz_Slope_Square(uint16 a, uint16 k) { // 0x948D2B int16 v4; int16 v5; - temp_collision_DD4 = 4 * a; - temp_collision_DD6 = BTS[k] >> 6; - uint16 v2 = 4 * a + (temp_collision_DD6 ^ ((uint8)(R32 & 8) >> 3)); + uint16 temp_collision_DD4 = 4 * a; + uint16 temp_collision_DD6 = BTS[k] >> 6; + uint16 v2 = 4 * a + (temp_collision_DD6 ^ ((uint8)(R32_ & 8) >> 3)); if (!R26_) { if ((((uint8)samus_y_radius + (uint8)samus_y_pos - 1) & 8) == 0) { if (!kTab948E54[v2]) @@ -626,15 +610,15 @@ LABEL_7: return 0; LABEL_10: R20_ = 0; - if ((R18_ & 0x8000u) != 0) { - v5 = samus_x_radius + (R32 | 7) + 1 - samus_x_pos; + if ((R18_ & 0x8000) != 0) { + v5 = samus_x_radius + (R32_ | 7) + 1 - samus_x_pos; if (v5 >= 0) v5 = 0; R18_ = v5; samus_x_subpos = 0; return 1; } else { - v4 = (__PAIR32__((R32 & 0xFFF8) - samus_x_radius, R32 & 0xFFF8) - __PAIR32__(samus_x_pos, samus_x_radius)) >> 16; + v4 = (__PAIR32__((R32_ & 0xFFF8) - samus_x_radius, R32_ & 0xFFF8) - __PAIR32__(samus_x_pos, samus_x_radius)) >> 16; if (v4 < 0) v4 = 0; R18_ = v4; @@ -647,9 +631,9 @@ uint8 BlockColl_Vert_Slope_Square(uint16 a, uint16 k) { // 0x948DBD int16 v4; int16 v5; - temp_collision_DD4 = 4 * a; - temp_collision_DD6 = BTS[k] >> 6; - uint16 v2 = 4 * a + (temp_collision_DD6 ^ ((uint8)(R32 & 8) >> 2)); + uint16 temp_collision_DD4 = 4 * a; + uint16 temp_collision_DD6 = BTS[k] >> 6; + uint16 v2 = 4 * a + (temp_collision_DD6 ^ ((uint8)(R32_ & 8) >> 2)); if (!R26_) { if ((((uint8)samus_x_radius + (uint8)samus_x_pos - 1) & 8) == 0) { if (!kTab948E54[v2]) @@ -667,15 +651,15 @@ LABEL_7: return 0; LABEL_10: R20_ = 0; - if ((R18_ & 0x8000u) != 0) { - v5 = samus_y_radius + (R32 | 7) + 1 - samus_y_pos; + if ((R18_ & 0x8000) != 0) { + v5 = samus_y_radius + (R32_ | 7) + 1 - samus_y_pos; if (v5 >= 0) v5 = 0; R18_ = v5; samus_y_subpos = 0; return 1; } else { - v4 = (__PAIR32__((R32 & 0xFFF8) - samus_y_radius, R32 & 0xFFF8) - __PAIR32__(samus_y_pos, samus_y_radius)) >> 16; + v4 = (__PAIR32__((R32_ & 0xFFF8) - samus_y_radius, R32_ & 0xFFF8) - __PAIR32__(samus_y_pos, samus_y_radius)) >> 16; if (v4 < 0) v4 = 0; R18_ = v4; @@ -738,15 +722,15 @@ uint8 BlockColl_Horiz_SolidShootGrappleBlock(void) { // 0x948F49 int16 v2; R20_ = 0; - if ((R18_ & 0x8000u) != 0) { - v2 = samus_x_radius + (R32 | 0xF) + 1 - samus_x_pos; + if ((R18_ & 0x8000) != 0) { + v2 = samus_x_radius + (R32_ | 0xF) + 1 - samus_x_pos; if (v2 >= 0) v2 = 0; R18_ = v2; samus_x_subpos = 0; return 1; } else { - v0 = (R32 & 0xFFF0) - samus_x_radius - samus_x_pos; + v0 = (R32_ & 0xFFF0) - samus_x_radius - samus_x_pos; if (v0 < 0) v0 = 0; R18_ = v0; @@ -760,15 +744,15 @@ uint8 BlockColl_Vert_SolidShootGrappleBlock(void) { // 0x948F82 int16 v2; R20_ = 0; - if ((R18_ & 0x8000u) != 0) { - v2 = samus_y_radius + (R32 | 0xF) + 1 - samus_y_pos; + if ((R18_ & 0x8000) != 0) { + v2 = samus_y_radius + (R32_ | 0xF) + 1 - samus_y_pos; if (v2 >= 0) v2 = 0; R18_ = v2; samus_y_subpos = 0; return 1; } else { - v0 = (R32 & 0xFFF0) - samus_y_radius - samus_y_pos; + v0 = (R32_ & 0xFFF0) - samus_y_radius - samus_y_pos; if (v0 < 0) v0 = 0; R18_ = v0; @@ -838,9 +822,8 @@ uint8 BlockColl_Horiz_SpecialAir(void) { // 0x94906F v0 = BTS[cur_block_index]; if ((v0 & 0x80) != 0) { - R34 = off_9492D9[area_index]; - uint8 *v2 = RomPtr_94(R34); - return SpawnPLM(*(uint16 *)&v2[(uint16)(2 * (v0 & 0x7F))]) & 1; + const uint16 *v2 = (const uint16 *)RomPtr_94(off_9492D9[area_index]); + return SpawnPLM(v2[v0 & 0x7f]) & 1; } else { SpawnPLM(kPlmHeaderDefPtrs[v0]); return 0; @@ -852,9 +835,8 @@ uint8 BlockColl_Vert_SpecialAir(void) { // 0x94909D v0 = BTS[cur_block_index]; if ((v0 & 0x80) != 0) { - R34 = off_9492D9[area_index]; - uint8 *v2 = RomPtr_94(R34); - return SpawnPLM(*(uint16 *)&v2[(uint16)(2 * (v0 & 0x7F))]) & 1; + const uint16 *v2 = (const uint16 *)RomPtr_94(off_9492D9[area_index]); + return SpawnPLM(v2[v0 & 0x7f]) & 1; } else { SpawnPLM(kPlmHeaderDefPtrs[v0]); return 0; @@ -866,15 +848,14 @@ uint8 BlockColl_Horiz_SpecialBlock(void) { // 0x9490CB v0 = BTS[cur_block_index]; if ((v0 & 0x80) != 0) { - R34 = off_9492E9[area_index]; - uint8 *v3 = RomPtr_94(R34); - uint8 v4 = SpawnPLM(*(uint16 *)&v3[(uint16)(2 * (v0 & 0x7F))]) & 1; + const uint16 *v2 = (const uint16 *)RomPtr_94(off_9492E9[area_index]); + uint8 v4 = SpawnPLM(v2[v0 & 0x7f]) & 1; if (v4) return BlockColl_Horiz_SolidShootGrappleBlock(); return v4; } else { uint8 v1 = SpawnPLM(kPlmHeaderDefPtrs[v0]) & 1; - if (v1 & 1) + if (v1) return BlockColl_Horiz_SolidShootGrappleBlock(); return v1; } @@ -885,8 +866,7 @@ uint8 BlockColl_Vert_SpecialBlock(void) { // 0x949102 v0 = BTS[cur_block_index]; if ((v0 & 0x80) != 0) { - R34 = off_9492E9[area_index]; - uint16 *v3 = (uint16*)RomPtr_94(R34); + const uint16 *v3 = (const uint16 *)RomPtr_94(off_9492E9[area_index]); uint8 v4 = SpawnPLM(v3[v0 & 0x7F]) & 1; if (v4) return BlockColl_Vert_SolidShootGrappleBlock(); @@ -899,30 +879,23 @@ uint8 BlockColl_Vert_SpecialBlock(void) { // 0x949102 } } -#define off_94936B ((uint16*)RomPtr(0x94936b)) uint8 BlockColl_Horiz_BombableAir(void) { // 0x9492F9 - int16 v0; - - v0 = BTS[cur_block_index]; + uint16 v0 = BTS[cur_block_index]; if ((v0 & 0x80) == 0) SpawnPLM(off_94936B[v0]); return 0; } uint8 BlockColl_Vert_BombableAir(void) { // 0x949313 - int16 v0; - - v0 = BTS[cur_block_index]; + uint16 v0 = BTS[cur_block_index]; if ((v0 & 0x80) == 0) SpawnPLM(off_94936B[v0]); return 0; } uint8 BlockColl_Horiz_BombBlock(void) { // 0x94932D - int16 v0; - - v0 = BTS[cur_block_index]; + uint16 v0 = BTS[cur_block_index]; if ((v0 & 0x80) != 0) return BlockColl_Horiz_SolidShootGrappleBlock(); uint8 v1 = SpawnPLM(off_94936B[v0]) & 1; @@ -933,9 +906,7 @@ uint8 BlockColl_Horiz_BombBlock(void) { // 0x94932D } uint8 BlockColl_Vert_BombBlock(void) { // 0x94934C - int16 v0; - - v0 = BTS[cur_block_index]; + uint16 v0 = BTS[cur_block_index]; if ((v0 & 0x80) != 0) return BlockColl_Vert_SolidShootGrappleBlock(); uint8 v1 = SpawnPLM(off_94936B[v0]) & 1; @@ -948,8 +919,8 @@ uint8 BlockColl_Vert_BombBlock(void) { // 0x94934C uint8 BlockColl_Horiz_Door(void) { // 0x94938B door_transition_function = FUNC16(DoorTransitionFunction_HandleElevator); door_bts = BTS[cur_block_index]; - uint16 v0 = *(uint16 *)RomPtr_8F(door_list_pointer + 2 * ((uint8)door_bts & 0x7Fu)); - if ((get_DoorDef(v0)->room_definition_ptr & 0x8000u) == 0) { + uint16 v0 = *(uint16 *)RomPtr_8F(door_list_pointer + 2 * (door_bts & 0x7F)); + if ((get_DoorDef(v0)->room_definition_ptr & 0x8000) == 0) { if (samus_pose < kGameState_9_HitDoorBlock) elevator_flags = 1; return BlockColl_Horiz_SolidShootGrappleBlock(); @@ -963,8 +934,8 @@ uint8 BlockColl_Horiz_Door(void) { // 0x94938B uint8 BlockColl_Vert_Door(void) { // 0x9493CE door_transition_function = FUNC16(DoorTransitionFunction_HandleElevator); door_bts = BTS[cur_block_index]; - uint16 v0 = *(uint16 *)RomPtr_8F(door_list_pointer + 2 * (door_bts & 0x7Fu)); - if (*(int16 *)RomPtr_83(v0) >= 0) { + uint16 v0 = *(uint16 *)RomPtr_8F(door_list_pointer + 2 * (door_bts & 0x7F)); + if ((get_DoorDef(v0)->room_definition_ptr & 0x8000) == 0) { if (samus_pose < kPose_09_MoveR_NoAim) elevator_flags = 1; return BlockColl_Vert_SolidShootGrappleBlock(); @@ -988,14 +959,14 @@ uint8 BlockReact_VertExt(void) { // 0x949447 uint16 v0; if (BTS[cur_block_index]) { if ((BTS[cur_block_index] & 0x80) != 0) { - temp_collision_DD4 = BTS[cur_block_index] | 0xFF00; + uint16 temp_collision_DD4 = BTS[cur_block_index] | 0xFF00; v0 = cur_block_index; do { v0 -= room_width_in_blocks; ++temp_collision_DD4; } while (temp_collision_DD4); } else { - temp_collision_DD4 = BTS[cur_block_index]; + uint16 temp_collision_DD4 = BTS[cur_block_index]; v0 = cur_block_index; do { v0 += room_width_in_blocks; @@ -1082,15 +1053,15 @@ uint8 BlockColl_Handle_Horiz(void) { // 0x949543 R22_ = R20_ + samus_x_subpos; uint16 v0 = R18_ + __CFADD__uint16(R20_, samus_x_subpos) + samus_x_pos; R24_ = v0; - if ((R18_ & 0x8000u) == 0) + if ((R18_ & 0x8000) == 0) v1 = samus_x_radius + v0 - 1; else v1 = v0 - samus_x_radius; - R32 = v1; + R32_ = v1; uint16 v2 = 2 * (prod + (v1 >> 4)); while (!(BlockColl_Horiz_CheckColl(v2) & 1)) { v2 += room_width_in_blocks * 2; - if ((--R26_ & 0x8000u) != 0) + if ((--R26_ & 0x8000) != 0) return 0; } return 1; @@ -1103,16 +1074,16 @@ uint8 BlockColl_Handle_Vert_LeftToRight(void) { // 0x94959E R22_ = R20_ + samus_y_subpos; uint16 v0 = R18_ + __CFADD__uint16(R20_, samus_y_subpos) + samus_y_pos, v1; R24_ = v0; - if ((R18_ & 0x8000u) == 0) + if ((R18_ & 0x8000) == 0) v1 = samus_y_radius + v0 - 1; else v1 = v0 - samus_y_radius; - R32 = v1; + R32_ = v1; uint16 prod = Mult8x8(v1 >> 4, room_width_in_blocks); v2 = (uint16)(samus_x_pos - samus_x_radius) >> 4; cur_block_index = prod + v2; for (int i = 2 * cur_block_index; !(BlockColl_Vert_CheckColl(i) & 1); i += 2) { - if ((--R26_ & 0x8000u) != 0) + if ((--R26_ & 0x8000) != 0) return 0; } return 1; @@ -1126,11 +1097,11 @@ uint8 BlockColl_Handle_Vert_RightToLeft(void) { // 0x9495F5 R22_ = R20_ + samus_y_subpos; uint16 v0 = R18_ + __CFADD__uint16(R20_, samus_y_subpos) + samus_y_pos, v1; R24_ = v0; - if ((R18_ & 0x8000u) == 0) + if ((R18_ & 0x8000) == 0) v1 = samus_y_radius + v0 - 1; else v1 = v0 - samus_y_radius; - R32 = v1; + R32_ = v1; uint16 prod = Mult8x8(v1 >> 4, room_width_in_blocks); v2 = (uint16)(samus_x_radius + samus_x_pos - 1) >> 4; cur_block_index = prod + v2; @@ -1142,7 +1113,7 @@ uint8 BlockColl_Handle_Vert_RightToLeft(void) { // 0x9495F5 } void AbsoluteValueOfInt32(void) { // 0x949653 - if ((R18_ & 0x8000u) != 0) { + if ((R18_ & 0x8000) != 0) { R18_ = ~R18_; bool v0 = R20_ == 0; R20_ = -R20_; @@ -1152,7 +1123,7 @@ void AbsoluteValueOfInt32(void) { // 0x949653 } void AbsoluteValueOfInt32_0(void) { // 0x949669 - if ((R18_ & 0x8000u) != 0) { + if ((R18_ & 0x8000) != 0) { R18_ = ~R18_; bool v0 = R20_ == 0; R20_ = -R20_; @@ -1496,7 +1467,7 @@ uint8 BlockInsideReact_SpecialAir(void) { v0 = BTS[cur_block_index] << 8; if (v0 < 0) { R34 = g_off_949B06[area_index]; - uint8 *v3 = RomPtr_94(R34); + const uint8 *v3 = RomPtr_94(R34); SpawnPLM(*(uint16 *)&v3[(2 * (HIBYTE(v0) & 0x7F))]); } else { off_949966[v0 >> 8](); @@ -1533,9 +1504,7 @@ void BlockInsideDetection(void) { // 0x949B60 R26_ = samus_x_pos; samus_bottom_boundary_position = samus_y_radius + samus_y_pos - 1; R28_ = samus_y_radius + samus_y_pos - 1; - g_word_7E001E = 0; - R32 = 0; - CalculateBlockAt(); + CalculateBlockAt(R26_, R28_, 0, 0); uint8 rv; do { rv = kSamus_BlockInsideDetection[(HIBYTE(level_data[cur_block_index]) & 0xF0) >> 4](); @@ -1544,9 +1513,7 @@ void BlockInsideDetection(void) { // 0x949B60 if (((samus_bottom_boundary_position ^ samus_y_pos) & 0xFFF0) != 0) { R26_ = samus_x_pos; R28_ = samus_y_pos; - g_word_7E001E = 0; - R32 = 0; - CalculateBlockAt(); + CalculateBlockAt(R26_, R28_, 0, 0); do { rv = kSamus_BlockInsideDetection[(HIBYTE(level_data[cur_block_index]) & 0xF0) >> 4](); } while (rv & 0x80); @@ -1556,25 +1523,24 @@ void BlockInsideDetection(void) { // 0x949B60 && ((samus_y_pos ^ (samus_bottom_boundary_position ^ (uint16)(samus_y_pos - samus_y_radius)) & 0xFFF0) & 0xFFF0) != 0) { R26_ = samus_x_pos; R28_ = samus_y_pos - samus_y_radius; - g_word_7E001E = 0; - R32 = 0; - CalculateBlockAt(); + CalculateBlockAt(R26_, R28_, 0, 0); do { rv = kSamus_BlockInsideDetection[(HIBYTE(level_data[cur_block_index]) & 0xF0) >> 4](); } while (rv & 0x80); } } -void CalculateBlockAt(void) { // 0x949C1D +void CalculateBlockAt(uint16 r26, uint16 r28, uint16 r30, uint16 r32) { // 0x949C1D int16 v0; int16 v1; + uint16 temp_collision_DD4; - v0 = g_word_7E001E + R26_; - if ((int16)(g_word_7E001E + R26_) >= 0 + v0 = r30 + r26; + if ((int16)(r30 + r26) >= 0 && sign16(v0 - 4096) && (temp_collision_DD4 = (uint16)(v0 & 0xFFF0) >> 4, - v1 = R32 + R28_, - (int16)(R32 + R28_) >= 0) + v1 = r32 + r28, + (int16)(r32 + r28) >= 0) && sign16(v1 - 4096)) { uint16 RegWord = (uint16)(v1 & 0xFFF0) >> 4; RegWord = Mult8x8(RegWord, room_width_in_blocks); @@ -1614,10 +1580,10 @@ void BlockFunc_9C73(uint16 v0) { int v1 = v0 >> 1; if ((projectile_type[v1] & 0xF00) != 0) { - temp_collision_DD2 = kBlockFunc_9C73_Tab1[(uint16)(2 * (HIBYTE(projectile_type[v1]) & 0xF) + 1)]; + temp_collision_DD2 = kBlockFunc_9C73_Tab1[2 * (HIBYTE(projectile_type[v1]) & 0xF) + 1]; } else { - R18_ = projectile_type[v1] & 0xF; - temp_collision_DD2 = kBlockFunc_9C73_Tab0[(uint16)(R18_ + 2 * R18_ + 2)]; + int R18 = projectile_type[v1] & 0xF; + temp_collision_DD2 = kBlockFunc_9C73_Tab0[3 * R18 + 2]; } } @@ -1635,10 +1601,8 @@ void BombOrPowerBomb_Func1(uint16 v0) { // 0x949CAC if (v3 >= 0) { R28_ = projectile_y_pos[v1]; if ((int16)(HIBYTE(v3) - room_height_in_scrolls) < 0) { - g_word_7E001E = 0; - R32 = 0; cur_block_index = 0; - CalculateBlockAt(); + CalculateBlockAt(R26_, R28_, 0, 0); if (temp_collision_DD2 == 2) BlockColl_BombExplosion(v0); else @@ -1698,7 +1662,7 @@ uint8 SetCarry_0(void) { // 0x949D5B } uint8 sub_949D5D(void) { // 0x949D5D - if ((BTS[cur_block_index] & 0x1Fu) < 5) + if ((BTS[cur_block_index] & 0x1F) < 5) return 1; else return BlockShotReactVert_Slope_NonSquare() & 1; @@ -1711,7 +1675,7 @@ uint8 BlockBombedReact_Special(void) { // 0x949D71 if ((v0 & 0x80) != 0) { uint16 *kBlockBombedReact_Region_Plm = (uint16 *)RomPtr_94(0x9e44); R18_ = kBlockBombedReact_Region_Plm[area_index]; - uint8 *v2 = RomPtr_94(R18_); + const uint8 *v2 = RomPtr_94(R18_); SpawnPLM(*(uint16 *)&v2[(uint16)(2 * (v0 & 0x7F))]); } else { uint16 *kBlockBombedReact_Special_Plm = (uint16 *)RomPtr_94(0x9dA4); @@ -1853,7 +1817,7 @@ void BlockFunc_A11A(uint16 a) { // 0x94A11A uint8 BlockShotReactHoriz_Slope(void) { // 0x94A147 - if ((BTS[cur_block_index] & 0x1Fu) < 5) + if ((BTS[cur_block_index] & 0x1F) < 5) return BlockShotReactVert_Slope_Square(BTS[cur_block_index] & 0x1F, cur_block_index); else return BlockShotReactVert_Slope_NonSquare(); @@ -1864,7 +1828,7 @@ uint8 SetCarry_1(void) { // 0x94A15C } uint8 BlockShotReactVert_Slope(void) { // 0x94A15E - if ((BTS[cur_block_index] & 0x1Fu) < 5) + if ((BTS[cur_block_index] & 0x1F) < 5) return BlockShotReactHoriz_Slope_Square(BTS[cur_block_index] & 0x1F, cur_block_index); else return BlockShotReactHoriz_Slope_NonSquare(); @@ -1957,14 +1921,14 @@ void BlockGetSomePos2(uint16 k) { // 0x94A219 uint8 BlockCollNoWaveBeamHoriz(uint16 k) { // 0x94A23B int16 v2; - g_word_7E001E = 0; + R30_ = 0; R18_ = 0; R20_ = 0; int v1 = k >> 1; v2 = projectile_bomb_x_speed[v1]; if (v2 < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = v2; + R19_ = v2; BlockGetSomePos1(k); uint16 prod = Mult8x8((uint16)(projectile_y_pos[v1] - projectile_y_radius[v1]) >> 4, room_width_in_blocks); uint16 v3 = projectile_bomb_x_subpos[v1]; @@ -1975,7 +1939,7 @@ uint8 BlockCollNoWaveBeamHoriz(uint16 k) { // 0x94A23B uint16 v6 = R20_ + v4 + projectile_x_pos[v1], v7; projectile_x_pos[v1] = v6; R24_ = v6; - if ((R20_ & 0x8000u) != 0) + if ((R20_ & 0x8000) != 0) v7 = v6 - projectile_x_radius[v1]; else v7 = projectile_x_radius[v1] + v6 - 1; @@ -1987,8 +1951,8 @@ uint8 BlockCollNoWaveBeamHoriz(uint16 k) { // 0x94A23B BlockShotReactHoriz(v8); v8 += room_width_in_blocks * 2; --R38; - } while ((R38 & 0x8000u) == 0); - if ((R40 & 0x8000u) == 0) + } while ((R38 & 0x8000) == 0); + if ((R40 & 0x8000) == 0) return 0; KillProjectile(k); return 1; @@ -1999,14 +1963,14 @@ uint8 BlockCollNoWaveBeamVert(uint16 k) { // 0x94A2CA int16 v8; int16 v9; - g_word_7E001E = 0; + R30_ = 0; R18_ = 0; R20_ = 0; int v1 = k >> 1; v2 = projectile_bomb_y_speed[v1]; if (v2 < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = v2; + R19_ = v2; BlockGetSomePos2(k); uint16 v3 = projectile_bomb_y_subpos[v1]; bool v4 = __CFADD__uint16(R18_, v3); @@ -2016,7 +1980,7 @@ uint8 BlockCollNoWaveBeamVert(uint16 k) { // 0x94A2CA uint16 v6 = R20_ + v4 + projectile_y_pos[v1], v7; projectile_y_pos[v1] = v6; R24_ = v6; - if ((R20_ & 0x8000u) != 0) + if ((R20_ & 0x8000) != 0) v7 = v6 - projectile_y_radius[v1]; else v7 = projectile_y_radius[v1] + v6 - 1; @@ -2029,8 +1993,8 @@ uint8 BlockCollNoWaveBeamVert(uint16 k) { // 0x94A2CA BlockShotReactVert(v9); v9 += 2; --R38; - } while ((R38 & 0x8000u) == 0); - if ((R40 & 0x8000u) == 0) + } while ((R38 & 0x8000) == 0); + if ((R40 & 0x8000) == 0) return 0; KillProjectile(k); return 1; @@ -2042,14 +2006,14 @@ uint8 BlockCollWaveBeamHoriz(uint16 k) { // 0x94A352 char v9; int16 v10; - g_word_7E001E = 0; + R30_ = 0; R18_ = 0; R20_ = 0; int v1 = k >> 1; v2 = projectile_bomb_x_speed[v1]; if (v2 < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = v2; + R19_ = v2; BlockGetSomePos1(k); uint16 prod = Mult8x8((uint16)(projectile_y_pos[v1] - projectile_y_radius[v1]) >> 4, room_width_in_blocks); uint16 v3 = projectile_bomb_x_subpos[v1]; @@ -2060,7 +2024,7 @@ uint8 BlockCollWaveBeamHoriz(uint16 k) { // 0x94A352 uint16 v6 = R20_ + v4 + projectile_x_pos[v1], v7; projectile_x_pos[v1] = v6; R24_ = v6; - if ((R20_ & 0x8000u) != 0) + if ((R20_ & 0x8000) != 0) v7 = v6 - projectile_x_radius[v1]; else v7 = projectile_x_radius[v1] + v6 - 1; @@ -2076,7 +2040,7 @@ uint8 BlockCollWaveBeamHoriz(uint16 k) { // 0x94A352 BlockShotReactHoriz(v10); v10 += room_width_in_blocks * 2; --R38; - } while ((R38 & 0x8000u) == 0); + } while ((R38 & 0x8000) == 0); } } return 0; @@ -2089,14 +2053,14 @@ uint8 BlockCollWaveBeamVert(uint16 k) { // 0x94A3E4 char v10; int16 v11; - g_word_7E001E = 0; + R30_ = 0; R18_ = 0; R20_ = 0; int v1 = k >> 1; v2 = projectile_bomb_y_speed[v1]; if (v2 < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = v2; + R19_ = v2; BlockGetSomePos2(k); uint16 v3 = projectile_bomb_y_subpos[v1]; bool v4 = __CFADD__uint16(R18_, v3); @@ -2106,7 +2070,7 @@ uint8 BlockCollWaveBeamVert(uint16 k) { // 0x94A3E4 uint16 v6 = R20_ + v4 + projectile_y_pos[v1], v7; projectile_y_pos[v1] = v6; R24_ = v6; - if ((R20_ & 0x8000u) != 0) + if ((R20_ & 0x8000) != 0) v7 = v6 - projectile_y_radius[v1]; else v7 = projectile_y_radius[v1] + v6 - 1; @@ -2124,7 +2088,7 @@ uint8 BlockCollWaveBeamVert(uint16 k) { // 0x94A3E4 BlockShotReactVert(v11); v11 += 2; --R38; - } while ((R38 & 0x8000u) == 0); + } while ((R38 & 0x8000) == 0); } } return 0; @@ -2133,7 +2097,7 @@ uint8 BlockCollWaveBeamVert(uint16 k) { // 0x94A3E4 uint8 BlockCollMissileHoriz(uint16 k) { // 0x94A46F int16 v2; - g_word_7E001E = 1; + R30_ = 1; R38 = 0; R26_ = 0; R18_ = 0; @@ -2142,7 +2106,7 @@ uint8 BlockCollMissileHoriz(uint16 k) { // 0x94A46F v2 = projectile_bomb_x_speed[v1]; if (v2 < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = v2; + R19_ = v2; uint16 prod = Mult8x8(projectile_y_pos[v1] >> 4, room_width_in_blocks); uint16 v3 = projectile_bomb_x_subpos[v1]; bool v4 = __CFADD__uint16(R18_, v3); @@ -2164,7 +2128,7 @@ uint8 BlockCollMissileVert(uint16 k) { // 0x94A4D9 int16 v2; int16 v7; - g_word_7E001E = 1; + R30_ = 1; R38 = 0; R26_ = 0; R18_ = 0; @@ -2173,7 +2137,7 @@ uint8 BlockCollMissileVert(uint16 k) { // 0x94A4D9 v2 = projectile_bomb_y_speed[v1]; if (v2 < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = v2; + R19_ = v2; uint16 v3 = projectile_bomb_y_subpos[v1]; bool v4 = __CFADD__uint16(R18_, v3); uint16 v5 = R18_ + v3; @@ -2223,14 +2187,14 @@ uint8 BlockShotReact_Slope_NonSquare(uint16 j, uint16 k) { // 0x94A58F int16 v5; uint16 v2; - temp_collision_DD6 = 16 * (BTS[k] & 0x1F); + uint16 temp_collision_DD6 = 16 * (BTS[k] & 0x1F); if ((BTS[k] & 0x40) != 0) v2 = projectile_x_pos[j >> 1] ^ 0xF; else v2 = projectile_x_pos[j >> 1]; uint16 v6 = temp_collision_DD6 + (v2 & 0xF); if (!(BTS[k] & 0x80)) { - temp_collision_DD4 = projectile_y_pos[j >> 1] & 0xF; + uint16 temp_collision_DD4 = projectile_y_pos[j >> 1] & 0xF; v5 = kAlignYPos_Tab0[v6] & 0x1F; if ((int16)(v5 - temp_collision_DD4) < 0 || v5 == temp_collision_DD4) { R38 = 0; @@ -2240,7 +2204,7 @@ uint8 BlockShotReact_Slope_NonSquare(uint16 j, uint16 k) { // 0x94A58F return 0; } } else { - temp_collision_DD4 = projectile_y_pos[j >> 1] & 0xF ^ 0xF; + uint16 temp_collision_DD4 = projectile_y_pos[j >> 1] & 0xF ^ 0xF; v3 = kAlignYPos_Tab0[v6] & 0x1F; if ((int16)(v3 - temp_collision_DD4) < 0 || v3 == temp_collision_DD4) { R38 = 0; @@ -2276,10 +2240,10 @@ uint8 BlockCollSpreadBomb(uint16 k) { // 0x94A621 int v1 = k >> 1; R26_ = projectile_x_pos[v1]; R28_ = projectile_y_pos[v1]; - g_word_7E001E = 0; - R32 = 0; + R30_ = 0; + R32_ = 0; cur_block_index = 0; - CalculateBlockAt(); + CalculateBlockAt(R26_, R28_, R30_, R32_); if (!projectile_variables[v1]) { BlockColl_BombExplosion(k); return 0; @@ -2294,10 +2258,10 @@ uint8 BlockCollSpreadBomb(uint16 k) { // 0x94A621 } uint8 BlockShotReactVert_Slope_Square(uint16 a, uint16 k) { // 0x94A66A - temp_collision_DD4 = 4 * a; - temp_collision_DD6 = BTS[k] >> 6; + uint16 temp_collision_DD4 = 4 * a; + uint16 temp_collision_DD6 = BTS[k] >> 6; uint16 v2 = 4 * a + (temp_collision_DD6 ^ ((uint8)(R28_ & 8) >> 3)); - if (!g_word_7E001E) { + if (!R30_) { if (!R26_) { int v3 = projectile_index >> 1; if (((projectile_y_pos[v3] - projectile_y_radius[v3]) & 8) != 0 @@ -2329,10 +2293,10 @@ uint8 BlockShotReactVert_Slope_Square(uint16 a, uint16 k) { // 0x94A66A uint8 BlockShotReactHoriz_Slope_Square(uint16 a, uint16 k) { // 0x94A71A - temp_collision_DD4 = 4 * a; - temp_collision_DD6 = BTS[k] >> 6; + uint16 temp_collision_DD4 = 4 * a; + uint16 temp_collision_DD6 = BTS[k] >> 6; uint16 v2 = 4 * a + (temp_collision_DD6 ^ ((uint8)(R28_ & 8) >> 2)); - if (!g_word_7E001E) { + if (!R30_) { if (!R26_) { int v3 = projectile_index >> 1; if (((projectile_x_pos[v3] - projectile_x_radius[v3]) & 8) != 0 @@ -2422,12 +2386,12 @@ uint8 BlockCollGrappleBeam(void) { // 0x94A85B *(uint16 *)((char *)&grapple_beam_tmpD82 + 1) = grapple_beam_extension_x_velocity; *(uint32 *)&grapple_beam_tmpD82 >>= 2; - if ((grapple_beam_extension_x_velocity & 0x8000u) != 0) + if ((grapple_beam_extension_x_velocity & 0x8000) != 0) grapple_beam_tmpD84 |= 0xFFC0u; *(uint16 *)((char *)&grapple_beam_y_quarter_subvel + 1) = grapple_beam_extension_y_velocity; *(uint32 *)&grapple_beam_y_quarter_subvel >>= 2; - if ((grapple_beam_extension_y_velocity & 0x8000u) != 0) + if ((grapple_beam_extension_y_velocity & 0x8000) != 0) grapple_beam_y_quarter_vel |= 0xFFC0u; grapple_beam_tmpD8A = 4; while (1) { @@ -2511,14 +2475,14 @@ void BlockFunc_A957(void) { int16 v7; uint16 v0 = grapple_beam_tmpD82, v2, v3; - if ((grapple_beam_flags & 0x8000u) == 0) { + if ((grapple_beam_flags & 0x8000) == 0) { int v1 = grapple_beam_tmpD82 >> 1; - if ((kSinCosTable8bit_Sext[v1 + 64] & 0x8000u) != 0) + if ((kSinCosTable8bit_Sext[v1 + 64] & 0x8000) != 0) v2 = grapple_beam_end_x_pos & 0xFFF0 | 7; else v2 = grapple_beam_end_x_pos & 0xFFF0 | 8; grapple_beam_end_x_pos = v2; - if ((kSinCosTable8bit_Sext[v1] & 0x8000u) != 0) + if ((kSinCosTable8bit_Sext[v1] & 0x8000) != 0) v3 = grapple_beam_end_y_pos & 0xFFF0 | 7; else v3 = grapple_beam_end_y_pos & 0xFFF0 | 8; @@ -2722,7 +2686,7 @@ void BlockFunc_AC11(void) { // 0x94AC11 uint8 BlockFunc_AC31(void) { // 0x94AC31 if (!grapple_beam_length_delta) return 0; - if ((grapple_beam_length_delta & 0x8000u) != 0) { + if ((grapple_beam_length_delta & 0x8000) != 0) { uint16 v0 = grapple_beam_length_delta + grapple_beam_length; if ((uint16)(grapple_beam_length_delta + grapple_beam_length) < 8u) { grapple_beam_length_delta = 0; @@ -2750,7 +2714,7 @@ LABEL_8: } uint16 v3; v3 = grapple_beam_length_delta + grapple_beam_length; - if ((uint16)(grapple_beam_length_delta + grapple_beam_length) >= 0x3Fu) { + if ((uint16)(grapple_beam_length_delta + grapple_beam_length) >= 0x3F) { grapple_beam_length_delta = 0; v3 = 63; } @@ -2825,9 +2789,9 @@ LABEL_12: *(uint16 *)&grapple_beam_end_subangle += g_word_7E0D9C; grapple_beam_end_angles_mirror = *(uint16 *)&grapple_beam_end_subangle; grapple_beam_unkD36 &= ~0x8000u; - if ((--grapple_beam_unkD30 & 0x8000u) != 0) + if ((--grapple_beam_unkD30 & 0x8000) != 0) grapple_beam_unkD30 = 0; - if ((grapple_beam_unkD2E & 0x8000u) == 0) { + if ((grapple_beam_unkD2E & 0x8000) == 0) { v3 = grapple_beam_unkD2E - 6; if ((int16)(grapple_beam_unkD2E - 6) >= 0) { LABEL_19: @@ -2857,9 +2821,9 @@ LABEL_28: *(uint16 *)&grapple_beam_end_subangle += g_word_7E0D9C; grapple_beam_end_angles_mirror = *(uint16 *)&grapple_beam_end_subangle; grapple_beam_unkD36 &= ~0x8000u; - if ((--grapple_beam_unkD30 & 0x8000u) != 0) + if ((--grapple_beam_unkD30 & 0x8000) != 0) grapple_beam_unkD30 = 0; - if ((grapple_beam_unkD2E & 0x8000u) == 0) { + if ((grapple_beam_unkD2E & 0x8000) == 0) { v6 = grapple_beam_unkD2E - 6; if ((int16)(grapple_beam_unkD2E - 6) >= 0) { LABEL_35: @@ -2897,7 +2861,7 @@ LABEL_39: } uint8 BlockFunc_AEE3(void) { // 0x94AEE3 - if (((grapple_beam_unkD26 ^ *(uint16 *)&grapple_beam_end_subangle) & 0x8000u) != 0) { + if (((grapple_beam_unkD26 ^ *(uint16 *)&grapple_beam_end_subangle) & 0x8000) != 0) { grapple_beam_unkD38 = 0; return 1; } else { @@ -2947,19 +2911,19 @@ void HandleGrappleBeamGfx(void) { // 0x94AFBA if ((kSinCosTable8bit_Sext[v1 + 64] & 0x1000) != 0) --R28_; *(uint16 *)((char *)&R26_ + 1) = v2; - g_word_7E001E = 0; - R32 = 0; + R30_ = 0; + R32_ = 0; uint16 v3 = 8 * kSinCosTable8bit_Sext[v1]; if ((kSinCosTable8bit_Sext[v1] & 0x1000) != 0) - --R32; - *(uint16 *)((char *)&g_word_7E001E + 1) = v3; + --R32_; + *(uint16 *)((char *)&R30_ + 1) = v3; R38 = (uint16)(*(uint16 *)&grapple_beam_end_subangle & 0x8000) >> 1; R38 |= 2 * ((*(uint16 *)&grapple_beam_end_subangle ^ R38) & 0x4000 ^ 0x4000); R20_ = x_pos_of_start_of_grapple_beam_prevframe - layer1_x_pos - 4; R18_ = 0; R24_ = y_pos_of_start_of_grapple_beam_prevframe - layer1_y_pos - 4; R22_ = 0; - if ((grapple_beam_length & 0x8000u) == 0) { + if ((grapple_beam_length & 0x8000) == 0) { RegWord = grapple_beam_length / 8; if (RegWord >= 0) { R40 = (RegWord & 0xF) - 1; @@ -2969,9 +2933,9 @@ void HandleGrappleBeamGfx(void) { // 0x94AFBA uint16 v10; if (grapple_segment_anim_instr_timers[v6]-- == 1) { for (i = grapple_segment_anim_instr_ptrs[v6]; ; ) { - uint16 *v9 = (uint16 *)RomPtr_94(i); + const uint16 *v9 = (const uint16 *)RomPtr_94(i); v10 = *v9; - if ((*v9 & 0x8000u) == 0) + if ((*v9 & 0x8000) == 0) break; R36 = *v9; i = CallGrappleInstr(v10 | 0x940000, i + 2); @@ -2986,7 +2950,7 @@ void HandleGrappleBeamGfx(void) { // 0x94AFBA DrawGrappleOams(v12); v5 -= 2; --R40; - } while ((R40 & 0x8000u) == 0); + } while ((R40 & 0x8000) == 0); if (samus_pose == kPose_B2_FaceR_Grapple_Air || samus_pose == kPose_B3_FaceL_Grapple_Air) DrawGrappleOams3(); else @@ -3007,7 +2971,7 @@ void DrawGrappleOams(uint16 j) { // 0x94B0AA R20_ = HIWORD(v3); R18_ = v3; *(uint16 *)&v2->ycoord = R24_; - v4 = __PAIR32__(R32, g_word_7E001E) + __PAIR32__(R24_, R22_); + v4 = __PAIR32__(R32_, R30_) + __PAIR32__(R24_, R22_); R24_ = HIWORD(v4); R22_ = v4; *(uint16 *)&v2->charnum = R38 | j; @@ -3059,4 +3023,4 @@ void DrawGrappleOams3(void) { // 0x94B14B *(uint16 *)&v2->ycoord = grapple_beam_end_y_pos - layer1_y_pos - 4; *(uint16 *)&v2->charnum = 14880; oam_next_ptr = v0 + 4; -} +} \ No newline at end of file diff --git a/src/sm_9b.c b/src/sm_9b.c index c5eba4c..fb72a0c 100644 --- a/src/sm_9b.c +++ b/src/sm_9b.c @@ -3,27 +3,56 @@ #include "variables.h" #include "funcs.h" -#define g_off_9BA4B3 ((uint16*)RomPtr(0x9ba4b3)) -#define g_off_9BA4CB ((uint16*)RomPtr(0x9ba4cb)) -#define g_off_9BA4E3 ((uint16*)RomPtr(0x9ba4e3)) + +#define g_off_9BA4B3 ((uint16*)RomFixedPtr(0x9ba4b3)) +#define g_off_9BA4CB ((uint16*)RomFixedPtr(0x9ba4cb)) +#define g_off_9BA4E3 ((uint16*)RomFixedPtr(0x9ba4e3)) +#define g_off_9BB5C8 ((uint16*)RomFixedPtr(0x9bb5c8)) +#define g_byte_9BB823 ((uint8*)RomFixedPtr(0x9bb823)) +#define g_off_9BB6D2 ((uint16*)RomFixedPtr(0x9bb6d2)) +#define kDeathSequencePals_PowerSuit ((uint16*)RomFixedPtr(0x9bb7d3)) +#define kDeathSequencePals_VariaSuit ((uint16*)RomFixedPtr(0x9bb7e7)) +#define kDeathSequencePals_GravitySuit ((uint16*)RomFixedPtr(0x9bb7fb)) +#define kDeathSequencePals_Suitless ((uint16*)RomFixedPtr(0x9bb80f)) +#define g_off_9BC3C6 ((uint16*)RomFixedPtr(0x9bc3c6)) +#define g_off_9BC3EE ((uint16*)RomFixedPtr(0x9bc3ee)) +#define g_off_9BC416 ((uint16*)RomFixedPtr(0x9bc416)) +#define grapple_beam_special_angles ((GrappleBeamSpecialAngles*)RomFixedPtr(0x9bc43e)) +#define kGrappleBeam_SwingingData ((uint8*)RomFixedPtr(0x9bc1c2)) +#define kGrappleBeam_SwingingData2 ((uint8*)RomFixedPtr(0x9bc2c2)) +#define kGrappleBeam_SwingingData3 ((uint8*)RomFixedPtr(0x9bc302)) +#define kGrappleBeam_OriginX_NoRun ((uint16*)RomFixedPtr(0x9bc122)) +#define kGrappleBeam_OriginY_NoRun ((uint16*)RomFixedPtr(0x9bc136)) +#define kGrappleBeam_0x0d1a_offs_NoRun ((uint16*)RomFixedPtr(0x9bc14a)) +#define kGrappleBeam_0x0d1c_offs_NoRun ((uint16*)RomFixedPtr(0x9bc15e)) +#define kGrappleBeam_OriginX_Run ((uint16*)RomFixedPtr(0x9bc172)) +#define kGrappleBeam_OriginY_Run ((uint16*)RomFixedPtr(0x9bc186)) +#define kGrappleBeam_0x0d1a_offs_Run ((uint16*)RomFixedPtr(0x9bc19a)) +#define kGrappleBeam_0x0d1c_offs_Run ((uint16*)RomFixedPtr(0x9bc1ae)) +#define g_off_9BC344 (*(uint16*)RomFixedPtr(0x9bc344)) +#define g_off_9BC342 (*(uint16*)RomFixedPtr(0x9bc342)) +#define g_off_9BC346 ((uint16*)RomFixedPtr(0x9bc346)) +#define kFlareAnimDelays ((uint16*)RomFixedPtr(0x90c481)) +#define kFlareAnimDelays_Main ((uint8*)RomFixedPtr(0x90c487)) +#define kFlareAnimDelays_SlowSparks ((uint8*)RomFixedPtr(0x90c4a7)) +#define kFlareAnimDelays_FastSparks ((uint8*)RomFixedPtr(0x90c4ae)) +#define g_word_93A22B ((uint16*)RomFixedPtr(0x93a22b)) +#define g_word_93A225 ((uint16*)RomFixedPtr(0x93a225)) +#define g_byte_9BC9BA ((uint8*)RomFixedPtr(0x9bc9ba)) +#define g_byte_9BC9C4 ((uint8*)RomFixedPtr(0x9bc9c4)) +#define kGrappleBeam_Ext_Xvel ((uint16*)RomFixedPtr(0x9bc0db)) +#define kGrappleBeam_Ext_Yvel ((uint16*)RomFixedPtr(0x9bc0ef)) +#define kGrappleBeam_Init_EndAngle ((uint16*)RomFixedPtr(0x9bc104)) + + + static const uint8 kDeathAnimationFrames[28] = { 5, 5, 5, 5, 1, 5, 5, 0, 1, 0, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 5, 5, 5, 5, 5, 5, 5, 5, }; -#define g_off_9BB5C8 ((uint16*)RomPtr(0x9bb5c8)) -#define g_byte_9BB823 ((uint8*)RomPtr(0x9bb823)) -#define g_off_9BB6D2 ((uint16*)RomPtr(0x9bb6d2)) -#define kDeathSequencePals_PowerSuit ((uint16*)RomPtr(0x9bb7d3)) -#define kDeathSequencePals_VariaSuit ((uint16*)RomPtr(0x9bb7e7)) -#define kDeathSequencePals_GravitySuit ((uint16*)RomPtr(0x9bb7fb)) -#define kDeathSequencePals_Suitless ((uint16*)RomPtr(0x9bb80f)) -#define g_off_9BC3C6 ((uint16*)RomPtr(0x9bc3c6)) -#define g_off_9BC3EE ((uint16*)RomPtr(0x9bc3ee)) -#define g_off_9BC416 ((uint16*)RomPtr(0x9bc416)) -#define grapple_beam_special_angles ((GrappleBeamSpecialAngles*)RomPtr(0x9bc43e)) static const uint16 g_word_9BC118 = 24; static const uint16 g_word_9BC11A = 0xc; static const uint16 g_word_9BC11C = 5; @@ -42,31 +71,6 @@ static const uint8 kIsGrappleBannedForMovementType[28] = { 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, }; -#define kGrappleBeam_SwingingData ((uint8*)RomPtr(0x9bc1c2)) -#define kGrappleBeam_SwingingData2 ((uint8*)RomPtr(0x9bc2c2)) -#define kGrappleBeam_SwingingData3 ((uint8*)RomPtr(0x9bc302)) -#define kGrappleBeam_OriginX_NoRun ((uint16*)RomPtr(0x9bc122)) -#define kGrappleBeam_OriginY_NoRun ((uint16*)RomPtr(0x9bc136)) -#define kGrappleBeam_0x0d1a_offs_NoRun ((uint16*)RomPtr(0x9bc14a)) -#define kGrappleBeam_0x0d1c_offs_NoRun ((uint16*)RomPtr(0x9bc15e)) -#define kGrappleBeam_OriginX_Run ((uint16*)RomPtr(0x9bc172)) -#define kGrappleBeam_OriginY_Run ((uint16*)RomPtr(0x9bc186)) -#define kGrappleBeam_0x0d1a_offs_Run ((uint16*)RomPtr(0x9bc19a)) -#define kGrappleBeam_0x0d1c_offs_Run ((uint16*)RomPtr(0x9bc1ae)) -#define g_off_9BC344 (*(uint16*)RomPtr(0x9bc344)) -#define g_off_9BC342 (*(uint16*)RomPtr(0x9bc342)) -#define g_off_9BC346 ((uint16*)RomPtr(0x9bc346)) -#define kFlareAnimDelays ((uint16*)RomPtr(0x90c481)) -#define kFlareAnimDelays_Main ((uint8*)RomPtr(0x90c487)) -#define kFlareAnimDelays_SlowSparks ((uint8*)RomPtr(0x90c4a7)) -#define kFlareAnimDelays_FastSparks ((uint8*)RomPtr(0x90c4ae)) -#define g_word_93A22B ((uint16*)RomPtr(0x93a22b)) -#define g_word_93A225 ((uint16*)RomPtr(0x93a225)) -#define g_byte_9BC9BA ((uint8*)RomPtr(0x9bc9ba)) -#define g_byte_9BC9C4 ((uint8*)RomPtr(0x9bc9c4)) -#define kGrappleBeam_Ext_Xvel ((uint16*)RomPtr(0x9bc0db)) -#define kGrappleBeam_Ext_Yvel ((uint16*)RomPtr(0x9bc0ef)) -#define kGrappleBeam_Init_EndAngle ((uint16*)RomPtr(0x9bc104)) void ProjectileTrail_Func5(uint16 k, uint16 j) { // 0x9BA3CC ProjectileInsts_GetValue(k); @@ -90,7 +94,7 @@ void ProjectileTrail_Func5(uint16 k, uint16 j) { // 0x9BA3CC v5 = g_off_9BA4B3[projectile_type[v3] & 0xF] + 2 * (projectile_dir[v3] & 0xF); } uint16 v6 = *(uint16 *)RomPtr_9B(v5) + 4 * R22_; - uint8 *p = RomPtr_9B(v6); + const uint8 *p = RomPtr_9B(v6); int v7 = j >> 1; projectiletrail_left_y_pos[v7] = R20_ + (int8)p[1] - 4; projectiletrail_left_x_pos[v7] = R18_ + (int8)p[0] - 4; @@ -147,41 +151,9 @@ uint16 HandleSamusDeathSequence(void) { // 0x9BB441 } void HandleSamusDeathSequence_Helper2(void) { // 0x9BB4B6 - uint16 *v0 = (uint16 *)RomPtr_9B(g_off_9BB5C8[samus_suit_palette_index >> 1]); - uint16 *v1 = (uint16 *)RomPtr_9B(*v0); - palette_buffer[192] = *v1; - palette_buffer[193] = v1[1]; - palette_buffer[194] = v1[2]; - palette_buffer[195] = v1[3]; - palette_buffer[196] = v1[4]; - palette_buffer[197] = v1[5]; - palette_buffer[198] = v1[6]; - palette_buffer[199] = v1[7]; - palette_buffer[200] = v1[8]; - palette_buffer[201] = v1[9]; - palette_buffer[202] = v1[10]; - palette_buffer[203] = v1[11]; - palette_buffer[204] = v1[12]; - palette_buffer[205] = v1[13]; - palette_buffer[206] = v1[14]; - palette_buffer[207] = v1[15]; - uint16 *v2 = (uint16 *)RomPtr_9B(0xA120); - palette_buffer[240] = *v2; - palette_buffer[241] = v2[1]; - palette_buffer[242] = v2[2]; - palette_buffer[243] = v2[3]; - palette_buffer[244] = v2[4]; - palette_buffer[245] = v2[5]; - palette_buffer[246] = v2[6]; - palette_buffer[247] = v2[7]; - palette_buffer[248] = v2[8]; - palette_buffer[249] = v2[9]; - palette_buffer[250] = v2[10]; - palette_buffer[251] = v2[11]; - palette_buffer[252] = v2[12]; - palette_buffer[253] = v2[13]; - palette_buffer[254] = v2[14]; - palette_buffer[255] = v2[15]; + const uint16 *v0 = (const uint16 *)RomPtr_9B(g_off_9BB5C8[samus_suit_palette_index >> 1]); + memcpy(&palette_buffer[192], RomPtr_9B(*v0), 32); + memcpy(&palette_buffer[240], RomPtr_9B(addr_word_9BA120), 32); QueueTransferOfSamusDeathSequence(8); game_options_screen_index = g_byte_9BB823[0]; g_word_7E0DE4 = 0; @@ -190,43 +162,10 @@ void HandleSamusDeathSequence_Helper2(void) { // 0x9BB4B6 } void CopyPalettesForSamusDeath(uint16 v0) { // 0x9BB5CE - R20_ = g_off_9BB6D2[samus_suit_palette_index >> 1]; - R18_ = kDeathSequencePals_Suitless[v0 >> 1]; - uint16 *v1 = (uint16 *)RomPtr_9B(R20_ + v0); - uint16 *v2 = (uint16 *)RomPtr_9B(*v1); - palette_buffer[192] = *v2; - palette_buffer[193] = v2[1]; - palette_buffer[194] = v2[2]; - palette_buffer[195] = v2[3]; - palette_buffer[196] = v2[4]; - palette_buffer[197] = v2[5]; - palette_buffer[198] = v2[6]; - palette_buffer[199] = v2[7]; - palette_buffer[200] = v2[8]; - palette_buffer[201] = v2[9]; - palette_buffer[202] = v2[10]; - palette_buffer[203] = v2[11]; - palette_buffer[204] = v2[12]; - palette_buffer[205] = v2[13]; - palette_buffer[206] = v2[14]; - palette_buffer[207] = v2[15]; - uint16 *v3 = (uint16 *)RomPtr_9B(R18_); - palette_buffer[240] = *v3; - palette_buffer[241] = v3[1]; - palette_buffer[242] = v3[2]; - palette_buffer[243] = v3[3]; - palette_buffer[244] = v3[4]; - palette_buffer[245] = v3[5]; - palette_buffer[246] = v3[6]; - palette_buffer[247] = v3[7]; - palette_buffer[248] = v3[8]; - palette_buffer[249] = v3[9]; - palette_buffer[250] = v3[10]; - palette_buffer[251] = v3[11]; - palette_buffer[252] = v3[12]; - palette_buffer[253] = v3[13]; - palette_buffer[254] = v3[14]; - palette_buffer[255] = v3[15]; + int R20 = g_off_9BB6D2[samus_suit_palette_index >> 1]; + const uint16 *v1 = (const uint16 *)RomPtr_9B(R20 + v0); + memcpy(&palette_buffer[192], RomPtr_9B(*v1), 32); + memcpy(&palette_buffer[240], RomPtr_9B(kDeathSequencePals_Suitless[v0 >> 1]), 32); } void QueueTransferOfSamusDeathSequence(uint16 v0) { // 0x9BB6D8 @@ -247,20 +186,13 @@ uint16 GameState_24_SamusNoHealth_Explosion_Helper(void) { // 0x9BB701 } void GameState_24_SamusNoHealth_Explosion_1(void) { // 0x9BB710 - *(VoidP *)((char *)&R0_.addr + 1) = 32256; if (!substate && g_word_7E0DE4) { - uint16 v0 = 2 * g_word_7E0DE6; - R0_.addr = -16384; - uint16 v1 = 0; - do { - IndirWriteWord(&R0_, v1, kShadesOfWhite[v0 >> 1]); - v1 += 2; - } while ((int16)(v1 - 384) < 0); - uint16 v2 = 416; - do { - IndirWriteWord(&R0_, v2, kShadesOfWhite[v0 >> 1]); - v2 += 2; - } while ((int16)(v2 - 480) < 0); + int v0 = g_word_7E0DE6; + uint16 *dst = (uint16*)(g_ram + 0xc000); + for(int i = 0; i < 384/2; i++) + dst[i] = kShadesOfWhite[v0]; + for(int i = 416/2; i < 480/2; i++) + dst[i] = kShadesOfWhite[v0]; if (sign16(g_word_7E0DE6 - 20)) ++g_word_7E0DE6; } @@ -291,11 +223,11 @@ void CancelGrappleBeamIfIncompatiblePose(void) { // 0x9BB861 if (kIsGrappleBannedForMovementType[samus_movement_type]) { LABEL_2: - if (grapple_beam_function != (uint16)FUNC16(GrappleBeamFunc_Inactive)) + if (grapple_beam_function != FUNC16(GrappleBeamFunc_Inactive)) grapple_beam_function = FUNC16(GrappleBeamFunc_Cancel); return; } - if (grapple_beam_function != (uint16)FUNC16(GrappleBeamFunc_Inactive) + if (grapple_beam_function != FUNC16(GrappleBeamFunc_Inactive) && sign16(grapple_beam_function + 0x3882)) { v0 = *(&kPoseParams[0].direction_shots_fired + (uint16)(8 * samus_pose)); if ((v0 & 0xF0) == 0) { @@ -333,36 +265,36 @@ int ProcessEnemyGrappleBeamColl(uint16 a) { // 0x9BB907 uint16 v3; v1 = 2 * a; - switch (v1) { + switch (a) { case 0: - case 4: - return -1; // clc - case 6: - return 1; case 2: - case 8: - case 10: + return -1; // clc + case 3: + return 1; + case 1: + case 4: + case 5: + return 0; + case 6: + R18_ = *((uint16 *)RomPtr_A0(R18_) + 3); + if ((equipped_items & 0x20) != 0) { + R18_ >>= 1; + R18_ >>= 1; + v3 = R18_; + } else { + if (equipped_items & 1) + R18_ >>= 1; + v3 = R18_; + } + Samus_DealDamage(v3); + samus_invincibility_timer = 96; + samus_knockback_timer = 5; + knockback_x_dir = samus_pose_x_dir == 4; + return 1; + default: + Unreachable(); return 0; } - if (v1 != 12) { - Unreachable(); - while (1); - } - R18_ = *((uint16 *)RomPtr_A0(R18_) + 3); - if ((equipped_items & 0x20) != 0) { - R18_ >>= 1; - R18_ >>= 1; - v3 = R18_; - } else { - if (equipped_items & 1) - R18_ >>= 1; - v3 = R18_; - } - Samus_DealDamage(v3); - samus_invincibility_timer = 96; - samus_knockback_timer = 5; - knockback_x_dir = samus_pose_x_dir == 4; - return 1; } void CallGrappleNextFunc(uint32 ea) { @@ -462,15 +394,10 @@ void UNUSED_sub_9BBA31(void) { // 0x9BBA31 } void HandleConnectingGrapple_Swinging(void) { // 0x9BBA61 - char v1; // t0 - samus_special_transgfx_index = 9; R18_ = samus_x_pos - grapple_beam_end_x_pos; R20_ = samus_y_pos - grapple_beam_end_y_pos; - uint16 v0 = CalculateAngleFromXY(); - v1 = v0; - LOBYTE(v0) = HIBYTE(v0); - HIBYTE(v0) = v1; + uint16 v0 = swap16(CalculateAngleFromXY()); *(uint16 *)&grapple_beam_end_subangle = v0; grapple_beam_end_angles_mirror = v0; grapple_beam_length_delta = 0; @@ -480,15 +407,10 @@ void HandleConnectingGrapple_Swinging(void) { // 0x9BBA61 } void HandleConnectingGrapple_StuckInPlace(void) { // 0x9BBA9B - char v1; // t0 - samus_special_transgfx_index = 10; R18_ = samus_x_pos - grapple_beam_end_x_pos; R20_ = samus_y_pos - grapple_beam_end_y_pos; - uint16 v0 = CalculateAngleFromXY(); - v1 = v0; - LOBYTE(v0) = HIBYTE(v0); - HIBYTE(v0) = v1; + uint16 v0 = swap16(CalculateAngleFromXY()); *(uint16 *)&grapple_beam_end_subangle = v0; grapple_beam_end_angles_mirror = v0; grapple_beam_length_delta = 0; @@ -498,9 +420,6 @@ void HandleConnectingGrapple_StuckInPlace(void) { // 0x9BBA9B } uint8 HandleSpecialGrappleBeamAngles(void) { // 0x9BBAD5 - int16 v2; - int16 v3; - uint16 v0 = 7; while (*(uint16 *)&grapple_beam_end_subangle != grapple_beam_special_angles[v0].field_0) { if ((--v0 & 0x8000u) != 0) @@ -512,14 +431,14 @@ uint8 HandleSpecialGrappleBeamAngles(void) { // 0x9BBAD5 grapple_beam_function = grapple_beam_special_angles[v0].field_8; samus_special_transgfx_index = 0; slow_grabble_scrolling_flag = 0; - v2 = samus_x_pos - samus_prev_x_pos; + int16 v2 = samus_x_pos - samus_prev_x_pos; if ((int16)(samus_x_pos - samus_prev_x_pos) < 0) { if (sign16(v2 + 12)) samus_prev_x_pos = samus_x_pos + 12; } else if (!sign16(v2 - 13)) { samus_prev_x_pos = samus_x_pos - 12; } - v3 = samus_y_pos - samus_prev_y_pos; + int16 v3 = samus_y_pos - samus_prev_y_pos; if ((int16)(samus_y_pos - samus_prev_y_pos) < 0) { if (sign16(v3 + 12)) samus_prev_y_pos = samus_y_pos + 12; @@ -809,7 +728,7 @@ void GrappleBeamHandler(void) { // 0x9BC490 samus_grapple_flags &= ~1u; CancelGrappleBeamIfIncompatiblePose(); CallGrappleBeamFunc(grapple_beam_function | 0x9B0000); - if (grapple_beam_function != (uint16)FUNC16(GrappleBeamFunc_Inactive) + if (grapple_beam_function != FUNC16(GrappleBeamFunc_Inactive) && sign16(grapple_beam_function + 0x37AA) && (samus_suit_palette_index & 4) == 0 && fx_type @@ -1256,4 +1175,4 @@ void GrappleBeamFunc_ReleaseFromSwing(void) { // 0x9BCB8B hud_item_index = 0; samus_auto_cancel_hud_item_index = 0; } -} +} \ No newline at end of file diff --git a/src/sm_a0.c b/src/sm_a0.c index c3fe13f..9db5d8b 100644 --- a/src/sm_a0.c +++ b/src/sm_a0.c @@ -5,7 +5,18 @@ #include "funcs.h" #include "enemy_types.h" -#define kEnemyLayerToQueuePtr ((uint16*)RomPtr(0xa0b133)) + +#define kEnemyLayerToQueuePtr ((uint16*)RomFixedPtr(0xa0b133)) +#define kStandardSpriteTiles ((uint16*)RomFixedPtr(0x9ad200)) +#define kSine8bit ((uint8*)RomFixedPtr(0xa0b143)) +#define kEquationForQuarterCircle ((uint16*)RomFixedPtr(0xa0b7ee)) +#define g_off_A0C2DA ((uint16*)RomFixedPtr(0xa0c2da)) +#define CHECK_locret_A0C434(i) (byte_A0C435[i] & 0x80 ? -1 : 0) +#define g_word_A0C49F ((uint16*)RomFixedPtr(0xa0c49f)) +#define kAlignYPos_Tab0 ((uint8*)RomFixedPtr(0x948b2b)) + + + void Enemy_GrappleReact_NoInteract_A0(void) { // 0xA08000 SwitchEnemyAiToMainAi(); @@ -75,106 +86,98 @@ void func_nullsub_170(void) { ; } -uint16 EnemyInstr_SetAiPreInstr(uint16 k, uint16 j) { // 0xA0806B - uint16 v2 = *(uint16 *)RomPtr_A0(j); - gEnemyData(k)->ai_preinstr = v2; - return j + 2; +const uint16 *EnemyInstr_SetAiPreInstr(uint16 k, const uint16 *jp) { // 0xA0806B + gEnemyData(k)->ai_preinstr = jp[0]; + return jp + 1; } -uint16 EnemyInstr_ClearAiPreInstr(uint16 k, uint16 j) { // 0xA08074 +const uint16 *EnemyInstr_ClearAiPreInstr(uint16 k, const uint16 *jp) { // 0xA08074 gEnemyData(k)->ai_preinstr = FUNC16(nullsub_171); - return j; + return jp; } void func_nullsub_171(void) { ; } -uint16 EnemyInstr_StopScript(uint16 k, uint16 j) { // 0xA0807C +const uint16 *EnemyInstr_StopScript(uint16 k, const uint16 *jp) { // 0xA0807C EnemyData *v2 = gEnemyData(k); v2->properties |= kEnemyProps_Deleted; return 0; } -uint16 EnemyInstr_Goto(uint16 k, uint16 j) { // 0xA080ED - return *(uint16 *)RomPtr_A0(j); +const uint16 *EnemyInstr_Goto(uint16 k, const uint16 *jp) { // 0xA280ED + return INSTR_RETURN_ADDR(*jp); } -uint16 EnemyInstr_GotoRel(uint16 k, uint16 j) { // 0xA080F2 - return j + (int8)*RomPtr_A0(j); +const uint16 *EnemyInstr_GotoRel(uint16 k, const uint16 *jp) { // 0xA080F2 + return (const uint16 * )((uint8*)jp + *(int8*)jp); } -uint16 EnemyInstr_DecTimerAndGoto(uint16 k, uint16 j) { // 0xA08108 +const uint16 *EnemyInstr_DecTimerAndGoto(uint16 k, const uint16 *jp) { // 0xA08108 EnemyData *v2 = gEnemyData(k); if (v2->timer-- == 1) - return j + 2; + return jp + 1; else - return EnemyInstr_Goto(k, j); + return EnemyInstr_Goto(k, jp); } -uint16 EnemyInstr_DecTimerAndGoto2(uint16 k, uint16 j) { // 0xA08110 - EnemyData *v2 = gEnemyData(k); - if (v2->timer-- == 1) - return j + 2; - else - return EnemyInstr_Goto(k, j); -} - -uint16 EnemyInstr_DecTimerAndGotoRel(uint16 k, uint16 j) { // 0xA08118 +const uint16 *EnemyInstr_DecTimerAndGotoRel(uint16 k, const uint16 *jp) { // 0xA08118 EnemyData *v2 = gEnemyData(k); if (LOBYTE(v2->timer)-- == 1) - return j + 1; + return (const uint16 *)((uint8 *)jp + 1); else - return EnemyInstr_GotoRel(k, j); + return EnemyInstr_GotoRel(k, jp); } -uint16 EnemyInstr_SetTimer(uint16 k, uint16 j) { // 0xA08123 - uint16 v2 = *(uint16 *)RomPtr_A0(j); - gEnemyData(k)->timer = v2; - return j + 2; +const uint16 *EnemyInstr_SetTimer(uint16 k, const uint16 *jp) { // 0xA08123 + gEnemyData(k)->timer = *jp; + return jp + 1; } -uint16 EnemyInstr_Skip2bytes(uint16 k, uint16 j) { // 0xA0812C - return j + 2; +const uint16 *EnemyInstr_Skip2bytes(uint16 k, const uint16 *jp) { // 0xA0812C + return jp + 1; } -uint16 EnemyInstr_Sleep(uint16 k, uint16 j) { // 0xA0812F - gEnemyData(k)->current_instruction = j - 2; +const uint16 *EnemyInstr_Sleep(uint16 k, const uint16 *jp) { // 0xA2812F + EnemyData *ED = gEnemyData(k); + const uint8 *base_ptr = RomPtrWithBank(ED->bank, 0x8000) - 0x8000; + ED->current_instruction = (const uint8 *)jp - 2 - base_ptr; return 0; } -uint16 EnemyInstr_WaitNframes(uint16 k, uint16 j) { // 0xA0813A - uint16 v2 = *(uint16 *)RomPtr_A0(j); - EnemyData *v3 = gEnemyData(k); - v3->instruction_timer = v2; - v3->current_instruction = j + 2; +const uint16 *EnemyInstr_WaitNframes(uint16 k, const uint16 *jp) { // 0xA0813A + EnemyData *ED = gEnemyData(k); + const uint8 *base_ptr = RomPtrWithBank(ED->bank, 0x8000) - 0x8000; + ED->instruction_timer = jp[0]; + ED->current_instruction = (const uint8 *)jp + 2 - base_ptr; return 0; } -uint16 EnemyInstr_CopyToVram(uint16 k, uint16 j) { // 0xA0814B +const uint16 *EnemyInstr_CopyToVram(uint16 k, const uint16 *jp) { // 0xA0814B VramWriteEntry *v4; uint16 v2 = vram_write_queue_tail; - uint8 *v3 = RomPtr_A0(j); + uint8 *v3 = (uint8*)jp; v4 = gVramWriteEntry(vram_write_queue_tail); - v4->size = *(uint16 *)v3; - v4->src.addr = *((uint16 *)v3 + 1); - *(VoidP *)((char *)&v4->src.addr + 1) = *(uint16 *)(v3 + 3); - v4->vram_dst = *(uint16 *)(v3 + 5); + v4->size = GET_WORD(v3); + v4->src.addr = GET_WORD(v3 + 2); + *(VoidP *)((char *)&v4->src.addr + 1) = GET_WORD(v3 + 3); + v4->vram_dst = GET_WORD(v3 + 5); vram_write_queue_tail = v2 + 7; - return j + 7; + return INSTR_INCR_BYTES(jp, 7); } -uint16 EnemyInstr_EnableOffScreenProcessing(uint16 k, uint16 j) { // 0xA08173 +const uint16 *EnemyInstr_EnableOffScreenProcessing(uint16 k, const uint16 *jp) { // 0xA08173 EnemyData *v2 = gEnemyData(k); v2->properties |= 0x800u; - return j; + return jp; } -uint16 EnemyInstr_DisableOffScreenProcessing(uint16 k, uint16 j) { // 0xA0817D +const uint16 *EnemyInstr_DisableOffScreenProcessing(uint16 k, const uint16 *jp) { // 0xA0817D EnemyData *v2 = gEnemyData(k); v2->properties &= ~0x800u; - return j; + return jp; } static const uint16 kRoomShakes[144] = { // 0xA08687 @@ -284,7 +287,7 @@ void DrawSamusEnemiesAndProjectiles(void) { // 0xA0884D do { loop_index = v1; uint8 *v2 = RomPtr_RAM(enemy_drawing_queue_base + v1); - uint16 v3 = *(uint16 *)v2; + uint16 v3 = GET_WORD(v2); *(uint16 *)v2 = 0; cur_enemy_index = v3; WriteEnemyOams(); @@ -317,7 +320,7 @@ void RecordEnemySpawnData(uint16 j) { // 0xA088D0 R28_ = 0; uint16 name_ptr = get_EnemyDef_A2(v1->enemy_ptr)->name_ptr; if (name_ptr) { - uint16 *v4 = (uint16 *)RomPtr_B4(name_ptr); + const uint16 *v4 = (const uint16 *)RomPtr_B4(name_ptr); R18_ = *v4; R20_ = v4[1]; R22_ = v4[2]; @@ -334,47 +337,7 @@ void RecordEnemySpawnData(uint16 j) { // 0xA088D0 *(uint16 *)&v5->name[10] = R28_; } -void DebugLoadEnemySetData(void) { // 0xA0896F - int16 v1; - - uint16 v0 = 0; - v1 = 160; - do { - *(uint16 *)&debug_enemy_set_name[v0] = 0; - v0 += 2; - v1 -= 2; - } while (v1); - uint8 *v2 = RomPtr_B4(room_enemy_tilesets_ptr - 7); - *(uint16 *)debug_enemy_set_name = *(uint16 *)v2; - *(uint16 *)&debug_enemy_set_name[2] = *((uint16 *)v2 + 1); - *(uint16 *)&debug_enemy_set_name[4] = *((uint16 *)v2 + 2); - *(uint16 *)&debug_enemy_set_name[6] = *((uint16 *)v2 + 3); - uint16 v3 = 7; - for (int i = room_enemy_tilesets_ptr; ; i += 4) { - uint16 v5 = *(uint16 *)RomPtr_B4(i); - if (v5 == 0xFFFF) - break; - uint16 v6 = *((uint16 *)RomPtr_A0(v5) + 31); - if (!v6) - v6 = addr_asc_B4DD89; - uint16 *v7 = (uint16 *)RomPtr_B4(v6); - R18_ = *v7; - R20_ = v7[1]; - R22_ = v7[2]; - R24_ = v7[3]; - R26_ = v7[4]; - *(uint16 *)&debug_enemy_set_name[v3] = R18_; - *(uint16 *)&debug_enemy_set_name[v3 + 2] = R20_; - *(uint16 *)&debug_enemy_set_name[v3 + 4] = R22_; - *(uint16 *)&debug_enemy_set_name[v3 + 6] = R24_; - *(uint16 *)&debug_enemy_set_data[v3] = R26_; - *(uint16 *)&debug_enemy_set_data[v3 + 2] = *((uint16 *)RomPtr_B4(i) + 1); - v3 += 12; - } -} - void LoadEnemies(void) { // 0xA08A1E - // DebugLoadEnemySetData(); debug_time_frozen_for_enemies = 0; *(uint16 *)&enemy_gfx_drawn_hook.bank = 160; enemy_gfx_drawn_hook.addr = FUNC16(nullsub_170); @@ -490,7 +453,7 @@ void LoadEnemyGfxIndexes(uint16 k, uint16 j) { // 0xA08BF3 R18_ = k; R20_ = j; R28_ = room_enemy_tilesets_ptr; - g_word_7E001E = 0; + R30_ = 0; while (1) { enemy_ptr = get_EnemyPopulation(0xa1, R18_)->enemy_ptr; EnemyTileset = get_EnemyTileset(R28_); @@ -506,7 +469,7 @@ void LoadEnemyGfxIndexes(uint16 k, uint16 j) { // 0xA08BF3 v6->palette_index = 2560; return; } - g_word_7E001E += get_EnemyDef_A2(EnemyTileset->enemy_def)->tile_data_size >> 5; + R30_ += get_EnemyDef_A2(EnemyTileset->enemy_def)->tile_data_size >> 5; R28_ += 4; } uint16 v7 = (get_EnemyTileset(R28_)->vram_dst & 0xF) << 9; @@ -515,11 +478,10 @@ void LoadEnemyGfxIndexes(uint16 k, uint16 j) { // 0xA08BF3 v9->palette_index = v7; v10 = gEnemySpawnData(v8); v10->palette_index = v7; - uint16 v11 = g_word_7E001E; - v9->vram_tiles_index = g_word_7E001E; + uint16 v11 = R30_; + v9->vram_tiles_index = R30_; v10->vram_tiles_index = v11; } -#define kStandardSpriteTiles ((uint16*)RomPtr(0x9ad200)) void LoadEnemyTileData(void) { // 0xA08C6C for (int i = 510; i >= 0; i -= 2) gEnemySpawnData(i)->some_flag = kStandardSpriteTiles[(i >> 1) + 3072]; @@ -576,7 +538,7 @@ void TransferEnemyTilesToVramAndInit(void) { // 0xA08CD7 void ProcessEnemyTilesets(void) { // 0xA08D64 enemy_tile_load_data_write_pos = 0; - g_word_7E001E = 2048; + R30_ = 2048; enemy_def_ptr[0] = 0; enemy_def_ptr[1] = 0; enemy_def_ptr[2] = 0; @@ -600,7 +562,7 @@ void ProcessEnemyTilesets(void) { // 0xA08D64 varE2E = 0; LD->tile_data_size = ED->tile_data_size & 0x7FFF; LD->tile_data_ptr = ED->tile_data; - uint16 v10 = g_word_7E001E; + uint16 v10 = R30_; if ((ED->tile_data_size & 0x8000u) != 0) v10 = (uint16)(ET->vram_dst & 0x3000) >> 3; LD->offset_into_ram = v10; @@ -612,7 +574,7 @@ void ProcessEnemyTilesets(void) { // 0xA08D64 enemy_gfxdata_vram_ptr[v11 >> 1] = ET->vram_dst; enemy_gfx_data_write_ptr += 2; next_enemy_tiles_index += ED->tile_data_size >> 5; - g_word_7E001E += ED->tile_data_size; + R30_ += ED->tile_data_size; } } @@ -625,7 +587,7 @@ void DetermineWhichEnemiesToProcess(void) { // 0xA08EB6 do { uint16 v5 = cur_enemy_index; EnemyData *v6 = gEnemyData(cur_enemy_index); - if (v6->enemy_ptr && v6->enemy_ptr != (uint16)addr_kEnemyDef_DAFF) { + if (v6->enemy_ptr && v6->enemy_ptr != addr_kEnemyDef_DAFF) { if ((v6->properties & 0x200) != 0) { v6->enemy_ptr = 0; } else { @@ -649,7 +611,7 @@ void DetermineWhichEnemiesToProcess(void) { // 0xA08EB6 do { uint16 v0 = cur_enemy_index; EnemyData *v1 = gEnemyData(cur_enemy_index); - if (v1->enemy_ptr && v1->enemy_ptr != (uint16)addr_kEnemyDef_DAFF) { + if (v1->enemy_ptr && v1->enemy_ptr != addr_kEnemyDef_DAFF) { uint16 properties = v1->properties; if ((properties & 0x200) != 0) { v1->enemy_ptr = 0; @@ -1327,14 +1289,14 @@ void CallEnemyPreInstr(uint32 ea) { } } -uint16 CallEnemyInstr(uint32 ea, uint16 k, uint16 j) { +const uint16 *CallEnemyInstr(uint32 ea, uint16 k, const uint16 *j) { switch (ea) { - case fnEnemyInstr_Goto_A2: return EnemyInstr_Goto_A2(k, j); - case fnEnemyInstr_DecTimerAndGoto2_A2: return EnemyInstr_DecTimerAndGoto2_A2(k, j); - case fnEnemyInstr_SetTimer_A2: return EnemyInstr_SetTimer_A2(k, j); - case fnEnemyInstr_Sleep_A2: return EnemyInstr_Sleep_A2(k, j); - case fnEnemyInstr_EnableOffScreenProcessing_A2: return EnemyInstr_EnableOffScreenProcessing_A2(k, j); - case fnEnemyInstr_DisableOffScreenProcessing_A2: return EnemyInstr_DisableOffScreenProcessing_A2(k, j); + case fnEnemyInstr_Goto_A2: return EnemyInstr_Goto(k, j); + case fnEnemyInstr_DecTimerAndGoto2_A2: return EnemyInstr_DecTimerAndGoto(k, j); + case fnEnemyInstr_SetTimer_A2: return EnemyInstr_SetTimer(k, j); + case fnEnemyInstr_Sleep_A2: return EnemyInstr_Sleep(k, j); + case fnEnemyInstr_EnableOffScreenProcessing_A2: return EnemyInstr_EnableOffScreenProcessing(k, j); + case fnEnemyInstr_DisableOffScreenProcessing_A2: return EnemyInstr_DisableOffScreenProcessing(k, j); case fnBouncingGoofball_Instr_88C5: return BouncingGoofball_Instr_88C5(k, j); case fnBouncingGoofball_Instr_88C6: return BouncingGoofball_Instr_88C6(k, j); case fnMiniCrocomire_Instr_897E: return MiniCrocomire_Instr_897E(k, j); @@ -1378,10 +1340,10 @@ uint16 CallEnemyInstr(uint32 ea, uint16 k, uint16 j) { case fnMaridiaLargeSnail_Instr_CCBE: return MaridiaLargeSnail_Instr_CCBE(k, j); case fnMaridiaLargeSnail_Instr_CCC9: return MaridiaLargeSnail_Instr_CCC9(k, j); case fnLavaSeahorse_Instr_E5FB: return LavaSeahorse_Instr_E5FB(k, j); - case fnEnemyInstr_Goto_A3: return EnemyInstr_Goto_A3(k, j); - case fnEnemyInstr_Sleep_A3: return EnemyInstr_Sleep_A3(k, j); - case fnEnemyInstr_EnableOffScreenProcessing_A3: return EnemyInstr_EnableOffScreenProcessing_A3(k, j); - case fnEnemyInstr_DisableOffScreenProcessing_A3: return EnemyInstr_DisableOffScreenProcessing_A3(k, j); + case fnEnemyInstr_Goto_A3: return EnemyInstr_Goto(k, j); + case fnEnemyInstr_Sleep_A3: return EnemyInstr_Sleep(k, j); + case fnEnemyInstr_EnableOffScreenProcessing_A3: return EnemyInstr_EnableOffScreenProcessing(k, j); + case fnEnemyInstr_DisableOffScreenProcessing_A3: return EnemyInstr_DisableOffScreenProcessing(k, j); case fnWaver_Instr_1: return Waver_Instr_1(k, j); case fnMetalee_Instr_1: return Metalee_Instr_1(k, j); case fnMaridiaFish_Instr_3: return MaridiaFish_Instr_3(k, j); @@ -1409,8 +1371,8 @@ uint16 CallEnemyInstr(uint32 ea, uint16 k, uint16 j) { case fnZoomer_Instr_SetPreinstr: return Zoomer_Instr_SetPreinstr(k, j); case fnMetroid_Instr_2: return Metroid_Instr_2(k, j); case fnMetroid_Instr_1: return Metroid_Instr_1(k, j); - case fnEnemyInstr_Goto_A4: return EnemyInstr_Goto_A4(k, j); - case fnEnemyInstr_Sleep_A4: return EnemyInstr_Sleep_A4(k, j); + case fnEnemyInstr_Goto_A4: return EnemyInstr_Goto(k, j); + case fnEnemyInstr_Sleep_A4: return EnemyInstr_Sleep(k, j); case fnCrocomire_Instr_1: return Crocomire_Instr_1(k, j); case fnCrocomire_Instr_14: return Crocomire_Instr_14(k, j); case fnCrocomire_Instr_11: return Crocomire_Instr_11(k, j); @@ -1438,12 +1400,12 @@ uint16 CallEnemyInstr(uint32 ea, uint16 k, uint16 j) { case fnCrocomire_Instr_25: return Crocomire_Instr_25(k, j); case fnCrocomire_Instr_26: return Crocomire_Instr_26(k, j); case fnCrocomire_Instr_27: return Crocomire_Instr_27(k, j); - case fnEnemyInstr_StopScript_A5: return EnemyInstr_StopScript_A5(k, j); - case fnEnemyInstr_Goto_A5: return EnemyInstr_Goto_A5(k, j); - case fnEnemyInstr_DecTimerAndGoto2_A5: return EnemyInstr_DecTimerAndGoto2_A5(k, j); - case fnEnemyInstr_SetTimer_A5: return EnemyInstr_SetTimer_A5(k, j); - case fnEnemyInstr_Sleep_A5: return EnemyInstr_Sleep_A5(k, j); - case fnEnemyInstr_WaitNframes_A5: return EnemyInstr_WaitNframes_A5(k, j); + case fnEnemyInstr_StopScript_A5: return EnemyInstr_StopScript(k, j); + case fnEnemyInstr_Goto_A5: return EnemyInstr_Goto(k, j); + case fnEnemyInstr_DecTimerAndGoto2_A5: return EnemyInstr_DecTimerAndGoto(k, j); + case fnEnemyInstr_SetTimer_A5: return EnemyInstr_SetTimer(k, j); + case fnEnemyInstr_Sleep_A5: return EnemyInstr_Sleep(k, j); + case fnEnemyInstr_WaitNframes_A5: return EnemyInstr_WaitNframes(k, j); case fnDraygon_Instr_1: return Draygon_Instr_1(k, j); case fnDraygon_Instr_13: return Draygon_Instr_13(k, j); case fnDraygon_Instr_8: return Draygon_Instr_8(k, j); @@ -1474,8 +1436,8 @@ uint16 CallEnemyInstr(uint32 ea, uint16 k, uint16 j) { case fnDraygon_Instr_19: return Draygon_Instr_19(k, j); case fnDraygon_Instr_28: return Draygon_Instr_28(k, j); case fnDraygon_Instr_26: return Draygon_Instr_26(k, j); - case fnEnemyInstr_Goto_A6: return EnemyInstr_Goto_A6(k, j); - case fnEnemyInstr_Sleep_A6: return EnemyInstr_Sleep_A6(k, j); + case fnEnemyInstr_Goto_A6: return EnemyInstr_Goto(k, j); + case fnEnemyInstr_Sleep_A6: return EnemyInstr_Sleep(k, j); case fnFireGeyser_Instr_1: return FireGeyser_Instr_1(k, j); case fnFireGeyser_Instr_2: return FireGeyser_Instr_2(k, j); case fnFireGeyser_Instr_3: return FireGeyser_Instr_3(k, j); @@ -1535,10 +1497,10 @@ uint16 CallEnemyInstr(uint32 ea, uint16 k, uint16 j) { case fnCeresDoor_Instr_2: return CeresDoor_Instr_2(k, j); case fnCeresDoor_Instr_7: return CeresDoor_Instr_7(k, j); case fnEnemyInstr_Call_A7: return EnemyInstr_Call_A7(k, j); - case fnEnemyInstr_Goto_A7: return EnemyInstr_Goto_A7(k, j); - case fnEnemyInstr_DecTimerAndGoto2_A7: return EnemyInstr_DecTimerAndGoto2_A7(k, j); - case fnEnemyInstr_SetTimer_A7: return EnemyInstr_SetTimer_A7(k, j); - case fnEnemyInstr_Sleep_A7: return EnemyInstr_Sleep_A7(k, j); + case fnEnemyInstr_Goto_A7: return EnemyInstr_Goto(k, j); + case fnEnemyInstr_DecTimerAndGoto2_A7: return EnemyInstr_DecTimerAndGoto(k, j); + case fnEnemyInstr_SetTimer_A7: return EnemyInstr_SetTimer(k, j); + case fnEnemyInstr_Sleep_A7: return EnemyInstr_Sleep(k, j); case fnKraid_Instr_9: return Kraid_Instr_9(k, j); case fnKraid_Instr_1: return Kraid_Instr_1(k, j); case fnKraid_Instr_DecYpos: return Kraid_Instr_DecYpos(k, j); @@ -1548,12 +1510,12 @@ uint16 CallEnemyInstr(uint32 ea, uint16 k, uint16 j) { case fnKraid_Instr_XposMinus3b: return Kraid_Instr_XposMinus3b(k, j); case fnKraid_Instr_XposPlus3: return Kraid_Instr_XposPlus3(k, j); case fnKraid_Instr_MoveHimRight: return Kraid_Instr_MoveHimRight(k, j); - case fnEnemyInstr_Goto_A8: return EnemyInstr_Goto_A8(k, j); - case fnEnemyInstr_DecTimerAndGoto2_A8: return EnemyInstr_DecTimerAndGoto2_A8(k, j); - case fnEnemyInstr_SetTimer_A8: return EnemyInstr_SetTimer_A8(k, j); - case fnEnemyInstr_Sleep_A8: return EnemyInstr_Sleep_A8(k, j); - case fnEnemyInstr_EnableOffScreenProcessing_A8: return EnemyInstr_EnableOffScreenProcessing_A8(k, j); - case fnEnemyInstr_DisableOffScreenProcessing_A8: return EnemyInstr_DisableOffScreenProcessing_A8(k, j); + case fnEnemyInstr_Goto_A8: return EnemyInstr_Goto(k, j); + case fnEnemyInstr_DecTimerAndGoto2_A8: return EnemyInstr_DecTimerAndGoto(k, j); + case fnEnemyInstr_SetTimer_A8: return EnemyInstr_SetTimer(k, j); + case fnEnemyInstr_Sleep_A8: return EnemyInstr_Sleep(k, j); + case fnEnemyInstr_EnableOffScreenProcessing_A8: return EnemyInstr_EnableOffScreenProcessing(k, j); + case fnEnemyInstr_DisableOffScreenProcessing_A8: return EnemyInstr_DisableOffScreenProcessing(k, j); case fnMiniDraygon_Instr_2: return MiniDraygon_Instr_2(k, j); case fnMiniDraygon_Instr_1: return MiniDraygon_Instr_1(k, j); case fnMiniDraygon_Instr_3: return MiniDraygon_Instr_3(k, j); @@ -1620,7 +1582,7 @@ uint16 CallEnemyInstr(uint32 ea, uint16 k, uint16 j) { case fnKiHunter_Instr_3: return KiHunter_Instr_3(k, j); case fnKiHunter_Instr_4: return KiHunter_Instr_4(k, j); case fnKiHunter_Instr_5: return KiHunter_Instr_5(k, j); - case fnEnemyInstr_Sleep_A9: return EnemyInstr_Sleep_A9(k, j); + case fnEnemyInstr_Sleep_A9: return EnemyInstr_Sleep(k, j); case fnShitroid_Instr_1: return Shitroid_Instr_1(k, j); case fnShitroid_Instr_2: return Shitroid_Instr_2(k, j); case fnsub_A9ECD0: return sub_A9ECD0(k, j); @@ -1630,13 +1592,13 @@ uint16 CallEnemyInstr(uint32 ea, uint16 k, uint16 j) { case fnShitroid_Instr_5: return Shitroid_Instr_5(k, j); case fnEnemy_SetAiPreInstr_AA: return Enemy_SetAiPreInstr_AA(k, j); case fnEnemy_ClearAiPreInstr_AA: return Enemy_ClearAiPreInstr_AA(k, j); - case fnEnemyInstr_StopScript_AA: return EnemyInstr_StopScript_AA(k, j); - case fnEnemyInstr_Goto_AA: return EnemyInstr_Goto_AA(k, j); - case fnEnemyInstr_DecTimerAndGoto2_AA: return EnemyInstr_DecTimerAndGoto2_AA(k, j); - case fnEnemyInstr_SetTimer_AA: return EnemyInstr_SetTimer_AA(k, j); - case fnEnemyInstr_Sleep_AA: return EnemyInstr_Sleep_AA(k, j); - case fnEnemyInstr_WaitNframes_AA: return EnemyInstr_WaitNframes_AA(k, j); - case fnEnemyInstr_CopyToVram_AA: return EnemyInstr_CopyToVram_AA(k, j); + case fnEnemyInstr_StopScript_AA: return EnemyInstr_StopScript(k, j); + case fnEnemyInstr_Goto_AA: return EnemyInstr_Goto(k, j); + case fnEnemyInstr_DecTimerAndGoto2_AA: return EnemyInstr_DecTimerAndGoto(k, j); + case fnEnemyInstr_SetTimer_AA: return EnemyInstr_SetTimer(k, j); + case fnEnemyInstr_Sleep_AA: return EnemyInstr_Sleep(k, j); + case fnEnemyInstr_WaitNframes_AA: return EnemyInstr_WaitNframes(k, j); + case fnEnemyInstr_CopyToVram_AA: return EnemyInstr_CopyToVram(k, j); case fnTorizo_Instr_3: return Torizo_Instr_3(k, j); case fnTorizo_Instr_31: return Torizo_Instr_31(k, j); case fnTorizo_Instr_33: return Torizo_Instr_33(k, j); @@ -1714,11 +1676,11 @@ uint16 CallEnemyInstr(uint32 ea, uint16 k, uint16 j) { case fnShaktool_Instr_12: return Shaktool_Instr_12(k, j); case fnShaktool_Instr_7: return Shaktool_Instr_7(k, j); case fnShaktool_Instr_14: return Shaktool_Instr_14(k, j); - case fnEnemyInstr_Goto_B2: return EnemyInstr_Goto_B2(k, j); - case fnEnemyInstr_DecTimerAndGoto2_B2: return EnemyInstr_DecTimerAndGoto2_B2(k, j); - case fnEnemyInstr_SetTimer_B2: return EnemyInstr_SetTimer_B2(k, j); - case fnEnemyInstr_Sleep_B2: return EnemyInstr_Sleep_B2(k, j); - case fnEnemyInstr_WaitNframes_B2: return EnemyInstr_WaitNframes_B2(k, j); + case fnEnemyInstr_Goto_B2: return EnemyInstr_Goto(k, j); + case fnEnemyInstr_DecTimerAndGoto2_B2: return EnemyInstr_DecTimerAndGoto(k, j); + case fnEnemyInstr_SetTimer_B2: return EnemyInstr_SetTimer(k, j); + case fnEnemyInstr_Sleep_B2: return EnemyInstr_Sleep(k, j); + case fnEnemyInstr_WaitNframes_B2: return EnemyInstr_WaitNframes(k, j); case fnSpacePirates_Instr_MovePixelsDownAndChangeDirFaceRight: return SpacePirates_Instr_MovePixelsDownAndChangeDirFaceRight(k, j); case fnSpacePirates_Instr_MovePixelsDownAndChangeDirFaceLeft: return SpacePirates_Instr_MovePixelsDownAndChangeDirFaceLeft(k, j); case fnSpacePirates_Instr_RandomNewDirFaceR: return SpacePirates_Instr_RandomNewDirFaceR(k, j); @@ -1742,10 +1704,10 @@ uint16 CallEnemyInstr(uint32 ea, uint16 k, uint16 j) { case fnSpacePirates_Instr_13: return SpacePirates_Instr_13(k, j); case fnEnemy_SetAiPreInstr_B3: return Enemy_SetAiPreInstr_B3(k, j); case fnEnemy_ClearAiPreInstr_B3: return Enemy_ClearAiPreInstr_B3(k, j); - case fnEnemyInstr_Goto_B3: return EnemyInstr_Goto_B3(k, j); - case fnEnemyInstr_DecTimerAndGoto2_B3: return EnemyInstr_DecTimerAndGoto2_B3(k, j); - case fnEnemyInstr_SetTimer_B3: return EnemyInstr_SetTimer_B3(k, j); - case fnEnemyInstr_Sleep_B3: return EnemyInstr_Sleep_B3(k, j); + case fnEnemyInstr_Goto_B3: return EnemyInstr_Goto(k, j); + case fnEnemyInstr_DecTimerAndGoto2_B3: return EnemyInstr_DecTimerAndGoto(k, j); + case fnEnemyInstr_SetTimer_B3: return EnemyInstr_SetTimer(k, j); + case fnEnemyInstr_Sleep_B3: return EnemyInstr_Sleep(k, j); case fnBotwoon_Instr_1: return Botwoon_Instr_1(k, j); case fnBotwoon_Instr_2: return Botwoon_Instr_2(k, j); case fnBotwoon_Instr_3: return Botwoon_Instr_3(k, j); @@ -1796,7 +1758,7 @@ uint16 CallEnemyInstr(uint32 ea, uint16 k, uint16 j) { case fnMotherBrain_Instr_SpawnDeathBeamEproj: return MotherBrain_Instr_SpawnDeathBeamEproj(k, j); case fnMotherBrain_Instr_IncrBeamAttackPhase: return MotherBrain_Instr_IncrBeamAttackPhase(k, j); - default: return Unreachable(); + default: Unreachable(); return NULL; } } @@ -1810,7 +1772,6 @@ void EnemyMain(void) { // 0xA08FD4 gEnemyData(enemy_index_to_shake)->shake_timer = 64; enemy_index_to_shake = -1; } - interactive_enemy_indexes_index = 0; for (active_enemy_indexes_index = 0; ; ++active_enemy_indexes_index) { int v0 = active_enemy_indexes_index >> 1; uint16 v1 = active_enemy_indexes[v0]; @@ -1932,22 +1893,13 @@ void DeleteEnemyAndConnectedEnemies(void) { // 0xA0922B } uint16 SpawnEnemy(uint8 db, uint16 k) { // 0xA09275 - int16 v3; VoidP v7; - int16 v12; - EnemyPopulation *v13; - EnemyPopulation *v16; - EnemyDef_A2 *v17; - EnemyDef_A2 *EnemyDef_A2; - EnemyPopulation *EnemyPopulation; - - uint8 v19 = db; enemy_population_ptr = k; cur_enemy_index_backup = cur_enemy_index; enemy_ai_pointer_backup.addr = enemy_ai_pointer.addr; *(uint16 *)&enemy_ai_pointer_backup.bank = *(uint16 *)&enemy_ai_pointer.bank; uint16 enemy_ptr = get_EnemyPopulation(db, k)->enemy_ptr; - v3 = get_EnemyDef_A2(enemy_ptr)->num_parts - 1; + int16 v3 = get_EnemyDef_A2(enemy_ptr)->num_parts - 1; if (v3 < 0) v3 = 0; draw_oam_x_offset = v3; @@ -1960,41 +1912,37 @@ uint16 SpawnEnemy(uint8 db, uint16 k) { // 0xA09275 if (!draw_oam_x_offset) { while (1) { uint16 v5 = new_enemy_index; - EnemyPopulation = get_EnemyPopulation(v19, enemy_population_ptr); - v7 = EnemyPopulation->enemy_ptr; + EnemyPopulation *EP = get_EnemyPopulation(db, enemy_population_ptr); + v7 = EP->enemy_ptr; uint16 v8 = 0; - if (EnemyPopulation->enemy_ptr == enemy_def_ptr[0] + if (EP->enemy_ptr == enemy_def_ptr[0] || (v8 = 2, v7 == enemy_def_ptr[1]) || (v8 = 4, v7 == enemy_def_ptr[2]) || (v8 = 6, v7 == enemy_def_ptr[3])) { int v10 = v8 >> 1; EnemyData *v11 = gEnemyData(new_enemy_index); v11->vram_tiles_index = enemy_gfxdata_tiles_index[v10]; - LOBYTE(v12) = HIBYTE(enemy_gfxdata_vram_ptr[v10]); - HIBYTE(v12) = enemy_gfxdata_vram_ptr[v10]; - v11->palette_index = 2 * v12; + v11->palette_index = 2 * swap16(enemy_gfxdata_vram_ptr[v10]); } else { EnemyData *v9 = gEnemyData(new_enemy_index); v9->vram_tiles_index = 0; v9->palette_index = 0; } - v13 = get_EnemyPopulation(v19, enemy_population_ptr); - EnemyDef_A2 = get_EnemyDef_A2(v13->enemy_ptr); + EnemyDef_A2 * edef = get_EnemyDef_A2(EP->enemy_ptr); EnemyData *v15 = gEnemyData(v5); - v15->x_width = EnemyDef_A2->x_radius; - v15->y_height = EnemyDef_A2->y_radius; - v15->health = EnemyDef_A2->health; - v15->layer = EnemyDef_A2->layer; - *(uint16 *)&v15->bank = *(uint16 *)&EnemyDef_A2->bank; - v16 = get_EnemyPopulation(v19, enemy_population_ptr); - v15->enemy_ptr = v16->enemy_ptr; - v15->x_pos = v16->x_pos; - v15->y_pos = v16->y_pos; - v15->current_instruction = v16->init_param; - v15->properties = v16->properties; - v15->extra_properties = v16->extra_properties; - v15->parameter_1 = v16->parameter1; - v15->parameter_2 = v16->parameter2; + v15->x_width = edef->x_radius; + v15->y_height = edef->y_radius; + v15->health = edef->health; + v15->layer = edef->layer; + *(uint16 *)&v15->bank = *(uint16 *)&edef->bank; + v15->enemy_ptr = EP->enemy_ptr; + v15->x_pos = EP->x_pos; + v15->y_pos = EP->y_pos; + v15->current_instruction = EP->init_param; + v15->properties = EP->properties; + v15->extra_properties = EP->extra_properties; + v15->parameter_1 = EP->parameter1; + v15->parameter_2 = EP->parameter2; v15->frame_counter = 0; v15->timer = 0; v15->ai_var_A = 0; @@ -2007,12 +1955,8 @@ uint16 SpawnEnemy(uint8 db, uint16 k) { // 0xA09275 v15->frame_counter = 0; RecordEnemySpawnData(v5); cur_enemy_index = v5; - v17 = get_EnemyDef_A2(v15->enemy_ptr); - if (!sign16(v17->ai_init + 0x8000)) { - enemy_ai_pointer.addr = v17->ai_init; - *(uint16 *)&enemy_ai_pointer.bank = *(uint16 *)&v17->bank; - CallEnemyAi(Load24(&enemy_ai_pointer)); - } + if (sign16(edef->ai_init)) + CallEnemyAi(edef->bank << 16 | edef->ai_init); EnemyData *v18 = gEnemyData(v5); if ((v18->properties & 0x2000) != 0) v18->spritemap_pointer = addr_kSpritemap_Nothing_A0; @@ -2103,7 +2047,7 @@ void WriteEnemyOams(void) { // 0xA0944A R18_ = enemy_population_ptr + ypos; if (((R18_ + 128) & 0xFE00) == 0) { if (HIBYTE(R18_)) - DrawSpritemapWithBaseTileOffscreen(db, R22_); + DrawSpritemapWithBaseTileOffscreen(db, R22_, R20_, R18_); else DrawSpritemapWithBaseTile2(db, R22_); } @@ -2132,7 +2076,7 @@ void NormalEnemyFrozenAI(void) { // 0xA0957E } void ProcessExtendedTilemap(uint8 db) { // 0xA096CA - uint8 *p = RomPtrWithBank(db, R22_ + 2); + const uint8 *p = RomPtrWithBank(db, R22_ + 2); while (1) { uint16 v2 = *(uint16 *)p; if (v2 == 0xFFFF) @@ -2417,7 +2361,7 @@ void EnemySamusCollHandler_Multibox(void) { // 0xA09A5A enemy_processing_stage = 6; if (v0[11]) { touch_ai = get_EnemyDef_A2(*v0)->touch_ai; - if (touch_ai != (uint16)FUNC16(nullsub_170) && touch_ai != (uint16)FUNC16(nullsub_169)) { + if (touch_ai != FUNC16(nullsub_170) && touch_ai != FUNC16(nullsub_169)) { if (samus_contact_damage_index) { samus_invincibility_timer = 0; } else if (samus_invincibility_timer) { @@ -2483,13 +2427,13 @@ void EnemyProjectileCollHandler_Multibox(void) { // 0xA09B7F EnemyData *v0 = gEnemyData(cur_enemy_index); uint16 spritemap_pointer = v0->spritemap_pointer; if (spritemap_pointer) { - if (spritemap_pointer != (uint16)addr_kExtendedSpritemap_Nothing_A0) { + if (spritemap_pointer != addr_kExtendedSpritemap_Nothing_A0) { shot_ai = get_EnemyDef_A2(v0->enemy_ptr)->shot_ai; - if (shot_ai != (uint16)FUNC16(nullsub_170) && shot_ai != (uint16)FUNC16(nullsub_169)) { + if (shot_ai != FUNC16(nullsub_170) && shot_ai != FUNC16(nullsub_169)) { EnemyData *v3 = gEnemyData(cur_enemy_index); if ((v3->properties & 0x400) == 0 && !v3->invincibility_timer - && v3->enemy_ptr != (uint16)addr_kEnemyDef_DAFF) { + && v3->enemy_ptr != addr_kEnemyDef_DAFF) { collision_detection_index = 0; while (1) { uint16 v4; @@ -2577,8 +2521,8 @@ void EnemyBombCollHandler_Multibox(void) { // 0xA09D23 if ((v0->properties & 0x400) == 0 && !v0->invincibility_timer) { uint16 enemy_ptr = gEnemyData(cur_enemy_index)->enemy_ptr; shot_ai = get_EnemyDef_A2(enemy_ptr)->shot_ai; - if (shot_ai != (uint16)FUNC16(nullsub_170) - && shot_ai != (uint16)FUNC16(nullsub_169) + if (shot_ai != FUNC16(nullsub_170) + && shot_ai != FUNC16(nullsub_169) && bomb_counter) { collision_detection_index = 5; while (1) { @@ -2649,49 +2593,47 @@ LABEL_25: uint16 GrappleBeam_CollDetect_Enemy(void) { // 0xA09E9A VoidP grapple_ai; - EnemyData *v4; + EnemyData *ED; CallSomeSamusCode(0xDu); collision_detection_index = 0; - for (interactive_enemy_indexes_index = 0; ; ++interactive_enemy_indexes_index) { - uint16 v2 = interactive_enemy_indexes[interactive_enemy_indexes_index >> 1]; - cur_enemy_index = v2; - if (v2 == 0xFFFF) { + for (int i = 0; ; i++) { + cur_enemy_index = interactive_enemy_indexes[i]; + if (cur_enemy_index == 0xFFFF) { R18_ = 0; return 0; } - v4 = gEnemyData(v2); - if (!v4->invincibility_timer) { - uint16 v5 = abs16(v4->x_pos - grapple_beam_end_x_pos); - bool v6 = v5 < v4->x_width; - uint16 v7 = v5 - v4->x_width; + ED = gEnemyData(cur_enemy_index); + if (!ED->invincibility_timer) { + uint16 v5 = abs16(ED->x_pos - grapple_beam_end_x_pos); + bool v6 = v5 < ED->x_width; + uint16 v7 = v5 - ED->x_width; if (v6 || v7 < 8u) { - uint16 v8 = abs16(v4->y_pos - grapple_beam_end_y_pos); - v6 = v8 < v4->y_height; - uint16 v9 = v8 - v4->y_height; + uint16 v8 = abs16(ED->y_pos - grapple_beam_end_y_pos); + v6 = v8 < ED->y_height; + uint16 v9 = v8 - ED->y_height; if (v6 || v9 < 8u) break; } } - ++interactive_enemy_indexes_index; } - v4->ai_handler_bits = 1; + ED->ai_handler_bits = 1; uint16 v0 = 0; - uint16 enemy_ptr = v4->enemy_ptr; - grapple_ai = get_EnemyDef_A2(v4->enemy_ptr)->grapple_ai; - if (grapple_ai + (uint16)FUNC16(Enemy_GrappleReact_NoInteract_A0)) { + uint16 enemy_ptr = ED->enemy_ptr; + grapple_ai = get_EnemyDef_A2(ED->enemy_ptr)->grapple_ai; + if (grapple_ai + FUNC16(Enemy_GrappleReact_NoInteract_A0)) { v0 = 1; - if (grapple_ai != (uint16)FUNC16(Enemy_GrappleReact_SamusLatchesOn_A0)) { + if (grapple_ai != FUNC16(Enemy_GrappleReact_SamusLatchesOn_A0)) { v0 = 2; - if (grapple_ai != (uint16)FUNC16(Enemy_GrappleReact_KillEnemy_A0)) { + if (grapple_ai != FUNC16(Enemy_GrappleReact_KillEnemy_A0)) { v0 = 3; - if (grapple_ai != (uint16)FUNC16(Enemy_GrappleReact_CancelBeam_A0)) { + if (grapple_ai != FUNC16(Enemy_GrappleReact_CancelBeam_A0)) { v0 = 4; - if (grapple_ai != (uint16)FUNC16(Enemy_GrappleReact_SamusLatchesNoInvinc_A0)) { + if (grapple_ai != FUNC16(Enemy_GrappleReact_SamusLatchesNoInvinc_A0)) { v0 = 5; - if (grapple_ai != (uint16)FUNC16(Enemy_GrappleReact_SamusLatchesParalyze_A0)) { + if (grapple_ai != FUNC16(Enemy_GrappleReact_SamusLatchesParalyze_A0)) { v0 = 6; - if (grapple_ai != (uint16)FUNC16(Enemy_GrappleReact_HurtSamus_A0)) + if (grapple_ai != FUNC16(Enemy_GrappleReact_HurtSamus_A0)) v0 = 0; } } @@ -2793,7 +2735,7 @@ void EnemySamusCollHandler(void) { // 0xA0A07A if (samus_contact_damage_index) { samus_invincibility_timer = 0; } else if (samus_invincibility_timer) { - if (gEnemyData(cur_enemy_index)->enemy_ptr != (uint16)addr_kEnemyDef_DAFF) + if (gEnemyData(cur_enemy_index)->enemy_ptr != addr_kEnemyDef_DAFF) return; uint16 some_flag = gEnemySpawnData(cur_enemy_index)->some_flag; if (!some_flag || some_flag == 8) @@ -2801,7 +2743,7 @@ void EnemySamusCollHandler(void) { // 0xA0A07A } uint16 enemy_ptr = gEnemyData(cur_enemy_index)->enemy_ptr; touch_ai = get_EnemyDef_A2(enemy_ptr)->touch_ai; - if (touch_ai != (uint16)FUNC16(nullsub_170) && touch_ai != (uint16)FUNC16(nullsub_169)) { + if (touch_ai != FUNC16(nullsub_170) && touch_ai != FUNC16(nullsub_169)) { EnemyData *v3 = gEnemyData(cur_enemy_index); uint16 v4 = abs16(samus_x_pos - v3->x_pos); bool v5 = v4 < samus_x_radius; @@ -2812,7 +2754,7 @@ void EnemySamusCollHandler(void) { // 0xA0A07A uint16 v8 = v7 - samus_y_radius; if (v5 || v8 < v3->y_height) { R20_ = 2 * gEnemyData(cur_enemy_index)->spritemap_pointer; - if (gEnemyData(cur_enemy_index)->enemy_ptr == (uint16)addr_kEnemyDef_DAFF + if (gEnemyData(cur_enemy_index)->enemy_ptr == addr_kEnemyDef_DAFF || !gEnemyData(cur_enemy_index)->frozen_timer) { enemy_ptr = gEnemyData(cur_enemy_index)->enemy_ptr; enemy_ai_pointer.addr = get_EnemyDef_A2(enemy_ptr)->touch_ai; @@ -2834,9 +2776,9 @@ void EnemyProjectileCollHandler(void) { // 0xA0A143 EnemyData *v0 = gEnemyData(cur_enemy_index); uint16 spritemap_pointer = v0->spritemap_pointer; if (spritemap_pointer) { - if (spritemap_pointer != (uint16)addr_kSpritemap_Nothing_A0 + if (spritemap_pointer != addr_kSpritemap_Nothing_A0 && (v0->properties & 0x400) == 0 - && v0->enemy_ptr != (uint16)addr_kEnemyDef_DAFF + && v0->enemy_ptr != addr_kEnemyDef_DAFF && !v0->invincibility_timer) { collision_detection_index = 0; int v2; @@ -2887,7 +2829,7 @@ void EnemyBombCollHandler(void) { // 0xA0A236 if (bomb_counter) { if (gEnemyData(cur_enemy_index)->spritemap_pointer) { EnemyData *v0 = gEnemyData(cur_enemy_index); - if (!v0->invincibility_timer && v0->enemy_ptr != (uint16)addr_kEnemyDef_DAFF) { + if (!v0->invincibility_timer && v0->enemy_ptr != addr_kEnemyDef_DAFF) { collision_detection_index = 5; while (1) { int v1 = collision_detection_index; @@ -2934,7 +2876,7 @@ void ProcessEnemyPowerBombInteraction(void) { // 0xA0A306 if (!v0->invincibility_timer) { uint16 enemy_ptr = v0->enemy_ptr; if (v0->enemy_ptr) { - if (enemy_ptr != (uint16)addr_kEnemyDef_DAFF) { + if (enemy_ptr != addr_kEnemyDef_DAFF) { uint16 vulnerability_ptr = get_EnemyDef_A2(enemy_ptr)->vulnerability_ptr; if (!vulnerability_ptr) vulnerability_ptr = addr_stru_B4EC1C; @@ -3329,47 +3271,8 @@ uint16 Samus_CheckSolidEnemyColl(void) { // 0xA0A8F0 if (!interactive_enemy_indexes_write_ptr) return 0; v1 = 2 * (samus_collision_direction & 3); - if (v1) { - switch (v1) { - case 2: { - samus_target_x_pos = samus_x_pos + R18_; - bool v3 = samus_x_subpos + R20_ == 0; - if (__CFADD__uint16(samus_x_subpos, R20_)) - v3 = samus_target_x_pos++ == 0xFFFF; - if (!v3) - ++samus_target_x_pos; - samus_target_y_pos = samus_y_pos; - samus_target_y_subpos = samus_y_subpos; - break; - } - case 4: { - samus_target_y_pos = samus_y_pos - R18_; - bool v4 = samus_y_subpos == R20_; - if (samus_y_subpos < R20_) - v4 = samus_target_y_pos-- == 1; - if (!v4) - --samus_target_y_pos; - samus_target_x_pos = samus_x_pos; - samus_target_x_subpos = samus_x_subpos; - break; - } - case 6: { - samus_target_y_pos = samus_y_pos + R18_; - bool v5 = samus_y_subpos + R20_ == 0; - if (__CFADD__uint16(samus_y_subpos, R20_)) - v5 = samus_target_y_pos++ == 0xFFFF; - if (!v5) - ++samus_target_y_pos; - samus_target_x_pos = samus_x_pos; - samus_target_x_subpos = samus_x_subpos; - break; - } - default: - Unreachable(); - while (1) - ; - } - } else { + switch (v1) { + case 0: { samus_target_x_pos = samus_x_pos - R18_; bool v2 = samus_x_subpos == R20_; if (samus_x_subpos < R20_) @@ -3378,117 +3281,147 @@ uint16 Samus_CheckSolidEnemyColl(void) { // 0xA0A8F0 --samus_target_x_pos; samus_target_y_pos = samus_y_pos; samus_target_y_subpos = samus_y_subpos; + break; + } + case 2: { + samus_target_x_pos = samus_x_pos + R18_; + bool v3 = samus_x_subpos + R20_ == 0; + if (__CFADD__uint16(samus_x_subpos, R20_)) + v3 = samus_target_x_pos++ == 0xFFFF; + if (!v3) + ++samus_target_x_pos; + samus_target_y_pos = samus_y_pos; + samus_target_y_subpos = samus_y_subpos; + break; + } + case 4: { + samus_target_y_pos = samus_y_pos - R18_; + bool v4 = samus_y_subpos == R20_; + if (samus_y_subpos < R20_) + v4 = samus_target_y_pos-- == 1; + if (!v4) + --samus_target_y_pos; + samus_target_x_pos = samus_x_pos; + samus_target_x_subpos = samus_x_subpos; + break; + } + case 6: { + samus_target_y_pos = samus_y_pos + R18_; + bool v5 = samus_y_subpos + R20_ == 0; + if (__CFADD__uint16(samus_y_subpos, R20_)) + v5 = samus_target_y_pos++ == 0xFFFF; + if (!v5) + ++samus_target_y_pos; + samus_target_x_pos = samus_x_pos; + samus_target_x_subpos = samus_x_subpos; + break; + } + default: + Unreachable(); + while (1) + ; } samus_x_radius_mirror = samus_x_radius; samus_y_radius_mirror = samus_y_radius; collision_detection_index = 0; - for (interactive_enemy_indexes_index = 0; ; ++interactive_enemy_indexes_index) { - int v6 = interactive_enemy_indexes_index >> 1; - uint16 v7 = interactive_enemy_indexes[v6]; + for (int i = 0; ;i++) { + uint16 v7 = interactive_enemy_indexes[i]; if (v7 == 0xFFFF) break; - collision_detection_index = interactive_enemy_indexes[v6]; - EnemyData *v8 = gEnemyData(v7); - if (v8->frozen_timer || (v8->properties & 0x8000u) != 0) { - uint8 *v9 = RomPtr_7E(v7 + 3962); - uint8 *v10 = (uint8*)&samus_target_x_pos; - uint16 v11 = abs16(*(uint16 *)v9 - *(uint16 *)v10); - bool v12 = v11 < *((uint16 *)v9 + 4); - uint16 v13 = v11 - *((uint16 *)v9 + 4); - if (v12 || v13 < *((uint16 *)v10 + 4)) { - uint16 v14 = abs16(*((uint16 *)v9 + 2) - *((uint16 *)v10 + 2)); - v12 = v14 < *((uint16 *)v9 + 5); - uint16 v15 = v14 - *((uint16 *)v9 + 5); - if (v12 || v15 < *((uint16 *)v10 + 5)) { - v16 = 2 * (samus_collision_direction & 3); - if (v16) { - switch (v16) { - case 2: { - draw_enemy_layer = samus_x_radius + samus_x_pos; - EnemyData *v19 = gEnemyData(collision_detection_index); - v18 = v19->x_pos - v19->x_width - (samus_x_radius + samus_x_pos); - if (!v18) - goto LABEL_57; - if (v18 >= 0) - goto LABEL_58; - break; - } - case 4: { - EnemyData *v20 = gEnemyData(collision_detection_index); - draw_enemy_layer = v20->y_height + v20->y_pos; - v18 = samus_y_pos - samus_y_radius - draw_enemy_layer; - if (samus_y_pos - samus_y_radius == draw_enemy_layer) - goto LABEL_57; - if ((int16)(samus_y_pos - samus_y_radius - draw_enemy_layer) >= 0) - goto LABEL_58; - break; - } - case 6: { - draw_enemy_layer = samus_y_radius + samus_y_pos; - EnemyData *v21; - v21 = gEnemyData(collision_detection_index); - v18 = v21->y_pos - v21->y_height - (samus_y_radius + samus_y_pos); - if (!v18) { + collision_detection_index = v7; + EnemyData *ED = gEnemyData(v7); + if (!ED->frozen_timer && (ED->properties & 0x8000u) == 0) + continue; + uint16 *v9 = &ED->x_pos; + uint16 *v10 = &samus_target_x_pos; + uint16 v11 = abs16(*v9 - *v10); + bool v12 = v11 < *(v9 + 4); + uint16 v13 = v11 - *(v9 + 4); + if (v12 || v13 < *(v10 + 4)) { + uint16 v14 = abs16(*(v9 + 2) - *(v10 + 2)); + v12 = v14 < *(v9 + 5); + uint16 v15 = v14 - *(v9 + 5); + if (v12 || v15 < *(v10 + 5)) { + v16 = 2 * (samus_collision_direction & 3); + switch (v16) { + case 0: { + draw_enemy_layer = ED->x_width + ED->x_pos; + v18 = samus_x_pos - samus_x_radius - draw_enemy_layer; + if (samus_x_pos - samus_x_radius == draw_enemy_layer) + goto LABEL_57; + if ((int16)(samus_x_pos - samus_x_radius - draw_enemy_layer) >= 0) + goto LABEL_58; + break; + } + case 2: { + draw_enemy_layer = samus_x_radius + samus_x_pos; + v18 = ED->x_pos - ED->x_width - (samus_x_radius + samus_x_pos); + if (!v18) + goto LABEL_57; + if (v18 >= 0) + goto LABEL_58; + break; + } + case 4: { + draw_enemy_layer = ED->y_height + ED->y_pos; + v18 = samus_y_pos - samus_y_radius - draw_enemy_layer; + if (samus_y_pos - samus_y_radius == draw_enemy_layer) + goto LABEL_57; + if ((int16)(samus_y_pos - samus_y_radius - draw_enemy_layer) >= 0) + goto LABEL_58; + break; + } + case 6: { + draw_enemy_layer = samus_y_radius + samus_y_pos; + v18 = ED->y_pos - ED->y_height - (samus_y_radius + samus_y_pos); + if (!v18) { LABEL_57: - samus_y_subpos = 0; - samus_x_pos_colliding_solid = samus_x_pos; - samus_x_subpos_colliding_solid = samus_x_subpos; - EnemyData *v22 = gEnemyData(collision_detection_index); - enemy_x_pos_colliding_solid = v22->x_pos; - enemy_x_subpos_colliding_solid = v22->x_subpos; - samus_pos_delta_colliding_solid = R18_; - samus_subpos_delta_colliding_solid = R20_; - samus_y_pos_colliding_solid = samus_y_pos; - samus_y_subpos_colliding_solid = 0; - solid_enemy_collision_type = 1; - R18_ = 0; - R20_ = 0; - R22_ = collision_detection_index; - int v23 = samus_collision_direction & 3; - enemy_index_colliding_dirs[v23] = collision_detection_index; - distance_to_enemy_colliding_dirs[v23] = 0; - return -1; - } - if (v18 >= 0) { -LABEL_58: - samus_x_pos_colliding_solid = samus_x_pos; - samus_x_subpos_colliding_solid = samus_x_subpos; - EnemyData *v24 = gEnemyData(collision_detection_index); - enemy_x_pos_colliding_solid = v24->x_pos; - enemy_x_subpos_colliding_solid = v24->x_subpos; - samus_pos_delta_colliding_solid = R18_; - samus_subpos_delta_colliding_solid = R20_; - samus_y_pos_colliding_solid = samus_y_pos; - samus_y_subpos_colliding_solid = samus_y_subpos; - solid_enemy_collision_type = 2; - R18_ = v18; - int v25 = samus_collision_direction & 3; - distance_to_enemy_colliding_dirs[v25] = v18; - R20_ = 0; - R22_ = collision_detection_index; - enemy_index_colliding_dirs[v25] = collision_detection_index; - return -1; - } - break; - } - default: - Unreachable(); - while (1) - ; - } - } else { - EnemyData *v17 = gEnemyData(collision_detection_index); - draw_enemy_layer = v17->x_width + v17->x_pos; - v18 = samus_x_pos - samus_x_radius - draw_enemy_layer; - if (samus_x_pos - samus_x_radius == draw_enemy_layer) - goto LABEL_57; - if ((int16)(samus_x_pos - samus_x_radius - draw_enemy_layer) >= 0) - goto LABEL_58; + samus_y_subpos = 0; + samus_x_pos_colliding_solid = samus_x_pos; + samus_x_subpos_colliding_solid = samus_x_subpos; + enemy_x_pos_colliding_solid = ED->x_pos; + enemy_x_subpos_colliding_solid = ED->x_subpos; + samus_pos_delta_colliding_solid = R18_; + samus_subpos_delta_colliding_solid = R20_; + samus_y_pos_colliding_solid = samus_y_pos; + samus_y_subpos_colliding_solid = 0; + solid_enemy_collision_type = 1; + R18_ = 0; + R20_ = 0; + R22_ = collision_detection_index; + int v23 = samus_collision_direction & 3; + enemy_index_colliding_dirs[v23] = collision_detection_index; + distance_to_enemy_colliding_dirs[v23] = 0; + return -1; } + if (v18 >= 0) { +LABEL_58: + samus_x_pos_colliding_solid = samus_x_pos; + samus_x_subpos_colliding_solid = samus_x_subpos; + enemy_x_pos_colliding_solid = ED->x_pos; + enemy_x_subpos_colliding_solid = ED->x_subpos; + samus_pos_delta_colliding_solid = R18_; + samus_subpos_delta_colliding_solid = R20_; + samus_y_pos_colliding_solid = samus_y_pos; + samus_y_subpos_colliding_solid = samus_y_subpos; + solid_enemy_collision_type = 2; + R18_ = v18; + int v25 = samus_collision_direction & 3; + distance_to_enemy_colliding_dirs[v25] = v18; + R20_ = 0; + R22_ = collision_detection_index; + enemy_index_colliding_dirs[v25] = collision_detection_index; + return -1; + } + break; + } + default: + Unreachable(); + while (1) + ; } } } - ++interactive_enemy_indexes_index; } return 0; } @@ -3699,17 +3632,10 @@ uint16 SineMult8bitNegative(uint16 a) { // 0xA0B0C6 return SineMult8bit(); } -#define kSine8bit ((uint8*)RomPtr(0xa0b143)) -#define kEquationForQuarterCircle ((uint16*)RomPtr(0xa0b7ee)) - uint16 SineMult8bit(void) { // 0xA0B0DA - int16 v1; - uint16 RegWord = Mult8x8(kSine8bit[enemy_drawing_queue_index & 0x7F], draw_enemy_layer); - LOBYTE(v1) = HIBYTE(RegWord); - HIBYTE(v1) = RegWord; - loop_index_end = HIBYTE(RegWord); - loop_index = v1 & 0xFF00; + loop_index_end = RegWord >> 8; + loop_index = RegWord << 8; if ((enemy_drawing_queue_index & 0x80) != 0) { loop_index_end = -loop_index_end; loop_index = -loop_index; @@ -4189,32 +4115,26 @@ uint8 IsEnemyLeavingScreen(uint16 k) { // 0xA0C18E } void ProcessEnemyInstructions(void) { // 0xA0C26A - VoidP *v4; - int16 v5; - - EnemyData *v1 = gEnemyData(cur_enemy_index); - if ((v1->ai_handler_bits & 4) == 0) { - if (v1->instruction_timer-- == 1) { - uint8 bank = v1->bank; - uint16 current_instruction = v1->current_instruction; - while (1) { - v4 = (VoidP *)RomPtrWithBank(bank, current_instruction); - v5 = *v4; - if ((*v4 & 0x8000u) == 0) - break; - enemy_ai_pointer.addr = *v4; - current_instruction = CallEnemyInstr(Load24(&enemy_ai_pointer), cur_enemy_index, current_instruction + 2); - if (!current_instruction) + EnemyData *ED = gEnemyData(cur_enemy_index); + if ((ED->ai_handler_bits & 4) == 0) { + if (ED->instruction_timer-- == 1) { + assert(ED->current_instruction & 0x8000); + const uint8 *base_ptr = RomPtrWithBank(ED->bank, 0x8000) - 0x8000; + const uint16 *pc = (const uint16 *)(base_ptr + ED->current_instruction); + while ((*pc & 0x8000u) != 0) { + enemy_ai_pointer.addr = *pc; + pc = CallEnemyInstr(Load24(&enemy_ai_pointer), cur_enemy_index, pc + 1); + if (!pc) return; + if ((uintptr_t)pc < 0x10000) + pc = (const uint16*)(base_ptr + (uintptr_t)pc); } - EnemyData *v6 = gEnemyData(cur_enemy_index); - v6->instruction_timer = v5; - v6->spritemap_pointer = *((uint16 *)RomPtrWithBank(bank, current_instruction) + 1); - v6->current_instruction = current_instruction + 4; - v6->extra_properties |= 0x8000u; + ED->instruction_timer = pc[0]; + ED->spritemap_pointer = pc[1]; + ED->current_instruction = (uint8 *)pc + 4 - base_ptr; + ED->extra_properties |= 0x8000; } else { - EnemyData *v7 = gEnemyData(cur_enemy_index); - v7->extra_properties &= ~0x8000u; + ED->extra_properties &= ~0x8000; } } } @@ -4227,7 +4147,6 @@ uint8 SetCarry_4(void) { // 0xA0C2BE return 1; } -#define g_off_A0C2DA ((uint16*)RomPtr(0xa0c2da)) uint8 EnemyBlockCollReact_Spike(void) { // 0xA0C2C0 uint16 v0 = g_off_A0C2DA[BTS[cur_block_index] & 0x7F]; @@ -4263,13 +4182,12 @@ static const uint8 byte_A0C435[20] = { // 0xA0C32E 0x80, 0x81, 0x82, 0x83, }; -#define CHECK_locret_A0C434(i) (byte_A0C435[i] & 0x80 ? -1 : 0) uint8 EnemyBlockCollHorizReact_Slope_Square(uint16 k, uint16 a) { EnemyData *v4; - temp_collision_DD4 = 4 * a; - temp_collision_DD6 = BTS[k] >> 6; + uint16 temp_collision_DD4 = 4 * a; + uint16 temp_collision_DD6 = BTS[k] >> 6; uint16 v2 = 4 * a + (temp_collision_DD6 ^ ((uint8)(R26_ & 8) >> 3)); if (!R28_) { EnemyData *v3 = gEnemyData(cur_enemy_index); @@ -4277,7 +4195,7 @@ uint8 EnemyBlockCollHorizReact_Slope_Square(uint16 k, uint16 a) { return CHECK_locret_A0C434(v2) < 0; goto LABEL_7; } - if (R28_ != g_word_7E001E || (v4 = gEnemyData(cur_enemy_index), ((v4->y_pos - v4->y_height) & 8) == 0)) { + if (R28_ != R30_ || (v4 = gEnemyData(cur_enemy_index), ((v4->y_pos - v4->y_height) & 8) == 0)) { LABEL_7: if (CHECK_locret_A0C434(v2) < 0) return 1; @@ -4299,8 +4217,8 @@ void Enemy_SetXpos_Aligned(uint16 j) { // 0xA0C390 uint8 EnemyBlockCollVertReact_Slope_Square(uint16 a, uint16 k) { // 0xA0C3B2 EnemyData *v4; - temp_collision_DD4 = 4 * a; - temp_collision_DD6 = BTS[k] >> 6; + uint16 temp_collision_DD4 = 4 * a; + uint16 temp_collision_DD6 = BTS[k] >> 6; uint16 v2 = 4 * a + (temp_collision_DD6 ^ ((uint8)(R26_ & 8) >> 2)); if (!R28_) { EnemyData *v3 = gEnemyData(cur_enemy_index); @@ -4308,7 +4226,7 @@ uint8 EnemyBlockCollVertReact_Slope_Square(uint16 a, uint16 k) { // 0xA0C3B2 return CHECK_locret_A0C434(v2) < 0; goto LABEL_7; } - if (R28_ != g_word_7E001E || (v4 = gEnemyData(cur_enemy_index), ((v4->x_pos - v4->x_width) & 8) == 0)) { + if (R28_ != R30_ || (v4 = gEnemyData(cur_enemy_index), ((v4->x_pos - v4->x_width) & 8) == 0)) { LABEL_7: if (CHECK_locret_A0C434(v2) < 0) return 1; @@ -4327,23 +4245,21 @@ uint8 Enemy_SetYpos_Aligned(uint16 j) { // 0xA0C413 v1->y_pos = v2; return 1; } -#define g_word_A0C49F ((uint16*)RomPtr(0xa0c49f)) uint8 EnemyBlockCollHorizReact_Slope_NonSquare(void) { // 0xA0C449 - if ((R32 & 0x8000u) == 0) - return (R32 & 0x4000) != 0; + if ((R32_ & 0x8000u) == 0) + return (R32_ & 0x4000) != 0; uint16 v2 = 4 * (current_slope_bts & 0x1F); if ((R20_ & 0x8000u) == 0) { - Multiply16x16(*(uint16 *)((char *)&R18_ + 1), g_word_A0C49F[(v2 >> 1) + 1]); + Multiply16x16(R19_, g_word_A0C49F[(v2 >> 1) + 1]); R18_ = mult_product_lo; R20_ = mult_product_hi; } else { - Multiply16x16(-*(uint16 *)((char *)&R18_ + 1), g_word_A0C49F[(v2 >> 1) + 1]); + Multiply16x16(-R19_, g_word_A0C49F[(v2 >> 1) + 1]); Negate32(&mult_product_hi, &mult_product_lo, &R20_, &R18_); } return 0; } -#define kAlignYPos_Tab0 ((uint8*)RomPtr(0x948b2b)) uint8 EnemyBlockCollVertReact_Slope_NonSquare(void) { // 0xA0C51F int16 v3; @@ -4363,8 +4279,8 @@ uint8 EnemyBlockCollVertReact_Slope_NonSquare(void) { // 0xA0C51F EnemyData *v10 = gEnemyData(cur_enemy_index); v11 = v10->x_pos >> 4; if (v11 == mod) { - temp_collision_DD4 = (R24_ - v10->y_height) & 0xF ^ 0xF; - temp_collision_DD6 = 16 * (BTS[v9] & 0x1F); + uint16 temp_collision_DD4 = (R24_ - v10->y_height) & 0xF ^ 0xF; + uint16 temp_collision_DD6 = 16 * (BTS[v9] & 0x1F); v12 = BTS[v9] << 8; if (v12 < 0 && ((v12 & 0x4000) != 0 ? (x_pos = v10->x_pos ^ 0xF) : (x_pos = v10->x_pos), @@ -4387,8 +4303,8 @@ uint8 EnemyBlockCollVertReact_Slope_NonSquare(void) { // 0xA0C51F EnemyData *v2 = gEnemyData(cur_enemy_index); v3 = v2->x_pos >> 4; if (v3 == mod) { - temp_collision_DD4 = (LOBYTE(v2->y_height) + (uint8)R24_ - 1) & 0xF; - temp_collision_DD6 = 16 * (BTS[v1] & 0x1F); + uint16 temp_collision_DD4 = (LOBYTE(v2->y_height) + (uint8)R24_ - 1) & 0xF; + uint16 temp_collision_DD6 = 16 * (BTS[v1] & 0x1F); v5 = BTS[v1] << 8; if (v5 >= 0 && ((v5 & 0x4000) != 0 ? (v6 = v2->x_pos ^ 0xF) : (v6 = v2->x_pos), @@ -4421,14 +4337,14 @@ uint8 EnemyBlockCollReact_VertExt(void) { // 0xA0C64F uint16 v0; if (BTS[cur_block_index]) { if ((BTS[cur_block_index] & 0x80) != 0) { - temp_collision_DD4 = BTS[cur_block_index] | 0xFF00; + uint16 temp_collision_DD4 = BTS[cur_block_index] | 0xFF00; v0 = cur_block_index; do { v0 -= room_width_in_blocks; ++temp_collision_DD4; } while (temp_collision_DD4); } else { - temp_collision_DD4 = BTS[cur_block_index]; + uint16 temp_collision_DD4 = BTS[cur_block_index]; v0 = cur_block_index; do { v0 += room_width_in_blocks; @@ -4442,17 +4358,17 @@ uint8 EnemyBlockCollReact_VertExt(void) { // 0xA0C64F } uint8 Enemy_MoveRight_SlopesAsWalls(uint16 k) { // 0xA0C69D - R32 = 0x4000; + R32_ = 0x4000; return Enemy_MoveRight_IgnoreSlopes_Inner(k); } uint8 Enemy_MoveRight_ProcessSlopes(uint16 k) { // 0xA0C6A4 - R32 = 0x8000; + R32_ = 0x8000; return Enemy_MoveRight_IgnoreSlopes_Inner(k); } uint8 Enemy_MoveRight_IgnoreSlopes(uint16 k) { // 0xA0C6AB - R32 = 0; + R32_ = 0; return Enemy_MoveRight_IgnoreSlopes_Inner(k); } @@ -4462,7 +4378,7 @@ uint8 Enemy_MoveRight_IgnoreSlopes_Inner(uint16 k) { // 0xA0C6AD EnemyData *v3 = gEnemyData(k); R28_ = (v3->y_pos - v3->y_height) & 0xFFF0; R28_ = (uint16)(v3->y_height + v3->y_pos - 1 - R28_) >> 4; - g_word_7E001E = R28_; + R30_ = R28_; uint16 prod = Mult8x8((uint16)(v3->y_pos - v3->y_height) >> 4, room_width_in_blocks); uint16 v4 = (__PAIR32__(R20_, R18_) + __PAIR32__(v3->x_pos, v3->x_subpos)) >> 16; R22_ = R18_ + v3->x_subpos; @@ -4502,7 +4418,7 @@ uint8 Enemy_MoveRight_IgnoreSlopes_Inner(uint16 k) { // 0xA0C6AD } uint8 Enemy_MoveDown(uint16 k) { // 0xA0C786 - R32 = 0; + R32_ = 0; return Enemy_MoveDownInner(k); } @@ -4515,7 +4431,7 @@ uint8 Enemy_MoveDownInner(uint16 k) { // 0xA0C788 EnemyData *v3 = gEnemyData(k); R28_ = (v3->x_pos - v3->x_width) & 0xFFF0; R28_ = (uint16)(v3->x_width + v3->x_pos - 1 - R28_) >> 4; - g_word_7E001E = R28_; + R30_ = R28_; uint16 v4 = (__PAIR32__(R20_, R18_) + __PAIR32__(v3->y_pos, v3->y_subpos)) >> 16; R22_ = R18_ + v3->y_subpos; R24_ = v4; @@ -4627,8 +4543,8 @@ uint8 EnemyFunc_C8AD(uint16 k) { // 0xA0C8AD if ((level_data[cur_block_index] & 0xF000) == 4096 && (BTS[cur_block_index] & 0x1Fu) >= 5) { result = 1; - temp_collision_DD4 = (LOBYTE(v1->y_height) + LOBYTE(v1->y_pos) - 1) & 0xF; - temp_collision_DD6 = 16 * (BTS[cur_block_index] & 0x1F); + uint16 temp_collision_DD4 = (LOBYTE(v1->y_height) + LOBYTE(v1->y_pos) - 1) & 0xF; + uint16 temp_collision_DD6 = 16 * (BTS[cur_block_index] & 0x1F); v2 = BTS[cur_block_index] << 8; if (v2 >= 0) { v3 = (v2 & 0x4000) != 0 ? v1->x_pos ^ 0xF : v1->x_pos; @@ -4641,8 +4557,8 @@ uint8 EnemyFunc_C8AD(uint16 k) { // 0xA0C8AD if ((level_data[cur_block_index] & 0xF000) == 4096 && (BTS[cur_block_index] & 0x1Fu) >= 5) { result = 1; - temp_collision_DD4 = (v1->y_pos - v1->y_height) & 0xF ^ 0xF; - temp_collision_DD6 = 16 * (BTS[cur_block_index] & 0x1F); + uint16 temp_collision_DD4 = (v1->y_pos - v1->y_height) & 0xF ^ 0xF; + uint16 temp_collision_DD6 = 16 * (BTS[cur_block_index] & 0x1F); v5 = BTS[cur_block_index] << 8; if (v5 < 0) { if ((v5 & 0x4000) != 0) @@ -4655,4 +4571,4 @@ uint8 EnemyFunc_C8AD(uint16 k) { // 0xA0C8AD } } return result; -} +} \ No newline at end of file diff --git a/src/sm_a2.c b/src/sm_a2.c index d520507..04af7ef 100644 --- a/src/sm_a2.c +++ b/src/sm_a2.c @@ -5,11 +5,47 @@ #include "enemy_types.h" #include "variables.h" -#define kEnemyInit_BouncingGoofball_Tab0 ((uint16*)RomPtr(0xa286df)) -#define kEnemyInit_BouncingGoofball_Tab1 ((uint16*)RomPtr(0xa286ef)) -#define kBouncingGoofball_Tab0 ((uint8*)RomPtr(0xa28701)) -#define g_word_A28D56 (*(uint16*)RomPtr(0xa28d56)) -#define g_word_A28D58 (*(uint16*)RomPtr(0xa28d58)) + +#define kEnemyInit_BouncingGoofball_Tab0 ((uint16*)RomFixedPtr(0xa286df)) +#define kEnemyInit_BouncingGoofball_Tab1 ((uint16*)RomFixedPtr(0xa286ef)) +#define kBouncingGoofball_Tab0 ((uint8*)RomFixedPtr(0xa28701)) +#define g_word_A28D56 (*(uint16*)RomFixedPtr(0xa28d56)) +#define g_word_A28D58 (*(uint16*)RomFixedPtr(0xa28d58)) +#define g_word_A29A07 (*(uint16*)RomFixedPtr(0xa29a07)) +#define g_word_A29A09 (*(uint16*)RomFixedPtr(0xa29a09)) +#define g_word_A29A0B (*(uint16*)RomFixedPtr(0xa29a0b)) +#define g_word_A29A0D (*(uint16*)RomFixedPtr(0xa29a0d)) +#define g_word_A29F36 ((uint16*)RomFixedPtr(0xa29f36)) +#define g_off_A29F42 ((uint16*)RomFixedPtr(0xa29f42)) +#define g_word_A2A3DD ((uint16*)RomFixedPtr(0xa2a3dd)) +#define g_word_A2A3ED ((uint16*)RomFixedPtr(0xa2a3ed)) +#define g_byte_A2A7CF ((uint8*)RomFixedPtr(0xa2a7cf)) +#define g_word_A2A622 ((uint16*)RomFixedPtr(0xa2a622)) +#define g_word_A2AC07 ((uint16*)RomFixedPtr(0xa2ac07)) +#define g_word_A2AC11 ((uint16*)RomFixedPtr(0xa2ac11)) +#define g_word_A2B520 ((uint16*)RomFixedPtr(0xa2b520)) +#define g_word_A2B530 ((uint16*)RomFixedPtr(0xa2b530)) +#define g_word_A2B550 ((uint16*)RomFixedPtr(0xa2b550)) +#define g_word_A2B75B ((uint16*)RomFixedPtr(0xa2b75b)) +#define g_word_A2BBBB (*(uint16*)RomFixedPtr(0xa2bbbb)) +#define g_word_A2BBBF (*(uint16*)RomFixedPtr(0xa2bbbf)) +#define g_word_A2BE86 ((uint16*)RomFixedPtr(0xa2be86)) +#define g_word_A2C1C1 ((uint16*)RomFixedPtr(0xa2c1c1)) +#define g_word_A2C1C5 (*(uint16*)RomFixedPtr(0xa2c1c5)) +#define g_word_A2C6CA (*(uint16*)RomFixedPtr(0xa2c6ca)) +#define g_word_A2C6CE (*(uint16*)RomFixedPtr(0xa2c6ce)) +#define g_off_A2CB77 ((uint16*)RomFixedPtr(0xa2cb77)) +#define g_off_A2DF5E ((uint16*)RomFixedPtr(0xa2df5e)) +#define g_off_A2DF6A ((uint16*)RomFixedPtr(0xa2df6a)) +#define g_off_A2E5EF ((uint16*)RomFixedPtr(0xa2e5ef)) +#define g_word_A2EA56 ((uint16*)RomFixedPtr(0xa2ea56)) +#define g_off_A2EA4E ((uint16*)RomFixedPtr(0xa2ea4e)) +#define g_off_A2EC3A ((uint16*)RomFixedPtr(0xa2ec3a)) +#define g_off_A2EDFB ((uint16*)RomFixedPtr(0xa2edfb)) +#define g_off_A2F107 ((uint16*)RomFixedPtr(0xa2f107)) + + + static const uint16 g_word_A28D50 = 0x30; static const uint16 g_word_A28D52 = 1; @@ -30,73 +66,6 @@ static const int16 g_word_A28E80[48] = { -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -3, -2, 0, 0, 0, 0, }; -#define g_word_A29A07 (*(uint16*)RomPtr(0xa29a07)) -#define g_word_A29A09 (*(uint16*)RomPtr(0xa29a09)) -#define g_word_A29A0B (*(uint16*)RomPtr(0xa29a0b)) -#define g_word_A29A0D (*(uint16*)RomPtr(0xa29a0d)) -#define g_word_A29F36 ((uint16*)RomPtr(0xa29f36)) -#define g_off_A29F42 ((uint16*)RomPtr(0xa29f42)) -#define g_word_A2A3DD ((uint16*)RomPtr(0xa2a3dd)) -#define g_word_A2A3ED ((uint16*)RomPtr(0xa2a3ed)) -#define g_byte_A2A7CF ((uint8*)RomPtr(0xa2a7cf)) -#define g_word_A2A622 ((uint16*)RomPtr(0xa2a622)) -#define g_word_A2AC07 ((uint16*)RomPtr(0xa2ac07)) -#define g_word_A2AC11 ((uint16*)RomPtr(0xa2ac11)) -#define g_word_A2B520 ((uint16*)RomPtr(0xa2b520)) -#define g_word_A2B530 ((uint16*)RomPtr(0xa2b530)) -#define g_word_A2B550 ((uint16*)RomPtr(0xa2b550)) -#define g_word_A2B75B ((uint16*)RomPtr(0xa2b75b)) -#define g_word_A2BBBB (*(uint16*)RomPtr(0xa2bbbb)) -#define g_word_A2BBBF (*(uint16*)RomPtr(0xa2bbbf)) -#define g_word_A2BE86 ((uint16*)RomPtr(0xa2be86)) -#define g_word_A2C1C1 ((uint16*)RomPtr(0xa2c1c1)) -#define g_word_A2C1C5 (*(uint16*)RomPtr(0xa2c1c5)) -#define g_word_A2C6CA (*(uint16*)RomPtr(0xa2c6ca)) -#define g_word_A2C6CE (*(uint16*)RomPtr(0xa2c6ce)) -#define g_off_A2CB77 ((uint16*)RomPtr(0xa2cb77)) -#define g_off_A2DF5E ((uint16*)RomPtr(0xa2df5e)) -#define g_off_A2DF6A ((uint16*)RomPtr(0xa2df6a)) -#define g_off_A2E5EF ((uint16*)RomPtr(0xa2e5ef)) -#define g_word_A2EA56 ((uint16*)RomPtr(0xa2ea56)) -#define g_off_A2EA4E ((uint16*)RomPtr(0xa2ea4e)) -#define g_off_A2EC3A ((uint16*)RomPtr(0xa2ec3a)) -#define g_off_A2EDFB ((uint16*)RomPtr(0xa2edfb)) -#define g_off_A2F107 ((uint16*)RomPtr(0xa2f107)) - -uint16 EnemyInstr_DecTimerAndGoto2_A2(uint16 k, uint16 j) { // 0xA28110 - EnemyData *v2 = gEnemyData(k); - if (v2->timer-- == 1) - return j + 2; - else - return EnemyInstr_Goto_A2(k, j); -} - -uint16 EnemyInstr_DisableOffScreenProcessing_A2(uint16 k, uint16 j) { // 0xA2817D - EnemyData *v2 = gEnemyData(k); - v2->properties &= ~kEnemyProps_ProcessedOffscreen; - return j; -} - -uint16 EnemyInstr_EnableOffScreenProcessing_A2(uint16 k, uint16 j) { // 0xA28173 - EnemyData *v2 = gEnemyData(k); - v2->properties |= kEnemyProps_ProcessedOffscreen; - return j; -} - -uint16 EnemyInstr_Goto_A2(uint16 k, uint16 j) { // 0xA280ED - return *(uint16 *)RomPtr_A2(j); -} - -uint16 EnemyInstr_SetTimer_A2(uint16 k, uint16 j) { // 0xA28123 - uint16 v2 = *(uint16 *)RomPtr_A2(j); - gEnemyData(k)->timer = v2; - return j + 2; -} - -uint16 EnemyInstr_Sleep_A2(uint16 k, uint16 j) { // 0xA2812F - gEnemyData(k)->current_instruction = j - 2; - return 0; -} void Enemy_GrappleReact_CancelBeam_A2(void) { // 0xA2800F Enemy_SwitchToFrozenAi(); @@ -239,34 +208,33 @@ void BouncingGoofball_Func3(void) { // 0xA288B2 E->base.timer = 0; } -uint16 BouncingGoofball_Instr_88C5(uint16 k, uint16 j) { // 0xA288C5 - return j; +const uint16 *BouncingGoofball_Instr_88C5(uint16 k, const uint16 *jp) { // 0xA288C5 + return jp; } -uint16 BouncingGoofball_Instr_88C6(uint16 k, uint16 j) { // 0xA288C6 +const uint16 *BouncingGoofball_Instr_88C6(uint16 k, const uint16 *jp) { // 0xA288C6 Get_BouncingGoofball(cur_enemy_index)->bgl_var_02 = 0; QueueSfx2_Max6(0xEu); - return j; + return jp; } -uint16 MiniCrocomire_Instr_897E(uint16 k, uint16 j) { // 0xA2897E - uint16 *v2 = (uint16 *)RomPtr_A2(j); - SpawnEnemyProjectileWithGfx(*v2, cur_enemy_index, addr_Eproj_DBF2); - return j + 2; +const uint16 *MiniCrocomire_Instr_897E(uint16 k, const uint16 *jp) { // 0xA2897E + SpawnEnemyProjectileWithGfx(*jp, cur_enemy_index, addr_Eproj_DBF2); + return jp + 1; } -uint16 MiniCrocomire_Instr_8990(uint16 k, uint16 j) { // 0xA28990 +const uint16 *MiniCrocomire_Instr_8990(uint16 k, const uint16 *jp) { // 0xA28990 Enemy_MiniCrocomire *E = Get_MiniCrocomire(cur_enemy_index); E->mce_var_F = FUNC16(MiniCrocomire_PreInstr5); E->mce_var_E = 0; - return j; + return jp; } -uint16 MiniCrocomire_Instr_899D(uint16 k, uint16 j) { // 0xA2899D +const uint16 *MiniCrocomire_Instr_899D(uint16 k, const uint16 *jp) { // 0xA2899D Enemy_MiniCrocomire *E = Get_MiniCrocomire(cur_enemy_index); E->mce_var_F = FUNC16(MiniCrocomire_PreInstr6); E->mce_var_E = 1; - return j; + return jp; } void MiniCrocomire_Init(void) { // 0xA289AD @@ -776,7 +744,7 @@ void MaridiaBeybladeTurtle_Func4(void) { // 0xA29315 } } -uint16 MaridiaBeybladeTurtle_Instr_9381(uint16 k, uint16 j) { // 0xA29381 +const uint16 *MaridiaBeybladeTurtle_Instr_9381(uint16 k, const uint16 *jp) { // 0xA29381 R48 = 0; if (CheckIfEnemyTouchesSamus(cur_enemy_index)) { extra_samus_x_displacement += Get_MaridiaBeybladeTurtle(cur_enemy_index)->mbte_var_E; @@ -807,10 +775,10 @@ uint16 MaridiaBeybladeTurtle_Instr_9381(uint16 k, uint16 j) { // 0xA29381 if (R48) extra_samus_y_displacement += Get_MaridiaBeybladeTurtle(v9)->base.y_pos - R50; } - return j; + return jp; } -uint16 MaridiaBeybladeTurtle_Instr_9412(uint16 k, uint16 j) { // 0xA29412 +const uint16 *MaridiaBeybladeTurtle_Instr_9412(uint16 k, const uint16 *jp) { // 0xA29412 int16 v4; Enemy_MaridiaBeybladeTurtle *E = Get_MaridiaBeybladeTurtle(cur_enemy_index); @@ -823,62 +791,61 @@ uint16 MaridiaBeybladeTurtle_Instr_9412(uint16 k, uint16 j) { // 0xA29412 E->mbte_var_E = v4; } if ((Get_MaridiaBeybladeTurtle(cur_enemy_index)->mbte_var_E & 0x8000u) != 0) - return addr_kMaridiaBeybladeTurtle_Ilist_8B80; - return addr_kMaridiaBeybladeTurtle_Ilist_8C72; + return INSTR_RETURN_ADDR(addr_kMaridiaBeybladeTurtle_Ilist_8B80); + return INSTR_RETURN_ADDR(addr_kMaridiaBeybladeTurtle_Ilist_8C72); } -uint16 MaridiaBeybladeTurtle_Instr_9447(uint16 k, uint16 j) { // 0xA29447 +const uint16 *MaridiaBeybladeTurtle_Instr_9447(uint16 k, const uint16 *jp) { // 0xA29447 Get_MaridiaBeybladeTurtle(cur_enemy_index)->mbte_var_A = FUNC16(MaridiaBeybladeTurtle_Func5); - return j; + return jp; } -uint16 MaridiaBeybladeTurtle_Instr_9451(uint16 k, uint16 j) { // 0xA29451 +const uint16 *MaridiaBeybladeTurtle_Instr_9451(uint16 k, const uint16 *jp) { // 0xA29451 Enemy_MaridiaTurtle *E = Get_MaridiaTurtle(cur_enemy_index); E->mte_var_A = FUNC16(MaridiaBeybladeTurtle_Func7); E->mte_var_E = -1; E->mte_var_00 = 16; - return addr_kMaridiaBeybladeTurtle_Ilist_8C02; + return INSTR_RETURN_ADDR(addr_kMaridiaBeybladeTurtle_Ilist_8C02); } -uint16 MaridiaBeybladeTurtle_Instr_946B(uint16 k, uint16 j) { // 0xA2946B +const uint16 *MaridiaBeybladeTurtle_Instr_946B(uint16 k, const uint16 *jp) { // 0xA2946B Enemy_MaridiaTurtle *E = Get_MaridiaTurtle(cur_enemy_index); E->mte_var_A = FUNC16(MaridiaBeybladeTurtle_Func7); E->mte_var_E = 1; E->mte_var_00 = 16; - return addr_kMaridiaBeybladeTurtle_Ilist_8C02; + return INSTR_RETURN_ADDR(addr_kMaridiaBeybladeTurtle_Ilist_8C02); } -uint16 MaridiaBeybladeTurtle_Instr_9485(uint16 k, uint16 j) { // 0xA29485 +const uint16 *MaridiaBeybladeTurtle_Instr_9485(uint16 k, const uint16 *jp) { // 0xA29485 if (CheckIfEnemyTouchesSamus(cur_enemy_index)) { if ((Get_MaridiaBeybladeTurtle(cur_enemy_index)->mbte_var_E & 0x8000u) == 0) - return addr_kMaridiaBeybladeTurtle_Ilist_8D40; + return INSTR_RETURN_ADDR(addr_kMaridiaBeybladeTurtle_Ilist_8D40); else - return addr_kMaridiaBeybladeTurtle_Ilist_8C62; + return INSTR_RETURN_ADDR(addr_kMaridiaBeybladeTurtle_Ilist_8C62); } - return j; + return jp; } -uint16 MaridiaBeybladeTurtle_Instr_94A1(uint16 k, uint16 j) { // 0xA294A1 +const uint16 *MaridiaBeybladeTurtle_Instr_94A1(uint16 k, const uint16 *jp) { // 0xA294A1 Enemy_MaridiaBeybladeTurtle *E = Get_MaridiaBeybladeTurtle(cur_enemy_index); if (CheckIfEnemyTouchesSamus(cur_enemy_index)) E->mbte_var_A = FUNC16(MiniMaridiaBeybladeTurtle_Func7); else E->mbte_var_A = FUNC16(MiniMaridiaBeybladeTurtle_Func1); - uint16 result = addr_kMaridiaBeybladeTurtle_Ilist_8B80; if ((E->mbte_var_E & 0x8000u) == 0) - return addr_kMaridiaBeybladeTurtle_Ilist_8C72; - return result; + return INSTR_RETURN_ADDR(addr_kMaridiaBeybladeTurtle_Ilist_8C72); + return INSTR_RETURN_ADDR(addr_kMaridiaBeybladeTurtle_Ilist_8B80); } -uint16 MaridiaBeybladeTurtle_Instr_94C7(uint16 k, uint16 j) { // 0xA294C7 +const uint16 *MaridiaBeybladeTurtle_Instr_94C7(uint16 k, const uint16 *jp) { // 0xA294C7 Enemy_MaridiaBeybladeTurtle *E = Get_MaridiaBeybladeTurtle(cur_enemy_index); E->mbte_var_A = FUNC16(MiniMaridiaBeybladeTurtle_Func6); - return j; + return jp; } -uint16 MaridiaBeybladeTurtle_Instr_94D1(uint16 k, uint16 j) { // 0xA294D1 +const uint16 *MaridiaBeybladeTurtle_Instr_94D1(uint16 k, const uint16 *jp) { // 0xA294D1 QueueSfx2_Max6(0x3Au); - return j; + return jp; } void ThinHoppingBlobs_Init(void) { // 0xA29A3F @@ -953,7 +920,7 @@ void ThinHoppingBlobs_Func4(void) { // 0xA29B06 } void ThinHoppingBlobs_Func5(void) { // 0xA29B1A - int16 v2; + uint16 v2; Enemy_ThinHoppingBlobs *E = Get_ThinHoppingBlobs(cur_enemy_index); uint16 thbs_var_F = E->thbs_var_F; R22_ = 0; @@ -964,8 +931,7 @@ void ThinHoppingBlobs_Func5(void) { // 0xA29B1A + (uint16)(8 * (uint8)((uint16)(R22_ & 0xFF00) >> 8)) + 1); thbs_var_F = E->thbs_var_F; - LOBYTE(v2) = HIBYTE(*(uint16 *)((char *)&g_word_A29A07 + thbs_var_F)); - HIBYTE(v2) = *(uint16 *)((char *)&g_word_A29A07 + thbs_var_F); + v2 = swap16(*(uint16 *)((char *)&g_word_A29A07 + thbs_var_F)); } while (!sign16(v2 - R24_)); E->thbs_var_B = R22_; E->thbs_var_03 = 0; @@ -1002,19 +968,11 @@ void ThinHoppingBlobs_Func7(void) { // 0xA29B81 } void ThinHoppingBlobs_Func8(void) { // 0xA29B88 - int16 thbs_var_B; - int16 v4; - char v5; // t0 - Enemy_ThinHoppingBlobs *E = Get_ThinHoppingBlobs(cur_enemy_index); - thbs_var_B = E->thbs_var_B; + uint16 thbs_var_B = E->thbs_var_B; if (!sign16(thbs_var_B - 0x4000)) thbs_var_B = 0x4000; - v4 = thbs_var_B & 0xFF00; - v5 = v4; - LOBYTE(v4) = HIBYTE(v4); - HIBYTE(v4) = v5; - uint16 v6 = 8 * v4; + uint16 v6 = 8 * swap16(thbs_var_B); if (E->thbs_var_03) v6 -= 4; int v7 = v6 >> 1; @@ -1175,9 +1133,9 @@ void ThinHoppingBlobs_Func16(void) { // 0xA29DCD } } -uint16 SpikeShootingPlant_Instr_9F2A(uint16 k, uint16 j) { // 0xA29F2A +const uint16 *SpikeShootingPlant_Instr_9F2A(uint16 k, const uint16 *jp) { // 0xA29F2A QueueSfx2_Max6(0x34u); - return j; + return jp; } void SpikeShootingPlant_Init(void) { // 0xA29F48 @@ -1280,18 +1238,17 @@ void SpikeShootingPlant_8(void) { // 0xA2A082 E->base.timer = 0; } -uint16 SpikeShootingPlant_Instr_A095(uint16 k, uint16 j) { // 0xA2A095 +const uint16 *SpikeShootingPlant_Instr_A095(uint16 k, const uint16 *jp) { // 0xA2A095 Enemy_SpikeShootingPlant *E = Get_SpikeShootingPlant(k); E->sspt_var_F = FUNC16(SpikeShootingPlant_2); if (E->sspt_var_E) E->sspt_var_F = FUNC16(SpikeShootingPlant_3); - return j; + return jp; } -uint16 SpikeShootingPlant_Instr_A0A7(uint16 k, uint16 j) { // 0xA2A0A7 - uint16 *v2 = (uint16 *)RomPtr_A2(j); - SpawnEnemyProjectileWithGfx(*v2, cur_enemy_index, addr_kEproj_SpikeShootingPlantSpikes); - return j + 2; +const uint16 *SpikeShootingPlant_Instr_A0A7(uint16 k, const uint16 *jp) { // 0xA2A0A7 + SpawnEnemyProjectileWithGfx(*jp, cur_enemy_index, addr_kEproj_SpikeShootingPlantSpikes); + return jp + 1; } static Func_V *const off_A2A3D3[7] = { // 0xA2A3F9 @@ -1317,7 +1274,7 @@ void MaridiaSpikeyShell_Init(void) { int v4 = (uint16)(2 * HIBYTE(E->mssl_parameter_2)) >> 1; E->mssl_var_02 = g_word_A2A3DD[v4] + E->base.x_pos; E->mssl_var_01 = E->base.x_pos - g_word_A2A3DD[v4]; - E->mssl_var_00 = g_word_A2A3ED[(uint16)(2 * HIBYTE(E->mssl_parameter_1)) >> 1]; + E->mssl_var_00 = g_word_A2A3ED[HIBYTE(E->mssl_parameter_1)]; E->mssl_var_F = 0; if (E->mssl_var_E == 2) { E->mssl_var_F = 16; @@ -1387,7 +1344,7 @@ void MaridiaSpikeyShell_6(void) { // 0xA2A517 ++E->base.y_pos; if (!sign16(++E->mssl_var_F - 16)) { E->mssl_var_E = 2; - E->mssl_var_00 = g_word_A2A3ED[(uint16)(2 * HIBYTE(E->mssl_parameter_1)) >> 1]; + E->mssl_var_00 = g_word_A2A3ED[HIBYTE(E->mssl_parameter_1)]; } } @@ -1405,14 +1362,14 @@ void MaridiaSpikeyShell_8(uint16 k) { // 0xA2A553 E->mssl_var_E = 3; } -uint16 MaridiaSpikeyShell_Instr_A56D(uint16 k, uint16 j) { // 0xA2A56D +const uint16 *MaridiaSpikeyShell_Instr_A56D(uint16 k, const uint16 *jp) { // 0xA2A56D Get_MaridiaSpikeyShell(k)->mssl_var_E = 0; - return j; + return jp; } -uint16 MaridiaSpikeyShell_Instr_A571(uint16 k, uint16 j) { // 0xA2A571 +const uint16 *MaridiaSpikeyShell_Instr_A571(uint16 k, const uint16 *jp) { // 0xA2A571 Get_MaridiaSpikeyShell(k)->mssl_var_E = 1; - return j; + return jp; } void MaridiaSpikeyShell_Shot(void) { // 0xA2A579 @@ -1643,7 +1600,7 @@ void GunshipTop_7(uint16 k) { // 0xA2A987 } void GunshipTop_8(uint16 k) { // 0xA2A9BD - if (game_state == 8 && frame_handler_alfa == (uint16)FUNC16(Samus_FrameHandlerAlfa_Func11)) { + if (game_state == 8 && frame_handler_alfa == FUNC16(Samus_FrameHandlerAlfa_Func11)) { Enemy_GunshipTop *E = Get_GunshipTop(k); if ((int16)(E->base.x_pos - 8 - samus_x_pos) < 0 && (int16)(E->base.x_pos + 8 - samus_x_pos) >= 0 @@ -1870,20 +1827,15 @@ void GunshipTop_20(uint16 k) { // 0xA2AD0E } void GunshipTop_21(uint16 k) { // 0xA2AD2D - int16 v4; - unsigned int v6; // kr00_4 - Enemy_GunshipTop *E = Get_GunshipTop(k + 64); uint16 v3 = E->gtp_var_F + 64; E->gtp_var_F = v3; if (!sign16((v3 & 0xFF00) - 2560)) E->gtp_var_F = 2304; - LOBYTE(v4) = HIBYTE(E->gtp_var_F); - HIBYTE(v4) = E->gtp_var_F; - R20_ = v4 & 0xFF00; - R18_ = (uint8)v4; - v6 = __PAIR32__(samus_y_pos, samus_y_subpos) - __PAIR32__((uint8)v4, v4 & 0xFF00); - uint16 v5 = (__PAIR32__(samus_y_pos, samus_y_subpos) - __PAIR32__((uint8)v4, v4 & 0xFF00)) >> 16; + R20_ = E->gtp_var_F << 8; + R18_ = E->gtp_var_F >> 8; + uint32 v6 = __PAIR32__(samus_y_pos, samus_y_subpos) - __PAIR32__(R18_, R20_); + uint16 v5 = (__PAIR32__(samus_y_pos, samus_y_subpos) - __PAIR32__(R18_, R20_)) >> 16; samus_y_subpos = v6; samus_y_pos = v5; v5 -= 17; @@ -2220,7 +2172,8 @@ void Rinka_Main(void) { // 0xA2B7C4 if (E->rinka_parameter_1 && Get_Rinka(0)->rinka_var_1D) { Rinka_6(cur_enemy_index); Rinka_8(cur_enemy_index); - printf("A unknown\n"); v2 = 0; + //printf("A unknown\n"); + v2 = 0; RinkasDeathAnimation(v2); } else { CallRinkaFunc(E->rinka_var_A | 0xA20000, cur_enemy_index); @@ -2351,7 +2304,7 @@ void Rinka_Frozen(uint16 k) { // 0xA2B929 if (Get_Rinka(0)->rinka_var_1D) { Rinka_6(k); Rinka_8(k); - printf("A undefined!\n"); +// printf("A undefined!\n"); uint16 v1 = 0; RinkasDeathAnimation(v1); } @@ -2400,30 +2353,30 @@ uint16 Rinka_Instr_B9A2(uint16 k, uint16 j) { // 0xA2B9A2 return *(uint16 *)RomPtr_A2(j); } -uint16 Rinka_Instr_B9B3(uint16 k, uint16 j) { // 0xA2B9B3 +const uint16 *Rinka_Instr_B9B3(uint16 k, const uint16 *jp) { // 0xA2B9B3 Enemy_Rinka *E = Get_Rinka(k); E->base.properties |= kEnemyProps_Tangible | kEnemyProps_Invisible; - return j; + return jp; } -uint16 Rinka_Instr_B9BD(uint16 k, uint16 j) { // 0xA2B9BD +const uint16 *Rinka_Instr_B9BD(uint16 k, const uint16 *jp) { // 0xA2B9BD Enemy_Rinka *E = Get_Rinka(k); E->base.properties |= kEnemyProps_ProcessedOffscreen | kEnemyProps_Tangible | kEnemyProps_Invisible; - return j; + return jp; } -uint16 Rinka_Instr_B9C7(uint16 k, uint16 j) { // 0xA2B9C7 +const uint16 *Rinka_Instr_B9C7(uint16 k, const uint16 *jp) { // 0xA2B9C7 Enemy_Rinka *E = Get_Rinka(k); E->base.properties &= ~(kEnemyProps_Tangible | kEnemyProps_Invisible); E->rinka_var_A = FUNC16(Rinka_3); Enemy_Rinka *E0 = Get_Rinka(0); ++E0->rinka_var_1E; - return j; + return jp; } -uint16 EnemyInstr_Rio_Instr_1(uint16 k, uint16 j) { // 0xA2BBC3 +const uint16 *EnemyInstr_Rio_Instr_1(uint16 k, const uint16 *jp) { // 0xA2BBC3 Get_Rio(cur_enemy_index)->rio_var_E = 1; - return j; + return jp; } void Rio_Init(void) { // 0xA2BBCD @@ -2486,7 +2439,7 @@ void Rio_3(uint16 k) { // 0xA2BC48 rio_var_D = E->rio_var_D; if (rio_var_D < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = rio_var_D; + R19_ = rio_var_D; if (Enemy_MoveRight_IgnoreSlopes(k) & 1) { E->rio_var_D = -E->rio_var_D; LABEL_13: @@ -2499,7 +2452,7 @@ LABEL_13: rio_var_C = E->rio_var_C; if (rio_var_C < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = rio_var_C; + R19_ = rio_var_C; if (Enemy_MoveDown(k) & 1) goto LABEL_13; v4 = E->rio_var_C - 24; @@ -2525,7 +2478,7 @@ void Rio_4(uint16 k) { // 0xA2BCB7 rio_var_D = E->rio_var_D; if (rio_var_D < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = rio_var_D; + R19_ = rio_var_D; if (Enemy_MoveRight_IgnoreSlopes(k) & 1) E->rio_var_D = -E->rio_var_D; R18_ = 0; @@ -2533,7 +2486,7 @@ void Rio_4(uint16 k) { // 0xA2BCB7 rio_var_C = E->rio_var_C; if (rio_var_C < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = rio_var_C; + R19_ = rio_var_C; if (Enemy_MoveDown(k) & 1) { Rio_6(addr_kRio_Ilist_BBA3); E->rio_var_B = FUNC16(Rio_2); @@ -2559,14 +2512,14 @@ void Rio_5(uint16 k) { // 0xA2BCFF rio_var_D = E->rio_var_D; if (rio_var_D < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = rio_var_D; + R19_ = rio_var_D; Enemy_MoveRight_IgnoreSlopes(k); R18_ = 0; R20_ = 0; rio_var_C = E->rio_var_C; if (rio_var_C < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = rio_var_C; + R19_ = rio_var_C; Enemy_MoveDown(k); } } @@ -2581,9 +2534,9 @@ void Rio_6(uint16 a) { // 0xA2BD54 } } -uint16 NorfairLavajumpingEnemy_Instr_BE8E(uint16 k, uint16 j) { // 0xA2BE8E +const uint16 *NorfairLavajumpingEnemy_Instr_BE8E(uint16 k, const uint16 *jp) { // 0xA2BE8E Get_NorfairLavajumpingEnemy(cur_enemy_index)->nley_var_00 = 1; - return j; + return jp; } void NorfairLavajumpingEnemy_Init(void) { // 0xA2BE99 @@ -2683,59 +2636,59 @@ void NorfairLavajumpingEnemy_Func_6(uint16 a) { // 0xA2C012 } } -uint16 NorfairRio_Instr_C1C9(uint16 k, uint16 j) { // 0xA2C1C9 +const uint16 *NorfairRio_Instr_C1C9(uint16 k, const uint16 *jp) { // 0xA2C1C9 Get_NorfairRio(cur_enemy_index)->nro_var_01 = 1; - return j; + return jp; } -uint16 NorfairRio_Instr_C1D4(uint16 k, uint16 j) { // 0xA2C1D4 +const uint16 *NorfairRio_Instr_C1D4(uint16 k, const uint16 *jp) { // 0xA2C1D4 Get_NorfairRio(cur_enemy_index)->nro_var_02 = 8; - return j; + return jp; } -uint16 NorfairRio_Instr_C1DF(uint16 k, uint16 j) { // 0xA2C1DF +const uint16 *NorfairRio_Instr_C1DF(uint16 k, const uint16 *jp) { // 0xA2C1DF Get_NorfairRio(cur_enemy_index)->nro_var_02 = 8; - return j; + return jp; } -uint16 NorfairRio_Instr_C1EA(uint16 k, uint16 j) { // 0xA2C1EA +const uint16 *NorfairRio_Instr_C1EA(uint16 k, const uint16 *jp) { // 0xA2C1EA Get_NorfairRio(cur_enemy_index)->nro_var_02 = 12; - return j; + return jp; } -uint16 NorfairRio_Instr_C1F5(uint16 k, uint16 j) { // 0xA2C1F5 +const uint16 *NorfairRio_Instr_C1F5(uint16 k, const uint16 *jp) { // 0xA2C1F5 Get_NorfairRio(cur_enemy_index)->nro_var_02 = -12; - return j; + return jp; } -uint16 NorfairRio_Instr_C200(uint16 k, uint16 j) { // 0xA2C200 +const uint16 *NorfairRio_Instr_C200(uint16 k, const uint16 *jp) { // 0xA2C200 Get_NorfairRio(cur_enemy_index)->nro_var_02 = 4; - return j; + return jp; } -uint16 NorfairRio_Instr_C20B(uint16 k, uint16 j) { // 0xA2C20B +const uint16 *NorfairRio_Instr_C20B(uint16 k, const uint16 *jp) { // 0xA2C20B Get_NorfairRio(cur_enemy_index)->nro_var_02 = 0; - return j; + return jp; } -uint16 NorfairRio_Instr_C216(uint16 k, uint16 j) { // 0xA2C216 +const uint16 *NorfairRio_Instr_C216(uint16 k, const uint16 *jp) { // 0xA2C216 Get_NorfairRio(cur_enemy_index)->nro_var_02 = -4; - return j; + return jp; } -uint16 NorfairRio_Instr_C221(uint16 k, uint16 j) { // 0xA2C221 +const uint16 *NorfairRio_Instr_C221(uint16 k, const uint16 *jp) { // 0xA2C221 Get_NorfairRio(cur_enemy_index)->nro_var_02 = -12; - return j; + return jp; } -uint16 NorfairRio_Instr_C22C(uint16 k, uint16 j) { // 0xA2C22C +const uint16 *NorfairRio_Instr_C22C(uint16 k, const uint16 *jp) { // 0xA2C22C Get_NorfairRio(cur_enemy_index)->nro_var_02 = -16; - return j; + return jp; } -uint16 NorfairRio_Instr_C237(uint16 k, uint16 j) { // 0xA2C237 +const uint16 *NorfairRio_Instr_C237(uint16 k, const uint16 *jp) { // 0xA2C237 Get_NorfairRio(cur_enemy_index)->nro_var_02 = 12; - return j; + return jp; } void NorfairRio_Init(void) { // 0xA2C242 @@ -2769,7 +2722,7 @@ void NorfairRio_Func_1(uint16 k) { // 0xA2C281 E->base.frozen_timer = v3; if (v3 || (E->base.properties &= ~kEnemyProps_Invisible, - gEnemySpawnData(k)[31].some_flag == (uint16)addr_kNorfairRio_Ilist_C0F1)) { + gEnemySpawnData(k)[31].some_flag == addr_kNorfairRio_Ilist_C0F1)) { E->base.properties |= kEnemyProps_Invisible; } else { R18_ = addr_kNorfairRio_Ilist_C18F; @@ -2824,7 +2777,7 @@ void NorfairRio_Func_4(uint16 k) { // 0xA2C361 nro_var_B = E->nro_var_B; if (nro_var_B < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = nro_var_B; + R19_ = nro_var_B; if (Enemy_MoveRight_IgnoreSlopes(k) & 1) E->nro_var_B = -E->nro_var_B; R18_ = 0; @@ -2832,7 +2785,7 @@ void NorfairRio_Func_4(uint16 k) { // 0xA2C361 nro_var_A = E->nro_var_A; if (nro_var_A < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = nro_var_A; + R19_ = nro_var_A; if (Enemy_MoveDown(k) & 1 || (v4 = E->nro_var_A - 32, E->nro_var_A = v4, v4 < 0)) { E->nro_var_A = -1; NorfairRio_Func_7(addr_kNorfairRio_Ilist_C145); @@ -2850,7 +2803,7 @@ void NorfairRio_Func_5(uint16 k) { // 0xA2C3B1 nro_var_B = E->nro_var_B; if (nro_var_B < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = nro_var_B; + R19_ = nro_var_B; if (Enemy_MoveRight_IgnoreSlopes(k) & 1) E->nro_var_B = -E->nro_var_B; R18_ = 0; @@ -2858,7 +2811,7 @@ void NorfairRio_Func_5(uint16 k) { // 0xA2C3B1 nro_var_A = E->nro_var_A; if (nro_var_A < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = nro_var_A; + R19_ = nro_var_A; if (Enemy_MoveDown(k) & 1) { E->nro_var_F = FUNC16(NorfairRio_Func_6); } else { @@ -2884,19 +2837,19 @@ void NorfairRio_Func_7(uint16 a) { // 0xA2C40D } } -uint16 LowerNorfairRio_Instr_C6D2(uint16 k, uint16 j) { // 0xA2C6D2 +const uint16 *LowerNorfairRio_Instr_C6D2(uint16 k, const uint16 *jp) { // 0xA2C6D2 Get_NorfairRio(cur_enemy_index)->nro_var_01 = 1; - return j; + return jp; } -uint16 LowerNorfairRio_Instr_C6DD(uint16 k, uint16 j) { // 0xA2C6DD +const uint16 *LowerNorfairRio_Instr_C6DD(uint16 k, const uint16 *jp) { // 0xA2C6DD Get_NorfairRio(cur_enemy_index)->nro_var_02 = 0; - return j; + return jp; } -uint16 LowerNorfairRio_Instr_C6E8(uint16 k, uint16 j) { // 0xA2C6E8 +const uint16 *LowerNorfairRio_Instr_C6E8(uint16 k, const uint16 *jp) { // 0xA2C6E8 Get_NorfairRio(cur_enemy_index)->nro_var_02 = 1; - return j; + return jp; } void LowerNorfairRio_Init(void) { // 0xA2C6F3 @@ -2973,7 +2926,7 @@ void LowerNorfairRio_Func_4(uint16 k) { // 0xA2C7D6 lnro_var_D = E->lnro_var_D; if (lnro_var_D < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = lnro_var_D; + R19_ = lnro_var_D; if (Enemy_MoveRight_IgnoreSlopes(k) & 1) E->lnro_var_D = -E->lnro_var_D; R18_ = 0; @@ -2981,7 +2934,7 @@ void LowerNorfairRio_Func_4(uint16 k) { // 0xA2C7D6 lnro_var_C = E->lnro_var_C; if (lnro_var_C < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = lnro_var_C; + R19_ = lnro_var_C; if (Enemy_MoveDown(k) & 1 || (v4 = E->lnro_var_C - 32, E->lnro_var_C = v4, v4 < 0)) { E->lnro_var_C = -1; LowerNorfairRio_Func_7(addr_kLowerNorfairRio_Ilist_C662); @@ -3000,7 +2953,7 @@ void LowerNorfairRio_Func_5(uint16 k) { // 0xA2C82D nro_var_D = E->nro_var_D; if (nro_var_D < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = nro_var_D; + R19_ = nro_var_D; if (Enemy_MoveRight_IgnoreSlopes(k) & 1) E->nro_var_D = -E->nro_var_D; R18_ = 0; @@ -3008,7 +2961,7 @@ void LowerNorfairRio_Func_5(uint16 k) { // 0xA2C82D nro_var_C = E->nro_var_C; if (nro_var_C < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = nro_var_C; + R19_ = nro_var_C; if (Enemy_MoveDown(k) & 1) { LowerNorfairRio_Func_7(addr_kLowerNorfairRio_Ilist_C686); E->nro_var_F = FUNC16(LowerNorfairRio_Func_6); @@ -3040,24 +2993,24 @@ void LowerNorfairRio_Func_7(uint16 a) { // 0xA2C8A3 } } -uint16 MaridiaLargeSnail_Instr_CB6B(uint16 k, uint16 j) { // 0xA2CB6B +const uint16 *MaridiaLargeSnail_Instr_CB6B(uint16 k, const uint16 *jp) { // 0xA2CB6B QueueSfx2_Max6(0xEu); - return j; + return jp; } -uint16 MaridiaLargeSnail_Instr_CCB3(uint16 k, uint16 j) { // 0xA2CCB3 +const uint16 *MaridiaLargeSnail_Instr_CCB3(uint16 k, const uint16 *jp) { // 0xA2CCB3 Get_MaridiaLargeSnail(cur_enemy_index)->mlsl_var_02 = 1; - return j; + return jp; } -uint16 MaridiaLargeSnail_Instr_CCBE(uint16 k, uint16 j) { // 0xA2CCBE +const uint16 *MaridiaLargeSnail_Instr_CCBE(uint16 k, const uint16 *jp) { // 0xA2CCBE Get_MaridiaLargeSnail(cur_enemy_index)->mlsl_var_03 = 1; - return j; + return jp; } -uint16 MaridiaLargeSnail_Instr_CCC9(uint16 k, uint16 j) { // 0xA2CCC9 +const uint16 *MaridiaLargeSnail_Instr_CCC9(uint16 k, const uint16 *jp) { // 0xA2CCC9 Get_MaridiaLargeSnail(cur_enemy_index)->mlsl_var_03 = 0; - return j; + return jp; } void MaridiaLargeSnail_Init(void) { // 0xA2CCD4 @@ -3235,26 +3188,19 @@ void MaridiaLargeSnail_Func_6(void) { // 0xA2CF40 } void MaridiaLargeSnail_Func_7(uint16 k) { // 0xA2CF66 - int16 v2; - int16 v3; - char v4; // t0 - int16 v6; - Enemy_MaridiaLargeSnail *E = Get_MaridiaLargeSnail(k); - v2 = E->mlsl_var_B + 384; - if (!sign16(E->mlsl_var_B - 16000)) + uint16 v2 = E->mlsl_var_B + 384; + if (!sign16(v2 - 0x4000)) v2 = 0x4000; E->mlsl_var_B = v2; - v3 = v2 & 0xFF00; - v4 = v3; - LOBYTE(v3) = HIBYTE(v3); - HIBYTE(v3) = v4; + + uint16 v3 = swap16(v2); int v5 = (uint16)(8 * v3) >> 1; R18_ = kCommonEnemySpeeds_Quadratic[v5]; R20_ = kCommonEnemySpeeds_Quadratic[v5 + 1]; if (Enemy_MoveDown(k) & 1) { --E->mlsl_var_E; - v6 = E->mlsl_var_B - 4096; + int16 v6 = E->mlsl_var_B - 4096; if (v6 < 0) E->mlsl_var_E = 0; E->mlsl_var_B = v6; @@ -3263,18 +3209,11 @@ void MaridiaLargeSnail_Func_7(uint16 k) { // 0xA2CF66 } void MaridiaLargeSnail_Func_8(uint16 k) { // 0xA2CFA9 - int16 v2; - int16 v3; - char v4; // t0 - Enemy_MaridiaLargeSnail *E = Get_MaridiaLargeSnail(k); - v2 = E->mlsl_var_B - 384; + int16 v2 = E->mlsl_var_B - 384; E->mlsl_var_B = v2; if (v2 >= 0) { - v3 = v2 & 0x7F00; - v4 = v3; - LOBYTE(v3) = HIBYTE(v3); - HIBYTE(v3) = v4; + uint16 v3 = (v2 & 0x7F00) >> 8; int v5 = (uint16)(8 * v3) >> 1; R18_ = kCommonEnemySpeeds_Quadratic[v5 + 2]; R20_ = kCommonEnemySpeeds_Quadratic[v5 + 3]; @@ -3441,8 +3380,8 @@ void HirisingSlowfalling_Func_6(void) { // 0xA2E06A void HirisingSlowfalling_Func_7(void) { // 0xA2E0CD Enemy_HirisingSlowfalling *E = Get_HirisingSlowfalling(cur_enemy_index); - uint8 *v1 = RomPtr_A2(E->hsg_var_E + 4 * HIBYTE(E->hsg_var_C)); - if (*(uint16 *)v1 == 0x8000) { + const uint8 *v1 = RomPtr_A2(E->hsg_var_E + 4 * HIBYTE(E->hsg_var_C)); + if (GET_WORD(v1) == 0x8000) { E->hsg_var_05 += E->hsg_var_F; E->hsg_var_C = 0; if ((--E->hsg_var_D & 0x8000u) != 0) { @@ -3455,8 +3394,8 @@ void HirisingSlowfalling_Func_7(void) { // 0xA2E0CD E->hsg_var_A = FUNC16(HirisingSlowfalling_Func_4); } } else { - E->base.x_pos = *(uint16 *)v1 + E->hsg_var_04; - E->base.y_pos = *((uint16 *)v1 + 1) + E->hsg_var_05; + E->base.x_pos = GET_WORD(v1) + E->hsg_var_04; + E->base.y_pos = GET_WORD(v1 + 2) + E->hsg_var_05; E->hsg_var_C += 256; } } @@ -3633,9 +3572,9 @@ void Ripper_Main(void) { // 0xA2E4DA } } -uint16 LavaSeahorse_Instr_E5FB(uint16 k, uint16 j) { // 0xA2E5FB +const uint16 *LavaSeahorse_Instr_E5FB(uint16 k, const uint16 *jp) { // 0xA2E5FB Get_LavaSeahorse(cur_enemy_index)->lse_var_02 = 1; - return j; + return jp; } void LavaSeahorse_Init(void) { // 0xA2E606 @@ -4105,8 +4044,8 @@ void CallRisingFallingPlatformFunc(uint32 ea) { void RisingFallingPlatform_Main(void) { // 0xA2EED1 Enemy_RisingFallingPlatform *E = Get_RisingFallingPlatform(cur_enemy_index); CallRisingFallingPlatformFunc(E->rfpm_var_A | 0xA20000); - if (E->rfpm_var_A != (uint16)FUNC16(RisingFallingPlatform_Func_9) - && E->rfpm_var_A != (uint16)FUNC16(RisingFallingPlatform_Func_10) + if (E->rfpm_var_A != FUNC16(RisingFallingPlatform_Func_9) + && E->rfpm_var_A != FUNC16(RisingFallingPlatform_Func_10) && (enemy_index_colliding_dirs[3] & (uint16)(enemy_index_colliding_dirs[2] & enemy_index_colliding_dirs[1] & enemy_index_colliding_dirs[0])) != 0xFFFF && (enemy_index_colliding_dirs[3] & (uint16)(enemy_index_colliding_dirs[2] & enemy_index_colliding_dirs[1] & enemy_index_colliding_dirs[0])) == cur_enemy_index) { if (samus_contact_damage_index) @@ -4263,8 +4202,8 @@ LABEL_10: return; E->rfpm_var_0C = 1; } - if (E->rfpm_var_A != (uint16)FUNC16(RisingFallingPlatform_Func_9) - && E->rfpm_var_A != (uint16)FUNC16(RisingFallingPlatform_Func_10)) { + if (E->rfpm_var_A != FUNC16(RisingFallingPlatform_Func_9) + && E->rfpm_var_A != FUNC16(RisingFallingPlatform_Func_10)) { E->rfpm_var_A = FUNC16(RisingFallingPlatform_Func_9); if (E->rfpm_var_20) E->rfpm_var_A = FUNC16(RisingFallingPlatform_Func_10); @@ -4321,8 +4260,8 @@ void HorizontalShootableShutter_Func_1(uint16 k) { // 0xA2F11E void HorizontalShootableShutter_Main(void) { // 0xA2F1DE Enemy_RisingFallingPlatform *E = Get_RisingFallingPlatform(cur_enemy_index); CallRisingFallingPlatformFunc(E->rfpm_var_A | 0xA20000); - if (E->rfpm_var_A != (uint16)FUNC16(HorizontalShootableShutter_Func_8) - && E->rfpm_var_A != (uint16)FUNC16(HorizontalShootableShutter_Func_9) + if (E->rfpm_var_A != FUNC16(HorizontalShootableShutter_Func_8) + && E->rfpm_var_A != FUNC16(HorizontalShootableShutter_Func_9) && (enemy_index_colliding_dirs[3] & (uint16)(enemy_index_colliding_dirs[2] & enemy_index_colliding_dirs[1] & enemy_index_colliding_dirs[0])) != 0xFFFF && (enemy_index_colliding_dirs[3] & (uint16)(enemy_index_colliding_dirs[2] & enemy_index_colliding_dirs[1] & enemy_index_colliding_dirs[0])) == cur_enemy_index && samus_contact_damage_index) { @@ -4468,7 +4407,7 @@ void HorizontalShootableShutter_Func_14(void) { // 0xA2F3D4 void HorizontalShootableShutter_Touch(void) { // 0xA2F3D8 Enemy_HorizontalShootableShutter *E = Get_HorizontalShootableShutter(cur_enemy_index); - if (E->hssr_var_A == (uint16)FUNC16(HorizontalShootableShutter_Func_14)) { + if (E->hssr_var_A == FUNC16(HorizontalShootableShutter_Func_14)) { if ((int16)(samus_x_pos - E->base.x_pos) >= 0) { if ((joypad1_lastkeys & 0x200) != 0) { extra_samus_x_displacement = 4; @@ -4494,12 +4433,12 @@ void HorizontalShootableShutter_Powerbomb(void) { // 0xA2F41A return; E->rfpm_var_0C = 1; } - if (E->rfpm_var_A != (uint16)FUNC16(HorizontalShootableShutter_Func_8) - && E->rfpm_var_A != (uint16)FUNC16(HorizontalShootableShutter_Func_9)) { + if (E->rfpm_var_A != FUNC16(HorizontalShootableShutter_Func_8) + && E->rfpm_var_A != FUNC16(HorizontalShootableShutter_Func_9)) { E->rfpm_var_20 ^= 1u; E->rfpm_var_A = FUNC16(HorizontalShootableShutter_Func_8); if (E->rfpm_var_20) E->rfpm_var_A = FUNC16(HorizontalShootableShutter_Func_9); } } -} +} \ No newline at end of file diff --git a/src/sm_a3.c b/src/sm_a3.c index e331e5c..f00a0c2 100644 --- a/src/sm_a3.c +++ b/src/sm_a3.c @@ -5,83 +5,65 @@ #include "funcs.h" #include "enemy_types.h" -#define g_off_A386DB ((uint16*)RomPtr(0xa386db)) -#define g_off_A3894E ((uint16*)RomPtr(0xa3894e)) -#define g_word_A38D1D ((uint16*)RomPtr(0xa38d1d)) -#define g_word_A394E2 ((uint16*)RomPtr(0xa394e2)) -#define g_off_A396DB ((uint16*)RomPtr(0xa396db)) -#define g_off_A3992B ((uint16*)RomPtr(0xa3992b)) -#define g_off_A3A111 ((uint16*)RomPtr(0xa3a111)) -#define g_off_A3A121 ((uint16*)RomPtr(0xa3a121)) + +#define g_off_A386DB ((uint16*)RomFixedPtr(0xa386db)) +#define g_off_A3894E ((uint16*)RomFixedPtr(0xa3894e)) +#define g_word_A38D1D ((uint16*)RomFixedPtr(0xa38d1d)) +#define g_word_A394E2 ((uint16*)RomFixedPtr(0xa394e2)) +#define g_off_A396DB ((uint16*)RomFixedPtr(0xa396db)) +#define g_off_A3992B ((uint16*)RomFixedPtr(0xa3992b)) +#define g_off_A3A111 ((uint16*)RomFixedPtr(0xa3a111)) +#define g_off_A3A121 ((uint16*)RomFixedPtr(0xa3a121)) +#define g_off_A3AAC2 ((uint16*)RomFixedPtr(0xa3aac2)) +#define g_off_A3AACA ((uint16*)RomFixedPtr(0xa3aaca)) +#define g_off_A3AAD2 ((uint16*)RomFixedPtr(0xa3aad2)) +#define g_off_A3AADA ((uint16*)RomFixedPtr(0xa3aada)) +#define g_off_A3AAE2 ((uint16*)RomFixedPtr(0xa3aae2)) +#define g_word_A3AAE6 ((uint16*)RomFixedPtr(0xa3aae6)) +#define g_word_A3AAEA ((uint16*)RomFixedPtr(0xa3aaea)) +#define g_word_A3AAEE ((uint16*)RomFixedPtr(0xa3aaee)) +#define g_word_A3AAF2 ((uint16*)RomFixedPtr(0xa3aaf2)) +#define g_word_A3AAF6 ((uint16*)RomFixedPtr(0xa3aaf6)) +#define g_word_A3AAFA ((uint16*)RomFixedPtr(0xa3aafa)) +#define g_word_A3B415 ((uint16*)RomFixedPtr(0xa3b415)) +#define g_off_A3B40D ((uint16*)RomFixedPtr(0xa3b40d)) +#define g_off_A3B667 ((uint16*)RomFixedPtr(0xa3b667)) +#define g_word_A3BA84 ((uint16*)RomFixedPtr(0xa3ba84)) +#define g_word_A3BA94 ((uint16*)RomFixedPtr(0xa3ba94)) +#define g_word_A3BC4A ((uint16*)RomFixedPtr(0xa3bc4a)) +#define g_word_A3BC6A ((uint16*)RomFixedPtr(0xa3bc6a)) +#define g_off_A3B722 ((uint16*)RomFixedPtr(0xa3b722)) +#define g_off_A3C69C ((uint16*)RomFixedPtr(0xa3c69c)) +#define g_stru_A3CD42 ((MaridiaSnailData2*)RomFixedPtr(0xa3cd42)) +#define g_word_A3CD82 ((uint16*)RomFixedPtr(0xa3cd82)) +#define g_word_A3CDC2 ((uint16*)RomFixedPtr(0xa3cdc2)) +#define g_word_A3CCA2 ((uint16*)RomFixedPtr(0xa3cca2)) +#define g_off_A3CDD2 ((uint16*)RomFixedPtr(0xa3cdd2)) +#define g_off_A3D1AB ((uint16*)RomFixedPtr(0xa3d1ab)) +#define g_off_A3D30D ((uint16*)RomFixedPtr(0xa3d30d)) +#define g_off_A3D50F ((uint16*)RomFixedPtr(0xa3d50f)) +#define g_word_A3D517 ((uint16*)RomFixedPtr(0xa3d517)) +#define g_off_A3D5A4 ((uint16*)RomFixedPtr(0xa3d5a4)) +#define g_word_A3DABC ((uint16*)RomFixedPtr(0xa3dabc)) +#define g_off_A3DC0B ((uint16*)RomFixedPtr(0xa3dc0b)) +#define g_word_A3DCAE ((uint16*)RomFixedPtr(0xa3dcae)) +#define g_off_A3DCA6 ((uint16*)RomFixedPtr(0xa3dca6)) +#define g_off_A3E03B ((uint16*)RomFixedPtr(0xa3e03b)) +#define g_word_A3E5F0 ((uint16*)RomFixedPtr(0xa3e5f0)) +#define g_off_A3E2CC ((uint16*)RomFixedPtr(0xa3e2cc)) +#define g_off_A3E630 ((uint16*)RomFixedPtr(0xa3e630)) +#define g_off_A3E63C ((uint16*)RomFixedPtr(0xa3e63c)) +#define g_off_A3E648 ((uint16*)RomFixedPtr(0xa3e648)) +#define g_off_A3E654 ((uint16*)RomFixedPtr(0xa3e654)) +#define g_word_A3E931 ((uint16*)RomFixedPtr(0xa3e931)) +#define g_word_A3EAD6 ((uint16*)RomFixedPtr(0xa3ead6)) +#define g_word_A3EA3F ((uint16*)RomFixedPtr(0xa3ea3f)) + + + static const int16 g_word_A3A76D[4] = { 2, 0, -2, 0 }; static const int16 g_word_A3A775[4] = { 0, -2, 0, 2 }; -#define g_off_A3AAC2 ((uint16*)RomPtr(0xa3aac2)) -#define g_off_A3AACA ((uint16*)RomPtr(0xa3aaca)) -#define g_off_A3AAD2 ((uint16*)RomPtr(0xa3aad2)) -#define g_off_A3AADA ((uint16*)RomPtr(0xa3aada)) -#define g_off_A3AAE2 ((uint16*)RomPtr(0xa3aae2)) -#define g_word_A3AAE6 ((uint16*)RomPtr(0xa3aae6)) -#define g_word_A3AAEA ((uint16*)RomPtr(0xa3aaea)) -#define g_word_A3AAEE ((uint16*)RomPtr(0xa3aaee)) -#define g_word_A3AAF2 ((uint16*)RomPtr(0xa3aaf2)) -#define g_word_A3AAF6 ((uint16*)RomPtr(0xa3aaf6)) -#define g_word_A3AAFA ((uint16*)RomPtr(0xa3aafa)) -#define g_word_A3B415 ((uint16*)RomPtr(0xa3b415)) -#define g_off_A3B40D ((uint16*)RomPtr(0xa3b40d)) -#define g_off_A3B667 ((uint16*)RomPtr(0xa3b667)) -#define g_word_A3BA84 ((uint16*)RomPtr(0xa3ba84)) -#define g_word_A3BA94 ((uint16*)RomPtr(0xa3ba94)) -#define g_word_A3BC4A ((uint16*)RomPtr(0xa3bc4a)) -#define g_word_A3BC6A ((uint16*)RomPtr(0xa3bc6a)) -#define g_off_A3B722 ((uint16*)RomPtr(0xa3b722)) -#define g_off_A3C69C ((uint16*)RomPtr(0xa3c69c)) -#define g_stru_A3CD42 ((MaridiaSnailData2*)RomPtr(0xa3cd42)) -#define g_word_A3CD82 ((uint16*)RomPtr(0xa3cd82)) -#define g_word_A3CDC2 ((uint16*)RomPtr(0xa3cdc2)) -#define g_word_A3CCA2 ((uint16*)RomPtr(0xa3cca2)) -#define g_off_A3CDD2 ((uint16*)RomPtr(0xa3cdd2)) -#define g_off_A3D1AB ((uint16*)RomPtr(0xa3d1ab)) -#define g_off_A3D30D ((uint16*)RomPtr(0xa3d30d)) -#define g_off_A3D50F ((uint16*)RomPtr(0xa3d50f)) -#define g_word_A3D517 ((uint16*)RomPtr(0xa3d517)) -#define g_off_A3D5A4 ((uint16*)RomPtr(0xa3d5a4)) -#define g_word_A3DABC ((uint16*)RomPtr(0xa3dabc)) -#define g_off_A3DC0B ((uint16*)RomPtr(0xa3dc0b)) -#define g_word_A3DCAE ((uint16*)RomPtr(0xa3dcae)) -#define g_off_A3DCA6 ((uint16*)RomPtr(0xa3dca6)) -#define g_off_A3E03B ((uint16*)RomPtr(0xa3e03b)) -#define g_word_A3E5F0 ((uint16*)RomPtr(0xa3e5f0)) -#define g_off_A3E2CC ((uint16*)RomPtr(0xa3e2cc)) -#define g_off_A3E630 ((uint16*)RomPtr(0xa3e630)) -#define g_off_A3E63C ((uint16*)RomPtr(0xa3e63c)) -#define g_off_A3E648 ((uint16*)RomPtr(0xa3e648)) -#define g_off_A3E654 ((uint16*)RomPtr(0xa3e654)) -#define g_word_A3E931 ((uint16*)RomPtr(0xa3e931)) -#define g_word_A3EAD6 ((uint16*)RomPtr(0xa3ead6)) -#define g_word_A3EA3F ((uint16*)RomPtr(0xa3ea3f)) - -uint16 EnemyInstr_EnableOffScreenProcessing_A3(uint16 k, uint16 j) { // 0xA38173 - EnemyData *v2 = gEnemyData(k); - v2->properties |= kEnemyProps_ProcessedOffscreen; - return j; -} - -uint16 EnemyInstr_DisableOffScreenProcessing_A3(uint16 k, uint16 j) { // 0xA3817D - EnemyData *v2 = gEnemyData(k); - v2->properties &= ~kEnemyProps_ProcessedOffscreen; - return j; -} - -uint16 EnemyInstr_Goto_A3(uint16 k, uint16 j) { // 0xA380ED - return *(uint16 *)RomPtr_A3(j); -} - - -uint16 EnemyInstr_Sleep_A3(uint16 k, uint16 j) { // 0xA3812F - gEnemyData(k)->current_instruction = j - 2; - return 0; -} void Enemy_GrappleReact_NoInteract_A3(void) { // 0xA38000 SwitchEnemyAiToMainAi(); @@ -115,9 +97,9 @@ void Enemy_NormalFrozenAI_A3(void) { // 0xA38041 NormalEnemyFrozenAI(); } -uint16 Waver_Instr_1(uint16 k, uint16 j) { // 0xA386E3 +const uint16 *Waver_Instr_1(uint16 k, const uint16 *jp) { // 0xA386E3 Get_Waver(cur_enemy_index)->waver_var_E = 1; - return j; + return jp; } void Waver_Init(void) { // 0xA386ED @@ -182,9 +164,9 @@ void Waver_Func_1(void) { // 0xA387FE } } -uint16 Metalee_Instr_1(uint16 k, uint16 j) { // 0xA38956 +const uint16 *Metalee_Instr_1(uint16 k, const uint16 *jp) { // 0xA38956 Get_Metalee(cur_enemy_index)->metalee_var_E = 1; - return j; + return jp; } void Metalee_Init(void) { // 0xA38960 @@ -348,7 +330,7 @@ void Fireflea_Func_3(uint16 k) { // 0xA38D75 void Fireflea_Func_4(uint16 k) { // 0xA38D9C Enemy_Fireflea *E = Get_Fireflea(k); - E->firefl_var_C = LOBYTE(g_word_A38D1D[(uint16)(2 * HIBYTE(E->firefl_parameter_2)) >> 1]); + E->firefl_var_C = LOBYTE(g_word_A38D1D[HIBYTE(E->firefl_parameter_2)]); } void Fireflea_Func_5(uint16 k) { // 0xA38DAE @@ -412,19 +394,19 @@ void Fireflea_Common(void) { // 0xA38E8D } } -uint16 MaridiaFish_Instr_3(uint16 k, uint16 j) { // 0xA39096 +const uint16 *MaridiaFish_Instr_3(uint16 k, const uint16 *jp) { // 0xA39096 Get_MaridiaFish(cur_enemy_index)->base.layer = 6; - return j; + return jp; } -uint16 MaridiaFish_Instr_1(uint16 k, uint16 j) { // 0xA390A0 +const uint16 *MaridiaFish_Instr_1(uint16 k, const uint16 *jp) { // 0xA390A0 Get_MaridiaFish(cur_enemy_index)->base.layer = 2; - return j; + return jp; } -uint16 MaridiaFish_Instr_2(uint16 k, uint16 j) { // 0xA390AA +const uint16 *MaridiaFish_Instr_2(uint16 k, const uint16 *jp) { // 0xA390AA Get_MaridiaFish(cur_enemy_index)->mfh_var_01 = 1; - return j; + return jp; } void MaridiaFish_Init(void) { // 0xA390B5 @@ -663,24 +645,24 @@ void Slug_Func_1(void) { // 0xA39955 ; } -uint16 PlatformThatFallsWithSamus_Instr_3(uint16 k, uint16 j) { // 0xA39C6B +const uint16 *PlatformThatFallsWithSamus_Instr_3(uint16 k, const uint16 *jp) { // 0xA39C6B Get_PlatformThatFallsWithSamus(cur_enemy_index)->ptfwss_var_02 = 0; - return j; + return jp; } -uint16 PlatformThatFallsWithSamus_Instr_4(uint16 k, uint16 j) { // 0xA39C76 +const uint16 *PlatformThatFallsWithSamus_Instr_4(uint16 k, const uint16 *jp) { // 0xA39C76 Get_PlatformThatFallsWithSamus(cur_enemy_index)->ptfwss_var_02 = 1; - return j; + return jp; } -uint16 PlatformThatFallsWithSamus_Instr_1(uint16 k, uint16 j) { // 0xA39C81 +const uint16 *PlatformThatFallsWithSamus_Instr_1(uint16 k, const uint16 *jp) { // 0xA39C81 Get_PlatformThatFallsWithSamus(cur_enemy_index)->ptfwss_var_02 = 0; - return j; + return jp; } -uint16 PlatformThatFallsWithSamus_Instr_2(uint16 k, uint16 j) { // 0xA39C8C +const uint16 *PlatformThatFallsWithSamus_Instr_2(uint16 k, const uint16 *jp) { // 0xA39C8C Get_PlatformThatFallsWithSamus(cur_enemy_index)->ptfwss_var_02 = 1; - return j; + return jp; } void PlatformThatFallsWithSamus_Init(void) { // 0xA39C9F @@ -989,7 +971,7 @@ void Roach_Func_9(void) { // 0xA3A2D7 Enemy_Roach *E = Get_Roach(cur_enemy_index); if (IsSamusWithinEnemy_X(cur_enemy_index, LOBYTE(E->roach_parameter_2))) { if (IsSamusWithinEnemy_Y(cur_enemy_index, LOBYTE(E->roach_parameter_2))) - E->roach_var_B = g_off_A3A121[(uint16)(2 * HIBYTE(E->roach_parameter_2)) >> 1]; + E->roach_var_B = g_off_A3A121[HIBYTE(E->roach_parameter_2)]; } } @@ -1256,8 +1238,8 @@ void Mochtroid_Func_1(void) { // 0xA3A7AA R18_ = 0; R20_ = 0; Enemy_Mochtroid *E = Get_Mochtroid(cur_enemy_index); - *(uint16 *)((char *)&R18_ + 1) = (uint16)(E->base.y_pos - samus_y_pos) >> 2; - if ((*(uint16 *)((char *)&R18_ + 1) & 0x2000) != 0) + R19_ = (uint16)(E->base.y_pos - samus_y_pos) >> 2; + if ((R19_ & 0x2000) != 0) R20_ = (uint8)R20_ | 0xFFC0; uint16 mochtr_var_C = E->mochtr_var_C; bool v3 = mochtr_var_C < R18_; @@ -1287,8 +1269,8 @@ LABEL_8: } R18_ = 0; R20_ = 0; - *(uint16 *)((char *)&R18_ + 1) = (uint16)(E->base.x_pos - samus_x_pos) >> 2; - if ((*(uint16 *)((char *)&R18_ + 1) & 0x2000) != 0) + R19_ = (uint16)(E->base.x_pos - samus_x_pos) >> 2; + if ((R19_ & 0x2000) != 0) R20_ = (uint8)R20_ | 0xFFC0; uint16 mochtr_var_A = E->mochtr_var_A; v3 = mochtr_var_A < R18_; @@ -1397,15 +1379,14 @@ void Mochtroid_Shot(void) { // 0xA3A9A8 Enemy_NormalShotAI_A3(); } -uint16 Sidehopper_Func_1(uint16 k, uint16 j) { // 0xA3AA68 - uint16 *v2 = (uint16 *)RomPtr_A3(j); - QueueSfx2_Max3(*v2); - return j + 2; +const uint16 *Sidehopper_Func_1(uint16 k, const uint16 *jp) { // 0xA3AA68 + QueueSfx2_Max3(*jp); + return jp + 1; } -uint16 Sidehopper_Instr_1(uint16 k, uint16 j) { // 0xA3AAFE +const uint16 *Sidehopper_Instr_1(uint16 k, const uint16 *jp) { // 0xA3AAFE Get_Sidehopper(cur_enemy_index)->sideh_var_04 = 1; - return j; + return jp; } void Sidehopper_Init(void) { // 0xA3AB09 @@ -1694,19 +1675,19 @@ void Sidehopper_Func_22(void) { // 0xA3AE8E } } -uint16 MaridiaRefillCandy_Instr_1(uint16 k, uint16 j) { // 0xA3B429 +const uint16 *MaridiaRefillCandy_Instr_1(uint16 k, const uint16 *jp) { // 0xA3B429 Get_MaridiaRefillCandy(cur_enemy_index)->mrcy_var_00 = 4; - return j; + return jp; } -uint16 MaridiaRefillCandy_Instr_2(uint16 k, uint16 j) { // 0xA3B434 +const uint16 *MaridiaRefillCandy_Instr_2(uint16 k, const uint16 *jp) { // 0xA3B434 Get_MaridiaRefillCandy(cur_enemy_index)->mrcy_var_00 = 8; - return j; + return jp; } -uint16 MaridiaRefillCandy_Instr_3(uint16 k, uint16 j) { // 0xA3B43F +const uint16 *MaridiaRefillCandy_Instr_3(uint16 k, const uint16 *jp) { // 0xA3B43F Get_MaridiaRefillCandy(cur_enemy_index)->mrcy_var_00 = 12; - return j; + return jp; } void MaridiaRefillCandy_Init(void) { // 0xA3B44A @@ -1825,14 +1806,14 @@ void NorfairSlowFireball_Func_1(void) { // 0xA3B6F9 ; } -uint16 Bang_Instr_1(uint16 k, uint16 j) { // 0xA3BA78 +const uint16 *Bang_Instr_1(uint16 k, const uint16 *jp) { // 0xA3BA78 QueueSfx2_Max6(0x56u); - return j; + return jp; } -uint16 Bang_Instr_2(uint16 k, uint16 j) { // 0xA3BAA8 +const uint16 *Bang_Instr_2(uint16 k, const uint16 *jp) { // 0xA3BAA8 Get_Bang(cur_enemy_index)->bang_var_22 = 1; - return j; + return jp; } void Bang_Init(void) { // 0xA3BAB3 @@ -2022,25 +2003,19 @@ void Bang_Func_13(void) { // 0xA3BD89 } void Bang_Func_14(void) { // 0xA3BDB9 - char v2; // t0 - R18_ = kSine16bit[(uint8)(Get_Bang(cur_enemy_index)->bang_var_01 + 64)]; if ((R18_ & 0x8000u) != 0) Get_Bang(cur_enemy_index)->bang_var_07 = 1; - uint16 v1 = Abs16(R18_) & 0xFF00; - v2 = v1; - LOBYTE(v1) = HIBYTE(v1); - HIBYTE(v1) = v2; - R22_ = v1; + R22_ = (uint16)Abs16(R18_) >> 8; Enemy_Bang *E = Get_Bang(cur_enemy_index); R24_ = E->bang_var_0A; Bang_Func_16(); R22_ = R28_; - R24_ = g_word_7E001E; + R24_ = R30_; if (E->bang_var_07) { Bang_Func_17(); R22_ = R28_; - R24_ = g_word_7E001E; + R24_ = R30_; } uint16 x_subpos = E->base.x_subpos; bool v5 = __CFADD__uint16(R22_, x_subpos); @@ -2049,25 +2024,19 @@ void Bang_Func_14(void) { // 0xA3BDB9 } void Bang_Func_15(void) { // 0xA3BE1C - char v2; // t0 - - R18_ = kSine16bit[(uint16)(2 * (uint8)Get_Bang(cur_enemy_index)->bang_var_01) >> 1]; + R18_ = kSine16bit[(uint8)Get_Bang(cur_enemy_index)->bang_var_01]; if ((R18_ & 0x8000u) != 0) Get_Bang(cur_enemy_index)->bang_var_08 = 1; - uint16 v1 = Abs16(R18_) & 0xFF00; - v2 = v1; - LOBYTE(v1) = HIBYTE(v1); - HIBYTE(v1) = v2; - R22_ = v1; + R22_ = (uint16)Abs16(R18_) >> 8; Enemy_Bang *E = Get_Bang(cur_enemy_index); R24_ = E->bang_var_0A; Bang_Func_16(); R22_ = R28_; - R24_ = g_word_7E001E; + R24_ = R30_; if (E->bang_var_08) { Bang_Func_17(); R22_ = R28_; - R24_ = g_word_7E001E; + R24_ = R30_; } uint16 y_subpos = E->base.y_subpos; bool v5 = __CFADD__uint16(R22_, y_subpos); @@ -2076,24 +2045,20 @@ void Bang_Func_15(void) { // 0xA3BE1C } void Bang_Func_16(void) { // 0xA3BE7B - int16 v1; - R28_ = Mult8x8(R22_, R24_); uint16 prod = Mult8x8(R22_, HIBYTE(R24_)); - g_word_7E001E = (uint8)((uint16)(prod & 0xFF00) >> 8); - uint16 RegWord = (uint8)prod; - LOBYTE(v1) = HIBYTE(RegWord); - HIBYTE(v1) = RegWord; + R30_ = (prod & 0xFF00) >> 8; + uint16 v1 = prod << 8; bool v2 = __CFADD__uint16(R28_, v1); R28_ += v1; if (v2) - ++g_word_7E001E; + ++R30_; } void Bang_Func_17(void) { // 0xA3BEBE if (R22_ || R24_) { R28_ = -R22_; - g_word_7E001E = ~R24_; + R30_ = ~R24_; } } @@ -2130,9 +2095,9 @@ void Bang_Shot(void) { // 0xA3BEFD } } -uint16 Skree_Instr_1(uint16 k, uint16 j) { // 0xA3C6A4 +const uint16 *Skree_Instr_1(uint16 k, const uint16 *jp) { // 0xA3C6A4 Get_Skree(cur_enemy_index)->skree_var_E = 1; - return j; + return jp; } void Skree_Init(void) { // 0xA3C6AE @@ -2245,38 +2210,34 @@ void Skree_Shot(void) { // 0xA3C7F5 } } -uint16 MaridiaSnail_Instr_1(uint16 k, uint16 j) { // 0xA3CC36 - uint16 v2 = *(uint16 *)RomPtr_A3(j); - Get_MaridiaSnail(k)->msl_var_F = v2; - return j + 2; +const uint16 *MaridiaSnail_Instr_1(uint16 k, const uint16 *jp) { // 0xA3CC36 + Get_MaridiaSnail(k)->msl_var_F = *jp; + return jp + 1; } -uint16 MaridiaSnail_Instr_2(uint16 k, uint16 j) { // 0xA3CC3F - uint16 v2 = *(uint16 *)RomPtr_A3(j); - Get_MaridiaSnail(k)->msl_var_D = v2; - return j + 2; +const uint16 *MaridiaSnail_Instr_2(uint16 k, const uint16 *jp) { // 0xA3CC3F + Get_MaridiaSnail(k)->msl_var_D = *jp; + return jp + 1; } -uint16 MaridiaSnail_Instr_4(uint16 k, uint16 j) { // 0xA3CC48 - uint16 v2 = *(uint16 *)RomPtr_A3(j); +const uint16 *MaridiaSnail_Instr_4(uint16 k, const uint16 *jp) { // 0xA3CC48 Enemy_MaridiaSnail *E = Get_MaridiaSnail(k); - E->msl_var_07 = v2; - E->msl_var_C = *(uint16 *)((char *)&g_stru_A3CD42[0].field_6 + (uint16)(8 * v2)); - return j + 2; + E->msl_var_07 = jp[0]; + E->msl_var_C = *(uint16 *)((char *)&g_stru_A3CD42[0].field_6 + 8 * E->msl_var_07); + return jp + 1; } -uint16 MaridiaSnail_Instr_3(uint16 k, uint16 j) { // 0xA3CC5F - uint8 *v2 = RomPtr_A3(j); +const uint16 *MaridiaSnail_Instr_3(uint16 k, const uint16 *jp) { // 0xA3CC5F Enemy_MaridiaSnail *E = Get_MaridiaSnail(k); - E->base.x_pos += *(uint16 *)v2; - E->base.y_pos += *((uint16 *)v2 + 1); - return j + 4; + E->base.x_pos += jp[0]; + E->base.y_pos += jp[1]; + return jp + 2; } -uint16 MaridiaSnail_Instr_5(uint16 k, uint16 j) { // 0xA3CC78 +const uint16 *MaridiaSnail_Instr_5(uint16 k, const uint16 *jp) { // 0xA3CC78 if (Get_MaridiaSnail(k)->msl_var_08 == 2 || (NextRandom() & 1) != 0) - j -= 6; - return j; + jp -= 3; + return jp; } void MaridiaSnail_Func_1(uint16 k) { // 0xA3CC92 @@ -2397,7 +2358,7 @@ void MaridiaSnail_Func_7(uint16 k) { // 0xA3CF60 void MaridiaSnail_Func_8(uint16 a) { // 0xA3CF8F if ((a & 0x8000u) != 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = a; + R19_ = a; uint16 v1; if ((R20_ & 0x8000u) == 0) v1 = R20_ + 7; @@ -2469,7 +2430,7 @@ void MaridiaSnail_D002(uint16 k, uint16 j) { // 0xA3D002 msl_var_A = E->msl_var_A; if (msl_var_A < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = msl_var_A; + R19_ = msl_var_A; uint16 v4; if ((R20_ & 0x8000u) == 0) v4 = R20_ + 1; @@ -2487,19 +2448,19 @@ void MaridiaSnail_D002(uint16 k, uint16 j) { // 0xA3D002 msl_var_B = E->msl_var_B; if (msl_var_B < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = msl_var_B; + R19_ = msl_var_B; if (Enemy_MoveDown(k) & 1) { E->msl_var_A = -E->msl_var_A; - uint8 *v6 = RomPtr_A3(j); - MaridiaSnail_Func_13(k, *((uint16 *)v6 + 3)); + const uint8 *v6 = RomPtr_A3(j); + MaridiaSnail_Func_13(k, GET_WORD(v6 + 6)); } } else { uint16 v7 = E->msl_var_E + 1; E->msl_var_E = v7; if (sign16(v7 - 4)) { E->msl_var_B = -E->msl_var_B; - uint8 *v8 = RomPtr_A3(j); - MaridiaSnail_Func_13(k, *((uint16 *)v8 + 2)); + const uint8 *v8 = RomPtr_A3(j); + MaridiaSnail_Func_13(k, GET_WORD(v8 + 4)); } else { MaridiaSnail_Func_14(k); } @@ -2517,7 +2478,7 @@ void MaridiaSnail_D07E(uint16 k, uint16 j) { // 0xA3D07E msl_var_B = E->msl_var_B; if (msl_var_B < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = msl_var_B; + R19_ = msl_var_B; uint16 v4; if ((R20_ & 0x8000u) == 0) v4 = R20_ + 1; @@ -2533,11 +2494,11 @@ void MaridiaSnail_D07E(uint16 k, uint16 j) { // 0xA3D07E msl_var_A = E->msl_var_A; if (msl_var_A < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = msl_var_A; + R19_ = msl_var_A; if (Enemy_MoveRight_ProcessSlopes(k) & 1) { E->msl_var_B = -E->msl_var_B; - uint8 *v6 = RomPtr_A3(j); - MaridiaSnail_Func_13(k, *((uint16 *)v6 + 3)); + const uint8 *v6 = RomPtr_A3(j); + MaridiaSnail_Func_13(k, GET_WORD(v6 + 6)); } else { uint8 carry = EnemyFunc_C8AD(k); MaridiaSnail_Func_12(k, carry); @@ -2547,8 +2508,8 @@ void MaridiaSnail_D07E(uint16 k, uint16 j) { // 0xA3D07E E->msl_var_E = v7; if (sign16(v7 - 4)) { E->msl_var_A = -E->msl_var_A; - uint8 *v8 = RomPtr_A3(j); - MaridiaSnail_Func_13(k, *((uint16 *)v8 + 2)); + const uint8 *v8 = RomPtr_A3(j); + MaridiaSnail_Func_13(k, GET_WORD(v8 + 4)); } else { MaridiaSnail_Func_14(k); } @@ -2557,16 +2518,16 @@ void MaridiaSnail_D07E(uint16 k, uint16 j) { // 0xA3D07E void MaridiaSnail_Func_10(uint16 k, uint16 j) { // 0xA3D0F8 Enemy_MaridiaSnail *E = Get_MaridiaSnail(k); - uint8 *v3 = RomPtr_A3(j); - E->base.x_pos += *(uint16 *)v3; - E->base.y_pos += *((uint16 *)v3 + 1); + const uint8 *v3 = RomPtr_A3(j); + E->base.x_pos += GET_WORD(v3); + E->base.y_pos += GET_WORD(v3 + 2); } void MaridiaSnail_Func_11(uint16 k, uint16 j) { // 0xA3D10D Enemy_MaridiaSnail *E = Get_MaridiaSnail(k); - uint8 *v3 = RomPtr_A3(j); - E->base.x_pos -= *(uint16 *)v3; - E->base.y_pos = E->base.y_pos - *((uint16 *)v3 + 1); + const uint8 *v3 = RomPtr_A3(j); + E->base.x_pos -= GET_WORD(v3); + E->base.y_pos = E->base.y_pos - GET_WORD(v3 + 2); } void MaridiaSnail_Func_12(uint16 k, uint16 carry) { // 0xA3D124 @@ -2837,10 +2798,9 @@ void Reflec_Func_1(void) { // 0xA3DB0C } } -uint16 Reflec_Instr_1(uint16 k, uint16 j) { // 0xA3DBC8 - uint16 v2 = *(uint16 *)RomPtr_A3(j); - Get_Reflec(k)->reflec_parameter_2 = v2; - return j + 2; +const uint16 *Reflec_Instr_1(uint16 k, const uint16 *jp) { // 0xA3DBC8 + Get_Reflec(k)->reflec_parameter_2 = jp[0]; + return jp + 1; } void Reflec_Init(void) { // 0xA3DBD3 @@ -2945,10 +2905,9 @@ void Reflec_Func_13(void) { // 0xA3DEFD loop_index_end = Get_Reflec(cur_enemy_index)->base.y_pos; } -uint16 WreckedShipOrangeZoomer_Func_1(uint16 k, uint16 j) { // 0xA3DFC2 - uint16 v2 = *(uint16 *)RomPtr_A3(j); - Get_WreckedShipOrangeZoomer(k)->wsozr_var_F = v2; - return j + 2; +const uint16 *WreckedShipOrangeZoomer_Func_1(uint16 k, const uint16 *jp) { // 0xA3DFC2 + Get_WreckedShipOrangeZoomer(k)->wsozr_var_F = jp[0]; + return jp + 1; } void WreckedShipOrangeZoomer_Init(void) { // 0xA3E043 @@ -2989,7 +2948,7 @@ void WreckedShipOrangeZoomer_Func_2(uint16 k) { // 0xA3E091 wsozr_var_A = E->wsozr_var_A; if (wsozr_var_A < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = wsozr_var_A; + R19_ = wsozr_var_A; uint16 v4; if ((R20_ & 0x8000u) == 0) v4 = R20_ + 1; @@ -3004,7 +2963,7 @@ void WreckedShipOrangeZoomer_Func_2(uint16 k) { // 0xA3E091 wsozr_var_B = E->wsozr_var_B; if (wsozr_var_B < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = wsozr_var_B; + R19_ = wsozr_var_B; if (!(Enemy_MoveDown(k) & 1)) { if ((int16)(samus_y_pos - E->base.y_pos) >= 0) { v7 = E->wsozr_var_B; @@ -3060,7 +3019,7 @@ void sub_A3E168(uint16 k) { // 0xA3E168 wsozr_var_B = E->wsozr_var_B; if (wsozr_var_B < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = wsozr_var_B; + R19_ = wsozr_var_B; uint16 v4; if ((R20_ & 0x8000u) == 0) v4 = R20_ + 1; @@ -3074,7 +3033,7 @@ void sub_A3E168(uint16 k) { // 0xA3E168 wsozr_var_A = E->wsozr_var_A; if (wsozr_var_A < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = wsozr_var_A; + R19_ = wsozr_var_A; if (!(Enemy_MoveRight_ProcessSlopes(k) & 1)) { EnemyFunc_C8AD(k); if ((int16)(samus_x_pos - E->base.x_pos) >= 0) { @@ -3121,19 +3080,18 @@ void BigEyeBugs_Init(void) { // 0xA3E2D4 void FireZoomer_Init(void) { // 0xA3E59C Enemy_FireZoomer *E = Get_FireZoomer(cur_enemy_index); - E->base.current_instruction = g_off_A3E2CC[(uint16)(2 * (E->base.current_instruction & 3)) >> 1]; + E->base.current_instruction = g_off_A3E2CC[(E->base.current_instruction & 3)]; StoneZoomer_E67A(cur_enemy_index); } -uint16 Zoomer_Instr_SetPreinstr(uint16 k, uint16 j) { // 0xA3E660 - uint16 v2 = *(uint16 *)RomPtr_A3(j); - gEnemyData(k)->ai_preinstr = v2; - return j + 2; +const uint16 *Zoomer_Instr_SetPreinstr(uint16 k, const uint16 *jp) { // 0xA3E660 + gEnemyData(k)->ai_preinstr = jp[0]; + return jp + 1; } void StoneZoomer_Init(void) { // 0xA3E669 Enemy_StoneZoomer *E = Get_StoneZoomer(cur_enemy_index); - E->base.current_instruction = g_off_A3E2CC[(uint16)(2 * (E->base.current_instruction & 3)) >> 1]; + E->base.current_instruction = g_off_A3E2CC[(E->base.current_instruction & 3)]; StoneZoomer_E67A(cur_enemy_index); } @@ -3175,7 +3133,7 @@ void FireZoomer_Func_1(uint16 k) { // 0xA3E6C8 fzr_var_A = E->fzr_var_A; if (fzr_var_A < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = fzr_var_A; + R19_ = fzr_var_A; uint16 v4; if ((R20_ & 0x8000u) == 0) v4 = R20_ + 1; @@ -3190,7 +3148,7 @@ void FireZoomer_Func_1(uint16 k) { // 0xA3E6C8 fzr_var_B = E->fzr_var_B; if (fzr_var_B < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = fzr_var_B; + R19_ = fzr_var_B; if (Enemy_MoveDown(k) & 1) { E->fzr_var_A = -E->fzr_var_A; uint16 fzr_parameter_2 = E->fzr_parameter_2, v7; @@ -3258,7 +3216,7 @@ void FireZoomer_Func_3(uint16 k) { // 0xA3E7F2 fzr_var_B = E->fzr_var_B; if (fzr_var_B < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = fzr_var_B; + R19_ = fzr_var_B; uint16 v4; if ((R20_ & 0x8000u) == 0) v4 = R20_ + 1; @@ -3328,7 +3286,7 @@ void FireZoomer_E8A5(uint16 k) { // 0xA3E8A5 v3 = E->fzr_var_A; if (v3 < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = v3; + R19_ = v3; } } @@ -3350,15 +3308,15 @@ void Metroid_Init(void) { // 0xA3EA4F E->metroid_var_02 = 0; } -uint16 Metroid_Instr_2(uint16 k, uint16 j) { // 0xA3EAA5 +const uint16 *Metroid_Instr_2(uint16 k, const uint16 *jp) { // 0xA3EAA5 QueueSfx2_Max6(0x50u); - return j; + return jp; } -uint16 Metroid_Instr_1(uint16 k, uint16 j) { // 0xA3EAB1 +const uint16 *Metroid_Instr_1(uint16 k, const uint16 *jp) { // 0xA3EAB1 int v2 = (uint16)(2 * (NextRandom() & 7)) >> 1; QueueSfx2_Max6(g_word_A3EAD6[v2]); - return j; + return jp; } void Metroid_Frozen(void) { // 0xA3EAE6 @@ -3426,8 +3384,8 @@ void Metroid_Func_1(void) { // 0xA3EC11 R18_ = 0; R20_ = 0; Enemy_Metroid *E = Get_Metroid(cur_enemy_index); - *(uint16 *)((char *)&R18_ + 1) = (uint16)(E->base.y_pos - draw_enemy_layer) >> 2; - if ((*(uint16 *)((char *)&R18_ + 1) & 0x2000) != 0) + R19_ = (uint16)(E->base.y_pos - draw_enemy_layer) >> 2; + if ((R19_ & 0x2000) != 0) R20_ = (uint8)R20_ | 0xFFC0; uint16 metroid_var_C = E->metroid_var_C; bool v2 = metroid_var_C < R18_; @@ -3454,8 +3412,8 @@ LABEL_9: } R18_ = 0; R20_ = 0; - *(uint16 *)((char *)&R18_ + 1) = (uint16)(E->base.x_pos - samus_x_pos) >> 2; - if ((*(uint16 *)((char *)&R18_ + 1) & 0x2000) != 0) + R19_ = (uint16)(E->base.x_pos - samus_x_pos) >> 2; + if ((R19_ & 0x2000) != 0) R20_ = (uint8)R20_ | 0xFFC0; uint16 metroid_var_A = E->metroid_var_A; v2 = metroid_var_A < R18_; @@ -3717,4 +3675,4 @@ void Metroid_Powerbomb(uint16 k) { // 0xA3F042 sprite_instr_list_ptrs[Get_Metroid(cur_enemy_index)->metroid_var_00 >> 1] = 0; sprite_instr_list_ptrs[Get_Metroid(cur_enemy_index)->metroid_var_01 >> 1] = 0; } -} +} \ No newline at end of file diff --git a/src/sm_a4.c b/src/sm_a4.c index 6eb7180..c57b68e 100644 --- a/src/sm_a4.c +++ b/src/sm_a4.c @@ -4,6 +4,28 @@ #include "funcs.h" #include "enemy_types.h" + +#define g_word_A4B89D ((uint16*)RomFixedPtr(0xa4b89d)) +#define g_word_A4B8BD ((uint16*)RomFixedPtr(0xa4b8bd)) +#define g_word_A4B8DD ((uint16*)RomFixedPtr(0xa4b8dd)) +#define g_word_A4B8FD ((uint16*)RomFixedPtr(0xa4b8fd)) +#define g_word_A4B91D ((uint16*)RomFixedPtr(0xa4b91d)) +#define g_off_A48B79 ((uint16*)RomFixedPtr(0xa48b79)) +#define g_word_A49156 ((uint16*)RomFixedPtr(0xa49156)) +#define g_word_A49C79 ((uint16*)RomFixedPtr(0xa49c79)) +#define g_word_A49E7B ((uint16*)RomFixedPtr(0xa49e7b)) +#define g_word_A49BC5 (*(uint16*)RomFixedPtr(0xa49bc5)) +#define g_word_A49BC7 (*(uint16*)RomFixedPtr(0xa49bc7)) +#define g_word_A49BC9 (*(uint16*)RomFixedPtr(0xa49bc9)) +#define g_word_A49BCB (*(uint16*)RomFixedPtr(0xa49bcb)) +#define kCrocoVlineRandomPos ((uint8*)RomFixedPtr(0xa49697)) +#define g_word_A49BBD ((uint16*)RomFixedPtr(0xa49bbd)) +#define g_word_A498CA ((uint16*)RomFixedPtr(0xa498ca)) +#define g_word_A499CB ((uint16*)RomFixedPtr(0xa499cb)) +#define g_word_A499D9 ((uint16*)RomFixedPtr(0xa499d9)) + + + static const uint16 g_word_A48692 = 8; static const uint16 g_word_A48694 = 8; static const uint16 g_word_A48696 = 0; @@ -14,34 +36,6 @@ static const uint16 g_word_A4869E = 3; static const uint16 g_word_A486A0 = 8; static const uint16 g_word_A486A2 = 0x300; static const uint16 g_word_A486A4 = 0x640; -#define g_word_A4B89D ((uint16*)RomPtr(0xa4b89d)) -#define g_word_A4B8BD ((uint16*)RomPtr(0xa4b8bd)) -#define g_word_A4B8DD ((uint16*)RomPtr(0xa4b8dd)) -#define g_word_A4B8FD ((uint16*)RomPtr(0xa4b8fd)) -#define g_word_A4B91D ((uint16*)RomPtr(0xa4b91d)) -#define g_off_A48B79 ((uint16*)RomPtr(0xa48b79)) -#define g_word_A49156 ((uint16*)RomPtr(0xa49156)) -#define g_word_A49C79 ((uint16*)RomPtr(0xa49c79)) -#define g_word_A49E7B ((uint16*)RomPtr(0xa49e7b)) -#define g_word_A49BC5 (*(uint16*)RomPtr(0xa49bc5)) -#define g_word_A49BC7 (*(uint16*)RomPtr(0xa49bc7)) -#define g_word_A49BC9 (*(uint16*)RomPtr(0xa49bc9)) -#define g_word_A49BCB (*(uint16*)RomPtr(0xa49bcb)) -#define kCrocoVlineRandomPos ((uint8*)RomPtr(0xa49697)) -#define g_word_A49BBD ((uint16*)RomPtr(0xa49bbd)) -#define g_word_A498CA ((uint16*)RomPtr(0xa498ca)) -#define g_word_A499CB ((uint16*)RomPtr(0xa499cb)) -#define g_word_A499D9 ((uint16*)RomPtr(0xa499d9)) - - -uint16 EnemyInstr_Goto_A4(uint16 k, uint16 j) { // 0xA480ED - return *(uint16 *)RomPtr_A4(j); -} - -uint16 EnemyInstr_Sleep_A4(uint16 k, uint16 j) { // 0xA4812F - gEnemyData(k)->current_instruction = j - 2; - return 0; -} void Enemy_GrappleReact_SamusLatchesOn_A4(void) { // 0xA48005 SamusLatchesOnWithGrapple(); @@ -64,7 +58,9 @@ void Crocomire_Hurt(void) { // 0xA48687 Crocomire_Func_31(); } -static Func_XY_Y *const off_A486B3[21] = { // 0xA486A6 +typedef const uint16 *CrocomireFunc(uint16 k, const uint16 *jp); + +static CrocomireFunc *const off_A486B3[21] = { // 0xA486A6 Crocomire_Func_2, Crocomire_Func_3, Crocomire_Func_4, Crocomire_Func_5, Crocomire_Func_7, Crocomire_Func_8, Crocomire_Func_9, Crocomire_Func_10, Crocomire_Func_11, Crocomire_Func_13, Crocomire_Func_14, Crocomire_Func_15, @@ -73,64 +69,62 @@ static Func_XY_Y *const off_A486B3[21] = { // 0xA486A6 Crocomire_Func_26, }; -uint16 Crocomire_Instr_1(uint16 k, uint16 j) { - +const uint16 *Crocomire_Instr_1(uint16 k, const uint16 *jp) { uint16 crocom_var_C = Get_Crocomire(cur_enemy_index)->crocom_var_C; - return off_A486B3[crocom_var_C >> 1](crocom_var_C, j); + return off_A486B3[crocom_var_C >> 1](crocom_var_C, jp); } -uint16 Crocomire_Func_2(uint16 k, uint16 j) { // 0xA486DE - uint16 result = addr_kCrocomire_Ilist_BADE; +const uint16 *Crocomire_Func_2(uint16 k, const uint16 *jp) { // 0xA486DE Get_Crocomire(k)->base.instruction_timer = 1; - return result; + return INSTR_RETURN_ADDR(addr_kCrocomire_Ilist_BADE); } -uint16 Crocomire_Func_3(uint16 k, uint16 j) { // 0xA486E8 +const uint16 *Crocomire_Func_3(uint16 k, const uint16 *jp) { // 0xA486E8 Get_Crocomire(0)->crocom_var_C = 4; - return addr_kCrocomire_Ilist_BBCE; + return INSTR_RETURN_ADDR(addr_kCrocomire_Ilist_BBCE); } -uint16 Crocomire_Func_4(uint16 k, uint16 j) { // 0xA486F2 +const uint16 *Crocomire_Func_4(uint16 k, const uint16 *jp) { // 0xA486F2 Enemy_Crocomire *E = Get_Crocomire(0); uint16 v1 = abs16(E->base.x_pos - samus_x_pos); if (sign16(v1 - 224)) { E->crocom_var_B |= 0x8000u; - j = addr_kCrocomire_Ilist_BC56; E->crocom_var_C = 18; + return INSTR_RETURN_ADDR(addr_kCrocomire_Ilist_BC56); } - return j; + return jp; } -uint16 Crocomire_Func_5(uint16 k, uint16 j) { // 0xA48717 +const uint16 *Crocomire_Func_5(uint16 k, const uint16 *jp) { // 0xA48717 Enemy_Crocomire *E = Get_Crocomire(0); if ((E->crocom_var_B & 0x800) != 0 && (E->crocom_var_B &= ~0x800u, E->crocom_var_D)) { - j = addr_kCrocomire_Ilist_BC30; + jp = INSTR_RETURN_ADDR(addr_kCrocomire_Ilist_BC30); E->crocom_var_C = 12; } else if ((int16)(E->base.x_pos - g_word_A486A2) < 0) { - j = addr_kCrocomire_Ilist_BE7E; + jp = INSTR_RETURN_ADDR(addr_kCrocomire_Ilist_BE7E); E->crocom_var_C = 10; - } else if ((int16)(j + 0x43CC) >= 0) { - return addr_kCrocomire_Ilist_BBCE; + } else if ((int16)(INSTR_ADDR_TO_PTR(0, jp) - addr_kCrocomire_Ilist_BC34) >= 0) { + return INSTR_RETURN_ADDR(addr_kCrocomire_Ilist_BBCE); } - return j; + return jp; } -uint16 Crocomire_Instr_14(uint16 k, uint16 j) { // 0xA48752 +const uint16 *Crocomire_Instr_14(uint16 k, const uint16 *jp) { // 0xA48752 if (sign16((random_number & 0xFFF) - 1024)) { Enemy_Crocomire *E = Get_Crocomire(0); E->crocom_var_C = 8; E->crocom_var_F = 0; - return addr_kCrocomire_Ilist_BB36; + return INSTR_RETURN_ADDR(addr_kCrocomire_Ilist_BB36); } - return j; + return jp; } -uint16 Crocomire_Func_7(uint16 k, uint16 j) { // 0xA4876C +const uint16 *Crocomire_Func_7(uint16 k, const uint16 *jp) { // 0xA4876C Enemy_Crocomire *E = Get_Crocomire(0); uint16 crocom_var_B = E->crocom_var_B; if ((crocom_var_B & 0x800) != 0) { E->crocom_var_B = crocom_var_B & 0xF7FF; - j = addr_kCrocomire_Ilist_BC30; + jp = INSTR_RETURN_ADDR(addr_kCrocomire_Ilist_BC30); E->crocom_var_C = 12; } else { uint16 crocom_var_F = E->crocom_var_F; @@ -140,107 +134,107 @@ uint16 Crocomire_Func_7(uint16 k, uint16 j) { // 0xA4876C SpawnEnemyProjectileWithGfx(crocom_var_F, cur_enemy_index, addr_stru_868F8F); QueueSfx3_Max6(0x1Cu); } else { - j = addr_kCrocomire_Ilist_BBCA; + jp = INSTR_RETURN_ADDR(addr_kCrocomire_Ilist_BBCA); E->crocom_var_C = 6; } } - return j; + return jp; } -uint16 Crocomire_Func_8(uint16 k, uint16 j) { // 0xA487B2 +const uint16 *Crocomire_Func_8(uint16 k, const uint16 *jp) { // 0xA487B2 Enemy_Crocomire *E = Get_Crocomire(0); uint16 crocom_var_B = E->crocom_var_B; if ((crocom_var_B & 0x800) != 0) { E->crocom_var_B = crocom_var_B & 0xF7FF; - j = addr_kCrocomire_Ilist_BC30; + jp = INSTR_RETURN_ADDR(addr_kCrocomire_Ilist_BC30); E->crocom_var_C = 12; } - return j; + return jp; } -uint16 Crocomire_Func_9(uint16 k, uint16 j) { // 0xA487CA +const uint16 *Crocomire_Func_9(uint16 k, const uint16 *jp) { // 0xA487CA uint16 v2; Enemy_Crocomire *E = Get_Crocomire(0); uint16 crocom_var_D = E->crocom_var_D; if (crocom_var_D && (v2 = crocom_var_D - 1, (E->crocom_var_D = v2) != 0)) { E->crocom_var_C = 12; - return addr_kCrocomire_Ilist_BC34; + return INSTR_RETURN_ADDR(addr_kCrocomire_Ilist_BC34); } else { E->crocom_var_C = 6; - return addr_kCrocomire_Ilist_BBCE; + return INSTR_RETURN_ADDR(addr_kCrocomire_Ilist_BBCE); } } -uint16 Crocomire_Func_10(uint16 k, uint16 j) { // 0xA487E9 +const uint16 *Crocomire_Func_10(uint16 k, const uint16 *jp) { // 0xA487E9 Enemy_Crocomire *E = Get_Crocomire(0); if ((int16)(E->base.x_pos - g_word_A486A2) >= 0) { E->crocom_var_C = 6; - return addr_kCrocomire_Ilist_BBCE; + return INSTR_RETURN_ADDR(addr_kCrocomire_Ilist_BBCE); } - return j; + return jp; } -uint16 Crocomire_Func_11(uint16 k, uint16 j) { // 0xA487FB +const uint16 *Crocomire_Func_11(uint16 k, const uint16 *jp) { // 0xA487FB Get_Crocomire(0)->crocom_var_C = 6; - return addr_kCrocomire_Ilist_BD2A; + return INSTR_RETURN_ADDR(addr_kCrocomire_Ilist_BD2A); } -uint16 Crocomire_Func_12(uint16 k, uint16 j) { // 0xA48805 +const uint16 *Crocomire_Func_12(uint16 k, const uint16 *jp) { // 0xA48805 Enemy_Crocomire *E = Get_Crocomire(0); E->crocom_var_B &= ~0x400u; - return addr_kCrocomire_Ilist_BCD8; + return INSTR_RETURN_ADDR(addr_kCrocomire_Ilist_BCD8); } -uint16 Crocomire_Func_13(uint16 k, uint16 j) { // 0xA48812 +const uint16 *Crocomire_Func_13(uint16 k, const uint16 *jp) { // 0xA48812 Enemy_Crocomire *E = Get_Crocomire(0); if ((E->crocom_var_B & 0x800) != 0) { E->crocom_var_B &= ~0x800u; E->crocom_var_C = 20; - return addr_kCrocomire_Ilist_BC30; - } else if ((int16)(j + 0x425E) >= 0) { - return addr_kCrocomire_Ilist_BD2A; + return INSTR_RETURN_ADDR(addr_kCrocomire_Ilist_BC30); + } else if ((int16)(INSTR_ADDR_TO_PTR(0, jp) - addr_kCrocomire_Ilist_BDA2) >= 0) { + return INSTR_RETURN_ADDR(addr_kCrocomire_Ilist_BD2A); } - return j; + return jp; } -uint16 Crocomire_Func_14(uint16 k, uint16 j) { // 0xA48836 +const uint16 *Crocomire_Func_14(uint16 k, const uint16 *jp) { // 0xA48836 Enemy_Crocomire *E = Get_Crocomire(0); if ((E->crocom_var_B & 0x800) != 0) { E->crocom_var_B &= ~0x800u; E->crocom_var_C = 12; - return addr_kCrocomire_Ilist_BC30; - } else if ((int16)(j + 0x425E) >= 0) { - return addr_kCrocomire_Ilist_BD2A; + return INSTR_RETURN_ADDR(addr_kCrocomire_Ilist_BC30); + } else if ((int16)(INSTR_ADDR_TO_PTR(0, jp) - addr_kCrocomire_Ilist_BDA2) >= 0) { + return INSTR_RETURN_ADDR(addr_kCrocomire_Ilist_BD2A); } - return j; + return jp; } -uint16 Crocomire_Func_15(uint16 k, uint16 j) { // 0xA4885A +const uint16 *Crocomire_Func_15(uint16 k, const uint16 *jp) { // 0xA4885A Enemy_Crocomire *E = Get_Crocomire(0); if ((E->crocom_var_B & 0x800) != 0) { E->crocom_var_B &= ~0x800u; E->crocom_var_C = 12; - return addr_kCrocomire_Ilist_BC30; - } else if ((int16)(j + 0x425E) >= 0) { - return addr_kCrocomire_Ilist_BD2A; + return INSTR_RETURN_ADDR(addr_kCrocomire_Ilist_BC30); + } else if ((int16)(INSTR_ADDR_TO_PTR(0, jp) - addr_kCrocomire_Ilist_BDA2) >= 0) { + return INSTR_RETURN_ADDR(addr_kCrocomire_Ilist_BD2A); } - return j; + return jp; } -uint16 Crocomire_Func_16(uint16 k, uint16 j) { // 0xA4887E +const uint16 *Crocomire_Func_16(uint16 k, const uint16 *jp) { // 0xA4887E Enemy_Crocomire *E = Get_Crocomire(0); uint16 v1 = E->crocom_var_D - 1; E->crocom_var_D = v1; if (sign16(v1 - 2)) { E->crocom_var_D = 0; E->crocom_var_C = 6; - return addr_kCrocomire_Ilist_BBCE; + return INSTR_RETURN_ADDR(addr_kCrocomire_Ilist_BBCE); } - return j; + return jp; } -uint16 Crocomire_Func_17(uint16 k, uint16 j) { // 0xA4889A +const uint16 *Crocomire_Func_17(uint16 k, const uint16 *jp) { // 0xA4889A Enemy_Crocomire *E = Get_Crocomire(0); uint16 crocom_var_B = E->crocom_var_B; if ((crocom_var_B & 0x800) != 0) { @@ -251,13 +245,13 @@ uint16 Crocomire_Func_17(uint16 k, uint16 j) { // 0xA4889A QueueSfx2_Max6(0x54u); } else { Get_Crocomire(cur_enemy_index)->crocom_var_C = 10; - return addr_kCrocomire_Ilist_BD8E; + return INSTR_RETURN_ADDR(addr_kCrocomire_Ilist_BD8E); } - return j; + return jp; } -uint16 Crocomire_Func_18(uint16 k, uint16 j) { // 0xA488D2 - uint16 result = Crocomire_Func_2(cur_enemy_index, j); +const uint16 *Crocomire_Func_18(uint16 k, const uint16 *jp) { // 0xA488D2 + const uint16 *result = Crocomire_Func_2(cur_enemy_index, jp); Enemy_Crocomire *E = Get_Crocomire(0); E->crocom_var_B |= 0x200u; E->crocom_var_D = 32; @@ -265,110 +259,110 @@ uint16 Crocomire_Func_18(uint16 k, uint16 j) { // 0xA488D2 return result; } -uint16 Crocomire_Func_19(uint16 k, uint16 j) { // 0xA488EE +const uint16 *Crocomire_Func_19(uint16 k, const uint16 *jp) { // 0xA488EE bool v2; // zf - j = Crocomire_Func_2(cur_enemy_index, j); + jp = Crocomire_Func_2(cur_enemy_index, jp); Enemy_Crocomire *E = Get_Crocomire(0); if (!E->crocom_var_D || (v2 = E->crocom_var_D == 1, --E->crocom_var_D, v2)) { - j = Crocomire_Func_20(cur_enemy_index); + jp = Crocomire_Func_20(cur_enemy_index); E->crocom_var_C = 32; } - return j; + return jp; } -uint16 Crocomire_Func_20(uint16 k) { // 0xA4890B +const uint16 *Crocomire_Func_20(uint16 k) { // 0xA4890B Get_Crocomire(k)->crocom_var_C = 20; Enemy_Crocomire *E = Get_Crocomire(0); E->crocom_var_B = E->crocom_var_B; - return addr_kCrocomire_Ilist_BAEA; + return INSTR_RETURN_ADDR(addr_kCrocomire_Ilist_BAEA); } -uint16 Crocomire_Func_21(uint16 k, uint16 j) { // 0xA4891B +const uint16 *Crocomire_Func_21(uint16 k, const uint16 *jp) { // 0xA4891B Enemy_Crocomire *E = Get_Crocomire(0); if ((E->crocom_var_B & 0x100) != 0) { - j = Crocomire_Func_2(cur_enemy_index, j); + jp = Crocomire_Func_2(cur_enemy_index, jp); E->crocom_var_D = 16; E->crocom_var_C = 34; } else { - j = Crocomire_Func_20(cur_enemy_index); + jp = Crocomire_Func_20(cur_enemy_index); E->crocom_var_C = 32; } - return j; + return jp; } -uint16 Crocomire_Func_22(uint16 k, uint16 j) { // 0xA48940 +const uint16 *Crocomire_Func_22(uint16 k, const uint16 *jp) { // 0xA48940 k = cur_enemy_index; - j = Crocomire_Func_2(k, j); + jp = Crocomire_Func_2(k, jp); Enemy_Crocomire *E = Get_Crocomire(0); if (!E->crocom_var_D) { E->crocom_var_B |= 0x2000u; - j = Crocomire_Func_3(k, j); + jp = Crocomire_Func_3(k, jp); E->crocom_var_C = 36; } - return j; + return jp; } -uint16 Crocomire_Func_23(uint16 k, uint16 j) { // 0xA4895E +const uint16 *Crocomire_Func_23(uint16 k, const uint16 *jp) { // 0xA4895E k = cur_enemy_index; Enemy_Crocomire *E = Get_Crocomire(0); if (sign16(E->base.x_pos - 672)) { - j = Crocomire_Func_3(k, j); + jp = Crocomire_Func_3(k, jp); E->crocom_var_C = 36; E->crocom_var_D = 3; } else { if ((E->crocom_var_B & 0x4000) == 0) { E->crocom_var_C = 38; - j = Crocomire_Func_12(k, j); + jp = Crocomire_Func_12(k, jp); } if ((E->crocom_var_B & 0x4000) != 0) { E->crocom_var_D = 5; - j = addr_kCrocomire_Ilist_BCD8; + jp = INSTR_RETURN_ADDR(addr_kCrocomire_Ilist_BCD8); E->crocom_var_F = E->crocom_var_C; E->crocom_var_C = 42; } } - return j; + return jp; } -uint16 Crocomire_Func_24(uint16 k, uint16 j) { // 0xA489A8 +const uint16 *Crocomire_Func_24(uint16 k, const uint16 *jp) { // 0xA489A8 bool v2; // zf k = cur_enemy_index; Enemy_Crocomire *E = Get_Crocomire(0); if (!E->crocom_var_D || (v2 = E->crocom_var_D == 1, --E->crocom_var_D, v2)) { - j = Crocomire_Func_3(k, j); + jp = Crocomire_Func_3(k, jp); E->crocom_var_C = 40; E->crocom_var_B &= ~0x400u; } else { E->crocom_var_C = 36; Get_Crocomire(0x40u)->crocom_var_D = 0; E->crocom_var_B |= 0x400u; - return addr_kCrocomire_Ilist_BCD8; + return INSTR_RETURN_ADDR(addr_kCrocomire_Ilist_BCD8); } - return j; + return jp; } -uint16 Crocomire_Func_25(uint16 k, uint16 j) { // 0xA489DE +const uint16 *Crocomire_Func_25(uint16 k, const uint16 *jp) { // 0xA489DE k = cur_enemy_index; Enemy_Crocomire *E = Get_Crocomire(0); uint16 crocom_var_B = E->crocom_var_B; if ((crocom_var_B & 0x2000) == 0) E->crocom_var_B = crocom_var_B & 0xFCFF; - j = Crocomire_Func_3(k, j); + jp = Crocomire_Func_3(k, jp); E->crocom_var_C = 40; - return j; + return jp; } -uint16 Crocomire_Func_26(uint16 k, uint16 j) { // 0xA489F9 +const uint16 *Crocomire_Func_26(uint16 k, const uint16 *jp) { // 0xA489F9 Enemy_Crocomire *E = Get_Crocomire(0); if (E->crocom_var_D) { uint16 crocom_var_B = E->crocom_var_B; if ((crocom_var_B & 0x4000) != 0) { --E->crocom_var_D; QueueSfx2_Max6(0x3Bu); - return addr_kCrocomire_Ilist_BCD8; + return INSTR_RETURN_ADDR(addr_kCrocomire_Ilist_BCD8); } else { E->crocom_var_B = crocom_var_B & 0xBFFF; E->crocom_var_C = 12; @@ -377,9 +371,9 @@ uint16 Crocomire_Func_26(uint16 k, uint16 j) { // 0xA489F9 E->crocom_var_B &= ~0x4000u; E->base.instruction_timer = 1; E->crocom_var_C = E->crocom_var_F; - return addr_kCrocomire_Ilist_BCD8; + return INSTR_RETURN_ADDR(addr_kCrocomire_Ilist_BCD8); } - return j; + return jp; } void Crocomire_Init(void) { // 0xA48A5A @@ -541,19 +535,19 @@ void Crocomire_Func_31(void) { // 0xA48CCB } } -uint16 Crocomire_Instr_11(uint16 k, uint16 j) { // 0xA48CFB +const uint16 *Crocomire_Instr_11(uint16 k, const uint16 *jp) { // 0xA48CFB QueueSfx2_Max6(0x74u); - return j; + return jp; } -uint16 Crocomire_Instr_7(uint16 k, uint16 j) { // 0xA48D07 +const uint16 *Crocomire_Instr_7(uint16 k, const uint16 *jp) { // 0xA48D07 QueueSfx2_Max6(0x25u); - return j; + return jp; } -uint16 Crocomire_Instr_19(uint16 k, uint16 j) { // 0xA48D13 +const uint16 *Crocomire_Instr_19(uint16 k, const uint16 *jp) { // 0xA48D13 QueueSfx2_Max6(0x75u); - return j; + return jp; } void Crocomire_Func_35(void) { // 0xA48D1F @@ -722,30 +716,30 @@ void Crocomire_Func_38(uint16 k) { // 0xA48FC2 Enemy_MoveDown(k); } -uint16 Crocomire_Instr_2(uint16 k, uint16 j) { // 0xA48FC7 +const uint16 *Crocomire_Instr_2(uint16 k, const uint16 *jp) { // 0xA48FC7 earthquake_type = 4; earthquake_timer = 5; QueueSfx2_Max6(0x76u); - return j; + return jp; } -uint16 Crocomire_Instr_4(uint16 k, uint16 j) { // 0xA48FDF +const uint16 *Crocomire_Instr_4(uint16 k, const uint16 *jp) { // 0xA48FDF if ((Get_Crocomire(0)->crocom_var_B & 0x800) == 0) { R18_ = 0; R20_ = -4; Enemy_MoveRight_IgnoreSlopes(cur_enemy_index); } - return j; + return jp; } -uint16 Crocomire_Instr_3(uint16 k, uint16 j) { // 0xA48FFA +const uint16 *Crocomire_Instr_3(uint16 k, const uint16 *jp) { // 0xA48FFA Crocomire_Func_43(); - return Crocomire_Instr_4(k, j); + return Crocomire_Instr_4(k, jp); } -uint16 Crocomire_Instr_15(uint16 k, uint16 j) { // 0xA48FFF +const uint16 *Crocomire_Instr_15(uint16 k, const uint16 *jp) { // 0xA48FFF Crocomire_Func_43(); - return Crocomire_Instr_4(k, j); + return Crocomire_Instr_4(k, jp); } void Crocomire_Func_43(void) { // 0xA49004 @@ -755,22 +749,22 @@ void Crocomire_Func_43(void) { // 0xA49004 Crocomire_Func_87(0, v1); } -uint16 Crocomire_Instr_16(uint16 k, uint16 j) { // 0xA4901D +const uint16 *Crocomire_Instr_16(uint16 k, const uint16 *jp) { // 0xA4901D R18_ = 0; R20_ = -4; if (Enemy_MoveRight_IgnoreSlopes(cur_enemy_index) & 1) { Get_Crocomire(0)->crocom_var_C = 14; - return addr_kCrocomire_Ilist_BF3C; + return INSTR_RETURN_ADDR(addr_kCrocomire_Ilist_BF3C); } else { uint16 v2 = 32; if (!sign16(random_number - 2048)) v2 = -32; R18_ = v2; - return Crocomire_Func_87(j, v2 + (random_number & 0xF)); + return Crocomire_Func_87(jp, v2 + (random_number & 0xF)); } } -uint16 Crocomire_Instr_13(uint16 k, uint16 j) { // 0xA4905B +const uint16 *Crocomire_Instr_13(uint16 k, const uint16 *jp) { // 0xA4905B R18_ = 0; R20_ = 4; Enemy_Crocomire *E = Get_Crocomire(0); @@ -779,24 +773,24 @@ uint16 Crocomire_Instr_13(uint16 k, uint16 j) { // 0xA4905B - ((uint16)((E->base.x_pos < E->base.x_width) + 256) | 0x40000)) >> 16) - layer1_x_pos) < 0) Enemy_MoveRight_IgnoreSlopes(cur_enemy_index); - return j; + return jp; } -uint16 Crocomire_Instr_18(uint16 k, uint16 j) { // 0xA4907F +const uint16 *Crocomire_Instr_18(uint16 k, const uint16 *jp) { // 0xA4907F R18_ = 0; R20_ = 4; Enemy_MoveRight_IgnoreSlopes(k); - return j; + return jp; } -uint16 Crocomire_Instr_12(uint16 k, uint16 j) { // 0xA4908F +const uint16 *Crocomire_Instr_12(uint16 k, const uint16 *jp) { // 0xA4908F Crocomire_Func_43(); - return Crocomire_Instr_13(k, j); + return Crocomire_Instr_13(k, jp); } -uint16 Crocomire_Instr_17(uint16 k, uint16 j) { // 0xA49094 +const uint16 *Crocomire_Instr_17(uint16 k, const uint16 *jp) { // 0xA49094 Crocomire_Func_43(); - return Crocomire_Instr_18(k, j); + return Crocomire_Instr_18(k, jp); } void Crocomire_Func_49(void) { // 0xA49099 @@ -1093,7 +1087,6 @@ void Crocomire_Func_59(void) { // 0xA493ED void Crocomire_Func_60(void) { // 0xA4943D int i; - int16 v4; int16 j; Enemy_Crocomire *E = Get_Crocomire(cur_enemy_index); @@ -1114,14 +1107,11 @@ void Crocomire_Func_60(void) { // 0xA4943D break; v6 = i; uint16 v3 = *(uint16 *)((char *)&g_word_A49BC7 + i); - R18_ = g_word_7E068E; + int n = g_word_7E068E; do { - v4 = *(uint16 *)IndirPtr(&R0_, v2); - *(uint16 *)RomPtr_7E(v3) = v4; - v3 += 2; - v2 += 2; - --R18_; - } while ((R18_ & 0x8000u) == 0); + *(uint16 *)&g_ram[v3] = IndirReadWord(R0_, v2); + v3 += 2, v2 += 2; + } while (--n >= 0); } croco_word_7E069A = i + 2; g_word_7E068A = i + 2; @@ -1507,65 +1497,65 @@ void Crocomire_Func_73(void) { // 0xA49A38 } } -uint16 Crocomire_Instr_8(uint16 k, uint16 j) { // 0xA49A9B - return Crocomire_Func_87(j, 0xFFE0); +const uint16 *Crocomire_Instr_8(uint16 k, const uint16 *jp) { // 0xA49A9B + return Crocomire_Func_87(jp, 0xFFE0); } -uint16 Crocomire_Instr_6(uint16 k, uint16 j) { // 0xA49AA0 - return Crocomire_Func_87(j, 0); +const uint16 *Crocomire_Instr_6(uint16 k, const uint16 *jp) { // 0xA49AA0 + return Crocomire_Func_87(jp, 0); } -uint16 Crocomire_Instr_9(uint16 k, uint16 j) { // 0xA49AA5 - return Crocomire_Func_87(j, 0xFFF0); +const uint16 *Crocomire_Instr_9(uint16 k, const uint16 *jp) { // 0xA49AA5 + return Crocomire_Func_87(jp, 0xFFF0); } -uint16 Crocomire_Instr_5(uint16 k, uint16 j) { // 0xA49AAA - return Crocomire_Func_87(j, 0x10); +const uint16 *Crocomire_Instr_5(uint16 k, const uint16 *jp) { // 0xA49AAA + return Crocomire_Func_87(jp, 0x10); } -uint16 Crocomire_Instr_20(uint16 k, uint16 j) { // 0xA49AAF - return Crocomire_Func_87(j, 0); +const uint16 *Crocomire_Instr_20(uint16 k, const uint16 *jp) { // 0xA49AAF + return Crocomire_Func_87(jp, 0); } -uint16 Crocomire_Instr_21(uint16 k, uint16 j) { // 0xA49AB4 - return Crocomire_Func_87(j, 8u); +const uint16 *Crocomire_Instr_21(uint16 k, const uint16 *jp) { // 0xA49AB4 + return Crocomire_Func_87(jp, 8u); } -uint16 Crocomire_Instr_22(uint16 k, uint16 j) { // 0xA49AB9 - return Crocomire_Func_87(j, 0x10); +const uint16 *Crocomire_Instr_22(uint16 k, const uint16 *jp) { // 0xA49AB9 + return Crocomire_Func_87(jp, 0x10); } -uint16 Crocomire_Instr_23(uint16 k, uint16 j) { // 0xA49ABE - return Crocomire_Func_87(j, 0x18); +const uint16 *Crocomire_Instr_23(uint16 k, const uint16 *jp) { // 0xA49ABE + return Crocomire_Func_87(jp, 0x18); } -uint16 Crocomire_Instr_24(uint16 k, uint16 j) { // 0xA49AC3 - return Crocomire_Func_87(j, 0x20); +const uint16 *Crocomire_Instr_24(uint16 k, const uint16 *jp) { // 0xA49AC3 + return Crocomire_Func_87(jp, 0x20); } -uint16 Crocomire_Instr_10(uint16 k, uint16 j) { // 0xA49AC8 - return Crocomire_Func_87(j, 0x28); +const uint16 *Crocomire_Instr_10(uint16 k, const uint16 *jp) { // 0xA49AC8 + return Crocomire_Func_87(jp, 0x28); } -uint16 Crocomire_Instr_25(uint16 k, uint16 j) { // 0xA49ACD - return Crocomire_Func_87(j, 0x30); +const uint16 *Crocomire_Instr_25(uint16 k, const uint16 *jp) { // 0xA49ACD + return Crocomire_Func_87(jp, 0x30); } -uint16 Crocomire_Instr_26(uint16 k, uint16 j) { // 0xA49AD2 - return Crocomire_Func_87(j, 0x38); +const uint16 *Crocomire_Instr_26(uint16 k, const uint16 *jp) { // 0xA49AD2 + return Crocomire_Func_87(jp, 0x38); } -uint16 Crocomire_Instr_27(uint16 k, uint16 j) { // 0xA49AD7 - return Crocomire_Func_87(j, 0x40); +const uint16 *Crocomire_Instr_27(uint16 k, const uint16 *jp) { // 0xA49AD7 + return Crocomire_Func_87(jp, 0x40); } -uint16 Crocomire_Func_87(uint16 j, uint16 a) { // 0xA49ADA +const uint16 *Crocomire_Func_87(const uint16 *jp, uint16 a) { // 0xA49ADA R18_ = a; Enemy_Crocomire *E = Get_Crocomire(0); R18_ = a + E->base.x_pos + (random_number & 7); R20_ = E->base.y_height + E->base.y_pos - 16; SpawnEnemyProjectileWithRoomGfx(addr_kEproj_DustCloudExplosion, 0x15); - return j; + return jp; } static const SpawnHardcodedPlmArgs unk_A49B3E = { 0x30, 0x03, 0xb753 }; @@ -1772,4 +1762,4 @@ void CrocomireTongue_Init(void) { // 0xA4F67A void CrocomireTongue_Main(void) { // 0xA4F6BB ; -} +} \ No newline at end of file diff --git a/src/sm_a5.c b/src/sm_a5.c index 87319a8..66c793b 100644 --- a/src/sm_a5.c +++ b/src/sm_a5.c @@ -4,58 +4,27 @@ #include "variables.h" #include "funcs.h" #include "enemy_types.h" -#define kDraygon_MorePalettes ((uint16*)RomPtr(0xa5a217)) -#define kDraygon_MorePalettes2 ((uint16*)RomPtr(0xa5a277)) -#define g_word_A5A297 ((uint16*)RomPtr(0xa5a297)) -#define g_word_A587DC ((uint16*)RomPtr(0xa587dc)) -#define g_word_A596AF ((uint16*)RomPtr(0xa596af)) -#define g_word_A596EF ((uint16*)RomPtr(0xa596ef)) -#define g_word_A5A19F ((uint16*)RomPtr(0xa5a19f)) -#define g_word_A5A1AF ((uint16*)RomPtr(0xa5a1af)) -#define g_word_A5A1C7 ((uint16*)RomPtr(0xa5a1c7)) -#define g_word_A5A1DF ((uint16*)RomPtr(0xa5a1df)) -#define g_byte_A5CE07 ((uint8*)RomPtr(0xa5ce07)) -#define g_word_A5E379 ((uint16*)RomPtr(0xa5e379)) -#define g_word_A5E3F9 ((uint16*)RomPtr(0xa5e3f9)) -#define g_word_A5E4F9 ((uint16*)RomPtr(0xa5e4f9)) -#define g_word_A5E5D9 ((uint16*)RomPtr(0xa5e5d9)) -#define kSporeSpawn_Palette ((uint16*)RomPtr(0xa5e359)) -uint16 EnemyInstr_Goto_A5(uint16 k, uint16 j) { // 0xA580ED - return *(uint16 *)RomPtr_A5(j); -} +#define kDraygon_MorePalettes ((uint16*)RomFixedPtr(0xa5a217)) +#define kDraygon_MorePalettes2 ((uint16*)RomFixedPtr(0xa5a277)) +#define g_word_A5A297 ((uint16*)RomFixedPtr(0xa5a297)) +#define g_word_A587DC ((uint16*)RomFixedPtr(0xa587dc)) +#define g_word_A596AF ((uint16*)RomFixedPtr(0xa596af)) +#define g_word_A596EF ((uint16*)RomFixedPtr(0xa596ef)) +#define g_word_A5A19F ((uint16*)RomFixedPtr(0xa5a19f)) +#define g_word_A5A1AF ((uint16*)RomFixedPtr(0xa5a1af)) +#define g_word_A5A1C7 ((uint16*)RomFixedPtr(0xa5a1c7)) +#define g_word_A5A1DF ((uint16*)RomFixedPtr(0xa5a1df)) +#define g_byte_A5CE07 ((uint8*)RomFixedPtr(0xa5ce07)) +#define g_word_A5E379 ((uint16*)RomFixedPtr(0xa5e379)) +#define g_word_A5E3F9 ((uint16*)RomFixedPtr(0xa5e3f9)) +#define g_word_A5E4F9 ((uint16*)RomFixedPtr(0xa5e4f9)) +#define g_word_A5E5D9 ((uint16*)RomFixedPtr(0xa5e5d9)) +#define kSporeSpawn_Palette ((uint16*)RomFixedPtr(0xa5e359)) -uint16 EnemyInstr_DecTimerAndGoto2_A5(uint16 k, uint16 j) { // 0xA58110 - EnemyData *v2 = gEnemyData(k); - if (v2->timer-- == 1) - return j + 2; - else - return EnemyInstr_Goto_A5(k, j); -} -uint16 EnemyInstr_SetTimer_A5(uint16 k, uint16 j) { // 0xA58123 - uint16 v2 = *(uint16 *)RomPtr_A5(j); - gEnemyData(k)->timer = v2; - return j + 2; -} -uint16 EnemyInstr_Sleep_A5(uint16 k, uint16 j) { // 0xA5812F - gEnemyData(k)->current_instruction = j - 2; - return 0; -} -uint16 EnemyInstr_StopScript_A5(uint16 k, uint16 j) { // 0xA5807C - EnemyData *v2 = gEnemyData(k); - v2->properties |= kEnemyProps_Deleted; - return 0; -} -uint16 EnemyInstr_WaitNframes_A5(uint16 k, uint16 j) { // 0xA5813A - uint16 v2 = *(uint16 *)RomPtr_A5(j); - EnemyData *v3 = gEnemyData(k); - v3->instruction_timer = v2; - v3->current_instruction = j + 2; - return 0; -} void Enemy_GrappleReact_NoInteract_A5(void) { // 0xA58000 SwitchEnemyAiToMainAi(); @@ -1041,37 +1010,24 @@ void Draygon_Func_40(uint16 k) { // 0xA594A9 } } -uint16 Draygon_Instr_1(uint16 k, uint16 j) { // 0xA594DD - uint16 *v2 = (uint16 *)RomPtr_A5(j); - Get_Draygon(0)->base.current_instruction = *v2; - Get_Draygon(0x40u)->base.current_instruction = v2[1]; - Get_Draygon(0x80)->base.current_instruction = v2[2]; - Enemy_Draygon *E = Get_Draygon(0xC0u); - E->base.current_instruction = v2[3]; +const uint16 *Draygon_Instr_1(uint16 k, const uint16 *jp) { // 0xA594DD + Get_Draygon(0)->base.current_instruction = jp[0]; + Get_Draygon(0x40)->base.current_instruction = jp[1]; + Get_Draygon(0x80)->base.current_instruction = jp[2]; + Get_Draygon(0xC0)->base.current_instruction = jp[3]; Get_Draygon(0)->base.instruction_timer = 1; - Get_Draygon(0x40u)->base.instruction_timer = 1; + Get_Draygon(0x40)->base.instruction_timer = 1; Get_Draygon(0x80)->base.instruction_timer = 1; - E->base.instruction_timer = 1; - return j + 8; + Get_Draygon(0xC0)->base.instruction_timer = 1; + return jp + 4; } void Draygon_Hurt(void) { // 0xA5954D - int16 v2; - int16 v7; - int16 v9; - uint16 v0 = addr_kDraygon_MorePalettes2; if ((Get_Draygon(cur_enemy_index)->base.flash_timer & 2) != 0) v0 = addr_word_A5A297; - uint16 v1 = addr_kDraygon_BigSprmap_C08F__plus__17; - remaining_enemy_spritemap_entries = 16; - do { - v2 = *(uint16 *)RomPtr_A5(v0); - *(uint16 *)RomPtr_7E(v1) = v2; - v1 += 2; - v0 += 2; - --remaining_enemy_spritemap_entries; - } while (remaining_enemy_spritemap_entries); + memcpy(g_ram + addr_kDraygon_BigSprmap_C08F__plus__17, RomPtr_A5(v0), 32); + if ((Get_Draygon(cur_enemy_index)->base.flash_timer & 2) == 0) { uint16 v3 = 4 * Get_Draygon(0)->draygon_var_0E; for (int i = 0; i != 8; i += 2) { @@ -1082,19 +1038,12 @@ void Draygon_Hurt(void) { // 0xA5954D uint16 v5 = addr_kDraygon_Palette; if ((Get_Draygon(cur_enemy_index)->base.flash_timer & 2) != 0) v5 = addr_word_A5A297; - uint16 v6 = addr_kDraygon_BigSprmap_C11B__plus__197; - remaining_enemy_spritemap_entries = 16; - do { - v7 = *(uint16 *)RomPtr_A5(v5); - *(uint16 *)RomPtr_7E(v6) = v7; - v6 += 2; - v5 += 2; - --remaining_enemy_spritemap_entries; - } while (remaining_enemy_spritemap_entries); + memcpy(g_ram + addr_kDraygon_BigSprmap_C11B__plus__197, RomPtr_A5(v5), 32); + if ((samus_grapple_flags & 1) != 0) { Enemy_Draygon *E = Get_Draygon(0); if ((E->base.frame_counter & 7) == 0) { - v9 = E->base.health - 256; + int16 v9 = E->base.health - 256; if (v9 < 0) v9 = 0; E->base.health = v9; @@ -1173,42 +1122,41 @@ void Draygon_Func_41(void) { // 0xA59701 } } -uint16 Draygon_Instr_13(uint16 k, uint16 j) { // 0xA59736 - uint16 v2 = *(uint16 *)RomPtr_A5(j); - Get_Draygon(k)->draygon_var_A = v2; - return j + 2; +const uint16 *Draygon_Instr_13(uint16 k, const uint16 *jp) { // 0xA59736 + Get_Draygon(k)->draygon_var_A = jp[0]; + return jp + 1; } -uint16 Draygon_Instr_8(uint16 k, uint16 j) { // 0xA5973F +const uint16 *Draygon_Instr_8(uint16 k, const uint16 *jp) { // 0xA5973F Draygon_Func_47(); R22_ = 21; R24_ = 0; CreateSpriteAtPos(); - return j; + return jp; } -uint16 Draygon_Instr_7(uint16 k, uint16 j) { // 0xA59752 +const uint16 *Draygon_Instr_7(uint16 k, const uint16 *jp) { // 0xA59752 Draygon_Func_47(); R22_ = 3; R24_ = 0; CreateSpriteAtPos(); - return j; + return jp; } -uint16 Draygon_Instr_6(uint16 k, uint16 j) { // 0xA59765 +const uint16 *Draygon_Instr_6(uint16 k, const uint16 *jp) { // 0xA59765 Draygon_Func_47(); R22_ = 29; R24_ = 0; CreateSpriteAtPos(); - return j; + return jp; } -uint16 Draygon_Instr_9(uint16 k, uint16 j) { // 0xA59778 +const uint16 *Draygon_Instr_9(uint16 k, const uint16 *jp) { // 0xA59778 Draygon_Func_47(); R22_ = 24; R24_ = 0; CreateSpriteAtPos(); - return j; + return jp; } void Draygon_Func_47(void) { // 0xA5978B @@ -1220,12 +1168,12 @@ void Draygon_Func_47(void) { // 0xA5978B R20_ += E->base.y_pos; } -uint16 Draygon_Instr_2(uint16 k, uint16 j) { // 0xA59895 +const uint16 *Draygon_Instr_2(uint16 k, const uint16 *jp) { // 0xA59895 room_loading_irq_handler = 12; - return j; + return jp; } -uint16 Draygon_Instr_11(uint16 k, uint16 j) { // 0xA598D3 +const uint16 *Draygon_Instr_11(uint16 k, const uint16 *jp) { // 0xA598D3 Enemy_Draygon *E2 = Get_Draygon(0x80); E2->base.instruction_timer = 1; E2->base.current_instruction = addr_kDraygon_Ilist_97B9; @@ -1233,20 +1181,20 @@ uint16 Draygon_Instr_11(uint16 k, uint16 j) { // 0xA598D3 Enemy_Draygon *E3 = Get_Draygon(0xC0u); E3->base.instruction_timer = 1; E3->base.current_instruction = addr_kDraygon_Ilist_97B9; - return j; + return jp; } -uint16 Draygon_Instr_5(uint16 k, uint16 j) { // 0xA598EF +const uint16 *Draygon_Instr_5(uint16 k, const uint16 *jp) { // 0xA598EF Enemy_Draygon *E = Get_Draygon(0); E->base.properties |= kEnemyProps_Tangible; - return j; + return jp; } -uint16 Draygon_Instr_15(uint16 k, uint16 j) { // 0xA59B9A +const uint16 *Draygon_Instr_15(uint16 k, const uint16 *jp) { // 0xA59B9A Enemy_Draygon *E = Get_Draygon(0); E->draygon_var_0F = 24; - uint8 *v3 = RomPtr_A0(E->base.enemy_ptr); - uint16 v4 = SuitDamageDivision(*((uint16 *)v3 + 3)); + const uint8 *v3 = RomPtr_A0(E->base.enemy_ptr); + uint16 v4 = SuitDamageDivision(GET_WORD(v3 + 6)); Samus_DealDamage(v4); earthquake_timer = 32; earthquake_type = 7; @@ -1255,56 +1203,52 @@ uint16 Draygon_Instr_15(uint16 k, uint16 j) { // 0xA59B9A R22_ = 21; R24_ = 0; CreateSpriteAtPos(); - return j; + return jp; } -uint16 Draygon_Instr_17(uint16 k, uint16 j) { // 0xA59C8A +const uint16 *Draygon_Instr_17(uint16 k, const uint16 *jp) { // 0xA59C8A room_loading_irq_handler = 12; - return j; + return jp; } -uint16 Draygon_Instr_14(uint16 k, uint16 j) { // 0xA59E0A - uint8 *v2 = RomPtr_A5(j); +const uint16 *Draygon_Instr_14(uint16 k, const uint16 *jp) { // 0xA59E0A Enemy_Draygon *E = Get_Draygon(0); - E->draygon_var_5E = *(uint16 *)v2; - E->draygon_var_5F = *((uint16 *)v2 + 1); - return j + 4; + E->draygon_var_5E = jp[0]; + E->draygon_var_5F = jp[1]; + return jp + 2; } -uint16 Draygon_Instr_16(uint16 k, uint16 j) { // 0xA59F57 - uint16 v2 = *(uint16 *)RomPtr_A5(j); - Get_Draygon(0)->draygon_var_A = v2; - return j + 2; +const uint16 *Draygon_Instr_16(uint16 k, const uint16 *jp) { // 0xA59F57 + Get_Draygon(0)->draygon_var_A = jp[0]; + return jp + 1; } -uint16 Draygon_Instr_10(uint16 k, uint16 j) { // 0xA59F60 - uint16 *v2 = (uint16 *)RomPtr_A5(j); - QueueSfx2_Max6(*v2); - return j + 2; +const uint16 *Draygon_Instr_10(uint16 k, const uint16 *jp) { // 0xA59F60 + QueueSfx2_Max6(jp[0]); + return jp + 1; } -uint16 Draygon_Instr_4(uint16 k, uint16 j) { // 0xA59F6E - uint16 *v2 = (uint16 *)RomPtr_A5(j); - QueueSfx3_Max6(*v2); - return j + 2; +const uint16 *Draygon_Instr_4(uint16 k, const uint16 *jp) { // 0xA59F6E + QueueSfx3_Max6(jp[0]); + return jp + 1; } -uint16 Draygon_Instr_12(uint16 k, uint16 j) { // 0xA59F7C +const uint16 *Draygon_Instr_12(uint16 k, const uint16 *jp) { // 0xA59F7C Enemy_Draygon *E = Get_Draygon(0); R18_ = E->base.x_pos - 28; R20_ = E->base.y_pos - 16; enemy_projectile_unk1995 = (NextRandom() & 0x3F) + 128; SpawnEnemyProjectileWithGfx(2u, cur_enemy_index, addr_stru_868E50); - return j; + return jp; } -uint16 Draygon_Instr_18(uint16 k, uint16 j) { // 0xA59FAE +const uint16 *Draygon_Instr_18(uint16 k, const uint16 *jp) { // 0xA59FAE Enemy_Draygon *E = Get_Draygon(0); R18_ = E->base.x_pos + 24; R20_ = E->base.y_pos - 16; enemy_projectile_unk1995 = (NextRandom() & 0x3F) + 192; SpawnEnemyProjectileWithGfx(2u, cur_enemy_index, addr_stru_868E50); - return j; + return jp; } void Draygon_Func_42(void) { // 0xA59FE0 @@ -1422,10 +1366,9 @@ void DraygonsEye_Init(void) { // 0xA5C46B E->draygon_var_A = FUNC16(nullsub_169_A5); } -uint16 Draygon_Instr_3(uint16 k, uint16 j) { // 0xA5C47B - uint16 v2 = *(uint16 *)RomPtr_A5(j); - Get_Draygon(0x40u)->draygon_var_A = v2; - return j + 2; +const uint16 *Draygon_Instr_3(uint16 k, const uint16 *jp) { // 0xA5C47B + Get_Draygon(0x40u)->draygon_var_A = jp[0]; + return jp + 1; } void DraygonsEye_Main(void) { // 0xA5C486 @@ -1515,32 +1458,31 @@ void DraygonsArms_Init(void) { // 0xA5C5AD v0->layer = 2; } -uint16 Draygon_Instr_25(uint16 k, uint16 j) { // 0xA5E75F +const uint16 *Draygon_Instr_25(uint16 k, const uint16 *jp) { // 0xA5E75F Enemy_Draygon *E = Get_Draygon(0); if (sign16(E->draygon_var_0B - 40)) E->draygon_var_0B += 8; - return j; + return jp; } -uint16 Draygon_Instr_24(uint16 k, uint16 j) { // 0xA5E771 +const uint16 *Draygon_Instr_24(uint16 k, const uint16 *jp) { // 0xA5E771 Get_Draygon(0)->draygon_var_2F = 0; - return j; + return jp; } void Draygon_Func_50(uint16 j) { // 0xA5E811 - uint8 *v1 = RomPtr_A5(j); + const uint8 *v1 = RomPtr_A5(j); Enemy_Draygon *E = Get_Draygon(0); - E->draygon_var_0B = *(uint16 *)v1; - E->draygon_var_0C = *((uint16 *)v1 + 1); - E->draygon_var_0A = *((uint16 *)v1 + 2); + E->draygon_var_0B = GET_WORD(v1); + E->draygon_var_0C = GET_WORD(v1 + 2); + E->draygon_var_0A = GET_WORD(v1 + 4); } -uint16 Draygon_Instr_21(uint16 k, uint16 j) { // 0xA5E82D - uint8 *v2 = RomPtr_A5(j); +const uint16 *Draygon_Instr_21(uint16 k, const uint16 *jp) { // 0xA5E82D Enemy_Draygon *E = Get_Draygon(0); - E->draygon_var_0B = *(uint16 *)v2; - E->draygon_var_0C = *((uint16 *)v2 + 1); - return j + 4; + E->draygon_var_0B = jp[0]; + E->draygon_var_0C = jp[1]; + return jp + 2; } void Draygon_Func_51(uint16 j) { // 0xA5E840 @@ -1559,95 +1501,57 @@ uint16 Draygon_Instr_53(uint16 k, uint16 j) { // 0xA5E854 return j + 2; } -uint16 Draygon_Instr_54(uint16 k, uint16 j) { // 0xA5E863 - Enemy_Draygon *E = Get_Draygon(0); - E->draygon_var_0C += *(uint16 *)RomPtr_A5(j); - return j + 2; +const uint16 *Draygon_Instr_22(uint16 k, const uint16 *jp) { // 0xA5E872 + kraid_unk9000 = jp[0]; + return jp + 1; } -uint16 Draygon_Instr_22(uint16 k, uint16 j) { // 0xA5E872 - kraid_unk9000 = *(uint16 *)RomPtr_A5(j); - return j + 2; -} - -uint16 Draygon_Instr_27(uint16 k, uint16 j) { // 0xA5E87C +const uint16 *Draygon_Instr_27(uint16 k, const uint16 *jp) { // 0xA5E87C Enemy_Draygon *E = Get_Draygon(0); E->base.x_pos = 128; E->base.y_pos = 624; E->base.properties = E->base.properties & 0x5BFF | 0xA000; - return j; + return jp; } -uint16 Draygon_Instr_23(uint16 k, uint16 j) { // 0xA5E895 - uint16 *v2 = (uint16 *)RomPtr_A5(j); - QueueSfx2_Max6(*v2); - return j + 2; +const uint16 *Draygon_Instr_23(uint16 k, const uint16 *jp) { // 0xA5E895 + QueueSfx2_Max6(jp[0]); + return jp + 1; } -uint16 Draygon_Instr_55(uint16 k, uint16 j) { // 0xA5E8A3 - uint16 *v2 = (uint16 *)RomPtr_A5(j); - QueueSfx3_Max6(*v2); - return j + 2; -} - -uint16 Draygon_Instr_30(uint16 k, uint16 j) { // 0xA5E8B1 +const uint16 *Draygon_Instr_30(uint16 k, const uint16 *jp) { // 0xA5E8B1 Enemy_ItemDrop_SporeSpawn(k); - return j; + return jp; } -uint16 Draygon_Instr_20(uint16 k, uint16 j) { // 0xA5E8BA - uint16 v2 = *(uint16 *)RomPtr_A5(j); - Get_Draygon(cur_enemy_index)->draygon_var_A = v2; - return j + 2; +const uint16 *Draygon_Instr_20(uint16 k, const uint16 *jp) { // 0xA5E8BA + Get_Draygon(cur_enemy_index)->draygon_var_A = jp[0]; + return jp + 1; } -uint16 Draygon_Instr_29(uint16 k, uint16 j) { // 0xA5E8CA - uint16 m; - uint16 n; - - R18_ = j; - uint16 v2 = *(uint16 *)RomPtr_A5(j); - for (int i = 0; i != 32; i += 2) { - palette_buffer[(i >> 1) + 144] = g_word_A5E3F9[v2 >> 1]; - v2 += 2; - } - uint16 v4 = *(uint16 *)RomPtr_A5(R18_); - for (m = 0; m != 32; m += 2) { - palette_buffer[(m >> 1) + 64] = g_word_A5E4F9[v4 >> 1]; - v4 += 2; - } - uint16 v6 = *(uint16 *)RomPtr_A5(R18_); - for (n = 0; n != 32; n += 2) { - palette_buffer[(n >> 1) + 112] = g_word_A5E5D9[v6 >> 1]; - v6 += 2; - } - return j + 2; +const uint16 *Draygon_Instr_29(uint16 k, const uint16 *jp) { // 0xA5E8CA + uint16 v2 = jp[0]; + for (int i = 0; i != 32; i += 2) + palette_buffer[(i >> 1) + 144] = g_word_A5E3F9[(v2 + i) >> 1]; + for (int i = 0; i != 32; i += 2) + palette_buffer[(i >> 1) + 64] = g_word_A5E4F9[(v2 + i) >> 1]; + for (int i = 0; i != 32; i += 2) + palette_buffer[(i >> 1) + 112] = g_word_A5E5D9[(v2 + i) >> 1]; + return jp + 1; } -uint16 Draygon_Instr_19(uint16 k, uint16 j) { // 0xA5E91C - uint16 m; - uint16 n; - - R18_ = j; - uint16 v2 = *(uint16 *)RomPtr_A5(j); - for (int i = 0; i != 32; i += 2) { - target_palettes[(i >> 1) + 144] = g_word_A5E3F9[v2 >> 1]; - v2 += 2; - } - uint16 v4 = *(uint16 *)RomPtr_A5(R18_); - for (m = 0; m != 32; m += 2) { - target_palettes[(m >> 1) + 64] = g_word_A5E4F9[v4 >> 1]; - v4 += 2; - } - uint16 v6 = *(uint16 *)RomPtr_A5(R18_); - for (n = 0; n != 32; n += 2) { - target_palettes[(n >> 1) + 112] = g_word_A5E5D9[v6 >> 1]; - v6 += 2; - } - return j + 2; +const uint16 *Draygon_Instr_19(uint16 k, const uint16 *jp) { // 0xA5E91C + uint16 v2 = jp[0]; + for (int i = 0; i != 32; i += 2) + target_palettes[(i >> 1) + 144] = g_word_A5E3F9[(v2 + i) >> 1]; + for (int i = 0; i != 32; i += 2) + target_palettes[(i >> 1) + 64] = g_word_A5E4F9[(v2 + i) >> 1]; + for (int i = 0; i != 32; i += 2) + target_palettes[(i >> 1) + 112] = g_word_A5E5D9[(v2 + i) >> 1]; + return jp + 1; } -uint16 Draygon_Instr_28(uint16 k, uint16 j) { // 0xA5E96E +const uint16 *Draygon_Instr_28(uint16 k, const uint16 *jp) { // 0xA5E96E NextRandom(); R18_ = (random_number & 0x7F) - 64; Enemy_Draygon *E = Get_Draygon(0); @@ -1656,10 +1560,10 @@ uint16 Draygon_Instr_28(uint16 k, uint16 j) { // 0xA5E96E R20_ += E->base.y_pos; SpawnEnemyProjectileWithRoomGfx(0xE509, 0x15); QueueSfx2_Max6(0x29u); - return j; + return jp; } -uint16 Draygon_Instr_26(uint16 k, uint16 j) { // 0xA5E9B1 +const uint16 *Draygon_Instr_26(uint16 k, const uint16 *jp) { // 0xA5E9B1 NextRandom(); R18_ = (random_number & 0x7F) - 64; Enemy_Draygon *E = Get_Draygon(0); @@ -1670,7 +1574,7 @@ uint16 Draygon_Instr_26(uint16 k, uint16 j) { // 0xA5E9B1 R24_ = 0; CreateSpriteAtPos(); QueueSfx2_Max6(0x25u); - return j; + return jp; } void sub_A5E9F5(void) { // 0xA5E9F5 @@ -1930,4 +1834,4 @@ void SporeSpawn_Func_7(uint16 a) { // 0xA5EE4A palette_buffer[(i >> 1) + 144] = g_word_A5E379[v1 >> 1]; v1 += 2; } -} +} \ No newline at end of file diff --git a/src/sm_a6.c b/src/sm_a6.c index 6b767b6..39945f1 100644 --- a/src/sm_a6.c +++ b/src/sm_a6.c @@ -5,6 +5,66 @@ #include "funcs.h" #include "enemy_types.h" + +#define g_byte_A6E269 ((uint8*)RomFixedPtr(0xa6e269)) +#define g_word_A6E2AA ((uint16*)RomFixedPtr(0xa6e2aa)) +#define g_word_A6E30A ((uint16*)RomFixedPtr(0xa6e30a)) +#define g_word_A6E46A ((uint16*)RomFixedPtr(0xa6e46a)) +#define g_off_A6A4EB ((uint16*)RomFixedPtr(0xa6a4eb)) +#define g_off_A6A743 ((uint16*)RomFixedPtr(0xa6a743)) +#define g_word_A6AE4D ((uint16*)RomFixedPtr(0xa6ae4d)) +#define g_word_A6AF2F ((uint16*)RomFixedPtr(0xa6af2f)) +#define g_word_A6B00F ((uint16*)RomFixedPtr(0xa6b00f)) +#define g_off_A6ACDA ((uint16*)RomFixedPtr(0xa6acda)) +#define g_off_A6AD45 ((uint16*)RomFixedPtr(0xa6ad45)) +#define g_word_A6B60D ((uint16*)RomFixedPtr(0xa6b60d)) +#define g_word_A6B63B ((uint16*)RomFixedPtr(0xa6b63b)) +#define g_word_A6B6C8 ((uint16*)RomFixedPtr(0xa6b6c8)) +#define g_word_A6B9D5 ((uint16*)RomFixedPtr(0xa6b9d5)) +#define g_word_A6B9DB ((uint16*)RomFixedPtr(0xa6b9db)) +#define g_off_A6B965 ((uint16*)RomFixedPtr(0xa6b965)) +#define g_off_A6B96D ((uint16*)RomFixedPtr(0xa6b96d)) +#define g_word_A6B9D5 ((uint16*)RomFixedPtr(0xa6b9d5)) +#define g_word_A6B9DB ((uint16*)RomFixedPtr(0xa6b9db)) +#define g_word_A6B94D ((uint16*)RomFixedPtr(0xa6b94d)) +#define g_word_A6B959 ((uint16*)RomFixedPtr(0xa6b959)) +#define g_word_A6BB48 ((uint16*)RomFixedPtr(0xa6bb48)) +#define g_word_A6BB4E ((uint16*)RomFixedPtr(0xa6bb4e)) +#define g_word_A6C1DF ((uint16*)RomFixedPtr(0xa6c1df)) +#define g_off_A6C7BA ((uint16*)RomFixedPtr(0xa6c7ba)) +#define g_word_A6C804 ((uint16*)RomFixedPtr(0xa6c804)) +#define g_off_A6C808 ((uint16*)RomFixedPtr(0xa6c808)) +#define g_word_A6C836 ((uint16*)RomFixedPtr(0xa6c836)) +#define g_off_A6C83A ((uint16*)RomFixedPtr(0xa6c83a)) +#define g_word_A6C868 ((uint16*)RomFixedPtr(0xa6c868)) +#define g_off_A6C86C ((uint16*)RomFixedPtr(0xa6c86c)) +#define g_word_A6C89A ((uint16*)RomFixedPtr(0xa6c89a)) +#define g_off_A6C89E ((uint16*)RomFixedPtr(0xa6c89e)) +#define g_word_A6C8CC ((uint16*)RomFixedPtr(0xa6c8cc)) +#define g_off_A6C8D0 ((uint16*)RomFixedPtr(0xa6c8d0)) +#define g_word_A6C6CE ((uint16*)RomFixedPtr(0xa6c6ce)) +#define g_off_A6C6E6 ((uint16*)RomFixedPtr(0xa6c6e6)) +#define g_word_A6CC12 ((uint16*)RomFixedPtr(0xa6cc12)) +#define g_word_A6CC18 ((uint16*)RomFixedPtr(0xa6cc18)) +#define g_off_A6DB02 ((uint16*)RomFixedPtr(0xa6db02)) +#define kRidley_Ilist_DCBA ((uint16*)RomFixedPtr(0xa6dcba)) +#define g_off_A6EFF5 ((uint16*)RomFixedPtr(0xa6eff5)) +#define g_off_A6F001 ((uint16*)RomFixedPtr(0xa6f001)) +#define g_off_A6F72B ((uint16*)RomFixedPtr(0xa6f72b)) +#define g_off_A6F52C ((uint16*)RomFixedPtr(0xa6f52c)) +#define g_word_A6F840 ((uint16*)RomFixedPtr(0xa6f840)) +#define g_off_A6F900 ((uint16*)RomFixedPtr(0xa6f900)) +#define g_word_A6FC03 ((uint16*)RomFixedPtr(0xa6fc03)) +#define g_word_A6FC0B ((uint16*)RomFixedPtr(0xa6fc0b)) +#define g_off_A6FC13 ((uint16*)RomFixedPtr(0xa6fc13)) +#define g_word_A6FC1B ((uint16*)RomFixedPtr(0xa6fc1b)) +#define g_word_A6FC23 ((uint16*)RomFixedPtr(0xa6fc23)) +#define g_word_A6FC2B ((uint16*)RomFixedPtr(0xa6fc2b)) +#define g_off_A6FD4A ((uint16*)RomFixedPtr(0xa6fd4a)) +#define g_off_A6FD54 ((uint16*)RomFixedPtr(0xa6fd54)) + + + int BabyMetroid_DBCB_DoubleRetEx(uint16 a); uint8 Ridley_Func_40_Carry(); uint8 Ridley_Func_40_Sign(); @@ -59,75 +119,14 @@ static const uint16 g_word_A695FE[4] = { 0xffe8, 0xfff4, 0x18, 0xc }; static const uint16 g_word_A69606[4] = { 0x180, 0x100, 0x100, 0x180 }; static const uint16 g_word_A69A48[8] = { 0xfe00, 0xfb00, 0xfc00, 0xfb00, 0x200, 0xfb00, 0x400, 0xfb00 }; -#define g_byte_A6E269 ((uint8*)RomPtr(0xa6e269)) -#define g_word_A6E2AA ((uint16*)RomPtr(0xa6e2aa)) -#define g_word_A6E30A ((uint16*)RomPtr(0xa6e30a)) -#define g_word_A6E46A ((uint16*)RomPtr(0xa6e46a)) -#define g_off_A6A4EB ((uint16*)RomPtr(0xa6a4eb)) -#define g_off_A6A743 ((uint16*)RomPtr(0xa6a743)) -#define g_word_A6AE4D ((uint16*)RomPtr(0xa6ae4d)) -#define g_word_A6AF2F ((uint16*)RomPtr(0xa6af2f)) -#define g_word_A6B00F ((uint16*)RomPtr(0xa6b00f)) -#define g_off_A6ACDA ((uint16*)RomPtr(0xa6acda)) -#define g_off_A6AD45 ((uint16*)RomPtr(0xa6ad45)) static const uint16 g_word_A6B288 = 8; -#define g_word_A6B60D ((uint16*)RomPtr(0xa6b60d)) -#define g_word_A6B63B ((uint16*)RomPtr(0xa6b63b)) -#define g_word_A6B6C8 ((uint16*)RomPtr(0xa6b6c8)) -#define g_word_A6B9D5 ((uint16*)RomPtr(0xa6b9d5)) -#define g_word_A6B9DB ((uint16*)RomPtr(0xa6b9db)) -#define g_off_A6B965 ((uint16*)RomPtr(0xa6b965)) -#define g_off_A6B96D ((uint16*)RomPtr(0xa6b96d)) -#define g_word_A6B9D5 ((uint16*)RomPtr(0xa6b9d5)) -#define g_word_A6B9DB ((uint16*)RomPtr(0xa6b9db)) -#define g_word_A6B94D ((uint16*)RomPtr(0xa6b94d)) -#define g_word_A6B959 ((uint16*)RomPtr(0xa6b959)) -#define g_word_A6BB48 ((uint16*)RomPtr(0xa6bb48)) -#define g_word_A6BB4E ((uint16*)RomPtr(0xa6bb4e)) static const uint16 g_word_A6BBEB[3] = { 0x40, 0, 0xd0 }; static const uint16 g_word_A6BC62[3] = { 0xb0, 0, 0x50 }; -#define g_word_A6C1DF ((uint16*)RomPtr(0xa6c1df)) static const int16 g_word_A6C66E[20] = { -24, -24, -20, 20, 16, -30, 30, -3, 14, -13, -2, 18, -2, -32, -31, 8, -4, -10, 19, 19 }; -#define g_off_A6C7BA ((uint16*)RomPtr(0xa6c7ba)) -#define g_word_A6C804 ((uint16*)RomPtr(0xa6c804)) -#define g_off_A6C808 ((uint16*)RomPtr(0xa6c808)) -#define g_word_A6C836 ((uint16*)RomPtr(0xa6c836)) -#define g_off_A6C83A ((uint16*)RomPtr(0xa6c83a)) -#define g_word_A6C868 ((uint16*)RomPtr(0xa6c868)) -#define g_off_A6C86C ((uint16*)RomPtr(0xa6c86c)) -#define g_word_A6C89A ((uint16*)RomPtr(0xa6c89a)) -#define g_off_A6C89E ((uint16*)RomPtr(0xa6c89e)) -#define g_word_A6C8CC ((uint16*)RomPtr(0xa6c8cc)) -#define g_off_A6C8D0 ((uint16*)RomPtr(0xa6c8d0)) -#define g_word_A6C6CE ((uint16*)RomPtr(0xa6c6ce)) -#define g_off_A6C6E6 ((uint16*)RomPtr(0xa6c6e6)) -#define g_word_A6CC12 ((uint16*)RomPtr(0xa6cc12)) -#define g_word_A6CC18 ((uint16*)RomPtr(0xa6cc18)) static const int16 g_word_A6CF54[3] = { 0x20, 0, -0x20 }; static const uint8 g_byte_A6D61F[16] = { 0x10, 0xf, 0xe, 0xd, 0xc, 0xb, 0xa, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; static const uint8 g_byte_A6D712[16] = { 0x10, 0xf, 0xe, 0xd, 0xc, 0xb, 0xa, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; static const uint16 g_word_A6D9ED[8] = { 0xc, 0xe, 0x10, 0x12, 0x1c, 0x20, 0x28, 0x30 }; -#define g_off_A6DB02 ((uint16*)RomPtr(0xa6db02)) -#define kRidley_Ilist_DCBA ((uint16*)RomPtr(0xa6dcba)) -#define g_off_A6EFF5 ((uint16*)RomPtr(0xa6eff5)) -#define g_off_A6F001 ((uint16*)RomPtr(0xa6f001)) -#define g_off_A6F72B ((uint16*)RomPtr(0xa6f72b)) -#define g_off_A6F52C ((uint16*)RomPtr(0xa6f52c)) -#define g_word_A6F840 ((uint16*)RomPtr(0xa6f840)) -#define g_off_A6F900 ((uint16*)RomPtr(0xa6f900)) -#define g_word_A6FC03 ((uint16*)RomPtr(0xa6fc03)) -#define g_word_A6FC0B ((uint16*)RomPtr(0xa6fc0b)) -#define g_off_A6FC13 ((uint16*)RomPtr(0xa6fc13)) -#define g_word_A6FC1B ((uint16*)RomPtr(0xa6fc1b)) -#define g_word_A6FC23 ((uint16*)RomPtr(0xa6fc23)) -#define g_word_A6FC2B ((uint16*)RomPtr(0xa6fc2b)) -#define g_off_A6FD4A ((uint16*)RomPtr(0xa6fd4a)) -#define g_off_A6FD54 ((uint16*)RomPtr(0xa6fd54)) - -uint16 EnemyInstr_Sleep_A6(uint16 k, uint16 j) { // 0xA6812F - gEnemyData(k)->current_instruction = j - 2; - return 0; -} void Enemy_GrappleReact_NoInteract_A6(void) { // 0xA68000 SwitchEnemyAiToMainAi(); @@ -149,11 +148,6 @@ void Enemy_NormalFrozenAI_A6(void) { // 0xA68041 NormalEnemyFrozenAI(); } -uint16 EnemyInstr_Goto_A6(uint16 k, uint16 j) { // 0xA680ED - return *(uint16 *)RomPtr_A6(j); -} - - void Boulder_Init(void) { // 0xA686F5 int16 boulder_parameter_2_high; @@ -496,189 +490,189 @@ uint16 SpikeyPlatform_Func_5(uint16 k) { // 0xA68CA1 return 0; } -uint16 FireGeyser_Instr_1(uint16 k, uint16 j) { // 0xA68DAF +const uint16 *FireGeyser_Instr_1(uint16 k, const uint16 *jp) { // 0xA68DAF QueueSfx2_Max6(0x61u); - return j; + return jp; } -uint16 FireGeyser_Instr_2(uint16 k, uint16 j) { // 0xA68E13 +const uint16 *FireGeyser_Instr_2(uint16 k, const uint16 *jp) { // 0xA68E13 uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DBB; Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64); E->base.y_pos = v2; E->base.y_height = g_word_A68DE7; E->base.x_width = 8; - return j; + return jp; } -uint16 FireGeyser_Instr_3(uint16 k, uint16 j) { // 0xA68E2D +const uint16 *FireGeyser_Instr_3(uint16 k, const uint16 *jp) { // 0xA68E2D uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DBD; Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64); E->base.y_pos = v2; E->base.y_height = g_word_A68DE9; - return j; + return jp; } -uint16 FireGeyser_Instr_4(uint16 k, uint16 j) { // 0xA68E41 +const uint16 *FireGeyser_Instr_4(uint16 k, const uint16 *jp) { // 0xA68E41 uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DBF; Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64); E->base.y_pos = v2; E->base.y_height = g_word_A68DEB; - return j; + return jp; } -uint16 FireGeyser_Instr_5(uint16 k, uint16 j) { // 0xA68E55 +const uint16 *FireGeyser_Instr_5(uint16 k, const uint16 *jp) { // 0xA68E55 uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DC1; Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64); E->base.y_pos = v2; E->base.y_height = g_word_A68DED; - return j; + return jp; } -uint16 FireGeyser_Instr_6(uint16 k, uint16 j) { // 0xA68E69 +const uint16 *FireGeyser_Instr_6(uint16 k, const uint16 *jp) { // 0xA68E69 uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DC3; Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64); E->base.y_pos = v2; E->base.y_height = g_word_A68DEF; - return j; + return jp; } -uint16 FireGeyser_Instr_7(uint16 k, uint16 j) { // 0xA68E7D +const uint16 *FireGeyser_Instr_7(uint16 k, const uint16 *jp) { // 0xA68E7D uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DC5; Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64); E->base.y_pos = v2; E->base.y_height = g_word_A68DF1; - return j; + return jp; } -uint16 FireGeyser_Instr_8(uint16 k, uint16 j) { // 0xA68E91 +const uint16 *FireGeyser_Instr_8(uint16 k, const uint16 *jp) { // 0xA68E91 uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DC7; Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64); E->base.y_pos = v2; E->base.y_height = g_word_A68DF3; - return j; + return jp; } -uint16 FireGeyser_Instr_9(uint16 k, uint16 j) { // 0xA68EA5 +const uint16 *FireGeyser_Instr_9(uint16 k, const uint16 *jp) { // 0xA68EA5 uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DC9; Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64); E->base.y_pos = v2; E->base.y_height = g_word_A68DF5; - return j; + return jp; } -uint16 FireGeyser_Instr_10(uint16 k, uint16 j) { // 0xA68EB9 +const uint16 *FireGeyser_Instr_10(uint16 k, const uint16 *jp) { // 0xA68EB9 uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DCB; Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64); E->base.y_pos = v2; E->base.y_height = g_word_A68DF7; - return j; + return jp; } -uint16 FireGeyser_Instr_11(uint16 k, uint16 j) { // 0xA68ECD +const uint16 *FireGeyser_Instr_11(uint16 k, const uint16 *jp) { // 0xA68ECD uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DCD; Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64); E->base.y_pos = v2; E->base.y_height = g_word_A68DF9; - return j; + return jp; } -uint16 FireGeyser_Instr_12(uint16 k, uint16 j) { // 0xA68EE1 +const uint16 *FireGeyser_Instr_12(uint16 k, const uint16 *jp) { // 0xA68EE1 uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DCF; Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64); E->base.y_pos = v2; E->base.y_height = g_word_A68DFB; - return j; + return jp; } -uint16 FireGeyser_Instr_13(uint16 k, uint16 j) { // 0xA68EF5 +const uint16 *FireGeyser_Instr_13(uint16 k, const uint16 *jp) { // 0xA68EF5 uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DD1; Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64); E->base.y_pos = v2; E->base.y_height = g_word_A68DFD; - return j; + return jp; } -uint16 FireGeyser_Instr_14(uint16 k, uint16 j) { // 0xA68F09 +const uint16 *FireGeyser_Instr_14(uint16 k, const uint16 *jp) { // 0xA68F09 uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DD3; Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64); E->base.y_pos = v2; E->base.y_height = g_word_A68DFF; - return j; + return jp; } -uint16 FireGeyser_Instr_15(uint16 k, uint16 j) { // 0xA68F1D +const uint16 *FireGeyser_Instr_15(uint16 k, const uint16 *jp) { // 0xA68F1D uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DD5; Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64); E->base.y_pos = v2; E->base.y_height = g_word_A68E01; - return j; + return jp; } -uint16 FireGeyser_Instr_16(uint16 k, uint16 j) { // 0xA68F31 +const uint16 *FireGeyser_Instr_16(uint16 k, const uint16 *jp) { // 0xA68F31 uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DD7; Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64); E->base.y_pos = v2; E->base.y_height = g_word_A68E03; - return j; + return jp; } -uint16 FireGeyser_Instr_17(uint16 k, uint16 j) { // 0xA68F45 +const uint16 *FireGeyser_Instr_17(uint16 k, const uint16 *jp) { // 0xA68F45 uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DD9; Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64); E->base.y_pos = v2; E->base.y_height = g_word_A68E05; - return j; + return jp; } -uint16 FireGeyser_Instr_18(uint16 k, uint16 j) { // 0xA68F59 +const uint16 *FireGeyser_Instr_18(uint16 k, const uint16 *jp) { // 0xA68F59 uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DDB; Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64); E->base.y_pos = v2; E->base.y_height = g_word_A68E07; - return j; + return jp; } -uint16 FireGeyser_Instr_19(uint16 k, uint16 j) { // 0xA68F6D +const uint16 *FireGeyser_Instr_19(uint16 k, const uint16 *jp) { // 0xA68F6D uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DDD; Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64); E->base.y_pos = v2; E->base.y_height = g_word_A68E09; - return j; + return jp; } -uint16 FireGeyser_Instr_20(uint16 k, uint16 j) { // 0xA68F81 +const uint16 *FireGeyser_Instr_20(uint16 k, const uint16 *jp) { // 0xA68F81 uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DDF; Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64); E->base.y_pos = v2; E->base.y_height = g_word_A68E0B; - return j; + return jp; } -uint16 FireGeyser_Instr_21(uint16 k, uint16 j) { // 0xA68F95 +const uint16 *FireGeyser_Instr_21(uint16 k, const uint16 *jp) { // 0xA68F95 uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DE1; Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64); E->base.y_pos = v2; E->base.y_height = g_word_A68E0D; - return j; + return jp; } -uint16 FireGeyser_Instr_22(uint16 k, uint16 j) { // 0xA68FA9 +const uint16 *FireGeyser_Instr_22(uint16 k, const uint16 *jp) { // 0xA68FA9 uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DE3; Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64); E->base.y_pos = v2; E->base.y_height = g_word_A68E0F; - return j; + return jp; } -uint16 FireGeyser_Instr_23(uint16 k, uint16 j) { // 0xA68FBD +const uint16 *FireGeyser_Instr_23(uint16 k, const uint16 *jp) { // 0xA68FBD uint16 v2 = Get_FireGeyser(cur_enemy_index)->fgr_var_D - g_word_A68DE5; Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index + 64); E->base.y_pos = v2; E->base.y_height = g_word_A68E11; - return j; + return jp; } -uint16 FireGeyser_Instr_24(uint16 k, uint16 j) { // 0xA68FD1 +const uint16 *FireGeyser_Instr_24(uint16 k, const uint16 *jp) { // 0xA68FD1 Enemy_FireGeyser *E = Get_FireGeyser(cur_enemy_index); E->fgr_var_C = 1; Enemy_FireGeyser *E1 = Get_FireGeyser(cur_enemy_index + 64); @@ -687,7 +681,7 @@ uint16 FireGeyser_Instr_24(uint16 k, uint16 j) { // 0xA68FD1 E->base.y_pos = E->fgr_var_D; E->base.properties |= kEnemyProps_Invisible; E1->base.properties |= 0x400u; - return j; + return jp; } void FireGeyser_Init(void) { // 0xA68FFC @@ -839,9 +833,9 @@ void NuclearWaffle_Func_1(void) { // 0xA69615 void NuclearWaffle_Func_2(void) { // 0xA69682 Enemy_NuclearWaffle *E = Get_NuclearWaffle(cur_enemy_index); draw_enemy_layer = E->nwe_var_D; - g_word_7E001E = NuclearWaffle_Func_6(E->nwe_var_21); - uint16 v8 = g_word_7E001E; - if (g_word_7E001E != E->nwe_var_33) { + R30_ = NuclearWaffle_Func_6(E->nwe_var_21); + uint16 v8 = R30_; + if (R30_ != E->nwe_var_33) { R18_ = E->base.x_pos; R20_ = E->base.y_pos; R22_ = 46; @@ -876,9 +870,9 @@ void NuclearWaffle_Func_3(void) { // 0xA69721 R36 -= E->nwe_var_2B; Enemy_NuclearWaffle *ET = Get_NuclearWaffle(cur_enemy_index + E->nwe_var_2A); uint16 nwe_var_00 = ET->nwe_var_00; - g_word_7E001E = NuclearWaffle_Func_6(R36); - uint16 v13 = g_word_7E001E; - if (g_word_7E001E != ET->nwe_var_08) { + R30_ = NuclearWaffle_Func_6(R36); + uint16 v13 = R30_; + if (R30_ != ET->nwe_var_08) { int v5 = nwe_var_00 >> 1; R18_ = enemy_projectile_x_pos[v5]; R20_ = enemy_projectile_y_pos[v5]; @@ -917,9 +911,9 @@ void NuclearWaffle_Func_4(void) { // 0xA697E9 R36 -= E->nwe_var_2B; Enemy_NuclearWaffle *ET = Get_NuclearWaffle(cur_enemy_index + E->nwe_var_2A); uint16 nwe_var_10 = ET->nwe_var_10; - g_word_7E001E = NuclearWaffle_Func_6(R36); - uint16 v13 = g_word_7E001E; - if (g_word_7E001E != ET->nwe_var_18) { + R30_ = NuclearWaffle_Func_6(R36); + uint16 v13 = R30_; + if (R30_ != ET->nwe_var_18) { R38 = E->nwe_var_34; int v5 = nwe_var_10 >> 1; R18_ = sprite_x_pos[v5]; @@ -937,10 +931,10 @@ void NuclearWaffle_Func_4(void) { // 0xA697E9 ET->nwe_var_18 = v13; uint16 v6 = NuclearWaffle_Func_5(R36); uint16 v7 = CosineMult8bit(v6); - R32 = E->nwe_var_26 + v7; + R32_ = E->nwe_var_26 + v7; uint16 v9 = NuclearWaffle_Func_5(R36); R34 = E->nwe_var_27 + SineMult8bitNegative(v9); - sprite_x_pos[nwe_var_10 >> 1] = R32; + sprite_x_pos[nwe_var_10 >> 1] = R32_; sprite_y_pos[nwe_var_10 >> 1] = R34; v12 = E->nwe_var_2A - 2; E->nwe_var_2A = v12; @@ -991,7 +985,7 @@ uint16 NuclearWaffle_Func_6(uint16 a) { // 0xA698E7 } void NuclearWaffle_Func_7(void) { // 0xA6993F - if (g_word_7E001E != 2) + if (R30_ != 2) QueueSfx2_Max6(0x5Eu); } @@ -1050,7 +1044,7 @@ void FakeKraid_Func_1(uint16 k, uint16 j) { // 0xA69ADC } } -uint16 FakeKraid_Instr_2(uint16 k, uint16 j) { // 0xA69B26 +const uint16 *FakeKraid_Instr_2(uint16 k, const uint16 *jp) { // 0xA69B26 Enemy_FakeKraid *E = Get_FakeKraid(cur_enemy_index); if (E->fkd_var_E) --E->fkd_var_E; @@ -1067,40 +1061,38 @@ LABEL_7: E->fkd_var_C = -4; if ((int16)(E->base.x_pos - samus_x_pos) < 0) E->fkd_var_C = 4; - return j; + return jp; } -uint16 FakeKraid_Instr_1(uint16 k, uint16 j) { // 0xA69B74 +const uint16 *FakeKraid_Instr_1(uint16 k, const uint16 *jp) { // 0xA69B74 Enemy_FakeKraid *E = Get_FakeKraid(cur_enemy_index); - uint16 result; if (E->fkd_var_E) { if ((E->fkd_var_C & 0x8000u) != 0) { - result = addr_stru_A699AE; if ((Get_FakeKraid(cur_enemy_index)->fkd_var_B & 0x8000u) == 0) - return addr_stru_A699C6; + return INSTR_RETURN_ADDR(addr_stru_A699C6); + return INSTR_RETURN_ADDR(addr_stru_A699AE); } else { - result = addr_stru_A699FC; if ((E->fkd_var_B & 0x8000u) != 0) - return addr_stru_A69A14; + return INSTR_RETURN_ADDR(addr_stru_A69A14); + return INSTR_RETURN_ADDR(addr_stru_A699FC); } } else { E->fkd_var_E = (random_number & 3) + 3; - result = addr_kFakeKraid_Ilist_9A2A; if ((E->fkd_var_C & 0x8000u) != 0) - return addr_kFakeKraid_Ilist_99DC; + return INSTR_RETURN_ADDR(addr_kFakeKraid_Ilist_99DC); + return INSTR_RETURN_ADDR(addr_kFakeKraid_Ilist_9A2A); } - return result; } -uint16 FakeKraid_Instr_3(uint16 k, uint16 j) { // 0xA69BB2 +const uint16 *FakeKraid_Instr_3(uint16 k, const uint16 *jp) { // 0xA69BB2 if (CheckIfEnemyIsOnScreen() == 0) QueueSfx2_Max6(0x16u); - return j; + return jp; } -uint16 FakeKraid_Instr_4(uint16 k, uint16 j) { // 0xA69BC4 +const uint16 *FakeKraid_Instr_4(uint16 k, const uint16 *jp) { // 0xA69BC4 FakeKraid_InstrHelper_45(k, 0, 0xFFFC); - return j; + return jp; } void FakeKraid_InstrHelper_45(uint16 k, uint16 j, uint16 a) { // 0xA69BCB @@ -1118,9 +1110,9 @@ void FakeKraid_InstrHelper_45(uint16 k, uint16 j, uint16 a) { // 0xA69BCB SpawnEnemyProjectileWithGfx(v8, ka, addr_kEproj_MiniKraidSpit); } -uint16 FakeKraid_Instr_5(uint16 k, uint16 j) { // 0xA69C02 +const uint16 *FakeKraid_Instr_5(uint16 k, const uint16 *jp) { // 0xA69C02 FakeKraid_InstrHelper_45(k, 8u, 4u); - return j; + return jp; } void sub_A69C0B(void) { // 0xA69C0B @@ -2039,7 +2031,7 @@ void Ridley_Func_6(void) { // 0xA6B3F8 uint16 Ridley_Func_7(void) { // 0xA6B42E static const uint16 g_word_A6B439[4] = { 4, 8, 0xa, 0xc }; - return g_word_A6B439[(uint16)(2 * Get_Ridley(0)->ridley_var_12) >> 1]; + return g_word_A6B439[Get_Ridley(0)->ridley_var_12]; } void Ridley_Func_8(void) { // 0xA6B441 @@ -2406,7 +2398,7 @@ void Ridley_Func_29(void) { // 0xA6B90F tilemap_stuff[7] = g_word_A6B94D[v3]; tilemap_stuff[6] = g_word_A6B959[v3]; E->ridley_var_C = *(uint16 *)&RomPtr_A6(R20_)[v2]; - uint8 *v4 = RomPtr_A6(R18_); + const uint8 *v4 = RomPtr_A6(R18_); uint16 t = *(uint16 *)&v4[v2]; E->ridley_var_B = sign16(E->ridley_var_B) ? -t : t; } @@ -2787,29 +2779,25 @@ void DrawBabyMetroid_0(void) { // 0xA6BF1A uint16 BabyMetroid_Instr_2(uint16 k) { // 0xA6BFC9 if (!Get_Ridley(0)->ridley_var_46 && (random_number & 1) != 0) - return BabyMetroid_Instr_4(k); + return BabyMetroid_Goto(k); QueueSfx3_Max6(0x24u); - return BabyMetroid_Incr2(k); -} - -uint16 BabyMetroid_Incr2(uint16 k) { // 0xA6BFDE return k + 2; } uint16 BabyMetroid_Instr_3(uint16 k) { // 0xA6BFE1 uint16 v1 = *(uint16 *)RomPtr_A6(k); WriteColorsToPalette(0x162, 0xa6, v1, 0xF); - return BabyMetroid_Incr2(k); + return k + 2; } uint16 BabyMetroid_Instr_1(uint16 k) { // 0xA6BFF2 if (Get_Ridley(0)->ridley_var_46) - return BabyMetroid_Instr_4(k); + return BabyMetroid_Goto(k); else - return BabyMetroid_Incr2(k); + return k + 2; } -uint16 BabyMetroid_Instr_4(uint16 k) { // 0xA6BFF8 +uint16 BabyMetroid_Goto(uint16 k) { // 0xA6BFF8 return *(uint16 *)RomPtr_A6(k); } @@ -2931,12 +2919,12 @@ void Ridley_Func_59(void) { // 0xA6C136 VramWriteEntry *v2; uint16 v0 = vram_write_queue_tail; - uint8 *v1 = RomPtr_A6(addr_byte_A6C15D); + const uint8 *v1 = RomPtr_A6(addr_byte_A6C15D); v2 = gVramWriteEntry(vram_write_queue_tail); - v2->size = *(uint16 *)v1; - *(VoidP *)((char *)&v2->src.addr + 1) = *(uint16 *)(v1 + 3); - v2->src.addr = *((uint16 *)v1 + 1); - v2->vram_dst = *(uint16 *)(v1 + 5); + v2->size = GET_WORD(v1); + *(VoidP *)((char *)&v2->src.addr + 1) = GET_WORD(v1 + 3); + v2->src.addr = GET_WORD(v1 + 2); + v2->vram_dst = GET_WORD(v1 + 5); vram_write_queue_tail = v0 + 7; } @@ -2984,14 +2972,14 @@ uint8 ProcessEscapeTimerTileTransfers(void) { // 0xA6C26E EnemyData *v0 = gEnemyData(0); uint16 ai_var_E = v0->ai_var_E; uint16 v2 = vram_write_queue_tail; - uint8 *v3 = RomPtr_A6(ai_var_E); + const uint8 *v3 = RomPtr_A6(ai_var_E); uint8 result = 1; - if (*(uint16 *)v3) { + if (GET_WORD(v3)) { v4 = gVramWriteEntry(vram_write_queue_tail); - v4->size = *(uint16 *)v3; - *(VoidP *)((char *)&v4->src.addr + 1) = *(uint16 *)(v3 + 3); - v4->src.addr = *((uint16 *)v3 + 1); - v4->vram_dst = *(uint16 *)(v3 + 5); + v4->size = GET_WORD(v3); + *(VoidP *)((char *)&v4->src.addr + 1) = GET_WORD(v3 + 3); + v4->src.addr = GET_WORD(v3 + 2); + v4->vram_dst = GET_WORD(v3 + 5); vram_write_queue_tail = v2 + 7; v0->ai_var_E = ai_var_E + 7; if (*(uint16 *)RomPtr_A6(v0->ai_var_E)) @@ -3074,14 +3062,14 @@ void Ridley_Func_62(void) { // 0xA6C383 uint16 v0 = addr_stru_A6C3B8; for (i = vram_write_queue_tail; ; i += 7) { - uint8 *v2 = RomPtr_A6(v0); - if (!*(uint16 *)v2) + const uint8 *v2 = RomPtr_A6(v0); + if (!GET_WORD(v2)) break; v3 = gVramWriteEntry(i); - v3->size = *(uint16 *)v2; - *(VoidP *)((char *)&v3->src.addr + 1) = *(uint16 *)(v2 + 3); - v3->src.addr = *((uint16 *)v2 + 1); - v3->vram_dst = *(uint16 *)(v2 + 5); + v3->size = GET_WORD(v2); + *(VoidP *)((char *)&v3->src.addr + 1) = GET_WORD(v2 + 3); + v3->src.addr = GET_WORD(v2 + 2); + v3->vram_dst = GET_WORD(v2 + 5); v0 += 7; } vram_write_queue_tail = i; @@ -3885,14 +3873,15 @@ void Ridley_Func_93(uint16 j, uint16 k) { // 0xA6D3B4 int16 v3; int16 v5; - R20_ = 126; - R18_ = j; + LongPtr r18; + r18.bank = 126; + r18.addr = j; uint16 v2 = 0; v3 = 7; do { v5 = v3; - uint16 *v4 = (uint16 *)RomPtr_A6(k); - IndirWriteWord(&R18_, v2, *v4); + const uint16 *v4 = (const uint16 *)RomPtr_A6(k); + IndirWriteWord(r18, v2, *v4); k += 2; v2 += 20; --v3; @@ -3938,8 +3927,8 @@ uint8 Ridley_Func_97(void) { // 0xA6D431 void Ridley_Func_98(void) { // 0xA6D453 uint16 enemy_ptr = Get_Ridley(cur_enemy_index)->base.enemy_ptr; - uint8 *v1 = RomPtr_A0(enemy_ptr); - uint16 v2 = SuitDamageDivision(*((uint16 *)v1 + 3)); + const uint8 *v1 = RomPtr_A0(enemy_ptr); + uint16 v2 = SuitDamageDivision(GET_WORD(v1 + 6)); Samus_DealDamage(v2); } @@ -4373,25 +4362,17 @@ void Ridley_Func_115(void) { // 0xA6D97D } void Ridley_Func_116(void) { // 0xA6D9A8 - int16 v1; - int16 v3; - char v4; // t0 - Enemy_Ridley *E = Get_Ridley(0); R18_ = abs16(E->ridley_var_B); - v1 = R18_ + abs16(E->ridley_var_C); + uint16 v1 = R18_ + abs16(E->ridley_var_C); if (v1) { uint16 v2 = v1 - R18_; if (sign16(v2 - R18_)) v2 = R18_; - v3 = (4 * v2) & 0xF00; - v4 = v3; - LOBYTE(v3) = HIBYTE(v3); - HIBYTE(v3) = v4; - uint16 v5 = 2 * v3; - if (v5 >= 0xEu) - v5 = 14; - uint16 v6 = g_word_A6D9ED[v5 >> 1]; + int v5 = (((4 * v2) & 0xF00) >> 8); + if (v5 >= 7) + v5 = 7; + uint16 v6 = g_word_A6D9ED[v5]; if ((E->ridley_var_C & 0x8000u) == 0) v6 >>= 1; E->ridley_var_08 = v6; @@ -4449,9 +4430,9 @@ void Ridley_Func_119(uint8 carry) { // 0xA6DA8B v3 = gVramWriteEntry(vram_write_queue_tail); *(VoidP *)((char *)&v3->src.addr + 1) = -20480; *(VoidP *)((char *)&v3[1].src.addr + 1) = -20480; - uint8 *v4 = RomPtr_A6(v1); - v3->src.addr = *(uint16 *)v4; - v3[1].src.addr = *((uint16 *)v4 + 1); + const uint8 *v4 = RomPtr_A6(v1); + v3->src.addr = GET_WORD(v4); + v3[1].src.addr = GET_WORD(v4 + 2); v3->vram_dst = 31424; v3[1].vram_dst = 31680; v3->size = 128; @@ -4514,95 +4495,64 @@ uint16 CallBabyMetroidInstr(uint32 ea, uint16 k) { case fnBabyMetroid_Instr_2: return BabyMetroid_Instr_2(k); case fnBabyMetroid_Instr_3: return BabyMetroid_Instr_3(k); case fnBabyMetroid_Instr_1: return BabyMetroid_Instr_1(k); - case fnBabyMetroid_Instr_4: return BabyMetroid_Instr_4(k); + case fnBabyMetroid_Instr_4: return BabyMetroid_Goto(k); default: return Unreachable(); } } + +typedef struct BabyMetroidExecState { + uint16 ip; + uint16 timer; +} BabyMetroidExecState; + int BabyMetroid_DBCB_DoubleRetEx(uint16 a) { - int16 v3; + BabyMetroidExecState *st = (BabyMetroidExecState *)&g_ram[a]; - R0_.addr = a; - R3_.addr = a + 2; - R0_.bank = 126; - R3_.bank = 126; - - uint16 *instr_ptr = (uint16 *)IndirPtr(&R0_, 0); - uint16 *timer_ptr = (uint16 *)IndirPtr(&R3_, 0); - - if ((*instr_ptr & 0x8000u) == 0) + if ((st->ip & 0x8000u) == 0) return -1; // double ret - - uint16 v2 = *instr_ptr; - v3 = *(uint16 *)RomPtr_A6(v2); - if (v3 < 0) + uint16 v2 = st->ip; + const uint16 *v3 = (uint16 *)RomPtr_A6(v2); + if (sign16(v3[0])) goto LABEL_7; - if (*timer_ptr != v3) { - (*timer_ptr)++; - return *((uint16 *)RomPtr_A6(v2) + 1); + if (st->timer != v3[0]) { + st->timer++; + return v3[1]; } v2 += 4; for (; ; ) { - v3 = *(uint16 *)RomPtr_A6(v2); - if (v3 >= 0) + v3 = (uint16 *)RomPtr_A6(v2); + if (!sign16(v3[0])) break; LABEL_7: - R6_ = v3; - v2 = CallBabyMetroidInstr((uint16)v3 | 0xA60000, v2 + 2); + v2 = CallBabyMetroidInstr(v3[0] | 0xA60000, v2 + 2); } - *timer_ptr = 1; - *instr_ptr = v2; - return *((uint16 *)RomPtr_A6(v2) + 1); + st->timer = 1; + st->ip = v2; + return v3[1]; } void sub_A6DC13(uint16 j) { // 0xA6DC13 - int16 *v5; - int16 v6; - int16 v7; - char v8; // t0 - int16 v9; - int16 v10; - OamEnt *v11; - int16 v13; - int16 v15; - - uint16 *v1 = (uint16 *)RomPtr_A6(j); - uint16 v2 = j + 2; - R24_ = *v1; - uint16 v3 = oam_next_ptr; + const uint8 *p = RomPtr_A6(j); + int n = GET_WORD(p); + p += 2; + int v3 = oam_next_ptr; do { - uint8 *v4 = RomPtr_A6(v2); - v5 = (int16 *)v4; - v6 = v4[2] << 8; - if ((v4[2] & 0x80) != 0) - v6 |= 0xFFu; - v8 = v6; - LOBYTE(v7) = HIBYTE(v6); - HIBYTE(v7) = v8; - v9 = R20_ + v7 - layer1_y_pos; + int16 v9 = R20_ + (int8)p[2] - layer1_y_pos; if (v9 >= 0 && sign16(v9 - 224)) { - R26_ = v9; - v10 = R18_ + *(uint16 *)v4 - layer1_x_pos; - v11 = gOamEnt(v3); - *(uint16 *)&v11->xcoord = v10; - if ((v10 & 0x100) != 0) { - int v12 = v3 >> 1; - R28_ = kOamExtra_Address_And_X8Large[v12]; - v13 = kOamExtra_X8Small_And_Large[v12] | *(uint16 *)RomPtr_RAM(R28_); - *(uint16 *)RomPtr_RAM(R28_) = v13; - } - if (*v5 < 0) { - int v14 = v3 >> 1; - R28_ = kOamExtra_Address_And_X8Large[v14]; - v15 = kOamExtra_X8Small_And_Large[v14 + 1] | *(uint16 *)RomPtr_RAM(R28_); - *(uint16 *)RomPtr_RAM(R28_) = v15; - } - *(uint16 *)&v11->ycoord = R26_; - *(uint16 *)&v11->charnum = R22_ | *(int16 *)((char *)v5 + 3); + uint16 v10 = R18_ + GET_WORD(p) - layer1_x_pos; + OamEnt *v11 = gOamEnt(v3); + v11->xcoord = v10; + int v12 = v3 >> 1; + if ((v10 & 0x100) != 0) + *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v12]) |= kOamExtra_X8Small_And_Large[v12]; + if (sign16(GET_WORD(p))) + *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v12]) |= kOamExtra_X8Small_And_Large[v12 + 1]; + v11->ycoord = v9; + *(uint16 *)&v11->charnum = R22_ | GET_WORD(p + 3); v3 = (v3 + 4) & 0x1FF; } - v2 += 5; - --R24_; - } while (R24_); + p += 5; + } while (--n); oam_next_ptr = v3; } @@ -4795,84 +4745,74 @@ void Ridley_Func_129(void) { // 0xA6E088 } } -uint16 Ridley_Instr_5(uint16 k, uint16 j) { // 0xA6E4BE +const uint16 *Ridley_Instr_5(uint16 k, const uint16 *jp) { // 0xA6E4BE Get_Ridley(0)->ridley_var_0F = 89; QueueSfx2_Max6(0x59u); - return j; + return jp; } -uint16 Ridley_Instr_6(uint16 k, uint16 j) { // 0xA6E4CA +const uint16 *Ridley_Instr_6(uint16 k, const uint16 *jp) { // 0xA6E4CA Get_Ridley(0)->ridley_var_0F = 0; - return j; + return jp; } -uint16 Ridley_Instr_10(uint16 k, uint16 j) { // 0xA6E4D2 +const uint16 *Ridley_Instr_10(uint16 k, const uint16 *jp) { // 0xA6E4D2 if (area_index == 2 || !sign16(samus_health - 30)) - return sub_A6E514(j); + return jp + 1; Get_Ridley(0)->ridley_var_00 = 8; - return sub_A6E4E9(j); + return INSTR_RETURN_ADDR(jp[0]); } -uint16 sub_A6E4E9(uint16 j) { // 0xA6E4E9 - return *(uint16 *)RomPtr_A6(j); -} - -uint16 Ridley_Instr_4(uint16 k, uint16 j) { // 0xA6E4EE +const uint16 *Ridley_Instr_4(uint16 k, const uint16 *jp) { // 0xA6E4EE if (Get_Ridley(0)->ridley_var_1B) - return sub_A6E4E9(j); + return INSTR_RETURN_ADDR(jp[0]); else - return sub_A6E4E9(j + 2); + return INSTR_RETURN_ADDR(jp[1]); } -uint16 Ridley_Instr_3(uint16 k, uint16 j) { // 0xA6E4F8 +const uint16 *Ridley_Instr_3(uint16 k, const uint16 *jp) { // 0xA6E4F8 if (Get_Ridley(0)->ridley_var_1B) - return j + 2; + return jp + 1; else - return sub_A6E4E9(j); + return INSTR_RETURN_ADDR(jp[0]); } -uint16 Ridley_Instr_2(uint16 k, uint16 j) { // 0xA6E501 +const uint16 *Ridley_Instr_2(uint16 k, const uint16 *jp) { // 0xA6E501 samus_prev_x_pos = samus_x_pos; samus_prev_y_pos = samus_y_pos; - uint16 v2 = *(uint16 *)RomPtr_A6(j); - Get_Ridley(0)->ridley_var_1D = v2; - return sub_A6E514(j); + Get_Ridley(0)->ridley_var_1D = jp[0]; + return jp + 1; } -uint16 sub_A6E514(uint16 j) { // 0xA6E514 - return j + 2; -} - -uint16 Ridley_Instr_1(uint16 k, uint16 j) { // 0xA6E517 +const uint16 *Ridley_Instr_1(uint16 k, const uint16 *jp) { // 0xA6E517 if (Get_Ridley(0)->ridley_var_10) - return sub_A6E4E9(j); + return INSTR_RETURN_ADDR(jp[0]); else - return sub_A6E514(j); + return jp + 1; } -uint16 Ridley_Instr_14(uint16 k, uint16 j) { // 0xA6E51F - uint8 *v2 = RomPtr_A6(j); +const uint16 *Ridley_Instr_14(uint16 k, const uint16 *jp) { // 0xA6E51F Enemy_Ridley *E = Get_Ridley(0); - E->base.x_pos += *(uint16 *)v2; - E->base.y_pos += *((uint16 *)v2 + 1); - return j + 4; + E->base.x_pos += jp[0]; + E->base.y_pos += jp[1]; + return jp + 2; } -uint16 Ridley_Instr_9(uint16 k, uint16 j) { // 0xA6E71C +const uint16 *Ridley_Instr_9(uint16 k, const uint16 *jp) { // 0xA6E71C Get_Ridley(0)->ridley_var_10 = 0; Ridley_Func_96(); - return j; + return jp; } -uint16 Ridley_Instr_7(uint16 k, uint16 j) { // 0xA6E727 +const uint16 *Ridley_Instr_7(uint16 k, const uint16 *jp) { // 0xA6E727 Get_Ridley(0)->ridley_var_10 = 1; - return j; + return jp; } -uint16 Ridley_Instr_8(uint16 k, uint16 j) { // 0xA6E72F +const uint16 *Ridley_Instr_8(uint16 k, const uint16 *jp) { // 0xA6E72F Get_Ridley(0)->ridley_var_10 = 2; Ridley_Func_96(); - return j; + return jp; } void Ridley_Func_131(uint16 k) { // 0xA6E828 @@ -4887,7 +4827,7 @@ void Ridley_Func_132(uint16 k, uint16 a) { // 0xA6E840 SpawnEnemyProjectileWithGfx(a, k, addr_stru_869634); } -uint16 Ridley_Instr_11(uint16 k, uint16 j) { // 0xA6E84D +const uint16 *Ridley_Instr_11(uint16 k, const uint16 *jp) { // 0xA6E84D Enemy_Ridley *E = Get_Ridley(0); if (E->ridley_var_10) { R18_ = E->base.x_pos + 25; @@ -4928,37 +4868,37 @@ LABEL_7: LABEL_14: E->ridley_var_19 = Math_MultBySin(0x500u); E->ridley_var_1A = Math_MultByCos(0x500u); - return j; + return jp; } -uint16 Ridley_Instr_12(uint16 k, uint16 j) { // 0xA6E904 - return Ridley_E90C(k, j, 0); +const uint16 *Ridley_Instr_12(uint16 k, const uint16 *jp) { // 0xA6E904 + return Ridley_E90C(k, jp, 0); } -uint16 Ridley_Instr_13(uint16 k, uint16 j) { // 0xA6E909 - return Ridley_E90C(k, j, 0xe); +const uint16 *Ridley_Instr_13(uint16 k, const uint16 *jp) { // 0xA6E909 + return Ridley_E90C(k, jp, 0xe); } -uint16 Ridley_E90C(uint16 k, uint16 j, uint16 a) { // 0xA6E90C +const uint16 *Ridley_E90C(uint16 k, const uint16 *jp, uint16 a) { // 0xA6E90C enemy_projectile_unk1995 = a; Enemy_Ridley *E = Get_Ridley(0); SpawnEnemyProjectileWithRoomGfx(0x9642, E->ridley_var_10); - return j; + return jp; } -uint16 Ridley_Instr_15(uint16 k, uint16 j) { // 0xA6E969 +const uint16 *Ridley_Instr_15(uint16 k, const uint16 *jp) { // 0xA6E969 Enemy_Ridley *E = Get_Ridley(0); E->ridley_var_A = FUNC16(CeresRidley_Func_9); E->ridley_var_C = -352; - return j; + return jp; } -uint16 Ridley_Instr_16(uint16 k, uint16 j) { // 0xA6E976 +const uint16 *Ridley_Instr_16(uint16 k, const uint16 *jp) { // 0xA6E976 Enemy_Ridley *E = Get_Ridley(0); E->ridley_var_A = FUNC16(Ridley_Func_3); E->ridley_var_C = -352; - return j; + return jp; } void CeresSteam_Init(void) { // 0xA6EFB1 @@ -5006,54 +4946,45 @@ void CeresSteam_Touch(void) { // 0xA6F03F NormalEnemyTouchAi(); } -uint16 CeresSteam_Instr_1(uint16 k, uint16 j) { // 0xA6F11D +const uint16 *CeresSteam_Instr_1(uint16 k, const uint16 *jp) { // 0xA6F11D Enemy_CeresSteam *E = Get_CeresSteam(k); E->base.properties |= kEnemyProps_Tangible | kEnemyProps_Invisible; - return j; + return jp; } -uint16 CeresSteam_Instr_2(uint16 k, uint16 j) { // 0xA6F127 +const uint16 *CeresSteam_Instr_2(uint16 k, const uint16 *jp) { // 0xA6F127 Enemy_CeresSteam *E = Get_CeresSteam(k); if (E->csm_var_D-- != 1) - return *(uint16 *)RomPtr_A6(j); - uint8 *v5 = RomPtr_A6(j); - return CeresSteam_Instr_3(k, *((uint16 *)v5 + 1)); + return INSTR_RETURN_ADDR(jp[0]); + return CeresSteam_Instr_3(k, (uint16 *)RomPtr_A6(jp[1])); } -uint16 CeresSteam_Instr_3(uint16 k, uint16 j) { // 0xA6F135 +const uint16 *CeresSteam_Instr_3(uint16 k, const uint16 *jp) { // 0xA6F135 Enemy_CeresSteam *E = Get_CeresSteam(k); E->base.properties &= 0xFAFFu; - return j; + return jp; } -uint16 CeresDoor_Instr_6(uint16 k, uint16 j) { // 0xA6F63E +const uint16 *CeresDoor_Instr_6(uint16 k, const uint16 *jp) { // 0xA6F63E Enemy_CeresDoor *E = Get_CeresDoor(k); if (abs16(E->base.x_pos - samus_x_pos) >= 0x30u || abs16(E->base.y_pos - samus_y_pos) >= 0x30u) - return CeresDoor_Goto(j); + return INSTR_RETURN_ADDR(*jp); else - return CeresDoor_Incr(j); + return jp + 1; } -uint16 CeresDoor_Incr(uint16 j) { // 0xA6F662 - return j + 2; -} - -uint16 CeresDoor_Goto(uint16 j) { // 0xA6F665 - return *(uint16 *)RomPtr_A6(j); -} - -uint16 CeresDoor_Instr_4(uint16 k, uint16 j) { // 0xA6F66A +const uint16 *CeresDoor_Instr_4(uint16 k, const uint16 *jp) { // 0xA6F66A if (*(uint16 *)&boss_bits_for_area[area_index] & 1) - return CeresDoor_Incr(j); + return jp + 1; else - return CeresDoor_Goto(j); + return INSTR_RETURN_ADDR(*jp); } -uint16 CeresDoor_Instr_8(uint16 k, uint16 j) { // 0xA6F678 +const uint16 *CeresDoor_Instr_8(uint16 k, const uint16 *jp) { // 0xA6F678 if (ceres_status) - return CeresDoor_Incr(j); + return jp + 1; else - return CeresDoor_Goto(j); + return INSTR_RETURN_ADDR(*jp); } void CeresDoor_Func_6b(void) { // 0xA6F67F @@ -5061,43 +4992,43 @@ void CeresDoor_Func_6b(void) { // 0xA6F67F ceres_status = FUNC16(Enemy_GrappleReact_NoInteract_A6); } -uint16 CeresSteam_Instr_4(uint16 k, uint16 j) { // 0xA6F68B +const uint16 *CeresSteam_Instr_4(uint16 k, const uint16 *jp) { // 0xA6F68B Enemy_CeresSteam *E = Get_CeresSteam(k); E->base.properties |= kEnemyProps_Tangible; - return j; + return jp; } -uint16 CeresDoor_Instr_1(uint16 k, uint16 j) { // 0xA6F695 +const uint16 *CeresDoor_Instr_1(uint16 k, const uint16 *jp) { // 0xA6F695 Enemy_CeresDoor *E = Get_CeresDoor(k); E->base.properties &= ~kEnemyProps_Tangible; - return j; + return jp; } -uint16 CeresDoor_Instr_3(uint16 k, uint16 j) { // 0xA6F69F +const uint16 *CeresDoor_Instr_3(uint16 k, const uint16 *jp) { // 0xA6F69F Get_CeresDoor(k)->cdr_var_B = 1; - return j; + return jp; } -uint16 CeresSteam_Instr_5(uint16 k, uint16 j) { // 0xA6F6A6 +const uint16 *CeresSteam_Instr_5(uint16 k, const uint16 *jp) { // 0xA6F6A6 Enemy_CeresSteam *E = Get_CeresSteam(k); E->base.properties |= kEnemyProps_Invisible; - return j; + return jp; } -uint16 CeresDoor_Instr_5(uint16 k, uint16 j) { // 0xA6F6B0 +const uint16 *CeresDoor_Instr_5(uint16 k, const uint16 *jp) { // 0xA6F6B0 Get_CeresDoor(k)->cdr_var_B = 0; - return CeresDoor_Instr_2(k, j); + return CeresDoor_Instr_2(k, jp); } -uint16 CeresDoor_Instr_2(uint16 k, uint16 j) { // 0xA6F6B3 +const uint16 *CeresDoor_Instr_2(uint16 k, const uint16 *jp) { // 0xA6F6B3 Enemy_CeresDoor *E = Get_CeresDoor(k); E->base.properties &= ~kEnemyProps_Invisible; - return j; + return jp; } -uint16 CeresDoor_Instr_7(uint16 k, uint16 j) { // 0xA6F6BD +const uint16 *CeresDoor_Instr_7(uint16 k, const uint16 *jp) { // 0xA6F6BD QueueSfx3_Max6(0x2Cu); - return j; + return jp; } void CeresDoor_Init(void) { // 0xA6F6C5 @@ -5399,4 +5330,4 @@ void Zebetites_Shot(void) { // 0xA6FDAC Enemy_Zebetites *G = Get_Zebetites(E->zebet_parameter_2); G->base.health = E->base.health; G->base.flash_timer = E->base.flash_timer; -} +} \ No newline at end of file diff --git a/src/sm_a7.c b/src/sm_a7.c index 319cc52..a82339f 100644 --- a/src/sm_a7.c +++ b/src/sm_a7.c @@ -6,12 +6,49 @@ #include "sm_rtl.h" +#define kKraid_Palette2 ((uint16*)RomFixedPtr(0xa786c7)) +#define kKraid_Palette2 ((uint16*)RomFixedPtr(0xa786c7)) +#define kKraid_BgTargetPalette3 ((uint16*)RomFixedPtr(0xa7aaa6)) +#define g_word_A7ACB3 ((uint16*)RomFixedPtr(0xa7acb3)) +#define g_off_A7ACC5 ((uint16*)RomFixedPtr(0xa7acc5)) +#define g_stru_A796D2 (*(KraidInstrList*)RomFixedPtr(0xa796d2)) +#define g_stru_A796DA (*(KraidInstrList*)RomFixedPtr(0xa796da)) +#define g_word_A7B161 ((uint16*)RomFixedPtr(0xa7b161)) +#define kKraid_BgPalette7 ((uint16*)RomFixedPtr(0xa7b3d3)) +#define kKraid_BgPalette7_KraidDeath ((uint16*)RomFixedPtr(0xa7b4f3)) +#define kKraid_SprPalette7_KraidDeath ((uint16*)RomFixedPtr(0xa7b513)) +#define g_stru_A7974A ((KraidInstrList*)RomFixedPtr(0xa7974a)) +#define g_stru_A79764 ((KraidInstrList*)RomFixedPtr(0xa79764)) +#define g_stru_A792B7 (*(Hitbox*)RomFixedPtr(0xa792b7)) +#define g_word_A7BA7D ((uint16*)RomFixedPtr(0xa7ba7d)) +#define g_word_A7BC65 ((uint16*)RomFixedPtr(0xa7bc65)) +#define kKraid_Ilist_8B0A (*(SpriteDrawInstr*)RomFixedPtr(0xa78b0a)) +#define g_off_A7BE3E ((uint16*)RomFixedPtr(0xa7be3e)) +#define g_off_A7BE46 ((uint16*)RomFixedPtr(0xa7be46)) +#define g_word_A7BF1D ((uint16*)RomFixedPtr(0xa7bf1d)) +#define kKraidSinkEntry ((KraidSinkTable*)RomFixedPtr(0xa7c5e7)) +#define g_off_A7CE8E ((uint16*)RomFixedPtr(0xa7ce8e)) +#define g_word_A7CDED ((uint16*)RomFixedPtr(0xa7cded)) +#define g_stru_A7902D ((ExtendedSpriteMap*)RomFixedPtr(0xa7902d)) +#define g_byte_A7CFC2 ((uint8*)RomFixedPtr(0xa7cfc2)) +#define g_off_A7CCFD ((uint16*)RomFixedPtr(0xa7ccfd)) +#define g_word_A7CD41 ((uint16*)RomFixedPtr(0xa7cd41)) +#define g_word_A7CD53 ((uint16*)RomFixedPtr(0xa7cd53)) +#define g_word_A7CD63 ((uint16*)RomFixedPtr(0xa7cd63)) +#define g_off_A7D40D ((uint16*)RomFixedPtr(0xa7d40d)) +#define g_word_A7CDAD ((uint16*)RomFixedPtr(0xa7cdad)) +#define g_byte_A7DA1D ((uint8*)RomFixedPtr(0xa7da1d)) +#define g_off_A7DC4A ((uint16*)RomFixedPtr(0xa7dc4a)) +#define g_off_A7F787 ((uint16*)RomFixedPtr(0xa7f787)) +#define g_off_A7F92D ((uint16*)RomFixedPtr(0xa7f92d)) +#define g_word_A7CA41 ((uint16*)RomFixedPtr(0xa7ca41)) +#define g_word_A7CA61 ((uint16*)RomFixedPtr(0xa7ca61)) +#define g_off_A7F55F ((uint16*)RomFixedPtr(0xa7f55f)) + + + + -#define kKraid_Palette2 ((uint16*)RomPtr(0xa786c7)) -#define kKraid_Palette2 ((uint16*)RomPtr(0xa786c7)) -#define kKraid_BgTargetPalette3 ((uint16*)RomPtr(0xa7aaa6)) -#define g_word_A7ACB3 ((uint16*)RomPtr(0xa7acb3)) -#define g_off_A7ACC5 ((uint16*)RomPtr(0xa7acc5)) static const uint16 g_word_A7A916 = 0x120; static const uint16 g_word_A7A918 = 0xa0; @@ -22,31 +59,7 @@ static const uint16 g_word_A7A922 = 4; static const uint16 g_word_A7A926 = 0x8000; static const uint16 g_word_A7A928 = 3; -#define g_stru_A796D2 (*(KraidInstrList*)RomPtr(0xa796d2)) -#define g_stru_A796DA (*(KraidInstrList*)RomPtr(0xa796da)) -#define g_word_A7B161 ((uint16*)RomPtr(0xa7b161)) -#define kKraid_BgPalette7 ((uint16*)RomPtr(0xa7b3d3)) -#define kKraid_BgPalette7_KraidDeath ((uint16*)RomPtr(0xa7b4f3)) -#define kKraid_SprPalette7_KraidDeath ((uint16*)RomPtr(0xa7b513)) -#define g_stru_A7974A ((KraidInstrList*)RomPtr(0xa7974a)) -#define g_stru_A79764 ((KraidInstrList*)RomPtr(0xa79764)) -#define g_stru_A792B7 (*(Hitbox*)RomPtr(0xa792b7)) -#define g_word_A7BA7D ((uint16*)RomPtr(0xa7ba7d)) -#define g_word_A7BC65 ((uint16*)RomPtr(0xa7bc65)) -#define kKraid_Ilist_8B0A (*(SpriteDrawInstr*)RomPtr(0xa78b0a)) -#define g_off_A7BE3E ((uint16*)RomPtr(0xa7be3e)) -#define g_off_A7BE46 ((uint16*)RomPtr(0xa7be46)) -#define g_word_A7BF1D ((uint16*)RomPtr(0xa7bf1d)) -#define kKraidSinkEntry ((KraidSinkTable*)RomPtr(0xa7c5e7)) -#define g_off_A7CE8E ((uint16*)RomPtr(0xa7ce8e)) -#define g_word_A7CDED ((uint16*)RomPtr(0xa7cded)) -#define g_stru_A7902D ((ExtendedSpriteMap*)RomPtr(0xa7902d)) -#define g_byte_A7CFC2 ((uint8*)RomPtr(0xa7cfc2)) -#define g_off_A7CCFD ((uint16*)RomPtr(0xa7ccfd)) -#define g_word_A7CD41 ((uint16*)RomPtr(0xa7cd41)) -#define g_word_A7CD53 ((uint16*)RomPtr(0xa7cd53)) -#define g_word_A7CD63 ((uint16*)RomPtr(0xa7cd63)) static const uint16 g_word_A7CD73 = 0x600; static const uint16 g_word_A7CD75 = 0; static const uint16 g_word_A7CD77 = 0x1000; @@ -61,16 +74,12 @@ static const uint16 g_word_A7CD87 = 0; static const uint16 g_word_A7CD89 = 0xfffe; static const uint16 g_word_A7CD8B = 0xfff9; static const uint16 g_word_A7CD8D = 0; -#define g_off_A7D40D ((uint16*)RomPtr(0xa7d40d)) static const uint16 g_word_A7CD9B = 0x40; static const uint16 g_word_A7CD9D = 0xc00; static const uint16 g_word_A7CD9F = 0x100; static const uint16 g_word_A7CDA1 = 0xf000; static const uint16 g_word_A7CDA3 = 8; static const uint8 g_byte_A7CDA5[8] = { 6, 6, 8, 8, 6, 8, 6, 8 }; -#define g_word_A7CDAD ((uint16*)RomPtr(0xa7cdad)) -#define g_byte_A7DA1D ((uint8*)RomPtr(0xa7da1d)) -#define g_off_A7DC4A ((uint16*)RomPtr(0xa7dc4a)) static const uint16 g_word_A7E900 = 0xfffd; static const uint16 g_word_A7E902 = 0; static const uint16 g_word_A7E906 = 0; @@ -90,22 +99,6 @@ static const uint16 g_word_A7F4D5 = 8; static const uint16 g_word_A7F4D7 = 0; static const uint16 g_word_A7F4D9 = 0; static const uint16 g_word_A7F4DB = 0x1000; -#define g_off_A7F787 ((uint16*)RomPtr(0xa7f787)) -#define g_off_A7F92D ((uint16*)RomPtr(0xa7f92d)) -#define g_word_A7CA41 ((uint16*)RomPtr(0xa7ca41)) -#define g_word_A7CA61 ((uint16*)RomPtr(0xa7ca61)) - -uint16 EnemyInstr_Goto_A7(uint16 k, uint16 j) { // 0xA780ED - return *(uint16 *)RomPtr_A7(j); -} - -uint16 EnemyInstr_DecTimerAndGoto2_A7(uint16 k, uint16 j) { // 0xA78110 - EnemyData *v2 = gEnemyData(k); - if (v2->timer-- == 1) - return j + 2; - else - return EnemyInstr_Goto_A7(k, j); -} void CallEnemyInstrExtFunc(uint32 ea, uint16 k) { switch (ea) { @@ -117,19 +110,9 @@ void CallEnemyInstrExtFunc(uint32 ea, uint16 k) { } } -uint16 EnemyInstr_Call_A7(uint16 k, uint16 j) { // 0xA7808A - R18_ = *(uint16 *)RomPtr_A7(j); - CallEnemyInstrExtFunc(R18_ | 0xA70000, k); - return j + 2; -} -uint16 EnemyInstr_SetTimer_A7(uint16 k, uint16 j) { // 0xA78123 - uint16 v2 = *(uint16 *)RomPtr_A7(j); - gEnemyData(k)->timer = v2; - return j + 2; -} -uint16 EnemyInstr_Sleep_A7(uint16 k, uint16 j) { // 0xA7812F - gEnemyData(k)->current_instruction = j - 2; - return 0; +const uint16 *EnemyInstr_Call_A7(uint16 k, const uint16 *jp) { // 0xA7808A + CallEnemyInstrExtFunc(jp[0] | 0xA70000, k); + return jp + 1; } @@ -153,14 +136,14 @@ void Enemy_NormalFrozenAI_A7(void) { // 0xA78041 NormalEnemyFrozenAI(); } -uint16 Kraid_Instr_9(uint16 k, uint16 j) { // 0xA78A8F +const uint16 *Kraid_Instr_9(uint16 k, const uint16 *jp) { // 0xA78A8F Enemy_Kraid *E = Get_Kraid(0); if ((int16)(E->base.health - E->kraid_healths_8ths[3]) < 0) { Enemy_Kraid *E1 = Get_Kraid(0x40u); if (sign16(E1->base.current_instruction + 0x75BF)) - return addr_kKraid_Ilist_8A41; + return INSTR_RETURN_ADDR(addr_kKraid_Ilist_8A41); } - return j; + return jp; } void Kraid_Touch_ArmFoot(void) { // 0xA7948B @@ -281,14 +264,8 @@ void Kraid_Init(void) { // 0xA7A959 } void Kraid_SetupGfxWithTilePrioClear(void) { // 0xA7AAC6 - decompress_src.addr = addr_byte_B9FA38; - decompress_src.bank = -71; - decompress_dst.addr = 0x4000; - DecompressToMem(); - decompress_src.addr = addr_byte_B9FE3E; - decompress_src.bank = -71; - decompress_dst.addr = 0x2000; - DecompressToMem(); + DecompressToMem(0xB9FA38, g_ram + 0x4000); + DecompressToMem(0xB9FE3E, g_ram + 0x2000); Enemy_Kraid *E = Get_Kraid(0); E->kraid_hurt_frame = 0; E->kraid_hurt_frame_timer = 0; @@ -690,7 +667,7 @@ uint16 Kraid_ExecuteInstr(void) { // 0xA7AF3D Enemy_Kraid *E = Get_Kraid(0); RESTART:; uint16 kraid_var_B = E->kraid_var_B; - uint16 *v2 = (uint16 *)RomPtr_A7(kraid_var_B); + const uint16 *v2 = (const uint16 *)RomPtr_A7(kraid_var_B); uint16 result = *v2; if (*v2 != 0xFFFF) { if ((int16)(*v2 + 1) < 0) { @@ -730,20 +707,20 @@ void Kraid_Shot_Mouth(void) { // 0xA7AFAA Enemy_Kraid *E = Get_Kraid(0); if (!sign16(E->kraid_var_A + 0x3AC9)) return; - uint8 *v2 = RomPtr_A7(E->kraid_var_B - 8); - if (*((uint16 *)v2 + 3) == 0xFFFF) { + const uint8 *v2 = RomPtr_A7(E->kraid_var_B - 8); + if (GET_WORD(v2 + 6) == 0xFFFF) { v3 = 0; goto LABEL_14; } uint16 v4; - v4 = *((uint16 *)v2 + 3); + v4 = GET_WORD(v2 + 6); E->kraid_var_E = 1; v3 = 0; - uint8 *v5; + const uint8 *v5; v5 = RomPtr_A7(v4); - R22_ = E->base.x_pos + *(uint16 *)v5; - R20_ = E->base.y_pos + *((uint16 *)v5 + 1); - R18_ = E->base.y_pos + *((uint16 *)v5 + 3); + R22_ = E->base.x_pos + GET_WORD(v5); + R20_ = E->base.y_pos + GET_WORD(v5 + 2); + R18_ = E->base.y_pos + GET_WORD(v5 + 6); if (projectile_counter) { uint16 v6 = 2 * projectile_counter; while (1) { @@ -848,11 +825,11 @@ void Kraid_Shot_Body(void) { // 0xA7B181 E->kraid_var_E = 0; E->kraid_mouth_flags &= ~1u; R48 = 0; - uint8 *v2 = RomPtr_A7(E->kraid_var_B - 8); - uint8 *v3 = RomPtr_A7(*((uint16 *)v2 + 2)); - R22_ = E->base.x_pos + *(uint16 *)v3; - R20_ = E->base.y_pos + *((uint16 *)v3 + 1); - R18_ = E->base.y_pos + *((uint16 *)v3 + 3); + const uint8 *v2 = RomPtr_A7(E->kraid_var_B - 8); + const uint8 *v3 = RomPtr_A7(GET_WORD(v2 + 4)); + R22_ = E->base.x_pos + GET_WORD(v3); + R20_ = E->base.y_pos + GET_WORD(v3 + 2); + R18_ = E->base.y_pos + GET_WORD(v3 + 6); if (projectile_counter) { for (int i = 2 * projectile_counter; i >= 0; i -= 2) { int v5 = i >> 1; @@ -885,7 +862,7 @@ LABEL_7: } } if (R48) { - if (E->kraid_var_A == (uint16)FUNC16(Kraid_Mainloop_Thinking)) { + if (E->kraid_var_A == FUNC16(Kraid_Mainloop_Thinking)) { E->kraid_var_A = FUNC16(Kraid_InitEyeGlowing); uint16 kraid_mouth_flags = E->kraid_mouth_flags; if ((kraid_mouth_flags & 1) != 0) @@ -951,48 +928,48 @@ void Kraid_HealthBasedPaletteHandling(void) { // 0xA7B394 } while ((int16)(v4 - 32) < 0); } -uint16 Kraid_Instr_1(uint16 k, uint16 j) { // 0xA7B633 - return j; +const uint16 *Kraid_Instr_1(uint16 k, const uint16 *jp) { // 0xA7B633 + return jp; } -uint16 Kraid_Instr_DecYpos(uint16 k, uint16 j) { // 0xA7B636 +const uint16 *Kraid_Instr_DecYpos(uint16 k, const uint16 *jp) { // 0xA7B636 Enemy_Kraid *E = Get_Kraid(0); --E->base.y_pos; - return j; + return jp; } -uint16 Kraid_Instr_IncrYpos_Shake(uint16 k, uint16 j) { // 0xA7B63C +const uint16 *Kraid_Instr_IncrYpos_Shake(uint16 k, const uint16 *jp) { // 0xA7B63C Enemy_Kraid *E = Get_Kraid(0); ++E->base.y_pos; earthquake_type = 1; earthquake_timer = 10; - return j; + return jp; } -uint16 Kraid_Instr_PlaySound_0x76(uint16 k, uint16 j) { // 0xA7B64E +const uint16 *Kraid_Instr_PlaySound_0x76(uint16 k, const uint16 *jp) { // 0xA7B64E QueueSfx2_Max6(0x76u); - return j; + return jp; } -uint16 Kraid_Instr_XposMinus3(uint16 k, uint16 j) { // 0xA7B65A +const uint16 *Kraid_Instr_XposMinus3(uint16 k, const uint16 *jp) { // 0xA7B65A Enemy_Kraid *E = Get_Kraid(0); E->base.x_pos -= g_word_A7A91C; - return j; + return jp; } -uint16 Kraid_Instr_XposMinus3b(uint16 k, uint16 j) { // 0xA7B667 +const uint16 *Kraid_Instr_XposMinus3b(uint16 k, const uint16 *jp) { // 0xA7B667 Enemy_Kraid *E = Get_Kraid(0); E->base.x_pos -= g_word_A7A91C; - return j; + return jp; } -uint16 Kraid_Instr_XposPlus3(uint16 k, uint16 j) { // 0xA7B674 +const uint16 *Kraid_Instr_XposPlus3(uint16 k, const uint16 *jp) { // 0xA7B674 Enemy_Kraid *E = Get_Kraid(0); E->base.x_pos += g_word_A7A920; - return j; + return jp; } -uint16 Kraid_Instr_MoveHimRight(uint16 k, uint16 j) { // 0xA7B683 +const uint16 *Kraid_Instr_MoveHimRight(uint16 k, const uint16 *jp) { // 0xA7B683 uint16 v3; Enemy_Kraid *E = Get_Kraid(0); @@ -1006,7 +983,7 @@ uint16 Kraid_Instr_MoveHimRight(uint16 k, uint16 j) { // 0xA7B683 Get_Kraid(0x140u)->base.x_pos = x_pos; } } - return j; + return jp; } void Kraid_InitEyeGlowing(void) { // 0xA7B6BF @@ -1283,7 +1260,7 @@ void KraidsFoot_SecondPhase_Thinking(void) { // 0xA7BA2E v4 = random_number & 0x1C; if (!sign16(v4 - 16)) v4 = 16; - uint16 *v5 = (uint16 *)RomPtr_A7(g_word_A7BA7D[(v2 >> 1) + 1] + v4); + const uint16 *v5 = (const uint16 *)RomPtr_A7(g_word_A7BA7D[(v2 >> 1) + 1] + v4); uint16 v6 = v5[1]; if ((int16)(*v5 - E0->base.x_pos) >= 0) Kraid_SetWalkingBackwards(v6, *v5); @@ -1386,7 +1363,7 @@ void Kraid_Main_AttackWithMouthOpen(void) { // 0xA7BBEA E->kraid_mouth_flags = 0; } } else { - if (*((uint16 *)RomPtr_A7(E->kraid_var_B - 8) + 1) == (uint16)addr_kKraidTilemaps_3 + if (*((uint16 *)RomPtr_A7(E->kraid_var_B - 8) + 1) == addr_kKraidTilemaps_3 && (E->kraid_var_C & 0xF) == 0) { SpawnEnemyProjectileWithGfx( g_word_A7BC65[(uint8)(random_number & 0xE) >> 1], @@ -1464,12 +1441,12 @@ void KraidsFingernail_Init(void) { // 0xA7BD60 v2 = g_off_A7BE3E[(uint8)(random_number & 6) >> 1]; else v2 = g_off_A7BE46[(uint8)(random_number & 6) >> 1]; - uint8 *v3 = RomPtr_A7(v2); + const uint8 *v3 = RomPtr_A7(v2); Enemy_Kraid *E = Get_Kraid(cur_enemy_index); - E->kraid_var_B = *(uint16 *)v3; - E->kraid_var_C = *((uint16 *)v3 + 1); - E->kraid_var_D = *((uint16 *)v3 + 2); - E->kraid_var_E = *((uint16 *)v3 + 3); + E->kraid_var_B = GET_WORD(v3); + E->kraid_var_C = GET_WORD(v3 + 2); + E->kraid_var_D = GET_WORD(v3 + 4); + E->kraid_var_E = GET_WORD(v3 + 6); E->kraid_parameter_1 = 1; E->base.properties &= ~(kEnemyProps_Tangible | kEnemyProps_Invisible); E->base.instruction_timer = 1; @@ -1597,11 +1574,11 @@ void Kraid_HandleFirstPhase(void) { // 0xA7C005 E0->kraid_next = FUNC16(Kraid_GetsBig_ReleaseCamera); uint16 v2 = *((uint16 *)RomPtr_A7(E0->kraid_var_B) + 1); uint16 v3 = 50; - if (v2 != (uint16)addr_kKraidTilemaps_0) { + if (v2 != addr_kKraidTilemaps_0) { v3 = 42; - if (v2 != (uint16)addr_kKraidTilemaps_1) { + if (v2 != addr_kKraidTilemaps_1) { v3 = 34; - if (v2 != (uint16)addr_kKraidTilemaps_2) + if (v2 != addr_kKraidTilemaps_2) v3 = 26; } } @@ -2247,8 +2224,6 @@ void Phantoon_Func_2(uint16 k) { // 0xA7CF0C } uint8 Phantoon_Func_3(void) { // 0xA7CF27 - char v2; // t1 - Enemy_Phantoon *E = Get_Phantoon(0xC0u); if (E->phant_var_E) { uint16 phant_var_D = E->phant_var_D; @@ -2259,13 +2234,10 @@ uint8 Phantoon_Func_3(void) { // 0xA7CF27 return 1; } } else { - R22_ = (uint8)((uint16)(R20_ & 0xFF00) >> 8); + R22_ = (R20_ & 0xFF00) >> 8; uint16 v1 = R18_ + E->phant_var_D; E->phant_var_D = v1; - v1 &= 0xFF00u; - v2 = v1; - LOBYTE(v1) = HIBYTE(v1); - HIBYTE(v1) = v2; + v1 = (v1 & 0xFF00) >> 8; if (!sign16(v1 - R22_)) E->phant_var_D = R20_; } @@ -2482,7 +2454,7 @@ void Phantoon_MoveInFigure8_LeftSideClockwise(uint16 j) { // 0xA7D215 Enemy_Phantoon *E = Get_Phantoon(0); for (R22_ = E->phant_var_C; R22_; --R22_) { R18_ = 2 * E->phant_var_A; - uint8 *v2 = RomPtr_A7(R18_ + j); + const uint8 *v2 = RomPtr_A7(R18_ + j); uint16 v3 = (int8)v2[0]; R18_ = v3; E->base.x_pos += v3; @@ -2505,7 +2477,7 @@ void Phantoon_MoveInFigure8_RightSideClockwise(uint16 j) { // 0xA7D271 if (!v2) { do { R18_ = 2 * E->phant_var_A; - uint8 *v4 = RomPtr_A7(R18_ + j); + const uint8 *v4 = RomPtr_A7(R18_ + j); uint16 v5 = (int8)*v4; R18_ = v5; E->base.x_pos -= v5; @@ -2580,7 +2552,7 @@ void Phantoon_MoveInSwoopingPattern(uint16 k) { // 0xA7D2D1 } else if (!sign16(v12 - 448)) { v7->base.x_pos = 448; } - if (Get_Phantoon(k)->phant_var_F == (uint16)FUNC16(Phantoon_CompleteSwoopAfterFatalShot)) + if (Get_Phantoon(k)->phant_var_F == FUNC16(Phantoon_CompleteSwoopAfterFatalShot)) v13 = 112; else v13 = samus_y_pos - 48; @@ -2626,8 +2598,8 @@ void Phantoon_StartDeathSequence(uint16 k) { // 0xA7D421 int16 v3; Enemy_Phantoon *E = Get_Phantoon(k); - if (E->phant_var_F == (uint16)FUNC16(Phantoon_IsSwooping) - || E->phant_var_F == (uint16)FUNC16(Phantoon_FadeoutWithSwoop)) { + if (E->phant_var_F == FUNC16(Phantoon_IsSwooping) + || E->phant_var_F == FUNC16(Phantoon_FadeoutWithSwoop)) { E->phant_var_F = FUNC16(Phantoon_CompleteSwoopAfterFatalShot); } else { E->phant_var_F = FUNC16(Phantoon_DyingPhantoonFadeInOut); @@ -3245,7 +3217,7 @@ PairU16 Phantoon_SetColorBasedOnHp_FindEntry(uint16 k) { // 0xA7DC0F R20_ += R18_; ++R22_; } while (sign16(R22_ - 7)); - uint16 *v1 = (uint16 *)RomPtr_A7(R24_ + g_off_A7DC4A[R22_]); + const uint16 *v1 = (const uint16 *)RomPtr_A7(R24_ + g_off_A7DC4A[R22_]); return MakePairU16(R24_, *v1); } @@ -3267,26 +3239,13 @@ uint8 Phantoon_Func_9(void) { // 0xA7DC5A } uint16 Phantoon_Func_10_CalculateNthTransitionColorFromXtoY(uint16 a, uint16 k, uint16 j) { // 0xA7DC95 - int16 v3; - char v4; // t0 - int16 v8; - - uint16 v7 = Phantoon_CalculateNthTransitionColorComponentFromXtoY(a, k & 0x1F, j & 0x1F); - v8 = v7 | (32 * Phantoon_CalculateNthTransitionColorComponentFromXtoY(a, (k >> 5) & 0x1F, (j >> 5) & 0x1F)); - v3 = 4 - * Phantoon_CalculateNthTransitionColorComponentFromXtoY( - a, - ((uint16)(k >> 2) >> 8) & 0x1F, - ((uint16)(j >> 2) >> 8) & 0x1F); - v4 = v3; - LOBYTE(v3) = HIBYTE(v3); - HIBYTE(v3) = v4; - return v8 | v3; + return Phantoon_CalculateNthTransitionColorComponentFromXtoY(a, k & 0x1F, j & 0x1F) + + (Phantoon_CalculateNthTransitionColorComponentFromXtoY(a, (k >> 5) & 0x1F, (j >> 5) & 0x1F) << 5) + + (Phantoon_CalculateNthTransitionColorComponentFromXtoY(a, (k >> 10) & 0x1F, (j >> 10) & 0x1F) << 10); } uint16 Phantoon_CalculateNthTransitionColorComponentFromXtoY(uint16 a, uint16 k, uint16 j) { // 0xA7DCF1 int16 v4; - int16 v9; if (!a) return k; @@ -3299,9 +3258,7 @@ uint16 Phantoon_CalculateNthTransitionColorComponentFromXtoY(uint16 a, uint16 k, uint8 v6 = abs16(R18_); uint16 RegWord = SnesDivide(v6 << 8, LOBYTE(E->phant_var_D) - R20_ + 1); R18_ = sign16(R18_) ? -RegWord : RegWord; - LOBYTE(v9) = HIBYTE(k); - HIBYTE(v9) = k; - return (uint16)(R18_ + v9) >> 8; + return (uint16)(R18_ + swap16(k)) >> 8; } void Phantoon_Hurt(void) { // 0xA7DD3F @@ -3356,9 +3313,9 @@ void Phantoon_Shot(void) { // 0xA7DD9B if ((EK->base.ai_handler_bits & 2) != 0) { QueueSfx2_Max6(0x73u); uint16 phanto_var_F = EK->phant_var_F; - if (phanto_var_F != (uint16)FUNC16(Phantoon_EyeFollowsSamusUntilTimerRunsOut) - && phanto_var_F != (uint16)FUNC16(Phantoon_FollowSamusWithEyeDuringFireballRain)) { - if (phanto_var_F != (uint16)FUNC16(Phantoon_IsSwooping)) { + if (phanto_var_F != FUNC16(Phantoon_EyeFollowsSamusUntilTimerRunsOut) + && phanto_var_F != FUNC16(Phantoon_FollowSamusWithEyeDuringFireballRain)) { + if (phanto_var_F != FUNC16(Phantoon_IsSwooping)) { LABEL_20: Get_Phantoon(0x80)->phant_parameter_2 = 2; return; @@ -3855,19 +3812,15 @@ void Dachora_Main(void) { // 0xA7F52E Enemy_Dachora *E = Get_Dachora(cur_enemy_index); CallEnemyPreInstr(E->dachor_var_F | 0xA70000); } -#define g_off_A7F55F ((uint16*)RomPtr(0xa7f55f)) void Dachora_Func_1(uint16 j, uint16 k) { // 0xA7F535 - uint16 v3; - *(VoidP *)((char *)&R0_.addr + 1) = 32256; Enemy_Dachora *E = Get_Dachora(k); - LOBYTE(v3) = HIBYTE(E->base.palette_index); - HIBYTE(v3) = E->base.palette_index; + uint16 v3 = swap16(E->base.palette_index); R0_.addr = g_off_A7F55F[v3 >> 1]; uint16 v5 = 0; do { - uint16 *v6 = (uint16 *)RomPtr_A7(j); - IndirWriteWord(&R0_, v5, *v6); + const uint16 *v6 = (const uint16 *)RomPtr_A7(j); + IndirWriteWord(R0_, v5, *v6); j += 2; v5 += 2; } while ((int16)(v5 - 32) < 0); @@ -3960,7 +3913,7 @@ void Dachora_Func_6(uint16 k) { // 0xA7F6D5 uint16 v2 = E->dachor_var_E - 1; E->dachor_var_E = v2; if (!(uint8)v2) { - Dachora_Func_1(g_off_A7F787[(uint16)(2 * HIBYTE(E->dachor_var_E)) >> 1], k); + Dachora_Func_1(g_off_A7F787[HIBYTE(E->dachor_var_E)], k); uint16 v3 = E->dachor_var_E + 272; E->dachor_var_E = v3; if (!sign16(v3 - 1040)) @@ -4114,7 +4067,7 @@ void Dachora_Func_9(uint16 k) { // 0xA7F89A void Dachora_Func_10(uint16 k) { // 0xA7F90A Enemy_Dachora *E = Get_Dachora(k); - Dachora_Func_1(g_off_A7F92D[(uint16)(2 * HIBYTE(E->dachor_var_E)) >> 1], k); + Dachora_Func_1(g_off_A7F92D[HIBYTE(E->dachor_var_E)], k); uint16 v2 = E->dachor_var_E + 256; E->dachor_var_E = v2; if (!sign16(v2 - 1024)) @@ -4164,4 +4117,4 @@ LABEL_6: return; } E->base.properties &= ~kEnemyProps_Invisible; -} +} \ No newline at end of file diff --git a/src/sm_a8.c b/src/sm_a8.c index b73e323..38ceeac 100644 --- a/src/sm_a8.c +++ b/src/sm_a8.c @@ -6,9 +6,38 @@ #include "funcs.h" #include "enemy_types.h" + +#define g_off_A890DA ((uint16*)RomFixedPtr(0xa890da)) +#define g_word_A8A0A7 (*(uint16*)RomFixedPtr(0xa8a0a7)) +#define g_word_A8A0A9 (*(uint16*)RomFixedPtr(0xa8a0a9)) +#define g_word_A8A0AB (*(uint16*)RomFixedPtr(0xa8a0ab)) +#define g_word_A8A0AD (*(uint16*)RomFixedPtr(0xa8a0ad)) +#define g_word_A8A0B3 (*(uint16*)RomFixedPtr(0xa8a0b3)) +#define g_word_A8A0B5 (*(uint16*)RomFixedPtr(0xa8a0b5)) +#define g_word_A8A0B7 (*(uint16*)RomFixedPtr(0xa8a0b7)) +#define g_word_A8A0B9 (*(uint16*)RomFixedPtr(0xa8a0b9)) +#define g_word_A8A0BB (*(uint16*)RomFixedPtr(0xa8a0bb)) +#define g_word_A8A0BD (*(uint16*)RomFixedPtr(0xa8a0bd)) +#define g_word_A8A0C3 (*(uint16*)RomFixedPtr(0xa8a0c3)) +#define g_word_A8A0C5 (*(uint16*)RomFixedPtr(0xa8a0c5)) +#define g_off_A8A097 ((uint16*)RomFixedPtr(0xa8a097)) +#define kNorfairLavaMan_Palette ((uint16*)RomFixedPtr(0xa8ac1c)) +#define g_word_A8AF79 ((uint16*)RomFixedPtr(0xa8af79)) +#define g_word_A8AF55 ((uint16*)RomFixedPtr(0xa8af55)) +#define g_off_A8AF67 ((uint16*)RomFixedPtr(0xa8af67)) +#define kBeetom_Ilist_B74E ((uint16*)RomFixedPtr(0xa8b74e)) +#define g_off_A8C599 ((uint16*)RomFixedPtr(0xa8c599)) +#define g_off_A8CC30 ((uint16*)RomFixedPtr(0xa8cc30)) +#define g_off_A8E380 ((uint16*)RomFixedPtr(0xa8e380)) +#define g_off_A8E682 ((uint16*)RomFixedPtr(0xa8e682)) +#define g_off_A8E688 ((uint16*)RomFixedPtr(0xa8e688)) +#define g_word_A8E7CC ((uint16*)RomFixedPtr(0xa8e7cc)) +#define g_off_A8F3B0 ((uint16*)RomFixedPtr(0xa8f3b0)) + + + static const int16 g_word_A890CA[4] = { -8, 8, 0, 0 }; static const int16 g_word_A890D2[4] = { 0, 0, -8, 8 }; -#define g_off_A890DA ((uint16*)RomPtr(0xa890da)) static const uint16 g_word_A89050 = 0x80; static const uint16 g_word_A89052 = 0xb0; static const uint16 g_word_A89054 = 0x80; @@ -26,26 +55,8 @@ static const uint16 kWreckedShipGhost_Palette[16] = { 0x3800, 0x57ff, 0x42f7, 0x static const uint16 g_word_A89D32 = 1; static const uint16 g_word_A89D34 = 1; -#define g_word_A8A0A7 (*(uint16*)RomPtr(0xa8a0a7)) -#define g_word_A8A0A9 (*(uint16*)RomPtr(0xa8a0a9)) -#define g_word_A8A0AB (*(uint16*)RomPtr(0xa8a0ab)) -#define g_word_A8A0AD (*(uint16*)RomPtr(0xa8a0ad)) -#define g_word_A8A0B3 (*(uint16*)RomPtr(0xa8a0b3)) -#define g_word_A8A0B5 (*(uint16*)RomPtr(0xa8a0b5)) -#define g_word_A8A0B7 (*(uint16*)RomPtr(0xa8a0b7)) -#define g_word_A8A0B9 (*(uint16*)RomPtr(0xa8a0b9)) -#define g_word_A8A0BB (*(uint16*)RomPtr(0xa8a0bb)) -#define g_word_A8A0BD (*(uint16*)RomPtr(0xa8a0bd)) -#define g_word_A8A0C3 (*(uint16*)RomPtr(0xa8a0c3)) -#define g_word_A8A0C5 (*(uint16*)RomPtr(0xa8a0c5)) -#define g_off_A8A097 ((uint16*)RomPtr(0xa8a097)) -#define kNorfairLavaMan_Palette ((uint16*)RomPtr(0xa8ac1c)) -#define g_word_A8AF79 ((uint16*)RomPtr(0xa8af79)) -#define g_word_A8AF55 ((uint16*)RomPtr(0xa8af55)) -#define g_off_A8AF67 ((uint16*)RomPtr(0xa8af67)) -#define kBeetom_Ilist_B74E ((uint16*)RomPtr(0xa8b74e)) static const int16 g_word_A8C277[3] = { -12, -16, -20 }; static const int16 g_word_A8C27D[3] = { -20, -16, -12 }; static const uint16 g_word_A8C19F = 0x40; @@ -59,8 +70,6 @@ static const uint16 g_word_A8C1C3 = 0; static const uint16 g_word_A8C1C5 = 0xffff; static const uint16 g_word_A8C1C7 = 0x8000; -#define g_off_A8C599 ((uint16*)RomPtr(0xa8c599)) -#define g_off_A8CC30 ((uint16*)RomPtr(0xa8cc30)) static const int16 g_word_A8CCC1[31] = { 0x1f, 0x18, 0xf, 8, 0x40, 0x18, 0xf, 8, 0x1f, 0x10, @@ -88,48 +97,11 @@ static const int16 g_word_A8D895[26] = { }; static const uint16 g_word_A8DCC7 = 0x50; static const uint16 g_word_A8DCCB = 0x70; -#define g_off_A8E380 ((uint16*)RomPtr(0xa8e380)) -#define g_off_A8E682 ((uint16*)RomPtr(0xa8e682)) -#define g_off_A8E688 ((uint16*)RomPtr(0xa8e688)) -#define g_word_A8E7CC ((uint16*)RomPtr(0xa8e7cc)) -#define g_off_A8F3B0 ((uint16*)RomPtr(0xa8f3b0)) static const uint16 g_word_A8F180 = 0x60; static const uint16 g_word_A8F182 = 0xe000; static const uint16 g_word_A8F184 = 0; static const uint8 g_byte_A8F186 = 0x30; -uint16 EnemyInstr_DisableOffScreenProcessing_A8(uint16 k, uint16 j) { // 0xA8817D - EnemyData *v2 = gEnemyData(k); - v2->properties &= ~kEnemyProps_ProcessedOffscreen; - return j; -} -uint16 EnemyInstr_EnableOffScreenProcessing_A8(uint16 k, uint16 j) { // 0xA88173 - EnemyData *v2 = gEnemyData(k); - v2->properties |= kEnemyProps_ProcessedOffscreen; - return j; -} -uint16 EnemyInstr_SetTimer_A8(uint16 k, uint16 j) { // 0xA88123 - uint16 v2 = *(uint16 *)RomPtr_A8(j); - gEnemyData(k)->timer = v2; - return j + 2; -} -uint16 EnemyInstr_Sleep_A8(uint16 k, uint16 j) { // 0xA8812F - gEnemyData(k)->current_instruction = j - 2; - return 0; -} - -uint16 EnemyInstr_Goto_A8(uint16 k, uint16 j) { // 0xA880ED - return *(uint16 *)RomPtr_A8(j); -} - -uint16 EnemyInstr_DecTimerAndGoto2_A8(uint16 k, uint16 j) { // 0xA88110 - EnemyData *v2 = gEnemyData(k); - if (v2->timer-- == 1) - return j + 2; - else - return EnemyInstr_Goto_A8(k, j); -} - void Enemy_GrappleReact_NoInteract_A8(void) { // 0xA88000 SwitchEnemyAiToMainAi(); } @@ -166,35 +138,35 @@ void Enemy_NormalFrozenAI_A8(void) { // 0xA88041 NormalEnemyFrozenAI(); } -uint16 MiniDraygon_Instr_2(uint16 k, uint16 j) { // 0xA8878F +const uint16 *MiniDraygon_Instr_2(uint16 k, const uint16 *jp) { // 0xA8878F QueueSfx2_Max6(0x5Eu); - return j; + return jp; } -uint16 MiniDraygon_Instr_1(uint16 k, uint16 j) { // 0xA8879B - if (gEnemySpawnData(cur_enemy_index)[30].cause_of_death == (uint16)addr_kMiniDraygon_Ilist_870B) +const uint16 *MiniDraygon_Instr_1(uint16 k, const uint16 *jp) { // 0xA8879B + if (gEnemySpawnData(cur_enemy_index)[30].cause_of_death == addr_kMiniDraygon_Ilist_870B) Get_MiniDraygon(cur_enemy_index)->mdn_var_F = -8; else Get_MiniDraygon(cur_enemy_index)->mdn_var_F = 8; - return j; + return jp; } -uint16 MiniDraygon_Instr_3(uint16 k, uint16 j) { // 0xA887B6 +const uint16 *MiniDraygon_Instr_3(uint16 k, const uint16 *jp) { // 0xA887B6 Enemy_MiniDraygon *E = Get_MiniDraygon(cur_enemy_index); - if (gEnemySpawnData(cur_enemy_index)[30].cause_of_death == (uint16)addr_kMiniDraygon_Ilist_870B) { + if (gEnemySpawnData(cur_enemy_index)[30].cause_of_death == addr_kMiniDraygon_Ilist_870B) { ++E->mdn_var_F; } else { --E->mdn_var_F; } - return j; + return jp; } -uint16 MiniDraygon_Instr_4(uint16 k, uint16 j) { // 0xA887CB +const uint16 *MiniDraygon_Instr_4(uint16 k, const uint16 *jp) { // 0xA887CB Enemy_MiniDraygon *E = Get_MiniDraygon(cur_enemy_index); E->mdn_var_0C = 0; E->mdn_var_0B = 0; E->mdn_var_C = FUNC16(MiniDraygon_Func_8); - return j; + return jp; } void MiniDraygon_Init(void) { // 0xA887E0 @@ -448,7 +420,7 @@ void MiniDraygon_Func_13(void) { // 0xA88B16 if (frozen_timer) { E1->base.frozen_timer = frozen_timer; E1->base.ai_handler_bits |= 4u; - if (E2->mdn_var_C != (uint16)FUNC16(MiniDraygon_Func_9)) { + if (E2->mdn_var_C != FUNC16(MiniDraygon_Func_9)) { E2->base.ai_handler_bits |= 4u; E2->base.frozen_timer = E->base.frozen_timer; } @@ -541,51 +513,51 @@ void MorphBallEye_Func_4(uint16 k) { // 0xA891CE E->mbee_var_F = FUNC16(MorphBallEye_Func_1); } -uint16 Fune_Instr_2(uint16 k, uint16 j) { // 0xA89625 +const uint16 *Fune_Instr_2(uint16 k, const uint16 *jp) { // 0xA89625 QueueSfx2_Max9(0x1Fu); - return j; + return jp; } -uint16 Fune_Instr_6(uint16 k, uint16 j) { // 0xA89631 +const uint16 *Fune_Instr_6(uint16 k, const uint16 *jp) { // 0xA89631 enemy_projectile_unk1995 = LOBYTE(Get_Fune(cur_enemy_index)->fune_parameter_2); SpawnEnemyProjectileWithGfx(0, cur_enemy_index, addr_stru_86DFBC); - return j; + return jp; } -uint16 Fune_Instr_7(uint16 k, uint16 j) { // 0xA8964A +const uint16 *Fune_Instr_7(uint16 k, const uint16 *jp) { // 0xA8964A enemy_projectile_unk1995 = LOBYTE(Get_Fune(cur_enemy_index)->fune_parameter_2); SpawnEnemyProjectileWithGfx(1u, cur_enemy_index, addr_stru_86DFBC); - return j; + return jp; } -uint16 Fune_Instr_1(uint16 k, uint16 j) { // 0xA89663 +const uint16 *Fune_Instr_1(uint16 k, const uint16 *jp) { // 0xA89663 enemy_projectile_unk1995 = LOBYTE(Get_Fune(cur_enemy_index)->fune_parameter_2); SpawnEnemyProjectileWithGfx(0, cur_enemy_index, addr_stru_86DFCA); - return j; + return jp; } -uint16 Fune_Instr_4(uint16 k, uint16 j) { // 0xA8967C +const uint16 *Fune_Instr_4(uint16 k, const uint16 *jp) { // 0xA8967C enemy_projectile_unk1995 = LOBYTE(Get_Fune(cur_enemy_index)->fune_parameter_2); SpawnEnemyProjectileWithGfx(1u, cur_enemy_index, addr_stru_86DFCA); - return j; + return jp; } -uint16 Fune_Instr_3(uint16 k, uint16 j) { // 0xA89695 +const uint16 *Fune_Instr_3(uint16 k, const uint16 *jp) { // 0xA89695 Enemy_Fune *E = Get_Fune(cur_enemy_index); E->fune_var_A += 4; E->fune_var_B = FUNC16(Fune_Func_1); if (E->fune_var_D) E->fune_var_B = FUNC16(Fune_Func_2); - return j; + return jp; } -uint16 Fune_Instr_5(uint16 k, uint16 j) { // 0xA896B4 +const uint16 *Fune_Instr_5(uint16 k, const uint16 *jp) { // 0xA896B4 Enemy_Fune *E = Get_Fune(cur_enemy_index); E->fune_var_A += 4; E->fune_var_B = FUNC16(Fune_Func_1); if (E->fune_var_D) E->fune_var_B = FUNC16(Fune_Func_2); - return j; + return jp; } void Fune_Init(void) { // 0xA896E3 @@ -661,8 +633,6 @@ void Fune_Func_4(void) { // 0xA8979B } void WreckedShipGhost_Init(void) { // 0xA89AEE - int16 v2; - Enemy_WreckedShipGhost *E = Get_WreckedShipGhost(cur_enemy_index); E->base.properties |= kEnemyProps_DisableSamusColl | kEnemyProps_Tangible | kEnemyProps_Invisible; E->base.instruction_timer = 1; @@ -671,15 +641,13 @@ void WreckedShipGhost_Init(void) { // 0xA89AEE E->wsgt_var_A = FUNC16(WreckedShipGhost_Func_6); E->wsgt_var_B = g_word_A89AA4 + 160; - LOBYTE(v2) = HIBYTE(E->base.palette_index); - HIBYTE(v2) = E->base.palette_index; + uint16 v2 = swap16(E->base.palette_index); uint16 v3 = 16 * v2 + 256; - R18_ = 16; + int n = 16; do { target_palettes[v3 >> 1] = 0; v3 += 2; - --R18_; - } while ((R18_ & 0x8000u) == 0); + } while (--n >= 0); } void CallWreckedShipGhost(uint32 ea, uint16 k) { @@ -700,17 +668,11 @@ void WreckedShipGhost_Main(void) { // 0xA89B3C } void WreckedShipGhost_Func_1(uint16 k) { // 0xA89B42 - int16 v1; - int16 v3; - int16 v7; - WreckedShipGhost_Func_3(k); - v1 = 16; Enemy_WreckedShipGhost *E = Get_WreckedShipGhost(cur_enemy_index); - LOBYTE(v3) = HIBYTE(E->base.palette_index); - HIBYTE(v3) = E->base.palette_index; + uint16 v3 = swap16(E->base.palette_index); uint16 v4 = 16 * v3 + 256; - R18_ = 16; + int n = 16, v1 = 0; do { int v5 = v4 >> 1; if (sign16((palette_buffer[v5] & 0x1F) - 31)) { @@ -718,12 +680,10 @@ void WreckedShipGhost_Func_1(uint16 k) { // 0xA89B42 --v1; } v4 += 2; - --R18_; - } while (R18_); + } while (--n); if ((int16)(v1 - 16) >= 0) { E->wsgt_var_A = FUNC16(WreckedShipGhost_Func_2); - LOBYTE(v7) = HIBYTE(E->base.palette_index); - HIBYTE(v7) = E->base.palette_index; + uint16 v7 = swap16(E->base.palette_index); uint16 v8 = 16 * v7 + 256; uint16 v9 = 0; do { @@ -799,8 +759,6 @@ void WreckedShipGhost_Func_4(uint16 k) { // 0xA89C69 } void WreckedShipGhost_Func_5(uint16 k) { // 0xA89C8A - int16 v8; - Enemy_WreckedShipGhost *E = Get_WreckedShipGhost(k); uint16 y_subpos = E->base.y_subpos; bool v3 = __CFADD__uint16(E->wsgt_var_01, y_subpos); @@ -823,15 +781,15 @@ void WreckedShipGhost_Func_5(uint16 k) { // 0xA89C8A if (!v6) { E->wsgt_var_A = FUNC16(WreckedShipGhost_Func_4); E->base.properties |= kEnemyProps_Tangible; - LOBYTE(v8) = HIBYTE(E->base.palette_index); - HIBYTE(v8) = E->base.palette_index; - uint16 v9 = 16 * v8 + 256; - R18_ = 16; + + int t = E->base.palette_index * 256; + uint16 v9 = 16 * t + 256; + int n = 16; do { target_palettes[v9 >> 1] = 0x7FFF; v9 += 2; - --R18_; - } while ((R18_ & 0x8000u) == 0); + n--; + } while ((n & 0x8000u) == 0); } } @@ -916,7 +874,6 @@ LABEL_13: } uint16 WreckedShipGhost_Func_8(void) { // 0xA89E88 - int16 v2; int16 v5; int16 v7; int16 v9; @@ -924,8 +881,7 @@ uint16 WreckedShipGhost_Func_8(void) { // 0xA89E88 uint16 v0 = 0; if (!door_transition_flag_enemies) { Enemy_WreckedShipGhost *E = Get_WreckedShipGhost(cur_enemy_index); - LOBYTE(v2) = HIBYTE(E->base.palette_index); - HIBYTE(v2) = E->base.palette_index; + uint16 v2 = swap16(E->base.palette_index); uint16 v3 = 16 * v2 + 256; R20_ = 16 * v2 + 288; do { @@ -974,52 +930,52 @@ uint16 WreckedShipGhost_Func_8(void) { // 0xA89E88 return v0; } -uint16 YappingMaw_Instr_2(uint16 k, uint16 j) { // 0xA8A0C7 +const uint16 *YappingMaw_Instr_2(uint16 k, const uint16 *jp) { // 0xA8A0C7 Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); E->ymw_var_32 = g_word_A8A0AB; E->ymw_var_33 = g_word_A8A0AD; - return j; + return jp; } -uint16 YappingMaw_Instr_4(uint16 k, uint16 j) { // 0xA8A0D9 +const uint16 *YappingMaw_Instr_4(uint16 k, const uint16 *jp) { // 0xA8A0D9 Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); E->ymw_var_32 = g_word_A8A0C3; E->ymw_var_33 = g_word_A8A0C5; - return j; + return jp; } -uint16 YappingMaw_Instr_5(uint16 k, uint16 j) { // 0xA8A0EB +const uint16 *YappingMaw_Instr_5(uint16 k, const uint16 *jp) { // 0xA8A0EB Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); E->ymw_var_32 = g_word_A8A0B3; E->ymw_var_33 = g_word_A8A0B5; - return j; + return jp; } -uint16 YappingMaw_Instr_7(uint16 k, uint16 j) { // 0xA8A0FD +const uint16 *YappingMaw_Instr_7(uint16 k, const uint16 *jp) { // 0xA8A0FD Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); E->ymw_var_32 = g_word_A8A0BB; E->ymw_var_33 = g_word_A8A0BD; - return j; + return jp; } -uint16 YappingMaw_Instr_3(uint16 k, uint16 j) { // 0xA8A10F +const uint16 *YappingMaw_Instr_3(uint16 k, const uint16 *jp) { // 0xA8A10F Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); E->ymw_var_32 = g_word_A8A0A7; E->ymw_var_33 = g_word_A8A0A9; - return j; + return jp; } -uint16 YappingMaw_Instr_6(uint16 k, uint16 j) { // 0xA8A121 +const uint16 *YappingMaw_Instr_6(uint16 k, const uint16 *jp) { // 0xA8A121 Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); E->ymw_var_32 = g_word_A8A0B7; E->ymw_var_33 = g_word_A8A0B9; - return j; + return jp; } -uint16 YappingMaw_Instr_1(uint16 k, uint16 j) { // 0xA8A133 +const uint16 *YappingMaw_Instr_1(uint16 k, const uint16 *jp) { // 0xA8A133 if (!Get_YappingMaw(cur_enemy_index)->ymw_var_36) QueueSfx2_Max6(0x2Fu); - return j; + return jp; } void YappingMaw_Init(void) { // 0xA8A148 @@ -1346,7 +1302,7 @@ void YappingMaw_Func_11(void) { // 0xA8A68A Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); if (E->ymw_var_30) YappingMaw_Func_10(); - if ((--E->ymw_var_E & 0x8000u) != 0 && samus_input_handler != (uint16)FUNC16(Samus_InputHandler_E91D)) { + if ((--E->ymw_var_E & 0x8000u) != 0 && samus_input_handler != FUNC16(Samus_InputHandler_E91D)) { samus_input_handler = FUNC16(Samus_InputHandler_E913); E->ymw_var_30 = 0; E->ymw_var_35 = 48; @@ -1393,7 +1349,7 @@ uint16 YappingMaw_Func_17(uint16 a) { // 0xA8A742 R18_ = a; R20_ = 0; R22_ = 0; - v1 = kSine16bit[(uint16)(2 * (uint8)-(int8)a) >> 1]; + v1 = kSine16bit[(uint8)-(int8)a]; if (v1 < 0) { v1 = -v1; ++R20_; @@ -1422,7 +1378,7 @@ void YappingMaw_Shot(void) { // 0xA8A7BD Enemy_YappingMaw *E = Get_YappingMaw(cur_enemy_index); if (E->base.health) { if (E->base.frozen_timer) { - if (samus_input_handler != (uint16)FUNC16(Samus_InputHandler_E91D)) + if (samus_input_handler != FUNC16(Samus_InputHandler_E91D)) samus_input_handler = FUNC16(Samus_InputHandler_E913); E->ymw_var_30 = 0; } @@ -1432,7 +1388,7 @@ void YappingMaw_Shot(void) { // 0xA8A7BD *(uint16 *)((char *)enemy_projectile_id + E->ymw_var_42) = 0; *(uint16 *)((char *)enemy_projectile_id + E->ymw_var_43) = 0; sprite_instr_list_ptrs[E->ymw_var_46 >> 1] = 0; - if (samus_input_handler != (uint16)FUNC16(Samus_InputHandler_E91D)) + if (samus_input_handler != FUNC16(Samus_InputHandler_E91D)) samus_input_handler = FUNC16(Samus_InputHandler_E913); Get_YappingMaw(cur_enemy_index)->ymw_var_30 = 0; } @@ -1527,55 +1483,54 @@ void Kago_Shot(void) { // 0xA8AB83 SpawnEnemyProjectileWithGfx(E->base.y_pos, cur_enemy_index, addr_loc_A8D02E); } -uint16 NorfairLavaMan_Instr_1(uint16 k, uint16 j) { // 0xA8AE12 +const uint16 *NorfairLavaMan_Instr_1(uint16 k, const uint16 *jp) { // 0xA8AE12 if (!CheckIfEnemyIsOnScreen()) { - uint16 *v2 = (uint16 *)RomPtr_A8(j); - QueueSfx2_Max6(*v2); + QueueSfx2_Max6(jp[0]); } - return j + 2; + return jp + 1; } -uint16 NorfairLavaMan_Instr_8(uint16 k, uint16 j) { // 0xA8AE26 +const uint16 *NorfairLavaMan_Instr_8(uint16 k, const uint16 *jp) { // 0xA8AE26 Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); ++E->base.y_pos; ++E->base.y_pos; - return j; + return jp; } -uint16 NorfairLavaMan_Instr_14(uint16 k, uint16 j) { // 0xA8AE30 +const uint16 *NorfairLavaMan_Instr_14(uint16 k, const uint16 *jp) { // 0xA8AE30 Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); --E->base.y_pos; --E->base.y_pos; - return j; + return jp; } -uint16 NorfairLavaMan_Instr_2(uint16 k, uint16 j) { // 0xA8AE3A +const uint16 *NorfairLavaMan_Instr_2(uint16 k, const uint16 *jp) { // 0xA8AE3A Get_NorfairLavaMan(cur_enemy_index)->nlmn_var_01 = 1; - return j; + return jp; } -uint16 NorfairLavaMan_Instr_7(uint16 k, uint16 j) { // 0xA8AE45 +const uint16 *NorfairLavaMan_Instr_7(uint16 k, const uint16 *jp) { // 0xA8AE45 Get_NorfairLavaMan(cur_enemy_index)->nlmn_var_01 = 0; - return j; + return jp; } -uint16 NorfairLavaMan_Instr_10(uint16 k, uint16 j) { // 0xA8AE50 +const uint16 *NorfairLavaMan_Instr_10(uint16 k, const uint16 *jp) { // 0xA8AE50 Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); --E->base.y_pos; Enemy_NorfairLavaMan *E1 = Get_NorfairLavaMan(cur_enemy_index + 64); --E1->base.y_pos; - return j; + return jp; } -uint16 NorfairLavaMan_Instr_12(uint16 k, uint16 j) { // 0xA8AE5A +const uint16 *NorfairLavaMan_Instr_12(uint16 k, const uint16 *jp) { // 0xA8AE5A Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); ++E->base.y_pos; Enemy_NorfairLavaMan *E1 = Get_NorfairLavaMan(cur_enemy_index + 64); ++E1->base.y_pos; - return j; + return jp; } -uint16 NorfairLavaMan_Instr_9(uint16 k, uint16 j) { // 0xA8AE64 +const uint16 *NorfairLavaMan_Instr_9(uint16 k, const uint16 *jp) { // 0xA8AE64 Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); uint16 v4 = E->nlmn_var_03 + 24; E->base.y_pos = v4; @@ -1584,18 +1539,18 @@ uint16 NorfairLavaMan_Instr_9(uint16 k, uint16 j) { // 0xA8AE64 E1->base.properties &= ~0x100u; Enemy_NorfairLavaMan *E2 = Get_NorfairLavaMan(cur_enemy_index + 128); E2->base.properties &= ~0x100u; - return j; + return jp; } -uint16 NorfairLavaMan_Instr_11(uint16 k, uint16 j) { // 0xA8AE88 +const uint16 *NorfairLavaMan_Instr_11(uint16 k, const uint16 *jp) { // 0xA8AE88 Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); uint16 nlmn_var_03 = E->nlmn_var_03; E->base.y_pos = nlmn_var_03; Get_NorfairLavaMan(cur_enemy_index + 64)->base.y_pos = nlmn_var_03; - return j; + return jp; } -uint16 NorfairLavaMan_Instr_13(uint16 k, uint16 j) { // 0xA8AE96 +const uint16 *NorfairLavaMan_Instr_13(uint16 k, const uint16 *jp) { // 0xA8AE96 Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); uint16 v4 = E->nlmn_var_03 + 4; E->base.y_pos = v4; @@ -1604,41 +1559,41 @@ uint16 NorfairLavaMan_Instr_13(uint16 k, uint16 j) { // 0xA8AE96 E1->base.properties |= 0x100u; Enemy_NorfairLavaMan *E2 = Get_NorfairLavaMan(cur_enemy_index + 128); E2->base.properties |= 0x100u; - return j; + return jp; } -uint16 NorfairLavaMan_Instr_5(uint16 k, uint16 j) { // 0xA8AEBA +const uint16 *NorfairLavaMan_Instr_5(uint16 k, const uint16 *jp) { // 0xA8AEBA Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); SpawnEnemyProjectileWithGfx(E->nlmn_var_B, cur_enemy_index, addr_kEproj_LavaThrownByLavaman); - return j; + return jp; } -uint16 NorfairLavaMan_Instr_15(uint16 k, uint16 j) { // 0xA8AECA +const uint16 *NorfairLavaMan_Instr_15(uint16 k, const uint16 *jp) { // 0xA8AECA Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); E->base.x_pos = E->nlmn_var_12 + 8; E->base.y_pos = E->nlmn_var_13 - 4; - return j; + return jp; } -uint16 NorfairLavaMan_Instr_4(uint16 k, uint16 j) { // 0xA8AEE4 +const uint16 *NorfairLavaMan_Instr_4(uint16 k, const uint16 *jp) { // 0xA8AEE4 Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); E->base.x_pos = E->nlmn_var_12 - 8; E->base.y_pos = E->nlmn_var_13 - 4; - return j; + return jp; } -uint16 NorfairLavaMan_Instr_16(uint16 k, uint16 j) { // 0xA8AEFE +const uint16 *NorfairLavaMan_Instr_16(uint16 k, const uint16 *jp) { // 0xA8AEFE Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); E->base.x_pos = E->nlmn_var_12 + 8; E->base.y_pos = E->nlmn_var_13 - 8; - return j; + return jp; } -uint16 NorfairLavaMan_Instr_6(uint16 k, uint16 j) { // 0xA8AF18 +const uint16 *NorfairLavaMan_Instr_6(uint16 k, const uint16 *jp) { // 0xA8AF18 Enemy_NorfairLavaMan *E = Get_NorfairLavaMan(cur_enemy_index); E->base.x_pos = E->nlmn_var_12 - 8; E->base.y_pos = E->nlmn_var_13 - 4; - return j; + return jp; } void sub_A8AF32(void) { // 0xA8AF32 @@ -1647,9 +1602,9 @@ void sub_A8AF32(void) { // 0xA8AF32 E->base.y_pos = E->nlmn_var_13; } -uint16 NorfairLavaMan_Instr_3(uint16 k, uint16 j) { // 0xA8AF44 +const uint16 *NorfairLavaMan_Instr_3(uint16 k, const uint16 *jp) { // 0xA8AF44 Get_NorfairLavaMan(cur_enemy_index)->nlmn_var_04 = 256; - return j; + return jp; } static Func_V *const g_off_A8AF4F[3] = { NorfairLavaMan_Func_1, NorfairLavaMan_Func_2, NorfairLavaMan_Func_3 }; void NorfairLavaMan_Init(void) { // 0xA8AF8B @@ -1888,7 +1843,7 @@ void NorfairLavaMan_Func_14(uint16 k) { // 0xA8B2C5 } void NorfairLavaMan_Func_15(uint16 k) { // 0xA8B30D - if (enemy_drawing_queue[(cur_enemy_index >> 1) + 87] == (uint16)FUNC16(NorfairLavaMan_Func_8)) + if (enemy_drawing_queue[(cur_enemy_index >> 1) + 87] == FUNC16(NorfairLavaMan_Func_8)) Get_NorfairLavaMan(cur_enemy_index)->nlmn_var_F = FUNC16(NorfairLavaMan_Func_17); } @@ -1928,7 +1883,7 @@ void NorfairLavaMan_Func_17(uint16 k) { // 0xA8B356 void NorfairLavaMan_Func_18(uint16 k) { // 0xA8B3A7 int v1 = cur_enemy_index >> 1; - if (enemy_drawing_queue[v1 + 87] == (uint16)FUNC16(NorfairLavaMan_Func_7)) + if (enemy_drawing_queue[v1 + 87] == FUNC16(NorfairLavaMan_Func_7)) Get_NorfairLavaMan(cur_enemy_index)->nlmn_var_F = FUNC16(NorfairLavaMan_Func_15); else Get_NorfairLavaMan(cur_enemy_index)->base.y_pos = enemy_drawing_queue[v1 + 93] @@ -1987,8 +1942,8 @@ void NorfairLavaMan_Common(void) { // 0xA8B410 } } -uint16 Beetom_Instr_1(uint16 k, uint16 j) { // 0xA8B75E - return j; +const uint16 *Beetom_Instr_1(uint16 k, const uint16 *jp) { // 0xA8B75E + return jp; } void Beetom_Func_1(void) { // 0xA8B762 @@ -2544,8 +2499,8 @@ void Beetom_Shot(void) { // 0xA8BEAC Enemy_NormalShotAI_A8(); Enemy_Beetom *E = Get_Beetom(cur_enemy_index); if (E->base.frozen_timer - && (E->beetom_var_C == (uint16)FUNC16(Beetom_Func_33) - || E->beetom_var_C == (uint16)FUNC16(Beetom_Func_32))) { + && (E->beetom_var_C == FUNC16(Beetom_Func_33) + || E->beetom_var_C == FUNC16(Beetom_Func_32))) { E->beetom_var_C = FUNC16(Beetom_Func_15); } E->beetom_var_08 = 0; @@ -2851,7 +2806,8 @@ void MaridiaFloater_Func_13(uint16 k) { // 0xA8C59F enemy_drawing_queue[v4 + 100] = 0; enemy_drawing_queue[v4 + 97] |= 0x200u; MaridiaFloater_Func_1(k); - printf("A undefined!\n"); v5 = 0; + //printf("A undefined!\n"); + v5 = 0; EnemyDeathAnimation(k, v5); } else { MaridiaFloater_Func_2(k); @@ -2992,7 +2948,7 @@ void WreckedShipRobot_Func_2(uint16 k) { // 0xA8CCFF E->wsrt_var_B = wsrt_var_B - 1; } -uint16 WreckedShipRobot_Instr_4(uint16 k, uint16 j) { // 0xA8CD09 +const uint16 *WreckedShipRobot_Instr_4(uint16 k, const uint16 *jp) { // 0xA8CD09 WreckedShipRobot_Func_2(cur_enemy_index); Enemy_WreckedShipRobot *E = Get_WreckedShipRobot(cur_enemy_index); E->wsrt_var_A = -512; @@ -3000,7 +2956,7 @@ uint16 WreckedShipRobot_Instr_4(uint16 k, uint16 j) { // 0xA8CD09 R20_ = -4; if (Enemy_MoveRight_IgnoreSlopes(cur_enemy_index) & 1) { E->wsrt_var_B += 8; - return addr_kWreckedShipRobot_Ilist_C73F; + return INSTR_RETURN_ADDR(addr_kWreckedShipRobot_Ilist_C73F); } else { if (CheckIfEnemyTouchesSamus(cur_enemy_index)) { extra_samus_x_subdisplacement = 0; @@ -3020,13 +2976,13 @@ uint16 WreckedShipRobot_Instr_4(uint16 k, uint16 j) { // 0xA8CD09 E->base.x_pos = E->wsrt_var_C; E->base.y_pos = E->wsrt_var_D; E->wsrt_var_A = 512; - return addr_kWreckedShipRobot_Ilist_CB65; + return INSTR_RETURN_ADDR(addr_kWreckedShipRobot_Ilist_CB65); } } - return j; + return jp; } -uint16 WreckedShipRobot_Instr_9(uint16 k, uint16 j) { // 0xA8CDA4 +const uint16 *WreckedShipRobot_Instr_9(uint16 k, const uint16 *jp) { // 0xA8CDA4 WreckedShipRobot_Func_2(cur_enemy_index); Enemy_WreckedShipRobot *E = Get_WreckedShipRobot(cur_enemy_index); E->wsrt_var_A = -512; @@ -3034,15 +2990,15 @@ uint16 WreckedShipRobot_Instr_9(uint16 k, uint16 j) { // 0xA8CDA4 R20_ = -4; if (Enemy_MoveRight_IgnoreSlopes(cur_enemy_index) & 1) { E->wsrt_var_B += 8; - return addr_kWreckedShipRobot_Ilist_C73F; + return INSTR_RETURN_ADDR(addr_kWreckedShipRobot_Ilist_C73F); } else if (CheckIfEnemyTouchesSamus(cur_enemy_index)) { extra_samus_x_subdisplacement = 0; extra_samus_x_displacement = -4; } - return j; + return jp; } -uint16 WreckedShipRobot_Instr_6(uint16 k, uint16 j) { // 0xA8CDEA +const uint16 *WreckedShipRobot_Instr_6(uint16 k, const uint16 *jp) { // 0xA8CDEA WreckedShipRobot_Func_2(cur_enemy_index); Enemy_WreckedShipRobot *E = Get_WreckedShipRobot(cur_enemy_index); E->wsrt_var_A = -512; @@ -3050,7 +3006,7 @@ uint16 WreckedShipRobot_Instr_6(uint16 k, uint16 j) { // 0xA8CDEA R20_ = 4; if (Enemy_MoveRight_IgnoreSlopes(cur_enemy_index) & 1) { E->wsrt_var_B += 8; - return addr_stru_A8C6E9; + return INSTR_RETURN_ADDR(addr_stru_A8C6E9); } else { if (CheckIfEnemyTouchesSamus(cur_enemy_index)) { extra_samus_x_subdisplacement = 0; @@ -3070,13 +3026,13 @@ uint16 WreckedShipRobot_Instr_6(uint16 k, uint16 j) { // 0xA8CDEA E->base.x_pos = E->wsrt_var_C; E->base.y_pos = E->wsrt_var_D; E->wsrt_var_A = -512; - return addr_kWreckedShipRobot_Ilist_C91B; + return INSTR_RETURN_ADDR(addr_kWreckedShipRobot_Ilist_C91B); } } - return j; + return jp; } -uint16 WreckedShipRobot_Instr_8(uint16 k, uint16 j) { // 0xA8CE85 +const uint16 *WreckedShipRobot_Instr_8(uint16 k, const uint16 *jp) { // 0xA8CE85 WreckedShipRobot_Func_2(cur_enemy_index); Enemy_WreckedShipRobot *E = Get_WreckedShipRobot(cur_enemy_index); E->wsrt_var_A = -512; @@ -3084,19 +3040,19 @@ uint16 WreckedShipRobot_Instr_8(uint16 k, uint16 j) { // 0xA8CE85 R20_ = 4; if (Enemy_MoveRight_IgnoreSlopes(cur_enemy_index) & 1) { E->wsrt_var_B += 8; - return addr_stru_A8C6E9; + return INSTR_RETURN_ADDR(addr_stru_A8C6E9); } else if (CheckIfEnemyTouchesSamus(cur_enemy_index)) { extra_samus_x_subdisplacement = 0; extra_samus_x_displacement = 4; } - return j; + return jp; } -uint16 WreckedShipRobot_Instr_7(uint16 k, uint16 j) { // 0xA8CECB - return addr_kWreckedShipRobot_Ilist_C92D; +const uint16 *WreckedShipRobot_Instr_7(uint16 k, const uint16 *jp) { // 0xA8CECB + return INSTR_RETURN_ADDR(addr_kWreckedShipRobot_Ilist_C92D); } -uint16 WreckedShipRobot_Instr_15(uint16 k, uint16 j) { // 0xA8CECF +const uint16 *WreckedShipRobot_Instr_15(uint16 k, const uint16 *jp) { // 0xA8CECF WreckedShipRobot_Func_2(cur_enemy_index); Enemy_WreckedShipRobot *E = Get_WreckedShipRobot(cur_enemy_index); E->wsrt_var_A = 512; @@ -3104,7 +3060,7 @@ uint16 WreckedShipRobot_Instr_15(uint16 k, uint16 j) { // 0xA8CECF R20_ = 4; if (Enemy_MoveRight_IgnoreSlopes(cur_enemy_index) & 1) { E->wsrt_var_B += 8; - return addr_kWreckedShipRobot_Ilist_C985; + return INSTR_RETURN_ADDR(addr_kWreckedShipRobot_Ilist_C985); } else { if (CheckIfEnemyTouchesSamus(cur_enemy_index)) { extra_samus_x_subdisplacement = 0; @@ -3124,13 +3080,13 @@ uint16 WreckedShipRobot_Instr_15(uint16 k, uint16 j) { // 0xA8CECF E->base.x_pos = E->wsrt_var_C; E->base.y_pos = E->wsrt_var_D; E->wsrt_var_A = -512; - return addr_kWreckedShipRobot_Ilist_C91B; + return INSTR_RETURN_ADDR(addr_kWreckedShipRobot_Ilist_C91B); } } - return j; + return jp; } -uint16 WreckedShipRobot_Instr_18(uint16 k, uint16 j) { // 0xA8CF6A +const uint16 *WreckedShipRobot_Instr_18(uint16 k, const uint16 *jp) { // 0xA8CF6A WreckedShipRobot_Func_2(cur_enemy_index); Enemy_WreckedShipRobot *E = Get_WreckedShipRobot(cur_enemy_index); E->wsrt_var_A = 512; @@ -3138,15 +3094,15 @@ uint16 WreckedShipRobot_Instr_18(uint16 k, uint16 j) { // 0xA8CF6A R20_ = 4; if (Enemy_MoveRight_IgnoreSlopes(cur_enemy_index) & 1) { E->wsrt_var_B += 8; - return addr_kWreckedShipRobot_Ilist_C985; + return INSTR_RETURN_ADDR(addr_kWreckedShipRobot_Ilist_C985); } else if (CheckIfEnemyTouchesSamus(cur_enemy_index)) { extra_samus_x_subdisplacement = 0; extra_samus_x_displacement = 4; } - return j; + return jp; } -uint16 WreckedShipRobot_Instr_16(uint16 k, uint16 j) { // 0xA8CFB0 +const uint16 *WreckedShipRobot_Instr_16(uint16 k, const uint16 *jp) { // 0xA8CFB0 WreckedShipRobot_Func_2(cur_enemy_index); Enemy_WreckedShipRobot *E = Get_WreckedShipRobot(cur_enemy_index); E->wsrt_var_A = 512; @@ -3154,7 +3110,7 @@ uint16 WreckedShipRobot_Instr_16(uint16 k, uint16 j) { // 0xA8CFB0 R20_ = -4; if (Enemy_MoveRight_IgnoreSlopes(cur_enemy_index) & 1) { E->wsrt_var_B += 8; - return addr_stru_A8C6E9; + return INSTR_RETURN_ADDR(addr_stru_A8C6E9); } else { if (CheckIfEnemyTouchesSamus(cur_enemy_index)) { extra_samus_x_subdisplacement = 0; @@ -3174,13 +3130,13 @@ uint16 WreckedShipRobot_Instr_16(uint16 k, uint16 j) { // 0xA8CFB0 E->base.y_pos = E->wsrt_var_D; E->base.x_pos = E->wsrt_var_C; E->wsrt_var_A = 512; - return addr_kWreckedShipRobot_Ilist_CB65; + return INSTR_RETURN_ADDR(addr_kWreckedShipRobot_Ilist_CB65); } } - return j; + return jp; } -uint16 WreckedShipRobot_Instr_17(uint16 k, uint16 j) { // 0xA8D04B +const uint16 *WreckedShipRobot_Instr_17(uint16 k, const uint16 *jp) { // 0xA8D04B WreckedShipRobot_Func_2(cur_enemy_index); Enemy_WreckedShipRobot *E = Get_WreckedShipRobot(cur_enemy_index); E->wsrt_var_A = 512; @@ -3188,15 +3144,15 @@ uint16 WreckedShipRobot_Instr_17(uint16 k, uint16 j) { // 0xA8D04B R20_ = -4; if (Enemy_MoveRight_IgnoreSlopes(cur_enemy_index) & 1) { E->wsrt_var_B += 8; - return addr_stru_A8C6E9; + return INSTR_RETURN_ADDR(addr_stru_A8C6E9); } else if (CheckIfEnemyTouchesSamus(cur_enemy_index)) { extra_samus_x_subdisplacement = 0; extra_samus_x_displacement = -4; } - return j; + return jp; } -uint16 WreckedShipRobot_Instr_3(uint16 k, uint16 j) { // 0xA8D091 +const uint16 *WreckedShipRobot_Instr_3(uint16 k, const uint16 *jp) { // 0xA8D091 Enemy_WreckedShipRobot *E = Get_WreckedShipRobot(cur_enemy_index); if ((int16)(layer1_x_pos - E->base.x_pos) < 0 && (int16)(layer1_x_pos + 256 - E->base.x_pos) >= 0 @@ -3204,26 +3160,26 @@ uint16 WreckedShipRobot_Instr_3(uint16 k, uint16 j) { // 0xA8D091 && (int16)(layer1_y_pos + 224 - E->base.y_pos) >= 0) { QueueSfx2_Max6(0x68u); } - return j; + return jp; } -uint16 WreckedShipRobot_Instr_10(uint16 k, uint16 j) { // 0xA8D0C2 - return addr_stru_A8C6E9; +const uint16 *WreckedShipRobot_Instr_10(uint16 k, const uint16 *jp) { // 0xA8D0C2 + return INSTR_RETURN_ADDR(addr_stru_A8C6E9); } -uint16 WreckedShipRobot_Instr_14(uint16 k, uint16 j) { // 0xA8D0C6 +const uint16 *WreckedShipRobot_Instr_14(uint16 k, const uint16 *jp) { // 0xA8D0C6 R50 = addr_kWreckedShipRobot_Ilist_CB1D; R48 = addr_kEproj_WreckedShipRobotLaserUpRight; - return WreckedShipRobot_CommonInstr(k, j); + return WreckedShipRobot_CommonInstr(k, jp); } -uint16 WreckedShipRobot_Instr_2(uint16 k, uint16 j) { // 0xA8D0D2 +const uint16 *WreckedShipRobot_Instr_2(uint16 k, const uint16 *jp) { // 0xA8D0D2 R50 = addr_kWreckedShipRobot_Ilist_C8D1; R48 = addr_kEproj_WreckedShipRobotLaserUpLeft; - return WreckedShipRobot_CommonInstr(k, j); + return WreckedShipRobot_CommonInstr(k, jp); } -uint16 WreckedShipRobot_CommonInstr(uint16 k, uint16 j) { // 0xA8D0DC +const uint16 *WreckedShipRobot_CommonInstr(uint16 k, const uint16 *jp) { // 0xA8D0DC Enemy_WreckedShipRobot *E = Get_WreckedShipRobot(k); if (E->wsrt_var_B) { WreckedShipRobot_Func_2(k); @@ -3231,22 +3187,22 @@ uint16 WreckedShipRobot_CommonInstr(uint16 k, uint16 j) { // 0xA8D0DC uint16 v3 = (random_number & 0x1F) + 16; E->wsrt_var_B = v3; SpawnEnemyProjectileWithGfx(v3, cur_enemy_index, R48); - return R50; + return INSTR_RETURN_ADDR(R50); } - return j; + return jp; } -uint16 WreckedShipRobot_Instr_13(uint16 k, uint16 j) { // 0xA8D100 +const uint16 *WreckedShipRobot_Instr_13(uint16 k, const uint16 *jp) { // 0xA8D100 R50 = addr_kWreckedShipRobot_Ilist_CB09; - return WreckedShipRobot_D10C(k, j); + return WreckedShipRobot_D10C(k, jp); } -uint16 WreckedShipRobot_Instr_1(uint16 k, uint16 j) { // 0xA8D107 +const uint16 *WreckedShipRobot_Instr_1(uint16 k, const uint16 *jp) { // 0xA8D107 R50 = addr_kWreckedShipRobot_Ilist_C8BD; - return WreckedShipRobot_D10C(k, j); + return WreckedShipRobot_D10C(k, jp); } -uint16 WreckedShipRobot_D10C(uint16 k, uint16 j) { // 0xA8D10C +const uint16 *WreckedShipRobot_D10C(uint16 k, const uint16 *jp) { // 0xA8D10C Enemy_WreckedShipRobot *E = Get_WreckedShipRobot(k); if (E->wsrt_var_B) { WreckedShipRobot_Func_2(k); @@ -3254,24 +3210,24 @@ uint16 WreckedShipRobot_D10C(uint16 k, uint16 j) { // 0xA8D10C uint16 v3 = (random_number & 0x1F) + 16; E->wsrt_var_B = v3; SpawnEnemyProjectileWithGfx(v3, cur_enemy_index, addr_kEproj_WreckedShipRobotLaserHorizontal); - return R50; + return INSTR_RETURN_ADDR(R50); } - return j; + return jp; } -uint16 WreckedShipRobot_Instr_12(uint16 k, uint16 j) { // 0xA8D131 +const uint16 *WreckedShipRobot_Instr_12(uint16 k, const uint16 *jp) { // 0xA8D131 R48 = addr_kEproj_WreckedShipRobotLaserDownRight; R50 = addr_kWreckedShipRobot_Ilist_CAFD; - return WreckedShipRobot_D147(k, j); + return WreckedShipRobot_D147(k, jp); } -uint16 WreckedShipRobot_Instr_5(uint16 k, uint16 j) { // 0xA8D13D +const uint16 *WreckedShipRobot_Instr_5(uint16 k, const uint16 *jp) { // 0xA8D13D R48 = addr_kEproj_WreckedShipRobotLaserDownLeft; R50 = addr_kWreckedShipRobot_Ilist_C8B1; - return WreckedShipRobot_D147(k, j); + return WreckedShipRobot_D147(k, jp); } -uint16 WreckedShipRobot_D147(uint16 k, uint16 j) { // 0xA8D147 +const uint16 *WreckedShipRobot_D147(uint16 k, const uint16 *jp) { // 0xA8D147 Enemy_WreckedShipRobot *E = Get_WreckedShipRobot(k); if (E->wsrt_var_B) { WreckedShipRobot_Func_2(k); @@ -3279,14 +3235,14 @@ uint16 WreckedShipRobot_D147(uint16 k, uint16 j) { // 0xA8D147 uint16 v3 = (random_number & 0x1F) + 16; E->wsrt_var_B = v3; SpawnEnemyProjectileWithGfx(v3, cur_enemy_index, R48); - return R50; + return INSTR_RETURN_ADDR(R50); } - return j; + return INSTR_RETURN_ADDR(jp[0]); } -uint16 WreckedShipRobot_Instr_11(uint16 k, uint16 j) { // 0xA8D16B +const uint16 *WreckedShipRobot_Instr_11(uint16 k, const uint16 *jp) { // 0xA8D16B WreckedShipRobot_Func_2(cur_enemy_index); - return j; + return jp; } void WreckedShipRobotDeactivated_Touch(void) { // 0xA8D174 @@ -3412,17 +3368,11 @@ void MaridiaPuffer_Func_5(void) { // 0xA8D9AA } void MaridiaPuffer_Func_6(void) { // 0xA8D9DB - char v2; // t0 - R26_ = 0; R18_ = kSine16bit[(uint8)(Get_MaridiaPuffer(cur_enemy_index)->mpr_var_02 + 64)]; if ((R18_ & 0x8000u) != 0) ++R26_; - uint16 v1 = Abs16(R18_) & 0xFF00; - v2 = v1; - LOBYTE(v1) = HIBYTE(v1); - HIBYTE(v1) = v2; - R22_ = v1; + R22_ = (Abs16(R18_) & 0xFF00) >> 8; Enemy_MaridiaPuffer *E = Get_MaridiaPuffer(cur_enemy_index); R24_ = E->mpr_var_D; MaridiaPuffer_Func_10(); @@ -3431,22 +3381,16 @@ void MaridiaPuffer_Func_6(void) { // 0xA8D9DB uint16 x_subpos = E->base.x_subpos; bool v5 = __CFADD__uint16(R28_, x_subpos); E->base.x_subpos = R28_ + x_subpos; - E->base.x_pos += g_word_7E001E + v5; + E->base.x_pos += R30_ + v5; } void MaridiaPuffer_Func_7(void) { // 0xA8DA28 - char v2; // t0 - + Enemy_MaridiaPuffer *E = Get_MaridiaPuffer(cur_enemy_index); R26_ = 0; - R18_ = kSine16bit[(uint16)(2 * (uint8)Get_MaridiaPuffer(cur_enemy_index)->mpr_var_02) >> 1]; + R18_ = kSine16bit[(uint8)E->mpr_var_02]; if ((R18_ & 0x8000u) != 0) ++R26_; - uint16 v1 = Abs16(R18_) & 0xFF00; - v2 = v1; - LOBYTE(v1) = HIBYTE(v1); - HIBYTE(v1) = v2; - R22_ = v1; - Enemy_MaridiaPuffer *E = Get_MaridiaPuffer(cur_enemy_index); + R22_ = (Abs16(R18_) & 0xFF00) >> 8; R24_ = E->mpr_var_D; MaridiaPuffer_Func_10(); if (R26_) @@ -3454,7 +3398,7 @@ void MaridiaPuffer_Func_7(void) { // 0xA8DA28 uint16 y_subpos = E->base.y_subpos; bool v5 = __CFADD__uint16(R28_, y_subpos); E->base.y_subpos = R28_ + y_subpos; - E->base.y_pos += g_word_7E001E + v5; + E->base.y_pos += R30_ + v5; } void MaridiaPuffer_Func_8(uint16 k) { // 0xA8DA71 @@ -3476,30 +3420,26 @@ void MaridiaPuffer_Func_9(uint16 k) { // 0xA8DA92 } void MaridiaPuffer_Func_10(void) { // 0xA8DAB3 - int16 v1; - uint16 prod1 = Mult8x8(R22_, R24_); uint16 prod2 = Mult8x8(R22_, HIBYTE(R24_)); R28_ = prod1; - g_word_7E001E = (uint8)((uint16)(prod2 & 0xFF00) >> 8); - uint16 RegWord = (uint8)prod2; - LOBYTE(v1) = HIBYTE(RegWord); - HIBYTE(v1) = RegWord; + R30_ = (uint8)(prod2 >> 8); + uint16 v1 = (uint8)prod2 << 8; bool v2 = __CFADD__uint16(R28_, v1); R28_ += v1; if (v2) - ++g_word_7E001E; + ++R30_; } void MaridiaPuffer_Func_11(void) { // 0xA8DAF6 if (R28_) { R28_ = -R28_; } else { - if (!g_word_7E001E) + if (!R30_) return; --R28_; } - g_word_7E001E = ~g_word_7E001E; + R30_ = ~R30_; } void MaridiaPuffer_Shot(void) { // 0xA8DB14 @@ -3719,9 +3659,9 @@ void WalkingLavaSeahorse_Func_9(uint16 k) { // 0xA8DEEC } } -uint16 WalkingLavaSeahorse_Instr_4(uint16 k, uint16 j) { // 0xA8DF1C +const uint16 *WalkingLavaSeahorse_Instr_4(uint16 k, const uint16 *jp) { // 0xA8DF1C WalkingLavaSeahorse_DF20(0); - return j; + return jp; } void WalkingLavaSeahorse_DF20(uint16 a) { // 0xA8DF20 @@ -3729,17 +3669,17 @@ void WalkingLavaSeahorse_DF20(uint16 a) { // 0xA8DF20 QueueSfx2_Max6(0x3Fu); } -uint16 WalkingLavaSeahorse_Instr_3(uint16 k, uint16 j) { // 0xA8DF33 +const uint16 *WalkingLavaSeahorse_Instr_3(uint16 k, const uint16 *jp) { // 0xA8DF33 WalkingLavaSeahorse_DF20(2u); - return j; + return jp; } -uint16 WalkingLavaSeahorse_Instr_5(uint16 k, uint16 j) { // 0xA8DF39 +const uint16 *WalkingLavaSeahorse_Instr_5(uint16 k, const uint16 *jp) { // 0xA8DF39 WalkingLavaSeahorse_DF20(4u); - return j; + return jp; } -uint16 WalkingLavaSeahorse_Instr_6(uint16 k, uint16 j) { // 0xA8DF3F +const uint16 *WalkingLavaSeahorse_Instr_6(uint16 k, const uint16 *jp) { // 0xA8DF3F int16 v3; Enemy_WalkingLavaSeahorse *E = Get_WalkingLavaSeahorse(cur_enemy_index); @@ -3748,36 +3688,35 @@ uint16 WalkingLavaSeahorse_Instr_6(uint16 k, uint16 j) { // 0xA8DF3F if ((random_number & 3) == 0) v3 = 2; E->wlse_var_04 = v3; - uint16 result = addr_kWalkingLavaSeahorse_Ilist_DBE7; if ((E->wlse_var_D & 0x8000u) == 0) - return addr_kWalkingLavaSeahorse_Ilist_DC57; - return result; + return INSTR_RETURN_ADDR(addr_kWalkingLavaSeahorse_Ilist_DC57); + return INSTR_RETURN_ADDR(addr_kWalkingLavaSeahorse_Ilist_DBE7); } -uint16 WalkingLavaSeahorse_Instr_2(uint16 k, uint16 j) { // 0xA8DF63 +const uint16 *WalkingLavaSeahorse_Instr_2(uint16 k, const uint16 *jp) { // 0xA8DF63 Enemy_WalkingLavaSeahorse *E = Get_WalkingLavaSeahorse(cur_enemy_index); uint16 wlse_var_04 = E->wlse_var_04; if (wlse_var_04) E->wlse_var_04 = wlse_var_04 - 1; - return WalkingLavaSeahorse_Instr_1(cur_enemy_index, j); + return WalkingLavaSeahorse_Instr_1(cur_enemy_index, jp); } -uint16 WalkingLavaSeahorse_Instr_1(uint16 k, uint16 j) { // 0xA8DF71 +const uint16 *WalkingLavaSeahorse_Instr_1(uint16 k, const uint16 *jp) { // 0xA8DF71 int16 wlse_var_D; R18_ = 0; Enemy_WalkingLavaSeahorse *E = Get_WalkingLavaSeahorse(cur_enemy_index); R20_ = E->wlse_var_D; if (Enemy_MoveRight_IgnoreSlopes(cur_enemy_index) & 1) { - j = addr_stru_A8DBE9; + jp = INSTR_RETURN_ADDR(addr_stru_A8DBE9); wlse_var_D = E->wlse_var_D; if (wlse_var_D < 0) - j = addr_stru_A8DC59; + jp = INSTR_RETURN_ADDR(addr_stru_A8DC59); E->wlse_var_D = -wlse_var_D; } else { EnemyFunc_C8AD(cur_enemy_index); } - return j; + return jp; } void WalkingLavaSeahorse_Func_10(void) { // 0xA8DF9D @@ -3876,16 +3815,16 @@ void WreckedShipOrbs_Func_6(void) { // 0xA8E462 E->base.x_subpos = v3; } -uint16 WreckedShipSpark_Instr_2(uint16 k, uint16 j) { // 0xA8E61D +const uint16 *WreckedShipSpark_Instr_2(uint16 k, const uint16 *jp) { // 0xA8E61D Enemy_WreckedShipSpark *E = Get_WreckedShipSpark(cur_enemy_index); E->base.properties |= kEnemyProps_Tangible; - return j; + return jp; } -uint16 WreckedShipSpark_Instr_1(uint16 k, uint16 j) { // 0xA8E62A +const uint16 *WreckedShipSpark_Instr_1(uint16 k, const uint16 *jp) { // 0xA8E62A Enemy_WreckedShipSpark *E = Get_WreckedShipSpark(cur_enemy_index); E->base.properties &= ~kEnemyProps_Tangible; - return j; + return jp; } void WreckedShipSpark_Init(void) { // 0xA8E637 @@ -4261,7 +4200,7 @@ void KiHunter_Func_3(uint16 k) { // 0xA8F4ED } } -uint16 KiHunter_Instr_1(uint16 k, uint16 j) { // 0xA8F526 +const uint16 *KiHunter_Instr_1(uint16 k, const uint16 *jp) { // 0xA8F526 uint16 result = addr_kKiHunter_Ilist_E9FA; R18_ = addr_kKiHunter_Ilist_EA4E; Enemy_KiHunter *E = Get_KiHunter(k); @@ -4269,14 +4208,14 @@ uint16 KiHunter_Instr_1(uint16 k, uint16 j) { // 0xA8F526 result = addr_kKiHunter_Ilist_EA24; R18_ = addr_kKiHunter_Ilist_EA5E; } - E->base.current_instruction = result; + E->base.current_instruction = R18_; E->base.instruction_timer = 1; Enemy_KiHunter *E1 = Get_KiHunter(k + 64); - if (E1->khr_var_A == (uint16)FUNC16(KiHunter_Func_9)) { + if (E1->khr_var_A == FUNC16(KiHunter_Func_9)) { E1->base.current_instruction = R18_; E1->base.instruction_timer = 1; } - return result; + return INSTR_RETURN_ADDR(result); } void KiHunter_Func_4(uint16 k) { // 0xA8F55A @@ -4310,9 +4249,9 @@ void KiHunter_Func_5(uint16 k) { // 0xA8F58B E->base.instruction_timer = 1; } -uint16 KiHunter_Instr_2(uint16 k, uint16 j) { // 0xA8F5E4 +const uint16 *KiHunter_Instr_2(uint16 k, const uint16 *jp) { // 0xA8F5E4 Get_KiHunter(cur_enemy_index)->khr_var_A = FUNC16(KiHunter_Func_6); - return j; + return jp; } void KiHunter_Func_6(uint16 k) { // 0xA8F5F0 @@ -4348,9 +4287,9 @@ void KiHunter_Func_6(uint16 k) { // 0xA8F5F0 } } -uint16 KiHunter_Instr_3(uint16 k, uint16 j) { // 0xA8F67F +const uint16 *KiHunter_Instr_3(uint16 k, const uint16 *jp) { // 0xA8F67F Get_KiHunter(cur_enemy_index)->khr_var_A = FUNC16(KiHunter_Func_7); - return j; + return jp; } void KiHunter_Func_7(uint16 k) { // 0xA8F68B @@ -4376,14 +4315,14 @@ void KiHunter_Func_8(uint16 k) { // 0xA8F6B3 E->khr_var_A = addr_locret_A8F5E3; } -uint16 KiHunter_Instr_4(uint16 k, uint16 j) { // 0xA8F6D2 +const uint16 *KiHunter_Instr_4(uint16 k, const uint16 *jp) { // 0xA8F6D2 sub_A8F6DC(k, addr_loc_A8CF18); - return j; + return jp; } -uint16 KiHunter_Instr_5(uint16 k, uint16 j) { // 0xA8F6D8 +const uint16 *KiHunter_Instr_5(uint16 k, const uint16 *jp) { // 0xA8F6D8 sub_A8F6DC(k, addr_loc_A8CF26); - return j; + return jp; } void sub_A8F6DC(uint16 k, uint16 j) { // 0xA8F6DC @@ -4413,7 +4352,7 @@ void KiHunter_Shot(void) { // 0xA8F701 EK->khr_var_08 = 0; EK->khr_var_09 = 1; cur_enemy_index = old_cur_enemy_index + 64; - if (E1->khr_var_A != (uint16)FUNC16(KiHunter_Func_10)) { + if (E1->khr_var_A != FUNC16(KiHunter_Func_10)) { E1->khr_var_07 = E1->base.y_pos; E1->khr_var_08 = E1->base.x_pos; KiHunter_Func_17(); @@ -4546,7 +4485,6 @@ void KiHunter_Func_16(uint16 k) { // 0xA8F96A } void KiHunter_Func_17(void) { // 0xA8F98D - char v4; // t0 uint16 v5; Enemy_KiHunter *E = Get_KiHunter(cur_enemy_index); @@ -4555,11 +4493,8 @@ void KiHunter_Func_17(void) { // 0xA8F98D do { uint16 v3 = E->khr_var_0A + 384; E->khr_var_0A = v3; - v3 &= 0xFF00u; - v4 = v3; - LOBYTE(v3) = HIBYTE(v3); - HIBYTE(v3) = v4; + v3 >>= 8; v5 = *(uint16 *)((char *)kCommonEnemySpeeds_Quadratic + (uint16)(8 * v3) + 1) + E->khr_var_D; E->khr_var_D = v5; } while (sign16(v5 - 0x2000)); -} +} \ No newline at end of file diff --git a/src/sm_a9.c b/src/sm_a9.c index ba44804..01adc37 100644 --- a/src/sm_a9.c +++ b/src/sm_a9.c @@ -6,11 +6,42 @@ #include "enemy_types.h" #include "sm_rtl.h" -#define g_word_A98929 ((uint16*)RomPtr(0xa98929)) + +#define g_word_A98929 ((uint16*)RomFixedPtr(0xa98929)) +#define g_off_A98B7B ((uint16*)RomFixedPtr(0xa98b7b)) +#define g_word_A9B099 ((uint16*)RomFixedPtr(0xa9b099)) +#define g_word_A9B109 ((uint16*)RomFixedPtr(0xa9b109)) +#define g_word_A9B10F ((uint16*)RomFixedPtr(0xa9b10f)) +#define g_off_A9B6D4 ((uint16*)RomFixedPtr(0xa9b6d4)) +#define MotherBrain_RainbowBeamPalettes ((uint16*)RomFixedPtr(0xade434)) +#define g_off_A9C61E ((uint16*)RomFixedPtr(0xa9c61e)) +#define g_off_A9C664 ((uint16*)RomFixedPtr(0xa9c664)) +#define kShitroid_FadingToBlack ((uint16*)RomFixedPtr(0xade8e2)) +#define g_word_A9CDFC ((uint16*)RomFixedPtr(0xa9cdfc)) +#define kShitroid_HealthBasedPalettes_Shell ((uint16*)RomFixedPtr(0xade7e2)) +#define kShitroid_HealthBasedPalettes_Innards ((uint16*)RomFixedPtr(0xade882)) +#define g_off_A9D260 ((uint16*)RomFixedPtr(0xa9d260)) +#define g_word_A9D583 ((uint16*)RomFixedPtr(0xa9d583)) +#define g_word_A9D549 ((uint16*)RomFixedPtr(0xa9d549)) +#define g_word_A9D67C ((uint16*)RomFixedPtr(0xa9d67c)) +#define g_word_A9D69C ((uint16*)RomFixedPtr(0xa9d69c)) +#define kDeadTorizo_TileData ((uint16*)RomFixedPtr(0xb7a800)) +#define g_off_A9D86A ((uint16*)RomFixedPtr(0xa9d86a)) +#define g_off_A9D870 ((uint16*)RomFixedPtr(0xa9d870)) +#define g_off_A9D897 ((uint16*)RomFixedPtr(0xa9d897)) +#define g_off_A9D89B ((uint16*)RomFixedPtr(0xa9d89b)) +#define g_off_A9D8C0 ((uint16*)RomFixedPtr(0xa9d8c0)) +#define g_off_A9D8C6 ((uint16*)RomFixedPtr(0xa9d8c6)) +#define g_word_A9D951 ((uint16*)RomFixedPtr(0xa9d951)) +#define g_word_A9D959 ((uint16*)RomFixedPtr(0xa9d959)) +#define TILEMAP_ADDR(x) &g_ram[0x2000 + x] +#define kDeadMonsters_TileData RomPtr_B7(addr_kDeadMonsters_TileData) + + + static const uint16 g_word_A98B5D[5] = { 0x10, 0x10, 8, 8, 0x10 }; static const uint16 g_word_A98B67[5] = { 0x20, 0x20, 0x18, 0x18, 0x20 }; static const uint16 g_word_A98B71[5] = { 0xf8, 0xf8, 0xf0, 0xf0, 0xf6 }; -#define g_off_A98B7B ((uint16*)RomPtr(0xa98b7b)) static const uint16 g_word_A98C61[4] = { 0xfff8, 2, 0xfffc, 6 }; static const uint8 g_byte_A98F7D[2] = { 9, 0x12 }; static const uint16 g_word_A98F7F[8] = { 0x3d, 0x54, 0x20, 0x35, 0x5a, 0x43, 0x67, 0x29 }; @@ -19,13 +50,9 @@ static const int16 g_word_A993BB[4] = { 0, -1, 0, 1 }; static const int16 g_word_A993C3[4] = { 0, 1, -1, 1 }; static const uint16 g_word_A99E0F[13] = { 0x6f, 0x6f, 0x6f, 0x7e, 0x6f, 0x6f, 0x7e, 0x6f, 0x6f, 0x7e, 0x7e, 0x6f, 0x6f }; -#define g_word_A9B099 ((uint16*)RomPtr(0xa9b099)) -#define g_word_A9B109 ((uint16*)RomPtr(0xa9b109)) -#define g_word_A9B10F ((uint16*)RomPtr(0xa9b10f)) static const uint16 g_word_A9B393[8] = { 8, 0x6c, 0x18, 0x80, 9, 0x90, 0x18, 0x74 }; static const uint8 g_byte_A9B546[8] = { 0, 1, 1, 0, 0, 0, 0, 0 }; static const uint8 g_byte_A9B5A1[8] = { 2, 1, 1, 0, 0, 0, 0, 0 }; -#define g_off_A9B6D4 ((uint16*)RomPtr(0xa9b6d4)) static const uint8 g_byte_A9B6DC[3] = { 0x40, 0x80, 0xc0 }; static const uint8 g_byte_A9B6DF[3] = { 0x10, 0x20, 0xd0 }; static const int16 g_word_A9B72C[28] = { @@ -34,33 +61,12 @@ static const int16 g_word_A9B72C[28] = { }; static const int16 g_word_A9BCA6[8] = { -8, 6, -4, 2, 3, -6, 8, 0 }; static const int16 g_word_A9BCB6[8] = { -7, 2, 5, -4, 6, -2, -6, 7 }; -#define MotherBrain_RainbowBeamPalettes ((uint16*)RomPtr(0xade434)) static const uint8 g_byte_A9BEEE[16] = { 2, 0, 2, 0, 6, 0, 6, 0, 8, 0, 8, 0, 10, 0, 10, 0 }; static const uint16 g_word_A9BEFE[8] = { 0x500, 0x500, 0x200, 0x200, 0xc0, 0xc0, 0x40, 0x40 }; static const int16 g_word_A9C049[8] = { 0x10, 0x10, 0x20, 0x20, 0x30, 0x30, 0x40, 0x40 }; static const uint16 g_word_A9C544 = 1; -#define g_off_A9C61E ((uint16*)RomPtr(0xa9c61e)) -#define g_off_A9C664 ((uint16*)RomPtr(0xa9c664)) -#define kShitroid_FadingToBlack ((uint16*)RomPtr(0xade8e2)) -#define g_word_A9CDFC ((uint16*)RomPtr(0xa9cdfc)) -#define kShitroid_HealthBasedPalettes_Shell ((uint16*)RomPtr(0xade7e2)) -#define kShitroid_HealthBasedPalettes_Innards ((uint16*)RomPtr(0xade882)) -#define g_off_A9D260 ((uint16*)RomPtr(0xa9d260)) -#define g_word_A9D583 ((uint16*)RomPtr(0xa9d583)) -#define g_word_A9D549 ((uint16*)RomPtr(0xa9d549)) -#define g_word_A9D67C ((uint16*)RomPtr(0xa9d67c)) -#define g_word_A9D69C ((uint16*)RomPtr(0xa9d69c)) -#define kDeadTorizo_TileData ((uint16*)RomPtr(0xb7a800)) -#define g_off_A9D86A ((uint16*)RomPtr(0xa9d86a)) -#define g_off_A9D870 ((uint16*)RomPtr(0xa9d870)) -#define g_off_A9D897 ((uint16*)RomPtr(0xa9d897)) -#define g_off_A9D89B ((uint16*)RomPtr(0xa9d89b)) -#define g_off_A9D8C0 ((uint16*)RomPtr(0xa9d8c0)) -#define g_off_A9D8C6 ((uint16*)RomPtr(0xa9d8c6)) -#define g_word_A9D951 ((uint16*)RomPtr(0xa9d951)) -#define g_word_A9D959 ((uint16*)RomPtr(0xa9d959)) static const int8 g_byte_A9F56A[16] = { 0x10, 0xf, 0xe, 0xd, 0xc, 0xb, 0xa, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; void CallCorpseRottingMove(uint32 ea, uint16 k, uint16 j) { @@ -262,11 +268,6 @@ void Enemy_NormalFrozenAI_A9(void) { // 0xA98041 NormalEnemyFrozenAI(); } -uint16 EnemyInstr_Sleep_A9(uint16 k, uint16 j) { // 0xA9812F - gEnemyData(k)->current_instruction = j - 2; - return 0; -} - void MotherBrainsBody_Init(void) { // 0xA98687 for (int i = 4094; i >= 0; i -= 2) tilemap_stuff[i >> 1] = 824; @@ -1271,57 +1272,27 @@ void MotherBrain_DrawNeckSegment(void) { // 0xA993CB } void MotherBrain_AddSpritemapToOam(uint16 j) { // 0xA993EE - int16 *v5; - int16 v6; - int16 v7; - char v8; // t0 - int16 v10; - int16 v12; - OamEnt *v13; - int16 v15; - int16 v17; - - uint16 *v1 = (uint16 *)RomPtr_A9(j); - uint16 v2 = j + 2; - R24_ = *v1; - uint16 v3 = oam_next_ptr; + const uint8 *p = RomPtr_A9(j); + int n = GET_WORD(p); + p += 2; + int v3 = oam_next_ptr; do { - uint8 *v4 = RomPtr_A9(v2); - v5 = (int16 *)v4; - v6 = v4[2] << 8; - if ((v4[2] & 0x80) != 0) - v6 |= 0xFFu; - v8 = v6; - LOBYTE(v7) = HIBYTE(v6); - HIBYTE(v7) = v8; - uint16 v9 = R20_ + v7; - bool v11 = v9 < layer1_y_pos; - v10 = v9 - layer1_y_pos; - v11 = !v11; + int16 v10 = R20_ + (int8)p[2] - layer1_y_pos; if (v10 >= 0) { - R26_ = v10; - v12 = R18_ + v11 + *(uint16 *)v4 - layer1_x_pos; - v13 = gOamEnt(v3); - *(uint16 *)&v13->xcoord = v12; - if ((v12 & 0x100) != 0) { - int v14 = v3 >> 1; - R28_ = kOamExtra_Address_And_X8Large[v14]; - v15 = kOamExtra_X8Small_And_Large[v14] | *(uint16 *)RomPtr_RAM(R28_); - *(uint16 *)RomPtr_RAM(R28_) = v15; - } - if (*v5 < 0) { - int v16 = v3 >> 1; - R28_ = kOamExtra_Address_And_X8Large[v16]; - v17 = kOamExtra_X8Small_And_Large[v16 + 1] | *(uint16 *)RomPtr_RAM(R28_); - *(uint16 *)RomPtr_RAM(R28_) = v17; - } - *(uint16 *)&v13->ycoord = R26_; - *(uint16 *)&v13->charnum = R22_ | *(int16 *)((char *)v5 + 3); + uint16 v12 = R18_ + GET_WORD(p) - layer1_x_pos; + OamEnt *v13 = gOamEnt(v3); + v13->xcoord = v12; + int v14 = v3 >> 1; + if ((v12 & 0x100) != 0) + *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v14]) |= kOamExtra_X8Small_And_Large[v14]; + if (sign16(GET_WORD(p))) + *(uint16 *)RomPtr_RAM(kOamExtra_Address_And_X8Large[v14]) |= kOamExtra_X8Small_And_Large[v14 + 1]; + v13->ycoord = v10; + *(uint16 *)&v13->charnum = R22_ | GET_WORD(p + 3); v3 = (v3 + 4) & 0x1FF; } - v2 += 5; - --R24_; - } while (R24_); + p += 5; + } while (--n); oam_next_ptr = v3; } @@ -1352,199 +1323,199 @@ void MotherBrain_FootstepEffect(void) { // 0xA99599 // word_80914D = 22; } -uint16 MotherBrain_Instr_MoveBodyUp10Left4(uint16 k, uint16 j) { // 0xA995B6 +const uint16 *MotherBrain_Instr_MoveBodyUp10Left4(uint16 k, const uint16 *jp) { // 0xA995B6 MotherBrain_MoveBodyDownScrollLeft(4u, 0xFFF6); - return j; + return jp; } -uint16 MotherBrain_Instr_MoveBodyUp16Left4(uint16 k, uint16 j) { // 0xA995C0 +const uint16 *MotherBrain_Instr_MoveBodyUp16Left4(uint16 k, const uint16 *jp) { // 0xA995C0 MotherBrain_MoveBodyDownScrollLeft(4u, 0xFFF0); - return j; + return jp; } -uint16 MotherBrain_Instr_MoveBodyUp12Right2(uint16 k, uint16 j) { // 0xA995CA +const uint16 *MotherBrain_Instr_MoveBodyUp12Right2(uint16 k, const uint16 *jp) { // 0xA995CA MotherBrain_MoveBodyDownScrollLeft(0xFFFE, 0xFFF4); - return j; + return jp; } -uint16 MotherBrain_Instr_MoveDown12Left4(uint16 k, uint16 j) { // 0xA995DE +const uint16 *MotherBrain_Instr_MoveDown12Left4(uint16 k, const uint16 *jp) { // 0xA995DE MotherBrain_MoveBodyDownScrollLeft(4u, 0xC); - return j; + return jp; } -uint16 MotherBrain_Instr_MoveDown16Right2(uint16 k, uint16 j) { // 0xA995E8 +const uint16 *MotherBrain_Instr_MoveDown16Right2(uint16 k, const uint16 *jp) { // 0xA995E8 MotherBrain_MoveBodyDownScrollLeft(0xFFFE, 0x10); - return j; + return jp; } -uint16 MotherBrain_Instr_MoveDown10Right2(uint16 k, uint16 j) { // 0xA995F2 +const uint16 *MotherBrain_Instr_MoveDown10Right2(uint16 k, const uint16 *jp) { // 0xA995F2 MotherBrain_MoveBodyDownScrollLeft(0xFFFE, 0xA); - return j; + return jp; } -uint16 MotherBrain_Instr_MoveUp2Right1(uint16 k, uint16 j) { // 0xA995FC +const uint16 *MotherBrain_Instr_MoveUp2Right1(uint16 k, const uint16 *jp) { // 0xA995FC Enemy_MotherBrain *E = Get_MotherBrain(0); ++E->base.x_pos; MotherBrain_MoveBodyDown(0xFFFEu); - return j; + return jp; } -uint16 MotherBrain_Instr_MoveRight2(uint16 k, uint16 j) { // 0xA9960C +const uint16 *MotherBrain_Instr_MoveRight2(uint16 k, const uint16 *jp) { // 0xA9960C Enemy_MotherBrain *E = Get_MotherBrain(0); E->base.x_pos += 2; MotherBrain_MoveBodyDown(0); - return j; + return jp; } -uint16 MotherBrain_Instr_MoveUp1(uint16 k, uint16 j) { // 0xA9961C +const uint16 *MotherBrain_Instr_MoveUp1(uint16 k, const uint16 *jp) { // 0xA9961C MotherBrain_MoveBodyDown(1u); - return j; + return jp; } -uint16 MotherBrain_Instr_MoveUp1Right3_Sfx(uint16 k, uint16 j) { // 0xA99622 +const uint16 *MotherBrain_Instr_MoveUp1Right3_Sfx(uint16 k, const uint16 *jp) { // 0xA99622 MotherBrain_FootstepEffect(); Enemy_MotherBrain *E = Get_MotherBrain(0); E->base.x_pos += 3; MotherBrain_MoveBodyDown(1u); - return j; + return jp; } -uint16 MotherBrain_Instr_Down2Right15(uint16 k, uint16 j) { // 0xA99638 +const uint16 *MotherBrain_Instr_Down2Right15(uint16 k, const uint16 *jp) { // 0xA99638 Enemy_MotherBrain *E = Get_MotherBrain(0); E->base.x_pos += 15; MotherBrain_MoveBodyDown(0xFFFEu); - return j; + return jp; } -uint16 MotherBrain_Instr_Down4Right6(uint16 k, uint16 j) { // 0xA99648 +const uint16 *MotherBrain_Instr_Down4Right6(uint16 k, const uint16 *jp) { // 0xA99648 Enemy_MotherBrain *E = Get_MotherBrain(0); E->base.x_pos += 6; MotherBrain_MoveBodyDown(0xFFFCu); - return j; + return jp; } -uint16 MotherBrain_Instr_Up4Left2(uint16 k, uint16 j) { // 0xA99658 +const uint16 *MotherBrain_Instr_Up4Left2(uint16 k, const uint16 *jp) { // 0xA99658 Enemy_MotherBrain *E = Get_MotherBrain(0); E->base.x_pos -= 2; MotherBrain_MoveBodyDown(4u); - return j; + return jp; } -uint16 MotherBrain_Instr_Up2Left1_Sfx(uint16 k, uint16 j) { // 0xA99668 +const uint16 *MotherBrain_Instr_Up2Left1_Sfx(uint16 k, const uint16 *jp) { // 0xA99668 MotherBrain_FootstepEffect(); Enemy_MotherBrain *E = Get_MotherBrain(0); --E->base.x_pos; MotherBrain_MoveBodyDown(2u); - return j; + return jp; } -uint16 MotherBrain_Instr_Up2Left1_Sfx2(uint16 k, uint16 j) { // 0xA9967E +const uint16 *MotherBrain_Instr_Up2Left1_Sfx2(uint16 k, const uint16 *jp) { // 0xA9967E MotherBrain_FootstepEffect(); Enemy_MotherBrain *E = Get_MotherBrain(0); --E->base.x_pos; MotherBrain_MoveBodyDown(2u); - return j; + return jp; } -uint16 MotherBrain_Instr_MoveLeft2(uint16 k, uint16 j) { // 0xA99694 +const uint16 *MotherBrain_Instr_MoveLeft2(uint16 k, const uint16 *jp) { // 0xA99694 Enemy_MotherBrain *E = Get_MotherBrain(0); E->base.x_pos -= 2; MotherBrain_MoveBodyDown(0); - return j; + return jp; } -uint16 MotherBrain_Instr_MoveDown1(uint16 k, uint16 j) { // 0xA996A4 +const uint16 *MotherBrain_Instr_MoveDown1(uint16 k, const uint16 *jp) { // 0xA996A4 MotherBrain_MoveBodyDown(0xFFFFu); - return j; + return jp; } -uint16 MotherBrain_Instr_MoveDown1Left3(uint16 k, uint16 j) { // 0xA996AA +const uint16 *MotherBrain_Instr_MoveDown1Left3(uint16 k, const uint16 *jp) { // 0xA996AA Enemy_MotherBrain *E = Get_MotherBrain(0); E->base.x_pos -= 3; MotherBrain_MoveBodyDown(0xFFFFu); - return j; + return jp; } -uint16 MotherBrain_Instr_MoveUp2Left15_Sfx(uint16 k, uint16 j) { // 0xA996BA +const uint16 *MotherBrain_Instr_MoveUp2Left15_Sfx(uint16 k, const uint16 *jp) { // 0xA996BA MotherBrain_FootstepEffect(); Enemy_MotherBrain *E = Get_MotherBrain(0); E->base.x_pos -= 15; MotherBrain_MoveBodyDown(2u); - return j; + return jp; } -uint16 MotherBrain_Instr_MoveUp4Left6(uint16 k, uint16 j) { // 0xA996D0 +const uint16 *MotherBrain_Instr_MoveUp4Left6(uint16 k, const uint16 *jp) { // 0xA996D0 Enemy_MotherBrain *E = Get_MotherBrain(0); E->base.x_pos -= 6; MotherBrain_MoveBodyDown(4u); - return j; + return jp; } -uint16 MotherBrain_Instr_MoveDown4Right2(uint16 k, uint16 j) { // 0xA996E0 +const uint16 *MotherBrain_Instr_MoveDown4Right2(uint16 k, const uint16 *jp) { // 0xA996E0 Enemy_MotherBrain *E = Get_MotherBrain(0); E->base.x_pos += 2; MotherBrain_MoveBodyDown(0xFFFCu); - return j; + return jp; } -uint16 MotherBrain_Instr_MoveDown2Right1(uint16 k, uint16 j) { // 0xA996F0 +const uint16 *MotherBrain_Instr_MoveDown2Right1(uint16 k, const uint16 *jp) { // 0xA996F0 Enemy_MotherBrain *E = Get_MotherBrain(0); ++E->base.x_pos; MotherBrain_MoveBodyDown(0xFFFEu); - return j; + return jp; } -uint16 MotherBrain_Instr_SetPose_Standing(uint16 k, uint16 j) { // 0xA99700 +const uint16 *MotherBrain_Instr_SetPose_Standing(uint16 k, const uint16 *jp) { // 0xA99700 Get_MotherBrain(0)->mbn_var_02 = 0; - return j; + return jp; } -uint16 MotherBrain_Instr_SetPose_Walking(uint16 k, uint16 j) { // 0xA99708 +const uint16 *MotherBrain_Instr_SetPose_Walking(uint16 k, const uint16 *jp) { // 0xA99708 Get_MotherBrain(0)->mbn_var_02 = 1; - return j; + return jp; } -uint16 MotherBrain_Instr_SetPose_Crouched(uint16 k, uint16 j) { // 0xA99710 +const uint16 *MotherBrain_Instr_SetPose_Crouched(uint16 k, const uint16 *jp) { // 0xA99710 Get_MotherBrain(0)->mbn_var_02 = 3; - return j; + return jp; } -uint16 MotherBrain_Instr_SetPose_CrouchedTrans(uint16 k, uint16 j) { // 0xA99718 +const uint16 *MotherBrain_Instr_SetPose_CrouchedTrans(uint16 k, const uint16 *jp) { // 0xA99718 Get_MotherBrain(0)->mbn_var_02 = 2; - return j; + return jp; } -uint16 MotherBrain_Instr_SetPose_DeathBeamMode(uint16 k, uint16 j) { // 0xA99720 +const uint16 *MotherBrain_Instr_SetPose_DeathBeamMode(uint16 k, const uint16 *jp) { // 0xA99720 Get_MotherBrain(0)->mbn_var_02 = 4; - return j; + return jp; } -uint16 MotherBrain_Instr_SetPose_LeaningDown(uint16 k, uint16 j) { // 0xA99728 +const uint16 *MotherBrain_Instr_SetPose_LeaningDown(uint16 k, const uint16 *jp) { // 0xA99728 Get_MotherBrain(0)->mbn_var_02 = 6; - return j; + return jp; } -uint16 MotherBrain_Instr_SpawnEprojToOffset(uint16 k, uint16 j) { // 0xA99AC8 - uint8 *v2 = RomPtr_A9(j); +const uint16 *MotherBrain_Instr_SpawnEprojToOffset(uint16 k, const uint16 *jp) { // 0xA99AC8 Enemy_MotherBrain *E = Get_MotherBrain(0); - R18_ = E->base.x_pos + *(uint16 *)v2; - R20_ = E->base.y_pos + *((uint16 *)v2 + 1); - SpawnEnemyProjectileWithRoomGfx(addr_kEproj_DustCloudExplosion, *((uint16 *)v2 + 2)); - return j + 6; + R18_ = E->base.x_pos + jp[0]; + R20_ = E->base.y_pos + jp[1]; + SpawnEnemyProjectileWithRoomGfx(addr_kEproj_DustCloudExplosion, jp[2]); + return jp + 3; } -uint16 MotherBrain_Instr_SpawnDeathBeamEproj(uint16 k, uint16 j) { // 0xA99AEF +const uint16 *MotherBrain_Instr_SpawnDeathBeamEproj(uint16 k, const uint16 *jp) { // 0xA99AEF uint16 v2; - printf("A undefined\n"); v2 = 0; + //printf("A undefined\n"); + v2 = 0; QueueSfx2_Max6(0x63u); SpawnEnemyProjectileWithGfx(v2, 0x40, addr_kEproj_MotherBrainDeathBeamCharging); - return j; + return jp; } -uint16 MotherBrain_Instr_IncrBeamAttackPhase(uint16 k, uint16 j) { // 0xA99B05 +const uint16 *MotherBrain_Instr_IncrBeamAttackPhase(uint16 k, const uint16 *jp) { // 0xA99B05 Enemy_MotherBrain *E = Get_MotherBrain(0); ++E->mbn_var_17; - return j; + return jp; } uint16 MotherBrain_Instr_Goto(uint16 k) { // 0xA99B0F @@ -1562,13 +1533,13 @@ uint16 MotherBrain_Instr_DisableNeckMovement(uint16 k) { // 0xA99B20 } uint16 MotherBrain_Instr_QueueSfx2(uint16 k) { // 0xA99B28 - uint16 *v2 = (uint16 *)RomPtr_A9(k); + const uint16 *v2 = (const uint16 *)RomPtr_A9(k); QueueSfx2_Max6(*v2); return k + 2; } uint16 MotherBrain_Instr_QueueSfx3(uint16 k) { // 0xA99B32 - uint16 *v2 = (uint16 *)RomPtr_A9(k); + const uint16 *v2 = (const uint16 *)RomPtr_A9(k); QueueSfx3_Max6(*v2); return k + 2; } @@ -1590,7 +1561,8 @@ uint16 MotherBrain_Instr_SpawnDroolEproj(uint16 k) { // 0xA99B3C uint16 MotherBrain_Instr_SpawnPurpleBreath(uint16 k) { // 0xA99B6D uint16 v2; - printf("A undefined\n"); v2 = 0; + //printf("A undefined\n"); + v2 = 0; SpawnEnemyProjectileWithRoomGfx(addr_kEproj_MotherBrainPurpleBreathBig, v2); return k; } @@ -1685,7 +1657,7 @@ uint16 MotherBrain_Instr_SetShitroidAttackCtr0(uint16 k) { // 0xA99EB5 } uint16 MotherBrain_Instr_SpawnBombEproj(uint16 k) { // 0xA99EBD - uint16 *v2 = (uint16 *)RomPtr_A9(k); + const uint16 *v2 = (const uint16 *)RomPtr_A9(k); SpawnEnemyProjectileWithRoomGfx(addr_kEproj_MotherBrainBomb, *v2); return k + 2; } @@ -1701,7 +1673,8 @@ uint16 MotherBrain_Instr_SpawnLaserEproj(uint16 k) { // 0xA99F46 uint16 MotherBrain_Instr_SpawnRainbowEproj(uint16 k) { // 0xA99F84 uint16 v2; - printf("A undefined\n"); v2 = 0; + //printf("A undefined\n"); + v2 = 0; SpawnEnemyProjectileWithRoomGfx(addr_kEproj_MotherBrainRainbowBeamCharging, v2); return k; } @@ -1836,7 +1809,7 @@ void MotherBrain_GenerateExplosions(uint16 a) { // 0xA9B03E int v5 = v3 >> 1; R18_ = g_word_A9B099[v5]; R20_ = g_word_A9B099[v5 + 1]; - uint16 *v6 = (uint16 *)RomPtr_A9(R22_); + const uint16 *v6 = (const uint16 *)RomPtr_A9(R22_); uint16 v7 = *v6; uint16 Random = NextRandom(); if (Random >= 0x4000) { @@ -2104,7 +2077,7 @@ void MotherBrain_SamusCollDetect(void) { // 0xA9B3B6 uint8 MotherBrain_SamusCollDetectPart(uint16 k) { // 0xA9B455 int16 v5; - uint16 *v1 = (uint16 *)RomPtr_A9(k); + const uint16 *v1 = (const uint16 *)RomPtr_A9(k); if (!*v1) return 0; R22_ = *v1; @@ -2285,7 +2258,7 @@ void MotherBrain_Body_Phase2_TryAttack(void) { // 0xA9B64B if (abs16(E1->base.y_pos + 4 - samus_y_pos) < 0x20) v2 = addr_byte_A9B6DF; uint16 v4 = 0; - uint8 *v5 = RomPtr_A9(v2); + const uint8 *v5 = RomPtr_A9(v2); if ((uint8)random_number >= *v5) { v4 = 2; if ((uint8)random_number >= v5[1]) { @@ -2295,12 +2268,12 @@ void MotherBrain_Body_Phase2_TryAttack(void) { // 0xA9B64B } } uint16 v6 = g_off_A9B6D4[v4 >> 1]; - if (v6 == (uint16)addr_kMotherBrain_Ilist_9ECC) { + if (v6 == addr_kMotherBrain_Ilist_9ECC) { if (sign16(E1->mbn_var_05 - 1)) { E->mbn_var_A = FUNC16(MotherBrain_FiringBomb_DecideOnWalking); MotherBrain_FiringBomb_DecideOnWalking(); } - } else if (v6 == (uint16)addr_kMotherBrain_Ilist_9F34) { + } else if (v6 == addr_kMotherBrain_Ilist_9F34) { E->mbn_var_A = FUNC16(MotherBomb_FiringLaser_PositionHead); MotherBomb_FiringLaser_PositionHead(); } else { @@ -3452,7 +3425,7 @@ uint16 ComputeCosMult(uint16 a) { // 0xA9C465 } uint16 sub_A9C46C(uint16 a, uint16 j) { // 0xA9C46C - uint16 v2 = kSinCosTable8bit_Sext[((uint16)((2 * a) & 0x1FE) >> 1) + 64]; + uint16 v2 = kSinCosTable8bit_Sext[(a & 0xff) + 64]; WriteReg(M7A, v2); WriteReg(M7A, HIBYTE(v2)); WriteReg(M7B, j); @@ -3545,14 +3518,14 @@ uint8 ProcessSpriteTilesTransfers(uint8 db, uint16 k) { // 0xA9C5BE mbn_var_22 = k; uint16 v3 = mbn_var_22; uint16 v4 = vram_write_queue_tail; - uint8 *v5 = RomPtrWithBank(db, mbn_var_22); - uint16 v6 = *(uint16 *)v5; - if (*(uint16 *)v5) { + const uint8 *v5 = RomPtrWithBank(db, mbn_var_22); + uint16 v6 = GET_WORD(v5); + if (GET_WORD(v5)) { v7 = gVramWriteEntry(vram_write_queue_tail); v7->size = v6; - *(VoidP *)((char *)&v7->src.addr + 1) = *(uint16 *)(v5 + 3); - v7->src.addr = *((uint16 *)v5 + 1); - v7->vram_dst = *(uint16 *)(v5 + 5); + *(VoidP *)((char *)&v7->src.addr + 1) = GET_WORD(v5 + 3); + v7->src.addr = GET_WORD(v5 + 2); + v7->vram_dst = GET_WORD(v5 + 5); vram_write_queue_tail = v4 + 7; E->mbn_var_22 = v3 + 7; v6 = *(uint16 *)RomPtrWithBank(db, E->mbn_var_22); @@ -3919,7 +3892,7 @@ void ShitroidInCutscene_MoveToSamus(uint16 k) { // 0xA9C9C3 if ((random_number & 0xFFFu) >= 0xFA0) QueueSfx2_Max6(0x52u); uint16 sice_var_0E = E->sice_var_0E; - uint16 *v3 = (uint16 *)RomPtr_A9(sice_var_0E); + const uint16 *v3 = (const uint16 *)RomPtr_A9(sice_var_0E); R18_ = *v3; R20_ = v3[1]; R22_ = v3[3]; @@ -4266,7 +4239,7 @@ void ShitroidInCutscene_Shake(uint16 k) { // 0xA9CEDB void ShitroidInCutscene_Touch(void) { // 0xA9CF03 Enemy_ShitroidInCutscene *E = Get_ShitroidInCutscene(cur_enemy_index); - if (E->sice_var_A == (uint16)FUNC16(ShitroidInCutscene_LatchOntoSamus)) { + if (E->sice_var_A == FUNC16(ShitroidInCutscene_LatchOntoSamus)) { R18_ = samus_x_pos; R20_ = samus_y_pos - 20; if (Shitroid_AccelerateTowardsPoint(cur_enemy_index, 0x10) & 1) { @@ -4309,12 +4282,12 @@ void ShitroidInCutscene_UpdateSpeedAndAngle(uint16 k) { // 0xA9CF31 E->sice_var_C = Math_MultByCos(E->sice_var_0B); } -uint16 Shitroid_Instr_1(uint16 k, uint16 j) { // 0xA9CFB4 - return addr_kShitroid_Ilist_CFA2; +const uint16 *Shitroid_Instr_1(uint16 k, const uint16 *jp) { // 0xA9CFB4 + return INSTR_RETURN_ADDR(addr_kShitroid_Ilist_CFA2); } -uint16 Shitroid_Instr_2(uint16 k, uint16 j) { // 0xA9CFCA - return addr_kShitroid_Ilist_CFB8; +const uint16 *Shitroid_Instr_2(uint16 k, const uint16 *jp) { // 0xA9CFCA + return INSTR_RETURN_ADDR(addr_kShitroid_Ilist_CFB8); } void MotherBrain_Pal_ProcessInvincibility(void) { // 0xA9CFD4 @@ -4348,7 +4321,7 @@ void MotherBrain_Pal_EndScreenFlash(void) { // 0xA9D00C } void MotherBrain_Pal_HandleRoomPal(void) { // 0xA9D01C - uint16 j = HandleRoomPaletteInstructionList(ADDR16_OF_RAM(*enemy_ram7800) + 28); + uint16 j = HandleMotherBrainInstructionList(ADDR16_OF_RAM(*enemy_ram7800) + 28); if (j) MotherBrain_Pal_WriteRoomPal(j); } @@ -4359,41 +4332,39 @@ void MotherBrain_Pal_WriteRoomPal(uint16 j) { // 0xA9D025 WriteColorsToPalette(0xE6, 0xa9, j + 24, 12); } -uint16 HandleRoomPaletteInstructionList(uint16 a) { // 0xA9D192 - int16 v4; +typedef struct MotherBrainInstrExecState { + uint16 ip; + uint16 timer; +} MotherBrainInstrExecState; - R0_.addr = a; - R3_.addr = a + 2; - R0_.bank = 126; - R3_.bank = 126; - uint16 *v1 = (uint16 *)IndirPtr(&R0_, 0); - if ((*v1 & 0x8000) == 0) +uint16 HandleMotherBrainInstructionList(uint16 a) { // 0xA9D192 + MotherBrainInstrExecState *st = (MotherBrainInstrExecState *)&g_ram[a]; + if ((st->ip & 0x8000) == 0) return 0; - uint16 v3 = *v1; - v4 = *(uint16 *)RomPtr_A9(*v1); - if (v4 < 0) + uint16 v2 = st->ip; + const uint16 *v3 = (uint16 *)RomPtr_A6(v2); + if (sign16(v3[0])) goto LABEL_8; - if (v4 == *(uint16 *)IndirPtr(&R3_, 0)) { - for (v3 += 4; ; ) { - v4 = *(uint16 *)RomPtr_A9(v3); - if (!v4) - break; - if (v4 >= 0) { - IndirWriteWord(&R3_, 0, 1u); - IndirWriteWord(&R0_, 0, v3); - return *((uint16 *)RomPtr_A9(v3) + 1); - } + if (st->timer != v3[0]) { + st->timer++; + return v3[1]; + } + v2 += 4; + for (; ; ) { + v3 = (uint16 *)RomPtr_A6(v2); + if (!sign16(v3[0])) + break; LABEL_8: - R6_ = v4; - v3 = CallMotherBrainInstr((uint16)v4 | 0xA90000, v3 + 2); - } - IndirWriteWord(&R0_, 0, 0); - IndirWriteWord(&R3_, 0, 0); + v2 = CallMotherBrainInstr(v3[0] | 0xA90000, v2 + 2); + } + if (!v3[0]) { + st->ip = 0; + st->timer = 0; return 0; } else { - uint8 *v5 = IndirPtr(&R3_, 0); - IndirWriteWord(&R3_, 0, *(uint16 *)v5 + 1); - return *((uint16 *)RomPtr_A9(v3) + 1); + st->timer = 1; + st->ip = v2; + return v3[1]; } } @@ -4427,7 +4398,7 @@ void MotherBrain_HandleBrainPal(void) { // 0xA9D206 HIBYTE(E->mbn_var_D) = E->mbn_var_E; mbn_var_D = E->mbn_var_D; if (mbn_var_D - || Get_MotherBrain(0x40)->mbn_var_A == (uint16)FUNC16(MotherBrainsBrain_SetupBrainAndNeckToDraw)) { + || Get_MotherBrain(0x40)->mbn_var_A == FUNC16(MotherBrainsBrain_SetupBrainAndNeckToDraw)) { uint8 v4 = (mbn_var_D + 1) & 7; LOBYTE(E->mbn_var_D) = v4; uint16 v5 = 290; @@ -4561,31 +4532,32 @@ uint8 DeadTorizo_Func_0(void) { // 0xA9D443 Enemy_DeadTorizo *E = Get_DeadTorizo(0); R18_ = E->base.x_pos; R20_ = E->base.y_pos; - uint16 *v1 = (uint16 *)RomPtr_A9(addr_kDeadTorizo_Hitbox_D77C); + const uint16 *v1 = (const uint16 *)RomPtr_A9(addr_kDeadTorizo_Hitbox_D77C); if (!*v1) return 0; - R22_ = *v1; - for (int i = 0xd77c + 2; ; i += 8) { + int R22 = *v1; + for (int i = addr_kDeadTorizo_Hitbox_D77C + 2; ; i += 8) { + const uint8 *t = RomPtr_A9(i); if ((int16)(samus_y_pos - R20_) >= 0) { R24_ = samus_y_pos - R20_; - v3 = *((uint16 *)RomPtr_A9(i) + 3); + v3 = *((uint16 *)t + 3); } else { R24_ = R20_ - samus_y_pos; - v3 = *((uint16 *)RomPtr_A9(i) + 1); + v3 = *((uint16 *)t + 1); } if ((int16)(samus_y_radius + abs16(v3) - R24_) >= 0) { if ((int16)(samus_x_pos - R18_) >= 0) { R24_ = samus_x_pos - R18_; - v4 = *((uint16 *)RomPtr_A9(i) + 2); + v4 = *((uint16 *)t + 2); } else { R24_ = R18_ - samus_x_pos; - v4 = *(uint16 *)RomPtr_A9(i); + v4 = *(uint16 *)t; } v5 = samus_x_radius + abs16(v4) - R24_; if (v5 >= 0) break; } - if (!--R22_) + if (!--R22) return 0; } if (sign16(v5 - 4)) @@ -4974,7 +4946,7 @@ uint8 ProcessCorpseRotting(uint16 k) { // 0xA9DB12 uint16 *v6; while (1) { v15 = v4; - v5 = (int16 *)RomPtr_7E(dms_var_52); + v5 = (int16 *)(g_ram + dms_var_52); v6 = (uint16 *)v5; if (*v5 >= 0) break; @@ -4994,45 +4966,46 @@ LABEL_12: R18_ = E0->dms_var_42; if (v15 >= E0->dms_var_47) R18_ = E0->dms_var_43; - R20_ = E0->dms_var_44; - R22_ = 169; - CopyMoveCorpseRottingRotEntry(*v6); + + LongPtr r20; + r20.addr = E0->dms_var_44; + r20.bank = 169; + CopyMoveCorpseRottingRotEntry(r20, *v6); } goto LABEL_12; } Enemy_DeadMonsters *E = Get_DeadMonsters(0); R18_ = E->dms_var_43; - R20_ = E->dms_var_44; - R22_ = 169; - uint16 *v11 = (uint16 *)RomPtr_7E(dms_var_52); - CopyMoveCorpseRottingRotEntry(*v11); - uint16 v12 = *(uint16 *)RomPtr_7E(dms_var_52) + 2; + + LongPtr r20; + r20.addr = E->dms_var_44; + r20.bank = 169; + uint16 *v11 = (uint16 *)(g_ram + dms_var_52); + CopyMoveCorpseRottingRotEntry(r20, *v11); + uint16 v12 = *v11 + 2; if (v12 < E->dms_var_46) { -LABEL_11: - *(uint16 *)RomPtr_7E(dms_var_52) = v12; + *(uint16 *)v11 = v12; goto LABEL_12; } R18_ = E->dms_var_49; CallCorpseRottingFinish(R18_ | 0xA90000); if (v15 < Get_DeadMonsters(0)->dms_var_46) { - v12 = -1; - goto LABEL_11; + *(uint16 *)v11 = -1; + goto LABEL_12; } return 0; } -void CopyMoveCorpseRottingRotEntry(uint16 a) { // 0xA9DBE0 +void CopyMoveCorpseRottingRotEntry(LongPtr r20, uint16 a) { // 0xA9DBE0 Enemy_DeadMonsters *E = Get_DeadMonsters(0); E->dms_var_41 = a; uint16 v1 = (uint16)(a & 0xFFF8) >> 2; uint16 v2 = a & 7; - uint8 *v4 = IndirPtr(&R20_, v1); + uint16 v6 = IndirReadWord(r20, v1) + 2 * v2; if (v2 >= 6u) { - uint16 v6 = *(uint16 *)v4 + 2 * v2; CallCorpseRottingMove(R18_ | 0xA90000, E->dms_var_48 + v6, v6); } else { - uint16 v5 = *(uint16 *)v4 + 2 * v2; - CallCorpseRottingMove(R18_ | 0xA90000, v5, v5); + CallCorpseRottingMove(R18_ | 0xA90000, v6, v6); } } @@ -5045,57 +5018,53 @@ void CorpseRottingRotEntryFinishedHook(void) { // 0xA9DC08 QueueSfx2_Max3(0x10); } -void InitializeCorpseRottingDataTable(uint16 k, uint16 a) { // 0xA9DC40 +void InitializeCorpseRottingDataTable(uint16 *table, uint16 a) { // 0xA9DC40 int16 v2; - v2 = a - 1; R18_ = 0; do { - *(uint16 *)RomPtr_7E(k) = v2; - uint16 v3 = k + 2; - *(uint16 *)RomPtr_7E(v3) = R18_; - k = v3 + 2; + table[0] = v2; + table[1] = R18_; + table += 2; R18_ += 2; --v2; } while (v2 >= 0); } void InitializeEnemyCorpseRotting(uint16 k, uint16 j) { // 0xA9DC5F - uint8 *v2 = RomPtr_A9(j); + const uint8 *v2 = RomPtr_A9(j); Enemy_DeadMonsters *E = Get_DeadMonsters(k); - E->dms_var_52 = *(uint16 *)v2; - E->dms_var_53 = *((uint16 *)v2 + 1); - E->dms_var_54 = *((uint16 *)v2 + 2); - E->dms_var_55 = *((uint16 *)v2 + 3); - E->dms_var_5B = *((uint16 *)v2 + 7); - uint16 v4 = *((uint16 *)v2 + 6); + E->dms_var_52 = GET_WORD(v2); + E->dms_var_53 = GET_WORD(v2 + 2); + E->dms_var_54 = GET_WORD(v2 + 4); + E->dms_var_55 = GET_WORD(v2 + 6); + E->dms_var_5B = GET_WORD(v2 + 14); + uint16 v4 = GET_WORD(v2 + 12); E->dms_var_56 = v4; E->dms_var_5A = *((uint16 *)RomPtr_A9(v4) + 1) - 12; - uint16 *v5 = (uint16 *)RomPtr_A9(j); + uint16 *v5 = (uint16 *)v2; uint16 v6 = v5[4]; E->dms_var_57 = v6--; E->dms_var_58 = v6; E->dms_var_59 = v6 - 1; - InitializeCorpseRottingDataTable(*v5, v5[4]); + InitializeCorpseRottingDataTable((uint16*)(g_ram + *v5), v5[4]); R18_ = v5[5]; CallCorpseRottingInit(R18_ | 0xA90000); } void ProcessCorpseRottingVramTransfers(uint16 k) { // 0xA9DCB9 - VramWriteEntry *v3; - + const uint8 *p = RomPtr_A9(k); uint16 v1 = vram_write_queue_tail; - uint16 v2 = *(uint16 *)RomPtr_A9(k); + uint16 v2 = *(uint16 *)p; do { - v3 = gVramWriteEntry(v1); + VramWriteEntry *v3 = gVramWriteEntry(v1); v3->size = v2; - uint8 *v4 = RomPtr_A9(k); - *(VoidP *)((char *)&v3->src.addr + 1) = *((uint16 *)v4 + 1); - v3->src.addr = *((uint16 *)v4 + 2); - v3->vram_dst = *((uint16 *)v4 + 3); + *(VoidP *)((char *)&v3->src.addr + 1) = *((uint16 *)p + 1); + v3->src.addr = *((uint16 *)p + 2); + v3->vram_dst = *((uint16 *)p + 3); v1 += 7; - k += 8; - v2 = *(uint16 *)RomPtr_A9(k); + p += 8; + v2 = *(uint16 *)p; } while (v2); Get_DeadEnemy(0)->dey_var_22 = 0; vram_write_queue_tail = v1; @@ -5153,10 +5122,9 @@ void DeadSidehopper_Touch(void) { // 0xA9DD44 DeadSidehopper_DD31(); } -#define TILEMAP_ADDR(x) RomPtr_7E(0x2000 + x) void Torizo_CorpseRottingInitFunc(void) { // 0xA9DE18 - uint8 *p = RomPtr_B7(addr_kDeadTorizo_TileData); + const uint8 *p = RomPtr_B7(addr_kDeadTorizo_TileData); MemCpy(TILEMAP_ADDR(0x060), p + 288, 0xC0); MemCpy(TILEMAP_ADDR(0x1A0), p + 800, 0xC0); MemCpy(TILEMAP_ADDR(0x2C0), p + 1280, 0x100); @@ -5171,8 +5139,9 @@ void Torizo_CorpseRottingInitFunc(void) { // 0xA9DE18 MemCpy(TILEMAP_ADDR(0xDC0), p + 5824, 0x140); } + void Sidehopper_CorpseRottingInitFunc_0(void) { // 0xA9DEC1 - uint8 *p = RomPtr_B7(addr_kDeadMonsters_TileData); + const uint8 *p = kDeadMonsters_TileData; MemCpy(TILEMAP_ADDR(0x040), p + 64, 0x60); MemCpy(TILEMAP_ADDR(0x0A0), p + 512, 0xA0); MemCpy(TILEMAP_ADDR(0x140), p + 1024, 0xA0); @@ -5181,7 +5150,7 @@ void Sidehopper_CorpseRottingInitFunc_0(void) { // 0xA9DEC1 } void Sidehopper_CorpseRottingInitFunc_2(void) { // 0xA9DF08 - uint8 *p = RomPtr_B7(addr_kDeadMonsters_TileData); + const uint8 *p = kDeadMonsters_TileData; MemCpy(TILEMAP_ADDR(0x320), p + 288, 0x40); MemCpy(TILEMAP_ADDR(0x3C0), p + 800, 0xA0); MemCpy(TILEMAP_ADDR(0x460), p + 1312, 0xA0); @@ -5190,37 +5159,37 @@ void Sidehopper_CorpseRottingInitFunc_2(void) { // 0xA9DF08 } void Zoomer_CorpseRottingInitFunc_0(void) { // 0xA9DF4F - uint8 *p = RomPtr_B7(addr_kDeadMonsters_TileData); + const uint8 *p = kDeadMonsters_TileData; MemCpy(TILEMAP_ADDR(0x940), p + 2656, 0x60); MemCpy(TILEMAP_ADDR(0x9A0), p + 3168, 0x60); } void Zoomer_CorpseRottingInitFunc_2(void) { // 0xA9DF6C - uint8 *p = RomPtr_B7(addr_kDeadMonsters_TileData); + const uint8 *p = kDeadMonsters_TileData; MemCpy(TILEMAP_ADDR(0xA00), p + 2752, 0x60); MemCpy(TILEMAP_ADDR(0xA60), p + 3264, 0x60); } void Zoomer_CorpseRottingInitFunc_4(void) { // 0xA9DF89 - uint8 *p = RomPtr_B7(addr_kDeadMonsters_TileData); + const uint8 *p = kDeadMonsters_TileData; MemCpy(TILEMAP_ADDR(0xAC0), p + 2848, 0x60); MemCpy(TILEMAP_ADDR(0xB20), p + 3360, 0x60); } void Ripper_CorpseRottingInitFunc_0(void) { // 0xA9DFA6 - uint8 *p = RomPtr_B7(addr_kDeadMonsters_TileData); + const uint8 *p = kDeadMonsters_TileData; MemCpy(TILEMAP_ADDR(0xB80), p + 2560, 0x60); MemCpy(TILEMAP_ADDR(0xBE0), p + 3072, 0x60); } void Ripper_CorpseRottingInitFunc_2(void) { // 0xA9DFC3 - uint8 *p = RomPtr_B7(addr_kDeadMonsters_TileData); + const uint8 *p = kDeadMonsters_TileData; MemCpy(TILEMAP_ADDR(0xC40), p + 2944, 0x60); MemCpy(TILEMAP_ADDR(0xCA0), p + 3456, 0x60); } void Skree_CorpseRottingInitFunc_0(void) { // 0xA9DFE0 - uint8 *p = RomPtr_B7(addr_kDeadMonsters_TileData); + const uint8 *p = kDeadMonsters_TileData; MemCpy(TILEMAP_ADDR(0x640), p + 672, 0x40); MemCpy(TILEMAP_ADDR(0x680), p + 1184, 0x40); MemCpy(TILEMAP_ADDR(0x6C0), p + 1696, 0x40); @@ -5228,7 +5197,7 @@ void Skree_CorpseRottingInitFunc_0(void) { // 0xA9DFE0 } void Skree_CorpseRottingInitFunc_2(void) { // 0xA9E019 - uint8 *p = RomPtr_B7(addr_kDeadMonsters_TileData); + const uint8 *p = kDeadMonsters_TileData; MemCpy(TILEMAP_ADDR(0x740), p + 224, 0x40); MemCpy(TILEMAP_ADDR(0x780), p + 736, 0x40); MemCpy(TILEMAP_ADDR(0x7C0), p + 1248, 0x40); @@ -5236,7 +5205,7 @@ void Skree_CorpseRottingInitFunc_2(void) { // 0xA9E019 } void Skree_CorpseRottingInitFunc_4(void) { // 0xA9E052 - uint8 *p = RomPtr_B7(addr_kDeadMonsters_TileData); + const uint8 *p = kDeadMonsters_TileData; MemCpy(TILEMAP_ADDR(0x840), p + 448, 0x40); MemCpy(TILEMAP_ADDR(0x880), p + 960, 0x40); MemCpy(TILEMAP_ADDR(0x8C0), p + 1472, 0x40); @@ -5244,24 +5213,14 @@ void Skree_CorpseRottingInitFunc_4(void) { // 0xA9E052 } void MotherBrain_CorpseRottingInitFunc(void) { // 0xA9E08B - uint8 *v0 = RomPtr_7E(0x9000); - uint8 *v1 = RomPtr_B7(addr_kMotherBrain_Misc_TileData + 192); - MemCpy(v0, v1, 0xC0); - uint8 *v2 = RomPtr_7E(0x90E0); - uint8 *v3 = RomPtr_B7(addr_kMotherBrain_Misc_TileData + 704); - MemCpy(v2, v3, 0xC0); - uint8 *v4 = RomPtr_7E(0x91C0); - uint8 *v5 = RomPtr_B7(addr_kMotherBrain_Misc_TileData + 1216); - MemCpy(v4, v5, 0xC0); - uint8 *v6 = RomPtr_7E(0x92A0); - uint8 *v7 = RomPtr_B7(addr_kMotherBrain_Misc_TileData + 1728); - MemCpy(v6, v7, 0xC0); - uint8 *v8 = RomPtr_7E(0x9380); - uint8 *v9 = RomPtr_B7(addr_kMotherBrain_Misc_TileData + 2240); - MemCpy(v8, v9, 0xE0); - uint8 *v10 = RomPtr_7E(0x9460); - uint8 *v11 = RomPtr_B7(addr_kMotherBrain_Misc_TileData + 2752); - MemCpy(v10, v11, 0xE0); + uint8 *base = &g_ram[0x9000]; + const uint8 *src = RomPtr_B7(addr_kMotherBrain_Misc_TileData); + MemCpy(base, src + 192, 0xC0); + MemCpy(base + 0xe0, src + 704, 0xC0); + MemCpy(base + 0x1C0, src + 1216, 0xC0); + MemCpy(base + 0x2a0, src + 1728, 0xC0); + MemCpy(base + 0x380, src + 2240, 0xE0); + MemCpy(base + 0x460, src + 2752, 0xE0); } void Torizo_CorpseRottingMoveFunc(uint16 j, uint16 k) { // 0xA9E272 @@ -6027,13 +5986,13 @@ void MotherBrain_CorpseRottingCopyFunc(uint16 j, uint16 k) { // 0xA9EB0B } } -uint16 sub_A9ECD0(uint16 k, uint16 j) { // 0xA9ECD0 +const uint16 *sub_A9ECD0(uint16 k, const uint16 *jp) { // 0xA9ECD0 uint16 v2 = FUNC16(DeadMonsters_Func_1); Enemy_DeadMonsters *E = Get_DeadMonsters(k); if (E->dms_var_08) v2 = FUNC16(DeadMonsters_Func_5); E->dms_var_A = v2; - return j; + return jp; } uint8 Shitroid_Func_1(uint16 k, uint16 j) { // 0xA9EED1 @@ -6420,7 +6379,7 @@ void Shitroid_F3C4(uint16 k) { // 0xA9F3C4 } void Shitroid_Func_26(uint16 k) { // 0xA9F3CB - if (Get_Shitroid(k)->shitr_var_A == (uint16)FUNC16(Shitroid_Func_25)) + if (Get_Shitroid(k)->shitr_var_A == FUNC16(Shitroid_Func_25)) Shitroid_F3C4(k); } @@ -6720,7 +6679,7 @@ void Shitroid_Touch(void) { // 0xA9F789 E->shitr_var_B += v4; uint16 v6 = Math_MultByCos(0x40); E->shitr_var_C += v6; - } else if (E->shitr_var_A == (uint16)FUNC16(Shitroid_Func_14)) { + } else if (E->shitr_var_A == FUNC16(Shitroid_Func_14)) { R18_ = samus_x_pos; R20_ = samus_y_pos - 32; if (Shitroid_AccelerateTowardsPoint(cur_enemy_index, 0x200) & 1) { @@ -6733,7 +6692,7 @@ void Shitroid_Touch(void) { // 0xA9F789 E->shitr_var_C = 0; E->shitr_var_A = FUNC16(Shitroid_Func_15); } - } else if (E->shitr_var_A == (uint16)FUNC16(Shitroid_Func_13)) { + } else if (E->shitr_var_A == FUNC16(Shitroid_Func_13)) { E->shitr_var_A = FUNC16(Shitroid_Func_14); } } @@ -6757,21 +6716,21 @@ void Shitroid_Shot(void) { // 0xA9F842 } } -uint16 Shitroid_Instr_3(uint16 k, uint16 j) { // 0xA9F920 - return addr_kShitroid_Ilist_F90E; +const uint16 *Shitroid_Instr_3(uint16 k, const uint16 *jp) { // 0xA9F920 + return INSTR_RETURN_ADDR(addr_kShitroid_Ilist_F90E); } -uint16 Shitroid_Instr_4(uint16 k, uint16 j) { // 0xA9F936 - return addr_kShitroid_Ilist_F924; +const uint16 *Shitroid_Instr_4(uint16 k, const uint16 *jp) { // 0xA9F936 + return INSTR_RETURN_ADDR(addr_kShitroid_Ilist_F924); } -uint16 Shitroid_Instr_6(uint16 k, uint16 j) { // 0xA9F990 - return addr_kShitroid_Ilist_F93A; +const uint16 *Shitroid_Instr_6(uint16 k, const uint16 *jp) { // 0xA9F990 + return INSTR_RETURN_ADDR(addr_kShitroid_Ilist_F93A); } -uint16 Shitroid_Instr_5(uint16 k, uint16 j) { // 0xA9F994 +const uint16 *Shitroid_Instr_5(uint16 k, const uint16 *jp) { // 0xA9F994 if ((random_number & 0x8000) == 0) - return *(uint16 *)RomPtr_A9(j); + return INSTR_RETURN_ADDR(jp[0]); QueueSfx2_Max6(0x52u); - return j + 2; -} + return jp + 1; +} \ No newline at end of file diff --git a/src/sm_aa.c b/src/sm_aa.c index 9fabdf2..40628c1 100644 --- a/src/sm_aa.c +++ b/src/sm_aa.c @@ -4,6 +4,33 @@ #include "funcs.h" #include "enemy_types.h" + +#define g_off_AAC967 ((uint16*)RomFixedPtr(0xaac967)) +#define g_off_AAD810 ((uint16*)RomFixedPtr(0xaad810)) +#define g_word_AAD765 ((uint16*)RomFixedPtr(0xaad765)) +#define g_word_AAD785 ((uint16*)RomFixedPtr(0xaad785)) +#define g_off_AADF13 ((uint16*)RomFixedPtr(0xaadf13)) +#define g_off_AADF21 ((uint16*)RomFixedPtr(0xaadf21)) +#define kSine ((uint16*)RomFixedPtr(0xaae0bd)) +#define kCosine ((uint16*)RomFixedPtr(0xaae13d)) +#define kNegativeSine ((uint16*)RomFixedPtr(0xaae1bd)) +#define kNegativeCosine_0 ((uint16*)RomFixedPtr(0xaae23d)) +#define kNegativeCosine ((uint16*)RomFixedPtr(0xaae03d)) +#define g_off_AADD15 ((uint16*)RomFixedPtr(0xaadd15)) +#define g_word_AADE95 ((uint16*)RomFixedPtr(0xaade95)) +#define g_word_AADEA3 ((uint16*)RomFixedPtr(0xaadea3)) +#define g_word_AADEB1 ((uint16*)RomFixedPtr(0xaadeb1)) +#define g_off_AADEDB ((uint16*)RomFixedPtr(0xaadedb)) +#define g_word_AADEF7 ((uint16*)RomFixedPtr(0xaadef7)) +#define g_word_AADECD ((uint16*)RomFixedPtr(0xaadecd)) +#define g_word_AAE630 ((uint16*)RomFixedPtr(0xaae630)) +#define g_word_AAE670 ((uint16*)RomFixedPtr(0xaae670)) +#define g_word_AAE6B0 ((uint16*)RomFixedPtr(0xaae6b0)) +#define kN00bTubeCracks_Palette2 ((uint16*)RomFixedPtr(0xaae2dd)) +#define g_off_AAE7A2 ((uint16*)RomFixedPtr(0xaae7a2)) + + + static const uint16 g_word_AAB096 = 6; static const uint16 g_word_AAB098 = 5; static const uint16 g_word_AAB09A = 3; @@ -22,7 +49,6 @@ static const int16 g_word_AAC532[20] = { }; static const int16 g_word_AAC95F[2] = { 0xdb, 0x1a8 }; static const int16 g_word_AAC963[2] = { 0xb3, 0x90 }; -#define g_off_AAC967 ((uint16*)RomPtr(0xaac967)) static const int16 g_word_AAC96B[2] = { 0x2800, 0x2800 }; static const int16 g_word_AAC96F[2] = { 0x12, 0x12 }; static const int16 g_word_AAC973[2] = { 0x30, 0x29 }; @@ -41,29 +67,7 @@ static const int16 g_word_AAD59A[20] = { -5, 0, -5, -19, -16, -7, 0, -7, -17, -18, 5, 0, 5, 19, 16, 7, 0, 7, 17, 18, }; -#define g_off_AAD810 ((uint16*)RomPtr(0xaad810)) -#define g_word_AAD765 ((uint16*)RomPtr(0xaad765)) -#define g_word_AAD785 ((uint16*)RomPtr(0xaad785)) -#define g_off_AADF13 ((uint16*)RomPtr(0xaadf13)) -#define g_off_AADF21 ((uint16*)RomPtr(0xaadf21)) -#define kSine ((uint16*)RomPtr(0xaae0bd)) -#define kCosine ((uint16*)RomPtr(0xaae13d)) -#define kNegativeSine ((uint16*)RomPtr(0xaae1bd)) -#define kNegativeCosine_0 ((uint16*)RomPtr(0xaae23d)) -#define kNegativeCosine ((uint16*)RomPtr(0xaae03d)) -#define g_off_AADD15 ((uint16*)RomPtr(0xaadd15)) -#define g_word_AADE95 ((uint16*)RomPtr(0xaade95)) -#define g_word_AADEA3 ((uint16*)RomPtr(0xaadea3)) -#define g_word_AADEB1 ((uint16*)RomPtr(0xaadeb1)) -#define g_off_AADEDB ((uint16*)RomPtr(0xaadedb)) static const uint16 g_word_AADEE9[7] = { 0, 0x20, 0x60, 0xc0, 0x140, 0x1a0, 0x1e0 }; -#define g_word_AADEF7 ((uint16*)RomPtr(0xaadef7)) -#define g_word_AADECD ((uint16*)RomPtr(0xaadecd)) -#define g_word_AAE630 ((uint16*)RomPtr(0xaae630)) -#define g_word_AAE670 ((uint16*)RomPtr(0xaae670)) -#define g_word_AAE6B0 ((uint16*)RomPtr(0xaae6b0)) -#define kN00bTubeCracks_Palette2 ((uint16*)RomPtr(0xaae2dd)) -#define g_off_AAE7A2 ((uint16*)RomPtr(0xaae7a2)) static const uint16 kChozoStatue_Palette[16] = { 0x3800, 0x633f, 0x4a9f, 0x2ddf, 0x6739, 0x4e73, 0x318c, 0x18c6, 0x27ff, 0x1af7, 0xdce, 0xc6, 0x3fff, 0x2b39, 0x7fff, 0 }; static const int16 kChozoStatue_Palettes[16] = { 0x3800, 0x633f, 0x4a9f, 0x2ddf, 0x4210, 0x318c, 0x2108, 0x1084, @@ -86,74 +90,22 @@ void Enemy_NormalFrozenAI_AA(void) { // 0xAA8041 NormalEnemyFrozenAI(); } -uint16 Enemy_ClearAiPreInstr_AA(uint16 k, uint16 j) { // 0xAA8074 +const uint16 *Enemy_ClearAiPreInstr_AA(uint16 k, const uint16 *jp) { // 0xAA8074 gEnemyData(k)->ai_preinstr = FUNC16(nullsub_171_AA); - return j; + return jp; } -uint16 Enemy_SetAiPreInstr_AA(uint16 k, uint16 j) { // 0xAA806B - gEnemyData(k)->ai_preinstr = *(uint16 *)RomPtr_AA(j); - return j + 2; +const uint16 *Enemy_SetAiPreInstr_AA(uint16 k, const uint16 *jp) { // 0xAA806B + gEnemyData(k)->ai_preinstr = jp[0]; + return jp + 1; } -uint16 EnemyInstr_StopScript_AA(uint16 k, uint16 j) { // 0xAA807C - EnemyData *v2 = gEnemyData(k); - v2->properties |= kEnemyProps_Deleted; - return 0; +const uint16 *Torizo_Instr_3(uint16 k, const uint16 *jp) { // 0xAAB09C + Get_Torizo(k)->toriz_var_E = jp[0]; + return jp + 1; } -uint16 EnemyInstr_Goto_AA(uint16 k, uint16 j) { // 0xAA80ED - return *(uint16 *)RomPtr_AA(j); -} - -uint16 EnemyInstr_DecTimerAndGoto2_AA(uint16 k, uint16 j) { // 0xAA8110 - EnemyData *v2 = gEnemyData(k); - if (v2->timer-- == 1) - return j + 2; - else - return EnemyInstr_Goto_AA(k, j); -} - -uint16 EnemyInstr_SetTimer_AA(uint16 k, uint16 j) { // 0xAA8123 - uint16 v2 = *(uint16 *)RomPtr_AA(j); - gEnemyData(k)->timer = v2; - return j + 2; -} - -uint16 EnemyInstr_Sleep_AA(uint16 k, uint16 j) { // 0xAA812F - gEnemyData(k)->current_instruction = j - 2; - return 0; -} - -uint16 EnemyInstr_WaitNframes_AA(uint16 k, uint16 j) { // 0xAA813A - uint16 v2 = *(uint16 *)RomPtr_AA(j); - EnemyData *v3 = gEnemyData(k); - v3->instruction_timer = v2; - v3->current_instruction = j + 2; - return 0; -} - -uint16 EnemyInstr_CopyToVram_AA(uint16 k, uint16 j) { // 0xAA814B - VramWriteEntry *v4; - - uint16 v2 = vram_write_queue_tail; - uint8 *v3 = RomPtr_AA(j); - v4 = gVramWriteEntry(vram_write_queue_tail); - v4->size = *(uint16 *)v3; - v4->src.addr = *((uint16 *)v3 + 1); - *(VoidP *)((char *)&v4->src.addr + 1) = *(uint16 *)(v3 + 3); - v4->vram_dst = *(uint16 *)(v3 + 5); - vram_write_queue_tail = v2 + 7; - return j + 7; -} - -uint16 Torizo_Instr_3(uint16 k, uint16 j) { // 0xAAB09C - uint16 v2 = *(uint16 *)RomPtr_AA(j); - Get_Torizo(k)->toriz_var_E = v2; - return j + 2; -} - -uint16 Torizo_Instr_31(uint16 k, uint16 j) { // 0xAAB11D +const uint16 *Torizo_Instr_31(uint16 k, const uint16 *jp) { // 0xAAB11D Enemy_Torizo *E = Get_Torizo(k); E->toriz_parameter_2 = E->toriz_parameter_2 | 0x8000; SpawnEnemyProjectileWithGfx(0, k, addr_stru_86A95B); @@ -162,60 +114,60 @@ uint16 Torizo_Instr_31(uint16 k, uint16 j) { // 0xAAB11D SpawnEnemyProjectileWithGfx(0, k, addr_stru_86A95B); SpawnEnemyProjectileWithGfx(0, k, addr_stru_86A95B); SpawnEnemyProjectileWithGfx(0, k, addr_stru_86A95B); - return j; + return jp; } -uint16 Torizo_Instr_33(uint16 k, uint16 j) { // 0xAAB1BE +const uint16 *Torizo_Instr_33(uint16 k, const uint16 *jp) { // 0xAAB1BE Enemy_Torizo *E = Get_Torizo(k); E->toriz_parameter_2 |= 0x4000u; - return j; + return jp; } -uint16 Torizo_Instr_36(uint16 k, uint16 j) { // 0xAAB224 +const uint16 *Torizo_Instr_36(uint16 k, const uint16 *jp) { // 0xAAB224 Enemy_Torizo *E = Get_Torizo(k); E->base.properties &= ~kEnemyProps_Invisible; - return j; + return jp; } -uint16 Torizo_Instr_37(uint16 k, uint16 j) { // 0xAAB22E +const uint16 *Torizo_Instr_37(uint16 k, const uint16 *jp) { // 0xAAB22E Enemy_Torizo *E = Get_Torizo(k); E->base.properties |= kEnemyProps_Invisible; - return j; + return jp; } -uint16 Torizo_Instr_35(uint16 k, uint16 j) { // 0xAAB238 +const uint16 *Torizo_Instr_35(uint16 k, const uint16 *jp) { // 0xAAB238 for (int i = 30; i >= 0; i -= 2) { int v3 = i >> 1; target_palettes[v3 + 160] = 0; target_palettes[v3 + 144] = 0; } - return j; + return jp; } -uint16 Torizo_Instr_38(uint16 k, uint16 j) { // 0xAAB24D +const uint16 *Torizo_Instr_38(uint16 k, const uint16 *jp) { // 0xAAB24D SetBossBitForCurArea(4u); QueueMusic_Delayed8(g_word_AAB09A); if (area_index) Enemy_ItemDrop_GoldenTorizo(k); else Enemy_ItemDrop_BombTorizo(k); - return j; + return jp; } -uint16 Torizo_Instr_6(uint16 k, uint16 j) { // 0xAAB271 +const uint16 *Torizo_Instr_6(uint16 k, const uint16 *jp) { // 0xAAB271 sub_82DAF7(0x600u); - return j; + return jp; } -uint16 Torizo_Instr_5(uint16 k, uint16 j) { // 0xAAB94D +const uint16 *Torizo_Instr_5(uint16 k, const uint16 *jp) { // 0xAAB94D Torizo_C268(); - return j; + return jp; } -uint16 Torizo_Instr_9(uint16 k, uint16 j) { // 0xAAB951 +const uint16 *Torizo_Instr_9(uint16 k, const uint16 *jp) { // 0xAAB951 QueueMusic_Delayed8(g_word_AAB098); SpawnPalfxObject(addr_stru_8DF759); - return j; + return jp; } void Torizo_C20A(uint16 k) { // 0xAAC20A @@ -286,241 +238,237 @@ void Torizo_C2B0(void) { // 0xAAC2B0 } } -uint16 Torizo_Instr_7(uint16 k, uint16 j) { // 0xAAC2C8 - return j; +const uint16 *Torizo_Instr_7(uint16 k, const uint16 *jp) { // 0xAAC2C8 + return jp; } -uint16 Torizo_Instr_2(uint16 k, uint16 j) { // 0xAAC2C9 +const uint16 *Torizo_Instr_2(uint16 k, const uint16 *jp) { // 0xAAC2C9 Get_Torizo(k)->toriz_var_04 = 30583; - return j; + return jp; } -uint16 Torizo_Instr_8(uint16 k, uint16 j) { // 0xAAC2D1 +const uint16 *Torizo_Instr_8(uint16 k, const uint16 *jp) { // 0xAAC2D1 Get_Torizo(k)->toriz_var_04 = 0; - return j; + return jp; } -uint16 Torizo_Instr_25(uint16 k, uint16 j) { // 0xAAC2D9 +const uint16 *Torizo_Instr_25(uint16 k, const uint16 *jp) { // 0xAAC2D9 if ((Get_Torizo(k)->toriz_parameter_2 & 0x4000) != 0) - return *(uint16 *)RomPtr_AA(j); - j += 2; + return INSTR_RETURN_ADDR(jp[0]); if (area_index) - return *(uint16 *)RomPtr_AA(j); + return INSTR_RETURN_ADDR(jp[1]); else - return j + 2; + return jp + 2; } -uint16 Torizo_Instr_22(uint16 k, uint16 j) { // 0xAAC2ED - uint16 v2 = *(uint16 *)RomPtr_AA(j); - Get_Torizo(k)->toriz_var_00 = v2; - return j + 2; +const uint16 *Torizo_Instr_22(uint16 k, const uint16 *jp) { // 0xAAC2ED + Get_Torizo(k)->toriz_var_00 = jp[0]; + return jp + 1; } -uint16 Torizo_Instr_19(uint16 k, uint16 j) { // 0xAAC2F7 - return Get_Torizo(k)->toriz_var_00; +const uint16 *Torizo_Instr_19(uint16 k, const uint16 *jp) { // 0xAAC2F7 + return INSTR_RETURN_ADDR(Get_Torizo(k)->toriz_var_00); } -uint16 Torizo_Instr_32(uint16 k, uint16 j) { // 0xAAC2FD - return Get_Torizo(k)->toriz_var_01; +const uint16 *Torizo_Instr_32(uint16 k, const uint16 *jp) { // 0xAAC2FD + return INSTR_RETURN_ADDR(Get_Torizo(k)->toriz_var_01); } -uint16 Torizo_Instr_30(uint16 k, uint16 j) { // 0xAAC303 - uint16 a = *(uint16 *)RomPtr_AA(j); +const uint16 *Torizo_Instr_30(uint16 k, const uint16 *jp) { // 0xAAC303 + uint16 a = jp[0]; for (int i = 5; i >= 0; --i) SpawnEnemyProjectileWithRoomGfx(addr_kEproj_BombTorizoLowHealthExplode, a); Enemy_Torizo *E = Get_Torizo(k); - E->base.current_instruction = j + 2; + E->base.current_instruction = INSTR_ADDR_TO_PTR(k, jp + 1); E->base.flash_timer = 40; E->base.instruction_timer = 40; return 0; } -uint16 Torizo_Instr_34(uint16 k, uint16 j) { // 0xAAC32F - printf("A undefined\n"); +const uint16 *Torizo_Instr_34(uint16 k, const uint16 *jp) { // 0xAAC32F + //printf("A undefined\n"); SpawnEnemyProjectileWithRoomGfx(addr_kEproj_BombTorizoDeathExplosion, 0); Enemy_Torizo *E = Get_Torizo(k); - E->base.current_instruction = j; + E->base.current_instruction = INSTR_ADDR_TO_PTR(k, jp); E->base.flash_timer = 1; E->base.instruction_timer = 1; return 0; } -uint16 Torizo_Instr_24(uint16 k, uint16 j) { // 0xAAC34A - printf("A undefined\n"); +const uint16 *Torizo_Instr_24(uint16 k, const uint16 *jp) { // 0xAAC34A + //printf("A undefined\n"); SpawnEnemyProjectileWithRoomGfx(addr_kEproj_TourianLandingDustCloudsRightFoot, 0); SpawnEnemyProjectileWithRoomGfx(addr_stru_86AFF3, 0); - return j; + return jp; } -uint16 Torizo_Instr_12(uint16 k, uint16 j) { // 0xAAC35B +const uint16 *Torizo_Instr_12(uint16 k, const uint16 *jp) { // 0xAAC35B uint16 health = Get_Torizo(k)->base.health; if (health < 0x15Eu) SpawnEnemyProjectileWithGfx(health, k, addr_kEproj_BombTorizoLowHealthInitialDrool); - return j; + return jp; } -uint16 Torizo_Instr_10(uint16 k, uint16 j) { // 0xAAC36D +const uint16 *Torizo_Instr_10(uint16 k, const uint16 *jp) { // 0xAAC36D Enemy_Torizo *E = Get_Torizo(k); E->toriz_parameter_1 |= 0x4000u; - return j; + return jp; } -uint16 Torizo_Instr_11(uint16 k, uint16 j) { // 0xAAC377 +const uint16 *Torizo_Instr_11(uint16 k, const uint16 *jp) { // 0xAAC377 Enemy_Torizo *E = Get_Torizo(k); E->toriz_parameter_1 &= 0x1FFFu; ++E->toriz_var_09; - return j; + return jp; } -uint16 Torizo_Instr_29(uint16 k, uint16 j) { // 0xAAC38A +const uint16 *Torizo_Instr_29(uint16 k, const uint16 *jp) { // 0xAAC38A Enemy_Torizo *E = Get_Torizo(k); E->toriz_parameter_1 = E->toriz_parameter_1 & 0x1FFF | 0x8000; ++E->toriz_var_09; - return j; + return jp; } -uint16 Torizo_Instr_1(uint16 k, uint16 j) { // 0xAAC3A0 +const uint16 *Torizo_Instr_1(uint16 k, const uint16 *jp) { // 0xAAC3A0 Enemy_Torizo *E = Get_Torizo(k); E->toriz_parameter_1 = E->toriz_parameter_1 & 0x1FFF | 0x2000; ++E->toriz_var_09; - return j; + return jp; } -uint16 Torizo_Instr_28(uint16 k, uint16 j) { // 0xAAC3B6 +const uint16 *Torizo_Instr_28(uint16 k, const uint16 *jp) { // 0xAAC3B6 Enemy_Torizo *E = Get_Torizo(k); E->toriz_parameter_1 = E->toriz_parameter_1 & 0x1FFF | 0xA000; ++E->toriz_var_09; - return j; + return jp; } -uint16 Torizo_Instr_4(uint16 k, uint16 j) { // 0xAAC3CC - uint16 v2 = *(uint16 *)RomPtr_AA(j); +const uint16 *Torizo_Instr_4(uint16 k, const uint16 *jp) { // 0xAAC3CC + uint16 v2 = jp[0]; Enemy_Torizo *E = Get_Torizo(k); E->base.x_pos += g_word_AAC3EE[v2 >> 1]; E->base.y_pos += g_word_AAC40E[(uint8)(v2 & 0xF) >> 1]; - return j + 2; + return jp + 1; } -uint16 Torizo_Instr_40(uint16 k, uint16 j) { // 0xAAC41E - uint16 v2 = *(uint16 *)RomPtr_AA(j); +const uint16 *Torizo_Instr_40(uint16 k, const uint16 *jp) { // 0xAAC41E + uint16 v2 = jp[0]; Enemy_Torizo *E = Get_Torizo(k); E->base.x_pos -= g_word_AAC440[v2 >> 1]; E->base.y_pos -= g_word_AAC460[(uint8)(v2 & 0xF) >> 1]; - return j + 2; + return jp + 1; } -uint16 Torizo_Instr_16(uint16 k, uint16 j) { // 0xAAC470 +const uint16 *Torizo_Instr_16(uint16 k, const uint16 *jp) { // 0xAAC470 R18_ = 0; - R20_ = g_word_AAC4BD[*(uint16 *)RomPtr_AA(j) >> 1]; + R20_ = g_word_AAC4BD[jp[0] >> 1]; Enemy_Torizo *E = Get_Torizo(k); E->toriz_var_A = R20_; if (Enemy_MoveRight_IgnoreSlopes(k) & 1) { E->toriz_var_03 = 0; if ((E->toriz_parameter_1 & 0x8000u) != 0) - return addr_kTorizo_Ilist_B962; + return INSTR_RETURN_ADDR(addr_kTorizo_Ilist_B962); else - return addr_kTorizo_Ilist_BDD8; + return INSTR_RETURN_ADDR(addr_kTorizo_Ilist_BDD8); } else { EnemyFunc_C8AD(k); if (((E->toriz_parameter_1 ^ (samus_x_pos - E->base.x_pos)) & 0x8000u) == 0) { if (!E->toriz_var_03) E->toriz_var_03 = 72; - return j + 2; + return jp + 1; } else { - return j + 2; + return jp + 1; } } } -uint16 Torizo_Instr_27(uint16 k, uint16 j) { // 0xAAC4E5 +const uint16 *Torizo_Instr_27(uint16 k, const uint16 *jp) { // 0xAAC4E5 R18_ = 0; - R20_ = g_word_AAC532[*(uint16 *)RomPtr_AA(j) >> 1]; + R20_ = g_word_AAC532[jp[0] >> 1]; Enemy_Torizo *E = Get_Torizo(k); E->toriz_var_A = R20_; if (Enemy_MoveRight_IgnoreSlopes(k) & 1) { E->toriz_var_03 = 0; if ((E->toriz_parameter_1 & 0x8000u) != 0) - return addr_kTorizo_Ilist_BD0E; + return INSTR_RETURN_ADDR(addr_kTorizo_Ilist_BD0E); else - return addr_kTorizo_Ilist_C188; + return INSTR_RETURN_ADDR(addr_kTorizo_Ilist_C188); } else { EnemyFunc_C8AD(k); if (((E->toriz_parameter_1 ^ (samus_x_pos - E->base.x_pos)) & 0x8000u) == 0) { if (!E->toriz_var_03) E->toriz_var_03 = 72; - return j + 2; + return jp + 1; } else { - return j + 2; + return jp + 1; } } } -uint16 Torizo_Instr_23(uint16 k, uint16 j) { // 0xAAC55A +const uint16 *Torizo_Instr_23(uint16 k, const uint16 *jp) { // 0xAAC55A if ((Get_Torizo(k)->toriz_var_B & 0x8000u) != 0) - return *(uint16 *)RomPtr_AA(j); + return INSTR_RETURN_ADDR(jp[0]); else - return j + 2; + return jp + 1; } -uint16 Torizo_Instr_14(uint16 k, uint16 j) { // 0xAAC567 +const uint16 *Torizo_Instr_14(uint16 k, const uint16 *jp) { // 0xAAC567 if (CompareDistToSamus_X(k, 0x38) & 1) - return j + 2; + return jp + 1; Enemy_Torizo *E = Get_Torizo(k); if (((E->toriz_parameter_1 ^ (samus_x_pos - E->base.x_pos)) & 0x8000u) == 0) - return j + 2; - E->toriz_var_00 = j + 2; - return *(uint16 *)RomPtr_AA(j); + return jp + 1; + E->toriz_var_00 = INSTR_ADDR_TO_PTR(k, jp + 1); + return INSTR_RETURN_ADDR(jp[0]); } -uint16 Torizo_Instr_15(uint16 k, uint16 j) { // 0xAAC58B +const uint16 *Torizo_Instr_15(uint16 k, const uint16 *jp) { // 0xAAC58B if (CompareDistToSamus_X(k, 0x20) & 1 || (Torizo_Func_12(k) & 0x8000u) != 0) - return j + 2; + return jp + 1; Torizo_C22D(k); - return *(uint16 *)RomPtr_AA(j); + return INSTR_RETURN_ADDR(jp[0]); } -uint16 Torizo_Instr_26(uint16 k, uint16 j) { // 0xAAC5A4 - Get_Torizo(k)->toriz_var_00 = j + 4; +const uint16 *Torizo_Instr_26(uint16 k, const uint16 *jp) { // 0xAAC5A4 + Enemy_Torizo *E = Get_Torizo(k); + E->toriz_var_00 = INSTR_ADDR_TO_PTR(k, jp + 2); if (samus_missiles < 5u || ((nmi_frame_counter_word + (samus_x_pos & 1) + (samus_x_pos >> 1)) & 8) != 0) - return *(uint16 *)RomPtr_AA(j); + return INSTR_RETURN_ADDR(jp[0]); else - return *((uint16 *)RomPtr_AA(j) + 1); + return INSTR_RETURN_ADDR(jp[1]); } -uint16 Torizo_Instr_18(uint16 k, uint16 j) { // 0xAAC5CB - printf("A unknown\n"); +const uint16 *Torizo_Instr_18(uint16 k, const uint16 *jp) { // 0xAAC5CB + //printf("A unknown\n"); SpawnEnemyProjectileWithGfx(0, k, addr_kEproj_BombTorizosChozoOrbs); SpawnEnemyProjectileWithGfx(0, k, addr_kEproj_BombTorizosChozoOrbs); SpawnEnemyProjectileWithGfx(0, k, addr_kEproj_BombTorizosChozoOrbs); - return j; + return jp; } -uint16 Torizo_Instr_20(uint16 k, uint16 j) { // 0xAAC5E3 - uint16 *v2 = (uint16 *)RomPtr_AA(j); - SpawnEnemyProjectileWithGfx(*v2, k, addr_kEproj_BombTorizoSonicBoom); - return j + 2; +const uint16 *Torizo_Instr_20(uint16 k, const uint16 *jp) { // 0xAAC5E3 + SpawnEnemyProjectileWithGfx(jp[0], k, addr_kEproj_BombTorizoSonicBoom); + return jp + 1; } -uint16 Torizo_Instr_44(uint16 k, uint16 j) { // 0xAAC5F2 - uint16 *v2 = (uint16 *)RomPtr_AA(j); - SpawnEnemyProjectileWithGfx(*v2, k, addr_kEproj_GoldenTorizoSonicBoom); - return j + 2; +const uint16 *Torizo_Instr_44(uint16 k, const uint16 *jp) { // 0xAAC5F2 + SpawnEnemyProjectileWithGfx(jp[0], k, addr_kEproj_GoldenTorizoSonicBoom); + return jp + 1; } -uint16 Torizo_Instr_21(uint16 k, uint16 j) { // 0xAAC601 - uint16 *v2 = (uint16 *)RomPtr_AA(j); - SpawnEnemyProjectileWithRoomGfx(addr_kEproj_BombTorizoExplosiveSwipe, *v2); - return j + 2; +const uint16 *Torizo_Instr_21(uint16 k, const uint16 *jp) { // 0xAAC601 + SpawnEnemyProjectileWithRoomGfx(addr_kEproj_BombTorizoExplosiveSwipe, jp[0]); + return jp + 1; } -uint16 Torizo_Instr_17(uint16 k, uint16 j) { // 0xAAC610 +const uint16 *Torizo_Instr_17(uint16 k, const uint16 *jp) { // 0xAAC610 QueueSfx2_Max6(0x27u); - return j; + return jp; } -uint16 Torizo_Instr_13(uint16 k, uint16 j) { // 0xAAC618 +const uint16 *Torizo_Instr_13(uint16 k, const uint16 *jp) { // 0xAAC618 QueueSfx2_Max6(0x4Bu); - return j; + return jp; } void Torizo_C620(uint16 k) { // 0xAAC620 @@ -543,7 +491,7 @@ void Torizo_C643(uint16 k) { // 0xAAC643 torizo_var_B = E->toriz_var_B; if (torizo_var_B < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = torizo_var_B; + R19_ = torizo_var_B; if (Enemy_MoveDown(k) & 1) { v3 = E->toriz_var_B; if (v3 >= 0 && v3 != 256) { @@ -603,7 +551,7 @@ void Torizo_Func_4(uint16 k) { // 0xAAC6C6 Enemy_Torizo *E = Get_Torizo(k); E->base.properties |= kEnemyProps_Tangible; uint16 v2 = 78; - while (plm_header_ptr[v2 >> 1] != (uint16)addr_kPlmHeader_D6EA) { + while (plm_header_ptr[v2 >> 1] != addr_kPlmHeader_D6EA) { v2 -= 2; if ((v2 & 0x8000u) != 0) { QueueMusic_Delayed8(g_word_AAB096); @@ -719,7 +667,7 @@ void Torizo_Func_7(uint16 k) { // 0xAAC82C torizo_var_A = E->toriz_var_A; if (torizo_var_A < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = torizo_var_A; + R19_ = torizo_var_A; Enemy_MoveRight_IgnoreSlopes(k); EnemyFunc_C8AD(k); R18_ = 0; @@ -727,7 +675,7 @@ void Torizo_Func_7(uint16 k) { // 0xAAC82C torizo_var_B = E->toriz_var_B; if (torizo_var_B < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = torizo_var_B; + R19_ = torizo_var_B; if (Enemy_MoveDown(k) & 1) { E->base.current_instruction = E->toriz_var_00; E->base.instruction_timer = 1; @@ -817,67 +765,67 @@ void Torizo_Func_8(void) { // 0xAAC9C2 Torizo_D658(); } -uint16 Torizo_Instr_39(uint16 k, uint16 j) { // 0xAACACE +const uint16 *Torizo_Instr_39(uint16 k, const uint16 *jp) { // 0xAACACE if (Get_Torizo(k)->base.y_pos == 375) - return j + 2; + return jp + 1; else - return *(uint16 *)RomPtr_AA(j); + return INSTR_RETURN_ADDR(jp[0]); } -uint16 Torizo_Instr_41(uint16 k, uint16 j) { // 0xAACADE +const uint16 *Torizo_Instr_41(uint16 k, const uint16 *jp) { // 0xAACADE Torizo_C298(); - return j; + return jp; } -uint16 Torizo_Instr_42(uint16 k, uint16 j) { // 0xAACAE2 +const uint16 *Torizo_Instr_42(uint16 k, const uint16 *jp) { // 0xAACAE2 QueueMusic_Delayed8(5u); Enemy_Torizo *E = Get_Torizo(k); E->base.x_width = 18; E->base.y_height = 48; SpawnPalfxObject(addr_stru_8DF75D); - return j; + return jp; } -uint16 Torizo_Instr_48(uint16 k, uint16 j) { // 0xAACDD7 +const uint16 *Torizo_Instr_48(uint16 k, const uint16 *jp) { // 0xAACDD7 Enemy_Torizo *E = Get_Torizo(k); E->toriz_parameter_2 &= ~0x1000u; - return j; + return jp; } -uint16 Torizo_Instr_57(uint16 k, uint16 j) { // 0xAAD0E9 - printf("A unknown\n"); +const uint16 *Torizo_Instr_57(uint16 k, const uint16 *jp) { // 0xAAD0E9 + //printf("A unknown\n"); SpawnEnemyProjectileWithRoomGfx(addr_stru_86B1C0, 0); - return j; + return jp; } -uint16 Torizo_Instr_58(uint16 k, uint16 j) { // 0xAAD0F3 +const uint16 *Torizo_Instr_58(uint16 k, const uint16 *jp) { // 0xAAD0F3 int16 v2; v2 = 34; while (*(uint16 *)((char *)enemy_projectile_id + (uint16)v2) != 0xB1C0) { v2 -= 2; if (v2 < 0) - return j + 2; + return jp + 1; } - return *(uint16 *)RomPtr_AA(j); + return INSTR_RETURN_ADDR(jp[0]); } -uint16 Torizo_Instr_59(uint16 k, uint16 j) { // 0xAAD17B +const uint16 *Torizo_Instr_59(uint16 k, const uint16 *jp) { // 0xAAD17B Enemy_Torizo *E = Get_Torizo(k); E->toriz_var_06 &= ~0x8000u; - return j; + return jp; } -uint16 Torizo_Instr_62(uint16 k, uint16 j) { // 0xAAD187 +const uint16 *Torizo_Instr_62(uint16 k, const uint16 *jp) { // 0xAAD187 Enemy_Torizo *E = Get_Torizo(k); E->toriz_var_06 |= 0x8000u; - return j; + return jp; } -uint16 Torizo_Instr_63(uint16 k, uint16 j) { // 0xAAD1E7 +const uint16 *Torizo_Instr_63(uint16 k, const uint16 *jp) { // 0xAAD1E7 Enemy_Torizo *E = Get_Torizo(k); E->toriz_parameter_2 &= ~0x2000u; - return j; + return jp; } @@ -892,19 +840,19 @@ void GoldTorizo_Main(void) { // 0xAAD369 CallTorizoFunc(E->toriz_var_E | 0xAA0000, cur_enemy_index); } -uint16 Torizo_Instr_56(uint16 k, uint16 j) { // 0xAAD38F +const uint16 *Torizo_Instr_56(uint16 k, const uint16 *jp) { // 0xAAD38F QueueSfx2_Max6(0x34u); - return j; + return jp; } -uint16 Torizo_Instr_60(uint16 k, uint16 j) { // 0xAAD397 +const uint16 *Torizo_Instr_60(uint16 k, const uint16 *jp) { // 0xAAD397 QueueSfx2_Max6(0x67u); - return j; + return jp; } -uint16 Torizo_Instr_46(uint16 k, uint16 j) { // 0xAAD39F +const uint16 *Torizo_Instr_46(uint16 k, const uint16 *jp) { // 0xAAD39F QueueSfx2_Max6(0x48u); - return j; + return jp; } uint16 Torizo_Func_12(uint16 k) { // 0xAAD3A7 @@ -930,14 +878,14 @@ void GoldTorizo_Hurt(void) { // 0xAAD3BA } } -uint16 Torizo_Instr_47(uint16 k, uint16 j) { // 0xAAD3E0 +const uint16 *Torizo_Instr_47(uint16 k, const uint16 *jp) { // 0xAAD3E0 uint16 v2 = 0; - printf("A unknown\n"); + //printf("A unknown\n"); SpawnEnemyProjectileWithRoomGfx(addr_kEproj_GoldenTorizoSuperMissile, v2); - return j; + return jp; } -uint16 Torizo_Instr_49(uint16 k, uint16 j) { // 0xAAD3EA +const uint16 *Torizo_Instr_49(uint16 k, const uint16 *jp) { // 0xAAD3EA if ((Torizo_Func_12(k) & 0x8000u) == 0 || !(CompareDistToSamus_X(k, 4u) & 1) || CompareDistToSamus_X(k, 0x28) & 1 @@ -948,104 +896,103 @@ uint16 Torizo_Instr_49(uint16 k, uint16 j) { // 0xAAD3EA && samus_pose != kPose_7A_FaceL_Springball_Ground && samus_pose != kPose_7B_MoveR_Springball_Ground && samus_pose != kPose_7C_MoveL_Springball_Ground) { - return j + 2; + return jp + 1; } Get_Torizo(k)->toriz_var_09 = 0; - return *(uint16 *)RomPtr_AA(j); + return INSTR_RETURN_ADDR(jp[0]); } -uint16 Torizo_Instr_61(uint16 k, uint16 j) { // 0xAAD436 - uint16 *v2 = (uint16 *)RomPtr_AA(j); - SpawnEnemyProjectileWithRoomGfx(addr_kEproj_GoldenTorizoEyeBeam, *v2); - return j + 2; +const uint16 *Torizo_Instr_61(uint16 k, const uint16 *jp) { // 0xAAD436 + SpawnEnemyProjectileWithRoomGfx(addr_kEproj_GoldenTorizoEyeBeam, jp[0]); + return jp + 1; } -uint16 Torizo_Instr_53(uint16 k, uint16 j) { // 0xAAD445 +const uint16 *Torizo_Instr_53(uint16 k, const uint16 *jp) { // 0xAAD445 if ((Torizo_Func_12(k) & 0x8000u) != 0 || !(CompareDistToSamus_X(k, 0x20) & 1) || CompareDistToSamus_X(k, 0x60) & 1 || (NextRandom() & 0x110) != 0) { - return j + 2; + return jp + 1; } - Get_Torizo(k)->toriz_var_00 = j + 2; - return *(uint16 *)RomPtr_AA(j); + Get_Torizo(k)->toriz_var_00 = INSTR_ADDR_TO_PTR(k, jp + 1); + return INSTR_RETURN_ADDR(jp[0]); } -uint16 Torizo_Instr_55(uint16 k, uint16 j) { // 0xAAD474 +const uint16 *Torizo_Instr_55(uint16 k, const uint16 *jp) { // 0xAAD474 Enemy_Torizo *E = Get_Torizo(k); if (E->base.health > 0x788u || (NextRandom() & 0x102) != 0) - return j + 2; + return INSTR_RETURN_ADDR(jp + 1); E->toriz_var_09 = 0; - E->toriz_var_00 = j + 2; - return *(uint16 *)RomPtr_AA(j); + E->toriz_var_00 = INSTR_ADDR_TO_PTR(k, jp + 1); + return INSTR_RETURN_ADDR(jp[0]); } -uint16 Torizo_Instr_52(uint16 k, uint16 j) { // 0xAAD49B +const uint16 *Torizo_Instr_52(uint16 k, const uint16 *jp) { // 0xAAD49B Enemy_Torizo *E = Get_Torizo(k); if (E->base.health <= 0x2A30u || (E->toriz_parameter_2 & 0x2000) == 0) - return j + 2; - E->toriz_var_00 = j + 2; - return *(uint16 *)RomPtr_AA(j); + return jp + 1; + E->toriz_var_00 = INSTR_ADDR_TO_PTR(k, jp + 1); + return INSTR_RETURN_ADDR(jp[0]); } -uint16 Torizo_Instr_50(uint16 k, uint16 j) { // 0xAAD4BA +const uint16 *Torizo_Instr_50(uint16 k, const uint16 *jp) { // 0xAAD4BA if (!(CompareDistToSamus_X(k, 0x70) & 1)) - return j + 2; + return jp + 1; if ((Torizo_Func_12(k) & 0x8000u) != 0) - return j + 2; + return jp + 1; Enemy_Torizo *E = Get_Torizo(k); if (E->toriz_var_07 <= 0x168u && ((joypad1_lastkeys & 0x300) == 0 || (NextRandom() & 0x101) == 0)) - return j + 2; + return jp + 1; E->toriz_var_09 = 0; Torizo_C20A(k); - return *(uint16 *)RomPtr_AA(j); + return INSTR_RETURN_ADDR(jp[0]); } -uint16 Torizo_Instr_43(uint16 k, uint16 j) { // 0xAAD4F3 - uint16 v2; - printf("A unknown\n"); v2 = 0; +const uint16 *Torizo_Instr_43(uint16 k, const uint16 *jp) { // 0xAAD4F3 + uint16 v2 = 0; + //printf("A unknown\n"); v2 = 0; SpawnEnemyProjectileWithGfx(v2, k, addr_kEproj_GoldenTorizosChozoOrbs); - return j; + return jp; } -uint16 Torizo_Instr_51(uint16 k, uint16 j) { // 0xAAD4FD +const uint16 *Torizo_Instr_51(uint16 k, const uint16 *jp) { // 0xAAD4FD Enemy_Torizo *E = Get_Torizo(k); if (E->toriz_var_09 < 8u && (CompareDistToSamus_X(k, 0x20) & 1 || (Torizo_Func_12(k) & 0x8000u) != 0)) - return j + 2; + return jp + 1; E->toriz_var_09 = 0; Torizo_C22D(k); - return *(uint16 *)RomPtr_AA(j); + return INSTR_RETURN_ADDR(jp[0]); } -uint16 Torizo_Instr_45(uint16 k, uint16 j) { // 0xAAD526 - Get_Torizo(k)->toriz_var_00 = j + 4; +const uint16 *Torizo_Instr_45(uint16 k, const uint16 *jp) { // 0xAAD526 + Get_Torizo(k)->toriz_var_00 = INSTR_ADDR_TO_PTR(k, jp + 2); if (samus_missiles < 0x20u || (((uint8)nmi_frame_counter_word + (samus_x_pos & 1) + (uint8)(samus_x_pos >> 1)) & 8) != 0) { - return *(uint16 *)RomPtr_AA(j); + return INSTR_RETURN_ADDR(jp[0]); } else { - return *((uint16 *)RomPtr_AA(j) + 1); + return INSTR_RETURN_ADDR(jp[1]); } } -uint16 Torizo_Instr_54(uint16 k, uint16 j) { // 0xAAD54D +const uint16 *Torizo_Instr_54(uint16 k, const uint16 *jp) { // 0xAAD54D R18_ = 0; - R20_ = g_word_AAD59A[*(uint16 *)RomPtr_AA(j) >> 1]; + R20_ = g_word_AAD59A[jp[0] >> 1]; Enemy_Torizo *E = Get_Torizo(k); E->toriz_var_A = R20_; if (Enemy_MoveRight_IgnoreSlopes(k) & 1) { E->toriz_var_03 = 0; if ((E->toriz_parameter_1 & 0x8000u) != 0) - return addr_kTorizo_Ilist_D203; + return INSTR_RETURN_ADDR(addr_kTorizo_Ilist_D203); else - return addr_kTorizo_Ilist_D2BF; + return INSTR_RETURN_ADDR(addr_kTorizo_Ilist_D2BF); } else { EnemyFunc_C8AD(k); if (((E->toriz_parameter_1 ^ (samus_x_pos - E->base.x_pos)) & 0x8000u) == 0) { if (!E->toriz_var_03) E->toriz_var_03 = 16; - return j + 2; + return jp + 1; } else { - return j + 2; + return jp + 1; } } } @@ -1198,7 +1145,7 @@ void TourianEntranceStatue_Init(void) { // 0xAAD7C8 uint16 v1 = g_off_AAD810[v0->parameter_1 >> 1]; v0->current_instruction = v1; if (!v0->parameter_1) { - printf("A unknown\n"); +// printf("A unknown\n"); SpawnEnemyProjectileWithRoomGfx(addr_kEproj_TourianStatueBaseDecoration, 0); SpawnEnemyProjectileWithRoomGfx(addr_kEproj_TourianStatueRidley, 0); SpawnEnemyProjectileWithRoomGfx(addr_kEproj_TourianStatuePhantoon, 0); @@ -1210,29 +1157,29 @@ void TourianEntranceStatue_Init(void) { // 0xAAD7C8 } } -uint16 Shaktool_Instr_2(uint16 k, uint16 j) { // 0xAAD931 +const uint16 *Shaktool_Instr_2(uint16 k, const uint16 *jp) { // 0xAAD931 Enemy_Shaktool *E = Get_Shaktool(k); Enemy_Shaktool *EX = Get_Shaktool(E->shakt_var_E + 192); - return Shaktool_D956(k, j, EX->shakt_var_D ^ 0x80); + return Shaktool_D956(k, jp, EX->shakt_var_D ^ 0x80); } -uint16 Shaktool_Instr_3(uint16 k, uint16 j) { // 0xAAD93F +const uint16 *Shaktool_Instr_3(uint16 k, const uint16 *jp) { // 0xAAD93F Enemy_Shaktool *E = Get_Shaktool(k); Enemy_Shaktool *EX = Get_Shaktool(E->shakt_var_E + 192); - return Shaktool_D956(k, j, EX->shakt_var_D); + return Shaktool_D956(k, jp, EX->shakt_var_D); } -uint16 Shaktool_Instr_4(uint16 k, uint16 j) { // 0xAAD94A +const uint16 *Shaktool_Instr_4(uint16 k, const uint16 *jp) { // 0xAAD94A Enemy_Shaktool *E = Get_Shaktool(k); - return Shaktool_D956(k, j, *(uint16 *)((char *)&E->shakt_var_A + 1) ^ 0x80); + return Shaktool_D956(k, jp, *(uint16 *)((char *)&E->shakt_var_A + 1) ^ 0x80); } -uint16 Shaktool_Instr_5(uint16 k, uint16 j) { // 0xAAD953 +const uint16 *Shaktool_Instr_5(uint16 k, const uint16 *jp) { // 0xAAD953 Enemy_Shaktool *E = Get_Shaktool(k); - return Shaktool_D956(k, j, *(uint16 *)((char *)&E->shakt_var_A + 1)); + return Shaktool_D956(k, jp, *(uint16 *)((char *)&E->shakt_var_A + 1)); } -uint16 Shaktool_D956(uint16 k, uint16 j, uint16 a) { // 0xAAD956 +const uint16 *Shaktool_D956(uint16 k, const uint16 *jp, uint16 a) { // 0xAAD956 int16 v4; int16 v8; @@ -1242,7 +1189,7 @@ uint16 Shaktool_D956(uint16 k, uint16 j, uint16 a) { // 0xAAD956 v4 = kSinCosTable8bit_Sext[v3 + 64]; if (v4 < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = v4; + R19_ = v4; Enemy_Shaktool *E = Get_Shaktool(k); uint16 x_subpos = E->base.x_subpos; bool v7 = __CFADD__uint16(R18_, x_subpos); @@ -1253,26 +1200,26 @@ uint16 Shaktool_D956(uint16 k, uint16 j, uint16 a) { // 0xAAD956 v8 = kSinCosTable8bit_Sext[v3]; if (v8 < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = v8; + R19_ = v8; uint16 y_subpos = E->base.y_subpos; v7 = __CFADD__uint16(R18_, y_subpos); E->base.y_subpos = R18_ + y_subpos; E->base.y_pos += R20_ + v7; - return j; + return jp; } -uint16 Shaktool_Instr_6(uint16 k, uint16 j) { // 0xAAD99F - return j; +const uint16 *Shaktool_Instr_6(uint16 k, const uint16 *jp) { // 0xAAD99F + return jp; } void Shaktool_Func_2(uint16 k) { // 0xAAD9A0 - printf("A unknown!\n"); +// printf("A unknown!\n"); SpawnEnemyProjectileWithGfx(0, k, addr_kEproj_ShaktoolAttackFrontCircle); SpawnEnemyProjectileWithGfx(0, k, addr_kEproj_ShaktoolAttackMiddleCircle); SpawnEnemyProjectileWithGfx(0, k, addr_kEproj_ShaktoolAttackBackCircle); } -uint16 Shaktool_Instr_1(uint16 k, uint16 j) { // 0xAAD9BA +const uint16 *Shaktool_Instr_1(uint16 k, const uint16 *jp) { // 0xAAD9BA uint16 shakt_var_E = Get_Shaktool(k)->shakt_var_E; Get_Shaktool(shakt_var_E)->shakt_var_F = g_off_AADEDB[0]; Get_Shaktool(shakt_var_E + 64)->shakt_var_F = g_off_AADEDB[1]; @@ -1281,7 +1228,7 @@ uint16 Shaktool_Instr_1(uint16 k, uint16 j) { // 0xAAD9BA Get_Shaktool(shakt_var_E + 256)->shakt_var_F = g_off_AADEDB[4]; Get_Shaktool(shakt_var_E + 320)->shakt_var_F = g_off_AADEDB[5]; Get_Shaktool(shakt_var_E + 384)->shakt_var_F = g_off_AADEDB[6]; - return j; + return jp; } void Shaktool_DAE5(uint16 k) { // 0xAADAE5 @@ -1405,7 +1352,7 @@ void Shaktool_DC2A(uint16 k) { // 0xAADC2A v4 = kSine[v3]; if (v4 < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = v4; + R19_ = v4; int v5 = k >> 1; bool v6 = __CFADD__uint16(enemy_drawing_queue[v5 + 92], R18_); E->base.x_subpos = enemy_drawing_queue[v5 + 92] + R18_; @@ -1415,7 +1362,7 @@ void Shaktool_DC2A(uint16 k) { // 0xAADC2A v7 = kNegativeCosine[v3]; if (v7 < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = v7; + R19_ = v7; v6 = __CFADD__uint16(enemy_drawing_queue[v5 + 94], R18_); E->base.y_subpos = enemy_drawing_queue[v5 + 94] + R18_; E->base.y_pos = enemy_drawing_queue[v5 + 93] + v6 + R20_; @@ -1468,7 +1415,6 @@ void Shaktool_DCD7(uint16 k) { // 0xAADCD7 } void Shaktool_DD25(uint16 k) { // 0xAADD25 - char v6; // t0 int16 v7; Enemy_Shaktool *E = Get_Shaktool(k); @@ -1494,10 +1440,7 @@ void Shaktool_DD25(uint16 k) { // 0xAADD25 } E->shakt_var_D = 0; uint16 v5 = CalculateAngleOfEnemyXfromEnemyY(k, E->shakt_var_E); - v6 = v5; - LOBYTE(v5) = HIBYTE(v5); - HIBYTE(v5) = v6; - v7 = v5 & 0xFF00; + v7 = v5 << 8; uint16 v8; if ((E->shakt_parameter_1 & 0x8000u) != 0) v8 = v7 - 0x4000; @@ -1570,20 +1513,20 @@ void Shaktool_Shot(void) { // 0xAADF34 } } -uint16 Shaktool_Instr_9(uint16 k, uint16 j) { // 0xAAE429 +const uint16 *Shaktool_Instr_9(uint16 k, const uint16 *jp) { // 0xAAE429 fx_timer = 32; fx_y_vel = 64; - return j; + return jp; } -uint16 Shaktool_Instr_11(uint16 k, uint16 j) { // 0xAAE436 +const uint16 *Shaktool_Instr_11(uint16 k, const uint16 *jp) { // 0xAAE436 fx_base_y_pos = 722; - return j; + return jp; } -uint16 Shaktool_Instr_10(uint16 k, uint16 j) { // 0xAAE43D +const uint16 *Shaktool_Instr_10(uint16 k, const uint16 *jp) { // 0xAAE43D CallSomeSamusCode(1u); - return j; + return jp; } void sub_AAE445(uint16 k) { // 0xAAE445 @@ -1594,33 +1537,33 @@ void sub_AAE445(uint16 k) { // 0xAAE445 } } -uint16 Shaktool_Instr_8(uint16 k, uint16 j) { // 0xAAE57F +const uint16 *Shaktool_Instr_8(uint16 k, const uint16 *jp) { // 0xAAE57F QueueSfx2_Max6(0x1Cu); - return j; + return jp; } -uint16 Shaktool_Instr_13(uint16 k, uint16 j) { // 0xAAE587 +const uint16 *Shaktool_Instr_13(uint16 k, const uint16 *jp) { // 0xAAE587 QueueSfx2_Max6(0x4Bu); - return j; + return jp; } -uint16 Shaktool_Instr_12(uint16 k, uint16 j) { // 0xAAE58F +const uint16 *Shaktool_Instr_12(uint16 k, const uint16 *jp) { // 0xAAE58F Enemy_Shaktool *e = Get_Shaktool(k); - uint16 arg = *(uint16 *)RomPtr_AA(j); + uint16 arg = jp[0]; CalculateBlockContainingPixelPos(e->base.x_pos + arg, e->base.y_pos + 28); if ((level_data[room_width_in_blocks + cur_block_index] & 0xF000) == 0xA000) { SpawnPLM(addr_kPlmHeader_D113); SpawnEnemyProjectileWithRoomGfx(addr_kEproj_WreckedShipChozoSpikeFootsteps_1, arg); } - return j + 2; + return jp + 1; } -uint16 Shaktool_Instr_7(uint16 k, uint16 j) { // 0xAAE5D8 +const uint16 *Shaktool_Instr_7(uint16 k, const uint16 *jp) { // 0xAAE5D8 int16 v4; int16 v5; - uint16 v2 = *(uint16 *)RomPtr_AA(j); + uint16 v2 = jp[0]; Enemy_Shaktool *E = Get_Shaktool(k); E->shakt_var_C = v2; R18_ = 0; @@ -1628,23 +1571,23 @@ uint16 Shaktool_Instr_7(uint16 k, uint16 j) { // 0xAAE5D8 v4 = g_word_AAE630[E->shakt_var_C >> 1]; if (v4 < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = v4; + R19_ = v4; Enemy_MoveRight_IgnoreSlopes(k); R18_ = 0; R20_ = 0; v5 = abs16(g_word_AAE630[E->shakt_var_C >> 1]); if (v5 < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = v5; + R19_ = v5; Enemy_MoveDown(k); EnemyFunc_C8AD(k); int v6 = E->shakt_var_C >> 1; samus_x_pos = g_word_AAE670[v6] + E->base.x_pos; samus_y_pos = g_word_AAE6B0[v6] + E->base.y_pos; - return j + 2; + return jp + 1; } -uint16 Shaktool_Instr_14(uint16 k, uint16 j) { // 0xAAE6F0 +const uint16 *Shaktool_Instr_14(uint16 k, const uint16 *jp) { // 0xAAE6F0 CallSomeSamusCode(1u); *(uint16 *)&scrolls[6] = 0; *(uint16 *)&scrolls[8] = 0; @@ -1652,7 +1595,7 @@ uint16 Shaktool_Instr_14(uint16 k, uint16 j) { // 0xAAE6F0 *(uint16 *)&scrolls[13] = 1; static const SpawnHardcodedPlmArgs unk_AAE711 = { 0x17, 0x1d, 0xd6fc }; SpawnHardcodedPlm(&unk_AAE711); - return j; + return jp; } void N00bTubeCracks_Init(void) { // 0xAAE716 @@ -1713,4 +1656,4 @@ void Shaktool_PreInstr_0(uint16 k) { // 0xAAE7AE E->shakt_var_B = 256; } } -} +} \ No newline at end of file diff --git a/src/sm_ad.c b/src/sm_ad.c index c79ab88..cd153f3 100644 --- a/src/sm_ad.c +++ b/src/sm_ad.c @@ -3,6 +3,18 @@ #include "funcs.h" #include "enemy_types.h" + +#define kMotherBrain_HealthBasedPalettes_Brain ((uint16*)RomFixedPtr(0xade6a2)) +#define kMotherBrain_HealthBasedPalettes_BackLeg ((uint16*)RomFixedPtr(0xade742)) +#define kMotherBrain_FadePalToBlack ((uint16*)RomFixedPtr(0xade9e8)) +#define kMotherBrain_TransitionToFromGrey_Incr ((uint16*)RomFixedPtr(0xaded8a)) +#define kMotherBrain_TransitionToFromGrey_Decr ((uint16*)RomFixedPtr(0xaded9c)) +#define kMotherBrain_FadeToGray_Drained ((uint16*)RomFixedPtr(0xadef87)) +#define kMotherBrain_FadeToGray_RealDeath ((uint16*)RomFixedPtr(0xadf107)) +#define kMotherBrain_Phase3_TurnLightsBackOn ((uint16*)RomFixedPtr(0xadf273)) + + + void nullsub_341(void) {} static Func_V *const funcs_BE56D[16] = { @@ -12,14 +24,6 @@ static Func_V *const funcs_BE56D[16] = { MotherBrain_CalcHdma_Down, 0, 0, MotherBrain_CalcHdma_Down, }; -#define kMotherBrain_HealthBasedPalettes_Brain ((uint16*)RomPtr(0xade6a2)) -#define kMotherBrain_HealthBasedPalettes_BackLeg ((uint16*)RomPtr(0xade742)) -#define kMotherBrain_FadePalToBlack ((uint16*)RomPtr(0xade9e8)) -#define kMotherBrain_TransitionToFromGrey_Incr ((uint16*)RomPtr(0xaded8a)) -#define kMotherBrain_TransitionToFromGrey_Decr ((uint16*)RomPtr(0xaded9c)) -#define kMotherBrain_FadeToGray_Drained ((uint16*)RomPtr(0xadef87)) -#define kMotherBrain_FadeToGray_RealDeath ((uint16*)RomPtr(0xadf107)) -#define kMotherBrain_Phase3_TurnLightsBackOn ((uint16*)RomPtr(0xadf273)) void MotherBrain_CalcHdma(void) { // 0xADDE00 @@ -59,43 +63,38 @@ void MotherBrain_CalcHdma_BeamAimedRight(void) { // 0xADDECE hdma_table_2[0] = 255; hdma_table_2[1] = 255; Enemy_MotherBrain *E = Get_MotherBrain(0); - R18_ = kTanTable[(uint16)(2 * LOBYTE(E->mbn_var_3A)) >> 1]; - R20_ = kTanTable[(uint16)(2 * LOBYTE(E->mbn_var_3B)) >> 1]; + R18_ = kTanTable[LOBYTE(E->mbn_var_3A)]; + R20_ = kTanTable[LOBYTE(E->mbn_var_3B)]; uint16 mbn_var_3F = E->mbn_var_3F; - uint16 v2 = 2 * (mbn_var_3F - 32) - 25342; - uint8 *v3 = RomPtr_7E(v2); - *((uint16 *)v3 + 1) = 255; - *((uint16 *)v3 + 2) = 255; - uint16 v8 = v2; + uint16 *v2 = hdma_table_2 + (mbn_var_3F - 32) + 1; + v2[1] = 255; + v2[2] = 255; + uint16 *v8 = v2; do { uint16 v4 = R20_ + R24_; if (__CFADD__uint16(R20_, R24_)) break; R24_ += R20_; - *(uint16 *)RomPtr_7E(v2) = HIBYTE(v4) | 0xFF00; - v2 -= 2; + *v2-- = HIBYTE(v4) | 0xFF00; --mbn_var_3F; } while (mbn_var_3F != 32); do { - *(uint16 *)RomPtr_7E(v2) = 255; - v2 -= 2; + *v2-- = 255; --mbn_var_3F; } while (mbn_var_3F != 32); - uint16 v5 = v8 + 2; + uint16 *v5 = v8 + 1; uint16 var_3F = gRam8000_Default(0)->var_3F; while (1) { uint16 v7 = R18_ + R22_; if (__CFADD__uint16(R18_, R22_)) break; R22_ += R18_; - *(uint16 *)RomPtr_7E(v5) = HIBYTE(v7) | 0xFF00; - v5 += 2; + *v5++ = HIBYTE(v7) | 0xFF00; if (++var_3F == 232) return; } do { - *(uint16 *)RomPtr_7E(v5) = 255; - v5 += 2; + *v5++ = 255; ++var_3F; } while (var_3F != 232); } @@ -141,112 +140,85 @@ void MotherBrain_CalcHdma_BeamAimedUp(void) { } void MotherBrain_CalcHdma_Up_UpRight(void) { // 0xADE02C - char v6; // t0 - int16 v8; - hdma_table_2[0] = 255; hdma_table_2[1] = 255; Enemy_MotherBrain *E = Get_MotherBrain(0); - R18_ = kTanTable[(uint16)(2 * LOBYTE(E->mbn_var_3B)) >> 1]; - R20_ = kTanTable[(uint16)(2 * LOBYTE(E->mbn_var_3A)) >> 1]; + R18_ = kTanTable[LOBYTE(E->mbn_var_3B)]; + R20_ = kTanTable[LOBYTE(E->mbn_var_3A)]; uint16 mbn_var_3D = E->mbn_var_3D; - uint16 v2 = 2 * (mbn_var_3D - 32) - 25342; - uint8 *v3 = RomPtr_7E(v2); - *((uint16 *)v3 + 1) = 255; - *((uint16 *)v3 + 2) = 255; + uint16 *v2 = hdma_table_2 + (mbn_var_3D - 32) + 1; + v2[1] = 255; + v2[2] = 255; do { uint16 v4 = R18_ + R22_; if (__CFADD__uint16(R18_, R22_)) v4 = -1; R22_ = v4; - uint16 v5 = v4 & 0xFF00; - v6 = v5; - LOBYTE(v5) = HIBYTE(v5); - HIBYTE(v5) = v6; - R36 = v5; + R36 = (v4 >> 8) & 0xff; uint16 v7 = R20_ + R24_; if (__CFADD__uint16(R20_, R24_)) v7 = -1; R24_ = v7; - v8 = R36 | v7 & 0xFF00; - if (v8 == -1) + uint16 v8 = R36 | v7 & 0xFF00; + if (v8 == 0xffff) v8 = 255; - *(uint16 *)RomPtr_7E(v2) = v8; - v2 -= 2; + *v2-- = v8; --mbn_var_3D; } while (mbn_var_3D != 32); } void MotherBrain_CalcHdma_Up_Up(void) { // 0xADE0A6 - char v6; // t0 - int16 v8; - hdma_table_2[0] = 255; hdma_table_2[1] = 255; Enemy_MotherBrain *E = Get_MotherBrain(0); R18_ = kTanTable[(uint8)-LOBYTE(E->mbn_var_3B)]; - R20_ = kTanTable[(uint16)(2 * LOBYTE(E->mbn_var_3A)) >> 1]; + R20_ = kTanTable[LOBYTE(E->mbn_var_3A)]; uint16 mbn_var_3D = E->mbn_var_3D; - uint16 v2 = 2 * (mbn_var_3D - 32) - 25342; - uint8 *v3 = RomPtr_7E(v2); - *((uint16 *)v3 + 1) = 255; - *((uint16 *)v3 + 2) = 255; + uint16 *v2 = hdma_table_2 + (mbn_var_3D - 32) + 1; + v2[1] = 255; + v2[2] = 255; do { uint16 v4 = R22_ - R18_; if (R22_ < R18_) v4 = 0; R22_ = v4; - uint16 v5 = v4 & 0xFF00; - v6 = v5; - LOBYTE(v5) = HIBYTE(v5); - HIBYTE(v5) = v6; - R26_ = v5; + R26_ = (uint8)(v4 >> 8); uint16 v7 = R20_ + R24_; if (__CFADD__uint16(R20_, R24_)) v7 = -1; R24_ = v7; - v8 = R26_ | v7 & 0xFF00; - if (v8 == -1) + uint16 v8 = R26_ | v7 & 0xFF00; + if (v8 == 0xffff) v8 = 255; - *(uint16 *)RomPtr_7E(v2) = v8; - v2 -= 2; + *v2-- = v8; --mbn_var_3D; } while (mbn_var_3D != 32); } void MotherBrain_CalcHdma_Up_UpLeft(void) { // 0xADE124 - char v6; // t0 - int16 v8; - hdma_table_2[0] = 255; hdma_table_2[1] = 255; Enemy_MotherBrain *E = Get_MotherBrain(0); R18_ = kTanTable[(uint8)-LOBYTE(E->mbn_var_3B)]; R20_ = kTanTable[(uint8)-LOBYTE(E->mbn_var_3A)]; uint16 mbn_var_3D = E->mbn_var_3D; - uint16 v2 = 2 * (mbn_var_3D - 32) - 25342; - uint8 *v3 = RomPtr_7E(v2); - *((uint16 *)v3 + 1) = 255; - *((uint16 *)v3 + 2) = 255; + uint16 *v2 = hdma_table_2 + (mbn_var_3D - 32) + 1; + v2[1] = 255; + v2[2] = 255; do { uint16 v4 = R22_ - R18_; if (R22_ < R18_) v4 = 0; R22_ = v4; - uint16 v5 = v4 & 0xFF00; - v6 = v5; - LOBYTE(v5) = HIBYTE(v5); - HIBYTE(v5) = v6; - R36 = v5; + R36 = v4 >> 8; uint16 v7 = R24_ - R20_; if (R24_ < R20_) v7 = 0; R24_ = v7; - v8 = R36 | v7 & 0xFF00; - if (v8 == -1) + uint16 v8 = R36 | v7 & 0xFF00; + if (v8 == 0xffff) v8 = 255; - *(uint16 *)RomPtr_7E(v2) = v8; - v2 -= 2; + *v2-- = v8; --mbn_var_3D; } while (mbn_var_3D != 32); } @@ -271,124 +243,92 @@ void MotherBrain_CalcHdma_Down(void) { // 0xADE1A6 } void MotherBrain_CalcHdma_Down_DownRight(void) { // 0xADE216 - int16 v1; - char v6; // t0 - int16 v8; - hdma_table_2[0] = 255; hdma_table_2[1] = 255; Enemy_MotherBrain *E = Get_MotherBrain(0); - R18_ = kTanTable[(uint16)(2 * LOBYTE(E->mbn_var_3A)) >> 1]; - R20_ = kTanTable[(uint16)(2 * LOBYTE(E->mbn_var_3B)) >> 1]; - v1 = E->mbn_var_3D - 32; - uint16 v2 = 0x9D04; + R18_ = kTanTable[LOBYTE(E->mbn_var_3A)]; + R20_ = kTanTable[LOBYTE(E->mbn_var_3B)]; + uint16 v1 = E->mbn_var_3D - 32; + uint16 *dst = hdma_table_2 + 1; do { - *(uint16 *)RomPtr_7E(v2) = 255; - v2 += 2; - --v1; - } while (v1); + *dst++ = 255; + } while (--v1); uint16 mbn_var_3D = Get_MotherBrain(0)->mbn_var_3D; do { uint16 v4 = R18_ + R22_; if (__CFADD__uint16(R18_, R22_)) v4 = -1; R22_ = v4; - uint16 v5 = v4 & 0xFF00; - v6 = v5; - LOBYTE(v5) = HIBYTE(v5); - HIBYTE(v5) = v6; - R26_ = v5; + R26_ = v4 >> 8; uint16 v7 = R20_ + R24_; if (__CFADD__uint16(R20_, R24_)) v7 = -1; R24_ = v7; - v8 = R26_ | v7 & 0xFF00; + uint16 v8 = R26_ | v7 & 0xFF00; if (v8 == -1) v8 = 255; - *(uint16 *)RomPtr_7E(v2) = v8; - v2 += 2; + *dst++ = v8; ++mbn_var_3D; } while (mbn_var_3D != 232); } void MotherBrain_CalcHdma_Down_Down(void) { // 0xADE293 - int16 v1; - char v6; // t0 - int16 v8; - hdma_table_2[0] = 255; hdma_table_2[1] = 255; Enemy_MotherBrain *E = Get_MotherBrain(0); R18_ = kTanTable[(uint8)-LOBYTE(E->mbn_var_3A)]; - R20_ = kTanTable[(uint16)(2 * LOBYTE(E->mbn_var_3B)) >> 1]; - v1 = E->mbn_var_3D - 32; - uint16 v2 = -25340; + R20_ = kTanTable[LOBYTE(E->mbn_var_3B)]; + uint16 v1 = E->mbn_var_3D - 32; + uint16 *dst = hdma_table_2 + 1; do { - *(uint16 *)RomPtr_7E(v2) = 255; - v2 += 2; - --v1; - } while (v1); + *dst++ = 255; + } while (--v1); uint16 mbn_var_3D = Get_MotherBrain(0)->mbn_var_3D; do { uint16 v4 = R22_ - R18_; if (R22_ < R18_) v4 = 0; R22_ = v4; - uint16 v5 = v4 & 0xFF00; - v6 = v5; - LOBYTE(v5) = HIBYTE(v5); - HIBYTE(v5) = v6; - R26_ = v5; + R26_ = v4 >> 8; uint16 v7 = R20_ + R24_; if (__CFADD__uint16(R20_, R24_)) v7 = -1; R24_ = v7; - v8 = R26_ | v7 & 0xFF00; - if (v8 == -1) + uint16 v8 = R26_ | v7 & 0xFF00; + if (v8 == 0xffff) v8 = 255; - *(uint16 *)RomPtr_7E(v2) = v8; - v2 += 2; + *dst++ = v8; ++mbn_var_3D; } while (mbn_var_3D != 232); } void MotherBrain_CalcHdma_Down_DownLeft(void) { // 0xADE314 - int16 v1; - char v6; // t0 - int16 v8; - hdma_table_2[0] = 255; hdma_table_2[1] = 255; Enemy_MotherBrain *E = Get_MotherBrain(0); R18_ = kTanTable[(uint8)-LOBYTE(E->mbn_var_3A)]; R20_ = kTanTable[(uint8)-LOBYTE(E->mbn_var_3B)]; - v1 = E->mbn_var_3D - 32; - uint16 v2 = -25340; + uint16 v1 = E->mbn_var_3D - 32; + uint16 *dst = hdma_table_2 + 1; do { - *(uint16 *)RomPtr_7E(v2) = 255; - v2 += 2; - --v1; - } while (v1); + *dst++ = 255; + } while (--v1); uint16 mbn_var_3D = Get_MotherBrain(0)->mbn_var_3D; do { uint16 v4 = R22_ - R18_; if (R22_ < R18_) v4 = 0; R22_ = v4; - uint16 v5 = v4 & 0xFF00; - v6 = v5; - LOBYTE(v5) = HIBYTE(v5); - HIBYTE(v5) = v6; + uint16 v5 = v4 >> 8; R26_ = v5; uint16 v7 = R24_ - R20_; if (R24_ < R20_) v7 = 0; R24_ = v7; - v8 = R26_ | v7 & 0xFF00; + uint16 v8 = R26_ | v7 & 0xFF00; if (!v8) v8 = 255; - *(uint16 *)RomPtr_7E(v2) = v8; - v2 += 2; + *dst++ = v8; ++mbn_var_3D; } while (mbn_var_3D != 232); } @@ -458,8 +398,6 @@ uint8 MotherBrain_EEF6(uint16 a) { // 0xADEEF6 } uint8 MotherBrain_FadeFromGray_Drained(uint16 a) { // 0xADEF0D - int16 v3; - int v1 = a; if (!kMotherBrain_TransitionToFromGrey_Decr[v1]) return 1; @@ -467,14 +405,11 @@ uint8 MotherBrain_FadeFromGray_Drained(uint16 a) { // 0xADEF0D WriteColorsToPalette(0x82, 0xad, j, 13); WriteColorsToPalette(0x122, 0xad, j, 13); WriteColorsToPalette(0x168, 0xad, j + 26, 5); - v3 = *(uint16 *)RomPtr_AD(j + 36); - *(uint16 *)&g_ram[0x17C] = v3; + *(uint16 *)&g_ram[0x17C] = *(uint16 *)RomPtr_AD(j + 36); return 0; } uint8 MotherBrain_FadeToGray_Drained(uint16 a) { // 0xADEF4A - int16 v3; - int v1 = a; if (!kMotherBrain_FadeToGray_Drained[v1]) return 1; @@ -482,8 +417,7 @@ uint8 MotherBrain_FadeToGray_Drained(uint16 a) { // 0xADEF4A WriteColorsToPalette(0x82, 0xad, j, 15); WriteColorsToPalette(0x122, 0xad, j, 15); WriteColorsToPalette(0x168, 0xad, j + 30, 5); - v3 = *(uint16 *)RomPtr_AD(j + 40); - *(uint16 *)&g_ram[0x17C] = v3; + *(uint16 *)&g_ram[0x17C] = *(uint16 *)RomPtr_AD(j + 40); return 0; } @@ -525,4 +459,4 @@ void HandleMotherBrainBodyFlickering(void) { // 0xADF41C *(uint16 *)®_TM &= ~2u; v0->properties |= kEnemyProps_Invisible; } -} +} \ No newline at end of file diff --git a/src/sm_b2.c b/src/sm_b2.c index ec59431..a5bf77d 100644 --- a/src/sm_b2.c +++ b/src/sm_b2.c @@ -4,8 +4,12 @@ #include "funcs.h" #include "enemy_types.h" -#define kWallSpacePirates_Palette_3 ((uint16*)RomPtr(0xb28727)) -#define g_off_B2F959 ((uint16*)RomPtr(0xb2f959)) + +#define kWallSpacePirates_Palette_3 ((uint16*)RomFixedPtr(0xb28727)) +#define g_off_B2F959 ((uint16*)RomFixedPtr(0xb2f959)) + + + void Enemy_GrappleReact_CancelBeam_B2(void) { // 0xB2800F Enemy_SwitchToFrozenAi(); @@ -15,34 +19,6 @@ void Enemy_NormalFrozenAI_B2(void) { // 0xB28041 NormalEnemyFrozenAI(); } -uint16 EnemyInstr_Goto_B2(uint16 k, uint16 j) { // 0xB280ED - return *(uint16 *)RomPtr_B2(j); -} - -uint16 EnemyInstr_DecTimerAndGoto2_B2(uint16 k, uint16 j) { // 0xB28110 - EnemyData *v2 = gEnemyData(k); - if (v2->timer-- != 1) - return EnemyInstr_Goto_B2(k, j); - return j + 2; -} - -uint16 EnemyInstr_SetTimer_B2(uint16 k, uint16 j) { // 0xB28123 - gEnemyData(k)->timer = *(uint16 *)RomPtr_B2(j); - return j + 2; -} - -uint16 EnemyInstr_Sleep_B2(uint16 k, uint16 j) { // 0xB2812F - gEnemyData(k)->current_instruction = j - 2; - return 0; -} - -uint16 EnemyInstr_WaitNframes_B2(uint16 k, uint16 j) { // 0xB2813A - EnemyData *v3 = gEnemyData(k); - v3->instruction_timer = *(uint16 *)RomPtr_B2(j); - v3->current_instruction = j + 2; - return 0; -} - void WalkingSpacePirates_Powerbomb(void) { // 0xB28767 NormalEnemyPowerBombAi(); } @@ -53,7 +29,7 @@ void WalkingSpacePirates_Touch(void) { // 0xB2876C } void WalkingSpacePirates_Shot(void) { // 0xB28779 - if (Get_SpacePirates(cur_enemy_index)->base.enemy_ptr == (uint16)addr_kEnemyDef_F593) + if (Get_SpacePirates(cur_enemy_index)->base.enemy_ptr == addr_kEnemyDef_F593) WalkingSpacePirates_8789(); else NormalEnemyShotAi(); @@ -66,7 +42,7 @@ void WalkingSpacePirates_8789(void) { // 0xB28789 NormalEnemyShotAiSkipDeathAnim_CurEnemy(); if (!E->base.health) { uint16 v1 = cur_enemy_index; - if (E->base.enemy_ptr == (uint16)addr_kEnemyDef_F593) { + if (E->base.enemy_ptr == addr_kEnemyDef_F593) { E->sps_var_B = 0; EnemyDeathAnimation(v1, 4u); Enemy_ItemDrop_LowerNorfairSpacePirate(v1); @@ -82,7 +58,7 @@ void WalkingSpacePirates_87C8(void) { // 0xB287C8 int16 v3; Vulnerability *Vulnerability; - if (Get_SpacePirates(cur_enemy_index)->base.enemy_ptr != (uint16)addr_kEnemyDef_F593) + if (Get_SpacePirates(cur_enemy_index)->base.enemy_ptr != addr_kEnemyDef_F593) goto LABEL_2; R18_ = projectile_type[collision_detection_index]; if (sign16((R18_ & kProjectileType_TypeMask) - kProjectileType_PowerBomb)) { @@ -116,7 +92,7 @@ LABEL_2: } void WalkingSpacePirates_883E(void) { // 0xB2883E - if (Get_SpacePirates(cur_enemy_index)->base.enemy_ptr != (uint16)addr_kEnemyDef_F593) { + if (Get_SpacePirates(cur_enemy_index)->base.enemy_ptr != addr_kEnemyDef_F593) { WalkingSpacePirates_8789(); return; } @@ -144,97 +120,94 @@ void WalkingSpacePirates_883E(void) { // 0xB2883E QueueSfx2_Max6(0x66u); } -uint16 SpacePirates_Instr_MovePixelsDownAndChangeDirFaceRight(uint16 k, uint16 j) { // 0xB2EE40 +const uint16 *SpacePirates_Instr_MovePixelsDownAndChangeDirFaceRight(uint16 k, const uint16 *jp) { // 0xB2EE40 R18_ = 0; - R20_ = *(uint16 *)RomPtr_B2(j); + R20_ = jp[0]; if (!(Enemy_MoveDown(cur_enemy_index) & 1)) - return j + 2; + return jp + 1; Enemy_SpacePirates *E = Get_SpacePirates(cur_enemy_index); E->sps_var_C ^= 1u; - uint16 result = addr_kSpacePirates_Ilist_ED36; if (E->sps_var_C) - return addr_off_B2ECEC; - return result; + return INSTR_RETURN_ADDR(addr_off_B2ECEC); + return INSTR_RETURN_ADDR(addr_kSpacePirates_Ilist_ED36); } -uint16 SpacePirates_Instr_MovePixelsDownAndChangeDirFaceLeft(uint16 k, uint16 j) { // 0xB2EE72 +const uint16 *SpacePirates_Instr_MovePixelsDownAndChangeDirFaceLeft(uint16 k, const uint16 *jp) { // 0xB2EE72 R18_ = 0; - R20_ = *(uint16 *)RomPtr_B2(j); + R20_ = jp[0]; if (!(Enemy_MoveDown(cur_enemy_index) & 1)) - return j + 2; + return jp + 1; Enemy_SpacePirates *E = Get_SpacePirates(cur_enemy_index); E->sps_var_C ^= 1u; - uint16 result = addr_off_B2EDAC; if (E->sps_var_C) - return addr_kSpacePirates_Ilist_EDF6; - return result; + return INSTR_RETURN_ADDR(addr_kSpacePirates_Ilist_EDF6); + return INSTR_RETURN_ADDR(addr_off_B2EDAC); } -uint16 SpacePirates_Instr_RandomNewDirFaceR(uint16 k, uint16 j) { // 0xB2EEA4 +const uint16 *SpacePirates_Instr_RandomNewDirFaceR(uint16 k, const uint16 *jp) { // 0xB2EEA4 uint16 result = addr_kSpacePirates_Ilist_ED36; uint16 v4 = NextRandom() & 1; Get_SpacePirates(cur_enemy_index)->sps_var_C = v4; if (v4) - return addr_off_B2ECEC; - return result; + return INSTR_RETURN_ADDR(addr_off_B2ECEC); + return INSTR_RETURN_ADDR(result); } -uint16 SpacePirates_Instr_RandomNewDirFaceL(uint16 k, uint16 j) { // 0xB2EEBC +const uint16 *SpacePirates_Instr_RandomNewDirFaceL(uint16 k, const uint16 *jp) { // 0xB2EEBC uint16 result = addr_off_B2EDAC; uint16 v4 = NextRandom() & 1; Get_SpacePirates(cur_enemy_index)->sps_var_C = v4; if (v4) - return addr_kSpacePirates_Ilist_EDF6; - return result; + return INSTR_RETURN_ADDR(addr_kSpacePirates_Ilist_EDF6); + return INSTR_RETURN_ADDR(result); } -uint16 SpacePirates_Instr_PrepareWallJumpR(uint16 k, uint16 j) { // 0xB2EED4 +const uint16 *SpacePirates_Instr_PrepareWallJumpR(uint16 k, const uint16 *jp) { // 0xB2EED4 Enemy_SpacePirates *E = Get_SpacePirates(cur_enemy_index); E->sps_var_B = E->base.x_pos + E->sps_parameter_2; E->sps_var_D = E->base.x_pos + (E->sps_parameter_2 >> 1); E->sps_var_E = E->base.y_pos; E->sps_var_F = 64; - return j; + return jp; } -uint16 SpacePirates_Instr_PrepareWallJumpL(uint16 k, uint16 j) { // 0xB2EEFD +const uint16 *SpacePirates_Instr_PrepareWallJumpL(uint16 k, const uint16 *jp) { // 0xB2EEFD Enemy_SpacePirates *E = Get_SpacePirates(cur_enemy_index); E->sps_var_B = E->base.x_pos - E->sps_parameter_2; R18_ = E->sps_parameter_2 >> 1; E->sps_var_D = E->base.x_pos - R18_; E->sps_var_E = E->base.y_pos; E->sps_var_F = 192; - return j; + return jp; } -uint16 SpacePirates_Instr_FireLaserL(uint16 k, uint16 j) { // 0xB2EF2A +const uint16 *SpacePirates_Instr_FireLaserL(uint16 k, const uint16 *jp) { // 0xB2EF2A Enemy_SpacePirates *E = Get_SpacePirates(cur_enemy_index); enemy_projectile_init_param = *((uint16 *)RomPtr_A0(E->base.enemy_ptr) + 3); R18_ = E->base.x_pos - 24; R20_ = E->base.y_pos - 16; R22_ = 0; SpawnEnemyProjectileWithRoomGfx(addr_stru_86A17B, 0); - return j; + return jp; } -uint16 SpacePirates_Instr_FireLaserR(uint16 k, uint16 j) { // 0xB2EF5D +const uint16 *SpacePirates_Instr_FireLaserR(uint16 k, const uint16 *jp) { // 0xB2EF5D Enemy_SpacePirates *E = Get_SpacePirates(cur_enemy_index); R18_ = E->base.x_pos + 24; R20_ = E->base.y_pos - 16; R22_ = 1; SpawnEnemyProjectileWithRoomGfx(addr_stru_86A17B, 1u); - return j; + return jp; } -uint16 SpacePirates_Instr_SetEnemyFunc(uint16 k, uint16 j) { // 0xB2EF83 - uint16 v2 = *(uint16 *)RomPtr_B2(j); - Get_SpacePirates(cur_enemy_index)->sps_var_A = v2; - return j + 2; +const uint16 *SpacePirates_Instr_SetEnemyFunc(uint16 k, const uint16 *jp) { // 0xB2EF83 + Get_SpacePirates(cur_enemy_index)->sps_var_A = jp[0]; + return jp + 1; } -uint16 SpacePirates_Instr_PlaySfx(uint16 k, uint16 j) { // 0xB2EF93 +const uint16 *SpacePirates_Instr_PlaySfx(uint16 k, const uint16 *jp) { // 0xB2EF93 QueueSfx2_Max6(0x66u); - return j; + return jp; } void WallSpacePirates_Init(void) { // 0xB2EF9F @@ -353,34 +326,31 @@ void SpacePirates_Func_4(uint16 k) { // 0xB2F0E4 } } -uint16 SpacePirates_Instr_20(uint16 k, uint16 j) { // 0xB2F536 - uint16 v2 = *(uint16 *)RomPtr_B2(j); - Get_SpacePirates(cur_enemy_index)->base.palette_index = v2; - return j + 2; +const uint16 *SpacePirates_Instr_20(uint16 k, const uint16 *jp) { // 0xB2F536 + Get_SpacePirates(cur_enemy_index)->base.palette_index = jp[0]; + return jp + 1; } -uint16 SpacePirates_Instr_16(uint16 k, uint16 j) { // 0xB2F546 - uint16 *v2 = (uint16 *)RomPtr_B2(j); - QueueSfx2_Max6(*v2); - return j + 2; +const uint16 *SpacePirates_Instr_16(uint16 k, const uint16 *jp) { // 0xB2F546 + QueueSfx2_Max6(jp[0]); + return jp + 1; } void sub_B2F554(void) { // 0xB2F554 gEnemyData(cur_enemy_index)->instruction_timer = 1; } -uint16 SpacePirates_Instr_15(uint16 k, uint16 j) { // 0xB2F564 - uint16 *v2 = (uint16 *)RomPtr_B2(j); - R22_ = v2[1]; - R24_ = v2[2]; +const uint16 *SpacePirates_Instr_15(uint16 k, const uint16 *jp) { // 0xB2F564 + R22_ = jp[1]; + R24_ = jp[2]; Enemy_SpacePirates *E = Get_SpacePirates(cur_enemy_index); R18_ = E->base.x_pos; R20_ = E->base.y_pos; - SpawnEnemyProjectileWithGfx(*v2, cur_enemy_index, addr_kEproj_PirateClaw); - return j + 6; + SpawnEnemyProjectileWithGfx(jp[0], cur_enemy_index, addr_kEproj_PirateClaw); + return jp + 3; } -uint16 SpacePirates_Instr_18(uint16 k, uint16 j) { // 0xB2F590 +const uint16 *SpacePirates_Instr_18(uint16 k, const uint16 *jp) { // 0xB2F590 Enemy_SpacePirates *E = Get_SpacePirates(cur_enemy_index); R18_ = E->base.x_pos - samus_x_pos; E->base.instruction_timer = 1; @@ -388,7 +358,7 @@ uint16 SpacePirates_Instr_18(uint16 k, uint16 j) { // 0xB2F590 if ((R18_ & 0x8000u) != 0) result = addr_kSpacePirates_Ilist_F420; E->sps_var_C = result; - return result; + return INSTR_RETURN_ADDR(result); } void sub_B2F5B3(void) { // 0xB2F5B3 @@ -401,9 +371,9 @@ void sub_B2F5B3(void) { // 0xB2F5B3 v0->ai_var_C = v1; } -uint16 SpacePirates_Instr_17(uint16 k, uint16 j) { // 0xB2F5D6 +const uint16 *SpacePirates_Instr_17(uint16 k, const uint16 *jp) { // 0xB2F5D6 Get_SpacePirates(k)->sps_var_00 = 0; - return j; + return jp; } void NinjaSpacePirates_Init(void) { // 0xB2F5DE @@ -620,12 +590,12 @@ void SpacePirates_Func_16(void) { // 0xB2F917 } } -uint16 SpacePirates_Instr_19(uint16 k, uint16 j) { // 0xB2F969 +const uint16 *SpacePirates_Instr_19(uint16 k, const uint16 *jp) { // 0xB2F969 Enemy_SpacePirates *E = Get_SpacePirates(k); E->sps_var_00 = 1536; E->sps_var_03 = E->sps_var_D + ((uint16)(E->sps_var_F - E->sps_var_D) >> 1); - return j; + return jp; } void SpacePirates_F985(uint16 k) { // 0xB2F985 @@ -674,12 +644,12 @@ void SpacePirates_FA15(uint16 k) { // 0xB2FA15 } } -uint16 SpacePirates_Instr_21(uint16 k, uint16 j) { // 0xB2FA3D +const uint16 *SpacePirates_Instr_21(uint16 k, const uint16 *jp) { // 0xB2FA3D Enemy_SpacePirates *E = Get_SpacePirates(k); E->sps_var_00 = 1536; E->sps_var_03 = E->sps_var_E + ((uint16)(E->sps_var_D - E->sps_var_E) >> 1); - return j; + return jp; } void SpacePirates_FA59(uint16 k) { // 0xB2FA59 @@ -742,42 +712,39 @@ void SpacePirates_FB11(uint16 k) { // 0xB2FB11 CreateSpriteAtPos(); } -uint16 SpacePirates_Instr_12(uint16 k, uint16 j) { // 0xB2FC68 +const uint16 *SpacePirates_Instr_12(uint16 k, const uint16 *jp) { // 0xB2FC68 Enemy_SpacePirates *E = Get_SpacePirates(cur_enemy_index); R18_ = E->base.x_pos - 24; - R20_ = E->base.y_pos - *(uint16 *)RomPtr_B2(j); + R20_ = E->base.y_pos - jp[0]; R22_ = 0; SpawnEnemyProjectileWithRoomGfx(addr_stru_86A17B, 0); - return j + 2; + return jp + 1; } -uint16 SpacePirates_Instr_14(uint16 k, uint16 j) { // 0xB2FC90 +const uint16 *SpacePirates_Instr_14(uint16 k, const uint16 *jp) { // 0xB2FC90 Enemy_SpacePirates *E = Get_SpacePirates(cur_enemy_index); R18_ = E->base.x_pos + 24; - R20_ = E->base.y_pos - *(uint16 *)RomPtr_B2(j); + R20_ = E->base.y_pos - jp[0]; R22_ = 1; SpawnEnemyProjectileWithRoomGfx(addr_stru_86A17B, 1u); - return j + 2; + return jp + 1; } -uint16 SpacePirates_Instr_11(uint16 k, uint16 j) { // 0xB2FCB8 - uint16 v2 = *(uint16 *)RomPtr_B2(j); - Get_SpacePirates(cur_enemy_index)->sps_var_A = v2; - return j + 2; +const uint16 *SpacePirates_Instr_11(uint16 k, const uint16 *jp) { // 0xB2FCB8 + Get_SpacePirates(cur_enemy_index)->sps_var_A = jp[0]; + return jp + 1; } -uint16 SpacePirates_Instr_13(uint16 k, uint16 j) { // 0xB2FCC8 - uint16 result; +const uint16 *SpacePirates_Instr_13(uint16 k, const uint16 *jp) { // 0xB2FCC8 if (IsSamusWithinEnemy_Y(cur_enemy_index, 0x10)) { - result = addr_kSpacePirates_Ilist_FB8C; if ((int16)(samus_x_pos - Get_SpacePirates(cur_enemy_index)->base.x_pos) >= 0) - return addr_kSpacePirates_Ilist_FC0E; + return INSTR_RETURN_ADDR(addr_kSpacePirates_Ilist_FC0E); + return INSTR_RETURN_ADDR(addr_kSpacePirates_Ilist_FB8C); } else { - result = addr_kSpacePirates_Ilist_FBE6; if ((int16)(samus_x_pos - Get_SpacePirates(cur_enemy_index)->base.x_pos) >= 0) - return addr_kSpacePirates_Ilist_FB64; + return INSTR_RETURN_ADDR(addr_kSpacePirates_Ilist_FB64); + return INSTR_RETURN_ADDR(addr_kSpacePirates_Ilist_FBE6); } - return result; } void WalkingSpacePirates_Init(void) { // 0xB2FD02 @@ -876,4 +843,4 @@ void WalkingSpacePirates_FE4B(void) { // 0xB2FE4B E->base.current_instruction = v3; E->base.instruction_timer = 1; } -} +} \ No newline at end of file diff --git a/src/sm_b3.c b/src/sm_b3.c index 05c2298..8bd39d5 100644 --- a/src/sm_b3.c +++ b/src/sm_b3.c @@ -5,21 +5,25 @@ #include "enemy_types.h" -#define g_off_B3882B ((uint16*)RomPtr(0xb3882b)) -#define g_off_B38833 ((uint16*)RomPtr(0xb38833)) -#define g_word_B3949B ((uint16*)RomPtr(0xb3949b)) -#define g_word_B394BB ((uint16*)RomPtr(0xb394bb)) -#define g_word_B39675 ((uint16*)RomPtr(0xb39675)) -#define kBotwoonHealthThresForPalChange ((uint16*)RomPtr(0xb3981b)) -#define kBotwoonHealthBasedPalette ((uint16*)RomPtr(0xb3971b)) -#define g_off_B3946B ((uint16*)RomPtr(0xb3946b)) -#define g_off_B3948B ((uint16*)RomPtr(0xb3948b)) +#define g_off_B3882B ((uint16*)RomFixedPtr(0xb3882b)) +#define g_off_B38833 ((uint16*)RomFixedPtr(0xb38833)) +#define g_word_B3949B ((uint16*)RomFixedPtr(0xb3949b)) +#define g_word_B394BB ((uint16*)RomFixedPtr(0xb394bb)) +#define g_word_B39675 ((uint16*)RomFixedPtr(0xb39675)) +#define kBotwoonHealthThresForPalChange ((uint16*)RomFixedPtr(0xb3981b)) +#define kBotwoonHealthBasedPalette ((uint16*)RomFixedPtr(0xb3971b)) +#define g_off_B3946B ((uint16*)RomFixedPtr(0xb3946b)) +#define g_off_B3948B ((uint16*)RomFixedPtr(0xb3948b)) +#define g_word_B3E718 ((uint16*)RomFixedPtr(0xb3e718)) +#define g_word_B3E71E ((uint16*)RomFixedPtr(0xb3e71e)) +#define g_off_B3E72A ((uint16*)RomFixedPtr(0xb3e72a)) +#define g_off_B3E724 ((uint16*)RomFixedPtr(0xb3e724)) +#define g_word_B3E730 ((uint16*)RomFixedPtr(0xb3e730)) + + + + static const int16 g_word_B39E77[3] = { 2, 3, 4 }; -#define g_word_B3E718 ((uint16*)RomPtr(0xb3e718)) -#define g_word_B3E71E ((uint16*)RomPtr(0xb3e71e)) -#define g_off_B3E72A ((uint16*)RomPtr(0xb3e72a)) -#define g_off_B3E724 ((uint16*)RomPtr(0xb3e724)) -#define g_word_B3E730 ((uint16*)RomPtr(0xb3e730)) void Enemy_GrappleReact_NoInteract_B3(void) { // 0xB38000 SwitchEnemyAiToMainAi(); @@ -57,38 +61,14 @@ void Enemy_NormalFrozenAI_B3(void) { // 0xB38041 NormalEnemyFrozenAI(); } -uint16 Enemy_SetAiPreInstr_B3(uint16 k, uint16 j) { // 0xB3806B - uint16 v2 = *(uint16 *)RomPtr_B3(j); - gEnemyData(k)->ai_preinstr = v2; - return j + 2; +const uint16 *Enemy_SetAiPreInstr_B3(uint16 k, const uint16 *jp) { // 0xB3806B + gEnemyData(k)->ai_preinstr = jp[0]; + return jp + 1; } -uint16 Enemy_ClearAiPreInstr_B3(uint16 k, uint16 j) { // 0xB38074 +const uint16 *Enemy_ClearAiPreInstr_B3(uint16 k, const uint16 *jp) { // 0xB38074 gEnemyData(k)->ai_preinstr = FUNC16(nullsub_171_B3); - return j; -} - -uint16 EnemyInstr_Goto_B3(uint16 k, uint16 j) { // 0xB380ED - return *(uint16 *)RomPtr_B3(j); -} - -uint16 EnemyInstr_DecTimerAndGoto2_B3(uint16 k, uint16 j) { // 0xB38110 - EnemyData *v2 = gEnemyData(k); - if (v2->timer-- == 1) - return j + 2; - else - return EnemyInstr_Goto_B3(k, j); -} - -uint16 EnemyInstr_SetTimer_B3(uint16 k, uint16 j) { // 0xB38123 - uint16 v2 = *(uint16 *)RomPtr_B3(j); - gEnemyData(k)->timer = v2; - return j + 2; -} - -uint16 EnemyInstr_Sleep_B3(uint16 k, uint16 j) { // 0xB3812F - gEnemyData(k)->current_instruction = j - 2; - return 0; + return jp; } void UnusedSpinningTurtleEye_Init(void) { // 0xB386FB @@ -257,10 +237,10 @@ void NorfairPipeBug_8BA8(void) { // 0xB38BA8 void NorfairPipeBug_Func_1(void) { // 0xB38BCD if (LOBYTE(Get_PipeBug(cur_enemy_index)->pbg_parameter_2) - && Get_PipeBug(cur_enemy_index + 64)->pbg_var_A == (uint16)FUNC16(NorfairPipeBug_Func_1) - && Get_PipeBug(cur_enemy_index + 128)->pbg_var_A == (uint16)FUNC16(NorfairPipeBug_Func_1) - && Get_PipeBug(cur_enemy_index + 192)->pbg_var_A == (uint16)FUNC16(NorfairPipeBug_Func_1) - && Get_PipeBug(cur_enemy_index + 256)->pbg_var_A == (uint16)FUNC16(NorfairPipeBug_Func_1)) { + && Get_PipeBug(cur_enemy_index + 64)->pbg_var_A == FUNC16(NorfairPipeBug_Func_1) + && Get_PipeBug(cur_enemy_index + 128)->pbg_var_A == FUNC16(NorfairPipeBug_Func_1) + && Get_PipeBug(cur_enemy_index + 192)->pbg_var_A == FUNC16(NorfairPipeBug_Func_1) + && Get_PipeBug(cur_enemy_index + 256)->pbg_var_A == FUNC16(NorfairPipeBug_Func_1)) { Get_PipeBug(cur_enemy_index)->pbg_var_A = FUNC16(NorfairPipeBug_Func_2); } } @@ -695,85 +675,85 @@ void BrinstarYellowPipeBug_Func_10(uint16 k) { // 0xB3927A } } -uint16 Botwoon_Instr_1(uint16 k, uint16 j) { // 0xB394C7 +const uint16 *Botwoon_Instr_1(uint16 k, const uint16 *jp) { // 0xB394C7 Enemy_Botwoon *E = Get_Botwoon(cur_enemy_index); E->base.x_width = 8; E->base.y_height = 16; - return j; + return jp; } -uint16 Botwoon_Instr_2(uint16 k, uint16 j) { // 0xB394D7 +const uint16 *Botwoon_Instr_2(uint16 k, const uint16 *jp) { // 0xB394D7 Enemy_Botwoon *E = Get_Botwoon(cur_enemy_index); E->base.x_width = 12; E->base.y_height = 12; - return j; + return jp; } -uint16 Botwoon_Instr_3(uint16 k, uint16 j) { // 0xB394E7 +const uint16 *Botwoon_Instr_3(uint16 k, const uint16 *jp) { // 0xB394E7 Enemy_Botwoon *E = Get_Botwoon(cur_enemy_index); E->base.x_width = 16; E->base.y_height = 8; - return j; + return jp; } -uint16 Botwoon_Instr_4(uint16 k, uint16 j) { // 0xB394F7 +const uint16 *Botwoon_Instr_4(uint16 k, const uint16 *jp) { // 0xB394F7 Enemy_Botwoon *E = Get_Botwoon(cur_enemy_index); E->base.x_width = 12; E->base.y_height = 12; - return j; + return jp; } -uint16 Botwoon_Instr_5(uint16 k, uint16 j) { // 0xB39507 +const uint16 *Botwoon_Instr_5(uint16 k, const uint16 *jp) { // 0xB39507 Enemy_Botwoon *E = Get_Botwoon(cur_enemy_index); E->base.x_width = 8; E->base.y_height = 16; - return j; + return jp; } -uint16 Botwoon_Instr_6(uint16 k, uint16 j) { // 0xB39517 +const uint16 *Botwoon_Instr_6(uint16 k, const uint16 *jp) { // 0xB39517 Enemy_Botwoon *E = Get_Botwoon(cur_enemy_index); E->base.x_width = 8; E->base.y_height = 16; - return j; + return jp; } -uint16 Botwoon_Instr_7(uint16 k, uint16 j) { // 0xB39527 +const uint16 *Botwoon_Instr_7(uint16 k, const uint16 *jp) { // 0xB39527 Enemy_Botwoon *E = Get_Botwoon(cur_enemy_index); E->base.x_width = 12; E->base.y_height = 12; - return j; + return jp; } -uint16 Botwoon_Instr_8(uint16 k, uint16 j) { // 0xB39537 +const uint16 *Botwoon_Instr_8(uint16 k, const uint16 *jp) { // 0xB39537 Enemy_Botwoon *E = Get_Botwoon(cur_enemy_index); E->base.x_width = 16; E->base.y_height = 8; - return j; + return jp; } -uint16 Botwoon_Instr_9(uint16 k, uint16 j) { // 0xB39547 +const uint16 *Botwoon_Instr_9(uint16 k, const uint16 *jp) { // 0xB39547 Enemy_Botwoon *E = Get_Botwoon(cur_enemy_index); E->base.x_width = 12; E->base.y_height = 12; - return j; + return jp; } -uint16 Botwoon_Instr_10(uint16 k, uint16 j) { // 0xB39557 +const uint16 *Botwoon_Instr_10(uint16 k, const uint16 *jp) { // 0xB39557 Enemy_Botwoon *E = Get_Botwoon(cur_enemy_index); E->base.x_width = 8; E->base.y_height = 16; - return j; + return jp; } -uint16 Botwoon_Instr_SetSpitting(uint16 k, uint16 j) { // 0xB39567 +const uint16 *Botwoon_Instr_SetSpitting(uint16 k, const uint16 *jp) { // 0xB39567 Get_Botwoon(cur_enemy_index)->botwoon_var_5A = 1; - return j; + return jp; } -uint16 Botwoon_Instr_QueueSpitSfx(uint16 k, uint16 j) { // 0xB39572 +const uint16 *Botwoon_Instr_QueueSpitSfx(uint16 k, const uint16 *jp) { // 0xB39572 QueueSfx2_Max6(0x7Cu); - return j; + return jp; } void Botwoon_QueueExplosionSfx(void) { // 0xB3957B @@ -1403,10 +1383,10 @@ void Botwoon_Func_32(void) { // 0xB3E250 Enemy_Botwoon *E = Get_Botwoon(cur_enemy_index); E->botwoon_var_E = addr_loc_B3E28C; E->botwoon_var_3C = 0; - uint8 *v1 = RomPtr_B3(E->botwoon_var_40 - 7856); - E->botwoon_var_42 = *(uint16 *)v1; - E->botwoon_var_37 = *((uint16 *)v1 + 2); - int16 v2 = *((uint16 *)v1 + 1); + const uint8 *v1 = RomPtr_B3(E->botwoon_var_40 + addr_stru_B3E150); + E->botwoon_var_42 = GET_WORD(v1); + E->botwoon_var_37 = GET_WORD(v1 + 4); + int16 v2 = GET_WORD(v1 + 2); E->botwoon_var_44 = v2; if (v2 < 0) E->botwoon_var_42 -= 4; @@ -1422,7 +1402,7 @@ void Botwoon_Func_33(void) { // 0xB3E28C if ((E->botwoon_var_44 & 0x8000u) != 0) R22_ = -2; do { - uint8 *v6 = RomPtr_B3(E->botwoon_var_42); + const uint8 *v6 = RomPtr_B3(E->botwoon_var_42); uint16 v7 = SignExtend8(*v6), v8; if (v7 == 0xFF80 || (R18_ += v7, v8 = SignExtend8(v6[1]), v8 == 0xFF80)) { E->botwoon_var_41 = 0; @@ -1441,17 +1421,17 @@ void Botwoon_Func_33(void) { // 0xB3E28C E->base.y_pos += R20_; } -uint16 EscapeEtecoon_Instr_1(uint16 k, uint16 j) { // 0xB3E545 +const uint16 *EscapeEtecoon_Instr_1(uint16 k, const uint16 *jp) { // 0xB3E545 if (lava_acid_y_pos >= 0xCEu) - return j + 2; + return jp + 1; else - return *(uint16 *)RomPtr_B3(j); + return INSTR_RETURN_ADDR(jp[0]); } -uint16 EscapeEtecoon_Instr_2(uint16 k, uint16 j) { // 0xB3E610 +const uint16 *EscapeEtecoon_Instr_2(uint16 k, const uint16 *jp) { // 0xB3E610 Enemy_EscapeEtecoon *E = Get_EscapeEtecoon(k); - E->base.x_pos += *(uint16 *)RomPtr_B3(j); - return j + 2; + E->base.x_pos += jp[0]; + return jp + 1; } void EscapeEtecoon_Main(void) { // 0xB3E655 @@ -1480,7 +1460,7 @@ void EscapeEtecoon_E680(uint16 k) { // 0xB3E680 een_var_A = E->een_var_A; if (een_var_A < 0) --R20_; - *(uint16 *)((char *)&R18_ + 1) = een_var_A; + R19_ = een_var_A; if (Enemy_MoveRight_IgnoreSlopes(k) & 1) { E->base.instruction_timer = 1; bool v3 = (-E->een_var_A & 0x8000u) != 0; @@ -1513,30 +1493,30 @@ void EscapeEtecoon_Init(void) { // 0xB3E6CB } } -uint16 EscapeDachora_Instr_2(uint16 k, uint16 j) { // 0xB3EAA8 +const uint16 *EscapeDachora_Instr_2(uint16 k, const uint16 *jp) { // 0xB3EAA8 if (lava_acid_y_pos >= 0xCEu) - return j + 2; + return jp + 1; else - return *(uint16 *)RomPtr_B3(j); + return INSTR_RETURN_ADDR(jp[0]); } -uint16 EscapeDachora_Instr_3(uint16 k, uint16 j) { // 0xB3EAB8 +const uint16 *EscapeDachora_Instr_3(uint16 k, const uint16 *jp) { // 0xB3EAB8 if (CheckEventHappened(0xFu)) - return *(uint16 *)RomPtr_B3(j); + return INSTR_RETURN_ADDR(jp[0]); else - return j + 2; + return jp + 1; } -uint16 EscapeDachora_Instr_1(uint16 k, uint16 j) { // 0xB3EAC9 +const uint16 *EscapeDachora_Instr_1(uint16 k, const uint16 *jp) { // 0xB3EAC9 Enemy_EscapeDachora *E = Get_EscapeDachora(cur_enemy_index); E->base.x_pos -= 6; - return j; + return jp; } -uint16 EscapeDachora_Instr_4(uint16 k, uint16 j) { // 0xB3EAD7 +const uint16 *EscapeDachora_Instr_4(uint16 k, const uint16 *jp) { // 0xB3EAD7 Enemy_EscapeDachora *E = Get_EscapeDachora(cur_enemy_index); E->base.x_pos += 6; - return j; + return jp; } void EscapeDachora_Init(void) { // 0xB3EAE5 @@ -1550,4 +1530,4 @@ void EscapeDachora_Init(void) { // 0xB3EAE5 E->base.timer = 0; E->base.current_instruction = addr_kEscapeDachora_Ilist_E964; } -} +} \ No newline at end of file diff --git a/src/sm_b4.c b/src/sm_b4.c index d8e0437..fb71e9c 100644 --- a/src/sm_b4.c +++ b/src/sm_b4.c @@ -4,7 +4,11 @@ #include "funcs.h" #include "enemy_types.h" -#define kCreateSprite_Ilists ((uint16*)RomPtr(0xb4bda8)) + +#define kCreateSprite_Ilists ((uint16*)RomFixedPtr(0xb4bda8)) + + + void CreateSpriteAtPos(void) { // 0xB4BC26 int v0 = 62; @@ -39,34 +43,31 @@ void CallSpriteObjectInstr(uint32 ea) { void HandleSpriteObjects(void) { // 0xB4BC82 uint16 v1; - if (!(debug_time_frozen_for_enemies | time_is_frozen_flag)) { - sprite_object_index = 62; - while (1) { - int v0; - v0 = sprite_object_index >> 1; - if (!sprite_instr_list_ptrs[v0] || (sprite_disable_flag[v0] & 1) != 0) - goto LABEL_9; - v1 = sprite_instr_timer[v0]; - if ((v1 & 0x8000u) != 0) - break; - sprite_instr_timer[v0] = v1 - 1; - if (v1 == 1) { - uint16 v3 = sprite_instr_list_ptrs[v0] + 4; - sprite_instr_list_ptrs[v0] = v3; - v1 = *(uint16 *)RomPtr_B4(v3); - if (!sign16(v1 + 0x8000)) - break; - sprite_instr_timer[sprite_object_index >> 1] = v1; - } -LABEL_9: - sprite_object_index -= 2; - if ((sprite_object_index & 0x8000u) != 0) - return; + if (debug_time_frozen_for_enemies | time_is_frozen_flag) + return; + + sprite_object_index = 62; + do { + int v0; + v0 = sprite_object_index >> 1; + if (!sprite_instr_list_ptrs[v0] || (sprite_disable_flag[v0] & 1) != 0) + continue; + v1 = sprite_instr_timer[v0]; + if (sign16(v1)) { +BREAKLABEL: + CallSpriteObjectInstr(v1 | 0xB40000); + continue; } - R18_ = v1; - CallSpriteObjectInstr(v1 | 0xB40000); - goto LABEL_9; - } + sprite_instr_timer[v0] = v1 - 1; + if (v1 == 1) { + uint16 v3 = sprite_instr_list_ptrs[v0] + 4; + sprite_instr_list_ptrs[v0] = v3; + v1 = *(uint16 *)RomPtr_B4(v3); + if (sign16(v1)) + goto BREAKLABEL; + sprite_instr_timer[sprite_object_index >> 1] = v1; + } + } while (!sign16(sprite_object_index -= 2)); } void SpriteObject_Instr_RepeatLast(void) { // 0xB4BCF0 @@ -80,9 +81,9 @@ void SpriteObject_Instr_Terminate(void) { // 0xB4BD07 } void SpriteObject_Instr_Goto(void) { // 0xB4BD12 - uint16 v2 = *((uint16 *)RomPtr_B4(sprite_instr_list_ptrs[sprite_object_index >> 1]) + 1); + uint16 v2 = GET_WORD(RomPtr_B4(sprite_instr_list_ptrs[sprite_object_index >> 1]) + 2); sprite_instr_list_ptrs[sprite_object_index >> 1] = v2; - sprite_instr_timer[sprite_object_index >> 1] = *(uint16 *)RomPtr_B4(v2); + sprite_instr_timer[sprite_object_index >> 1] = GET_WORD(RomPtr_B4(v2)); } void DrawSpriteObjects(void) { // 0xB4BD32 @@ -98,8 +99,8 @@ void DrawSpriteObjects(void) { // 0xB4BD32 if (sign16(v2 - 272)) { R3_.addr = sprite_palettes[v1] & 0xE00; R0_.addr = sprite_palettes[v1] & 0x1FF; - uint8 *v3 = RomPtr_B4(sprite_instr_list_ptrs[v1]); - DrawSpritemapWithBaseTile(0xB4, *((uint16 *)v3 + 1)); + const uint8 *v3 = RomPtr_B4(sprite_instr_list_ptrs[v1]); + DrawSpritemapWithBaseTile(0xB4, GET_WORD(v3 + 2)); } } } @@ -114,4 +115,4 @@ void ClearSpriteObjects(void) { // 0xB4BD97 sprite_instr_list_ptrs[v0 >> 1] = 0; v0 -= 2; } while (v0); -} +} \ No newline at end of file diff --git a/src/sm_cpu_infra.c b/src/sm_cpu_infra.c index 9145d36..b1da8f6 100644 --- a/src/sm_cpu_infra.c +++ b/src/sm_cpu_infra.c @@ -4,6 +4,10 @@ #include "snes/snes.h" #include "tracing.h" + + + + #include "ida_types.h" #include "variables.h" #include "funcs.h" @@ -56,8 +60,12 @@ void Call(uint32 addr) { RunAsmCode(addr, 0, 0, 0, 0); } +uint8_t *SnesRomPtr(uint32 v) { + return (uint8*)RomPtr(v); +} + bool ProcessHook(uint32 v) { - uint8_t *rombyte = RomPtr(v); + uint8_t *rombyte = SnesRomPtr(v); switch (hookmode) { case 0: // remove hooks *rombyte = hook_orgbyte[hookcnt++]; @@ -79,7 +87,7 @@ bool ProcessHook(uint32 v) { bool FixBugHook(uint32 addr) { switch (hookmode) { case 1: { // install hooks - uint8_t *rombyte = RomPtr(addr); + uint8_t *rombyte = SnesRomPtr(addr); hook_fixbug_orgbyte[hookcnt++] = *rombyte; *rombyte = 0; return false; @@ -167,6 +175,9 @@ static const uint32 kPatchedCarrys[] = { 0x94B176, 0x94B156, + // MotherBrain + 0xA99413, + // room_width_in_blocks etc 0x80ab5d, 0x84865c, @@ -326,6 +337,9 @@ uint32 PatchBugs(uint32 mode, uint32 addr) { } else if (FixBugHook(0x88AFF2)) { if (g_cpu->a < 256) // RoomMainAsm_ScrollingSky reads oob g_cpu->a = 256; + } else if (FixBugHook(0x8189bd)) { + if (g_cpu->y == 0) // DrawSamusSpritemap reads invalid ptr + return 0x818A35; } return 0; @@ -339,7 +353,7 @@ int RunPatchBugHook(uint32 addr) { } else { g_cpu->k = new_pc >> 16; g_cpu->pc = (new_pc & 0xffff) + 1; - return *RomPtr(new_pc); + return *SnesRomPtr(new_pc); } } @@ -373,10 +387,9 @@ static void VerifySnapshotsEq(Snapshot *b, Snapshot *a, Snapshot *prev) { memcpy(&b->ram[0x0], &a->ram[0x0], 0x34); // R18, R20, R22 etc memcpy(&b->ram[0x1f5b], &a->ram[0x1f5b], 0x100 - 0x5b); // stacck - memcpy(&b->ram[0x44], &a->ram[0x44], 3); // decompress_dst_tmp + memcpy(&b->ram[0x44], &a->ram[0x44], 13); // decompress temp memcpy(&b->ram[0x19b3], &a->ram[0x19b3], 1); // mode7_spawn_param memcpy(&b->ram[0x1993], &a->ram[0x1993], 2); // enemy_projectile_init_param - memcpy(&b->ram[0x49], &a->ram[0x49], 1); // decompress_src.bank memcpy(&b->ram[0x1B9D], &a->ram[0x1B9D], 2); // cinematic_spawn_param memcpy(&b->ram[0x1a93], &a->ram[0x1a93], 2); // cinematic_spawn_param memcpy(&b->ram[0xA82], &a->ram[0xA82], 2); // xray_angle @@ -389,13 +402,22 @@ static void VerifySnapshotsEq(Snapshot *b, Snapshot *a, Snapshot *prev) { memcpy(&a->ram[0x77e], &b->ram[0x77e], 5); // my counter memcpy(&a->ram[0xe20], &b->ram[0xe20], 2); // enemy_population_ptr + memcpy(&a->ram[0x1784], &b->ram[0x1784], 3); // enemy_ai_pointer + memcpy(&a->ram[0x3c], &b->ram[0x3c], 2); // nmicopy1_var_d + memcpy(&a->ram[0x17aa], &b->ram[0x17aa], 2); // interactive_enemy_indexes_index + memcpy(&a->ram[0x60B], &b->ram[0x60B], 2); // remaining_enemy_spritemap_entries + + memcpy(&a->ram[0xdd4], &b->ram[0xdd4], 4); // temp_collision_DD4 + + + if (memcmp(b->ram, a->ram, 0x20000)) { fprintf(stderr, "@%d: Memory compare failed (mine != theirs, prev):\n", snes_frame_counter); int j = 0; for (size_t i = 0; i < 0x20000; i++) { if (a->ram[i] != b->ram[i]) { if (++j < 256) { - if (/* (i & 1) == 0 && */a->ram[i + 1] != b->ram[i + 1]) { + if (((i & 1) == 0 || i < 0x10000) && a->ram[i + 1] != b->ram[i + 1]) { fprintf(stderr, "0x%.6X: %.4X != %.4X (%.4X)\n", (int)i, WORD(b->ram[i]), WORD(a->ram[i]), WORD(prev->ram[i])); i++, j++; @@ -553,12 +575,12 @@ static bool loadRom(const char *name, Snes *snes) { void PatchBytes(uint32 addr, const uint8 *value, size_t n) { for(size_t i = 0; i != n; i++) - RomPtr(addr)[i] = value[i]; + SnesRomPtr(addr)[i] = value[i]; } // Patches add/sub to ignore carry void FixupCarry(uint32 addr) { - *RomPtr(addr) = 0; + *SnesRomPtr(addr) = 0; } void RtlUpdateSnesPatchForBugfix() { @@ -580,6 +602,7 @@ Snes *SnesInit(const char *filename) { } g_sram = g_snes->cart->ram; + g_rom = g_snes->cart->rom; RtlSetupEmuCallbacks(NULL, &RtlRunFrameCompare, NULL); @@ -751,7 +774,7 @@ Snes *SnesInit(const char *filename) { RtlUpdateSnesPatchForBugfix(); for (size_t i = 0; i != arraysize(kPatchedCarrys); i++) { - uint8 t = *RomPtr(kPatchedCarrys[i]); + uint8 t = *SnesRomPtr(kPatchedCarrys[i]); if (t) { kPatchedCarrysOrg[i] = t; FixupCarry(kPatchedCarrys[i]); @@ -827,7 +850,7 @@ again_theirs: MakeSnapshot(&g_snapshot_theirs); // Run my version and snapshot -again_mine: +//again_mine: g_snes->ppu = g_snes->my_ppu; RestoreSnapshot(&g_snapshot_before); diff --git a/src/sm_rtl.c b/src/sm_rtl.c index bbf4c95..150e2a3 100644 --- a/src/sm_rtl.c +++ b/src/sm_rtl.c @@ -7,6 +7,10 @@ #include "spc_player.h" #include "util.h" + + + + struct StateRecorder; static void RtlSaveMusicStateToRam_Locked(); @@ -14,6 +18,7 @@ static void RtlRestoreMusicAfterLoad_Locked(bool is_reset); uint8 g_ram[0x20000]; uint8 *g_sram; +const uint8 *g_rom; static uint8 *g_rtl_memory_ptr; static RunFrameFunc *g_rtl_runframe; @@ -510,11 +515,6 @@ uint32 Load24(void *a) { return *(uint32 *)a & 0xffffff; } -void DecompressToMem_IpArg(const void *p) { - decompress_dst = *(LongPtr *)p; - DecompressToMem(); -} - bool Unreachable(void) { printf("Unreachable!\n"); assert(0); @@ -522,28 +522,36 @@ bool Unreachable(void) { return false; } -uint8_t *RomPtr(uint32_t addr) { +const uint8 *RomPtr(uint32_t addr) { if (!(addr & 0x8000)) { printf("RomPtr - Invalid access 0x%x!\n", addr); g_fail = true; } - return &g_snes->cart->rom[(((addr >> 16) << 15) | (addr & 0x7fff)) & (g_snes->cart->romSize - 1)]; + return &g_rom[(((addr >> 16) << 15) | (addr & 0x7fff)) & 0x3fffff]; } -uint8_t *IndirPtr(void *ptr, uint16 offs) { - uint32 a = (*(uint32 *)ptr & 0xffffff) + offs; - if ((a >> 16) >= 0x7e && (a >> 16) <= 0x7f || a < 0x2000) { +static uint8 *IndirPtr(LongPtr ptr, uint16 offs) { + uint32 a = (ptr.bank << 16 | ptr.addr) + offs; + if (ptr.bank >= 0x7e && ptr.bank <= 0x7f || a < 0x2000) { return &g_ram[a & 0x1ffff]; } else { - return RomPtr(a); + return (uint8 *)RomPtr(a); } } -void IndirWriteWord(void *ptr, uint16 offs, uint16 value) { +uint16 IndirReadWord(LongPtr ptr, uint16 offs) { + return *(uint16 *)IndirPtr(ptr, offs); +} + +void IndirWriteWord(LongPtr ptr, uint16 offs, uint16 value) { *(uint16 *)IndirPtr(ptr, offs) = value; } -void IndirWriteByte(void *ptr, uint16 offs, uint8 value) { +uint8 IndirReadByte(LongPtr ptr, uint16 offs) { + return *(uint8_t *)IndirPtr(ptr, offs); +} + +void IndirWriteByte(LongPtr ptr, uint16 offs, uint8 value) { *IndirPtr(ptr, offs) = value; } @@ -757,4 +765,4 @@ void RtlWriteSram(void) { } else { fprintf(stderr, "Unable to write saves/sm.srm\n"); } -} +} \ No newline at end of file diff --git a/src/sm_rtl.h b/src/sm_rtl.h index fcfbbdf..4dbe4ec 100644 --- a/src/sm_rtl.h +++ b/src/sm_rtl.h @@ -8,6 +8,7 @@ extern void RtlApuWrite(uint32 adr, uint8 val); extern int snes_frame_counter; extern uint8 *g_sram; +extern const uint8 *g_rom; extern bool g_use_my_apu_code; #define LONGPTR(t) {(t) & 0xffff, (t) >> 16} extern bool g_debug_flag; @@ -31,10 +32,13 @@ typedef uint16 Func_XY_Y(uint16 k, uint16 j); typedef void FuncXY_V(uint16 k, uint16 j); typedef PairU16 Func_Y_To_PairU16(uint16 j); -uint8_t *RomPtr(uint32_t addr); -uint8_t *IndirPtr(void *ptr, uint16 offs); -void IndirWriteWord(void *ptr, uint16 offs, uint16 value); -void IndirWriteByte(void *ptr, uint16 offs, uint8 value); +const uint8 *RomPtr(uint32_t addr); +uint8 IndirReadByte(LongPtr ptr, uint16 offs); +uint16 IndirReadWord(LongPtr ptr, uint16 offs); +void IndirWriteByte(LongPtr ptr, uint16 offs, uint8 value); +void IndirWriteWord(LongPtr ptr, uint16 offs, uint16 value); + +static inline const uint8 *RomFixedPtr(uint32_t addr) { return &g_rom[(((addr >> 16) << 15) | (addr & 0x7fff)) & 0x3fffff]; } struct LongPtr; void mov24(LongPtr *dst, uint32 src); @@ -42,116 +46,83 @@ void copy24(LongPtr *dst, LongPtr *src); uint32 Load24(void *a); void MemCpy(void *dst, const void *src, int size); void Call(uint32 addr); +bool Unreachable(); -static inline uint8_t *RomPtr_RAM(uint16_t addr) { assert(addr < 0x2000); return g_ram + addr; } +#define INSTR_RETURN_ADDR(x) ((const uint16*)(uintptr_t)(x)) +#define INSTR_INCR_BYTES(x, n) ((const uint16*)((uintptr_t)(x) + n)) +#define INSTR_ADDR_TO_PTR(k, jp) ((uint8*)(jp) - (RomPtrWithBank(gEnemyData(k)->bank, 0x8000) - 0x8000)) -static inline uint8_t *RomPtr_7E(uint16_t addr) { return g_ram + addr; } -static inline uint8_t *RomPtr_7F(uint16_t addr) { return g_ram + 0x10000 + addr; } -static inline uint8_t *RomPtr_80(uint16_t addr) { return RomPtr(0x800000 | addr); } -static inline uint8_t *RomPtr_81(uint16_t addr) { return RomPtr(0x810000 | addr); } -static inline uint8_t *RomPtr_82(uint16_t addr) { return RomPtr(0x820000 | addr); } -static inline uint8_t *RomPtr_83(uint16_t addr) { return RomPtr(0x830000 | addr); } -static inline uint8_t *RomPtr_84(uint16_t addr) { return RomPtr(0x840000 | addr); } -static inline uint8_t *RomPtr_85(uint16_t addr) { return RomPtr(0x850000 | addr); } -static inline uint8_t *RomPtr_86(uint16_t addr) { return RomPtr(0x860000 | addr); } -static inline uint8_t *RomPtr_87(uint16_t addr) { return RomPtr(0x870000 | addr); } -static inline uint8_t *RomPtr_88(uint16_t addr) { return RomPtr(0x880000 | addr); } -static inline uint8_t *RomPtr_89(uint16_t addr) { return RomPtr(0x890000 | addr); } -static inline uint8_t *RomPtr_8A(uint16_t addr) { return RomPtr(0x8a0000 | addr); } -static inline uint8_t *RomPtr_8B(uint16_t addr) { return RomPtr(0x8b0000 | addr); } -static inline uint8_t *RomPtr_8C(uint16_t addr) { return RomPtr(0x8c0000 | addr); } -static inline uint8_t *RomPtr_8D(uint16_t addr) { return RomPtr(0x8d0000 | addr); } -static inline uint8_t *RomPtr_8E(uint16_t addr) { return RomPtr(0x8e0000 | addr); } -static inline uint8_t *RomPtr_8F(uint16_t addr) { return RomPtr(0x8f0000 | addr); } -static inline uint8_t *RomPtr_90(uint16_t addr) { return RomPtr(0x900000 | addr); } -static inline uint8_t *RomPtr_91(uint16_t addr) { return RomPtr(0x910000 | addr); } -static inline uint8_t *RomPtr_92(uint16_t addr) { return RomPtr(0x920000 | addr); } -static inline uint8_t *RomPtr_93(uint16_t addr) { return RomPtr(0x930000 | addr); } -static inline uint8_t *RomPtr_94(uint16_t addr) { return RomPtr(0x940000 | addr); } -static inline uint8_t *RomPtr_95(uint16_t addr) { return RomPtr(0x950000 | addr); } -static inline uint8_t *RomPtr_96(uint16_t addr) { return RomPtr(0x960000 | addr); } -static inline uint8_t *RomPtr_97(uint16_t addr) { return RomPtr(0x970000 | addr); } -static inline uint8_t *RomPtr_98(uint16_t addr) { return RomPtr(0x980000 | addr); } -static inline uint8_t *RomPtr_99(uint16_t addr) { return RomPtr(0x990000 | addr); } -static inline uint8_t *RomPtr_9A(uint16_t addr) { return RomPtr(0x9a0000 | addr); } -static inline uint8_t *RomPtr_9B(uint16_t addr) { return RomPtr(0x9b0000 | addr); } -static inline uint8_t *RomPtr_9C(uint16_t addr) { return RomPtr(0x9c0000 | addr); } -static inline uint8_t *RomPtr_9D(uint16_t addr) { return RomPtr(0x9d0000 | addr); } -static inline uint8_t *RomPtr_9E(uint16_t addr) { return RomPtr(0x9e0000 | addr); } -static inline uint8_t *RomPtr_9F(uint16_t addr) { return RomPtr(0x9f0000 | addr); } -static inline uint8_t *RomPtr_A0(uint16_t addr) { return RomPtr(0xa00000 | addr); } -static inline uint8_t *RomPtr_A1(uint16_t addr) { return RomPtr(0xa10000 | addr); } -static inline uint8_t *RomPtr_A2(uint16_t addr) { return RomPtr(0xa20000 | addr); } -static inline uint8_t *RomPtr_A3(uint16_t addr) { return RomPtr(0xa30000 | addr); } -static inline uint8_t *RomPtr_A4(uint16_t addr) { return RomPtr(0xa40000 | addr); } -static inline uint8_t *RomPtr_A5(uint16_t addr) { return RomPtr(0xa50000 | addr); } -static inline uint8_t *RomPtr_A6(uint16_t addr) { return RomPtr(0xa60000 | addr); } -static inline uint8_t *RomPtr_A7(uint16_t addr) { return RomPtr(0xa70000 | addr); } -static inline uint8_t *RomPtr_A8(uint16_t addr) { return RomPtr(0xa80000 | addr); } -static inline uint8_t *RomPtr_A9(uint16_t addr) { return RomPtr(0xa90000 | addr); } -static inline uint8_t *RomPtr_AA(uint16_t addr) { return RomPtr(0xaa0000 | addr); } -static inline uint8_t *RomPtr_AB(uint16_t addr) { return RomPtr(0xab0000 | addr); } -static inline uint8_t *RomPtr_AC(uint16_t addr) { return RomPtr(0xac0000 | addr); } -static inline uint8_t *RomPtr_AD(uint16_t addr) { return RomPtr(0xad0000 | addr); } -static inline uint8_t *RomPtr_AE(uint16_t addr) { return RomPtr(0xae0000 | addr); } -static inline uint8_t *RomPtr_AF(uint16_t addr) { return RomPtr(0xaf0000 | addr); } -static inline uint8_t *RomPtr_B0(uint16_t addr) { return RomPtr(0xb00000 | addr); } -static inline uint8_t *RomPtr_B1(uint16_t addr) { return RomPtr(0xb10000 | addr); } -static inline uint8_t *RomPtr_B2(uint16_t addr) { return RomPtr(0xb20000 | addr); } -static inline uint8_t *RomPtr_B3(uint16_t addr) { return RomPtr(0xb30000 | addr); } -static inline uint8_t *RomPtr_B4(uint16_t addr) { return RomPtr(0xb40000 | addr); } -static inline uint8_t *RomPtr_B5(uint16_t addr) { return RomPtr(0xb50000 | addr); } -static inline uint8_t *RomPtr_B6(uint16_t addr) { return RomPtr(0xb60000 | addr); } -static inline uint8_t *RomPtr_B7(uint16_t addr) { return RomPtr(0xb70000 | addr); } -static inline uint8_t *RomPtr_B8(uint16_t addr) { return RomPtr(0xb80000 | addr); } -static inline uint8_t *RomPtr_B9(uint16_t addr) { return RomPtr(0xb90000 | addr); } -static inline uint8_t *RomPtr_BA(uint16_t addr) { return RomPtr(0xba0000 | addr); } -static inline uint8_t *RomPtr_BB(uint16_t addr) { return RomPtr(0xbb0000 | addr); } -static inline uint8_t *RomPtr_BC(uint16_t addr) { return RomPtr(0xbc0000 | addr); } -static inline uint8_t *RomPtr_BD(uint16_t addr) { return RomPtr(0xbd0000 | addr); } -static inline uint8_t *RomPtr_BE(uint16_t addr) { return RomPtr(0xbe0000 | addr); } -static inline uint8_t *RomPtr_BF(uint16_t addr) { return RomPtr(0xbf0000 | addr); } -static inline uint8_t *RomPtr_C0(uint16_t addr) { return RomPtr(0xc00000 | addr); } -static inline uint8_t *RomPtr_C1(uint16_t addr) { return RomPtr(0xc10000 | addr); } -static inline uint8_t *RomPtr_C2(uint16_t addr) { return RomPtr(0xc20000 | addr); } -static inline uint8_t *RomPtr_C3(uint16_t addr) { return RomPtr(0xc30000 | addr); } -static inline uint8_t *RomPtr_C4(uint16_t addr) { return RomPtr(0xc40000 | addr); } -static inline uint8_t *RomPtr_C5(uint16_t addr) { return RomPtr(0xc50000 | addr); } -static inline uint8_t *RomPtr_C6(uint16_t addr) { return RomPtr(0xc60000 | addr); } -static inline uint8_t *RomPtr_C7(uint16_t addr) { return RomPtr(0xc70000 | addr); } -static inline uint8_t *RomPtr_C8(uint16_t addr) { return RomPtr(0xc80000 | addr); } -static inline uint8_t *RomPtr_C9(uint16_t addr) { return RomPtr(0xc90000 | addr); } -static inline uint8_t *RomPtr_CA(uint16_t addr) { return RomPtr(0xca0000 | addr); } -static inline uint8_t *RomPtr_CB(uint16_t addr) { return RomPtr(0xcb0000 | addr); } -static inline uint8_t *RomPtr_CC(uint16_t addr) { return RomPtr(0xcc0000 | addr); } -static inline uint8_t *RomPtr_CD(uint16_t addr) { return RomPtr(0xcd0000 | addr); } -static inline uint8_t *RomPtr_CE(uint16_t addr) { return RomPtr(0xce0000 | addr); } -static inline uint8_t *RomPtr_CF(uint16_t addr) { return RomPtr(0xcf0000 | addr); } -static inline uint8_t *RomPtr_D0(uint16_t addr) { return RomPtr(0xd00000 | addr); } -static inline uint8_t *RomPtr_D1(uint16_t addr) { return RomPtr(0xd10000 | addr); } -static inline uint8_t *RomPtr_D2(uint16_t addr) { return RomPtr(0xd20000 | addr); } -static inline uint8_t *RomPtr_D3(uint16_t addr) { return RomPtr(0xd30000 | addr); } -static inline uint8_t *RomPtr_D4(uint16_t addr) { return RomPtr(0xd40000 | addr); } -static inline uint8_t *RomPtr_D5(uint16_t addr) { return RomPtr(0xd50000 | addr); } -static inline uint8_t *RomPtr_D6(uint16_t addr) { return RomPtr(0xd60000 | addr); } -static inline uint8_t *RomPtr_D7(uint16_t addr) { return RomPtr(0xd70000 | addr); } -static inline uint8_t *RomPtr_D8(uint16_t addr) { return RomPtr(0xd80000 | addr); } -static inline uint8_t *RomPtr_D9(uint16_t addr) { return RomPtr(0xd90000 | addr); } -static inline uint8_t *RomPtr_DA(uint16_t addr) { return RomPtr(0xda0000 | addr); } -static inline uint8_t *RomPtr_DB(uint16_t addr) { return RomPtr(0xdb0000 | addr); } -static inline uint8_t *RomPtr_DC(uint16_t addr) { return RomPtr(0xdc0000 | addr); } -static inline uint8_t *RomPtr_DD(uint16_t addr) { return RomPtr(0xdd0000 | addr); } -static inline uint8_t *RomPtr_DE(uint16_t addr) { return RomPtr(0xde0000 | addr); } -static inline uint8_t *RomPtr_DF(uint16_t addr) { return RomPtr(0xdf0000 | addr); } +#define INSTRB_RETURN_ADDR(x) ((const uint8*)(uintptr_t)(x)) -static inline uint8_t *RomPtrWithBank(uint8 bank, uint16_t addr) { return RomPtr((bank << 16) | addr); } +#if defined(_DEBUG) +// Gives better warning messages but non inlined on tcc +static inline uint16 GET_WORD(const uint8 *p) { return *(uint16 *)(p); } +#else +#define GET_WORD(p) (*(uint16*)(p)) +#endif + +#define GET_BYTE(p) (*(uint8*)(p)) + +static inline uint8 *RomPtr_RAM(uint16_t addr) { assert(addr < 0x2000); return g_ram + addr; } +static inline const uint8 *RomPtr_80(uint16_t addr) { return RomPtr(0x800000 | addr); } +static inline const uint8 *RomPtr_81(uint16_t addr) { return RomPtr(0x810000 | addr); } +static inline const uint8 *RomPtr_82(uint16_t addr) { return RomPtr(0x820000 | addr); } +static inline const uint8 *RomPtr_83(uint16_t addr) { return RomPtr(0x830000 | addr); } +static inline const uint8 *RomPtr_84(uint16_t addr) { return RomPtr(0x840000 | addr); } +static inline const uint8 *RomPtr_85(uint16_t addr) { return RomPtr(0x850000 | addr); } +static inline const uint8 *RomPtr_86(uint16_t addr) { return RomPtr(0x860000 | addr); } +static inline const uint8 *RomPtr_87(uint16_t addr) { return RomPtr(0x870000 | addr); } +static inline const uint8 *RomPtr_88(uint16_t addr) { return RomPtr(0x880000 | addr); } +static inline const uint8 *RomPtr_89(uint16_t addr) { return RomPtr(0x890000 | addr); } +static inline const uint8 *RomPtr_8A(uint16_t addr) { return RomPtr(0x8a0000 | addr); } +static inline const uint8 *RomPtr_8B(uint16_t addr) { return RomPtr(0x8b0000 | addr); } +static inline const uint8 *RomPtr_8C(uint16_t addr) { return RomPtr(0x8c0000 | addr); } +static inline const uint8 *RomPtr_8D(uint16_t addr) { return RomPtr(0x8d0000 | addr); } +static inline const uint8 *RomPtr_8E(uint16_t addr) { return RomPtr(0x8e0000 | addr); } +static inline const uint8 *RomPtr_8F(uint16_t addr) { return RomPtr(0x8f0000 | addr); } +static inline const uint8 *RomPtr_90(uint16_t addr) { return RomPtr(0x900000 | addr); } +static inline const uint8 *RomPtr_91(uint16_t addr) { return RomPtr(0x910000 | addr); } +static inline const uint8 *RomPtr_92(uint16_t addr) { return RomPtr(0x920000 | addr); } +static inline const uint8 *RomPtr_93(uint16_t addr) { return RomPtr(0x930000 | addr); } +static inline const uint8 *RomPtr_94(uint16_t addr) { return RomPtr(0x940000 | addr); } +static inline const uint8 *RomPtr_95(uint16_t addr) { return RomPtr(0x950000 | addr); } +static inline const uint8 *RomPtr_96(uint16_t addr) { return RomPtr(0x960000 | addr); } +static inline const uint8 *RomPtr_97(uint16_t addr) { return RomPtr(0x970000 | addr); } +static inline const uint8 *RomPtr_98(uint16_t addr) { return RomPtr(0x980000 | addr); } +static inline const uint8 *RomPtr_99(uint16_t addr) { return RomPtr(0x990000 | addr); } +static inline const uint8 *RomPtr_9A(uint16_t addr) { return RomPtr(0x9a0000 | addr); } +static inline const uint8 *RomPtr_9B(uint16_t addr) { return RomPtr(0x9b0000 | addr); } +static inline const uint8 *RomPtr_9C(uint16_t addr) { return RomPtr(0x9c0000 | addr); } +static inline const uint8 *RomPtr_9D(uint16_t addr) { return RomPtr(0x9d0000 | addr); } +static inline const uint8 *RomPtr_9E(uint16_t addr) { return RomPtr(0x9e0000 | addr); } +static inline const uint8 *RomPtr_9F(uint16_t addr) { return RomPtr(0x9f0000 | addr); } +static inline const uint8 *RomPtr_A0(uint16_t addr) { return RomPtr(0xa00000 | addr); } +static inline const uint8 *RomPtr_A1(uint16_t addr) { return RomPtr(0xa10000 | addr); } +static inline const uint8 *RomPtr_A2(uint16_t addr) { return RomPtr(0xa20000 | addr); } +static inline const uint8 *RomPtr_A3(uint16_t addr) { return RomPtr(0xa30000 | addr); } +static inline const uint8 *RomPtr_A4(uint16_t addr) { return RomPtr(0xa40000 | addr); } +static inline const uint8 *RomPtr_A5(uint16_t addr) { return RomPtr(0xa50000 | addr); } +static inline const uint8 *RomPtr_A6(uint16_t addr) { return RomPtr(0xa60000 | addr); } +static inline const uint8 *RomPtr_A7(uint16_t addr) { return RomPtr(0xa70000 | addr); } +static inline const uint8 *RomPtr_A8(uint16_t addr) { return RomPtr(0xa80000 | addr); } +static inline const uint8 *RomPtr_A9(uint16_t addr) { return RomPtr(0xa90000 | addr); } +static inline const uint8 *RomPtr_AA(uint16_t addr) { return RomPtr(0xaa0000 | addr); } +static inline const uint8 *RomPtr_AB(uint16_t addr) { return RomPtr(0xab0000 | addr); } +static inline const uint8 *RomPtr_AC(uint16_t addr) { return RomPtr(0xac0000 | addr); } +static inline const uint8 *RomPtr_AD(uint16_t addr) { return RomPtr(0xad0000 | addr); } +static inline const uint8 *RomPtr_AE(uint16_t addr) { return RomPtr(0xae0000 | addr); } +static inline const uint8 *RomPtr_AF(uint16_t addr) { return RomPtr(0xaf0000 | addr); } +static inline const uint8 *RomPtr_B2(uint16_t addr) { return RomPtr(0xb20000 | addr); } +static inline const uint8 *RomPtr_B3(uint16_t addr) { return RomPtr(0xb30000 | addr); } +static inline const uint8 *RomPtr_B4(uint16_t addr) { return RomPtr(0xb40000 | addr); } +static inline const uint8 *RomPtr_B7(uint16_t addr) { return RomPtr(0xb70000 | addr); } +static inline const uint8 *RomPtrWithBank(uint8 bank, uint16_t addr) { return RomPtr((bank << 16) | addr); } void WriteReg(uint16 reg, uint8 value); void WriteRegWord(uint16 reg, uint16 value); uint16 ReadRegWord(uint16 reg); uint8 ReadReg(uint16 reg); - typedef void RunFrameFunc(uint16 input, int run_what); typedef void SyncAllFunc(); @@ -213,39 +184,31 @@ struct VramWriteEntry; PairU16 MakePairU16(uint16 k, uint16 j); -#define R0_ (*(LongPtr*)(g_ram+0x0)) -#define R3_ (*(LongPtr*)(g_ram+0x3)) -#define byte_7E0002 R0_.bank - -#define kPoseParams ((SamusPoseParams*)RomPtr(0x91b629)) -#define kAtmosphericGraphicAnimationTimers ((uint16*)RomPtr(0x908b93)) -#define kAtmosphericTypeNumFrames ((uint16*)RomPtr(0x908bef)) -#define g_off_908BFF ((uint16*)RomPtr(0x908bff)) -#define g_stru_90A83A ((DisableMinimapAndMarkBossRoomAsExploredEnt*)RomPtr(0x90a83a)) -#define kPlayerPoseToPtr ((uint16*)RomPtr(0x90c7df)) -#define kDrawArmCannon_Tab2 ((uint16*)RomPtr(0x90c7a5)) +#define kPoseParams ((SamusPoseParams*)RomFixedPtr(0x91b629)) +#define kAtmosphericGraphicAnimationTimers ((uint16*)RomFixedPtr(0x908b93)) +#define kAtmosphericTypeNumFrames ((uint16*)RomFixedPtr(0x908bef)) +#define g_off_908BFF ((uint16*)RomFixedPtr(0x908bff)) +#define g_stru_90A83A ((DisableMinimapAndMarkBossRoomAsExploredEnt*)RomFixedPtr(0x90a83a)) +#define kPlayerPoseToPtr ((uint16*)RomFixedPtr(0x90c7df)) +#define kDrawArmCannon_Tab2 ((uint16*)RomFixedPtr(0x90c7a5)) extern const int16 kSinCosTable8bit_Sext[320]; -#define kPoseTransitionTable ((uint16*)RomPtr(0x919ee2)) -#define kDemoSetDefPtrs ((uint16*)RomPtr(0x918885)) -#define kSpeedBoostToCtr ((uint16*)RomPtr(0x91b61f)) -#define kSpeedBoostToAnimFramePtr ((uint16 *)RomPtr(0x91B5DE)) -#define kSamusPoseToBaseSpritemapIndexTop ((uint16*)RomPtr(0x929263)) -#define kSamusPoseToBaseSpritemapIndexBottom ((uint16*)RomPtr(0x92945d)) -#define kSamusAnimationDelayData ((uint16*)RomPtr(0x91b010)) - -bool Unreachable(); - - -#define kCommonEnemySpeeds_Linear ((uint16*)RomPtr(0xa28187)) -#define kCommonEnemySpeeds_Quadratic ((uint16*)RomPtr(0xa2838f)) -#define kSine16bit ((uint16*)RomPtr(0xa0b1c3)) -#define kOamExtra_X8Small_And_Large ((uint16*)RomPtr(0x81839f)) -#define kOamExtra_Address_And_X8Large ((uint16*)RomPtr(0x81859f)) -#define kTanTable ((uint16*)RomPtr(0x91c9d4)) +#define kPoseTransitionTable ((uint16*)RomFixedPtr(0x919ee2)) +#define kDemoSetDefPtrs ((uint16*)RomFixedPtr(0x918885)) +#define kSpeedBoostToCtr ((uint16*)RomFixedPtr(0x91b61f)) +#define kSpeedBoostToAnimFramePtr ((uint16 *)RomFixedPtr(0x91B5DE)) +#define kSamusPoseToBaseSpritemapIndexTop ((uint16*)RomFixedPtr(0x929263)) +#define kSamusPoseToBaseSpritemapIndexBottom ((uint16*)RomFixedPtr(0x92945d)) +#define kSamusAnimationDelayData ((uint16*)RomFixedPtr(0x91b010)) +#define kCommonEnemySpeeds_Linear ((uint16*)RomFixedPtr(0xa28187)) +#define kCommonEnemySpeeds_Quadratic ((uint16*)RomFixedPtr(0xa2838f)) +#define kSine16bit ((uint16*)RomFixedPtr(0xa0b1c3)) +#define kOamExtra_X8Small_And_Large ((uint16*)RomFixedPtr(0x81839f)) +#define kOamExtra_Address_And_X8Large ((uint16*)RomFixedPtr(0x81859f)) +#define kTanTable ((uint16*)RomFixedPtr(0x91c9d4)) void CallEnemyAi(uint32 ea); void CallEnemyPreInstr(uint32 ea); -uint16 CallEnemyInstr(uint32 ea, uint16 k, uint16 j); +const uint16 *CallEnemyInstr(uint32 ea, uint16 k, const uint16 *jp); void CalculateBlockContainingPixelPos(uint16 xpos, uint16 ypos); @@ -460,4 +423,3 @@ typedef enum SnesRegs { UNUSED7 = 0x437B, MIRR7 = 0x437F, } SnesRegs; - diff --git a/src/types.h b/src/types.h index dc05f79..f186a29 100644 --- a/src/types.h +++ b/src/types.h @@ -143,6 +143,10 @@ typedef struct Point16U { #define HIBYTE(x) BYTEn(x,HIGH_IND(x,uint8)) #define HIWORD(x) WORDn(x,HIGH_IND(x,uint16)) +#define GET_HIBYTE(x) (((x) & 0xff00) >> 8) + +#define PAIR16(high, low) ((uint16)((high) << 8) | (uint8)low) + // Generate a pair of operands. #define __PAIR32__(high, low) (((uint32) (high) << 16) | (uint16)(low)) diff --git a/src/variables.h b/src/variables.h index 7d0d2f7..15bd728 100644 --- a/src/variables.h +++ b/src/variables.h @@ -4,11 +4,16 @@ extern uint8 g_ram[0x20000]; + +// Aliasing +// This is used in some R18:R20 places to multiply by 256 +#define R19_ (*(uint16*)(g_ram+0x13)) + #define R0_ (*(LongPtr*)(g_ram+0x0)) #define R3_ (*(LongPtr*)(g_ram+0x3)) -#define R6_ (*(uint16*)(g_ram+0x6)) -#define R8_ (*(uint16*)(g_ram+0x8)) -#define R10_ (*(uint16*)(g_ram+0xA)) +#define R6_ (*(LongPtr*)(g_ram+0x6)) +#define R9_ (*(LongPtr*)(g_ram+0x9)) + #define R12_ (*(uint16*)(g_ram+0xC)) #define R14_ (*(uint16*)(g_ram+0xE)) #define R16_ (*(uint16*)(g_ram+0x10)) @@ -18,8 +23,8 @@ extern uint8 g_ram[0x20000]; #define R24_ (*(uint16*)(g_ram+0x18)) #define R26_ (*(uint16*)(g_ram+0x1A)) #define R28_ (*(uint16*)(g_ram+0x1C)) -#define g_word_7E001E (*(uint16*)(g_ram+0x1E)) -#define R32 (*(uint16*)(g_ram+0x20)) +#define R30_ (*(uint16*)(g_ram+0x1E)) +#define R32_ (*(uint16*)(g_ram+0x20)) #define R34 (*(uint16*)(g_ram+0x22)) #define R36 (*(uint16*)(g_ram+0x24)) #define R38 (*(uint16*)(g_ram+0x26)) @@ -35,12 +40,12 @@ extern uint8 g_ram[0x20000]; #define g_byte_7E003A (*(uint8*)(g_ram+0x3A)) #define nmicopy1_var_d (*(uint16*)(g_ram+0x3C)) #define g_word_7E003E (*(uint16*)(g_ram+0x3E)) -#define decompress_dst_tmp (*(LongPtr*)(g_ram+0x44)) -#define decompress_src (*(LongPtr*)(g_ram+0x47)) -#define decompress_last_byte (*(uint8*)(g_ram+0x4A)) -#define decompress_tmp1 (*(uint8*)(g_ram+0x4B)) -#define decompress_dst (*(LongPtr*)(g_ram+0x4C)) -#define decompress_want_xor (*(uint16*)(g_ram+0x4F)) +#define REMOVED_decompress_dst_tmp (*(LongPtr*)(g_ram+0x44)) +#define REMOVED_decompress_src (*(LongPtr*)(g_ram+0x47)) +#define REMOVED_decompress_last_byte (*(uint8*)(g_ram+0x4A)) +#define REMOVED_decompress_tmp1 (*(uint8*)(g_ram+0x4B)) +#define REMOVED_decompress_dst (*(LongPtr*)(g_ram+0x4C)) +#define REMOVED_decompress_want_xor (*(uint16*)(g_ram+0x4F)) #define reg_INIDISP (*(uint8*)(g_ram+0x51)) #define reg_OBSEL (*(uint8*)(g_ram+0x52)) #define reg_OAMaddr_UNUSED (*(uint16*)(g_ram+0x53)) @@ -518,6 +523,13 @@ extern uint8 g_ram[0x20000]; #define demo_input (*(uint16*)(g_ram+0xA84)) #define demo_input_new (*(uint16*)(g_ram+0xA86)) #define demo_enable (*(uint16*)(g_ram+0xA88)) + +// These are aliased +#define hdma_ptr_1 (*(LongPtr*)(g_ram+0xA88)) +#define hdma_ptr_2 (*(LongPtr*)(g_ram+0xA8B)) +#define hdma_ptr_3 (*(LongPtr*)(g_ram+0xA8E)) +#define hdma_var_1 (*(uint16*)(g_ram+0xA91)) + #define demo_num_input_frames (*(uint16*)(g_ram+0xA8A)) #define demo_input_prev (*(uint16*)(g_ram+0xA8C)) #define demo_input_prev_new (*(uint16*)(g_ram+0xA8E)) @@ -717,8 +729,8 @@ extern uint8 g_ram[0x20000]; #define samus_collides_with_solid_enemy (*(uint16*)(g_ram+0xDCE)) #define samus_collision_flag (*(uint16*)(g_ram+0xDD0)) #define temp_collision_DD2 (*(uint16*)(g_ram+0xDD2)) -#define temp_collision_DD4 (*(uint16*)(g_ram+0xDD4)) -#define temp_collision_DD6 (*(uint16*)(g_ram+0xDD6)) +#define REMOVED_temp_collision_DD4 (*(uint16*)(g_ram+0xDD4)) +#define REMOVED_temp_collision_DD6 (*(uint16*)(g_ram+0xDD6)) #define suit_pickup_light_beam_widening_speed (*(uint16*)(g_ram+0xDDC)) #define projectile_index (*(uint16*)(g_ram+0xDDE)) #define debug_invincibility (*(uint16*)(g_ram+0xDE0)) @@ -805,7 +817,7 @@ extern uint8 g_ram[0x20000]; #define active_enemy_indexes_write_ptr (*(uint16*)(g_ram+0x17A4)) #define interactive_enemy_indexes_write_ptr (*(uint16*)(g_ram+0x17A6)) #define active_enemy_indexes_index (*(uint16*)(g_ram+0x17A8)) -#define interactive_enemy_indexes_index (*(uint16*)(g_ram+0x17AA)) +#define REMOVED_interactive_enemy_indexes_index (*(uint16*)(g_ram+0x17AA)) #define active_enemy_indexes ((uint16*)(g_ram+0x17AC)) #define interactive_enemy_indexes ((uint16*)(g_ram+0x17EC)) #define enemy_index_colliding_dirs ((uint16*)(g_ram+0x182C))