Stack cleanups (#1193)

* Use STACK and STACK_TOP everywhere

* format

* remove fake variable

* bss

* review

Co-authored-by: Derek Hensley <hensley.derek58@gmail.com>

* Update src/boot_O2_g3/boot_main.c

Co-authored-by: Derek Hensley <hensley.derek58@gmail.com>

* review

* renames

* more renames

* and more

* whoopsie, forgot those too

* hopefully the last cleanup

* forgot some stuff

* a

* bss

---------

Co-authored-by: Derek Hensley <hensley.derek58@gmail.com>
This commit is contained in:
Anghelo Carvajal
2023-03-08 15:25:51 -03:00
committed by GitHub
parent 9f529aaf2a
commit 2f1e7b3de8
25 changed files with 192 additions and 169 deletions
+1
View File
@@ -11,6 +11,7 @@
*/
#include "global.h"
#include "buffers.h"
/**
* SoundFont Notes:
+1
View File
@@ -1,4 +1,5 @@
#include "global.h"
#include "buffers.h"
const s16 gAudioTatumInit[] = {
0x1C00, // unused
+8 -7
View File
@@ -1,21 +1,22 @@
#include "prevent_bss_reordering.h"
#include "global.h"
#include "stack.h"
StackEntry sBootThreadInfo;
StackEntry sBootStackInfo;
OSThread sIdleThread;
u8 sIdleThreadStack[0x400];
StackEntry sIdleThreadInfo;
u8 sBootThreadStack[0x400];
STACK(sIdleThreadStack, 0x400);
StackEntry sIdleStackInfo;
STACK(sBootThreadStack, 0x400);
void bootproc(void) {
StackCheck_Init(&sBootThreadInfo, sBootThreadStack, sBootThreadStack + sizeof(sBootThreadStack), 0, -1, "boot");
StackCheck_Init(&sBootStackInfo, sBootThreadStack, STACK_TOP(sBootThreadStack), 0, -1, "boot");
osMemSize = osGetMemSize();
func_800818F4();
osInitialize();
osUnmapTLBAll();
gCartHandle = osCartRomInit();
StackCheck_Init(&sIdleThreadInfo, sIdleThreadStack, sIdleThreadStack + sizeof(sIdleThreadStack), 0, 256, "idle");
osCreateThread(&sIdleThread, Z_THREAD_ID_IDLE, Idle_ThreadEntry, NULL, sIdleThreadStack + sizeof(sIdleThreadStack),
StackCheck_Init(&sIdleStackInfo, sIdleThreadStack, STACK_TOP(sIdleThreadStack), 0, 0x100, "idle");
osCreateThread(&sIdleThread, Z_THREAD_ID_IDLE, Idle_ThreadEntry, NULL, STACK_TOP(sIdleThreadStack),
Z_PRIORITY_IDLE);
osStartThread(&sIdleThread);
}
+13 -5
View File
@@ -1,7 +1,15 @@
#include "ultra64.h"
#include "global.h"
#include "stack.h"
#include "vt.h"
extern FaultThreadStruct* sFaultContext;
extern f32 D_8009BE54;
extern u32 faultCustomOptions;
extern u32 faultCopyToLog;
extern STACK(sFaultStack, 0x600);
extern StackEntry sFaultStackInfo;
// data
const char* sCpuExceptions[] = {
"Interrupt",
@@ -759,9 +767,9 @@ void Fault_SetOptionsFromController3(void) {
}
if (faultCustomOptions) {
graphPC = sGraphThread.context.pc;
graphRA = sGraphThread.context.ra;
graphSP = sGraphThread.context.sp;
graphPC = gGraphThread.context.pc;
graphRA = gGraphThread.context.ra;
graphSP = gGraphThread.context.sp;
if (CHECK_BTN_ALL(input3->cur.button, BTN_R)) {
static u32 faultCopyToLog;
@@ -889,8 +897,8 @@ void Fault_Start(void) {
sFaultContext->faultActive = 0;
gFaultStruct.faultHandlerEnabled = 1;
osCreateMesgQueue(&sFaultContext->queue, sFaultContext->msg, ARRAY_COUNT(sFaultContext->msg));
StackCheck_Init(&sFaultThreadInfo, sFaultStack, sFaultStack + sizeof(sFaultStack), 0, 0x100, "fault");
osCreateThread(&sFaultContext->thread, 2, Fault_ThreadEntry, NULL, sFaultStack + sizeof(sFaultStack), 0x7F);
StackCheck_Init(&sFaultStackInfo, sFaultStack, STACK_TOP(sFaultStack), 0, 0x100, "fault");
osCreateThread(&sFaultContext->thread, 2, Fault_ThreadEntry, NULL, STACK_TOP(sFaultStack), 0x7F);
osStartThread(&sFaultContext->thread);
}
+10 -9
View File
@@ -1,5 +1,7 @@
#include "prevent_bss_reordering.h"
#include "global.h"
#include "stack.h"
#include "buffers.h"
u8 D_80096B20 = 1;
vu8 gViConfigUseDefault = 1;
@@ -9,10 +11,10 @@ f32 gViConfigXScale = 1.0f;
f32 gViConfigYScale = 1.0f;
IrqMgr gIrqMgr;
u8 sIrqMgrStack[0x500];
STACK(sIrqMgrStack, 0x500);
StackEntry sIrqMgrStackInfo;
OSThread gMainThread;
u8 sMainStack[0x900];
OSThread sMainThread;
STACK(sMainStack, 0x900);
StackEntry sMainStackInfo;
OSMesg sPiMgrCmdBuff[50];
OSMesgQueue gPiMgrCmdQ;
@@ -71,8 +73,8 @@ void Idle_InitCodeAndMemory(void) {
}
void Main_ThreadEntry(void* arg) {
StackCheck_Init(&sIrqMgrStackInfo, sIrqMgrStack, sIrqMgrStack + sizeof(sIrqMgrStack), 0, 0x100, "irqmgr");
IrqMgr_Init(&gIrqMgr, &sIrqMgrStackInfo, Z_PRIORITY_IRQMGR, 1);
StackCheck_Init(&sIrqMgrStackInfo, sIrqMgrStack, STACK_TOP(sIrqMgrStack), 0, 0x100, "irqmgr");
IrqMgr_Init(&gIrqMgr, STACK_TOP(sIrqMgrStack), Z_PRIORITY_IRQMGR, 1);
DmaMgr_Start();
Idle_InitCodeAndMemory();
Main(arg);
@@ -108,10 +110,9 @@ void Idle_InitVideo(void) {
void Idle_ThreadEntry(void* arg) {
Idle_InitVideo();
osCreatePiManager(150, &gPiMgrCmdQ, sPiMgrCmdBuff, ARRAY_COUNT(sPiMgrCmdBuff));
StackCheck_Init(&sMainStackInfo, sMainStack, sMainStack + sizeof(sMainStack), 0, 0x400, "main");
osCreateThread(&gMainThread, Z_THREAD_ID_MAIN, Main_ThreadEntry, arg, sMainStack + sizeof(sMainStack),
Z_PRIORITY_MAIN);
osStartThread(&gMainThread);
StackCheck_Init(&sMainStackInfo, sMainStack, STACK_TOP(sMainStack), 0, 0x400, "main");
osCreateThread(&sMainThread, Z_THREAD_ID_MAIN, Main_ThreadEntry, arg, STACK_TOP(sMainStack), Z_PRIORITY_MAIN);
osStartThread(&sMainThread);
osSetThreadPri(NULL, 0);
do { } while (true); }
+4 -3
View File
@@ -1,5 +1,6 @@
#include "prevent_bss_reordering.h"
#include "global.h"
#include "stack.h"
u32 sDmaMgrDmaBuffSize = 0x2000;
@@ -8,7 +9,7 @@ u16 numDmaEntries;
OSMesgQueue sDmaMgrMsgQueue;
OSMesg sDmaMgrMsgs[32];
OSThread sDmaMgrThread;
u8 sDmaMgrStack[0x500];
STACK(sDmaMgrStack, 0x500);
s32 DmaMgr_DmaRomToRam(uintptr_t rom, void* ram, size_t size) {
OSIoMesg ioMsg;
@@ -226,8 +227,8 @@ void DmaMgr_Start(void) {
}
osCreateMesgQueue(&sDmaMgrMsgQueue, sDmaMgrMsgs, ARRAY_COUNT(sDmaMgrMsgs));
StackCheck_Init(&sDmaMgrStackInfo, sDmaMgrStack, sDmaMgrStack + sizeof(sDmaMgrStack), 0, 0x100, "dmamgr");
osCreateThread(&sDmaMgrThread, Z_THREAD_ID_DMAMGR, DmaMgr_ThreadEntry, NULL, sDmaMgrStack + sizeof(sDmaMgrStack),
StackCheck_Init(&sDmaMgrStackInfo, sDmaMgrStack, STACK_TOP(sDmaMgrStack), 0, 0x100, "dmamgr");
osCreateThread(&sDmaMgrThread, Z_THREAD_ID_DMAMGR, DmaMgr_ThreadEntry, NULL, STACK_TOP(sDmaMgrStack),
Z_PRIORITY_DMAMGR);
osStartThread(&sDmaMgrThread);
+1 -1
View File
@@ -1,3 +1,3 @@
#include "global.h"
#include "buffers.h"
GfxPool gGfxPools[2];
+2 -2
View File
@@ -1,3 +1,3 @@
#include "global.h"
#include "buffers.h"
u8 gGfxSPTaskStack[0x400];
STACK(gGfxSPTaskStack, 0x400);
+1 -2
View File
@@ -1,4 +1,3 @@
#include "prevent_bss_reordering.h"
#include "global.h"
#include "buffers.h"
u8 gGfxSPTaskYieldBuffer[OS_YIELD_DATA_SIZE];
+1 -1
View File
@@ -1,4 +1,4 @@
#include "global.h"
#include "buffers.h"
u8 gAudioHeap[0x138000];
+10 -4
View File
@@ -1,4 +1,5 @@
#include "global.h"
#include "stack.h"
/**
* Assigns the "save" values in PreRender
@@ -410,19 +411,24 @@ void PreRender_ApplyFilters(PreRender* this) {
}
}
extern SlowlyTask D_801F6E00;
extern s32 D_801F6FC0;
extern StackEntry sSlowlyStackInfo;
extern STACK(sSlowlyStack, 0x1000);
/**
* Initializes `PreRender_ApplyFilters` onto a new "slowly" thread
*/
void PreRender_ApplyFiltersSlowlyInit(PreRender* this) {
if ((this->cvgSave != NULL) && (this->fbufSave != NULL)) {
if (D_801F6FC0) {
StackCheck_Cleanup(&slowlyStackEntry);
StackCheck_Cleanup(&sSlowlyStackInfo);
Slowly_Stop(&D_801F6E00);
}
this->unk_4D = 1;
StackCheck_Init(&slowlyStackEntry, slowlyStack, &slowlyStack[4096], 0, 0x100, "slowly");
Slowly_Start(&D_801F6E00, &D_801F7FE8, PreRender_ApplyFilters, this, NULL);
StackCheck_Init(&sSlowlyStackInfo, sSlowlyStack, STACK_TOP(sSlowlyStack), 0, 0x100, "slowly");
Slowly_Start(&D_801F6E00, STACK_TOP(sSlowlyStack), PreRender_ApplyFilters, this, NULL);
D_801F6FC0 = true;
}
}
@@ -432,7 +438,7 @@ void PreRender_ApplyFiltersSlowlyInit(PreRender* this) {
*/
void PreRender_ApplyFiltersSlowlyDestroy(PreRender* this) {
if (D_801F6FC0) {
StackCheck_Cleanup(&slowlyStackEntry);
StackCheck_Cleanup(&sSlowlyStackInfo);
Slowly_Stop(&D_801F6E00);
D_801F6FC0 = false;
}
+1
View File
@@ -1,4 +1,5 @@
#include "global.h"
#include "buffers.h"
#include "system_malloc.h"
#include "overlays/gamestates/ovl_daytelop/z_daytelop.h"
#include "overlays/gamestates/ovl_file_choose/z_file_choose.h"
+33 -12
View File
@@ -3,7 +3,29 @@
* reordering than just prevent_bss_reordering.h: there is too much of it to control, and it cannot be split into
* separate files since most of it is at addresses ending in 8.
*/
#include "global.h"
#include "buffers.h"
#include "stack.h"
extern OSMesgQueue sSiIntMsgQ;
extern OSMesg sSiIntMsgBuf[1];
extern u32 gSegments[NUM_SEGMENTS];
extern SchedContext gSchedContext;
extern IrqMgrClient irqClient;
extern OSMesgQueue irqMgrMsgQ;
extern OSMesg irqMgrMsgBuf[60];
extern OSThread gGraphThread;
extern STACK(sGraphStack, 0x1800);
extern STACK(sSchedStack, 0x600);
extern STACK(sAudioStack, 0x800);
extern STACK(sPadMgrStack, 0x500);
extern StackEntry sGraphStackInfo;
extern StackEntry sSchedStackInfo;
extern StackEntry sAudioStackInfo;
extern StackEntry sPadMgrStackInfo;
extern AudioMgr sAudioMgr;
extern PadMgr gPadMgr;
void Main(void* arg) {
intptr_t fb;
@@ -33,25 +55,24 @@ void Main(void* arg) {
osCreateMesgQueue(&irqMgrMsgQ, irqMgrMsgBuf, ARRAY_COUNT(irqMgrMsgBuf));
StackCheck_Init(&schedStackEntry, schedStack, schedStack + sizeof(schedStack), 0, 0x100, "sched");
Sched_Init(&gSchedContext, schedStack + sizeof(schedStack), Z_PRIORITY_SCHED, D_8009B290, 1, &gIrqMgr);
StackCheck_Init(&sSchedStackInfo, sSchedStack, STACK_TOP(sSchedStack), 0, 0x100, "sched");
Sched_Init(&gSchedContext, STACK_TOP(sSchedStack), Z_PRIORITY_SCHED, D_8009B290, 1, &gIrqMgr);
CIC6105_AddRomInfoFaultPage();
IrqMgr_AddClient(&gIrqMgr, &irqClient, &irqMgrMsgQ);
StackCheck_Init(&audioStackEntry, audioStack, audioStack + sizeof(audioStack), 0, 0x100, "audio");
AudioMgr_Init(&audioContext, audioStack + sizeof(audioStack), Z_PRIORITY_AUDIOMGR, 0xA, &gSchedContext, &gIrqMgr);
StackCheck_Init(&sAudioStackInfo, sAudioStack, STACK_TOP(sAudioStack), 0, 0x100, "audio");
AudioMgr_Init(&sAudioMgr, STACK_TOP(sAudioStack), Z_PRIORITY_AUDIOMGR, 0xA, &gSchedContext, &gIrqMgr);
StackCheck_Init(&padmgrStackEntry, padmgrStack, padmgrStack + sizeof(padmgrStack), 0, 0x100, "padmgr");
PadMgr_Init(&sSiIntMsgQ, &gIrqMgr, 7, Z_PRIORITY_PADMGR, padmgrStack + sizeof(padmgrStack));
StackCheck_Init(&sPadMgrStackInfo, sPadMgrStack, STACK_TOP(sPadMgrStack), 0, 0x100, "padmgr");
PadMgr_Init(&sSiIntMsgQ, &gIrqMgr, 7, Z_PRIORITY_PADMGR, STACK_TOP(sPadMgrStack));
AudioMgr_Unlock(&audioContext);
AudioMgr_Unlock(&sAudioMgr);
StackCheck_Init(&sGraphStackInfo, sGraphStack, sGraphStack + sizeof(sGraphStack), 0, 0x100, "graph");
osCreateThread(&sGraphThread, Z_THREAD_ID_GRAPH, Graph_ThreadEntry, arg, sGraphStack + sizeof(sGraphStack),
Z_PRIORITY_GRAPH);
osStartThread(&sGraphThread);
StackCheck_Init(&sGraphStackInfo, sGraphStack, STACK_TOP(sGraphStack), 0, 0x100, "graph");
osCreateThread(&gGraphThread, Z_THREAD_ID_GRAPH, Graph_ThreadEntry, arg, STACK_TOP(sGraphStack), Z_PRIORITY_GRAPH);
osStartThread(&gGraphThread);
exit = false;
@@ -73,5 +94,5 @@ void Main(void* arg) {
}
IrqMgr_RemoveClient(&gIrqMgr, &irqClient);
osDestroyThread(&sGraphThread);
osDestroyThread(&gGraphThread);
}
+1
View File
@@ -1,4 +1,5 @@
#include "global.h"
#include "buffers.h"
#include "system_malloc.h"
#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/func_80178750.s")
+11
View File
@@ -1,6 +1,17 @@
#include "global.h"
#include "stack.h"
#include "system_malloc.h"
// extern UNK_TYPE1 D_801FBE10;
// extern UNK_TYPE1 D_801FBE28;
// extern UNK_TYPE1 D_801FBE2C;
// extern UNK_TYPE4 D_801FBE30;
extern STACK(sSysFlashromStack, 0x1000);
extern StackEntry sys_flashromStackEntry;
extern OSThread sys_flashromOSThread;
extern s80185D40 D_801FD008;
extern OSMesg D_801FD034;
#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_801857C0.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_801857D0.s")
+1
View File
@@ -1,4 +1,5 @@
#include "global.h"
#include "buffers.h"
#include "z64debug_display.h"
#include "z64quake.h"
#include "z64rumble.h"
+1
View File
@@ -1,3 +1,4 @@
#include "prevent_bss_reordering.h"
#include "global.h"
#include "overlays/gamestates/ovl_file_choose/z_file_choose.h"
+6 -5
View File
@@ -1,9 +1,10 @@
#include "global.h"
#include "stack.h"
OSPiHandle D_8009D130;
OSPiHandle D_8009D1A8;
OSThread D_8009D220;
u8 piManagerStack[0x1000];
OSThread sPiMgrThread;
STACK(sPiMgrStack, 0x1000);
OSMesgQueue D_8009E3D0;
OSMesg D_8009E3E8[1];
@@ -27,14 +28,14 @@ void osCreatePiManager(OSPri pri, OSMesgQueue* cmdQ, OSMesg* cmdBuf, s32 cmdMsgC
}
savedMask = __osDisableInt();
__osPiDevMgr.active = 1;
__osPiDevMgr.thread = &D_8009D220;
__osPiDevMgr.thread = &sPiMgrThread;
__osPiDevMgr.cmdQueue = cmdQ;
__osPiDevMgr.evtQueue = &D_8009E3D0;
__osPiDevMgr.acsQueue = &__osPiAccessQueue;
__osPiDevMgr.piDmaCallback = __osPiRawStartDma;
__osPiDevMgr.epiDmaCallback = __osEPiRawStartDma;
osCreateThread(&D_8009D220, 0, __osDevMgrMain, (void*)&__osPiDevMgr, &piManagerStack[4096], pri);
osStartThread(&D_8009D220);
osCreateThread(&sPiMgrThread, 0, __osDevMgrMain, &__osPiDevMgr, STACK_TOP(sPiMgrStack), pri);
osStartThread(&sPiMgrThread);
__osRestoreInt(savedMask);
if (oldPri != -1) {
osSetThreadPri(NULL, oldPri);
+3 -2
View File
@@ -1,8 +1,9 @@
#include "global.h"
#include "stack.h"
#include "osint.h"
OSThread viThread;
u8 viThreadStack[0x1000];
STACK(sViStack, 0x1000);
OSMesgQueue viEventQueue;
OSMesg viEventBuf[6];
OSIoMesg viRetraceMsg;
@@ -45,7 +46,7 @@ void osCreateViManager(OSPri pri) {
__osViDevMgr.piDmaCallback = NULL;
__osViDevMgr.epiDmaCallback = NULL;
osCreateThread(&viThread, 0, &viMgrMain, &__osViDevMgr, viThreadStack + sizeof(viThreadStack), pri);
osCreateThread(&viThread, 0, &viMgrMain, &__osViDevMgr, STACK_TOP(sViStack), pri);
__osViInit();
osStartThread(&viThread);
__osRestoreInt(prevInt);
+15 -14
View File
@@ -4,6 +4,7 @@
* Description: Trees, shrubs
*/
#include "prevent_bss_reordering.h"
#include "z_en_wood02.h"
#include "objects/object_wood02/object_wood02.h"
@@ -35,8 +36,8 @@ typedef enum {
/* 5 */ WOOD_DRAW_LEAF_YELLOW
} WoodDrawType;
static f32 sSpawnCos;
static f32 sSpawnSin;
f32 sWood02SpawnCos;
f32 sWood02SpawnSin;
ActorInit En_Wood02_InitVars = {
ACTOR_EN_WOOD02,
@@ -70,9 +71,9 @@ static ColliderCylinderInit sCylinderInit = {
{ 18, 60, 0, { 0, 0, 0 } },
};
static f32 sSpawnDistance[] = { 707.0f, 525.0f, 510.0f, 500.0f, 566.0f, 141.0f };
f32 sWood02SpawnDistance[] = { 707.0f, 525.0f, 510.0f, 500.0f, 566.0f, 141.0f };
static s16 sSpawnAngle[] = { 0x1FFF, 0x4C9E, 0x77F5, 0xA5C9, -0x293D, 0xA000 };
s16 sWood02SpawnAngle[] = { 0x1FFF, 0x4C9E, 0x77F5, 0xA5C9, -0x293D, 0xA000 };
static InitChainEntry sInitChain[] = {
ICHAIN_F32(targetArrowOffset, 5600, ICHAIN_STOP),
@@ -136,12 +137,12 @@ void EnWood02_SpawnOffspring(EnWood02* this, PlayState* play) {
extraRot = 0x4000;
}
sSpawnCos = Math_CosS(sSpawnAngle[i] + this->actor.world.rot.y + extraRot);
sSpawnSin = Math_SinS(sSpawnAngle[i] + this->actor.world.rot.y + extraRot);
sWood02SpawnCos = Math_CosS(sWood02SpawnAngle[i] + this->actor.world.rot.y + extraRot);
sWood02SpawnSin = Math_SinS(sWood02SpawnAngle[i] + this->actor.world.rot.y + extraRot);
childPos.x = (sSpawnDistance[i] * sSpawnSin) + this->actor.home.pos.x;
childPos.x = (sWood02SpawnDistance[i] * sWood02SpawnSin) + this->actor.home.pos.x;
childPos.y = this->actor.home.pos.y;
childPos.z = (sSpawnDistance[i] * sSpawnCos) + this->actor.home.pos.z;
childPos.z = (sWood02SpawnDistance[i] * sWood02SpawnCos) + this->actor.home.pos.z;
if (EnWood02_SpawnZoneCheck(this, play, &childPos)) {
if (this->unk_14A[i] & 0x80) {
@@ -152,8 +153,8 @@ void EnWood02_SpawnOffspring(EnWood02* this, PlayState* play) {
childParams = ((this->unk_144 << 8) & 0xFF00) | (this->actor.params + 1);
child = (EnWood02*)Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_WOOD02, childPos.x,
childPos.y, childPos.z, this->actor.world.rot.x, sSpawnAngle[i],
unk, childParams);
childPos.y, childPos.z, this->actor.world.rot.x,
sWood02SpawnAngle[i], unk, childParams);
if (child != NULL) {
child->unk_14A[0] = i;
this->unk_14A[i] |= 1;
@@ -296,10 +297,10 @@ void EnWood02_Init(Actor* thisx, PlayState* play) {
if (spawnType == WOOD_SPAWN_SPAWNER) {
EnWood02_SpawnOffspring(this, play);
sSpawnCos = Math_CosS(sSpawnAngle[5] + this->actor.world.rot.y + extraRot);
sSpawnSin = Math_SinS(sSpawnAngle[5] + this->actor.world.rot.y + extraRot);
this->actor.world.pos.x += sSpawnSin * sSpawnDistance[5];
this->actor.world.pos.z += sSpawnCos * sSpawnDistance[5];
sWood02SpawnCos = Math_CosS(sWood02SpawnAngle[5] + this->actor.world.rot.y + extraRot);
sWood02SpawnSin = Math_SinS(sWood02SpawnAngle[5] + this->actor.world.rot.y + extraRot);
this->actor.world.pos.x += sWood02SpawnSin * sWood02SpawnDistance[5];
this->actor.world.pos.z += sWood02SpawnCos * sWood02SpawnDistance[5];
} else {
this->actor.flags |= ACTOR_FLAG_10;
this->unk_151 = 2;
@@ -4,11 +4,9 @@
* Description: "Master" instance of grass for unit spawned by Obj_Grass_Unit
*/
#include "prevent_bss_reordering.h"
#include "z_obj_grass.h"
#include "overlays/actors/ovl_Obj_Grass_Carry/z_obj_grass_carry.h"
#include "objects/gameplay_keep/gameplay_keep.h"
#include "prevent_bss_reordering.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20)