diff --git a/asm/sprite.s b/asm/sprite.s index dd69ef0e3..8da34500f 100644 --- a/asm/sprite.s +++ b/asm/sprite.s @@ -5,63 +5,6 @@ .text - thumb_func_start CopySpritesToOam -CopySpritesToOam: - push {r4-r6,lr} - ldr r3, _08005204 - ldr r2, _08005208 - movs r4, 0 - ldr r6, _0800520C - cmp r3, 0 - beq _080051E0 - ldr r5, _08005210 -_080051BC: - ldr r1, [r3, 0x4] - cmp r1, 0 - beq _080051D6 - subs r2, 0x4 - ldrh r0, [r1, 0x4] - strh r0, [r2] - subs r2, 0x2 - ldrh r0, [r1, 0x2] - strh r0, [r2] - subs r2, 0x2 - ldrh r0, [r1] - strh r0, [r2] - adds r4, 0x1 -_080051D6: - ldr r3, [r3] - cmp r3, 0 - beq _080051E0 - cmp r2, r5 - bhi _080051BC -_080051E0: - ldr r1, _08005210 - cmp r2, r1 - bls _080051FA - movs r0, 0 - movs r3, 0xA0 -_080051EA: - subs r2, 0x4 - strh r0, [r2] - subs r2, 0x2 - strh r0, [r2] - subs r2, 0x2 - strh r3, [r2] - cmp r2, r1 - bhi _080051EA -_080051FA: - strh r4, [r6] - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_08005204: .4byte gUnknown_20256A0 -_08005208: .4byte 0x07000400 -_0800520C: .4byte gUnknown_2025670 -_08005210: .4byte 0x07000008 - thumb_func_end CopySpritesToOam - thumb_func_start SetSavingIconCoords SetSavingIconCoords: push {lr} diff --git a/include/sprite.h b/include/sprite.h index ca897f55e..288d7a9a4 100644 --- a/include/sprite.h +++ b/include/sprite.h @@ -4,8 +4,11 @@ // size: 0x8 struct unkSprite { + // y/affineMode/objMode/mosaic/bpp/shape u16 unk0; + // x/matrixNum/size u16 unk2; + // tileNum/priority/paletteNum u16 unk4; u16 unk6; }; @@ -14,12 +17,6 @@ struct unkSprite struct UnkSpriteLink { struct UnkSpriteLink *unk0; - struct UnkSpriteLink *unk4; -}; -// size: 0x8 -struct UnkSpriteLink2 -{ - struct unkSprite *unk0; struct unkSprite *unk4; }; @@ -42,6 +39,7 @@ struct unkStruct_2039DB0 u16 unkA; }; +void CopySpritesToOam(void); void InitSprites(void); void ResetSprites(bool8); void sub_8004E8C(struct unkStruct_2039DB0 *); diff --git a/src/code_2.c b/src/code_2.c index 3a835dfd5..15c129cf9 100644 --- a/src/code_2.c +++ b/src/code_2.c @@ -51,7 +51,6 @@ extern void nullsub_8(u32); extern void sub_80060EC(void); extern void sub_8011860(void); extern void sub_800CB20(void); -extern void CopySpritesToOam(void); extern void sub_8005304(void); extern void TransferBGPaletteBuffer(void); extern void xxx_call_update_bg_vram(void); diff --git a/src/code_80118A4.c b/src/code_80118A4.c index f84f33789..593f4db2c 100644 --- a/src/code_80118A4.c +++ b/src/code_80118A4.c @@ -38,7 +38,6 @@ EWRAM_DATA s16 gUnknown_202DE24; void nullsub_8(u32); void sub_8005838(u32, u32); -extern void CopySpritesToOam(void); extern void sub_8005304(void); extern void TransferBGPaletteBuffer(void); extern void xxx_call_update_bg_vram(void); diff --git a/src/code_8012A18.c b/src/code_8012A18.c index d71686cd3..9c85d318c 100644 --- a/src/code_8012A18.c +++ b/src/code_8012A18.c @@ -8,7 +8,6 @@ extern void sub_8011860(); extern void xxx_draw_string_80144C4(); extern void nullsub_8(u8); extern void sub_800CB20(); -extern void CopySpritesToOam(); extern void sub_8005304(); extern void TransferBGPaletteBuffer(); extern void xxx_call_update_bg_vram(); diff --git a/src/sprite.c b/src/sprite.c index 3f3f8939a..17aedbf41 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -1,8 +1,9 @@ #include "global.h" #include "sprite.h" +extern u16 gUnknown_2025670; extern struct SpriteList gUnknown_20256A0; -extern struct UnkSpriteLink2 gUnknown_2025EA8[128]; +extern struct UnkSpriteLink gUnknown_2025EA8[128]; extern struct unkSprite gUnknown_20262A8[128]; extern u32 gSpriteCount; /* 20266A8 */ extern u32 gUnknown_20266B0; @@ -20,10 +21,9 @@ void ResetSprites(bool8 a0) s32 i; struct UnkSpriteLink *a; struct UnkSpriteLink *b; - struct UnkSpriteLink *c; - struct UnkSpriteLink2 *bro; + struct unkSprite *c; struct unkSprite *d; - struct unkSprite *deez; + struct UnkSpriteLink *e; gSpriteCount = 0; gCharMemCursor = (u32*)0x6010000; @@ -102,14 +102,14 @@ void ResetSprites(bool8 a0) } if (a0) { - deez = NULL; + e = NULL; d = &gUnknown_20262A8[0]; - bro = &gUnknown_2025EA8[0]; + a = &gUnknown_2025EA8[0]; for (i = 0; i < 128; i++) { - bro->unk0 = deez; - bro->unk4 = d; + a->unk0 = e; + a->unk4 = d; d++; - bro++; + a++; } } @@ -571,4 +571,54 @@ void sub_8005180(void) } r2->unk0 = NULL; +} + +void CopySpritesToOam(void) +{ + struct UnkSpriteLink *sLink; + struct unkSprite *spr; + u16 *oam; + s32 count; + + sLink = &gUnknown_20256A0.sprites[0]; + oam = (u16 *)(OAM + OAM_SIZE); // End of OAM. Work backwards + count = 0; + + while (sLink != NULL && (u32)oam > (OAM + sizeof(struct OamData))) { + spr = sLink->unk4; + + // Each OAM entry is 8 bytes [struct OamData] + if (spr != NULL) { + // Skip affineParam + oam -= 2; + // Set tileNum/priority/paletteNum + *oam = spr->unk4; + // Set x/matrixNum/size + oam--; + *oam = spr->unk2; + // Set y/affineMode/objMode/mosaic/bpp/shape + oam--; + *oam = spr->unk0; + + count++; + } + + sLink = sLink->unk0; + } + + // Clear remaining object slots + while ((u32)oam > (OAM + sizeof(struct OamData))) { + // Skip affineParam + oam -= 2; + // Set tileNum/priority/paletteNum + *oam = 0; + // Set x/matrixNum/size + oam--; + *oam = 0; + // Set y/affineMode/objMode/mosaic/bpp/shape + oam--; + *oam = DISPLAY_HEIGHT; + } + + gUnknown_2025670 = count; } \ No newline at end of file