Merge branch '0xb01u-leftover_functions'

This commit is contained in:
YohannDR 2024-03-07 21:29:14 +01:00
commit 090df37994
35 changed files with 471 additions and 6256 deletions

View File

@ -2,7 +2,7 @@
This is a work in progress decompilation of Metroid - Zero Mission.
2679/2721 functions decompiled (98.46%, 42 left)
2701/2721 functions decompiled (99.26%, 20 left)
0x76b014/0x76b014 bytes of data not in blobs (100%, 0 left)

View File

@ -608,8 +608,8 @@ lbl_08004b44: .4byte gMusicInfo
lbl_08004b48: .4byte sDma1ControlPointer
lbl_08004b4c: .4byte sDma1ControlValue
thumb_func_start sub_08004b50
sub_08004b50: @ 0x08004b50
thumb_func_start InitTrack
InitTrack: @ 0x08004b50
push {r4, r5, r6, r7, lr}
sub sp, #4
adds r4, r0, #0
@ -756,7 +756,7 @@ lbl_08004c4e:
ands r1, r3
subs r1, #1
adds r0, r4, #0
bl sub_080024c0
bl ClearRegistersForPsg
movs r3, #0
strb r3, [r4]
str r3, [r4, #0x24]
@ -820,7 +820,7 @@ lbl_08004cbc:
ands r1, r3
subs r1, #1
adds r0, r4, #0
bl sub_080024c0
bl ClearRegistersForPsg
movs r3, #0
strb r3, [r4]
str r3, [r4, #0x24]
@ -914,7 +914,7 @@ lbl_08004d5c:
beq lbl_08004d52
ldr r0, [r4]
ldr r1, [r6, #4]
bl sub_08004b50
bl InitTrack
movs r0, #0
str r0, [r6]
str r0, [r6, #4]
@ -1222,7 +1222,7 @@ sub_08004f8c: @ 0x08004f8c
movs r2, #2
orrs r1, r2
strb r1, [r4, #0x13]
bl sub_080020a4
bl unk_20a4
ldr r0, [r5, #0x48]
cmp r0, #0
beq lbl_08004fa8

View File

@ -371,7 +371,7 @@ lbl_08001354:
b lbl_080013d4
lbl_0800137c:
adds r0, r4, #0
bl sub_080020a4
bl unk_20a4
b lbl_080013d4
lbl_08001384:
ldrb r0, [r4, #0xd]
@ -383,7 +383,7 @@ lbl_08001384:
bne lbl_0800139a
strb r0, [r4]
adds r0, r4, #0
bl sub_080020a4
bl unk_20a4
lbl_0800139a:
strb r5, [r4, #0x10]
lsls r1, r5, #0x10
@ -949,7 +949,7 @@ lbl_080017ae:
lbl_080017b6:
adds r0, r4, #0
mov r1, r8
bl sub_080024c0
bl ClearRegistersForPsg
b lbl_08001834
lbl_080017c0:
lsls r0, r2, #0x18
@ -958,7 +958,7 @@ lbl_080017c0:
bne lbl_08001834
adds r0, r4, #0
mov r1, r8
bl sub_080024c0
bl ClearRegistersForPsg
strb r5, [r4]
b lbl_08001834
lbl_080017d4:
@ -1508,7 +1508,7 @@ lbl_08001bc8:
cmp r0, #0
beq lbl_08001bde
ldrb r0, [r6]
bl sub_08003d4c
bl ReplayQueuedMusic
lbl_08001bde:
mov r2, sl
strb r4, [r2]
@ -2189,8 +2189,8 @@ lbl_0800207a:
pop {r0}
bx r0
thumb_func_start sub_080020a4
sub_080020a4: @ 0x080020a4
thumb_func_start unk_20a4
unk_20a4: @ 0x080020a4
push {lr}
adds r2, r0, #0
ldr r0, [r2, #0x28]
@ -2296,7 +2296,7 @@ sub_08002140: @ 0x08002140
lsls r1, r1, #0x18
lsrs r1, r1, #0x18
adds r0, r2, #0
bl sub_080024c0
bl ClearRegistersForPsg
ldr r0, [r4, #0x4c]
movs r1, #0
strb r1, [r0]
@ -2357,7 +2357,7 @@ sub_080021b0: @ 0x080021b0
lsls r1, r1, #0x18
lsrs r1, r1, #0x18
adds r0, r2, #0
bl sub_080024c0
bl ClearRegistersForPsg
ldr r0, [r4, #0x4c]
movs r1, #0
strb r1, [r0]
@ -2809,8 +2809,8 @@ Music_EmptyCommand: @ 0x080024bc
bx lr
.align 2, 0
thumb_func_start sub_080024c0
sub_080024c0: @ 0x080024c0
thumb_func_start ClearRegistersForPsg
ClearRegistersForPsg: @ 0x080024c0
push {lr}
lsls r1, r1, #0x18
lsrs r1, r1, #0x18

File diff suppressed because it is too large Load Diff

View File

@ -3,7 +3,7 @@
#include "types.h"
u8 ProcessComplexOam(u32 oamSlot, s16 xPosition, s16 yPosition, u16 rotation, s16 scaling, u8 doubleSize, u8 flipSize);
void CalculateOamPart4(u16 rotation, s16 scaling, u8 oamSlot);
u8 ProcessComplexOam(u32 oamSlot, s16 xPosition, s16 yPosition, u16 rotation, s16 scaling, u16 doubleSize, u16 matrixNum);
void CalculateOamPart4(u16 rotation, s16 scaling, u16 oamSlot);
#endif /* COMPLEX_OAM_H */

View File

@ -25,8 +25,8 @@ void CutsceneUpdateBackgroundsPosition(u8 updateScrolling);
void CutsceneUpdateScreenShake(u8 affectVertical, struct CutsceneScreenShake* pShake);
void CutsceneStartScreenShake(struct CutsceneScreenShakeInfo shakeInfo, u16 bg);
void CutsceneUpdateSpecialEffect(void);
void CutsceneStartSpriteEffect(u16 bldcnt, u8 bldy, u8 interval, u8 intensity);
void CutsceneStartBackgroundEffect(u16 bldcnt, u8 bldalphaL, u8 bldalphaH, u8 interval, u8 intensity);
void CutsceneStartSpriteEffect(u16 bldcnt, u8 bldy, u32 interval, u8 intensity);
void CutsceneStartBackgroundEffect(u16 bldcnt, u8 bldalphaL, u8 bldalphaH, u32 interval, u8 intensity);
void CutsceneReset(void);
void unk_61f0c(void);
void unk_61f28(void);
@ -35,4 +35,4 @@ void unk_61f60(void);
u8 CutsceneStartBackgroundFading(u8 type);
u8 CutsceneUpdateFading(void);
#endif
#endif

View File

@ -5,7 +5,7 @@
#include "structs/menu.h"
#include "structs/cutscene.h"
u32 unk_68168(u16 param_1, u8 param_2, u32 param_3);
u32 unk_68168(u16 param_1, u8 param_2, s8 param_3);
u8 unk_681c8(void);
u32 PauseScreenUpdateOrStartFading(u8 stage);
void PauseScreenCopyPalramToEwram_Unused(u8 param_1);

View File

@ -13,7 +13,7 @@ void unk_378c(u16 musicTrack);
void CheckPlayTransitionMusicTrack(void);
void unk_38d8(void);
void UpdateMusicAfterAlarmDisable(void);
u16 DetermineNewMusicTrack(u16 musicTrack);
u32 DetermineNewMusicTrack(u16 musicTrack);
void unk_39c8(void);
void PlayMusic(u16 musicTrack, u8 priority);
void unk_3a6c(void);
@ -42,4 +42,4 @@ void ReplaySoundTest(u16 musicTrack);
void CheckReplayFileSelectMusic(u16 timer);
void unk_42bc(u16 musicTrack);
#endif /* MUSIC_WRAPPERS_H */
#endif /* MUSIC_WRAPPERS_H */

View File

@ -53,7 +53,7 @@ void ParasiteDying(struct SpriteData* pSprite);
void ParasiteMultipleDying(struct SpriteData* pSprite);
void ParasiteGrabGeron(struct SpriteData* pSprite);
void ParasiteGeronGrabbed(struct SpriteData* pSprite);
void ParasiteProjectilesCollision(struct SpriteData* pSprite);
void ParasiteBombCollision(struct SpriteData* pSprite);
void ParasiteMultiple(void);
void Parasite(void);

View File

@ -107,9 +107,9 @@ struct CutsceneGraphicsData {
struct CutsceneSpecialEffect {
u8 status;
u8 s_WrittenToBLDY;
u8 bg_WrittenToBLDALPHA_L;
u8 bg_WrittenToBLDALPHA_H;
u16 s_BLDCNT;
u8 bg_WrittenToBldalpha_L;
u8 bg_WrittenToBldalpha_H;
u16 s_Bldcnt;
u8 s_Intensity;
u8 s_Interval;
s8 s_Timer;

View File

@ -409,6 +409,9 @@ SECTIONS {
asm/disasm_0x080010c4.o(.text);
asm/disasm_0x08002a58.o(.text);
src/music_wrappers.o(.text);
asm/audio_internal.o(.text);
asm/syscalls.o(.text);

View File

@ -530,7 +530,7 @@ void PlayFadingSound(u16 sound, u16 timer)
*/
void InitFadingMusic(struct TrackData* pTrack, const u8* pHeader, u16 timer)
{
init_track(pTrack, pHeader);
InitTrack(pTrack, pHeader);
if (timer != 0 && !pTrack->occupied)
{
@ -686,7 +686,7 @@ void unk_2f00(u16 musicTrack1, u16 musicTrack2, u16 timer)
pTrack2->unk_24 = 0;
pTrack2->maxSoundChannels = gMusicInfo.maxSoundChannels;
init_track(pTrack1, pHeader);
InitTrack(pTrack1, pHeader);
pTrack1->flags = 0x40 | 0x2;
pTrack1->maybe_volume = 0;
pTrack1->fadingTimer = pTrack2->fadingTimer;

View File

@ -24,7 +24,7 @@
#ifdef NON_MATCHING
u32 BlockCheckCCAA(struct ClipdataBlockData* pClipBlock)
{
// https://decomp.me/scratch/o1iEv
// https://decomp.me/scratch/LL1r2
u32 result;
u32 bombChainType;

View File

@ -1112,7 +1112,7 @@ void unk_89600(struct MultiBootData* pMultiBoot, const u8* src, s32 length, u8 p
* @brief 896b8 | 14 | To document
*
* @param pMultiBoot Multi boot param pointer
* @return u8 To document
* @return u32 To document
*/
u32 unk_896b8(struct MultiBootData* pMultiBoot)
{
@ -1122,11 +1122,14 @@ u32 unk_896b8(struct MultiBootData* pMultiBoot)
return FALSE;
}
#ifdef NON_MATCHING
/**
* @brief 896cc | ec | To document
*
* @param pMultiBoot Multi boot param pointer
* @return u32 SIOCNT
*/
u32 unk_896cc(struct MultiBootData* pMultiBoot)
{
// https://decomp.me/scratch/6M5KZ
s32 i;
u32 value;
u16 var_0;
@ -1140,7 +1143,7 @@ u32 unk_896cc(struct MultiBootData* pMultiBoot)
pMultiBoot->systemWork_1[0] = 0x100000;
return CableLinkStartTransfer(pMultiBoot, 0);
default:
for (i = 3; i != 0; i--)
{
@ -1168,7 +1171,8 @@ u32 unk_896cc(struct MultiBootData* pMultiBoot)
}
pMultiBoot->systemWork_1[0] /= 32;
return_in_default_case:
return CableLinkStartTransfer(pMultiBoot, pMultiBoot->systemWork_1[0]);
case 231:
@ -1192,143 +1196,14 @@ u32 unk_896cc(struct MultiBootData* pMultiBoot)
pMultiBoot->systemWork_1[0] = value;
pMultiBoot->systemWork_1[1] = value;
#ifndef NON_MATCHING
goto return_in_default_case;
#else // NON_MATCHING
return CableLinkStartTransfer(pMultiBoot, pMultiBoot->systemWork_1[0]);
#endif // NON_MATCHING
}
}
#else
NAKED_FUNCTION
u32 unk_896cc(struct MultiBootData* pMultiBoot)
{
asm(" \n\
push {r4, r5, r6, lr} \n\
add r3, r0, #0 \n\
ldrb r0, [r3, #0x18] \n\
cmp r0, #0xe0 \n\
beq lbl_080896e8 \n\
cmp r0, #0xe0 \n\
blt lbl_080896f8 \n\
cmp r0, #0xe8 \n\
bgt lbl_080896f8 \n\
cmp r0, #0xe7 \n\
blt lbl_080896f8 \n\
movs r4, #3 \n\
ldrb r5, [r3, #0x1e] \n\
b lbl_08089758 \n\
lbl_080896e8: \n\
movs r1, #0 \n\
movs r0, #0xe1 \n\
strb r0, [r3, #0x18] \n\
str r1, [r3, #4] \n\
movs r0, #0x80 \n\
lsl r0, r0, #0xd \n\
str r0, [r3] \n\
b lbl_0808974a \n\
lbl_080896f8: \n\
movs r4, #3 \n\
ldrb r5, [r3, #0x1e] \n\
movs r6, #1 \n\
ldr r1, lbl_08089754 @ =0x04000126 \n\
lbl_08089700: \n\
ldrh r0, [r1] \n\
add r2, r0, #0 \n\
add r0, r5, #0 \n\
asr r0, r4 \n\
and r0, r6 \n\
cmp r0, #0 \n\
beq lbl_08089714 \n\
ldr r0, [r3, #4] \n\
cmp r2, r0 \n\
bne lbl_080896e8 \n\
lbl_08089714: \n\
sub r1, #2 \n\
sub r4, #1 \n\
cmp r4, #0 \n\
bne lbl_08089700 \n\
ldrb r0, [r3, #0x18] \n\
add r0, #1 \n\
strb r0, [r3, #0x18] \n\
ldr r1, [r3] \n\
ldrh r0, [r3] \n\
str r0, [r3, #4] \n\
cmp r1, #0 \n\
bne lbl_08089742 \n\
ldr r0, [r3, #0x28] \n\
add r1, r0, #0 \n\
add r1, #0xac \n\
ldrb r1, [r1] \n\
add r0, #0xad \n\
ldrb r0, [r0] \n\
lsl r0, r0, #8 \n\
orr r1, r0 \n\
str r1, [r3, #4] \n\
lsl r1, r1, #5 \n\
str r1, [r3] \n\
lbl_08089742: \n\
ldr r0, [r3] \n\
lsr r0, r0, #5 \n\
str r0, [r3] \n\
lbl_08089748: \n\
ldrh r1, [r3] \n\
lbl_0808974a: \n\
add r0, r3, #0 \n\
bl CableLinkStartTransfer \n\
b lbl_080897b0 \n\
.align 2, 0 \n\
lbl_08089754: .4byte 0x04000126 \n\
lbl_08089758: \n\
lsl r0, r4, #1 \n\
ldr r1, lbl_080897a0 @ =0x04000120 \n\
add r0, r0, r1 \n\
ldrh r0, [r0] \n\
add r2, r0, #0 \n\
add r0, r5, #0 \n\
asr r0, r4 \n\
movs r1, #1 \n\
and r0, r1 \n\
cmp r0, #0 \n\
beq lbl_08089774 \n\
ldr r0, [r3, #4] \n\
cmp r2, r0 \n\
bne lbl_080897a4 \n\
lbl_08089774: \n\
sub r4, #1 \n\
cmp r4, #0 \n\
bne lbl_08089758 \n\
ldrb r0, [r3, #0x18] \n\
add r0, #1 \n\
strb r0, [r3, #0x18] \n\
lsl r0, r0, #0x18 \n\
lsr r0, r0, #0x18 \n\
cmp r0, #0xe9 \n\
beq lbl_080897ae \n\
ldr r0, [r3, #0x28] \n\
add r1, r0, #0 \n\
add r1, #0xae \n\
ldrb r1, [r1] \n\
add r0, #0xaf \n\
ldrb r0, [r0] \n\
lsl r0, r0, #8 \n\
orr r1, r0 \n\
str r1, [r3] \n\
str r1, [r3, #4] \n\
b lbl_08089748 \n\
.align 2, 0 \n\
lbl_080897a0: .4byte 0x04000120 \n\
lbl_080897a4: \n\
add r0, r3, #0 \n\
bl CableLinkResetTransfer \n\
movs r0, #0x71 \n\
b lbl_080897b0 \n\
lbl_080897ae: \n\
movs r0, #0 \n\
lbl_080897b0: \n\
pop {r4, r5, r6} \n\
pop {r1} \n\
bx r1 \n\
");
}
#endif
/**
* @brief 897b8 | 18 | Checks for the current memory region (where execution is)

View File

@ -612,16 +612,23 @@ void ApplySpecialBackgroundFadingColor(u8 type, u8 color, u16** ppSrc, u16** ppD
}
}
#ifdef NON_MATCHING
/**
* @brief 5bbe4 | cc | Applies a fade effect on a color, unused
*
* @param type Fading type
* @param color Color
* @param currentColor Current color
*/
u16 ApplyFadeOnColor(u8 type, u16 color, u8 currentColor)
{
// https://decomp.me/scratch/RdwBt
u8 red;
u8 green;
u8 blue;
s32 red;
s32 green;
s32 blue;
u32 tmp_red;
red = RED(color);
tmp_red = RED(color);
red = tmp_red; // Needed to produce matching ASM.
green = GREEN(color);
blue = BLUE(color);
@ -654,120 +661,3 @@ u16 ApplyFadeOnColor(u8 type, u16 color, u8 currentColor)
return COLOR_GRAD(red, green, blue);
}
#else
NAKED_FUNCTION
u16 ApplyFadeOnColor(u8 type, u16 color, u8 currentColor)
{
asm(" \n\
push {r4, r5, r6, r7, lr} \n\
lsl r0, r0, #0x18 \n\
lsr r6, r0, #0x18 \n\
mov ip, r6 \n\
lsl r1, r1, #0x10 \n\
lsr r1, r1, #0x10 \n\
lsl r2, r2, #0x18 \n\
lsr r5, r2, #0x18 \n\
movs r7, #0x1f \n\
add r3, r1, #0 \n\
and r3, r7 \n\
movs r0, #0xf8 \n\
lsl r0, r0, #2 \n\
and r0, r1 \n\
lsr r4, r0, #5 \n\
movs r0, #0xf8 \n\
lsl r0, r0, #7 \n\
and r0, r1 \n\
lsr r2, r0, #0xa \n\
cmp r6, #1 \n\
beq lbl_0805bc3e \n\
cmp r6, #1 \n\
bgt lbl_0805bc18 \n\
cmp r6, #0 \n\
beq lbl_0805bc24 \n\
b lbl_0805bc9e \n\
lbl_0805bc18: \n\
mov r0, ip \n\
cmp r0, #2 \n\
beq lbl_0805bc5e \n\
cmp r0, #3 \n\
beq lbl_0805bc7e \n\
b lbl_0805bc9e \n\
lbl_0805bc24: \n\
add r0, r3, #0 \n\
mul r0, r5, r0 \n\
asr r3, r0, #5 \n\
movs r1, #0x1f \n\
and r3, r1 \n\
add r0, r4, #0 \n\
mul r0, r5, r0 \n\
asr r4, r0, #5 \n\
and r4, r1 \n\
add r0, r2, #0 \n\
mul r0, r5, r0 \n\
asr r2, r0, #5 \n\
b lbl_0805bc9c \n\
lbl_0805bc3e: \n\
sub r0, r7, r3 \n\
mul r0, r5, r0 \n\
asr r0, r0, #5 \n\
movs r1, #0x1f \n\
sub r3, r1, r0 \n\
and r3, r1 \n\
sub r0, r7, r4 \n\
mul r0, r5, r0 \n\
asr r0, r0, #5 \n\
sub r4, r1, r0 \n\
and r4, r1 \n\
sub r0, r7, r2 \n\
mul r0, r5, r0 \n\
asr r0, r0, #5 \n\
sub r2, r1, r0 \n\
b lbl_0805bc9c \n\
lbl_0805bc5e: \n\
add r0, r3, #0 \n\
mul r0, r5, r0 \n\
asr r0, r0, #5 \n\
sub r3, r3, r0 \n\
movs r1, #0x1f \n\
and r3, r1 \n\
add r0, r4, #0 \n\
mul r0, r5, r0 \n\
asr r0, r0, #5 \n\
sub r4, r4, r0 \n\
and r4, r1 \n\
add r0, r2, #0 \n\
mul r0, r5, r0 \n\
asr r0, r0, #5 \n\
sub r2, r2, r0 \n\
b lbl_0805bc9c \n\
lbl_0805bc7e: \n\
sub r0, r7, r3 \n\
mul r0, r5, r0 \n\
asr r0, r0, #5 \n\
add r3, r3, r0 \n\
movs r1, #0x1f \n\
and r3, r1 \n\
sub r0, r7, r4 \n\
mul r0, r5, r0 \n\
asr r0, r0, #5 \n\
add r4, r4, r0 \n\
and r4, r1 \n\
sub r0, r7, r2 \n\
mul r0, r5, r0 \n\
asr r0, r0, #5 \n\
add r2, r2, r0 \n\
lbl_0805bc9c: \n\
and r2, r1 \n\
lbl_0805bc9e: \n\
lsl r0, r4, #5 \n\
orr r3, r0 \n\
lsl r0, r2, #0xa \n\
orr r3, r0 \n\
lsl r0, r3, #0x10 \n\
lsr r0, r0, #0x10 \n\
pop {r4, r5, r6, r7} \n\
pop {r1} \n\
bx r1 \n\
");
}
#endif

View File

@ -6,11 +6,24 @@
#include "data/generic_data.h"
#include "data/intro_data.h"
#ifdef NON_MATCHING
u8 ProcessComplexOam(u32 oamSlot, s16 xPosition, s16 yPosition, u16 rotation, s16 scaling, u8 doubleSize, u8 matrixNum)
/**
* @brief 7fd64 | 1f4 | Processes complex OAM with rotation/scaling and other params
*
* @param oamSlot OAM Slot
* @param xPosition X Position
* @param yPosition Y Position
* @param rotation Rotation
* @param scaling Scaling
* @param doubleSize Double size
* @param matrixNum Matrix number
* @return u8 0
*/
u8 ProcessComplexOam(u32 oamSlot, s16 xPosition, s16 yPosition, u16 rotation, s16 scaling, u16 doubleSize, u16 matrixNum)
{
// https://decomp.me/scratch/rFihS
s32 _scaling;
u8 _doubleSize;
u8 _matrixNum;
s32 y;
s32 x;
s32 xOffset;
@ -26,6 +39,10 @@ u8 ProcessComplexOam(u32 oamSlot, s16 xPosition, s16 yPosition, u16 rotation, s1
s32 scaledX;
s32 scaledY;
_scaling = scaling;
_doubleSize = doubleSize;
_matrixNum = matrixNum;
xOffset = (s16)((u16)xPosition + BLOCK_SIZE);
yOffset = (s16)((u16)yPosition + BLOCK_SIZE);
@ -41,8 +58,8 @@ u8 ProcessComplexOam(u32 oamSlot, s16 xPosition, s16 yPosition, u16 rotation, s1
tmpX = (s16)(x - xOffset + unk_0);
tmpY = (s16)(y - yOffset + unk_1);
scaledX = (s16)(Q_24_8_TO_INT(tmpX * scaling) - tmpX);
scaledY = (s16)(Q_24_8_TO_INT(tmpY * scaling) - tmpY);
scaledX = (s16)(Q_24_8_TO_INT(tmpX * _scaling) - tmpX);
scaledY = (s16)(Q_24_8_TO_INT(tmpY * _scaling) - tmpY);
x = (s16)(x + scaledX);
y = (s16)(y + scaledY);
@ -53,7 +70,7 @@ u8 ProcessComplexOam(u32 oamSlot, s16 xPosition, s16 yPosition, u16 rotation, s1
x = Q_8_8_TO_SHORT(unk_2 * cos(rotation) - unk_3 * sin(rotation));
y = Q_8_8_TO_SHORT(unk_2 * sin(rotation) + unk_3 * cos(rotation));
if (!doubleSize)
if (!_doubleSize)
{
gOamData[oamSlot].split.affineMode = 1;
@ -71,27 +88,26 @@ u8 ProcessComplexOam(u32 oamSlot, s16 xPosition, s16 yPosition, u16 rotation, s1
gOamData[oamSlot].split.x = MOD_AND(x + xOffset - BLOCK_SIZE, 512);
gOamData[oamSlot].split.y = MOD_AND(y + yOffset - BLOCK_SIZE, 256);
if (gOamData[oamSlot].split.xFlip)
{
if (gOamData[oamSlot].split.yFlip)
{
gOamData[oamSlot].split.matrixNum = matrixNum + 3;
gOamData[oamSlot].split.matrixNum = _matrixNum + 3;
}
else
{
gOamData[oamSlot].split.matrixNum = matrixNum + 1;
gOamData[oamSlot].split.matrixNum = _matrixNum + 1;
}
}
else
{
if (gOamData[oamSlot].split.yFlip)
{
gOamData[oamSlot].split.matrixNum = matrixNum + 2;
gOamData[oamSlot].split.matrixNum = _matrixNum + 2;
}
else
{
gOamData[oamSlot].split.matrixNum = matrixNum;
gOamData[oamSlot].split.matrixNum = _matrixNum;
}
}
@ -100,269 +116,18 @@ u8 ProcessComplexOam(u32 oamSlot, s16 xPosition, s16 yPosition, u16 rotation, s1
return FALSE;
}
#else
NAKED_FUNCTION
u8 ProcessComplexOam(u32 oamSlot, s16 xPosition, s16 yPosition, u16 rotation, s16 scaling, u8 doubleSize, u8 matrixNum)
{
asm(" \n\
push {r4, r5, r6, r7, lr} \n\
mov r7, sl \n\
mov r6, sb \n\
mov r5, r8 \n\
push {r5, r6, r7} \n\
sub sp, #0x10 \n\
str r0, [sp] \n\
ldr r4, [sp, #0x30] \n\
ldr r0, [sp, #0x34] \n\
mov r8, r0 \n\
ldr r0, [sp, #0x38] \n\
lsl r1, r1, #0x10 \n\
lsl r2, r2, #0x10 \n\
lsl r3, r3, #0x10 \n\
lsr r3, r3, #0x10 \n\
lsl r4, r4, #0x10 \n\
asr r4, r4, #0x10 \n\
mov r5, r8 \n\
lsl r5, r5, #0x18 \n\
mov r8, r5 \n\
lsl r0, r0, #0x18 \n\
lsr r0, r0, #0x18 \n\
str r0, [sp, #4] \n\
movs r0, #0x80 \n\
lsl r0, r0, #0xf \n\
add r1, r1, r0 \n\
asr r1, r1, #0x10 \n\
str r1, [sp, #8] \n\
add r2, r2, r0 \n\
asr r2, r2, #0x10 \n\
str r2, [sp, #0xc] \n\
ldr r1, [sp] \n\
lsl r0, r1, #3 \n\
ldr r5, lbl_0807fe84 @ =gOamData \n\
add r7, r0, r5 \n\
ldrb r0, [r7, #1] \n\
mov sb, r0 \n\
mov r1, sb \n\
lsr r2, r1, #6 \n\
ldrb r0, [r7, #3] \n\
lsr r0, r0, #6 \n\
ldr r1, lbl_0807fe88 @ =sArray_45fd24 \n\
lsl r2, r2, #2 \n\
add r0, r0, r2 \n\
add r1, r0, r1 \n\
ldrb r1, [r1] \n\
mov ip, r1 \n\
ldr r1, lbl_0807fe8c @ =sArray_45fd30 \n\
add r0, r0, r1 \n\
ldrb r0, [r0] \n\
mov sl, r0 \n\
ldrh r0, [r7, #2] \n\
lsl r0, r0, #0x17 \n\
lsr r0, r0, #0x17 \n\
ldr r1, [sp, #8] \n\
add r5, r0, r1 \n\
ldr r1, lbl_0807fe90 @ =0x000001ff \n\
add r0, r1, #0 \n\
and r5, r0 \n\
ldrb r0, [r7] \n\
ldr r1, [sp, #0xc] \n\
add r6, r0, r1 \n\
movs r0, #0xff \n\
and r6, r0 \n\
ldr r1, [sp, #8] \n\
sub r0, r5, r1 \n\
add r0, ip \n\
lsl r0, r0, #0x10 \n\
asr r0, r0, #0x10 \n\
ldr r1, [sp, #0xc] \n\
sub r2, r6, r1 \n\
add r2, sl \n\
lsl r2, r2, #0x10 \n\
asr r2, r2, #0x10 \n\
add r1, r0, #0 \n\
mul r1, r4, r1 \n\
asr r1, r1, #8 \n\
sub r1, r1, r0 \n\
lsl r1, r1, #0x10 \n\
asr r1, r1, #0x10 \n\
add r0, r2, #0 \n\
mul r0, r4, r0 \n\
asr r0, r0, #8 \n\
sub r0, r0, r2 \n\
lsl r0, r0, #0x10 \n\
asr r0, r0, #0x10 \n\
add r1, r5, r1 \n\
lsl r1, r1, #0x10 \n\
asr r5, r1, #0x10 \n\
add r0, r6, r0 \n\
lsl r0, r0, #0x10 \n\
asr r6, r0, #0x10 \n\
ldr r0, [sp, #8] \n\
sub r4, r5, r0 \n\
add r4, ip \n\
lsl r4, r4, #0x10 \n\
asr r4, r4, #0x10 \n\
ldr r1, [sp, #0xc] \n\
sub r2, r6, r1 \n\
add r2, sl \n\
lsl r2, r2, #0x10 \n\
asr r2, r2, #0x10 \n\
ldr r5, lbl_0807fe94 @ =sSineTable \n\
add r0, r3, #0 \n\
add r0, #0x40 \n\
lsl r0, r0, #1 \n\
add r0, r0, r5 \n\
movs r1, #0 \n\
ldrsh r6, [r0, r1] \n\
add r1, r4, #0 \n\
mul r1, r6, r1 \n\
lsl r3, r3, #1 \n\
add r3, r3, r5 \n\
movs r5, #0 \n\
ldrsh r3, [r3, r5] \n\
add r0, r2, #0 \n\
mul r0, r3, r0 \n\
sub r1, r1, r0 \n\
lsl r1, r1, #8 \n\
asr r5, r1, #0x10 \n\
add r0, r4, #0 \n\
mul r0, r3, r0 \n\
add r1, r2, #0 \n\
mul r1, r6, r1 \n\
add r0, r0, r1 \n\
lsl r0, r0, #8 \n\
asr r6, r0, #0x10 \n\
mov r0, r8 \n\
cmp r0, #0 \n\
bne lbl_0807fe98 \n\
movs r0, #4 \n\
neg r0, r0 \n\
mov r1, sb \n\
and r0, r1 \n\
movs r1, #1 \n\
orr r0, r1 \n\
strb r0, [r7, #1] \n\
mov r1, ip \n\
sub r0, r5, r1 \n\
lsl r0, r0, #0x10 \n\
asr r5, r0, #0x10 \n\
mov r1, sl \n\
sub r0, r6, r1 \n\
b lbl_0807feb0 \n\
.align 2, 0 \n\
lbl_0807fe84: .4byte gOamData \n\
lbl_0807fe88: .4byte sArray_45fd24 \n\
lbl_0807fe8c: .4byte sArray_45fd30 \n\
lbl_0807fe90: .4byte 0x000001ff \n\
lbl_0807fe94: .4byte sSineTable \n\
lbl_0807fe98: \n\
movs r0, #3 \n\
mov r1, sb \n\
orr r0, r1 \n\
strb r0, [r7, #1] \n\
mov r1, ip \n\
lsl r0, r1, #1 \n\
sub r0, r5, r0 \n\
lsl r0, r0, #0x10 \n\
asr r5, r0, #0x10 \n\
mov r1, sl \n\
lsl r0, r1, #1 \n\
sub r0, r6, r0 \n\
lbl_0807feb0: \n\
lsl r0, r0, #0x10 \n\
asr r6, r0, #0x10 \n\
ldr r0, [sp] \n\
lsl r3, r0, #3 \n\
ldr r1, lbl_0807feec @ =gOamData \n\
add r7, r3, r1 \n\
ldr r0, [sp, #8] \n\
add r1, r5, r0 \n\
sub r1, #0x40 \n\
ldr r0, lbl_0807fef0 @ =0x000001ff \n\
and r1, r0 \n\
ldrh r2, [r7, #2] \n\
ldr r0, lbl_0807fef4 @ =0xfffffe00 \n\
and r0, r2 \n\
orr r0, r1 \n\
strh r0, [r7, #2] \n\
ldr r1, [sp, #0xc] \n\
add r0, r6, r1 \n\
sub r0, #0x40 \n\
strb r0, [r7] \n\
ldrb r4, [r7, #3] \n\
lsl r0, r4, #0x1b \n\
cmp r0, #0 \n\
bge lbl_0807fefe \n\
lsl r0, r4, #0x1a \n\
cmp r0, #0 \n\
bge lbl_0807fef8 \n\
ldr r0, [sp, #4] \n\
add r0, #3 \n\
b lbl_0807ff08 \n\
.align 2, 0 \n\
lbl_0807feec: .4byte gOamData \n\
lbl_0807fef0: .4byte 0x000001ff \n\
lbl_0807fef4: .4byte 0xfffffe00 \n\
lbl_0807fef8: \n\
ldr r0, [sp, #4] \n\
add r0, #1 \n\
b lbl_0807ff08 \n\
lbl_0807fefe: \n\
lsl r0, r4, #0x1a \n\
cmp r0, #0 \n\
bge lbl_0807ff1a \n\
ldr r0, [sp, #4] \n\
add r0, #2 \n\
lbl_0807ff08: \n\
movs r1, #7 \n\
and r0, r1 \n\
lsl r0, r0, #1 \n\
movs r1, #0xf \n\
neg r1, r1 \n\
and r1, r4 \n\
orr r1, r0 \n\
strb r1, [r7, #3] \n\
b lbl_0807ff2c \n\
lbl_0807ff1a: \n\
movs r0, #7 \n\
ldr r1, [sp, #4] \n\
and r1, r0 \n\
lsl r1, r1, #1 \n\
movs r0, #0xf \n\
neg r0, r0 \n\
and r0, r4 \n\
orr r0, r1 \n\
strb r0, [r7, #3] \n\
lbl_0807ff2c: \n\
ldr r5, lbl_0807ff54 @ =gOamData \n\
add r2, r3, r5 \n\
ldrb r1, [r2, #3] \n\
movs r0, #0x11 \n\
neg r0, r0 \n\
and r0, r1 \n\
movs r1, #0x21 \n\
neg r1, r1 \n\
and r0, r1 \n\
strb r0, [r2, #3] \n\
movs r0, #0 \n\
add sp, #0x10 \n\
pop {r3, r4, r5} \n\
mov r8, r3 \n\
mov sb, r4 \n\
mov sl, r5 \n\
pop {r4, r5, r6, r7} \n\
pop {r1} \n\
bx r1 \n\
.align 2, 0 \n\
lbl_0807ff54: .4byte gOamData \n\
");
}
#endif
#ifdef NON_MATCHING
void CalculateOamPart4(u16 rotation, s16 scaling, u8 oamSlot)
/**
* @brief 7ff58 | 19c | Calculates the part 4 of the OAM (used for special cases such as cutscenes and menus)
*
* @param rotation Rotation
* @param scaling Scaling
* @param oamSlot OAM Slot
*/
void CalculateOamPart4(u16 rotation, s16 scaling, u16 oamSlot)
{
// https://decomp.me/scratch/jijJJ
s32 negativeScaling;
u8 _oamSlot;
s32 dy1;
s32 dmy1;
@ -370,232 +135,39 @@ void CalculateOamPart4(u16 rotation, s16 scaling, u8 oamSlot)
s32 dmx1;
s32 dy2;
s32 dmy2;
s32 idx;
negativeScaling = scaling; // Needed to produce matching ASM.
_oamSlot = oamSlot; // Needed to produce matching ASM
dy1 = FixedMultiplication(cos(rotation), FixedInverse(scaling));
dmy1 = FixedMultiplication(sin(rotation), FixedInverse(scaling));
// The following expression writes uselessly first to dmy2 to produce matching ASM:
dmy1 = (dmy2 = FixedMultiplication(sin(rotation), FixedInverse(scaling)));
dx1 = FixedMultiplication(-sin(rotation), FixedInverse(scaling));
dmx1 = FixedMultiplication(cos(rotation), FixedInverse(-scaling));
negativeScaling = -scaling;
dy2 = FixedMultiplication(sin(rotation), FixedInverse(-scaling));
dmy2 = FixedMultiplication(-sin(rotation), FixedInverse(-scaling));
dmx1 = FixedMultiplication(cos(rotation), FixedInverse(negativeScaling));
gOamData[oamSlot].all.affineParam = dy1;
gOamData[oamSlot + 1].all.affineParam = dmy1;
gOamData[oamSlot + 2].all.affineParam = dx1;
gOamData[oamSlot + 3].all.affineParam = dy1;
gOamData[oamSlot + 4].all.affineParam = dmx1;
gOamData[oamSlot + 5].all.affineParam = dy2;
gOamData[oamSlot + 6].all.affineParam = dx1;
gOamData[oamSlot + 7].all.affineParam = dy1;
gOamData[oamSlot + 8].all.affineParam = dy1;
gOamData[oamSlot + 9].all.affineParam = dmy1;
gOamData[oamSlot + 10].all.affineParam = dmy2;
gOamData[oamSlot + 11].all.affineParam = dmx1;
gOamData[oamSlot + 12].all.affineParam = dmx1;
gOamData[oamSlot + 13].all.affineParam = dy2;
gOamData[oamSlot + 14].all.affineParam = dmy2;
gOamData[oamSlot + 15].all.affineParam = dmx1;
dy2 = FixedMultiplication(sin(rotation), FixedInverse(negativeScaling));
dmy2 = FixedMultiplication(-sin(rotation), FixedInverse(negativeScaling));
gOamData[_oamSlot].all.affineParam = dy1;
idx = _oamSlot + 1; // Needed to produce matching ASM.
gOamData[idx].all.affineParam = dmy1;
gOamData[_oamSlot + 2].all.affineParam = dx1;
gOamData[_oamSlot + 3].all.affineParam = dy1;
gOamData[_oamSlot + 4].all.affineParam = dmx1;
gOamData[_oamSlot + 5].all.affineParam = dy2;
gOamData[_oamSlot + 6].all.affineParam = dx1;
gOamData[_oamSlot + 7].all.affineParam = dy1;
gOamData[_oamSlot + 8].all.affineParam = dy1;
gOamData[_oamSlot + 9].all.affineParam = dmy1;
gOamData[_oamSlot + 10].all.affineParam = dmy2;
gOamData[_oamSlot + 11].all.affineParam = dmx1;
gOamData[_oamSlot + 12].all.affineParam = dmx1;
gOamData[_oamSlot + 13].all.affineParam = dy2;
gOamData[_oamSlot + 14].all.affineParam = dmy2;
gOamData[_oamSlot + 15].all.affineParam = dmx1;
}
#else
NAKED_FUNCTION
void CalculateOamPart4(u16 rotation, s16 scaling, u8 oamSlot)
{
asm(" \n\
push {r4, r5, r6, r7, lr} \n\
mov r7, sl \n\
mov r6, sb \n\
mov r5, r8 \n\
push {r5, r6, r7} \n\
sub sp, #8 \n\
add r4, r0, #0 \n\
add r5, r1, #0 \n\
lsl r4, r4, #0x10 \n\
lsr r4, r4, #0x10 \n\
lsl r5, r5, #0x10 \n\
asr r5, r5, #0x10 \n\
lsl r2, r2, #0x18 \n\
lsr r7, r2, #0x18 \n\
ldr r6, lbl_080800ec @ =sSineTable \n\
add r0, r4, #0 \n\
add r0, #0x40 \n\
lsl r0, r0, #1 \n\
add r0, r0, r6 \n\
movs r2, #0 \n\
ldrsh r1, [r0, r2] \n\
str r1, [sp] \n\
add r0, r5, #0 \n\
bl FixedInverse \n\
add r1, r0, #0 \n\
lsl r1, r1, #0x10 \n\
asr r1, r1, #0x10 \n\
ldr r0, [sp] \n\
bl FixedMultiplication \n\
mov r8, r0 \n\
mov r3, r8 \n\
lsl r3, r3, #0x10 \n\
asr r3, r3, #0x10 \n\
mov r8, r3 \n\
lsl r4, r4, #1 \n\
add r4, r4, r6 \n\
movs r1, #0 \n\
ldrsh r0, [r4, r1] \n\
mov sl, r0 \n\
add r0, r5, #0 \n\
bl FixedInverse \n\
add r1, r0, #0 \n\
lsl r1, r1, #0x10 \n\
asr r1, r1, #0x10 \n\
mov r0, sl \n\
bl FixedMultiplication \n\
lsl r0, r0, #0x10 \n\
asr r0, r0, #0x10 \n\
str r0, [sp, #4] \n\
ldrh r4, [r4] \n\
neg r4, r4 \n\
lsl r4, r4, #0x10 \n\
asr r4, r4, #0x10 \n\
add r0, r5, #0 \n\
bl FixedInverse \n\
add r1, r0, #0 \n\
lsl r1, r1, #0x10 \n\
asr r1, r1, #0x10 \n\
add r0, r4, #0 \n\
bl FixedMultiplication \n\
mov sb, r0 \n\
mov r2, sb \n\
lsl r2, r2, #0x10 \n\
asr r2, r2, #0x10 \n\
mov sb, r2 \n\
neg r5, r5 \n\
lsl r5, r5, #0x10 \n\
asr r5, r5, #0x10 \n\
add r0, r5, #0 \n\
bl FixedInverse \n\
add r1, r0, #0 \n\
lsl r1, r1, #0x10 \n\
asr r1, r1, #0x10 \n\
ldr r0, [sp] \n\
bl FixedMultiplication \n\
add r6, r0, #0 \n\
lsl r6, r6, #0x10 \n\
asr r6, r6, #0x10 \n\
add r0, r5, #0 \n\
bl FixedInverse \n\
add r1, r0, #0 \n\
lsl r1, r1, #0x10 \n\
asr r1, r1, #0x10 \n\
mov r0, sl \n\
bl FixedMultiplication \n\
mov sl, r0 \n\
mov r3, sl \n\
lsl r3, r3, #0x10 \n\
asr r3, r3, #0x10 \n\
mov sl, r3 \n\
add r0, r5, #0 \n\
bl FixedInverse \n\
add r1, r0, #0 \n\
lsl r1, r1, #0x10 \n\
asr r1, r1, #0x10 \n\
add r0, r4, #0 \n\
bl FixedMultiplication \n\
lsl r0, r0, #0x10 \n\
asr r0, r0, #0x10 \n\
ldr r2, lbl_080800f0 @ =gOamData \n\
lsl r1, r7, #3 \n\
add r1, r1, r2 \n\
mov r4, r8 \n\
strh r4, [r1, #6] \n\
add r1, r7, #1 \n\
lsl r1, r1, #3 \n\
add r1, r1, r2 \n\
mov r3, sp \n\
ldrh r3, [r3, #4] \n\
strh r3, [r1, #6] \n\
add r1, r7, #2 \n\
lsl r1, r1, #3 \n\
add r1, r1, r2 \n\
mov r4, sb \n\
strh r4, [r1, #6] \n\
add r1, r7, #3 \n\
lsl r1, r1, #3 \n\
add r1, r1, r2 \n\
mov r3, r8 \n\
strh r3, [r1, #6] \n\
add r1, r7, #4 \n\
lsl r1, r1, #3 \n\
add r1, r1, r2 \n\
strh r6, [r1, #6] \n\
add r1, r7, #5 \n\
lsl r1, r1, #3 \n\
add r1, r1, r2 \n\
mov r4, sl \n\
strh r4, [r1, #6] \n\
add r1, r7, #6 \n\
lsl r1, r1, #3 \n\
add r1, r1, r2 \n\
mov r3, sb \n\
strh r3, [r1, #6] \n\
add r1, r7, #7 \n\
lsl r1, r1, #3 \n\
add r1, r1, r2 \n\
mov r4, r8 \n\
strh r4, [r1, #6] \n\
add r1, r7, #0 \n\
add r1, #8 \n\
lsl r1, r1, #3 \n\
add r1, r1, r2 \n\
strh r4, [r1, #6] \n\
add r1, r7, #0 \n\
add r1, #9 \n\
lsl r1, r1, #3 \n\
add r1, r1, r2 \n\
mov r3, sp \n\
ldrh r3, [r3, #4] \n\
strh r3, [r1, #6] \n\
add r1, r7, #0 \n\
add r1, #0xa \n\
lsl r1, r1, #3 \n\
add r1, r1, r2 \n\
strh r0, [r1, #6] \n\
add r1, r7, #0 \n\
add r1, #0xb \n\
lsl r1, r1, #3 \n\
add r1, r1, r2 \n\
strh r6, [r1, #6] \n\
add r1, r7, #0 \n\
add r1, #0xc \n\
lsl r1, r1, #3 \n\
add r1, r1, r2 \n\
strh r6, [r1, #6] \n\
add r1, r7, #0 \n\
add r1, #0xd \n\
lsl r1, r1, #3 \n\
add r1, r1, r2 \n\
mov r4, sl \n\
strh r4, [r1, #6] \n\
add r1, r7, #0 \n\
add r1, #0xe \n\
lsl r1, r1, #3 \n\
add r1, r1, r2 \n\
strh r0, [r1, #6] \n\
add r0, r7, #0 \n\
add r0, #0xf \n\
lsl r0, r0, #3 \n\
add r0, r0, r2 \n\
strh r6, [r0, #6] \n\
add sp, #8 \n\
pop {r3, r4, r5} \n\
mov r8, r3 \n\
mov sb, r4 \n\
mov sl, r5 \n\
pop {r4, r5, r6, r7} \n\
pop {r0} \n\
bx r0 \n\
.align 2, 0 \n\
lbl_080800ec: .4byte sSineTable \n\
lbl_080800f0: .4byte gOamData \n\
");
}
#endif

View File

@ -1,6 +1,5 @@
#include "gba.h"
#include "connection.h"
// #include "bg_clip.h" // Required
#include "data/engine_pointers.h"
#include "data/empty_datatypes.h"
@ -25,9 +24,9 @@
#include "structs/samus.h"
// FIXME, find a better solution
void BgClipSetBg1BlockValue(u32, u16, u16);
void BgClipSetRawBG1BlockValue(u32, u16, u16);
void BgClipSetClipdataBlockValue(u16, u16, u16);
void BgClipSetClipdataBlockValue(u16, u16, u16); // From bg_clip.h
// bg_clip.h must not be included, as declaring the correct signature for some
// of its functions produces non-matching code here.
/**
* @brief 5e760 | 198 | Updates the hatches
@ -109,11 +108,14 @@ void ConnectionUpdateHatches(void)
}
}
#ifdef NON_MATCHING
/**
* @brief 5e8f8 | 15c | Updates the closing/opening animation of a hatch
*
* @param dontSetRaw Flag for "do not set raw"
* @param hatchNbr Hatch number
*/
void ConnectionUpdateHatchAnimation(u8 dontSetRaw, u32 hatchNbr)
{
// https://decomp.me/scratch/q1BYt
s32 caf;
u32 tilemapValue;
@ -160,181 +162,6 @@ void ConnectionUpdateHatchAnimation(u8 dontSetRaw, u32 hatchNbr)
BgClipSetClipdataBlockValue(tilemapValue + 0x20, gHatchData[hatchNbr].yPosition + 2, gHatchData[hatchNbr].xPosition);
BgClipSetClipdataBlockValue(tilemapValue + 0x30, gHatchData[hatchNbr].yPosition + 3, gHatchData[hatchNbr].xPosition);
}
#else
NAKED_FUNCTION
void ConnectionUpdateHatchAnimation(u8 dontSetRaw, u32 hatchNbr)
{
asm(" \n\
push {r4, r5, r6, r7, lr} \n\
mov r7, sl \n\
mov r6, sb \n\
mov r5, r8 \n\
push {r5, r6, r7} \n\
sub sp, #4 \n\
add r5, r1, #0 \n\
lsl r0, r0, #0x18 \n\
lsr r6, r0, #0x18 \n\
ldr r0, lbl_0805e948 @ =gHatchData \n\
lsl r4, r5, #3 \n\
add r1, r4, r0 \n\
ldrb r2, [r1] \n\
lsl r3, r2, #0x1b \n\
ldr r7, lbl_0805e94c @ =0x00000411 \n\
mov r8, r0 \n\
cmp r3, #0 \n\
bge lbl_0805e91e \n\
add r7, #5 \n\
lbl_0805e91e: \n\
lsl r0, r2, #0x1c \n\
lsr r0, r0, #0x1d \n\
sub r2, r0, #1 \n\
ldrb r0, [r1, #1] \n\
lsl r0, r0, #0x1e \n\
lsr r0, r0, #0x1e \n\
cmp r0, #3 \n\
bne lbl_0805e95e \n\
movs r0, #2 \n\
sub r2, r0, r2 \n\
cmp r2, #0 \n\
bge lbl_0805e954 \n\
movs r2, #0 \n\
ldr r0, lbl_0805e950 @ =sHatchesTilemapValues \n\
ldrb r1, [r1, #3] \n\
lsl r1, r1, #1 \n\
add r1, r1, r0 \n\
lsr r0, r3, #0x1f \n\
ldrh r1, [r1] \n\
add r7, r0, r1 \n\
b lbl_0805e95e \n\
.align 2, 0 \n\
lbl_0805e948: .4byte gHatchData \n\
lbl_0805e94c: .4byte 0x00000411 \n\
lbl_0805e950: .4byte sHatchesTilemapValues \n\
lbl_0805e954: \n\
ldrb r0, [r1, #3] \n\
mov sl, r4 \n\
cmp r0, #0 \n\
beq lbl_0805e96c \n\
add r2, #0x40 \n\
lbl_0805e95e: \n\
lsl r0, r5, #3 \n\
mov r3, r8 \n\
add r1, r0, r3 \n\
ldrb r1, [r1, #3] \n\
mov sl, r0 \n\
cmp r1, #0 \n\
bne lbl_0805e96e \n\
lbl_0805e96c: \n\
add r2, #0x80 \n\
lbl_0805e96e: \n\
add r7, r7, r2 \n\
cmp r6, #0 \n\
beq lbl_0805e9c0 \n\
ldr r4, lbl_0805e9bc @ =gHatchData \n\
add r4, sl \n\
ldrb r1, [r4, #6] \n\
ldrb r2, [r4, #5] \n\
add r0, r7, #0 \n\
bl BgClipSetBg1BlockValue \n\
movs r0, #0x10 \n\
add r0, r0, r7 \n\
mov r8, r0 \n\
ldrb r1, [r4, #6] \n\
add r1, #1 \n\
ldrb r2, [r4, #5] \n\
bl BgClipSetBg1BlockValue \n\
add r1, r7, #0 \n\
add r1, #0x20 \n\
str r1, [sp] \n\
ldrb r1, [r4, #6] \n\
add r1, #2 \n\
ldrb r2, [r4, #5] \n\
ldr r0, [sp] \n\
bl BgClipSetBg1BlockValue \n\
add r5, r7, #0 \n\
add r5, #0x30 \n\
ldrb r1, [r4, #6] \n\
add r1, #3 \n\
ldrb r2, [r4, #5] \n\
add r0, r5, #0 \n\
bl BgClipSetBg1BlockValue \n\
mov r6, r8 \n\
ldr r3, [sp] \n\
mov r8, r3 \n\
b lbl_0805ea04 \n\
.align 2, 0 \n\
lbl_0805e9bc: .4byte gHatchData \n\
lbl_0805e9c0: \n\
ldr r4, lbl_0805ea50 @ =gHatchData \n\
add r4, sl \n\
ldrb r1, [r4, #6] \n\
ldrb r2, [r4, #5] \n\
add r0, r7, #0 \n\
bl BgClipSetRawBG1BlockValue \n\
movs r0, #0x10 \n\
add r0, r0, r7 \n\
mov r8, r0 \n\
ldrb r1, [r4, #6] \n\
add r1, #1 \n\
ldrb r2, [r4, #5] \n\
bl BgClipSetRawBG1BlockValue \n\
movs r1, #0x20 \n\
add r1, r1, r7 \n\
mov sb, r1 \n\
ldrb r1, [r4, #6] \n\
add r1, #2 \n\
ldrb r2, [r4, #5] \n\
mov r0, sb \n\
bl BgClipSetRawBG1BlockValue \n\
add r5, r7, #0 \n\
add r5, #0x30 \n\
ldrb r1, [r4, #6] \n\
add r1, #3 \n\
ldrb r2, [r4, #5] \n\
add r0, r5, #0 \n\
bl BgClipSetRawBG1BlockValue \n\
mov r6, r8 \n\
mov r8, sb \n\
lbl_0805ea04: \n\
lsl r0, r7, #0x10 \n\
lsr r0, r0, #0x10 \n\
ldr r4, lbl_0805ea50 @ =gHatchData \n\
add r4, sl \n\
ldrb r1, [r4, #6] \n\
ldrb r2, [r4, #5] \n\
bl BgClipSetClipdataBlockValue \n\
lsl r0, r6, #0x10 \n\
lsr r0, r0, #0x10 \n\
ldrb r1, [r4, #6] \n\
add r1, #1 \n\
ldrb r2, [r4, #5] \n\
bl BgClipSetClipdataBlockValue \n\
mov r3, r8 \n\
lsl r0, r3, #0x10 \n\
lsr r0, r0, #0x10 \n\
ldrb r1, [r4, #6] \n\
add r1, #2 \n\
ldrb r2, [r4, #5] \n\
bl BgClipSetClipdataBlockValue \n\
lsl r0, r5, #0x10 \n\
lsr r0, r0, #0x10 \n\
ldrb r1, [r4, #6] \n\
add r1, #3 \n\
ldrb r2, [r4, #5] \n\
bl BgClipSetClipdataBlockValue \n\
add sp, #4 \n\
pop {r3, r4, r5} \n\
mov r8, r3 \n\
mov sb, r4 \n\
mov sl, r5 \n\
pop {r4, r5, r6, r7} \n\
pop {r0} \n\
bx r0 \n\
.align 2, 0 \n\
lbl_0805ea50: .4byte gHatchData \n\
");
}
#endif
/**
* @brief 5ea54 | c4 | Updates the flashing animation of an hatch
@ -1201,4 +1028,4 @@ void ConnectionCheckPlayCutsceneDuringElevator(void)
case ELEVATOR_ROUTE_CRATERIA_TO_BRINSTAR:
return;
}
}
}

View File

@ -868,48 +868,48 @@ void CutsceneUpdateSpecialEffect(void)
CUTSCENE_DATA.specialEffect.bg_Timer = CUTSCENE_DATA.specialEffect.bg_Interval;
// Update BLDALPHA L
if (gWrittenToBLDALPHA_L != CUTSCENE_DATA.specialEffect.bg_WrittenToBLDALPHA_L)
if (gWrittenToBLDALPHA_L != CUTSCENE_DATA.specialEffect.bg_WrittenToBldalpha_L)
{
if (gWrittenToBLDALPHA_L < CUTSCENE_DATA.specialEffect.bg_WrittenToBLDALPHA_L)
if (gWrittenToBLDALPHA_L < CUTSCENE_DATA.specialEffect.bg_WrittenToBldalpha_L)
{
if (gWrittenToBLDALPHA_L + CUTSCENE_DATA.specialEffect.bg_Intensity > CUTSCENE_DATA.specialEffect.bg_WrittenToBLDALPHA_L)
gWrittenToBLDALPHA_L = CUTSCENE_DATA.specialEffect.bg_WrittenToBLDALPHA_L;
if (gWrittenToBLDALPHA_L + CUTSCENE_DATA.specialEffect.bg_Intensity > CUTSCENE_DATA.specialEffect.bg_WrittenToBldalpha_L)
gWrittenToBLDALPHA_L = CUTSCENE_DATA.specialEffect.bg_WrittenToBldalpha_L;
else
gWrittenToBLDALPHA_L += CUTSCENE_DATA.specialEffect.bg_Intensity;
}
else
{
if (gWrittenToBLDALPHA_L - CUTSCENE_DATA.specialEffect.bg_Intensity < CUTSCENE_DATA.specialEffect.bg_WrittenToBLDALPHA_L)
gWrittenToBLDALPHA_L = CUTSCENE_DATA.specialEffect.bg_WrittenToBLDALPHA_L;
if (gWrittenToBLDALPHA_L - CUTSCENE_DATA.specialEffect.bg_Intensity < CUTSCENE_DATA.specialEffect.bg_WrittenToBldalpha_L)
gWrittenToBLDALPHA_L = CUTSCENE_DATA.specialEffect.bg_WrittenToBldalpha_L;
else
gWrittenToBLDALPHA_L -= CUTSCENE_DATA.specialEffect.bg_Intensity;
}
}
// Update BLDALPHA H
if (gWrittenToBLDALPHA_H != CUTSCENE_DATA.specialEffect.bg_WrittenToBLDALPHA_H)
if (gWrittenToBLDALPHA_H != CUTSCENE_DATA.specialEffect.bg_WrittenToBldalpha_H)
{
if (gWrittenToBLDALPHA_H < CUTSCENE_DATA.specialEffect.bg_WrittenToBLDALPHA_H)
if (gWrittenToBLDALPHA_H < CUTSCENE_DATA.specialEffect.bg_WrittenToBldalpha_H)
{
if (gWrittenToBLDALPHA_H + CUTSCENE_DATA.specialEffect.bg_Intensity > CUTSCENE_DATA.specialEffect.bg_WrittenToBLDALPHA_H)
gWrittenToBLDALPHA_H = CUTSCENE_DATA.specialEffect.bg_WrittenToBLDALPHA_H;
if (gWrittenToBLDALPHA_H + CUTSCENE_DATA.specialEffect.bg_Intensity > CUTSCENE_DATA.specialEffect.bg_WrittenToBldalpha_H)
gWrittenToBLDALPHA_H = CUTSCENE_DATA.specialEffect.bg_WrittenToBldalpha_H;
else
gWrittenToBLDALPHA_H += CUTSCENE_DATA.specialEffect.bg_Intensity;
}
else
{
if (gWrittenToBLDALPHA_H - CUTSCENE_DATA.specialEffect.bg_Intensity < CUTSCENE_DATA.specialEffect.bg_WrittenToBLDALPHA_H)
gWrittenToBLDALPHA_H = CUTSCENE_DATA.specialEffect.bg_WrittenToBLDALPHA_H;
if (gWrittenToBLDALPHA_H - CUTSCENE_DATA.specialEffect.bg_Intensity < CUTSCENE_DATA.specialEffect.bg_WrittenToBldalpha_H)
gWrittenToBLDALPHA_H = CUTSCENE_DATA.specialEffect.bg_WrittenToBldalpha_H;
else
gWrittenToBLDALPHA_H -= CUTSCENE_DATA.specialEffect.bg_Intensity;
}
}
// Check reached destination values
if (gWrittenToBLDALPHA_L != CUTSCENE_DATA.specialEffect.bg_WrittenToBLDALPHA_L)
if (gWrittenToBLDALPHA_L != CUTSCENE_DATA.specialEffect.bg_WrittenToBldalpha_L)
return;
if (gWrittenToBLDALPHA_H != CUTSCENE_DATA.specialEffect.bg_WrittenToBLDALPHA_H)
if (gWrittenToBLDALPHA_H != CUTSCENE_DATA.specialEffect.bg_WrittenToBldalpha_H)
return;
// Mark as ended
@ -918,161 +918,68 @@ void CutsceneUpdateSpecialEffect(void)
}
}
#ifdef NON_MATCHING
void CutsceneStartSpriteEffect(u16 bldcnt, u8 bldy, u8 interval, u8 intensity)
/**
* @brief 61d68 | 60 | Starts a cutscene sprite effect
*
* @param bldcnt Bldcnt
* @param bldy Bldy target
* @param interval Interval between value changes
* @param intensity Value change intensity
*/
void CutsceneStartSpriteEffect(u16 bldcnt, u8 bldy, u32 interval, u8 intensity)
{
// https://decomp.me/scratch/2WAha
u8 _interval;
u8* ptr;
CUTSCENE_DATA.specialEffect.status &= ~CUTSCENE_SPECIAL_EFFECT_STATUS_SPRITE_ENDED;
CUTSCENE_DATA.specialEffect.status |= CUTSCENE_SPECIAL_EFFECT_STATUS_ON_SPRITE;
CUTSCENE_DATA.specialEffect.s_WrittenToBLDY = bldy;
CUTSCENE_DATA.specialEffect.s_Intensity = intensity;
CUTSCENE_DATA.specialEffect.s_Interval = interval;
CUTSCENE_DATA.specialEffect.s_Timer = interval;
CUTSCENE_DATA.bldcnt = CUTSCENE_DATA.specialEffect.s_BLDCNT = bldcnt;
}
#else
NAKED_FUNCTION
void CutsceneStartSpriteEffect(u16 bldcnt, u8 bldy, u8 interval, u8 intensity)
{
asm(" \n\
push {r4, r5, r6, lr} \n\
mov r6, r8 \n\
push {r6} \n\
lsl r0, r0, #0x10 \n\
lsr r0, r0, #0x10 \n\
ldr r4, lbl_08061dc4 @ =sNonGameplayRamPointer \n\
mov r8, r4 \n\
ldr r5, [r4] \n\
add r5, #0xa8 \n\
ldrb r6, [r5] \n\
movs r4, #0xfd \n\
and r4, r6 \n\
strb r4, [r5] \n\
mov r4, r8 \n\
ldr r5, [r4] \n\
add r5, #0xa8 \n\
ldrb r6, [r5] \n\
movs r4, #1 \n\
orr r4, r6 \n\
strb r4, [r5] \n\
mov r5, r8 \n\
ldr r4, [r5] \n\
add r4, #0xa9 \n\
strb r1, [r4] \n\
ldr r1, [r5] \n\
add r1, #0xae \n\
strb r3, [r1] \n\
ldr r1, [r5] \n\
add r1, #0xaf \n\
lsl r2, r2, #0x18 \n\
lsr r2, r2, #0x18 \n\
strb r2, [r1] \n\
ldr r1, [r5] \n\
add r1, #0xb0 \n\
strb r2, [r1] \n\
ldr r2, [r5] \n\
add r1, r2, #0 \n\
add r1, #0xac \n\
strh r0, [r1] \n\
strh r0, [r2, #0x1e] \n\
pop {r3} \n\
mov r8, r3 \n\
pop {r4, r5, r6} \n\
pop {r0} \n\
bx r0 \n\
.align 2, 0 \n\
lbl_08061dc4: .4byte sNonGameplayRamPointer \n\
");
}
#endif
// The following code is written like that to produce matching ASM:
ptr = &CUTSCENE_DATA.specialEffect.s_Interval;
_interval = interval;
*ptr = _interval;
#ifdef NON_MATCHING
void CutsceneStartBackgroundEffect(u16 bldcnt, u8 bldalphaL, u8 bldalphaH, u8 interval, u8 intensity)
CUTSCENE_DATA.specialEffect.s_Timer = _interval;
CUTSCENE_DATA.bldcnt = CUTSCENE_DATA.specialEffect.s_Bldcnt = bldcnt;
}
/**
* @brief 61dc8 | 70 | Starts a cutscene background effect
*
* @param bldcnt Bldcnt
* @param bldalphaL Bldqlphq L target
* @param bldalphaH Bldqlphq H target
* @param interval Interval between value changes
* @param intensity Value change intensity
*/
void CutsceneStartBackgroundEffect(u16 bldcnt, u8 bldalphaL, u8 bldalphaH, u32 interval, u8 intensity)
{
// https://decomp.me/scratch/G6ViR
u8 _interval;
u8* ptr;
CUTSCENE_DATA.specialEffect.status &= ~CUTSCENE_SPECIAL_EFFECT_STATUS_BG_ENDED;
CUTSCENE_DATA.specialEffect.status |= CUTSCENE_SPECIAL_EFFECT_STATUS_ON_BG;
CUTSCENE_DATA.specialEffect.bg_WrittenToBLDALPHA_L = bldalphaL;
CUTSCENE_DATA.specialEffect.bg_WrittenToBLDALPHA_H = bldalphaH;
CUTSCENE_DATA.specialEffect.bg_WrittenToBldalpha_L = bldalphaL;
CUTSCENE_DATA.specialEffect.bg_WrittenToBldalpha_H = bldalphaH;
CUTSCENE_DATA.specialEffect.bg_Intensity = intensity;
CUTSCENE_DATA.specialEffect.bg_Interval = interval;
CUTSCENE_DATA.specialEffect.bg_Timer = interval;
// The following code is written like that to produce matching ASM:
ptr = &CUTSCENE_DATA.specialEffect.bg_Interval;
_interval = interval;
*ptr = _interval;
CUTSCENE_DATA.specialEffect.bg_Timer = _interval;
CUTSCENE_DATA.specialEffect.bg_WrittenToBLDCNT = bldcnt;
if (!(CUTSCENE_DATA.specialEffect.status & CUTSCENE_SPECIAL_EFFECT_STATUS_ON_SPRITE))
CUTSCENE_DATA.bldcnt = bldcnt;
}
#else
NAKED_FUNCTION
void CutsceneStartBackgroundEffect(u16 bldcnt, u8 bldalphaL, u8 bldalphaH, u8 interval, u8 intensity)
{
asm(" \n\
push {r4, r5, r6, r7, lr} \n\
mov r7, r8 \n\
push {r7} \n\
ldr r4, [sp, #0x18] \n\
mov r8, r4 \n\
lsl r0, r0, #0x10 \n\
lsr r7, r0, #0x10 \n\
ldr r6, lbl_08061e34 @ =sNonGameplayRamPointer \n\
ldr r4, [r6] \n\
add r4, #0xa8 \n\
ldrb r5, [r4] \n\
movs r0, #0xf7 \n\
and r0, r5 \n\
strb r0, [r4] \n\
ldr r4, [r6] \n\
add r4, #0xa8 \n\
ldrb r5, [r4] \n\
movs r0, #4 \n\
orr r0, r5 \n\
strb r0, [r4] \n\
ldr r0, [r6] \n\
add r0, #0xaa \n\
strb r1, [r0] \n\
ldr r0, [r6] \n\
add r0, #0xab \n\
strb r2, [r0] \n\
ldr r0, [r6] \n\
add r0, #0xb4 \n\
mov r1, r8 \n\
strb r1, [r0] \n\
ldr r0, [r6] \n\
add r0, #0xb5 \n\
lsl r3, r3, #0x18 \n\
lsr r3, r3, #0x18 \n\
strb r3, [r0] \n\
ldr r0, [r6] \n\
add r0, #0xb6 \n\
strb r3, [r0] \n\
ldr r2, [r6] \n\
add r0, r2, #0 \n\
add r0, #0xb2 \n\
strh r7, [r0] \n\
sub r0, #0xa \n\
ldrb r1, [r0] \n\
movs r0, #1 \n\
and r0, r1 \n\
cmp r0, #0 \n\
bne lbl_08061e2a \n\
strh r7, [r2, #0x1e] \n\
lbl_08061e2a: \n\
pop {r3} \n\
mov r8, r3 \n\
pop {r4, r5, r6, r7} \n\
pop {r0} \n\
bx r0 \n\
.align 2, 0 \n\
lbl_08061e34: .4byte sNonGameplayRamPointer \n\
");
}
#endif
/**
* @brief 61e38 | d4 | Resets the data for a cutscene

View File

@ -167,7 +167,7 @@ void EndingImageDisplayLinePermanently(u32 line)
#ifdef NON_MATCHING
void EndingImageLoadIGTAndPercentageGraphics(void)
{
// https://decomp.me/scratch/vLTLr
// https://decomp.me/scratch/KHUC4
s32 hoursTens;
s32 hoursOnes;

View File

@ -816,7 +816,7 @@ void FileSelectFileCopyChooseBaseDestinationFile(void)
#ifdef NON_MATCHING
u32 FileSelectCopyFileSubroutine(void)
{
// https://decomp.me/scratch/iYyvZ
// https://decomp.me/scratch/Rz4bp
u32 ended;
s32 action;
@ -1775,11 +1775,8 @@ lbl_08079794: \n\
*
* @return u32 bool, ended
*/
#ifdef NON_MATCHING
u32 FileSelectEraseFileSubroutine(void)
{
// https://decomp.me/scratch/noF8W
u32 ended;
u32 action;
@ -1814,20 +1811,18 @@ u32 FileSelectEraseFileSubroutine(void)
{
action = 1;
}
else
else if (gChangedInput & KEY_B)
{
if (!(gChangedInput & KEY_B))
{
if (gChangedInput & KEY_A)
{
action = (FILE_SELECT_DATA.enabledMenus >> FILE_SELECT_DATA.eraseFile) & 1 ? 2 : 0;
}
}
else
{
FILE_SELECT_DATA.subroutineStage = 10;
action = 0;
}
#ifdef NON_MATCHING
FILE_SELECT_DATA.subroutineStage = 10;
break;
#else // !NON_MATCHING
goto lbl_case_9;
#endif // NON_MATCHING
}
else if (gChangedInput & KEY_A)
{
action = (FILE_SELECT_DATA.enabledMenus >> FILE_SELECT_DATA.eraseFile) & 1 ? 2 : 0;
}
}
@ -1929,10 +1924,11 @@ u32 FileSelectEraseFileSubroutine(void)
FileSelectUpdateTilemap(TILEMAP_REQUEST_ERASE_YES_NO_DESPAWN_INIT);
FILE_SELECT_DATA.subroutineStage++;
break;
case 9:
if (FileSelectUpdateTilemap(TILEMAP_REQUEST_ERASE_YES_NO_DESPAWN))
{
lbl_case_9:
FILE_SELECT_DATA.subroutineStage = 10;
}
break;
@ -1968,456 +1964,6 @@ u32 FileSelectEraseFileSubroutine(void)
return ended;
}
#else
NAKED_FUNCTION
u32 FileSelectEraseFileSubroutine(void)
{
asm(" \n\
push {r4, r5, r6, r7, lr} \n\
sub sp, #4 \n\
movs r7, #0 \n\
ldr r2, lbl_080797cc @ =sNonGameplayRamPointer \n\
ldr r1, [r2] \n\
add r3, r1, #0 \n\
add r3, #0x42 \n\
ldrh r0, [r3] \n\
add r0, #1 \n\
strh r0, [r3] \n\
add r1, #0x40 \n\
ldrb r0, [r1] \n\
add r5, r2, #0 \n\
cmp r0, #0xb \n\
bls lbl_080797c0 \n\
b lbl_08079b44 \n\
lbl_080797c0: \n\
lsl r0, r0, #2 \n\
ldr r1, lbl_080797d0 @ =lbl_080797d4 \n\
add r0, r0, r1 \n\
ldr r0, [r0] \n\
mov pc, r0 \n\
.align 2, 0 \n\
lbl_080797cc: .4byte sNonGameplayRamPointer \n\
lbl_080797d0: .4byte lbl_080797d4 \n\
lbl_080797d4: @ jump table \n\
.4byte lbl_08079804 @ case 0 \n\
.4byte lbl_08079840 @ case 1 \n\
.4byte lbl_08079858 @ case 2 \n\
.4byte lbl_08079900 @ case 3 \n\
.4byte lbl_08079930 @ case 4 \n\
.4byte lbl_080799d8 @ case 5 \n\
.4byte lbl_080799fc @ case 6 \n\
.4byte lbl_08079a24 @ case 7 \n\
.4byte lbl_08079a46 @ case 8 \n\
.4byte lbl_08079a60 @ case 9 \n\
.4byte lbl_08079a7c @ case 10 \n\
.4byte lbl_08079b30 @ case 11 \n\
lbl_08079804: \n\
movs r0, #0 \n\
movs r1, #5 \n\
bl unk_790cc \n\
movs r0, #0 \n\
movs r1, #6 \n\
bl unk_790cc \n\
ldr r4, lbl_0807983c @ =sNonGameplayRamPointer \n\
ldr r0, [r4] \n\
add r0, #0x28 \n\
bl FileSelectFindFirstNonEmptyFile \n\
ldr r0, [r4] \n\
add r0, #0x28 \n\
ldrb r1, [r0] \n\
movs r0, #0 \n\
bl FileSelectUpdateEraseCursor \n\
movs r0, #0xa \n\
bl FileSelectUpdateTilemap \n\
ldr r0, [r4] \n\
add r0, #0x3a \n\
movs r1, #0 \n\
strb r1, [r0] \n\
b lbl_08079b10 \n\
.align 2, 0 \n\
lbl_0807983c: .4byte sNonGameplayRamPointer \n\
lbl_08079840: \n\
movs r0, #0xb \n\
bl FileSelectUpdateTilemap \n\
cmp r0, #0 \n\
bne lbl_0807984c \n\
b lbl_08079b44 \n\
lbl_0807984c: \n\
ldr r0, lbl_08079854 @ =sNonGameplayRamPointer \n\
ldr r1, [r0] \n\
b lbl_08079b12 \n\
.align 2, 0 \n\
lbl_08079854: .4byte sNonGameplayRamPointer \n\
lbl_08079858: \n\
movs r4, #0 \n\
ldr r6, lbl_08079878 @ =gChangedInput \n\
ldrh r0, [r6] \n\
cmp r0, #0 \n\
beq lbl_080798ac \n\
ldr r1, [r5] \n\
add r1, #0x28 \n\
movs r0, #1 \n\
bl FileSelectApplyMenuSelectInput \n\
lsl r0, r0, #0x18 \n\
cmp r0, #0 \n\
beq lbl_0807987c \n\
movs r4, #1 \n\
b lbl_080798b2 \n\
.align 2, 0 \n\
lbl_08079878: .4byte gChangedInput \n\
lbl_0807987c: \n\
ldrh r1, [r6] \n\
movs r3, #2 \n\
add r0, r3, #0 \n\
and r0, r1 \n\
cmp r0, #0 \n\
beq lbl_0807988a \n\
b lbl_08079a6a \n\
lbl_0807988a: \n\
movs r2, #1 \n\
add r0, r2, #0 \n\
and r0, r1 \n\
cmp r0, #0 \n\
beq lbl_080798ac \n\
ldr r0, [r5] \n\
add r1, r0, #0 \n\
add r1, #0x3b \n\
ldrb r1, [r1] \n\
add r0, #0x28 \n\
ldrb r0, [r0] \n\
asr r1, r0 \n\
and r1, r2 \n\
neg r0, r1\n\
orr r0, r1 \n\
asr r4, r0, #0x1f \n\
and r4, r3 \n\
lbl_080798ac: \n\
cmp r4, #0 \n\
bne lbl_080798b2 \n\
b lbl_08079b44 \n\
lbl_080798b2: \n\
cmp r4, #1 \n\
bne lbl_080798d0 \n\
movs r0, #2 \n\
bl FileSelectPlayMenuSound \n\
ldr r0, lbl_080798cc @ =sNonGameplayRamPointer \n\
ldr r0, [r0] \n\
add r0, #0x28 \n\
ldrb r1, [r0] \n\
movs r0, #1 \n\
bl FileSelectUpdateEraseCursor \n\
b lbl_08079b44 \n\
.align 2, 0 \n\
lbl_080798cc: .4byte sNonGameplayRamPointer \n\
lbl_080798d0: \n\
cmp r4, #2 \n\
beq lbl_080798d6 \n\
b lbl_08079b44 \n\
lbl_080798d6: \n\
movs r0, #0x84 \n\
lsl r0, r0, #2 \n\
bl SoundPlay \n\
ldr r4, lbl_080798fc @ =sNonGameplayRamPointer \n\
ldr r0, [r4] \n\
add r0, #0x28 \n\
ldrb r1, [r0] \n\
movs r0, #2 \n\
bl FileSelectUpdateEraseCursor \n\
movs r0, #0xe \n\
bl FileSelectUpdateTilemap \n\
ldr r0, [r4] \n\
add r0, #0x40 \n\
movs r1, #3 \n\
strb r1, [r0] \n\
b lbl_08079b44 \n\
.align 2, 0 \n\
lbl_080798fc: .4byte sNonGameplayRamPointer \n\
lbl_08079900: \n\
movs r0, #0xf \n\
bl FileSelectUpdateTilemap \n\
cmp r0, #0 \n\
bne lbl_0807990c \n\
b lbl_08079b44 \n\
lbl_0807990c: \n\
ldr r4, lbl_08079928 @ =sNonGameplayRamPointer \n\
ldr r0, [r4] \n\
ldr r1, lbl_0807992c @ =sFileSelectMenuCursors_Empty \n\
ldrb r1, [r1, #1] \n\
add r0, #0x2d \n\
strb r1, [r0] \n\
ldr r0, [r4] \n\
add r0, #0x2d \n\
ldrb r1, [r0] \n\
movs r0, #3 \n\
bl unk_7e3fc \n\
b lbl_08079b10 \n\
.align 2, 0 \n\
lbl_08079928: .4byte sNonGameplayRamPointer \n\
lbl_0807992c: .4byte sFileSelectMenuCursors_Empty \n\
lbl_08079930: \n\
movs r4, #0xff \n\
ldr r0, lbl_08079958 @ =gChangedInput \n\
ldrh r1, [r0] \n\
cmp r1, #0 \n\
beq lbl_080799c6 \n\
movs r0, #1 \n\
and r0, r1 \n\
cmp r0, #0 \n\
beq lbl_08079974 \n\
ldr r1, [r5] \n\
add r0, r1, #0 \n\
add r0, #0x2d \n\
ldrb r0, [r0] \n\
cmp r0, #0 \n\
beq lbl_0807995c \n\
add r1, #0x40 \n\
movs r0, #5 \n\
strb r0, [r1] \n\
b lbl_080799c6 \n\
.align 2, 0 \n\
lbl_08079958: .4byte gChangedInput \n\
lbl_0807995c: \n\
movs r4, #0x80 \n\
ldr r0, lbl_08079970 @ =0x0000020d \n\
bl SoundPlay \n\
ldr r0, [r5] \n\
add r0, #0x40 \n\
movs r1, #7 \n\
strb r1, [r0] \n\
b lbl_080799c6 \n\
.align 2, 0 \n\
lbl_08079970: .4byte 0x0000020d \n\
lbl_08079974: \n\
movs r0, #2 \n\
and r0, r1 \n\
cmp r0, #0 \n\
beq lbl_08079986 \n\
ldr r0, [r5] \n\
add r0, #0x40 \n\
movs r1, #5 \n\
strb r1, [r0] \n\
b lbl_080799c6 \n\
lbl_08079986: \n\
movs r0, #0x20 \n\
and r0, r1 \n\
cmp r0, #0 \n\
beq lbl_080799a6 \n\
ldr r0, [r5] \n\
add r1, r0, #0 \n\
add r1, #0x2d \n\
ldrb r0, [r1] \n\
cmp r0, #0 \n\
beq lbl_080799c6 \n\
movs r4, #0 \n\
strb r4, [r1] \n\
movs r0, #0 \n\
bl FileSelectPlayMenuSound \n\
b lbl_080799c6 \n\
lbl_080799a6: \n\
movs r0, #0x10 \n\
and r0, r1 \n\
cmp r0, #0 \n\
beq lbl_080799c6 \n\
ldr r0, [r5] \n\
add r1, r0, #0 \n\
add r1, #0x2d \n\
ldrb r0, [r1] \n\
cmp r0, #0 \n\
bne lbl_080799c6 \n\
movs r4, #1 \n\
movs r0, #1 \n\
strb r0, [r1] \n\
movs r0, #0 \n\
bl FileSelectPlayMenuSound \n\
lbl_080799c6: \n\
add r0, r4, #1 \n\
cmp r0, #0 \n\
bne lbl_080799ce \n\
b lbl_08079b44 \n\
lbl_080799ce: \n\
add r1, r4, #0 \n\
movs r0, #3 \n\
bl unk_7e3fc \n\
b lbl_08079b44 \n\
lbl_080799d8: \n\
ldr r0, lbl_080799f4 @ =0x00000209 \n\
bl SoundPlay \n\
movs r0, #3 \n\
movs r1, #0x81 \n\
bl unk_7e3fc \n\
movs r0, #0x10 \n\
bl FileSelectUpdateTilemap \n\
ldr r0, lbl_080799f8 @ =sNonGameplayRamPointer \n\
ldr r1, [r0] \n\
b lbl_08079b12 \n\
.align 2, 0 \n\
lbl_080799f4: .4byte 0x00000209 \n\
lbl_080799f8: .4byte sNonGameplayRamPointer \n\
lbl_080799fc: \n\
movs r0, #0x11 \n\
bl FileSelectUpdateTilemap \n\
cmp r0, #0 \n\
bne lbl_08079a08 \n\
b lbl_08079b44 \n\
lbl_08079a08: \n\
ldr r4, lbl_08079a20 @ =sNonGameplayRamPointer \n\
ldr r0, [r4] \n\
add r0, #0x28 \n\
ldrb r1, [r0] \n\
movs r0, #0 \n\
bl FileSelectUpdateEraseCursor \n\
ldr r0, [r4] \n\
add r0, #0x40 \n\
movs r1, #2 \n\
strb r1, [r0] \n\
b lbl_08079b44 \n\
.align 2, 0 \n\
lbl_08079a20: .4byte sNonGameplayRamPointer \n\
lbl_08079a24: \n\
ldr r0, [r5] \n\
add r0, #0x28 \n\
ldrb r0, [r0] \n\
bl SramDeleteFile \n\
cmp r0, #0 \n\
bne lbl_08079a34 \n\
b lbl_08079b44 \n\
lbl_08079a34: \n\
ldr r0, [r5] \n\
add r0, #0x3a \n\
movs r1, #1 \n\
strb r1, [r0] \n\
ldr r0, [r5] \n\
add r0, #0x40 \n\
movs r1, #8 \n\
strb r1, [r0] \n\
b lbl_08079b44 \n\
lbl_08079a46: \n\
movs r0, #3 \n\
movs r1, #0x81 \n\
bl unk_7e3fc \n\
movs r0, #0x10 \n\
bl FileSelectUpdateTilemap \n\
ldr r0, lbl_08079a5c @ =sNonGameplayRamPointer \n\
ldr r1, [r0] \n\
b lbl_08079b12 \n\
.align 2, 0 \n\
lbl_08079a5c: .4byte sNonGameplayRamPointer \n\
lbl_08079a60: \n\
movs r0, #0x11 \n\
bl FileSelectUpdateTilemap \n\
cmp r0, #0 \n\
beq lbl_08079b44 \n\
lbl_08079a6a: \n\
ldr r0, lbl_08079a78 @ =sNonGameplayRamPointer \n\
ldr r0, [r0] \n\
add r0, #0x40 \n\
movs r1, #0xa \n\
strb r1, [r0] \n\
b lbl_08079b44 \n\
.align 2, 0 \n\
lbl_08079a78: .4byte sNonGameplayRamPointer \n\
lbl_08079a7c: \n\
ldr r5, lbl_08079b1c @ =sNonGameplayRamPointer \n\
ldr r1, [r5] \n\
add r0, r1, #0 \n\
add r0, #0x3a \n\
ldrb r0, [r0] \n\
cmp r0, #0 \n\
beq lbl_08079afc \n\
add r0, r1, #0 \n\
add r0, #0x28 \n\
ldrb r0, [r0] \n\
bl FileSelectDisplaySaveFileHealth \n\
ldr r0, [r5] \n\
add r0, #0x28 \n\
ldrb r0, [r0] \n\
bl FileSelectDisplaySaveFileTimer \n\
ldr r0, [r5] \n\
add r0, #0x28 \n\
ldrb r1, [r0] \n\
lsl r0, r1, #1 \n\
add r0, r0, r1 \n\
lsl r0, r0, #3 \n\
ldr r4, lbl_08079b20 @ =gSaveFilesInfo \n\
add r0, r0, r4 \n\
bl FileSelectDisplaySaveFileMiscInfo \n\
ldr r2, [r5] \n\
add r0, r2, #0 \n\
add r0, #0x28 \n\
ldrb r0, [r0] \n\
lsl r1, r0, #1 \n\
add r0, r1, r0 \n\
lsl r0, r0, #3 \n\
add r0, r0, r4 \n\
ldrb r0, [r0, #0x11] \n\
lsl r0, r0, #0x18 \n\
asr r0, r0, #0x18 \n\
cmp r0, #0 \n\
bne lbl_08079ae2 \n\
ldr r0, lbl_08079b24 @ =sFileSelectFileOamOffsets \n\
add r0, #1 \n\
add r0, r1, r0 \n\
ldrb r1, [r0] \n\
lsl r1, r1, #4 \n\
add r1, r2, r1 \n\
add r1, #0x7f \n\
ldrb r2, [r1] \n\
movs r0, #0x3f \n\
and r0, r2 \n\
strb r0, [r1] \n\
lbl_08079ae2: \n\
bl FileScreenSetEnabledMenuFlags \n\
ldr r0, lbl_08079b28 @ =sEwramPointer \n\
ldr r1, [r0] \n\
movs r3, #0x80 \n\
lsl r3, r3, #4 \n\
add r1, r1, r3 \n\
ldr r2, lbl_08079b2c @ =0x0600d800 \n\
movs r0, #0x10 \n\
str r0, [sp] \n\
movs r0, #3 \n\
bl DmaTransfer \n\
lbl_08079afc: \n\
ldr r4, lbl_08079b1c @ =sNonGameplayRamPointer \n\
ldr r0, [r4] \n\
add r0, #0x28 \n\
ldrb r1, [r0] \n\
movs r0, #3 \n\
bl FileSelectUpdateEraseCursor \n\
movs r0, #0xc \n\
bl FileSelectUpdateTilemap \n\
lbl_08079b10: \n\
ldr r1, [r4] \n\
lbl_08079b12: \n\
add r1, #0x40 \n\
ldrb r0, [r1] \n\
add r0, #1 \n\
strb r0, [r1] \n\
b lbl_08079b44 \n\
.align 2, 0 \n\
lbl_08079b1c: .4byte sNonGameplayRamPointer \n\
lbl_08079b20: .4byte gSaveFilesInfo \n\
lbl_08079b24: .4byte sFileSelectFileOamOffsets \n\
lbl_08079b28: .4byte sEwramPointer \n\
lbl_08079b2c: .4byte 0x0600d800 \n\
lbl_08079b30: \n\
movs r0, #0xd \n\
bl FileSelectUpdateTilemap \n\
cmp r0, #0 \n\
beq lbl_08079b44 \n\
movs r0, #2 \n\
movs r1, #0xff \n\
bl unk_790cc \n\
movs r7, #1 \n\
lbl_08079b44: \n\
add r0, r7, #0 \n\
add sp, #4 \n\
pop {r4, r5, r6, r7} \n\
pop {r1} \n\
bx r1 \n\
");
}
#endif
/**
* @brief 79b50 | 37c | Corrupted file subroutine

View File

@ -32,23 +32,29 @@
#include "structs/game_state.h"
#include "structs/text.h"
#ifdef NON_MATCHING
u32 unk_68168(u16 param_1, u8 param_2, u32 param_3)
/**
* @brief 68168 | 60 | To document
*
* @param param_1 To document
* @param param_2 To document
* @param param_3 To document
* @return u32 bool, suceeded
*/
u32 unk_68168(u16 param_1, u8 param_2, s8 param_3)
{
// https://decomp.me/scratch/7coJ2
s32 _param_3 = (s8)param_3;
s32 _param_3 = param_3;
u32 _uselessVarForMatching = !sNonGameplayRamPointer;
if (!PAUSE_SCREEN_DATA.unk_7C && param_2 != 0)
{
PAUSE_SCREEN_DATA.unk_7C++;
PAUSE_SCREEN_DATA.unk_7D = param_2;
PAUSE_SCREEN_DATA.unk_7F = _param_3;
PAUSE_SCREEN_DATA.unk_80 = (param_1 >> 0) & 0x1F;
PAUSE_SCREEN_DATA.unk_81 = (param_1 >> 8) & 0x1F;
PAUSE_SCREEN_DATA.unk_80 = 0x1F & param_1;
PAUSE_SCREEN_DATA.unk_81 = _uselessVarForMatching = (param_1 >> 8) & 0x1F;
PAUSE_SCREEN_DATA.unk_7E = 0;
return TRUE;
@ -56,63 +62,6 @@ u32 unk_68168(u16 param_1, u8 param_2, u32 param_3)
return FALSE;
}
#else
NAKED_FUNCTION
u32 unk_68168(u16 param_1, u8 param_2, u32 param_3)
{
asm(" \n\
push {r4, r5, r6, r7, lr} \n\
lsl r7, r0, #0x10 \n\
lsr r4, r7, #0x10 \n\
lsl r1, r1, #0x18 \n\
lsr r1, r1, #0x18 \n\
lsl r2, r2, #0x18 \n\
asr r2, r2, #0x18 \n\
ldr r5, lbl_080681bc @ =sNonGameplayRamPointer \n\
ldr r0, [r5] \n\
add r3, r0, #0 \n\
add r3, #0x7c \n\
ldrb r0, [r3] \n\
add r6, r0, #0 \n\
cmp r6, #0 \n\
bne lbl_080681c0 \n\
cmp r1, #0 \n\
beq lbl_080681c0 \n\
add r0, #1 \n\
strb r0, [r3] \n\
ldr r0, [r5] \n\
add r0, #0x7d \n\
strb r1, [r0] \n\
ldr r0, [r5] \n\
add r0, #0x7f \n\
strb r2, [r0] \n\
ldr r0, [r5] \n\
movs r1, #0x1f \n\
and r4, r1 \n\
add r0, #0x80 \n\
strb r4, [r0] \n\
ldr r2, [r5] \n\
lsr r0, r7, #0x18 \n\
movs r1, #0x1f \n\
and r0, r1 \n\
add r2, #0x81 \n\
strb r0, [r2] \n\
ldr r0, [r5] \n\
add r0, #0x7e \n\
strb r6, [r0] \n\
movs r0, #1 \n\
b lbl_080681c2 \n\
.align 2, 0 \n\
lbl_080681bc: .4byte sNonGameplayRamPointer \n\
lbl_080681c0: \n\
movs r0, #0 \n\
lbl_080681c2: \n\
pop {r4, r5, r6, r7} \n\
pop {r1} \n\
bx r1 \n\
");
}
#endif
/**
* @brief 681c8 | 124 | To document

View File

@ -147,16 +147,20 @@ void UpdateSuitType(u8 newSuit)
}
}
#ifdef NON_MATCHING
/**
* @brief 6ff4c | d4 | Draws the status screen row provided
*
* @param u8 row Row to draw
* @return u32 bool, done drawing
*/
u32 StatusScreenDrawItems(u8 row)
{
// https://decomp.me/scratch/qX1cv
s32 i;
s32 j;
u32 position;
u16* dst;
u32 temp;
const u8 (*tmp)[3];
u8 tmp2;
if (row >= 8)
return TRUE;
@ -166,6 +170,7 @@ u32 StatusScreenDrawItems(u8 row)
if (row == 0 && sStatusScreenRowsData[i][0] == ABILITY_GROUP_SUITS)
continue;
tmp2 = FALSE; // Needed to produce matching ASM.
position = (sStatusScreenGroupsData[sStatusScreenRowsData[i][0]][0] + row) * HALF_BLOCK_SIZE +
sStatusScreenGroupsData[sStatusScreenRowsData[i][0]][2];
@ -174,8 +179,7 @@ u32 StatusScreenDrawItems(u8 row)
for (j = 0; ; j++, position++)
{
temp = sStatusScreenRowsData[i][2];
if (j >= sStatusScreenRowsData[i][2])
if (j >= (tmp = sStatusScreenRowsData)[i][2])
break;
dst = VRAM_BASE + 0xC000;
@ -186,125 +190,10 @@ u32 StatusScreenDrawItems(u8 row)
if (row >= 7)
j = TRUE;
else
j = FALSE;
j = tmp2;
return j;
}
#else
NAKED_FUNCTION
u32 StatusScreenDrawItems(u8 row)
{
asm(" \n\
push {r4, r5, r6, r7, lr} \n\
mov r7, sl \n\
mov r6, sb \n\
mov r5, r8 \n\
push {r5, r6, r7} \n\
sub sp, #4 \n\
lsl r0, r0, #0x18 \n\
lsr r7, r0, #0x18 \n\
cmp r7, #7 \n\
bls lbl_0806ff64 \n\
movs r0, #1 \n\
b lbl_0806fff4 \n\
lbl_0806ff64: \n\
movs r4, #0 \n\
ldr r0, lbl_08070004 @ =sStatusScreenRowsData \n\
mov sb, r0 \n\
ldr r1, lbl_08070008 @ =sStatusScreenGroupsData \n\
mov sl, r1 \n\
lbl_0806ff6e: \n\
lsl r1, r4, #1 \n\
cmp r7, #0 \n\
bne lbl_0806ff80 \n\
add r0, r1, r4 \n\
add r0, sb \n\
ldrb r0, [r0] \n\
add r6, r4, #1 \n\
cmp r0, #2 \n\
beq lbl_0806ffe4 \n\
lbl_0806ff80: \n\
add r2, r1, r4 \n\
mov r3, sb \n\
add r0, r2, r3 \n\
ldrb r0, [r0] \n\
lsl r1, r0, #2 \n\
add r1, r1, r0 \n\
mov r5, sl \n\
add r0, r1, r5 \n\
ldrb r0, [r0] \n\
add r0, r0, r7 \n\
ldr r3, lbl_0807000c @ =sStatusScreenGroupsData+0x2 \n\
add r1, r1, r3 \n\
lsl r0, r0, #5 \n\
ldrb r1, [r1] \n\
add r3, r0, r1 \n\
ldr r5, lbl_08070010 @ =sStatusScreenRowsData+0x1 \n\
add r0, r2, r5 \n\
ldrb r0, [r0] \n\
add r6, r4, #1 \n\
cmp r0, r7 \n\
bls lbl_0806ffe4 \n\
movs r4, #0 \n\
ldr r1, lbl_08070014 @ =sStatusScreenRowsData+0x2 \n\
add r0, r2, r1 \n\
ldrb r5, [r0] \n\
cmp r4, r5 \n\
bge lbl_0806ffe4 \n\
ldr r1, lbl_08070018 @ =sEwramPointer \n\
mov r8, r1 \n\
movs r5, #0xe0 \n\
lsl r5, r5, #7 \n\
mov ip, r5 \n\
str r0, [sp] \n\
lsl r0, r3, #1 \n\
ldr r1, lbl_0807001c @ =0x0600c000 \n\
add r2, r0, r1 \n\
lbl_0806ffc8: \n\
lsl r0, r3, #1 \n\
mov r5, r8 \n\
ldr r1, [r5] \n\
add r1, ip \n\
add r1, r1, r0 \n\
ldrh r0, [r1] \n\
strh r0, [r2] \n\
add r4, #1 \n\
add r2, #2 \n\
add r3, #1 \n\
ldr r0, [sp] \n\
ldrb r0, [r0] \n\
cmp r4, r0 \n\
blt lbl_0806ffc8 \n\
lbl_0806ffe4: \n\
add r4, r6, #0 \n\
cmp r4, #5 \n\
ble lbl_0806ff6e \n\
movs r4, #0 \n\
cmp r7, #6 \n\
bls lbl_0806fff2 \n\
movs r4, #1 \n\
lbl_0806fff2: \n\
add r0, r4, #0 \n\
lbl_0806fff4: \n\
add sp, #4 \n\
pop {r3, r4, r5} \n\
mov r8, r3 \n\
mov sb, r4 \n\
mov sl, r5 \n\
pop {r4, r5, r6, r7} \n\
pop {r1} \n\
bx r1 \n\
.align 2, 0 \n\
lbl_08070004: .4byte sStatusScreenRowsData \n\
lbl_08070008: .4byte sStatusScreenGroupsData \n\
lbl_0807000c: .4byte sStatusScreenGroupsData+0x2 \n\
lbl_08070010: .4byte sStatusScreenRowsData+0x1 \n\
lbl_08070014: .4byte sStatusScreenRowsData+0x2 \n\
lbl_08070018: .4byte sEwramPointer \n\
lbl_0807001c: .4byte 0x0600c000 \n\
");
}
#endif
/**
* @brief 70020 | 160 | Gets the status slot for a new item
@ -673,8 +562,6 @@ void StatusScreenSetBeamsVisibility(u16* pTilemap)
*/
void StatusScreenSetSuitsVisibility(u16* pTilemap)
{
// https://decomp.me/scratch/Z22vi
s32 i;
s32 j;
s32 row;
@ -2192,10 +2079,9 @@ void StatusScreenMoveCursor(void)
}
}
#ifdef NON_MATCHING
u32 StatusScreenGetDestinationSlot(s32 offset, u32 previousSlot)
{
// https://decomp.me/scratch/JSj7i
// https://decomp.me/scratch/cAUPk
s32 newSlot;
u8 prevSlot;
@ -2294,8 +2180,23 @@ u32 StatusScreenGetDestinationSlot(s32 offset, u32 previousSlot)
lowerLimit = 1;
}
#ifndef NON_MATCHING
// The code here should not have any effect on the program whatsoever,
// since it can only produce a modification to r0, and later in the
// function r0 is always overwritten before it is read again.
// Whatever the original C code for this was, the compiler should have
// optimized it out.
// Ironically, any attempt made at replicating this asm was optimized
// out by the compiler, or produced incorrect code (which modified the
// program's state in a different, noticeable way).
if (off != 1)
off = -1;
{
asm(
"movs r0, #1\n"
"neg r0, r0\n"
);
}
#endif // !NON_MATCHING
var_2 = newSlot;
@ -2319,148 +2220,3 @@ u32 StatusScreenGetDestinationSlot(s32 offset, u32 previousSlot)
return newSlot;
}
#else
NAKED_FUNCTION
u32 StatusScreenGetDestinationSlot(s32 offset, u32 previousSlot)
{
asm(" \n\
push {r4, r5, r6, r7, lr} \n\
mov r7, r8 \n\
push {r7} \n\
sub sp, #4 \n\
lsl r0, r0, #0x18 \n\
asr r5, r0, #0x18 \n\
lsl r1, r1, #0x18 \n\
lsr r4, r1, #0x18 \n\
mov r8, r4 \n\
cmp r5, #0 \n\
beq lbl_08071f62 \n\
cmp r5, #1 \n\
ble lbl_08071f26 \n\
cmp r4, #7 \n\
bls lbl_08071ea8 \n\
ldr r1, lbl_08071ea4 @ =sNonGameplayRamPointer \n\
ldr r0, [r1] \n\
add r0, #0xc3 \n\
b lbl_08071eae \n\
.align 2, 0 \n\
lbl_08071ea4: .4byte sNonGameplayRamPointer \n\
lbl_08071ea8: \n\
ldr r1, lbl_08071ed4 @ =sNonGameplayRamPointer \n\
ldr r0, [r1] \n\
add r0, #0xc2 \n\
lbl_08071eae: \n\
strb r4, [r0] \n\
mov r0, r8 \n\
cmp r0, #7 \n\
bls lbl_08071edc \n\
ldr r0, [r1] \n\
add r0, #0xc2 \n\
ldrb r4, [r0] \n\
cmp r4, #0 \n\
bne lbl_08071f62 \n\
movs r1, #7 \n\
movs r7, #1 \n\
mov r0, r8 \n\
cmp r0, #0xb \n\
bls lbl_08071ed8 \n\
movs r4, #6 \n\
movs r5, #1 \n\
neg r5, r5 \n\
b lbl_08071efc \n\
.align 2, 0 \n\
lbl_08071ed4: .4byte sNonGameplayRamPointer \n\
lbl_08071ed8: \n\
movs r4, #1 \n\
b lbl_08071efa \n\
lbl_08071edc: \n\
ldr r0, [r1] \n\
add r0, #0xc3 \n\
ldrb r4, [r0] \n\
cmp r4, #0 \n\
bne lbl_08071f62 \n\
movs r1, #0x11 \n\
movs r7, #8 \n\
mov r0, r8 \n\
cmp r0, #5 \n\
bls lbl_08071ef8 \n\
movs r4, #0xc \n\
movs r5, #1 \n\
neg r5, r5 \n\
b lbl_08071efc \n\
lbl_08071ef8: \n\
movs r4, #8 \n\
lbl_08071efa: \n\
movs r5, #1 \n\
lbl_08071efc: \n\
add r6, r4, #0 \n\
lbl_08071efe: \n\
lsl r0, r4, #0x18 \n\
lsr r0, r0, #0x18 \n\
str r1, [sp] \n\
bl StatusScreenIsStatusSlotEnabled \n\
ldr r1, [sp] \n\
cmp r0, #0 \n\
bne lbl_08071f62 \n\
add r4, r4, r5 \n\
cmp r4, r7 \n\
bge lbl_08071f18 \n\
add r4, r1, #0 \n\
b lbl_08071f1e \n\
lbl_08071f18: \n\
cmp r4, r1 \n\
ble lbl_08071f1e \n\
add r4, r7, #0 \n\
lbl_08071f1e: \n\
cmp r4, r6 \n\
bne lbl_08071efe \n\
lbl_08071f22: \n\
mov r4, r8 \n\
b lbl_08071f62 \n\
lbl_08071f26: \n\
cmp r4, #7 \n\
bls lbl_08071f30 \n\
movs r1, #0x11 \n\
movs r7, #8 \n\
b lbl_08071f34 \n\
lbl_08071f30: \n\
movs r1, #7 \n\
movs r7, #1 \n\
lbl_08071f34: \n\
cmp r5, #1 \n\
beq lbl_08071f3c \n\
movs r0, #1 \n\
neg r0, r0 \n\
lbl_08071f3c: \n\
add r6, r4, #0 \n\
lbl_08071f3e: \n\
add r4, r4, r5 \n\
cmp r4, r7 \n\
bge lbl_08071f48 \n\
add r4, r1, #0 \n\
b lbl_08071f4e \n\
lbl_08071f48: \n\
cmp r4, r1 \n\
ble lbl_08071f4e \n\
add r4, r7, #0 \n\
lbl_08071f4e: \n\
cmp r4, r6 \n\
beq lbl_08071f22 \n\
lsl r0, r4, #0x18 \n\
lsr r0, r0, #0x18 \n\
str r1, [sp] \n\
bl StatusScreenIsStatusSlotEnabled \n\
ldr r1, [sp] \n\
cmp r0, #0 \n\
beq lbl_08071f3e \n\
lbl_08071f62: \n\
add r0, r4, #0 \n\
add sp, #4 \n\
pop {r3} \n\
mov r8, r3 \n\
pop {r4, r5, r6, r7} \n\
pop {r1} \n\
bx r1 \n\
");
}
#endif

View File

@ -549,7 +549,7 @@ void MinimapUpdateForExploredTiles(void)
#ifdef NON_MATCHING
void MinimapDraw(void)
{
// https://decomp.me/scratch/qI74Z
// https://decomp.me/scratch/EaJoP
s32 yOffset;
s32 xOffset;

View File

@ -1,4 +1,5 @@
#include "music_wrappers.h"
#include "audio.h"
#include "audio_wrappers.h"
#include "syscalls.h"
#include "gba.h"
@ -130,7 +131,7 @@ void unk_34ac(u8 param_1)
{
if (pVariables->pSoundPSG != NULL)
{
clear_registers_for_psg(pVariables->pSoundPSG, (u8)((pVariables->channel & 7) - 1));
ClearRegistersForPsg(pVariables->pSoundPSG, (u8)((pVariables->channel & 7) - 1));
}
if (pVariables->pChannel == NULL)
@ -214,10 +215,13 @@ void unk_35d0(u8 param_1)
}
}
/**
* @brief 36d0 | bc | Checks if r0 is a new music track
*
* @param musicTrack Music Track
*/
void CheckSetNewMusicTrack(u16 musicTrack)
{
// https://decomp.me/scratch/HGig0
struct TrackData* pTrack;
u32 newTrack;
@ -245,7 +249,10 @@ void CheckSetNewMusicTrack(u16 musicTrack)
gSoundQueue[6].exists = 0;
if (gSoundQueue[8].exists & 3)
gSoundQueue[8].exists = 0;
{
// The following line is written like that to produce matching ASM:
do { gSoundQueue[8].exists = 0; } while (0);
}
pTrack = sMusicTrackDataRom[0].pTrack;
@ -263,10 +270,13 @@ void CheckSetNewMusicTrack(u16 musicTrack)
gMusicInfo.occupied = FALSE;
}
/**
* @brief 378c | ec | To document
*
* @param musicTrack Music Track
*/
void unk_378c(u16 musicTrack)
{
// https://decomp.me/scratch/ETNx6
u16 newTrack;
struct TrackData* pTrack;
s32 var_0;
@ -304,9 +314,15 @@ void unk_378c(u16 musicTrack)
{
newTrack = musicTrack - 0x5A;
if (newTrack >= 10)
{
// The following line is needed to produce matching ASM:
gSoundQueue[8].exists += 0;
var_0 = FALSE;
}
else
{
var_0 = TRUE;
}
}
}
else if (gMusicInfo.priority & 0x40)
@ -324,7 +340,7 @@ void unk_378c(u16 musicTrack)
if (var_0)
{
pTrack = sMusicTrackDataRom[0].pTrack;
if (sSoundDataEntries[DetermineNewMusicTrack(musicTrack)].pHeader != pTrack->pHeader)
if (sSoundDataEntries[(u16)DetermineNewMusicTrack(musicTrack)].pHeader != pTrack->pHeader)
{
ApplyMusicSoundFading(pTrack, 30);
gMusicInfo.musicTrackOnTransition = musicTrack;
@ -350,7 +366,7 @@ void CheckPlayTransitionMusicTrack(void)
if (gMusicInfo.priority == 0 && gMusicInfo.musicTrackOnTransition != MUSIC_NONE)
{
init_track(sMusicTrackDataRom[0].pTrack, sSoundDataEntries[gMusicInfo.musicTrackOnTransition].pHeader);
InitTrack(sMusicTrackDataRom[0].pTrack, sSoundDataEntries[gMusicInfo.musicTrackOnTransition].pHeader);
gMusicInfo.unk_20 = 0;
gMusicInfo.musicTrack = gMusicInfo.musicTrackOnTransition;
@ -367,8 +383,8 @@ void unk_38d8(void)
{
if (!(gMusicInfo.priority & 0x40) && gMusicInfo.musicTrackOnTransition != MUSIC_NONE)
{
init_track(sMusicTrackDataRom[0].pTrack,
sSoundDataEntries[DetermineNewMusicTrack(gMusicInfo.musicTrackOnTransition)].pHeader);
InitTrack(sMusicTrackDataRom[0].pTrack,
sSoundDataEntries[(u16)DetermineNewMusicTrack(gMusicInfo.musicTrackOnTransition)].pHeader);
gMusicInfo.unk_20 = 0;
gMusicInfo.musicTrack = gMusicInfo.musicTrackOnTransition;
}
@ -403,9 +419,9 @@ void UpdateMusicAfterAlarmDisable(void)
* @brief 3980 | 48 | Determines a new music track based on something?
*
* @param musicTrack Music track
* @return u16 New music track
* @return u32 New music track
*/
u16 DetermineNewMusicTrack(u16 musicTrack)
u32 DetermineNewMusicTrack(u16 musicTrack)
{
switch (musicTrack)
{
@ -474,7 +490,7 @@ void PlayMusic(u16 musicTrack, u8 priority)
gMusicInfo.unk_20 = 0;
gMusicInfo.musicTrack = musicTrack;
gMusicInfo.occupied = FALSE;
init_track(pTrack, pHeader);
InitTrack(pTrack, pHeader);
}
}
@ -695,7 +711,7 @@ void InsertMusicAndQueueCurrent(u16 musicTrack, u8 param_2)
gMusicInfo.unk_20 = 1;
gMusicInfo.occupied = FALSE;
init_track(pTrack, pHeader);
InitTrack(pTrack, pHeader);
}
}
@ -725,13 +741,13 @@ void ReplayQueuedMusic(u8 queueFlags)
gMusicInfo.unk_20 = 0;
if ((u16)(gMusicInfo.musicTrack - 0x5A) < 0xA)
music = DetermineNewMusicTrack(gMusicInfo.musicTrack);
music = (u16)DetermineNewMusicTrack(gMusicInfo.musicTrack);
else
music = gMusicInfo.musicTrack;
pHeader = sSoundDataEntries[music].pHeader;
gMusicInfo.occupied = FALSE;
init_track(pTrack, pHeader);
InitTrack(pTrack, pHeader);
if (queueFlags & 0x40)
DelayMusicStart(pTrack, 60);
@ -810,12 +826,12 @@ void PlayCurrentMusicTrack(void)
currTrack = gMusicInfo.musicTrack;
musicTrack = currTrack - 0x5A;
if (musicTrack < 10)
pHeader = sSoundDataEntries[DetermineNewMusicTrack(currTrack)].pHeader;
pHeader = sSoundDataEntries[(u16)DetermineNewMusicTrack(currTrack)].pHeader;
else
pHeader = sSoundDataEntries[currTrack].pHeader;
gMusicInfo.occupied = FALSE;
init_track(pTrack, pHeader);
InitTrack(pTrack, pHeader);
gMusicInfo.occupied = FALSE;
}
@ -958,7 +974,7 @@ void BackupTrackData2SoundChannels(void)
if (!(pVariables->channel & 0xC0))
{
if (pVariables->pSoundPSG)
clear_registers_for_psg(pVariables->pSoundPSG, (pVariables->channel & 7) - 1); // Undefined, definition required
ClearRegistersForPsg(pVariables->pSoundPSG, (pVariables->channel & 7) - 1);
if (pVariables->pChannel)
{
@ -1136,7 +1152,7 @@ void unk_42bc(u16 musicTrack)
if (musicTrack == MUSIC_NONE)
musicTrack = 0x12B;
init_track(sMusicTrackDataRom[0].pTrack, sSoundDataEntries[musicTrack].pHeader);
InitTrack(sMusicTrackDataRom[0].pTrack, sSoundDataEntries[musicTrack].pHeader);
gMusicInfo.unk_20 = 0;
gMusicInfo.musicTrack = musicTrack;

View File

@ -569,11 +569,13 @@ void RoomSetBackgroundScrolling(void)
gInGameCutscene.queriedCutscene = 0;
}
#ifdef NON_MATCHING
/**
* @brief 56b28 | 1f0 | Setups the initial tilemapfor the BG specified
*
* @param bgNumber Background number
*/
void RoomSetInitialTilemap(u8 bgNumber)
{
// https://decomp.me/scratch/mY7sw
s32 properties;
s32 yPosition;
u16 xPosition;
@ -583,7 +585,7 @@ void RoomSetInitialTilemap(u8 bgNumber)
u16* pDecomp;
u16 yPos;
u16 xPos;
u16 xSize;
u16 ySize;
@ -596,23 +598,27 @@ void RoomSetInitialTilemap(u8 bgNumber)
u16* dst;
u16* pTilemap;
u32 tmpOffset;
if (bgNumber == 0)
{
properties = gCurrentRoomEntry.Bg0Prop;
yPosition = gBg0YPosition / BLOCK_SIZE;
xPosition = gBg0XPosition / BLOCK_SIZE;
do {
yPosition = SUB_PIXEL_TO_BLOCK(gBg0YPosition);
xPosition = SUB_PIXEL_TO_BLOCK(gBg0XPosition);
} while (0);
}
else if (bgNumber == 1)
{
properties = gCurrentRoomEntry.Bg1Prop;
yPosition = gBg1YPosition / BLOCK_SIZE;
xPosition = gBg1XPosition / BLOCK_SIZE;
yPosition = SUB_PIXEL_TO_BLOCK(gBg1YPosition);
xPosition = SUB_PIXEL_TO_BLOCK(gBg1XPosition);
}
else
{
properties = gCurrentRoomEntry.Bg2Prop;
yPosition = gBg2YPosition / BLOCK_SIZE;
xPosition = gBg2XPosition / BLOCK_SIZE;
yPosition = SUB_PIXEL_TO_BLOCK(gBg2YPosition);
xPosition = SUB_PIXEL_TO_BLOCK(gBg2XPosition);
}
if (properties & BG_PROP_RLE_COMPRESSED)
@ -627,7 +633,7 @@ void RoomSetInitialTilemap(u8 bgNumber)
xSize = gBgPointersAndDimensions.backgrounds[bgNumber].width - offset;
xPos = offset;
ySize = 0x10;
offset = yPosition - 3;
@ -645,16 +651,18 @@ void RoomSetInitialTilemap(u8 bgNumber)
iWidth = i * gBgPointersAndDimensions.backgrounds[bgNumber].width;
tmpX = xPos;
for (yPosition = 0; yPosition < xSize; iWidth++, yPosition++, tmpX++)
for (yPosition = 0; yPosition < xSize; iWidth++, yPosition++, tmpX++)
{
dst = VRAM_BASE + bgNumber * 0x1000;
tmpOffset = 0x800; // Needed to produce matching ASM.
if (tmpX & 0x10)
dst = VRAM_BASE + 0x800 + bgNumber * 0x1000;
dst = VRAM_BASE + tmpOffset + bgNumber * 0x1000;
dst = &dst[(tmpX & 0xF) * 2 + (yPos & 0xF) * 64];
offset = pDecomp[iWidth] * 4;
offset = pDecomp[iWidth];
offset *= 4;
pTilemap = &gTilemapAndClipPointers.pTilemap[offset];
dst[0] = *pTilemap++;
@ -666,12 +674,15 @@ void RoomSetInitialTilemap(u8 bgNumber)
}
else
{
s32 *offsetPtr; // Needed to produce matching ASM.
if (properties == 0)
{
BitFill(3, 0x40, VRAM_BASE + bgNumber * 0x1000, 0x1000, 16);
return;
}
offsetPtr = &offset;
if (properties & BG_PROP_LZ77_COMPRESSED && bgNumber == 0)
{
offset = 0x800;
@ -685,267 +696,6 @@ void RoomSetInitialTilemap(u8 bgNumber)
}
}
}
#else
NAKED_FUNCTION
void RoomSetInitialTilemap(u8 bgNumber)
{
asm(" \n\
push {r4, r5, r6, r7, lr} \n\
mov r7, sl \n\
mov r6, sb \n\
mov r5, r8 \n\
push {r5, r6, r7} \n\
sub sp, #0x1c \n\
lsl r0, r0, #0x18 \n\
lsr r0, r0, #0x18 \n\
mov sb, r0 \n\
cmp r0, #0 \n\
bne lbl_08056b58 \n\
ldr r1, lbl_08056b4c @ =gCurrentRoomEntry \n\
ldrb r2, [r1, #1] \n\
ldr r0, lbl_08056b50 @ =gBg0YPosition \n\
ldrh r0, [r0] \n\
lsr r6, r0, #6 \n\
ldr r0, lbl_08056b54 @ =gBg0XPosition \n\
b lbl_08056b84 \n\
.align 2, 0 \n\
lbl_08056b4c: .4byte gCurrentRoomEntry \n\
lbl_08056b50: .4byte gBg0YPosition \n\
lbl_08056b54: .4byte gBg0XPosition \n\
lbl_08056b58: \n\
mov r0, sb \n\
cmp r0, #1 \n\
bne lbl_08056b78 \n\
ldr r1, lbl_08056b6c @ =gCurrentRoomEntry \n\
ldrb r2, [r1, #2] \n\
ldr r0, lbl_08056b70 @ =gBg1YPosition \n\
ldrh r0, [r0] \n\
lsr r6, r0, #6 \n\
ldr r0, lbl_08056b74 @ =gBg1XPosition \n\
b lbl_08056b84 \n\
.align 2, 0 \n\
lbl_08056b6c: .4byte gCurrentRoomEntry \n\
lbl_08056b70: .4byte gBg1YPosition \n\
lbl_08056b74: .4byte gBg1XPosition \n\
lbl_08056b78: \n\
ldr r1, lbl_08056c94 @ =gCurrentRoomEntry \n\
ldrb r2, [r1, #3] \n\
ldr r0, lbl_08056c98 @ =gBg2YPosition \n\
ldrh r0, [r0] \n\
lsr r6, r0, #6 \n\
ldr r0, lbl_08056c9c @ =gBg2XPosition \n\
lbl_08056b84: \n\
ldrh r0, [r0] \n\
lsr r3, r0, #6 \n\
movs r7, #0x10 \n\
add r0, r2, #0 \n\
and r0, r7 \n\
cmp r0, #0 \n\
bne lbl_08056b94 \n\
b lbl_08056cac \n\
lbl_08056b94: \n\
movs r1, #0x15 \n\
str r1, [sp, #0xc] \n\
sub r4, r3, #3 \n\
cmp r4, #0 \n\
bge lbl_08056ba0 \n\
movs r4, #0 \n\
lbl_08056ba0: \n\
ldr r1, lbl_08056ca0 @ =gBgPointersAndDimensions \n\
mov r2, sb \n\
lsl r0, r2, #3 \n\
add r5, r0, r1 \n\
ldrh r1, [r5, #4] \n\
sub r0, r1, r4 \n\
ldr r3, [sp, #0xc] \n\
cmp r3, r0 \n\
ble lbl_08056bb8 \n\
lsl r0, r0, #0x10 \n\
lsr r0, r0, #0x10 \n\
str r0, [sp, #0xc] \n\
lbl_08056bb8: \n\
lsl r0, r4, #0x10 \n\
lsr r0, r0, #0x10 \n\
str r0, [sp, #8] \n\
movs r0, #0x10 \n\
str r0, [sp, #0x10] \n\
sub r4, r6, #3 \n\
cmp r4, #0 \n\
bge lbl_08056bca \n\
movs r4, #0 \n\
lbl_08056bca: \n\
ldrh r0, [r5, #6] \n\
sub r0, r0, r4 \n\
cmp r7, r0 \n\
ble lbl_08056bd8 \n\
lsl r0, r0, #0x10 \n\
lsr r0, r0, #0x10 \n\
str r0, [sp, #0x10] \n\
lbl_08056bd8: \n\
lsl r0, r4, #0x10 \n\
lsr r0, r0, #0x10 \n\
mul r1, r0, r1 \n\
ldr r2, [sp, #8] \n\
add r1, r2, r1 \n\
lsl r1, r1, #1 \n\
ldr r2, [r5] \n\
add r2, r2, r1 \n\
str r2, [sp, #4] \n\
add r1, r0, #0 \n\
movs r2, #0 \n\
ldr r3, [sp, #0x10] \n\
cmp r2, r3 \n\
blt lbl_08056bf6 \n\
b lbl_08056d02 \n\
lbl_08056bf6: \n\
str r5, [sp, #0x14] \n\
lbl_08056bf8: \n\
ldr r3, [sp, #0x14] \n\
ldrh r0, [r3, #4] \n\
mul r0, r2, r0 \n\
lsl r0, r0, #0x10 \n\
lsr r7, r0, #0x10 \n\
ldr r5, [sp, #8] \n\
add r2, #1 \n\
str r2, [sp, #0x18] \n\
add r0, r1, #1 \n\
mov sl, r0 \n\
ldr r2, [sp, #0xc] \n\
cmp r2, #0 \n\
beq lbl_08056c82 \n\
mov r3, sb \n\
lsl r3, r3, #0xc \n\
mov ip, r3 \n\
movs r0, #0xf \n\
and r1, r0 \n\
lsl r1, r1, #6 \n\
mov r8, r1 \n\
add r6, r2, #0 \n\
lbl_08056c22: \n\
movs r0, #0xc0 \n\
lsl r0, r0, #0x13 \n\
mov r1, ip \n\
add r3, r1, r0 \n\
movs r0, #0x10 \n\
and r0, r5 \n\
cmp r0, #0 \n\
beq lbl_08056c36 \n\
ldr r3, lbl_08056ca4 @ =0x06000800 \n\
add r3, ip \n\
lbl_08056c36: \n\
add r0, r5, #0 \n\
movs r2, #0xf \n\
and r0, r2 \n\
lsl r0, r0, #1 \n\
add r0, r8 \n\
lsl r0, r0, #1 \n\
add r3, r3, r0 \n\
lsl r0, r7, #1 \n\
ldr r1, [sp, #4] \n\
add r0, r0, r1 \n\
ldrh r4, [r0] \n\
lsl r1, r4, #3 \n\
ldr r2, lbl_08056ca8 @ =gTilemapAndClipPointers \n\
ldr r0, [r2] \n\
add r0, r0, r1 \n\
ldrh r1, [r0] \n\
strh r1, [r3] \n\
add r0, #2 \n\
ldrh r1, [r0] \n\
strh r1, [r3, #2] \n\
add r0, #2 \n\
add r2, r3, #0 \n\
add r2, #0x40 \n\
ldrh r1, [r0] \n\
strh r1, [r2] \n\
add r1, r3, #0 \n\
add r1, #0x42 \n\
ldrh r0, [r0, #2] \n\
strh r0, [r1] \n\
add r0, r7, #1 \n\
lsl r0, r0, #0x10 \n\
lsr r7, r0, #0x10 \n\
sub r6, #1 \n\
add r0, r5, #1 \n\
lsl r0, r0, #0x10 \n\
lsr r5, r0, #0x10 \n\
cmp r6, #0 \n\
bne lbl_08056c22 \n\
lbl_08056c82: \n\
ldr r2, [sp, #0x18] \n\
mov r3, sl \n\
lsl r0, r3, #0x10 \n\
lsr r1, r0, #0x10 \n\
ldr r0, [sp, #0x10] \n\
cmp r2, r0 \n\
blt lbl_08056bf8 \n\
b lbl_08056d02 \n\
.align 2, 0 \n\
lbl_08056c94: .4byte gCurrentRoomEntry \n\
lbl_08056c98: .4byte gBg2YPosition \n\
lbl_08056c9c: .4byte gBg2XPosition \n\
lbl_08056ca0: .4byte gBgPointersAndDimensions \n\
lbl_08056ca4: .4byte 0x06000800 \n\
lbl_08056ca8: .4byte gTilemapAndClipPointers \n\
lbl_08056cac: \n\
cmp r2, #0 \n\
bne lbl_08056cca \n\
mov r1, sb \n\
lsl r2, r1, #0xc \n\
movs r0, #0xc0 \n\
lsl r0, r0, #0x13 \n\
add r2, r2, r0 \n\
movs r3, #0x80 \n\
lsl r3, r3, #5 \n\
str r7, [sp] \n\
movs r0, #3 \n\
movs r1, #0x40 \n\
bl BitFill \n\
b lbl_08056d02 \n\
lbl_08056cca: \n\
movs r0, #0x40 \n\
and r2, r0 \n\
cmp r2, #0 \n\
beq lbl_08056d02 \n\
mov r2, sb \n\
cmp r2, #0 \n\
bne lbl_08056d02 \n\
movs r4, #0x80 \n\
lsl r4, r4, #4 \n\
ldrb r1, [r1, #0x18] \n\
movs r0, #1 \n\
and r0, r1 \n\
cmp r0, #0 \n\
beq lbl_08056ce8 \n\
lsl r4, r4, #1 \n\
lbl_08056ce8: \n\
movs r0, #2 \n\
and r0, r1 \n\
cmp r0, #0 \n\
beq lbl_08056cf2 \n\
lsl r4, r4, #1 \n\
lbl_08056cf2: \n\
ldr r1, lbl_08056d14 @ =0x0202a800 \n\
movs r2, #0xc0 \n\
lsl r2, r2, #0x13 \n\
str r7, [sp] \n\
movs r0, #3 \n\
add r3, r4, #0 \n\
bl DmaTransfer \n\
lbl_08056d02: \n\
add sp, #0x1c \n\
pop {r3, r4, r5} \n\
mov r8, r3 \n\
mov sb, r4 \n\
mov sl, r5 \n\
pop {r4, r5, r6, r7} \n\
pop {r0} \n\
bx r0 \n\
.align 2, 0 \n\
lbl_08056d14: .4byte 0x0202a800 \n\
");
}
#endif
/**
* @brief 56d18 | 110 | RLE decompression algorithm

View File

@ -650,11 +650,15 @@ u8 SamusCheckStandingOnGroundCollision(struct SamusData* pData, struct SamusPhys
return SPOSE_NONE;
}
#ifdef NON_MATCHING
/**
* @brief 5c4c | 1d0 | Checks for a block collision to land
*
* @param pData Samus data pointer
* @param pPhysics Samus physics pointer
* @return u8 New pose
*/
u8 SamusCheckLandingCollision(struct SamusData* pData, struct SamusPhysics* pPhysics)
{
// https://decomp.me/scratch/zWpei
u16 hHitbox;
u16 blockY;
u16 prevBlockY;
@ -675,6 +679,7 @@ u8 SamusCheckLandingCollision(struct SamusData* pData, struct SamusPhysics* pPhy
}
else
{
hHitbox = pPhysics->hitboxLeftOffset;
hHitbox = pPhysics->hitboxRightOffset;
}
@ -714,6 +719,8 @@ u8 SamusCheckLandingCollision(struct SamusData* pData, struct SamusPhysics* pPhy
}
else
{
u16 tmpResultSlopeLeft;
SamusCheckCollisionAtPosition(pData->xPosition + pPhysics->hitboxLeftOffset, pData->yPosition - BLOCK_SIZE,
&resultXLeft, &resultYLeft, &resultSlopeLeft);
@ -721,9 +728,8 @@ u8 SamusCheckLandingCollision(struct SamusData* pData, struct SamusPhysics* pPhy
if (resultSlopeLeft == SLOPE_NONE)
pData->yPosition = resultYLeft + SUB_PIXEL_POSITION_FLAG;
// Temp
pData->currentAnimationFrame = resultSlopeLeft;
// pData->currentSlope = resultSlopeLeft;
tmpResultSlopeLeft = resultSlopeLeft; // Needed to produce matching ASM.
pData->currentSlope = (tmpResultSlopeLeft = resultSlopeLeft);
}
}
else if (collisionRight != CLIPDATA_TYPE_AIR)
@ -781,258 +787,6 @@ u8 SamusCheckLandingCollision(struct SamusData* pData, struct SamusPhysics* pPhy
return SPOSE_NONE;
}
#else
NAKED_FUNCTION
u8 SamusCheckLandingCollision(struct SamusData* pData, struct SamusPhysics* pPhysics)
{
asm("\n\
push {r4, r5, r6, r7, lr} \n\
mov r7, sl \n\
mov r6, sb \n\
mov r5, r8 \n\
push {r5, r6, r7} \n\
sub sp, #0x24 \n\
add r6, r0, #0 \n\
mov sb, r1 \n\
mov r0, sb \n\
add r0, #0x4e \n\
ldrb r0, [r0] \n\
cmp r0, #1 \n\
bne lbl_08005c6e \n\
mov r0, sb \n\
add r0, #0x50 \n\
ldrh r1, [r0] \n\
b lbl_08005c76 \n\
lbl_08005c6e: \n\
mov r0, sb \n\
add r0, #0x52 \n\
ldrh r1, [r0] \n\
sub r0, #2 \n\
lbl_08005c76: \n\
str r0, [sp, #0x20] \n\
ldrh r2, [r6, #0x12] \n\
add r2, r1, r2 \n\
lsl r2, r2, #0x10 \n\
lsr r2, r2, #0x10 \n\
add r0, r6, #0 \n\
mov r1, sb \n\
add r3, sp, #4 \n\
bl unk_5604 \n\
lsl r0, r0, #0x18 \n\
cmp r0, #0 \n\
beq lbl_08005ca0 \n\
add r0, sp, #4 \n\
ldrh r0, [r0] \n\
strh r0, [r6, #0x12] \n\
mov r1, sb \n\
add r1, #0x58 \n\
ldrb r0, [r1] \n\
add r0, #1 \n\
strb r0, [r1] \n\
lbl_08005ca0: \n\
ldrb r0, [r6, #1] \n\
cmp r0, #1 \n\
bne lbl_08005ca8 \n\
b lbl_08005e06 \n\
lbl_08005ca8: \n\
ldrh r0, [r6, #0x14] \n\
ldr r1, lbl_08005d2c @ =0x0000ffc0 \n\
and r1, r0 \n\
str r1, [sp, #0x14] \n\
ldr r0, lbl_08005d30 @ =gPreviousYPosition \n\
ldrh r0, [r0] \n\
ldr r2, lbl_08005d2c @ =0x0000ffc0 \n\
mov sl, r2 \n\
mov r1, sl \n\
and r1, r0 \n\
mov sl, r1 \n\
ldr r2, [sp, #0x20] \n\
str r2, [sp, #0x18] \n\
ldrh r0, [r2] \n\
ldrh r1, [r6, #0x12] \n\
add r0, r0, r1 \n\
lsl r0, r0, #0x10 \n\
lsr r0, r0, #0x10 \n\
ldrh r1, [r6, #0x14] \n\
movs r2, #6 \n\
add r2, sp \n\
mov r8, r2 \n\
add r5, sp, #8 \n\
str r5, [sp] \n\
add r2, sp, #4 \n\
mov r3, r8 \n\
bl SamusCheckCollisionAtPosition \n\
lsl r0, r0, #0x18 \n\
lsr r0, r0, #0x18 \n\
str r0, [sp, #0x10] \n\
mov r0, sb \n\
add r0, #0x52 \n\
str r0, [sp, #0x1c] \n\
ldrh r0, [r0] \n\
ldrh r1, [r6, #0x12] \n\
add r0, r0, r1 \n\
lsl r0, r0, #0x10 \n\
lsr r0, r0, #0x10 \n\
ldrh r1, [r6, #0x14] \n\
mov r2, sp \n\
add r2, #0xa \n\
add r4, sp, #0xc \n\
mov r7, sp \n\
add r7, #0xe \n\
str r7, [sp] \n\
add r3, r4, #0 \n\
bl SamusCheckCollisionAtPosition \n\
lsl r0, r0, #0x18 \n\
lsr r0, r0, #0x18 \n\
ldr r2, [sp, #0x14] \n\
cmp r2, sl \n\
bls lbl_08005db2 \n\
ldr r1, [sp, #0x10] \n\
cmp r1, #0 \n\
beq lbl_08005d72 \n\
ldrh r1, [r5] \n\
cmp r1, #0 \n\
beq lbl_08005d3c \n\
cmp r0, #0 \n\
beq lbl_08005d34 \n\
ldrh r0, [r4] \n\
sub r0, #1 \n\
b lbl_08005de6 \n\
.align 2, 0 \n\
lbl_08005d2c: .4byte 0x0000ffc0 \n\
lbl_08005d30: .4byte gPreviousYPosition \n\
lbl_08005d34: \n\
strh r1, [r6, #0x1a] \n\
mov r2, r8 \n\
ldrh r0, [r2] \n\
b lbl_08005de6 \n\
lbl_08005d3c: \n\
ldr r1, [sp, #0x18] \n\
ldrh r0, [r1] \n\
ldrh r2, [r6, #0x12] \n\
add r0, r0, r2 \n\
lsl r0, r0, #0x10 \n\
lsr r0, r0, #0x10 \n\
ldrh r1, [r6, #0x14] \n\
sub r1, #0x40 \n\
lsl r1, r1, #0x10 \n\
lsr r1, r1, #0x10 \n\
str r5, [sp] \n\
add r2, sp, #4 \n\
mov r3, r8 \n\
bl SamusCheckCollisionAtPosition \n\
mov r0, r8 \n\
ldrh r3, [r0] \n\
strh r3, [r6, #0x14] \n\
ldrh r0, [r5] \n\
cmp r0, #0 \n\
bne lbl_08005d6c \n\
add r0, r3, #0 \n\
add r0, #0x3f \n\
strh r0, [r6, #0x14] \n\
lbl_08005d6c: \n\
ldrh r0, [r5] \n\
strh r0, [r6, #0x1a] \n\
b lbl_08005de8 \n\
lbl_08005d72: \n\
cmp r0, #0 \n\
beq lbl_08005e06 \n\
ldrh r0, [r7] \n\
cmp r0, #0 \n\
bne lbl_08005de2 \n\
ldr r1, [sp, #0x1c] \n\
ldrh r0, [r1] \n\
ldrh r2, [r6, #0x12] \n\
add r0, r0, r2 \n\
lsl r0, r0, #0x10 \n\
lsr r0, r0, #0x10 \n\
ldrh r1, [r6, #0x14] \n\
sub r1, #0x40 \n\
lsl r1, r1, #0x10 \n\
lsr r1, r1, #0x10 \n\
str r5, [sp] \n\
add r2, sp, #4 \n\
mov r3, r8 \n\
bl SamusCheckCollisionAtPosition \n\
mov r0, r8 \n\
ldrh r3, [r0] \n\
strh r3, [r6, #0x14] \n\
ldrh r0, [r5] \n\
cmp r0, #0 \n\
bne lbl_08005dac \n\
add r0, r3, #0 \n\
add r0, #0x3f \n\
strh r0, [r6, #0x14] \n\
lbl_08005dac: \n\
ldrh r0, [r5] \n\
strh r0, [r6, #0x1a] \n\
b lbl_08005de8 \n\
lbl_08005db2: \n\
ldr r1, [sp, #0x10] \n\
cmp r1, #0 \n\
beq lbl_08005dd8 \n\
ldrh r0, [r5] \n\
cmp r0, #0 \n\
beq lbl_08005dc6 \n\
strh r0, [r6, #0x1a] \n\
mov r2, r8 \n\
ldrh r0, [r2] \n\
b lbl_08005de6 \n\
lbl_08005dc6: \n\
ldrh r1, [r6, #0x12] \n\
ldr r0, lbl_08005dd4 @ =0x0000ffc0 \n\
and r0, r1 \n\
ldr r2, [sp, #0x20] \n\
ldrh r1, [r2] \n\
sub r0, r0, r1 \n\
b lbl_08005dfa \n\
.align 2, 0 \n\
lbl_08005dd4: .4byte 0x0000ffc0 \n\
lbl_08005dd8: \n\
cmp r0, #0 \n\
beq lbl_08005e06 \n\
ldrh r0, [r7] \n\
cmp r0, #0 \n\
beq lbl_08005dec \n\
lbl_08005de2: \n\
strh r0, [r6, #0x1a] \n\
ldrh r0, [r4] \n\
lbl_08005de6: \n\
strh r0, [r6, #0x14] \n\
lbl_08005de8: \n\
movs r0, #0xfd \n\
b lbl_08005e08 \n\
lbl_08005dec: \n\
ldrh r1, [r6, #0x12] \n\
ldr r0, lbl_08005e18 @ =0x0000ffc0 \n\
and r0, r1 \n\
ldr r2, [sp, #0x1c] \n\
ldrh r1, [r2] \n\
sub r0, r0, r1 \n\
add r0, #0x3f \n\
lbl_08005dfa: \n\
strh r0, [r6, #0x12] \n\
mov r1, sb \n\
add r1, #0x58 \n\
ldrb r0, [r1] \n\
add r0, #1 \n\
strb r0, [r1] \n\
lbl_08005e06: \n\
movs r0, #0xff \n\
lbl_08005e08: \n\
add sp, #0x24 \n\
pop {r3, r4, r5} \n\
mov r8, r3 \n\
mov sb, r4 \n\
mov sl, r5 \n\
pop {r4, r5, r6, r7} \n\
pop {r1} \n\
bx r1 \n\
.align 2, 0 \n\
lbl_08005e18: .4byte 0x0000ffc0 \n\
");
}
#endif
/**
* @brief 5e1c | 11c | Checks for top collision
@ -7512,11 +7266,13 @@ void SamusUpdateGraphicsOam(struct SamusData* pData, u8 direction)
pPhysics->pScrewShinesparkGfx = &pGraphics[pPhysics->screwSpeedGfxSize];
}
#ifdef NON_MATCHING
/**
* @brief b46c | 3fc | Updates the palette of Samus
*
* @param pData Samus data pointer
*/
void SamusUpdatePalette(struct SamusData* pData)
{
// https://decomp.me/scratch/LhP1o
const u16* pDefaultPal;
const u16* pReleasePal;
const u16* pFlashingPal;
@ -7647,18 +7403,20 @@ void SamusUpdatePalette(struct SamusData* pData)
{
pData->invincibilityTimer--;
if ((gFrameCounter8Bit & 3) <= 1)
pBufferPal = pFlashingPal;
else
pBufferPal = pFlashingPal + 16;
do {
if ((gFrameCounter8Bit & 3) <= 1)
pBufferPal = pFlashingPal;
else
pBufferPal = pFlashingPal + 16;
} while (0);
SamusCopyPalette(pBufferPal, 0, 16);
pBufferPal = pDefaultPal + 16;
SamusCopyPalette(pBufferPal, 16, 16);
return;
}
if (gSamusHazardDamage.paletteTimer != 0 && MOD_AND(gSamusHazardDamage.paletteTimer, 16) > 7)
if (gSamusHazardDamage.paletteTimer != 0 && (gSamusHazardDamage.paletteTimer & 15) > 7)
{
pBufferPal = pFlashingPal + 16;
SamusCopyPalette(pBufferPal, 0, 16);
@ -7670,18 +7428,25 @@ void SamusUpdatePalette(struct SamusData* pData)
if (pData->speedboostingShinesparking != 0 || pData->shinesparkTimer != 0)
{
rng = gFrameCounter8Bit % 6;
if (rng >= 0)
{
if (rng <= 1)
pBufferPal = pSpeedboostPal;
else if (rng > 3)
#ifdef NON_MATCHING
pBufferPal = pSpeedboostPal + 16 * 2;
#else // !NON_MATCHING
goto speedboostPal_outer_else; // Needed to produce matching ASM.
#endif // NON_MATCHING
else
pBufferPal = pSpeedboostPal + 16;
}
else
{
speedboostPal_outer_else:
pBufferPal = pSpeedboostPal + 16 * 2;
}
SamusCopyPalette(pBufferPal, 0, 16);
SamusCopyPalette(pBufferPal, 16, 16);
@ -7690,7 +7455,7 @@ void SamusUpdatePalette(struct SamusData* pData)
if (pData->pose == SPOSE_SCREW_ATTACKING)
{
if (MOD_AND(pData->currentAnimationFrame, 2))
if (pData->currentAnimationFrame & 1)
pBufferPal = pFlashingPal + 16;
else
pBufferPal = pDefaultPal;
@ -7758,11 +7523,13 @@ void SamusUpdatePalette(struct SamusData* pData)
pBufferPal = pDefaultPal;
if (pEquipment->suitType != SUIT_SUITLESS)
{
chargeCounter = pWeapon->chargeCounter;
limit = CHARGE_BEAM_THRESHOLD;
s32 tmp; // Needed to produce matching ASM.
chargeCounter = (tmp = pWeapon->chargeCounter);
limit = 64;
if (chargeCounter >= limit)
{
offset = DIV_SHIFT(chargeCounter - limit, 4);
offset = (chargeCounter - limit) >> 2;
if (offset != 3)
{
@ -7777,510 +7544,18 @@ void SamusUpdatePalette(struct SamusData* pData)
else
pBufferPal = pChargingPal;
pBufferPal += MOD_AND(offset, 2) * 16;
pBufferPal += (offset & 1) * 16;
}
}
}
SamusCopyPalette(pBufferPal, 0, 16 * 2);
}
#else
NAKED_FUNCTION
void SamusUpdatePalette(struct SamusData* pData)
{
asm("\n\
push {r4, r5, r6, r7, lr} \n\
mov r7, sl \n\
mov r6, sb \n\
mov r5, r8 \n\
push {r5, r6, r7} \n\
sub sp, #8 \n\
add r5, r0, #0 \n\
ldr r1, lbl_0800b4d8 @ =gSamusPaletteSize \n\
movs r0, #0x40 \n\
strh r0, [r1] \n\
ldr r1, lbl_0800b4dc @ =gSamusWeaponInfo \n\
ldrb r0, [r1, #6] \n\
cmp r0, #0 \n\
beq lbl_0800b48c \n\
sub r0, #1 \n\
strb r0, [r1, #6] \n\
lbl_0800b48c: \n\
ldrb r0, [r5, #9] \n\
cmp r0, #0 \n\
beq lbl_0800b496 \n\
sub r0, #1 \n\
strb r0, [r5, #9] \n\
lbl_0800b496: \n\
ldr r2, lbl_0800b4e0 @ =gEquipment \n\
ldrb r0, [r2, #0x12] \n\
add r1, r0, #0 \n\
mov r2, sp \n\
strb r0, [r2, #4] \n\
cmp r1, #1 \n\
bne lbl_0800b554 \n\
ldr r0, lbl_0800b4e0 @ =gEquipment \n\
ldrb r1, [r0, #0xf] \n\
movs r0, #0x20 \n\
and r0, r1 \n\
cmp r0, #0 \n\
beq lbl_0800b508 \n\
ldr r1, lbl_0800b4e4 @ =0x082383c8 \n\
mov r8, r1 \n\
ldr r2, lbl_0800b4e8 @ =0x08238428 \n\
mov ip, r2 \n\
ldr r6, lbl_0800b4ec @ =0x082384c8 \n\
ldr r0, lbl_0800b4f0 @ =0x08238508 \n\
mov sl, r0 \n\
ldr r1, lbl_0800b4f4 @ =0x08238568 \n\
str r1, [sp] \n\
ldr r2, lbl_0800b4f8 @ =0x08238608 \n\
mov sb, r2 \n\
ldr r0, lbl_0800b4fc @ =0x0823a224 \n\
ldrb r1, [r5, #0x1d] \n\
lsl r1, r1, #2 \n\
add r0, r1, r0 \n\
ldr r3, [r0] \n\
ldr r7, lbl_0800b500 @ =0x082379e8 \n\
ldr r0, lbl_0800b504 @ =0x0823a2dc \n\
b lbl_0800b624 \n\
.align 2, 0 \n\
lbl_0800b4d8: .4byte gSamusPaletteSize \n\
lbl_0800b4dc: .4byte gSamusWeaponInfo \n\
lbl_0800b4e0: .4byte gEquipment \n\
lbl_0800b4e4: .4byte sSamusPal_GravitySuit_Default \n\
lbl_0800b4e8: .4byte sSamusPal_GravitySuit_BeamRelease \n\
lbl_0800b4ec: .4byte sSamusPal_GravitySuit_Flashing \n\
lbl_0800b4f0: .4byte sSamusPal_GravitySuit_Speedboost \n\
lbl_0800b4f4: .4byte sSamusPal_GravitySuit_Unmorph \n\
lbl_0800b4f8: .4byte sSamusPal_GravitySuit_ChargingBeam \n\
lbl_0800b4fc: .4byte sSamusPal_GravitySuit_SavingPointers \n\
lbl_0800b500: .4byte sSamusPal_GravitySuit_Dying \n\
lbl_0800b504: .4byte sSamusPal_GravitySuit_DownloadingMapPointers \n\
lbl_0800b508: \n\
ldr r0, lbl_0800b530 @ =0x08237fa8 \n\
mov r8, r0 \n\
ldr r1, lbl_0800b534 @ =0x08238008 \n\
mov ip, r1 \n\
ldr r6, lbl_0800b538 @ =0x082380a8 \n\
ldr r2, lbl_0800b53c @ =0x082380e8 \n\
mov sl, r2 \n\
ldr r0, lbl_0800b540 @ =0x08238148 \n\
str r0, [sp] \n\
ldr r1, lbl_0800b544 @ =0x082381e8 \n\
mov sb, r1 \n\
ldr r0, lbl_0800b548 @ =0x0823a1f8 \n\
ldrb r1, [r5, #0x1d] \n\
lsl r1, r1, #2 \n\
add r0, r1, r0 \n\
ldr r3, [r0] \n\
ldr r7, lbl_0800b54c @ =0x082379c8 \n\
ldr r0, lbl_0800b550 @ =0x0823a2bc \n\
b lbl_0800b624 \n\
.align 2, 0 \n\
lbl_0800b530: .4byte sSamusPal_FullSuit_Default \n\
lbl_0800b534: .4byte sSamusPal_FullSuit_BeamRelease \n\
lbl_0800b538: .4byte sSamusPal_FullSuit_Flashing \n\
lbl_0800b53c: .4byte sSamusPal_FullSuit_Speedboost \n\
lbl_0800b540: .4byte sSamusPal_FullSuit_Unmorph \n\
lbl_0800b544: .4byte sSamusPal_FullSuit_ChargingBeam \n\
lbl_0800b548: .4byte sSamusPal_FullSuit_SavingPointers \n\
lbl_0800b54c: .4byte sSamusPal_FullSuit_Dying \n\
lbl_0800b550: .4byte sSamusPal_FullSuit_DownloadingMapPointers \n\
lbl_0800b554: \n\
cmp r1, #0 \n\
bne lbl_0800b600 \n\
ldr r2, lbl_0800b58c @ =gEquipment \n\
ldrb r1, [r2, #0xf] \n\
movs r0, #0x10 \n\
and r0, r1 \n\
cmp r0, #0 \n\
beq lbl_0800b5b4 \n\
ldr r0, lbl_0800b590 @ =0x08237be8 \n\
mov r8, r0 \n\
ldr r1, lbl_0800b594 @ =0x08237c48 \n\
mov ip, r1 \n\
ldr r6, lbl_0800b598 @ =0x08237ce8 \n\
ldr r2, lbl_0800b59c @ =0x08237d28 \n\
mov sl, r2 \n\
ldr r0, lbl_0800b5a0 @ =0x08237d88 \n\
str r0, [sp] \n\
ldr r1, lbl_0800b5a4 @ =0x08237e28 \n\
mov sb, r1 \n\
ldr r0, lbl_0800b5a8 @ =0x0823a1cc \n\
ldrb r1, [r5, #0x1d] \n\
lsl r1, r1, #2 \n\
add r0, r1, r0 \n\
ldr r3, [r0] \n\
ldr r7, lbl_0800b5ac @ =0x082379a8 \n\
ldr r0, lbl_0800b5b0 @ =0x0823a29c \n\
b lbl_0800b624 \n\
.align 2, 0 \n\
lbl_0800b58c: .4byte gEquipment \n\
lbl_0800b590: .4byte sSamusPal_VariaSuit_Default \n\
lbl_0800b594: .4byte sSamusPal_VariaSuit_BeamRelease \n\
lbl_0800b598: .4byte sSamusPal_VariaSuit_Flashing \n\
lbl_0800b59c: .4byte sSamusPal_VariaSuit_Speedboost \n\
lbl_0800b5a0: .4byte sSamusPal_VariaSuit_Unmorph \n\
lbl_0800b5a4: .4byte sSamusPal_VariaSuit_ChargingBeam \n\
lbl_0800b5a8: .4byte sSamusPal_VariaSuit_SavingPointers \n\
lbl_0800b5ac: .4byte sSamusPal_VariaSuit_Dying \n\
lbl_0800b5b0: .4byte sSamusPal_VariaSuit_DownloadingMapPointers \n\
lbl_0800b5b4: \n\
ldr r2, lbl_0800b5dc @ =0x082376a8 \n\
mov r8, r2 \n\
ldr r0, lbl_0800b5e0 @ =0x08237708 \n\
mov ip, r0 \n\
ldr r6, lbl_0800b5e4 @ =0x082377a8 \n\
ldr r1, lbl_0800b5e8 @ =0x082377e8 \n\
mov sl, r1 \n\
ldr r2, lbl_0800b5ec @ =0x08237848 \n\
str r2, [sp] \n\
ldr r0, lbl_0800b5f0 @ =0x08237a68 \n\
mov sb, r0 \n\
ldr r0, lbl_0800b5f4 @ =0x0823a1a0 \n\
ldrb r1, [r5, #0x1d] \n\
lsl r1, r1, #2 \n\
add r0, r1, r0 \n\
ldr r3, [r0] \n\
ldr r7, lbl_0800b5f8 @ =0x08237888 \n\
ldr r0, lbl_0800b5fc @ =0x0823a27c \n\
b lbl_0800b624 \n\
.align 2, 0 \n\
lbl_0800b5dc: .4byte sSamusPal_PowerSuit_Default \n\
lbl_0800b5e0: .4byte sSamusPal_PowerSuit_BeamRelease \n\
lbl_0800b5e4: .4byte sSamusPal_PowerSuit_Flashing \n\
lbl_0800b5e8: .4byte sSamusPal_PowerSuit_Speedboost \n\
lbl_0800b5ec: .4byte sSamusPal_PowerSuit_Unmorph \n\
lbl_0800b5f0: .4byte sSamusPal_PowerSuit_ChargingBeam \n\
lbl_0800b5f4: .4byte sSamusPal_PowerSuit_SavingPointers \n\
lbl_0800b5f8: .4byte sSamusPal_PowerSuit_Dying \n\
lbl_0800b5fc: .4byte sSamusPal_PowerSuit_DownloadingMapPointers \n\
lbl_0800b600: \n\
ldr r1, lbl_0800b650 @ =0x082387e8 \n\
mov r8, r1 \n\
ldr r2, lbl_0800b654 @ =0x08238848 \n\
mov ip, r2 \n\
ldr r6, lbl_0800b658 @ =0x082388e8 \n\
ldr r0, lbl_0800b65c @ =0x082377e8 \n\
mov sl, r0 \n\
ldr r1, lbl_0800b660 @ =0x08237848 \n\
str r1, [sp] \n\
ldr r2, lbl_0800b664 @ =0x08238988 \n\
mov sb, r2 \n\
ldr r0, lbl_0800b668 @ =0x0823a250 \n\
ldrb r1, [r5, #0x1d] \n\
lsl r1, r1, #2 \n\
add r0, r1, r0 \n\
ldr r3, [r0] \n\
ldr r7, lbl_0800b66c @ =0x082378a8 \n\
ldr r0, lbl_0800b670 @ =0x0823a2fc \n\
lbl_0800b624: \n\
add r1, r1, r0 \n\
ldr r1, [r1] \n\
ldrb r0, [r5] \n\
add r4, r0, #0 \n\
cmp r4, #0x33 \n\
bne lbl_0800b6a0 \n\
ldr r4, lbl_0800b674 @ =0x08237888 \n\
add r0, r4, #0 \n\
movs r1, #0 \n\
movs r2, #0x10 \n\
bl SamusCopyPalette \n\
ldrb r0, [r5, #7] \n\
cmp r0, #0 \n\
bne lbl_0800b698 \n\
ldrb r0, [r5, #0x1d] \n\
cmp r0, #0xb \n\
beq lbl_0800b64c \n\
cmp r0, #0xf \n\
bne lbl_0800b678 \n\
lbl_0800b64c: \n\
add r4, #0x40 \n\
b lbl_0800b7d6 \n\
.align 2, 0 \n\
lbl_0800b650: .4byte sSamusPal_Suitless_Default \n\
lbl_0800b654: .4byte sSamusPal_Suitless_BeamRelease \n\
lbl_0800b658: .4byte sSamusPal_Suitless_Flashing \n\
lbl_0800b65c: .4byte sSamusPal_PowerSuit_Speedboost \n\
lbl_0800b660: .4byte sSamusPal_PowerSuit_Unmorph \n\
lbl_0800b664: .4byte sSamusPal_Suitless_ChargingBeam \n\
lbl_0800b668: .4byte sSamusPal_Suitless_SavingPointers \n\
lbl_0800b66c: .4byte sSamusPal_Generic_Dying \n\
lbl_0800b670: .4byte sSamusPal_Suitless_DownloadingMapPointers \n\
lbl_0800b674: .4byte sSamusPal_PowerSuit_Dying \n\
lbl_0800b678: \n\
cmp r0, #0xc \n\
beq lbl_0800b680 \n\
cmp r0, #0xe \n\
bne lbl_0800b684 \n\
lbl_0800b680: \n\
add r4, #0x80 \n\
b lbl_0800b7d6 \n\
lbl_0800b684: \n\
cmp r0, #0xd \n\
bne lbl_0800b68c \n\
add r4, #0xc0 \n\
b lbl_0800b7d6 \n\
lbl_0800b68c: \n\
add r4, #0x20 \n\
cmp r0, #0xa \n\
bls lbl_0800b694 \n\
b lbl_0800b7d6 \n\
lbl_0800b694: \n\
add r4, r7, #0 \n\
b lbl_0800b7d6 \n\
lbl_0800b698: \n\
ldrb r0, [r5, #7] \n\
lsl r0, r0, #5 \n\
add r4, r0, r4 \n\
b lbl_0800b7d6 \n\
lbl_0800b6a0: \n\
ldrb r0, [r5, #6] \n\
cmp r0, #0 \n\
beq lbl_0800b6c4 \n\
sub r0, #1 \n\
strb r0, [r5, #6] \n\
ldr r0, lbl_0800b6c0 @ =gFrameCounter8Bit \n\
ldrb r1, [r0] \n\
movs r0, #3 \n\
and r0, r1 \n\
add r4, r6, #0 \n\
add r4, #0x20 \n\
cmp r0, #1 \n\
bls lbl_0800b6bc \n\
b lbl_0800b7c8 \n\
lbl_0800b6bc: \n\
add r4, r6, #0 \n\
b lbl_0800b7c8 \n\
.align 2, 0 \n\
lbl_0800b6c0: .4byte gFrameCounter8Bit \n\
lbl_0800b6c4: \n\
ldr r0, lbl_0800b710 @ =gSamusHazardDamage \n\
ldrb r2, [r0, #4] \n\
cmp r2, #0 \n\
beq lbl_0800b6d4 \n\
movs r0, #0xf \n\
and r0, r2 \n\
cmp r0, #7 \n\
bhi lbl_0800b72c \n\
lbl_0800b6d4: \n\
ldrb r0, [r5, #5] \n\
cmp r0, #0 \n\
bne lbl_0800b6e0 \n\
ldrb r0, [r5, #8] \n\
cmp r0, #0 \n\
beq lbl_0800b718 \n\
lbl_0800b6e0: \n\
ldr r0, lbl_0800b714 @ =gFrameCounter8Bit \n\
ldrb r0, [r0] \n\
movs r1, #6 \n\
bl __umodsi3 \n\
lsl r0, r0, #0x18 \n\
lsr r0, r0, #0x18 \n\
cmp r0, #0 \n\
blt lbl_0800b6fe \n\
mov r4, sl \n\
cmp r0, #1 \n\
ble lbl_0800b702 \n\
add r4, #0x20 \n\
cmp r0, #3 \n\
ble lbl_0800b702 \n\
lbl_0800b6fe: \n\
mov r4, sl \n\
add r4, #0x40 \n\
lbl_0800b702: \n\
add r0, r4, #0 \n\
movs r1, #0 \n\
movs r2, #0x10 \n\
bl SamusCopyPalette \n\
b lbl_0800b7d6 \n\
.align 2, 0 \n\
lbl_0800b710: .4byte gSamusHazardDamage \n\
lbl_0800b714: .4byte gFrameCounter8Bit \n\
lbl_0800b718: \n\
lsl r0, r4, #0x18 \n\
lsr r0, r0, #0x18 \n\
cmp r0, #0xf \n\
bne lbl_0800b732 \n\
ldrb r1, [r5, #0x1d] \n\
movs r0, #1 \n\
and r0, r1 \n\
mov r4, r8 \n\
cmp r0, #0 \n\
beq lbl_0800b7c8 \n\
lbl_0800b72c: \n\
add r4, r6, #0 \n\
add r4, #0x20 \n\
b lbl_0800b7c8 \n\
lbl_0800b732: \n\
cmp r0, #0x2c \n\
bne lbl_0800b748 \n\
add r4, r3, #0 \n\
add r0, r4, #0 \n\
movs r1, #0 \n\
movs r2, #0x10 \n\
bl SamusCopyPalette \n\
mov r4, r8 \n\
add r4, #0x40 \n\
b lbl_0800b7d6 \n\
lbl_0800b748: \n\
cmp r0, #0x2d \n\
bne lbl_0800b766 \n\
ldrb r0, [r5, #0xa] \n\
add r4, r1, #0 \n\
cmp r0, #0 \n\
beq lbl_0800b756 \n\
mov r4, r8 \n\
lbl_0800b756: \n\
add r0, r4, #0 \n\
movs r1, #0 \n\
movs r2, #0x10 \n\
bl SamusCopyPalette \n\
mov r4, r8 \n\
add r4, #0x40 \n\
b lbl_0800b7d6 \n\
lbl_0800b766: \n\
ldr r1, lbl_0800b780 @ =gSamusWeaponInfo \n\
ldrb r0, [r1, #6] \n\
cmp r0, #0 \n\
beq lbl_0800b7b2 \n\
ldr r2, lbl_0800b784 @ =gEquipment \n\
ldrb r1, [r2, #0xd] \n\
movs r0, #2 \n\
and r0, r1 \n\
cmp r0, #0 \n\
beq lbl_0800b788 \n\
mov r4, ip \n\
add r4, #0x40 \n\
b lbl_0800b7c8 \n\
.align 2, 0 \n\
lbl_0800b780: .4byte gSamusWeaponInfo \n\
lbl_0800b784: .4byte gEquipment \n\
lbl_0800b788: \n\
movs r0, #8 \n\
and r0, r1 \n\
cmp r0, #0 \n\
beq lbl_0800b796 \n\
mov r4, ip \n\
add r4, #0x80 \n\
b lbl_0800b7c8 \n\
lbl_0800b796: \n\
movs r0, #4 \n\
and r0, r1 \n\
cmp r0, #0 \n\
beq lbl_0800b7a4 \n\
mov r4, ip \n\
add r4, #0x60 \n\
b lbl_0800b7c8 \n\
lbl_0800b7a4: \n\
movs r0, #1 \n\
and r0, r1 \n\
mov r4, ip \n\
cmp r0, #0 \n\
beq lbl_0800b7c8 \n\
add r4, #0x20 \n\
b lbl_0800b7c8 \n\
lbl_0800b7b2: \n\
ldrb r0, [r5, #9] \n\
cmp r0, #0 \n\
beq lbl_0800b7e2 \n\
sub r0, #5 \n\
lsl r0, r0, #0x18 \n\
lsr r0, r0, #0x18 \n\
ldr r4, [sp] \n\
add r4, #0x20 \n\
cmp r0, #4 \n\
bls lbl_0800b7c8 \n\
ldr r4, [sp] \n\
lbl_0800b7c8: \n\
add r0, r4, #0 \n\
movs r1, #0 \n\
movs r2, #0x10 \n\
bl SamusCopyPalette \n\
mov r4, r8 \n\
add r4, #0x20 \n\
lbl_0800b7d6: \n\
add r0, r4, #0 \n\
movs r1, #0x10 \n\
movs r2, #0x10 \n\
bl SamusCopyPalette \n\
b lbl_0800b858 \n\
lbl_0800b7e2: \n\
mov r4, r8 \n\
mov r1, sp \n\
ldrb r1, [r1, #4] \n\
lsl r0, r1, #0x18 \n\
lsr r0, r0, #0x18 \n\
cmp r0, #2 \n\
beq lbl_0800b84e \n\
ldr r2, lbl_0800b814 @ =gSamusWeaponInfo \n\
ldrb r0, [r2, #5] \n\
cmp r0, #0x40 \n\
blo lbl_0800b84e \n\
sub r0, #0x40 \n\
asr r2, r0, #2 \n\
cmp r2, #3 \n\
beq lbl_0800b84e \n\
ldr r0, lbl_0800b818 @ =gEquipment \n\
ldrb r1, [r0, #0xd] \n\
movs r0, #2 \n\
and r0, r1 \n\
cmp r0, #0 \n\
beq lbl_0800b81c \n\
mov r4, sb \n\
add r4, #0x80 \n\
b lbl_0800b846 \n\
.align 2, 0 \n\
lbl_0800b814: .4byte gSamusWeaponInfo \n\
lbl_0800b818: .4byte gEquipment \n\
lbl_0800b81c: \n\
movs r0, #8 \n\
and r0, r1 \n\
cmp r0, #0 \n\
beq lbl_0800b82c \n\
movs r4, #0x80 \n\
lsl r4, r4, #1 \n\
add r4, sb \n\
b lbl_0800b846 \n\
lbl_0800b82c: \n\
movs r0, #4 \n\
and r0, r1 \n\
cmp r0, #0 \n\
beq lbl_0800b83a \n\
mov r4, sb \n\
add r4, #0xc0 \n\
b lbl_0800b846 \n\
lbl_0800b83a: \n\
movs r0, #1 \n\
and r0, r1 \n\
mov r4, sb \n\
cmp r0, #0 \n\
beq lbl_0800b846 \n\
add r4, #0x40 \n\
lbl_0800b846: \n\
movs r0, #1 \n\
and r2, r0 \n\
lsl r0, r2, #5 \n\
add r4, r4, r0 \n\
lbl_0800b84e: \n\
add r0, r4, #0 \n\
movs r1, #0 \n\
movs r2, #0x20 \n\
bl SamusCopyPalette \n\
lbl_0800b858: \n\
add sp, #8 \n\
pop {r3, r4, r5} \n\
mov r8, r3 \n\
mov sb, r4 \n\
mov sl, r5 \n\
pop {r4, r5, r6, r7} \n\
pop {r0} \n\
bx r0 \n\
");
}
#endif
/**
* @brief b868 | 40 | Checks if the low health sound should be played
*
*/
void SamusCheckPlayLowHealthSound(void)
{
struct SamusData* pData;
@ -8293,6 +7568,12 @@ void SamusCheckPlayLowHealthSound(void)
SoundPlay(SOUND_LOW_HEALTH_BEEP);
}
/**
* @brief b8a8 | 68 | Updates the draw distances and the standing status
*
* @param pData Samus data pointer
* @param pPhysics Samus physics pointer
*/
void SamusUpdateDrawDistanceAndStandingStatus(struct SamusData* pData, struct SamusPhysics* pPhysics)
{
u8 offset;

View File

@ -2123,7 +2123,7 @@ void Sram_CheckLoadSaveFile(void)
#ifdef NON_MATCHING
void Sram_InitSaveFile(void)
{
// https://decomp.me/scratch/uEm2z
// https://decomp.me/scratch/8cG3f
s32 i;
s32 j;

View File

@ -820,7 +820,9 @@ void SpriteCheckOnScreen(struct SpriteData* pSprite)
}
/**
* @brief df24 | 4c |
* @brief df24 | 4c | Calls : ClearSpriteData, LoadSpriteset,
* CheckReloadEscapeDigitsGraphics, LoadLocationText, LoadRoomSprite
* and SpawnSpacePiratesWaiting
*
*/
void SpriteLoadAllData(void)
@ -852,11 +854,12 @@ void SpriteLoadAllData(void)
gParasiteRelated = 0;
}
#ifdef NON_MATCHING
/**
* @brief df84 | 100 | Loads a spriteset
*
*/
void SpriteLoadSpriteset(void)
{
// https://decomp.me/scratch/59czd
s32 i;
s32 j;
s32 spriteset;
@ -886,13 +889,18 @@ void SpriteLoadSpriteset(void)
for (j = 0, i = 0; i < MAX_AMOUNT_OF_SPRITE_TYPES; i++)
{
const u32 * const *spritesetGraphicsPointers;
spriteId = sSpritesetPointers[spriteset][j * 2 + 0];
gfxSlot = sSpritesetPointers[spriteset][j * 2 + 1];
j++;
if (spriteId == PSPRITE_UNUSED0)
{
break;
do { } while (0); // Needed to produce matching ASM.
}
gSpritesetSpritesID[i] = spriteId;
gSpritesetGfxSlots[i] = MOD_AND(gfxSlot, 8);
@ -906,7 +914,8 @@ void SpriteLoadSpriteset(void)
spriteId = PSPRITE_OFFSET_FOR_GRAPHICS(spriteId);
LZ77UncompVRAM(sSpritesGraphicsPointers[spriteId], VRAM_BASE + 0x14000 + gfxSlot * 2048);
spritesetGraphicsPointers = sSpritesGraphicsPointers; // Needed to produce matching ASM.
LZ77UncompVRAM(spritesetGraphicsPointers[spriteId], VRAM_BASE + 0x14000 + gfxSlot * 2048);
ctrl_1 = ((u8*)sSpritesGraphicsPointers[spriteId])[1];
ctrl_2 = ((u8*)sSpritesGraphicsPointers[spriteId])[2] << 8;
@ -914,137 +923,6 @@ void SpriteLoadSpriteset(void)
C_32_2_16(DMA_ENABLE, (ctrl_1 | ctrl_2) / 2048 << 4));
}
}
#else
NAKED_FUNCTION
void SpriteLoadSpriteset(void)
{
asm("\n\
push {r4, r5, r6, r7, lr} \n\
mov r7, sl \n\
mov r6, sb \n\
mov r5, r8 \n\
push {r5, r6, r7} \n\
movs r7, #0 \n\
ldr r5, lbl_0800e05c @ =gSpriteset \n\
ldr r6, lbl_0800e060 @ =0x0875f31c \n\
ldr r4, lbl_0800e064 @ =gSpritesetSpritesID \n\
movs r3, #0 \n\
movs r2, #0x10 \n\
ldr r1, lbl_0800e068 @ =gSpritesetGfxSlots \n\
lbl_0800df9c: \n\
add r0, r7, r4 \n\
strb r2, [r0] \n\
add r0, r7, r1 \n\
strb r3, [r0] \n\
add r7, #1 \n\
cmp r7, #0xe \n\
ble lbl_0800df9c \n\
movs r0, #0xff \n\
mov sb, r0 \n\
ldrb r1, [r5] \n\
cmp r1, #0x70 \n\
ble lbl_0800dfc0 \n\
ldr r0, lbl_0800e06c @ =gCurrentArea \n\
ldrb r0, [r0] \n\
movs r1, #0 \n\
cmp r0, #7 \n\
bls lbl_0800dfc0 \n\
movs r1, #0x71 \n\
lbl_0800dfc0: \n\
movs r7, #0 \n\
lsl r0, r1, #2 \n\
add r1, r0, r6 \n\
ldr r1, [r1] \n\
ldrb r5, [r1] \n\
ldrb r6, [r1, #1] \n\
movs r1, #1 \n\
mov r8, r1 \n\
mov sl, r0 \n\
cmp r5, #0 \n\
beq lbl_0800e04e \n\
lbl_0800dfd6: \n\
ldr r0, lbl_0800e064 @ =gSpritesetSpritesID \n\
add r0, r7, r0 \n\
strb r5, [r0] \n\
ldr r1, lbl_0800e068 @ =gSpritesetGfxSlots \n\
add r1, r7, r1 \n\
movs r2, #7 \n\
add r0, r6, #0 \n\
and r0, r2 \n\
strb r0, [r1] \n\
cmp r6, sb \n\
beq lbl_0800e030 \n\
mov sb, r6 \n\
cmp r6, #8 \n\
beq lbl_0800e030 \n\
sub r5, #0x10 \n\
ldr r4, lbl_0800e070 @ =0x0875ebf8 \n\
lsl r5, r5, #2 \n\
add r4, r5, r4 \n\
ldr r0, [r4] \n\
lsl r1, r6, #0xb \n\
ldr r2, lbl_0800e074 @ =0x06014000 \n\
add r1, r1, r2 \n\
bl LZ77UncompVRAM \n\
ldr r0, [r4] \n\
ldrb r2, [r0, #1] \n\
ldrb r1, [r0, #2] \n\
lsl r1, r1, #8 \n\
ldr r3, lbl_0800e078 @ =0x040000d4 \n\
ldr r0, lbl_0800e07c @ =0x0875eef0 \n\
add r5, r5, r0 \n\
ldr r0, [r5] \n\
str r0, [r3] \n\
lsl r0, r6, #5 \n\
ldr r4, lbl_0800e080 @ =0x05000300 \n\
add r0, r0, r4 \n\
str r0, [r3, #4] \n\
orr r2, r1 \n\
asr r0, r2, #0xb \n\
lsl r0, r0, #4 \n\
movs r1, #0x80 \n\
lsl r1, r1, #0x18 \n\
orr r0, r1 \n\
str r0, [r3, #8] \n\
ldr r0, [r3, #8] \n\
lbl_0800e030: \n\
add r7, #1 \n\
cmp r7, #0xe \n\
bgt lbl_0800e04e \n\
ldr r0, lbl_0800e060 @ =0x0875f31c \n\
add r0, sl \n\
ldr r1, [r0] \n\
mov r2, r8 \n\
lsl r0, r2, #1 \n\
add r0, r0, r1 \n\
ldrb r5, [r0] \n\
ldrb r6, [r0, #1] \n\
movs r4, #1 \n\
add r8, r4 \n\
cmp r5, #0 \n\
bne lbl_0800dfd6 \n\
lbl_0800e04e: \n\
pop {r3, r4, r5} \n\
mov r8, r3 \n\
mov sb, r4 \n\
mov sl, r5 \n\
pop {r4, r5, r6, r7} \n\
pop {r0} \n\
bx r0 \n\
.align 2, 0 \n\
lbl_0800e05c: .4byte gSpriteset \n\
lbl_0800e060: .4byte sSpritesetPointers \n\
lbl_0800e064: .4byte gSpritesetSpritesID \n\
lbl_0800e068: .4byte gSpritesetGfxSlots \n\
lbl_0800e06c: .4byte gCurrentArea \n\
lbl_0800e070: .4byte sSpritesGraphicsPointers \n\
lbl_0800e074: .4byte 0x06014000 \n\
lbl_0800e078: .4byte 0x040000d4 \n\
lbl_0800e07c: .4byte sSpritesPalettePointers \n\
lbl_0800e080: .4byte 0x05000300 \n\
");
}
#endif
/**
* e084 | 2c | Loads the graphics in VRAM for a new sprite
@ -1358,4 +1236,4 @@ u8 SpriteSpawnDropFollowers(u8 spriteId, u8 roomSlot, u8 gfxSlot, u8 ramSlot, u1
}
return UCHAR_MAX;
}
}

View File

@ -2601,15 +2601,20 @@ u8 SpriteUtilCountDrops(void)
return count;
}
#ifdef NON_MATCHING
/**
* @brief 10944 | 254 | Handles a Mecha Ridley missile moving
*
* @param samusY Samus Y position
* @param samusX Samus X position
* @param ySpeed Missile Y speed
* @param xSpeed Missile X speed
* @param speedDivisor Speed Divisor
*/
void SpriteUtilMoveSpriteTowardsSamus(u16 samusY, u16 samusX, u8 ySpeed, u8 xSpeed, u8 speedDivisor)
{
// https://decomp.me/scratch/6NT7r
u32 flip;
u16 speed;
u32 newPos;
u32 tmp;
flip = FALSE;
if (gCurrentSprite.status & SPRITE_STATUS_FACING_RIGHT)
@ -2662,13 +2667,17 @@ void SpriteUtilMoveSpriteTowardsSamus(u16 samusY, u16 samusX, u8 ySpeed, u8 xSpe
else
{
gCurrentSprite.xPosition = newPos;
gCurrentSprite.yPosition += 0; // Needed to produce matching ASM.
}
}
}
else
{
u32 cond;
gCurrentSprite.workVariable--;
if (gCurrentSprite.workVariable != 0)
cond = gCurrentSprite.workVariable != 0; // Needed to produce matching ASM.
if (cond)
{
speed = gCurrentSprite.workVariable >> speedDivisor;
newPos = gCurrentSprite.xPosition - speed;
@ -2707,7 +2716,7 @@ void SpriteUtilMoveSpriteTowardsSamus(u16 samusY, u16 samusX, u8 ySpeed, u8 xSpe
if (gCurrentSprite.arrayOffset < ySpeed)
gCurrentSprite.arrayOffset++;
gCurrentSprite.yPosition += gCurrentSprite.arrayOffset >> speedDivisor;
gCurrentSprite.yPosition += (gCurrentSprite.arrayOffset >> speedDivisor);
}
}
else
@ -2715,7 +2724,7 @@ void SpriteUtilMoveSpriteTowardsSamus(u16 samusY, u16 samusX, u8 ySpeed, u8 xSpe
gCurrentSprite.timer--;
if (gCurrentSprite.timer != 0)
{
gCurrentSprite.yPosition += gCurrentSprite.timer >> speedDivisor;
gCurrentSprite.yPosition += (gCurrentSprite.timer >> speedDivisor);
}
else
flip++;
@ -2775,337 +2784,6 @@ void SpriteUtilMoveSpriteTowardsSamus(u16 samusY, u16 samusX, u8 ySpeed, u8 xSpe
gCurrentSprite.arrayOffset = 1;
}
}
#else
NAKED_FUNCTION
void SpriteUtilMoveSpriteTowardsSamus(u16 samusY, u16 samusX, u8 ySpeed, u8 xSpeed, u8 speedDivisor)
{
asm("\n\
push {r4, r5, r6, r7, lr} \n\
mov r7, sl \n\
mov r6, sb \n\
mov r5, r8 \n\
push {r5, r6, r7} \n\
sub sp, #4 \n\
ldr r4, [sp, #0x24] \n\
lsl r0, r0, #0x10 \n\
lsr r0, r0, #0x10 \n\
mov sl, r0 \n\
lsl r1, r1, #0x10 \n\
lsr r5, r1, #0x10 \n\
add r7, r5, #0 \n\
lsl r2, r2, #0x18 \n\
lsr r2, r2, #0x18 \n\
str r2, [sp] \n\
lsl r3, r3, #0x18 \n\
lsr r3, r3, #0x18 \n\
mov r8, r3 \n\
lsl r4, r4, #0x18 \n\
lsr r4, r4, #0x18 \n\
movs r0, #0 \n\
mov sb, r0 \n\
ldr r1, lbl_080109b8 @ =gCurrentSprite \n\
mov ip, r1 \n\
ldrh r1, [r1] \n\
movs r0, #0x80 \n\
lsl r0, r0, #2 \n\
and r0, r1 \n\
lsl r0, r0, #0x10 \n\
lsr r6, r0, #0x10 \n\
cmp r6, #0 \n\
beq lbl_080109d6 \n\
mov r2, ip \n\
add r2, #0x2d \n\
ldrb r0, [r2] \n\
cmp r0, #0 \n\
bne lbl_080109bc \n\
mov r6, ip \n\
ldrh r1, [r6, #4] \n\
sub r0, r5, #4 \n\
cmp r1, r0 \n\
bgt lbl_080109ec \n\
mov r1, ip \n\
add r1, #0x2e \n\
ldrb r0, [r1] \n\
cmp r0, r3 \n\
bhs lbl_080109a8 \n\
add r0, #1 \n\
strb r0, [r1] \n\
lbl_080109a8: \n\
ldrb r0, [r1] \n\
asr r0, r4 \n\
mov r1, ip \n\
ldrh r1, [r1, #4] \n\
add r0, r0, r1 \n\
mov r2, ip \n\
strh r0, [r2, #4] \n\
b lbl_08010a54 \n\
.align 2, 0 \n\
lbl_080109b8: .4byte gCurrentSprite \n\
lbl_080109bc: \n\
sub r0, #1 \n\
strb r0, [r2] \n\
lsl r0, r0, #0x18 \n\
cmp r0, #0 \n\
beq lbl_08010a5a \n\
ldrb r0, [r2] \n\
asr r0, r4 \n\
mov r3, ip \n\
ldrh r3, [r3, #4] \n\
add r0, r0, r3 \n\
mov r6, ip \n\
strh r0, [r6, #4] \n\
b lbl_08010a54 \n\
lbl_080109d6: \n\
mov r2, ip \n\
add r2, #0x2d \n\
ldrb r0, [r2] \n\
add r5, r0, #0 \n\
cmp r5, #0 \n\
bne lbl_08010a20 \n\
mov r0, ip \n\
ldrh r3, [r0, #4] \n\
add r0, r7, #4 \n\
cmp r3, r0 \n\
bge lbl_080109f6 \n\
lbl_080109ec: \n\
mov r0, ip \n\
add r0, #0x2e \n\
ldrb r0, [r0] \n\
strb r0, [r2] \n\
b lbl_08010a54 \n\
lbl_080109f6: \n\
mov r1, ip \n\
add r1, #0x2e \n\
ldrb r0, [r1] \n\
cmp r0, r8 \n\
bhs lbl_08010a04 \n\
add r0, #1 \n\
strb r0, [r1] \n\
lbl_08010a04: \n\
ldrb r0, [r1] \n\
asr r0, r4 \n\
lsl r0, r0, #0x10 \n\
lsr r1, r0, #0x10 \n\
sub r1, r3, r1 \n\
movs r0, #0x80 \n\
lsl r0, r0, #8 \n\
and r0, r1 \n\
cmp r0, #0 \n\
beq lbl_08010a4a \n\
movs r1, #1 \n\
mov sb, r1 \n\
strb r5, [r2] \n\
b lbl_08010a54 \n\
lbl_08010a20: \n\
sub r0, #1 \n\
strb r0, [r2] \n\
lsl r0, r0, #0x18 \n\
cmp r0, #0 \n\
beq lbl_08010a50 \n\
ldrb r0, [r2] \n\
asr r0, r4 \n\
lsl r0, r0, #0x10 \n\
lsr r1, r0, #0x10 \n\
mov r3, ip \n\
ldrh r0, [r3, #4] \n\
sub r1, r0, r1 \n\
movs r0, #0x80 \n\
lsl r0, r0, #8 \n\
and r0, r1 \n\
cmp r0, #0 \n\
beq lbl_08010a4a \n\
movs r0, #1 \n\
mov sb, r0 \n\
strb r6, [r2] \n\
b lbl_08010a54 \n\
lbl_08010a4a: \n\
mov r2, ip \n\
strh r1, [r2, #4] \n\
b lbl_08010a54 \n\
lbl_08010a50: \n\
movs r3, #1 \n\
mov sb, r3 \n\
lbl_08010a54: \n\
mov r6, sb \n\
cmp r6, #0 \n\
beq lbl_08010a72 \n\
lbl_08010a5a: \n\
mov r1, ip \n\
ldrh r0, [r1] \n\
movs r2, #0x80 \n\
lsl r2, r2, #2 \n\
add r1, r2, #0 \n\
eor r0, r1 \n\
mov r3, ip \n\
strh r0, [r3] \n\
mov r1, ip \n\
add r1, #0x2e \n\
movs r0, #1 \n\
strb r0, [r1] \n\
lbl_08010a72: \n\
movs r6, #0 \n\
mov sb, r6 \n\
mov r0, ip \n\
ldrh r1, [r0] \n\
movs r0, #0x80 \n\
lsl r0, r0, #3 \n\
and r0, r1 \n\
lsl r0, r0, #0x10 \n\
lsr r3, r0, #0x10 \n\
cmp r3, #0 \n\
beq lbl_08010ae2 \n\
mov r3, ip \n\
add r3, #0x2c \n\
ldrb r0, [r3] \n\
cmp r0, #0 \n\
bne lbl_08010ac8 \n\
mov r2, ip \n\
ldrh r1, [r2, #2] \n\
mov r0, sl \n\
sub r0, #4 \n\
cmp r1, r0 \n\
ble lbl_08010aa8 \n\
mov r0, ip \n\
add r0, #0x2f \n\
ldrb r0, [r0] \n\
strb r0, [r3] \n\
b lbl_08010b6a \n\
lbl_08010aa8: \n\
mov r1, ip \n\
add r1, #0x2f \n\
ldrb r0, [r1] \n\
ldr r3, [sp] \n\
cmp r0, r3 \n\
bhs lbl_08010ab8 \n\
add r0, #1 \n\
strb r0, [r1] \n\
lbl_08010ab8: \n\
ldrb r0, [r1] \n\
asr r0, r4 \n\
mov r4, ip \n\
ldrh r4, [r4, #2] \n\
add r0, r0, r4 \n\
mov r6, ip \n\
strh r0, [r6, #2] \n\
b lbl_08010b6a \n\
lbl_08010ac8: \n\
sub r0, #1 \n\
strb r0, [r3] \n\
lsl r0, r0, #0x18 \n\
cmp r0, #0 \n\
beq lbl_08010b70 \n\
ldrb r0, [r3] \n\
asr r0, r4 \n\
mov r1, ip \n\
ldrh r1, [r1, #2] \n\
add r0, r0, r1 \n\
mov r2, ip \n\
strh r0, [r2, #2] \n\
b lbl_08010b6a \n\
lbl_08010ae2: \n\
mov r2, ip \n\
add r2, #0x2c \n\
ldrb r0, [r2] \n\
add r5, r0, #0 \n\
cmp r5, #0 \n\
bne lbl_08010b36 \n\
mov r6, ip \n\
ldrh r3, [r6, #2] \n\
mov r0, sl \n\
add r0, #4 \n\
cmp r3, r0 \n\
bge lbl_08010b04 \n\
mov r0, ip \n\
add r0, #0x2f \n\
ldrb r0, [r0] \n\
strb r0, [r2] \n\
b lbl_08010b6a \n\
lbl_08010b04: \n\
mov r1, ip \n\
add r1, #0x2f \n\
ldrb r0, [r1] \n\
ldr r6, [sp] \n\
cmp r0, r6 \n\
bhs lbl_08010b14 \n\
add r0, #1 \n\
strb r0, [r1] \n\
lbl_08010b14: \n\
ldrb r0, [r1] \n\
asr r0, r4 \n\
lsl r0, r0, #0x10 \n\
lsr r1, r0, #0x10 \n\
sub r1, r3, r1 \n\
movs r0, #0x80 \n\
lsl r0, r0, #8 \n\
and r0, r1 \n\
cmp r0, #0 \n\
beq lbl_08010b30 \n\
movs r0, #1 \n\
mov sb, r0 \n\
strb r5, [r2] \n\
b lbl_08010b6a \n\
lbl_08010b30: \n\
mov r2, ip \n\
strh r1, [r2, #2] \n\
b lbl_08010b6a \n\
lbl_08010b36: \n\
sub r0, #1 \n\
strb r0, [r2] \n\
lsl r0, r0, #0x18 \n\
cmp r0, #0 \n\
beq lbl_08010b66 \n\
ldrb r0, [r2] \n\
asr r0, r4 \n\
lsl r0, r0, #0x10 \n\
lsr r1, r0, #0x10 \n\
mov r4, ip \n\
ldrh r0, [r4, #2] \n\
sub r1, r0, r1 \n\
movs r0, #0x80 \n\
lsl r0, r0, #8 \n\
and r0, r1 \n\
cmp r0, #0 \n\
beq lbl_08010b60 \n\
movs r6, #1 \n\
mov sb, r6 \n\
strb r3, [r2] \n\
b lbl_08010b6a \n\
lbl_08010b60: \n\
mov r0, ip \n\
strh r1, [r0, #2] \n\
b lbl_08010b6a \n\
lbl_08010b66: \n\
movs r1, #1 \n\
mov sb, r1 \n\
lbl_08010b6a: \n\
mov r2, sb \n\
cmp r2, #0 \n\
beq lbl_08010b86 \n\
lbl_08010b70: \n\
mov r3, ip \n\
ldrh r0, [r3] \n\
movs r4, #0x80 \n\
lsl r4, r4, #3 \n\
add r1, r4, #0 \n\
eor r0, r1 \n\
strh r0, [r3] \n\
mov r1, ip \n\
add r1, #0x2f \n\
movs r0, #1 \n\
strb r0, [r1] \n\
lbl_08010b86: \n\
add sp, #4 \n\
pop {r3, r4, r5} \n\
mov r8, r3 \n\
mov sb, r4 \n\
mov sl, r5 \n\
pop {r4, r5, r6, r7} \n\
pop {r0} \n\
bx r0 \n\
");
}
#endif
/**
* @brief 10b98 | 158 | Handles a ridley fireball moving (TODO rename to a more general name)
*

View File

@ -520,21 +520,16 @@ void AcidWormIdleInit(void)
}
/**
* @brief 3e030 | c0 |
* @brief 3e030 | c0 | Handles the idle animation and Samus detection
*
*/
#ifdef NON_MATCHING
void AcidWormIdle(void)
{
// https://decomp.me/scratch/5cYt2
u32 samusY;
u32 spritePos;
do {
if (gEffectYPosition > gSubSpriteData1.health)
gEffectYPositionOffset--;
}while(0);
samusY = gSamusData.yPosition;
spritePos = gCurrentSprite.yPosition;
@ -545,18 +540,22 @@ void AcidWormIdle(void)
return;
}
gCurrentSprite.timer--;
if (gCurrentSprite.timer != 0)
return;
if (spritePos - samusY - (BLOCK_SIZE + QUARTER_BLOCK_SIZE + 1) >= 239)
gSubSpriteData1.workVariable3 = TRUE;
else if (gSamusData.xPosition <= gCurrentSprite.xPositionSpawn - BLOCK_SIZE * 7)
gSubSpriteData1.workVariable3 = TRUE;
else if (gSamusData.xPosition < gCurrentSprite.xPositionSpawn + BLOCK_SIZE * 7)
gSubSpriteData1.workVariable3 = FALSE;
else
gSubSpriteData1.workVariable3 = TRUE;
do {
gCurrentSprite.timer--;
if (gCurrentSprite.timer != 0)
return;
if (spritePos - samusY - (BLOCK_SIZE + QUARTER_BLOCK_SIZE + ONE_SUB_PIXEL) >= BLOCK_SIZE * 4 - QUARTER_BLOCK_SIZE - ONE_SUB_PIXEL)
gSubSpriteData1.workVariable3 = TRUE;
else if (gSamusData.xPosition <= gCurrentSprite.xPositionSpawn - BLOCK_SIZE * 7)
gSubSpriteData1.workVariable3 = TRUE;
else if (gSamusData.xPosition < gCurrentSprite.xPositionSpawn + BLOCK_SIZE * 7)
gSubSpriteData1.workVariable3 = FALSE;
else
gSubSpriteData1.workVariable3 = TRUE;
gSubSpriteData1.health += 0; // This is needed for the code to match :shrug:
} while(0);
gCurrentSprite.pOam = sAcidWormOam_Warning;
gCurrentSprite.animationDurationCounter = 0;
@ -567,107 +566,6 @@ void AcidWormIdle(void)
gCurrentSprite.status &= ~SPRITE_STATUS_UNKNOWN_400;
SoundPlay(0x1B5);
}
#else
NAKED_FUNCTION
void AcidWormIdle(void)
{
asm(" \n\
push {r4, r5, r6, r7, lr} \n\
ldr r3, lbl_0803e068 @ =gEffectYPosition \n\
ldr r0, lbl_0803e06c @ =gSubSpriteData1 \n\
ldrh r1, [r3] \n\
add r6, r0, #0 \n\
ldrh r0, [r6, #0xa] \n\
cmp r1, r0 \n\
bls lbl_0803e048 \n\
ldr r1, lbl_0803e070 @ =gEffectYPositionOffset \n\
ldrh r0, [r1] \n\
sub r0, #1 \n\
strh r0, [r1] \n\
lbl_0803e048: \n\
ldr r7, lbl_0803e074 @ =gSamusData \n\
ldrh r2, [r7, #0x14] \n\
ldr r0, lbl_0803e078 @ =gCurrentSprite \n\
ldrh r5, [r0, #2] \n\
add r4, r0, #0 \n\
ldrh r3, [r3] \n\
cmp r2, r3 \n\
bhi lbl_0803e05c \n\
cmp r2, r5 \n\
bls lbl_0803e07c \n\
lbl_0803e05c: \n\
add r1, r4, #0 \n\
add r1, #0x2c \n\
movs r0, #0x3c \n\
strb r0, [r1] \n\
b lbl_0803e0dc \n\
.align 2, 0 \n\
lbl_0803e068: .4byte gEffectYPosition \n\
lbl_0803e06c: .4byte gSubSpriteData1 \n\
lbl_0803e070: .4byte gEffectYPositionOffset \n\
lbl_0803e074: .4byte gSamusData \n\
lbl_0803e078: .4byte gCurrentSprite \n\
lbl_0803e07c: \n\
add r1, r4, #0 \n\
add r1, #0x2c \n\
ldrb r0, [r1] \n\
sub r0, #1 \n\
strb r0, [r1] \n\
lsl r0, r0, #0x18 \n\
lsr r3, r0, #0x18 \n\
cmp r3, #0 \n\
bne lbl_0803e0dc \n\
sub r0, r5, r2 \n\
sub r0, #0x51 \n\
cmp r0, #0xee \n\
bhi lbl_0803e0b4 \n\
ldrh r2, [r7, #0x12] \n\
ldrh r1, [r4, #8] \n\
ldr r5, lbl_0803e0b0 @ =0xfffffe40 \n\
add r0, r1, r5 \n\
cmp r2, r0 \n\
ble lbl_0803e0b4 \n\
movs r5, #0xe0 \n\
lsl r5, r5, #1 \n\
add r0, r1, r5 \n\
cmp r2, r0 \n\
bge lbl_0803e0b4 \n\
strb r3, [r6, #0xf] \n\
b lbl_0803e0b8 \n\
.align 2, 0 \n\
lbl_0803e0b0: .4byte 0xfffffe40 \n\
lbl_0803e0b4: \n\
movs r0, #1 \n\
strb r0, [r6, #0xf] \n\
lbl_0803e0b8: \n\
ldr r0, lbl_0803e0e4 @ =0x082fc318 \n\
str r0, [r4, #0x18] \n\
movs r0, #0 \n\
strb r0, [r4, #0x1c] \n\
strh r0, [r4, #0x16] \n\
add r1, r4, #0 \n\
add r1, #0x24 \n\
movs r0, #0x23 \n\
strb r0, [r1] \n\
bl SpriteUtilMakeSpriteFaceSamusDirection \n\
ldrh r1, [r4] \n\
ldr r0, lbl_0803e0e8 @ =0x0000fbff \n\
and r0, r1 \n\
strh r0, [r4] \n\
ldr r0, lbl_0803e0ec @ =0x000001b5 \n\
bl SoundPlay \n\
lbl_0803e0dc: \n\
pop {r4, r5, r6, r7} \n\
pop {r0} \n\
bx r0 \n\
.align 2, 0 \n\
lbl_0803e0e4: .4byte sAcidWormOam_Warning \n\
lbl_0803e0e8: .4byte 0x0000fbff \n\
lbl_0803e0ec: .4byte 0x000001b5 \n\
");
}
#endif
/**
* @brief 3e0f0 | 5c | Checks if the warning animation before extending has ended

View File

@ -17,11 +17,12 @@
#include "structs/samus.h"
#include "structs/sprite.h"
#ifdef NON_MATCHING
/**
* @brief 3b944 | 254 | Handles the atomic smooth movement
*
*/
void AtomicSmoothMovement(void)
{
// https://decomp.me/scratch/g2eKp
u16 dstY;
u16 dstX;
u16 speedDivisor;
@ -44,7 +45,7 @@ void AtomicSmoothMovement(void)
if (gCurrentSprite.status & SPRITE_STATUS_FACING_RIGHT)
{
if (SpriteUtilGetCollisionAtPosition(spriteY, spriteX + HALF_BLOCK_SIZE) != COLLISION_AIR)
hittingSolidX++;
do { hittingSolidX++; } while (0);
else if (SpriteUtilGetCollisionAtPosition(spriteY + HALF_BLOCK_SIZE, spriteX + HALF_BLOCK_SIZE) != COLLISION_AIR)
hittingSolidX++;
else if (SpriteUtilGetCollisionAtPosition(spriteY - HALF_BLOCK_SIZE, spriteX + HALF_BLOCK_SIZE) != COLLISION_AIR)
@ -212,336 +213,6 @@ void AtomicSmoothMovement(void)
gCurrentSprite.arrayOffset = 0x1;
}
}
#else
NAKED_FUNCTION
void AtomicSmoothMovement(void)
{
asm(" \n\
push {r4, r5, r6, r7, lr} \n\
mov r7, sl \n\
mov r6, sb \n\
mov r5, r8 \n\
push {r5, r6, r7} \n\
sub sp, #4 \n\
movs r0, #2 \n\
mov sb, r0 \n\
ldr r0, lbl_0803b980 @ =gArmCannonY \n\
ldrh r0, [r0] \n\
str r0, [sp] \n\
ldr r0, lbl_0803b984 @ =gArmCannonX \n\
ldrh r0, [r0] \n\
mov sl, r0 \n\
movs r7, #0 \n\
movs r1, #0 \n\
mov r8, r1 \n\
ldr r0, lbl_0803b988 @ =gCurrentSprite \n\
ldrh r5, [r0, #2] \n\
ldrh r6, [r0, #4] \n\
ldrh r1, [r0] \n\
movs r0, #0x80 \n\
lsl r0, r0, #2 \n\
and r0, r1 \n\
cmp r0, #0 \n\
beq lbl_0803b98c \n\
add r4, r6, #0 \n\
add r4, #0x20 \n\
b lbl_0803b990 \n\
.align 2, 0 \n\
lbl_0803b980: .4byte gArmCannonY \n\
lbl_0803b984: .4byte gArmCannonX \n\
lbl_0803b988: .4byte gCurrentSprite \n\
lbl_0803b98c: \n\
add r4, r6, #0 \n\
sub r4, #0x20 \n\
lbl_0803b990: \n\
add r0, r5, #0 \n\
add r1, r4, #0 \n\
bl SpriteUtilGetCollisionAtPosition \n\
cmp r0, #0 \n\
bne lbl_0803b9b8 \n\
add r0, r5, #0 \n\
add r0, #0x20 \n\
add r1, r4, #0 \n\
bl SpriteUtilGetCollisionAtPosition \n\
cmp r0, #0 \n\
bne lbl_0803b9b8 \n\
add r0, r5, #0 \n\
sub r0, #0x20 \n\
add r1, r4, #0 \n\
bl SpriteUtilGetCollisionAtPosition \n\
cmp r0, #0 \n\
beq lbl_0803b9ba \n\
lbl_0803b9b8: \n\
movs r7, #1 \n\
lbl_0803b9ba: \n\
ldr r0, lbl_0803b9d0 @ =gCurrentSprite \n\
ldrh r1, [r0] \n\
movs r0, #0x80 \n\
lsl r0, r0, #3 \n\
and r0, r1 \n\
cmp r0, #0 \n\
beq lbl_0803b9d4 \n\
add r4, r5, #0 \n\
add r4, #0x20 \n\
b lbl_0803b9d8 \n\
.align 2, 0 \n\
lbl_0803b9d0: .4byte gCurrentSprite \n\
lbl_0803b9d4: \n\
add r4, r5, #0 \n\
sub r4, #0x20 \n\
lbl_0803b9d8: \n\
add r0, r4, #0 \n\
add r1, r6, #0 \n\
bl SpriteUtilGetCollisionAtPosition \n\
cmp r0, #0 \n\
bne lbl_0803ba00 \n\
add r1, r6, #0 \n\
add r1, #0x20 \n\
add r0, r4, #0 \n\
bl SpriteUtilGetCollisionAtPosition \n\
cmp r0, #0 \n\
bne lbl_0803ba00 \n\
add r1, r6, #0 \n\
sub r1, #0x20 \n\
add r0, r4, #0 \n\
bl SpriteUtilGetCollisionAtPosition \n\
cmp r0, #0 \n\
beq lbl_0803ba0a \n\
lbl_0803ba00: \n\
mov r0, r8 \n\
add r0, #1 \n\
lsl r0, r0, #0x18 \n\
lsr r0, r0, #0x18 \n\
mov r8, r0 \n\
lbl_0803ba0a: \n\
movs r4, #0 \n\
ldr r2, lbl_0803ba44 @ =gCurrentSprite \n\
ldrh r1, [r2] \n\
movs r0, #0x80 \n\
lsl r0, r0, #2 \n\
and r0, r1 \n\
cmp r0, #0 \n\
beq lbl_0803ba60 \n\
cmp r7, #0 \n\
bne lbl_0803bab6 \n\
add r3, r2, #0 \n\
add r3, #0x2d \n\
ldrb r0, [r3] \n\
cmp r0, #0 \n\
bne lbl_0803ba48 \n\
ldrh r1, [r2, #4] \n\
mov r0, sl \n\
sub r0, #4 \n\
cmp r1, r0 \n\
bgt lbl_0803ba78 \n\
add r1, r2, #0 \n\
add r1, #0x2e \n\
ldrb r0, [r1] \n\
cmp r0, #0x14 \n\
bhs lbl_0803ba40 \n\
add r0, #1 \n\
strb r0, [r1] \n\
lbl_0803ba40: \n\
ldrb r0, [r1] \n\
b lbl_0803ba54 \n\
.align 2, 0 \n\
lbl_0803ba44: .4byte gCurrentSprite \n\
lbl_0803ba48: \n\
sub r0, #1 \n\
strb r0, [r3] \n\
lsl r0, r0, #0x18 \n\
cmp r0, #0 \n\
beq lbl_0803bab6 \n\
ldrb r0, [r3] \n\
lbl_0803ba54: \n\
mov r3, sb \n\
asr r0, r3 \n\
ldrh r1, [r2, #4] \n\
add r0, r0, r1 \n\
strh r0, [r2, #4] \n\
b lbl_0803bab2 \n\
lbl_0803ba60: \n\
cmp r7, #0 \n\
bne lbl_0803bab0 \n\
add r3, r2, #0 \n\
add r3, #0x2d \n\
ldrb r0, [r3] \n\
cmp r0, #0 \n\
bne lbl_0803ba98 \n\
ldrh r1, [r2, #4] \n\
mov r0, sl \n\
add r0, #4 \n\
cmp r1, r0 \n\
bge lbl_0803ba82 \n\
lbl_0803ba78: \n\
add r0, r2, #0 \n\
add r0, #0x2e \n\
ldrb r0, [r0] \n\
strb r0, [r3] \n\
b lbl_0803bab2 \n\
lbl_0803ba82: \n\
add r1, r2, #0 \n\
add r1, #0x2e \n\
ldrb r0, [r1] \n\
cmp r0, #0x14 \n\
bhs lbl_0803ba90 \n\
add r0, #1 \n\
strb r0, [r1] \n\
lbl_0803ba90: \n\
ldrb r1, [r1] \n\
mov r3, sb \n\
asr r1, r3 \n\
b lbl_0803baa8 \n\
lbl_0803ba98: \n\
sub r0, #1 \n\
strb r0, [r3] \n\
lsl r0, r0, #0x18 \n\
cmp r0, #0 \n\
beq lbl_0803bab6 \n\
ldrb r1, [r3] \n\
mov r0, sb \n\
asr r1, r0 \n\
lbl_0803baa8: \n\
ldrh r0, [r2, #4] \n\
sub r0, r0, r1 \n\
strh r0, [r2, #4] \n\
b lbl_0803bab2 \n\
lbl_0803bab0: \n\
movs r4, #1 \n\
lbl_0803bab2: \n\
cmp r4, #0 \n\
beq lbl_0803baca \n\
lbl_0803bab6: \n\
ldrh r0, [r2] \n\
movs r3, #0x80 \n\
lsl r3, r3, #2 \n\
add r1, r3, #0 \n\
eor r0, r1 \n\
strh r0, [r2] \n\
add r1, r2, #0 \n\
add r1, #0x2e \n\
movs r0, #1 \n\
strb r0, [r1] \n\
lbl_0803baca: \n\
movs r4, #0 \n\
ldrh r1, [r2] \n\
movs r0, #0x80 \n\
lsl r0, r0, #3 \n\
and r0, r1 \n\
cmp r0, #0 \n\
beq lbl_0803bb1c \n\
mov r0, r8 \n\
cmp r0, #0 \n\
bne lbl_0803bb74 \n\
add r3, r2, #0 \n\
add r3, #0x2c \n\
ldrb r0, [r3] \n\
cmp r0, #0 \n\
bne lbl_0803bb04 \n\
ldrh r1, [r2, #2] \n\
ldr r0, [sp] \n\
sub r0, #4 \n\
cmp r1, r0 \n\
bgt lbl_0803bb36 \n\
add r1, r2, #0 \n\
add r1, #0x2f \n\
ldrb r0, [r1] \n\
cmp r0, #0x14 \n\
bhs lbl_0803bb00 \n\
add r0, #1 \n\
strb r0, [r1] \n\
lbl_0803bb00: \n\
ldrb r0, [r1] \n\
b lbl_0803bb10 \n\
lbl_0803bb04: \n\
sub r0, #1 \n\
strb r0, [r3] \n\
lsl r0, r0, #0x18 \n\
cmp r0, #0 \n\
beq lbl_0803bb74 \n\
ldrb r0, [r3] \n\
lbl_0803bb10: \n\
mov r1, sb \n\
asr r0, r1 \n\
ldrh r3, [r2, #2] \n\
add r0, r0, r3 \n\
strh r0, [r2, #2] \n\
b lbl_0803bb70 \n\
lbl_0803bb1c: \n\
mov r0, r8 \n\
cmp r0, #0 \n\
bne lbl_0803bb6e \n\
add r3, r2, #0 \n\
add r3, #0x2c \n\
ldrb r0, [r3] \n\
cmp r0, #0 \n\
bne lbl_0803bb56 \n\
ldrh r1, [r2, #2] \n\
ldr r0, [sp] \n\
add r0, #4 \n\
cmp r1, r0 \n\
bge lbl_0803bb40 \n\
lbl_0803bb36: \n\
add r0, r2, #0 \n\
add r0, #0x2f \n\
ldrb r0, [r0] \n\
strb r0, [r3] \n\
b lbl_0803bb70 \n\
lbl_0803bb40: \n\
add r1, r2, #0 \n\
add r1, #0x2f \n\
ldrb r0, [r1] \n\
cmp r0, #0x14 \n\
bhs lbl_0803bb4e \n\
add r0, #1 \n\
strb r0, [r1] \n\
lbl_0803bb4e: \n\
ldrb r1, [r1] \n\
mov r3, sb \n\
asr r1, r3 \n\
b lbl_0803bb66 \n\
lbl_0803bb56: \n\
sub r0, #1 \n\
strb r0, [r3] \n\
lsl r0, r0, #0x18 \n\
cmp r0, #0 \n\
beq lbl_0803bb74 \n\
ldrb r1, [r3] \n\
mov r0, sb \n\
asr r1, r0 \n\
lbl_0803bb66: \n\
ldrh r0, [r2, #2] \n\
sub r0, r0, r1 \n\
strh r0, [r2, #2] \n\
b lbl_0803bb70 \n\
lbl_0803bb6e: \n\
movs r4, #1 \n\
lbl_0803bb70: \n\
cmp r4, #0 \n\
beq lbl_0803bb88 \n\
lbl_0803bb74: \n\
ldrh r0, [r2] \n\
movs r3, #0x80 \n\
lsl r3, r3, #3 \n\
add r1, r3, #0 \n\
eor r0, r1 \n\
strh r0, [r2] \n\
add r1, r2, #0 \n\
add r1, #0x2f \n\
movs r0, #1 \n\
strb r0, [r1] \n\
lbl_0803bb88: \n\
add sp, #4 \n\
pop {r3, r4, r5} \n\
mov r8, r3 \n\
mov sb, r4 \n\
mov sl, r5 \n\
pop {r4, r5, r6, r7} \n\
pop {r0} \n\
bx r0 \n\
");
}
#endif
/**
* @brief 3bb98 | 9c | Updates the direction of an atomic to flee samus if in range
@ -1234,4 +905,4 @@ void AtomicElectricity(void)
case ATOMIC_ELECTRICITY_POSE_ON_GROUND:
AtomicElectricityCheckOnGroundAnimEnded();
}
}
}

View File

@ -1328,11 +1328,8 @@ void DeoremSegmentInit(void)
* @brief 2235c | 90 | Handles the movement when Deorem is spawning and going down
*
*/
#ifdef NON_MATCHING
void DeoremSegmentSpawnGoingDown(void)
{
// https://decomp.me/scratch/bFhC3
u32 ramSlot = gCurrentSprite.primarySpriteRamSlot;
if (gCurrentSprite.roomSlot == 0)
@ -1341,9 +1338,11 @@ void DeoremSegmentSpawnGoingDown(void)
}
else
{
u32 a = gSpriteData[ramSlot].yPosition - 0xA8;
u32 b = gCurrentSprite.roomSlot * 100;
gCurrentSprite.yPosition = a - b;
// The following code is written like that to produce matching ASM:
u32 tmp1 = gSpriteData[ramSlot].yPosition + -0xA8;
u32 tmp2 = gCurrentSprite.roomSlot * 100;
gCurrentSprite.yPosition = tmp2;
gCurrentSprite.yPosition = (tmp2 = tmp1) - gCurrentSprite.yPosition;
}
if (gSpriteData[ramSlot].pose == DEOREM_POSE_SPAWN_GOING_UP)
@ -1358,86 +1357,6 @@ void DeoremSegmentSpawnGoingDown(void)
}
}
}
#else
NAKED_FUNCTION
void DeoremSegmentSpawnGoingDown(void)
{
asm("\n\
push {r4, r5, r6, lr} \n\
ldr r1, lbl_08022384 @ =gCurrentSprite \n\
add r0, r1, #0 \n\
add r0, #0x23 \n\
ldrb r5, [r0] \n\
ldrb r0, [r1, #0x1e] \n\
mov ip, r1 \n\
cmp r0, #0 \n\
bne lbl_0802238c \n\
ldr r1, lbl_08022388 @ =gSpriteData \n\
lsl r2, r5, #3 \n\
sub r0, r2, r5 \n\
lsl r0, r0, #3 \n\
add r0, r0, r1 \n\
ldrh r0, [r0, #2] \n\
sub r0, #0xa8 \n\
mov r3, ip \n\
strh r0, [r3, #2] \n\
b lbl_080223b0 \n\
.align 2, 0 \n\
lbl_08022384: .4byte gCurrentSprite \n\
lbl_08022388: .4byte gSpriteData \n\
lbl_0802238c: \n\
ldr r3, lbl_080223e4 @ =gSpriteData \n\
lsl r4, r5, #3 \n\
sub r0, r4, r5 \n\
lsl r0, r0, #3 \n\
add r0, r0, r3 \n\
ldrh r0, [r0, #2] \n\
sub r0, #0xa8 \n\
mov r6, ip \n\
ldrb r2, [r6, #0x1e] \n\
movs r1, #0x64 \n\
add r6, r2, #0 \n\
mul r6, r1, r6 \n\
add r1, r6, #0 \n\
sub r0, r0, r1 \n\
mov r1, ip \n\
strh r0, [r1, #2] \n\
add r1, r3, #0 \n\
add r2, r4, #0 \n\
lbl_080223b0: \n\
sub r0, r2, r5 \n\
lsl r0, r0, #3 \n\
add r0, r0, r1 \n\
add r0, #0x24 \n\
ldrb r0, [r0] \n\
cmp r0, #0x22 \n\
bne lbl_080223de \n\
mov r1, ip \n\
add r1, #0x24 \n\
movs r0, #9 \n\
strb r0, [r1] \n\
add r1, #8 \n\
movs r0, #6 \n\
strb r0, [r1] \n\
mov r3, ip \n\
ldrb r0, [r3, #0x1e] \n\
cmp r0, #0 \n\
bne lbl_080223de \n\
ldr r0, lbl_080223e8 @ =0x082d7894 \n\
str r0, [r3, #0x18] \n\
sub r1, #0xa \n\
movs r0, #4 \n\
strb r0, [r1] \n\
lbl_080223de: \n\
pop {r4, r5, r6} \n\
pop {r0} \n\
bx r0 \n\
.align 2, 0 \n\
lbl_080223e4: .4byte gSpriteData \n\
lbl_080223e8: .4byte sDeoremSegmentOam_Middle \n\
");
}
#endif
/**
* @brief 223ec | 9c80 | Handles the movement when Deorem is spawning, going down
@ -2822,4 +2741,4 @@ void DeoremThorn(void)
default:
SpriteUtilSpriteDeath(DEATH_NORMAL, gCurrentSprite.yPosition, gCurrentSprite.xPosition, TRUE, PE_SPRITE_EXPLOSION_MEDIUM);
}
}
}

View File

@ -1206,8 +1206,6 @@ void ImagoPartSyncPalette(void)
*/
void Imago(void)
{
// https://decomp.me/scratch/H8S1t
u16 xDistance;
u16 yDistance;
u32 health;
@ -1237,6 +1235,7 @@ void Imago(void)
xDistance = gSubSpriteData1.xPosition - gSamusData.xPosition;
if (!(gCurrentSprite.status & SPRITE_STATUS_ONSCREEN) || yDistance > BLOCK_SIZE * 8 - QUARTER_BLOCK_SIZE + 4)
{
gSamusData.yPosition += 0; // Needed to produce matching ASM.
SoundPlay(0xB5);
if (health == 0)
SoundPlay(0xBB);
@ -1278,7 +1277,7 @@ void Imago(void)
}
}
}
asm("":::"r6", "r4");
switch (gCurrentSprite.pose)
{
case 0:
@ -1692,4 +1691,4 @@ void ImagoEgg(void)
SpriteUtilSpriteDeath(DEATH_NO_DEATH_OR_RESPAWNING_ALREADY_HAS_DROP, gCurrentSprite.yPosition - 0x18, gCurrentSprite.xPosition, TRUE, PE_SPRITE_EXPLOSION_SMALL);
gCurrentSprite.status = 0x0;
}
}
}

View File

@ -1253,11 +1253,13 @@ void ParasiteGeronGrabbed(struct SpriteData* pSprite)
}
}
#ifdef NON_MATCHING
void ParasiteProjectilesCollision(struct SpriteData* pSprite)
/**
* @brief 310e8 | 118 | Handles the collision with the projectiles
*
* @param pSprite Sprite Data Pointer
*/
void ParasiteBombCollision(struct SpriteData* pSprite)
{
// https://decomp.me/scratch/aJlpC
struct ProjectileData* pProj;
u8 status;
u16 projTop;
@ -1271,6 +1273,8 @@ void ParasiteProjectilesCollision(struct SpriteData* pSprite)
u16 spriteLeft;
u16 spriteRight;
u16 yPos, hitboxBottomOffset;
if (pSprite->invincibilityStunFlashTimer & 0x80)
{
pSprite->pose = PARASITE_POSE_DYING_INIT;
@ -1279,8 +1283,13 @@ void ParasiteProjectilesCollision(struct SpriteData* pSprite)
kill = FALSE;
spriteTop = pSprite->yPosition + pSprite->hitboxTopOffset;
spriteBottom = pSprite->yPosition + pSprite->hitboxBottomOffset;
yPos = pSprite->yPosition;
spriteTop = yPos + pSprite->hitboxTopOffset;
spriteBottom = yPos;
hitboxBottomOffset = pSprite->hitboxBottomOffset;
spriteBottom += hitboxBottomOffset;
spriteLeft = pSprite->xPosition + pSprite->hitboxLeftOffset;
spriteRight = pSprite->xPosition + pSprite->hitboxRightOffset;
@ -1320,157 +1329,6 @@ void ParasiteProjectilesCollision(struct SpriteData* pSprite)
SpriteUtilMakeSpriteFaceAwayFromSamusDirection();
}
#else
NAKED_FUNCTION
void ParasiteProjectilesCollision(struct SpriteData* pSprite)
{
asm(" \n\
push {r4, r5, r6, r7, lr} \n\
mov r7, sl \n\
mov r6, sb \n\
mov r5, r8 \n\
push {r5, r6, r7} \n\
sub sp, #0x18 \n\
add r6, r0, #0 \n\
add r0, #0x2b \n\
ldrb r1, [r0] \n\
movs r0, #0x80 \n\
and r0, r1 \n\
cmp r0, #0 \n\
beq lbl_08031114 \n\
add r1, r6, #0 \n\
add r1, #0x24 \n\
movs r0, #0x62 \n\
strb r0, [r1] \n\
b lbl_080311ea \n\
lbl_0803110c: \n\
add r0, r7, #1 \n\
lsl r0, r0, #0x18 \n\
lsr r7, r0, #0x18 \n\
b lbl_080311ae \n\
lbl_08031114: \n\
movs r7, #0 \n\
ldrh r1, [r6, #2] \n\
ldrh r0, [r6, #0xa] \n\
add r0, r1, r0 \n\
lsl r0, r0, #0x10 \n\
lsr r0, r0, #0x10 \n\
str r0, [sp, #0x10] \n\
ldrh r0, [r6, #0xc] \n\
add r1, r1, r0 \n\
lsl r1, r1, #0x10 \n\
lsr r1, r1, #0x10 \n\
str r1, [sp, #0x14] \n\
ldrh r1, [r6, #4] \n\
ldrh r0, [r6, #0xe] \n\
add r0, r1, r0 \n\
lsl r0, r0, #0x10 \n\
lsr r0, r0, #0x10 \n\
mov sb, r0 \n\
ldrh r0, [r6, #0x10] \n\
add r1, r1, r0 \n\
lsl r1, r1, #0x10 \n\
lsr r1, r1, #0x10 \n\
mov r8, r1 \n\
ldr r5, lbl_080311bc @ =gProjectileData \n\
movs r1, #0xe0 \n\
lsl r1, r1, #1 \n\
add r0, r5, r1 \n\
movs r1, #0x24 \n\
add r1, r1, r6 \n\
mov sl, r1 \n\
cmp r5, r0 \n\
bhs lbl_080311ae \n\
lbl_08031154: \n\
ldrb r0, [r5] \n\
movs r1, #1 \n\
and r0, r1 \n\
cmp r0, #0 \n\
beq lbl_080311a6 \n\
ldrb r0, [r5, #0xf] \n\
cmp r0, #0xe \n\
bne lbl_080311a6 \n\
ldrb r0, [r5, #0x11] \n\
cmp r0, #3 \n\
bne lbl_080311a6 \n\
ldrh r3, [r5, #8] \n\
ldrh r4, [r5, #0x14] \n\
add r4, r3, r4 \n\
lsl r4, r4, #0x10 \n\
lsr r4, r4, #0x10 \n\
ldrh r0, [r5, #0x16] \n\
add r3, r3, r0 \n\
lsl r3, r3, #0x10 \n\
lsr r3, r3, #0x10 \n\
ldrh r2, [r5, #0xa] \n\
ldrh r1, [r5, #0x18] \n\
add r1, r2, r1 \n\
lsl r1, r1, #0x10 \n\
lsr r1, r1, #0x10 \n\
ldrh r0, [r5, #0x1a] \n\
add r2, r2, r0 \n\
lsl r2, r2, #0x10 \n\
lsr r2, r2, #0x10 \n\
str r4, [sp] \n\
str r3, [sp, #4] \n\
str r1, [sp, #8] \n\
str r2, [sp, #0xc] \n\
ldr r0, [sp, #0x10] \n\
ldr r1, [sp, #0x14] \n\
mov r2, sb \n\
mov r3, r8 \n\
bl SpriteUtilCheckObjectsTouching \n\
cmp r0, #0 \n\
bne lbl_0803110c \n\
lbl_080311a6: \n\
add r5, #0x1c \n\
ldr r0, lbl_080311c0 @ =gArmCannonY \n\
cmp r5, r0 \n\
blo lbl_08031154 \n\
lbl_080311ae: \n\
cmp r7, #0 \n\
beq lbl_080311c4 \n\
movs r0, #0x62 \n\
mov r1, sl \n\
strb r0, [r1] \n\
b lbl_080311ea \n\
.align 2, 0 \n\
lbl_080311bc: .4byte gProjectileData \n\
lbl_080311c0: .4byte gArmCannonY \n\
lbl_080311c4: \n\
add r0, r6, #0 \n\
add r0, #0x2b \n\
strb r7, [r0] \n\
movs r0, #1 \n\
strh r0, [r6, #0x14] \n\
movs r0, #0x44 \n\
mov r1, sl \n\
strb r0, [r1] \n\
ldr r0, lbl_080311fc @ =gSpriteRng \n\
ldrb r0, [r0] \n\
lsr r7, r0, #1 \n\
cmp r7, #8 \n\
bhi lbl_080311e0 \n\
movs r7, #9 \n\
lbl_080311e0: \n\
add r0, r6, #0 \n\
add r0, #0x2e \n\
strb r7, [r0] \n\
bl SpriteUtilMakeSpriteFaceAwayFromSamusDirection \n\
lbl_080311ea: \n\
add sp, #0x18 \n\
pop {r3, r4, r5} \n\
mov r8, r3 \n\
mov sb, r4 \n\
mov sl, r5 \n\
pop {r4, r5, r6, r7} \n\
pop {r0} \n\
bx r0 \n\
.align 2, 0 \n\
lbl_080311fc: .4byte gSpriteRng \n\
");
}
#endif
/**
* @brief 31200 | 27c | Parasite (multiple) AI
@ -1483,7 +1341,7 @@ void ParasiteMultiple(void)
pSprite = &gCurrentSprite;
if (pSprite->invincibilityStunFlashTimer & 0x7F && pSprite->pose < PARASITE_POSE_DYING)
ParasiteProjectilesCollision(pSprite);
ParasiteBombCollision(pSprite);
switch (pSprite->pose)
{
@ -1571,7 +1429,7 @@ void Parasite(void)
pSprite = &gCurrentSprite;
if (pSprite->invincibilityStunFlashTimer & 0x7F && pSprite->pose < PARASITE_POSE_DYING)
ParasiteProjectilesCollision(pSprite);
ParasiteBombCollision(pSprite);
switch (pSprite->pose)
{
@ -1653,4 +1511,4 @@ void Parasite(void)
}
pSprite->status &= ~SPRITE_STATUS_SAMUS_COLLIDING;
}
}

View File

@ -961,7 +961,7 @@ void TextStartFileScreen(u8 textID)
#ifdef NON_MATCHING
u8 TextProcessFileScreenPopUp(void)
{
// https://decomp.me/scratch/vcoZi
// https://decomp.me/scratch/OOQTv
s32 i;
u32* dst;