match sprite function (from katam), more clean up

This commit is contained in:
Oliver Bell committed 2024-04-21 17:15:15 +01:00
1 parent 89949b4546
commit 976999a807
7 files changed
+232 -608

No files matched your search

+2 -1
View File
@@ -329,7 +329,8 @@
"sonic_boom_particles.h": "c",
"communication_outcome.h": "c",
"tilemap.h": "c",
"tilemap_data.h": "c"
"tilemap_data.h": "c",
"game_7.h": "c"
},
"asm-code-lens.donated": true,
"editor.formatOnSave": true,
-487
View File
@@ -1,487 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.text
.syntax unified
.arm
@ sub_081569A0 in KATAM?
thumb_func_start sub_800550C
sub_800550C: @ 0x0800550C
push {r4, r5, r6, r7, lr}
mov r7, sl
mov r6, sb
mov r5, r8
push {r5, r6, r7}
sub sp, #0x2c
mov r8, r0
str r1, [sp, #8]
lsls r2, r2, #0x18
lsrs r2, r2, #0x18
str r2, [sp, #0xc]
ldr r2, [r0, #0xc]
movs r0, #1
rsbs r0, r0, #0
cmp r2, r0
bne _0800552E
b _08005888
_0800552E:
mov sl, r2
ldrh r1, [r2, #2]
mov r0, r8
adds r0, #0x24
strb r1, [r0]
mov r1, r8
movs r2, #0x16
ldrsh r0, [r1, r2]
str r0, [sp]
movs r4, #0x18
ldrsh r0, [r1, r4]
str r0, [sp, #4]
ldr r3, [r1, #0x10]
movs r0, #0x80
lsls r0, r0, #0xa
ands r0, r3
cmp r0, #0
beq _08005568
ldr r2, _080055A8 @ =gUnknown_030017F4
movs r0, #0
ldrsh r1, [r2, r0]
ldr r0, [sp]
subs r0, r0, r1
str r0, [sp]
movs r4, #2
ldrsh r1, [r2, r4]
ldr r0, [sp, #4]
subs r0, r0, r1
str r0, [sp, #4]
_08005568:
mov r0, sl
ldrh r0, [r0, #4]
str r0, [sp, #0x10]
mov r1, sl
ldrh r1, [r1, #6]
str r1, [sp, #0x14]
movs r0, #0x20
ands r0, r3
cmp r0, #0
beq _080055AC
movs r0, #0x40
ands r3, r0
cmp r3, #0
beq _080055F4
ldr r2, [sp, #0x10]
lsrs r1, r2, #1
ldr r0, [sp]
subs r0, r0, r1
str r0, [sp]
mov r4, sl
ldrh r1, [r4, #6]
lsrs r1, r1, #1
ldr r0, [sp, #4]
subs r0, r0, r1
str r0, [sp, #4]
lsls r2, r2, #1
str r2, [sp, #0x10]
ldr r0, [sp, #0x14]
lsls r0, r0, #1
str r0, [sp, #0x14]
b _080055F4
.align 2, 0
_080055A8: .4byte gUnknown_030017F4
_080055AC:
movs r0, #0x80
lsls r0, r0, #4
ands r3, r0
cmp r3, #0
beq _080055C2
mov r2, sl
movs r4, #0xa
ldrsh r1, [r2, r4]
ldr r0, [sp, #0x14]
subs r1, r0, r1
b _080055C8
_080055C2:
mov r2, sl
movs r4, #0xa
ldrsh r1, [r2, r4]
_080055C8:
ldr r0, [sp, #4]
subs r0, r0, r1
str r0, [sp, #4]
mov r1, r8
ldr r0, [r1, #0x10]
movs r1, #0x80
lsls r1, r1, #3
ands r0, r1
cmp r0, #0
beq _080055E8
mov r2, sl
movs r4, #8
ldrsh r1, [r2, r4]
ldr r0, [sp, #0x10]
subs r1, r0, r1
b _080055EE
_080055E8:
mov r2, sl
movs r4, #8
ldrsh r1, [r2, r4]
_080055EE:
ldr r0, [sp]
subs r0, r0, r1
str r0, [sp]
_080055F4:
mov r0, r8
movs r2, #0x16
ldrsh r1, [r0, r2]
ldr r0, [sp]
subs r0, r0, r1
str r0, [sp, #0x24]
mov r4, r8
movs r0, #0x18
ldrsh r1, [r4, r0]
ldr r0, [sp, #4]
subs r0, r0, r1
str r0, [sp, #0x28]
ldr r0, [sp]
ldr r1, [sp, #0x10]
adds r0, r0, r1
cmp r0, #0
bge _08005618
b _08005888
_08005618:
ldr r0, [sp]
cmp r0, #0xf0
ble _08005620
b _08005888
_08005620:
ldr r0, [sp, #4]
ldr r2, [sp, #0x14]
adds r0, r0, r2
cmp r0, #0
bge _0800562C
b _08005888
_0800562C:
ldr r0, [sp, #4]
cmp r0, #0xa0
ble _08005634
b _08005888
_08005634:
movs r4, #0
str r4, [sp, #0x18]
mov r0, sl
ldrh r0, [r0, #2]
cmp r4, r0
blo _08005642
b _08005888
_08005642:
ldr r0, _080056FC @ =gUnknown_03002794
ldr r1, [r0]
mov r2, r8
ldrh r0, [r2, #0xa]
ldr r1, [r1, #8]
lsls r0, r0, #2
adds r0, r0, r1
ldr r4, [r0]
ldrh r0, [r2, #0x1a]
movs r2, #0xf8
lsls r2, r2, #3
adds r1, r2, #0
ands r0, r1
lsrs r0, r0, #6
bl OamMalloc
adds r6, r0, #0
ldr r0, _08005700 @ =iwram_end
ldr r0, [r0]
cmp r0, r6
bne _0800566E
b _08005888
_0800566E:
ldr r2, _08005704 @ =0x040000D4
mov r0, sl
ldrb r1, [r0, #1]
ldr r0, [sp, #0x18]
adds r1, r1, r0
lsls r0, r1, #1
adds r0, r0, r1
lsls r0, r0, #1
adds r0, r4, r0
str r0, [r2]
str r6, [r2, #4]
ldr r0, _08005708 @ =0x80000003
str r0, [r2, #8]
ldr r0, [r2, #8]
ldrh r1, [r6, #2]
ldr r2, _0800570C @ =0x000001FF
adds r0, r2, #0
adds r4, r0, #0
ands r4, r1
str r4, [sp, #0x1c]
ldrh r0, [r6]
ldrb r2, [r6]
str r2, [sp, #0x20]
movs r3, #0xfe
lsls r3, r3, #8
ands r3, r1
movs r4, #0
strh r3, [r6, #2]
movs r2, #0xfe
lsls r2, r2, #8
ands r2, r0
strh r2, [r6]
mov r0, r8
adds r0, #0x25
ldrb r0, [r0]
lsls r0, r0, #0xc
ldrh r1, [r6, #4]
adds r0, r0, r1
strh r0, [r6, #4]
mov r0, r8
ldr r5, [r0, #0x10]
movs r0, #0x20
ands r0, r5
cmp r0, #0
beq _08005710
movs r1, #0x80
lsls r1, r1, #1
adds r0, r1, #0
orrs r2, r0
orrs r2, r4
strh r2, [r6]
mov r1, r8
ldr r0, [r1, #0x10]
movs r1, #0x40
ands r0, r1
cmp r0, #0
beq _080056EA
movs r4, #0x80
lsls r4, r4, #2
adds r0, r4, #0
orrs r2, r0
strh r2, [r6]
_080056EA:
mov r1, r8
ldr r0, [r1, #0x10]
movs r1, #0x1f
ands r0, r1
lsls r0, r0, #9
ldrh r1, [r6, #2]
orrs r0, r1
strh r0, [r6, #2]
b _08005786
.align 2, 0
_080056FC: .4byte gUnknown_03002794
_08005700: .4byte iwram_end
_08005704: .4byte 0x040000D4
_08005708: .4byte 0x80000003
_0800570C: .4byte 0x000001FF
_08005710:
movs r1, #0xc0
lsls r1, r1, #8
adds r0, r2, #0
ands r0, r1
lsrs r4, r0, #0xc
adds r0, r3, #0
ands r0, r1
lsrs r0, r0, #0xe
orrs r4, r0
lsrs r1, r5, #0xb
movs r5, #1
mov r2, sl
ldrb r0, [r2]
lsrs r0, r0, #1
eors r0, r1
ands r0, r5
cmp r0, #0
beq _08005754
movs r0, #0x80
lsls r0, r0, #6
adds r1, r0, #0
adds r0, r3, #0
eors r0, r1
strh r0, [r6, #2]
ldr r0, _08005898 @ =gOamShapesSizes
lsls r1, r4, #1
adds r0, #1
adds r1, r1, r0
ldrb r0, [r1]
ldr r1, [sp, #0x14]
subs r0, r1, r0
ldr r2, [sp, #0x20]
subs r2, r0, r2
str r2, [sp, #0x20]
_08005754:
mov r1, r8
ldr r0, [r1, #0x10]
lsrs r0, r0, #0xa
ands r0, r5
mov r1, sl
ldrb r2, [r1]
adds r1, r5, #0
ands r1, r2
cmp r0, r1
beq _08005786
ldrh r0, [r6, #2]
movs r2, #0x80
lsls r2, r2, #5
adds r1, r2, #0
eors r0, r1
strh r0, [r6, #2]
ldr r1, _08005898 @ =gOamShapesSizes
lsls r0, r4, #1
adds r0, r0, r1
ldrb r0, [r0]
ldr r4, [sp, #0x10]
subs r0, r4, r0
ldr r1, [sp, #0x1c]
subs r1, r0, r1
str r1, [sp, #0x1c]
_08005786:
mov r4, r8
ldr r2, [r4, #0x10]
movs r0, #0xc0
lsls r0, r0, #1
ands r2, r0
lsls r2, r2, #3
ldrh r0, [r6]
orrs r2, r0
strh r2, [r6]
ldr r0, [r4, #0x10]
movs r1, #0xc0
lsls r1, r1, #6
ands r0, r1
lsrs r3, r0, #2
ldrh r0, [r6, #4]
orrs r3, r0
strh r3, [r6, #4]
ldr r0, [sp, #4]
ldr r1, [sp, #0x20]
adds r0, r0, r1
movs r1, #0xff
ands r0, r1
adds r2, r2, r0
strh r2, [r6]
ldr r0, [sp]
ldr r4, [sp, #0x1c]
adds r0, r0, r4
ldr r4, _0800589C @ =0x000001FF
adds r1, r4, #0
ands r0, r1
ldrh r1, [r6, #2]
adds r0, r0, r1
strh r0, [r6, #2]
movs r4, #0x80
lsls r4, r4, #6
adds r0, r4, #0
ands r2, r0
cmp r2, #0
beq _080057E0
ldr r0, _080058A0 @ =0x000003FF
adds r1, r0, #0
adds r0, r3, #0
ands r0, r1
adds r0, r3, r0
strh r0, [r6, #4]
_080057E0:
mov r1, r8
ldr r0, [r1, #4]
ldr r2, _080058A4 @ =0xF9FF0000
adds r0, r0, r2
lsrs r0, r0, #5
ldrh r4, [r6, #4]
adds r0, r0, r4
strh r0, [r6, #4]
movs r7, #0
ldr r0, [sp, #0xc]
cmp r7, r0
bhs _08005874
ldr r1, _080058A8 @ =0x040000D4
mov sb, r1
_080057FC:
mov r2, r8
ldrh r0, [r2, #0x1a]
movs r4, #0xf8
lsls r4, r4, #3
adds r1, r4, #0
ands r0, r1
lsrs r0, r0, #6
bl OamMalloc
adds r5, r0, #0
ldr r0, _080058AC @ =iwram_end
ldr r0, [r0]
cmp r0, r6
beq _08005888
mov r0, sb
str r6, [r0]
str r5, [r0, #4]
ldr r0, _080058B0 @ =0x80000003
mov r1, sb
str r0, [r1, #8]
ldr r0, [r1, #8]
ldrh r4, [r5, #2]
movs r2, #0xfe
lsls r2, r2, #8
ands r4, r2
strh r4, [r5, #2]
ldrh r2, [r5]
movs r1, #0xff
lsls r1, r1, #8
adds r0, r1, #0
ands r2, r0
strh r2, [r5]
lsls r3, r7, #2
ldr r0, [sp, #8]
adds r3, r3, r0
ldrh r0, [r3, #2]
ldr r1, [sp, #0x28]
adds r0, r0, r1
ldr r1, [sp, #0x20]
adds r0, r0, r1
movs r1, #0xff
ands r0, r1
adds r2, r2, r0
strh r2, [r5]
ldrh r0, [r3]
ldr r2, [sp, #0x24]
adds r0, r0, r2
ldr r1, [sp, #0x1c]
adds r0, r0, r1
ldr r2, _0800589C @ =0x000001FF
adds r1, r2, #0
ands r0, r1
adds r4, r4, r0
strh r4, [r5, #2]
adds r0, r7, #1
lsls r0, r0, #0x18
lsrs r7, r0, #0x18
ldr r4, [sp, #0xc]
cmp r7, r4
blo _080057FC
_08005874:
ldr r0, [sp, #0x18]
adds r0, #1
lsls r0, r0, #0x18
lsrs r0, r0, #0x18
str r0, [sp, #0x18]
mov r1, sl
ldrh r1, [r1, #2]
cmp r0, r1
bhs _08005888
b _08005642
_08005888:
add sp, #0x2c
pop {r3, r4, r5}
mov r8, r3
mov sb, r4
mov sl, r5
pop {r4, r5, r6, r7}
pop {r0}
bx r0
.align 2, 0
_08005898: .4byte gOamShapesSizes
_0800589C: .4byte 0x000001FF
_080058A0: .4byte 0x000003FF
_080058A4: .4byte 0xF9FF0000
_080058A8: .4byte 0x040000D4
_080058AC: .4byte iwram_end
_080058B0: .4byte 0x80000003
+2
View File
@@ -10,4 +10,6 @@ void sub_802DCC8(u8 p0, u16 p1);
void sub_802DDC4(u8 p0, u16 p1);
void sub_802DF18(u8 p0, u16 p1);
void sub_802E784(u16, u16, u16, s16 x, s16 y, s16);
#endif // GUARD_GAME_7_H
-2
View File
@@ -93,8 +93,6 @@ SECTIONS
build/sa2/src/sprite_2.o(.text);
build/sa2/asm/sprite_2.o(.text);
build/sa2/src/sprite_3.o(.text);
build/sa2/asm/sprite_3.o(.text);
build/sa2/src/sprite_3_2.o(.text);
build/sa2/src/animation_commands.o(.text);
build/sa2/asm/bg_triangles_unused_0.o(.text);
build/sa2/src/bg_triangles_0.o(.text);
+1 -3
View File
@@ -16,6 +16,7 @@
#include "game/stage/collision.h"
#include "game/stage/player.h"
#include "game/stage/camera.h"
#include "game/stage/game_7.h"
#include "game/stage/screen_fade.h"
@@ -158,9 +159,6 @@ static const u16 gUnknown_080D7FF0[][16] = {
INCBIN_U16("graphics/80D8010.gbapal"),
};
// stage intro related
extern void sub_802E784(u16, u16, u16, s16 x, s16 y, s16);
void Task_EggSaucerIntro(void);
void TaskDestructor_EggSaucerMain(struct Task *);
static void SaucerUpdatePosAndRotate(EggSaucer *);
+227 -1
View File
@@ -1,9 +1,10 @@
#include "global.h"
#include "core.h"
#include "sprite.h"
#include "data/sprite_data.h"
#include "flags.h"
#include "data/sprite_data.h"
const u8 gOamShapesSizes[12][2] = {
// Square
{ 8, 8 },
@@ -138,3 +139,228 @@ void DisplaySprite(Sprite *sprite)
}
}
}
void sub_081569A0(Sprite *sprite, u16 *sp08, u8 sp0C)
{
vs32 x, y;
s32 sprWidth, sprHeight;
u8 sp18, i;
u32 x1, y1, sp24, sp28;
if ((u32)sprite->dimensions != -1) {
const SpriteOffset *sprDims = sprite->dimensions;
sprite->numSubFrames = sprDims->numSubframes;
x = sprite->x;
y = sprite->y;
if (sprite->unk10 & SPRITE_FLAG_MASK_17) {
x -= gUnknown_030017F4[0];
y -= gUnknown_030017F4[1];
}
sprWidth = sprDims->width;
sprHeight = sprDims->height;
if (sprite->unk10 & SPRITE_FLAG_MASK_ROT_SCALE_ENABLE) {
if (sprite->unk10 & SPRITE_FLAG_MASK_ROT_SCALE_DOUBLE_SIZE) {
x -= sprDims->width / 2;
y -= sprDims->height / 2;
sprWidth *= 2;
sprHeight *= 2;
}
} else {
if (sprite->unk10 & SPRITE_FLAG_MASK_Y_FLIP) {
y -= sprHeight - sprDims->offsetY;
} else {
y -= sprDims->offsetY;
}
if (sprite->unk10 & SPRITE_FLAG_MASK_X_FLIP) {
x -= sprWidth - sprDims->offsetX;
} else {
x -= sprDims->offsetX;
}
}
sp24 = x - sprite->x;
sp28 = y - sprite->y;
if (x + sprWidth >= 0 && x <= 240 && y + sprHeight >= 0 && y <= 160) {
for (sp18 = 0; sp18 < sprDims->numSubframes; ++sp18) {
const u16 *oamData = gUnknown_03002794->oamData[sprite->graphics.anim];
OamData *oam = OamMalloc(GET_SPRITE_OAM_ORDER(sprite));
if (iwram_end == oam) {
return;
}
DmaCopy16(3, &oamData[3 * ((sprDims->oamIndex & 0x3FFF) + sp18)], oam,
6); // excluding affine params
x1 = oam->all.attr1 & 0x1FF;
y1 = oam->all.attr0 & 0xFF;
oam->all.attr1 &= 0xFE00;
oam->all.attr0 &= 0xFE00;
oam->all.attr2 += sprite->palId << 12;
if (sprite->unk10 & SPRITE_FLAG_MASK_ROT_SCALE_ENABLE) {
oam->all.attr0 |= 0x100;
if (sprite->unk10 & SPRITE_FLAG_MASK_ROT_SCALE_DOUBLE_SIZE) {
oam->all.attr0 |= 0x200;
}
oam->all.attr1 |= (sprite->unk10 & SPRITE_FLAG_MASK_ROT_SCALE) << 9;
} else {
u32 shapeAndSize = ((oam->all.attr0 & 0xC000) >> 12);
u32 flipY;
u32 r6;
shapeAndSize |= ((oam->all.attr1 & 0xC000) >> 14);
flipY = sprite->unk10 >> 11;
r6 = 1;
// y-flip
if ((((sprDims->flip >> 1) ^ flipY) & r6) != 0) {
oam->all.attr1 ^= 0x2000;
y1 = sprHeight - gOamShapesSizes[shapeAndSize][1] - y1;
}
// x-flip
if (((sprite->unk10 >> 10) & r6) != (sprDims->flip & 1)) {
oam->all.attr1 ^= 0x1000;
x1 = sprWidth - gOamShapesSizes[shapeAndSize][0] - x1;
}
}
oam->all.attr0 |= (sprite->unk10 & SPRITE_FLAG_MASK_OBJ_MODE) * 8;
oam->all.attr2 |= (sprite->unk10 & SPRITE_FLAG_MASK_PRIORITY) >> 2;
oam->all.attr0 += ((y + y1) & 0xFF);
oam->all.attr1 += ((x + x1) & 0x1FF);
if (oam->all.attr0 & (ST_OAM_8BPP << 13)) {
oam->all.attr2 += oam->all.attr2 & 0x3FF;
}
oam->all.attr2 += GET_TILE_NUM(sprite->graphics.dest);
for (i = 0; i < sp0C; ++i) {
OamData *r5 = OamMalloc(GET_SPRITE_OAM_ORDER(sprite));
if (iwram_end == oam)
return;
DmaCopy16(3, oam, r5, 6);
r5->all.attr1 &= 0xFE00;
r5->all.attr0 &= 0xFF00;
r5->all.attr0 += (sp08[2 * i + 1] + sp28 + y1) & 0xFF;
r5->all.attr1 += (sp08[2 * i + 0] + sp24 + x1) & 0x1FF;
}
}
}
}
}
// The parameter to this determines the order this sprite is expected to be drawn at.
//
// If you have created n Sprite instances, and you want them to be drawn in a certain
// order, you'd set their OAM order value (inside Sprite.unk1A) accordingly.
// A higher value gets drawn first
// (Higher order value == Higher Priority -> Drawn first).
// This only applies if these sprites all have the same priority value (0-3) in OAM.
// For OAM priority values the same rule (Higher value == Higher Priority) applies.
//
// This behavior is used by the Pause Menu, whereby all existing OAM values get put to
// the end of the OAM buffer, while the pause menu itself gets put to the beginning.
OamData *OamMalloc(u8 order)
{
OamData *result;
if (order > 31) {
order = 31;
}
if (gOamFreeIndex > OAM_ENTRY_COUNT - 1) {
result = (OamData *)iwram_end;
} else {
if (gUnknown_03001850[order] == 0xFF) {
gOamBuffer2[gOamFreeIndex].split.fractional = 0xFF;
gUnknown_03001850[order] = gOamFreeIndex;
gUnknown_03004D60[order] = gOamFreeIndex;
} else {
gOamBuffer2[gOamFreeIndex].split.fractional = 0xFF;
gOamBuffer2[gUnknown_03004D60[order]].split.fractional = gOamFreeIndex;
gUnknown_03004D60[order] = gOamFreeIndex;
}
gOamFreeIndex++;
result = &gOamBuffer2[gOamFreeIndex - 1];
}
return result;
}
void CopyOamBufferToOam(void)
{
OamData *dstOam = &gOamBuffer[0];
u8 i = 0;
s32 r3;
for (r3 = 0; r3 < 32; r3++) {
s8 index = gUnknown_03001850[r3];
while (index != -1) {
u8 newI;
u8 *byteArray = gUnknown_03002710;
DmaCopy16(3, &gOamBuffer2[index], dstOam, sizeof(OamDataShort));
dstOam++;
byteArray += index;
newI = i++;
*byteArray = newI;
index = gOamBuffer2[index].split.fractional;
};
}
if (gFlags & FLAGS_800) {
r3 = gOamFreeIndex;
dstOam = &gOamBuffer[r3];
while (r3 < gOamFirstPausedIndex) {
DmaFill16(3, 0x200, dstOam, sizeof(OamDataShort));
dstOam++;
r3++;
}
} else if (gFlags & FLAGS_PAUSE_GAME) {
/* Push all active OAM entries to te end of OAM temporarily while
* the game is paused */
s32 k, l;
r3 = gOamFreeIndex - 1;
dstOam = &gOamBuffer[r3];
for (k = l = 0; r3 >= 0;) {
s32 size = sizeof(OamDataShort);
DmaCopy16(3, dstOam - k, &gOamBuffer[OAM_ENTRY_COUNT - 1 - l], size);
k++, r3--, l++;
}
// _08005A5E
gOamFirstPausedIndex = OAM_ENTRY_COUNT - gOamFreeIndex;
for (r3 = 0; r3 < gOamFirstPausedIndex; r3++) {
DmaFill16(3, 0x200, &gOamBuffer[r3], sizeof(OamDataShort));
#ifndef NON_MATCHING
// unlike when using --, using ++ changes the condition to something entirely
// different unless we tell the compiler that we want to use r3's values
// (without actually doing so)
asm("" ::"r"(r3));
#endif
}
} else {
gOamFirstPausedIndex = 0;
}
gOamFreeIndex = 0;
if (gFlags & FLAGS_4000) {
CpuFill32(-1, gUnknown_03001850, sizeof(gUnknown_03001850));
CpuFill32(-1, gUnknown_03004D60, sizeof(gUnknown_03004D60));
} else {
DmaFill32(3, -1, gUnknown_03001850, sizeof(gUnknown_03001850));
DmaFill32(3, -1, gUnknown_03004D60, sizeof(gUnknown_03004D60));
}
}
-114
View File
@@ -1,114 +0,0 @@
#include "global.h"
#include "core.h"
#include "flags.h"
// The parameter to this determines the order this sprite is expected to be drawn at.
//
// If you have created n Sprite instances, and you want them to be drawn in a certain
// order, you'd set their OAM order value (inside Sprite.unk1A) accordingly.
// A higher value gets drawn first
// (Higher order value == Higher Priority -> Drawn first).
// This only applies if these sprites all have the same priority value (0-3) in OAM.
// For OAM priority values the same rule (Higher value == Higher Priority) applies.
//
// This behavior is used by the Pause Menu, whereby all existing OAM values get put to
// the end of the OAM buffer, while the pause menu itself gets put to the beginning.
OamData *OamMalloc(u8 order)
{
OamData *result;
if (order > 31) {
order = 31;
}
if (gOamFreeIndex > OAM_ENTRY_COUNT - 1) {
result = (OamData *)iwram_end;
} else {
if (gUnknown_03001850[order] == 0xFF) {
gOamBuffer2[gOamFreeIndex].split.fractional = 0xFF;
gUnknown_03001850[order] = gOamFreeIndex;
gUnknown_03004D60[order] = gOamFreeIndex;
} else {
gOamBuffer2[gOamFreeIndex].split.fractional = 0xFF;
gOamBuffer2[gUnknown_03004D60[order]].split.fractional = gOamFreeIndex;
gUnknown_03004D60[order] = gOamFreeIndex;
}
gOamFreeIndex++;
result = &gOamBuffer2[gOamFreeIndex - 1];
}
return result;
}
void CopyOamBufferToOam(void)
{
OamData *dstOam = &gOamBuffer[0];
u8 i = 0;
s32 r3;
for (r3 = 0; r3 < 32; r3++) {
s8 index = gUnknown_03001850[r3];
while (index != -1) {
u8 newI;
u8 *byteArray = gUnknown_03002710;
DmaCopy16(3, &gOamBuffer2[index], dstOam, sizeof(OamDataShort));
dstOam++;
byteArray += index;
newI = i++;
*byteArray = newI;
index = gOamBuffer2[index].split.fractional;
};
}
if (gFlags & FLAGS_800) {
r3 = gOamFreeIndex;
dstOam = &gOamBuffer[r3];
while (r3 < gOamFirstPausedIndex) {
DmaFill16(3, 0x200, dstOam, sizeof(OamDataShort));
dstOam++;
r3++;
}
} else if (gFlags & FLAGS_PAUSE_GAME) {
/* Push all active OAM entries to te end of OAM temporarily while
* the game is paused */
s32 k, l;
r3 = gOamFreeIndex - 1;
dstOam = &gOamBuffer[r3];
for (k = l = 0; r3 >= 0;) {
s32 size = sizeof(OamDataShort);
DmaCopy16(3, dstOam - k, &gOamBuffer[OAM_ENTRY_COUNT - 1 - l], size);
k++, r3--, l++;
}
// _08005A5E
gOamFirstPausedIndex = OAM_ENTRY_COUNT - gOamFreeIndex;
for (r3 = 0; r3 < gOamFirstPausedIndex; r3++) {
DmaFill16(3, 0x200, &gOamBuffer[r3], sizeof(OamDataShort));
#ifndef NON_MATCHING
// unlike when using --, using ++ changes the condition to something entirely
// different unless we tell the compiler that we want to use r3's values
// (without actually doing so)
asm("" ::"r"(r3));
#endif
}
} else {
gOamFirstPausedIndex = 0;
}
gOamFreeIndex = 0;
if (gFlags & FLAGS_4000) {
CpuFill32(-1, gUnknown_03001850, sizeof(gUnknown_03001850));
CpuFill32(-1, gUnknown_03004D60, sizeof(gUnknown_03004D60));
} else {
DmaFill32(3, -1, gUnknown_03001850, sizeof(gUnknown_03001850));
DmaFill32(3, -1, gUnknown_03004D60, sizeof(gUnknown_03004D60));
}
}