diff --git a/Makefile b/Makefile index 22860ccde1..7e1b2d6d65 100644 --- a/Makefile +++ b/Makefile @@ -118,6 +118,7 @@ endif CPP := cpp ELF2ROM := tools/buildtools/elf2rom MKLDSCRIPT := tools/buildtools/mkldscript +MKDMADATA := tools/buildtools/mkdmadata YAZ0 := tools/buildtools/yaz0 ZAPD := tools/ZAPD/ZAPD.out FADO := tools/fado/fado.elf @@ -345,6 +346,13 @@ build/$(SPEC): $(SPEC) build/ldscript.txt: build/$(SPEC) $(MKLDSCRIPT) $< $@ +build/dmadata_table_spec.h: build/$(SPEC) + $(MKDMADATA) $< $@ + +# Dependencies for files that may include the dmadata header automatically generated from the spec file +build/src/boot/z_std_dma.o: build/dmadata_table_spec.h +build/src/dmadata/dmadata.o: build/dmadata_table_spec.h + build/asm/%.o: asm/%.s $(AS) $(ASFLAGS) $< -o $@ diff --git a/include/functions.h b/include/functions.h index 1b1548c159..afd07e478b 100644 --- a/include/functions.h +++ b/include/functions.h @@ -6,22 +6,7 @@ void bootproc(void); void ViConfig_UpdateVi(u32 black); void ViConfig_UpdateBlack(void); -s32 DmaMgr_DmaRomToRam(uintptr_t rom, void* ram, size_t size); -s32 DmaMgr_DmaHandler(OSPiHandle* pihandle, OSIoMesg* mb, s32 direction); -DmaEntry* DmaMgr_FindDmaEntry(uintptr_t vrom); -u32 DmaMgr_TranslateVromToRom(uintptr_t vrom); -s32 DmaMgr_FindDmaIndex(uintptr_t vrom); -const char* func_800809F4(uintptr_t param_1); -void DmaMgr_ProcessMsg(DmaRequest* req); -void DmaMgr_ThreadEntry(void* arg); -s32 DmaMgr_SendRequestImpl(DmaRequest* request, void* vramStart, uintptr_t vromStart, size_t size, UNK_TYPE4 unused, OSMesgQueue* queue, void* msg); -s32 DmaMgr_SendRequest0(void* vramStart, uintptr_t vromStart, size_t size); -void DmaMgr_Start(void); -void DmaMgr_Stop(void); -void* Yaz0_FirstDMA(void); -void* Yaz0_NextDMA(void* curSrcPos); -s32 Yaz0_DecompressImpl(u8* src, u8* dst); -void Yaz0_Decompress(uintptr_t romStart, void* dst, size_t size); + void IrqMgr_AddClient(IrqMgr* irqmgr, IrqMgrClient* client, OSMesgQueue* msgQueue); void IrqMgr_RemoveClient(IrqMgr* irqmgr, IrqMgrClient* remove); void IrqMgr_SendMesgForClient(IrqMgr* irqmgr, OSMesg msg); diff --git a/include/irqmgr.h b/include/irqmgr.h index a19169dc78..203281aabe 100644 --- a/include/irqmgr.h +++ b/include/irqmgr.h @@ -23,4 +23,9 @@ typedef struct { /* 0x278 */ OSTime lastFrameTime; } IrqMgr; // size = 0x280 +extern vs32 gIrqMgrResetStatus; +extern volatile OSTime sIrqMgrResetTime; +extern volatile OSTime gIrqMgrRetraceTime; +extern s32 sIrqMgrRetraceCount; + #endif diff --git a/include/tables/dmadata/dmadata_table_us.h b/include/tables/dmadata/dmadata_table_us.h new file mode 100644 index 0000000000..b472d076f2 --- /dev/null +++ b/include/tables/dmadata/dmadata_table_us.h @@ -0,0 +1,1563 @@ +/** + * Matching dmadata layout for US 1.0 + * + * DEFINE_DMA_ENTRY should be used for normal dmadata entries + * - Argument 1: Name of the segment + * - Argument 2: String matching the original name of the segment + * + * DEFINE_DMA_ENTRY_UNSET should be used for empty dmadata entries + * - Argument 1: Name of the segment + * - Argument 2: String matching the original name of the segment + */ +DEFINE_DMA_ENTRY(makerom, "makerom") +DEFINE_DMA_ENTRY(boot, "boot") +DEFINE_DMA_ENTRY(dmadata, "dmadata") +DEFINE_DMA_ENTRY(Audiobank, "Audiobank") +DEFINE_DMA_ENTRY(Audioseq, "Audioseq") +DEFINE_DMA_ENTRY(Audiotable, "Audiotable") +DEFINE_DMA_ENTRY(kanji, "kanji") +DEFINE_DMA_ENTRY(link_animetion, "link_animetion") +DEFINE_DMA_ENTRY_UNSET(icon_item_static_syms, "icon_item_static_syms") +DEFINE_DMA_ENTRY_UNSET(icon_item_24_static_syms, "icon_item_24_static_syms") +DEFINE_DMA_ENTRY(icon_item_field_static, "icon_item_field_static") +DEFINE_DMA_ENTRY(icon_item_dungeon_static, "icon_item_dungeon_static") +DEFINE_DMA_ENTRY(icon_item_gameover_static, "icon_item_gameover_static") +DEFINE_DMA_ENTRY(icon_item_jpn_static, "icon_item_jpn_static") +DEFINE_DMA_ENTRY(icon_item_vtx_static, "icon_item_vtx_static") +DEFINE_DMA_ENTRY(map_i_static, "map_i_static") +DEFINE_DMA_ENTRY(map_grand_static, "map_grand_static") +DEFINE_DMA_ENTRY(item_name_static, "item_name_static") +DEFINE_DMA_ENTRY(map_name_static, "map_name_static") +DEFINE_DMA_ENTRY(icon_item_static_yar, "icon_item_static_yar") +DEFINE_DMA_ENTRY(icon_item_24_static_yar, "icon_item_24_static_yar") +DEFINE_DMA_ENTRY_UNSET(schedule_dma_static_syms, "schedule_dma_static_syms") +DEFINE_DMA_ENTRY(schedule_dma_static_yar, "schedule_dma_static_yar") +DEFINE_DMA_ENTRY(schedule_static, "schedule_static") +DEFINE_DMA_ENTRY(story_static, "story_static") +DEFINE_DMA_ENTRY(do_action_static, "do_action_static") +DEFINE_DMA_ENTRY(message_static, "message_static") +DEFINE_DMA_ENTRY(message_texture_static, "message_texture_static") +DEFINE_DMA_ENTRY(nes_font_static, "nes_font_static") +DEFINE_DMA_ENTRY(message_data_static, "message_data_static") +DEFINE_DMA_ENTRY(staff_message_data_static, "staff_message_data_static") +DEFINE_DMA_ENTRY(code, "code") +DEFINE_DMA_ENTRY(ovl_title, "ovl_title") +DEFINE_DMA_ENTRY(ovl_select, "ovl_select") +DEFINE_DMA_ENTRY(ovl_opening, "ovl_opening") +DEFINE_DMA_ENTRY(ovl_file_choose, "ovl_file_choose") +DEFINE_DMA_ENTRY(ovl_daytelop, "ovl_daytelop") +DEFINE_DMA_ENTRY(ovl_kaleido_scope, "ovl_kaleido_scope") +DEFINE_DMA_ENTRY(ovl_player_actor, "ovl_player_actor") +DEFINE_DMA_ENTRY(ovl_En_Test, "ovl_En_Test") +DEFINE_DMA_ENTRY(ovl_En_GirlA, "ovl_En_GirlA") +DEFINE_DMA_ENTRY(ovl_En_Part, "ovl_En_Part") +DEFINE_DMA_ENTRY(ovl_En_Light, "ovl_En_Light") +DEFINE_DMA_ENTRY(ovl_En_Door, "ovl_En_Door") +DEFINE_DMA_ENTRY(ovl_En_Box, "ovl_En_Box") +DEFINE_DMA_ENTRY(ovl_En_Pametfrog, "ovl_En_Pametfrog") +DEFINE_DMA_ENTRY(ovl_En_Okuta, "ovl_En_Okuta") +DEFINE_DMA_ENTRY(ovl_En_Bom, "ovl_En_Bom") +DEFINE_DMA_ENTRY(ovl_En_Wallmas, "ovl_En_Wallmas") +DEFINE_DMA_ENTRY(ovl_En_Dodongo, "ovl_En_Dodongo") +DEFINE_DMA_ENTRY(ovl_En_Firefly, "ovl_En_Firefly") +DEFINE_DMA_ENTRY(ovl_En_Horse, "ovl_En_Horse") +DEFINE_DMA_ENTRY(ovl_En_Arrow, "ovl_En_Arrow") +DEFINE_DMA_ENTRY(ovl_En_Elf, "ovl_En_Elf") +DEFINE_DMA_ENTRY(ovl_En_Niw, "ovl_En_Niw") +DEFINE_DMA_ENTRY(ovl_En_Tite, "ovl_En_Tite") +DEFINE_DMA_ENTRY(ovl_En_Peehat, "ovl_En_Peehat") +DEFINE_DMA_ENTRY(ovl_En_Holl, "ovl_En_Holl") +DEFINE_DMA_ENTRY(ovl_En_Dinofos, "ovl_En_Dinofos") +DEFINE_DMA_ENTRY(ovl_En_Hata, "ovl_En_Hata") +DEFINE_DMA_ENTRY(ovl_En_Zl1, "ovl_En_Zl1") +DEFINE_DMA_ENTRY(ovl_En_Viewer, "ovl_En_Viewer") +DEFINE_DMA_ENTRY(ovl_En_Bubble, "ovl_En_Bubble") +DEFINE_DMA_ENTRY(ovl_Door_Shutter, "ovl_Door_Shutter") +DEFINE_DMA_ENTRY(ovl_En_Boom, "ovl_En_Boom") +DEFINE_DMA_ENTRY(ovl_En_Torch2, "ovl_En_Torch2") +DEFINE_DMA_ENTRY(ovl_En_Minifrog, "ovl_En_Minifrog") +DEFINE_DMA_ENTRY(ovl_En_St, "ovl_En_St") +DEFINE_DMA_ENTRY(ovl_Obj_Wturn, "ovl_Obj_Wturn") +DEFINE_DMA_ENTRY(ovl_En_River_Sound, "ovl_En_River_Sound") +DEFINE_DMA_ENTRY(ovl_En_Ossan, "ovl_En_Ossan") +DEFINE_DMA_ENTRY(ovl_En_Famos, "ovl_En_Famos") +DEFINE_DMA_ENTRY(ovl_En_Bombf, "ovl_En_Bombf") +DEFINE_DMA_ENTRY(ovl_En_Am, "ovl_En_Am") +DEFINE_DMA_ENTRY(ovl_En_Dekubaba, "ovl_En_Dekubaba") +DEFINE_DMA_ENTRY(ovl_En_M_Fire1, "ovl_En_M_Fire1") +DEFINE_DMA_ENTRY(ovl_En_M_Thunder, "ovl_En_M_Thunder") +DEFINE_DMA_ENTRY(ovl_Bg_Breakwall, "ovl_Bg_Breakwall") +DEFINE_DMA_ENTRY(ovl_Door_Warp1, "ovl_Door_Warp1") +DEFINE_DMA_ENTRY(ovl_Obj_Syokudai, "ovl_Obj_Syokudai") +DEFINE_DMA_ENTRY(ovl_Item_B_Heart, "ovl_Item_B_Heart") +DEFINE_DMA_ENTRY(ovl_En_Dekunuts, "ovl_En_Dekunuts") +DEFINE_DMA_ENTRY(ovl_En_Bbfall, "ovl_En_Bbfall") +DEFINE_DMA_ENTRY(ovl_Arms_Hook, "ovl_Arms_Hook") +DEFINE_DMA_ENTRY(ovl_En_Bb, "ovl_En_Bb") +DEFINE_DMA_ENTRY(ovl_Bg_Keikoku_Spr, "ovl_Bg_Keikoku_Spr") +DEFINE_DMA_ENTRY(ovl_En_Wood02, "ovl_En_Wood02") +DEFINE_DMA_ENTRY(ovl_En_Death, "ovl_En_Death") +DEFINE_DMA_ENTRY(ovl_En_Minideath, "ovl_En_Minideath") +DEFINE_DMA_ENTRY(ovl_En_Vm, "ovl_En_Vm") +DEFINE_DMA_ENTRY(ovl_Demo_Effect, "ovl_Demo_Effect") +DEFINE_DMA_ENTRY(ovl_Demo_Kankyo, "ovl_Demo_Kankyo") +DEFINE_DMA_ENTRY(ovl_En_Floormas, "ovl_En_Floormas") +DEFINE_DMA_ENTRY(ovl_En_Rd, "ovl_En_Rd") +DEFINE_DMA_ENTRY(ovl_Bg_F40_Flift, "ovl_Bg_F40_Flift") +DEFINE_DMA_ENTRY(ovl_Obj_Mure, "ovl_Obj_Mure") +DEFINE_DMA_ENTRY(ovl_En_Sw, "ovl_En_Sw") +DEFINE_DMA_ENTRY(ovl_Object_Kankyo, "ovl_Object_Kankyo") +DEFINE_DMA_ENTRY(ovl_En_Horse_Link_Child, "ovl_En_Horse_Link_Child") +DEFINE_DMA_ENTRY(ovl_Door_Ana, "ovl_Door_Ana") +DEFINE_DMA_ENTRY(ovl_En_Encount1, "ovl_En_Encount1") +DEFINE_DMA_ENTRY(ovl_Demo_Tre_Lgt, "ovl_Demo_Tre_Lgt") +DEFINE_DMA_ENTRY(ovl_En_Encount2, "ovl_En_Encount2") +DEFINE_DMA_ENTRY(ovl_En_Fire_Rock, "ovl_En_Fire_Rock") +DEFINE_DMA_ENTRY(ovl_Bg_Ctower_Rot, "ovl_Bg_Ctower_Rot") +DEFINE_DMA_ENTRY(ovl_Mir_Ray, "ovl_Mir_Ray") +DEFINE_DMA_ENTRY(ovl_En_Sb, "ovl_En_Sb") +DEFINE_DMA_ENTRY(ovl_En_Bigslime, "ovl_En_Bigslime") +DEFINE_DMA_ENTRY(ovl_En_Karebaba, "ovl_En_Karebaba") +DEFINE_DMA_ENTRY(ovl_En_In, "ovl_En_In") +DEFINE_DMA_ENTRY(ovl_En_Bom_Chu, "ovl_En_Bom_Chu") +DEFINE_DMA_ENTRY(ovl_En_Horse_Game_Check, "ovl_En_Horse_Game_Check") +DEFINE_DMA_ENTRY(ovl_En_Rr, "ovl_En_Rr") +DEFINE_DMA_ENTRY(ovl_En_Fr, "ovl_En_Fr") +DEFINE_DMA_ENTRY(ovl_En_Fishing, "ovl_En_Fishing") +DEFINE_DMA_ENTRY(ovl_Obj_Oshihiki, "ovl_Obj_Oshihiki") +DEFINE_DMA_ENTRY(ovl_Eff_Dust, "ovl_Eff_Dust") +DEFINE_DMA_ENTRY(ovl_Bg_Umajump, "ovl_Bg_Umajump") +DEFINE_DMA_ENTRY(ovl_En_Insect, "ovl_En_Insect") +DEFINE_DMA_ENTRY(ovl_En_Butte, "ovl_En_Butte") +DEFINE_DMA_ENTRY(ovl_En_Fish, "ovl_En_Fish") +DEFINE_DMA_ENTRY(ovl_Item_Etcetera, "ovl_Item_Etcetera") +DEFINE_DMA_ENTRY(ovl_Arrow_Fire, "ovl_Arrow_Fire") +DEFINE_DMA_ENTRY(ovl_Arrow_Ice, "ovl_Arrow_Ice") +DEFINE_DMA_ENTRY(ovl_Arrow_Light, "ovl_Arrow_Light") +DEFINE_DMA_ENTRY(ovl_Obj_Kibako, "ovl_Obj_Kibako") +DEFINE_DMA_ENTRY(ovl_Obj_Tsubo, "ovl_Obj_Tsubo") +DEFINE_DMA_ENTRY(ovl_En_Ik, "ovl_En_Ik") +DEFINE_DMA_ENTRY(ovl_Demo_Shd, "ovl_Demo_Shd") +DEFINE_DMA_ENTRY(ovl_En_Dns, "ovl_En_Dns") +DEFINE_DMA_ENTRY(ovl_Elf_Msg, "ovl_Elf_Msg") +DEFINE_DMA_ENTRY(ovl_En_Honotrap, "ovl_En_Honotrap") +DEFINE_DMA_ENTRY(ovl_En_Tubo_Trap, "ovl_En_Tubo_Trap") +DEFINE_DMA_ENTRY(ovl_Obj_Ice_Poly, "ovl_Obj_Ice_Poly") +DEFINE_DMA_ENTRY(ovl_En_Fz, "ovl_En_Fz") +DEFINE_DMA_ENTRY(ovl_En_Kusa, "ovl_En_Kusa") +DEFINE_DMA_ENTRY(ovl_Obj_Bean, "ovl_Obj_Bean") +DEFINE_DMA_ENTRY(ovl_Obj_Bombiwa, "ovl_Obj_Bombiwa") +DEFINE_DMA_ENTRY(ovl_Obj_Switch, "ovl_Obj_Switch") +DEFINE_DMA_ENTRY(ovl_Obj_Lift, "ovl_Obj_Lift") +DEFINE_DMA_ENTRY(ovl_Obj_Hsblock, "ovl_Obj_Hsblock") +DEFINE_DMA_ENTRY(ovl_En_Okarina_Tag, "ovl_En_Okarina_Tag") +DEFINE_DMA_ENTRY(ovl_En_Goroiwa, "ovl_En_Goroiwa") +DEFINE_DMA_ENTRY(ovl_En_Daiku, "ovl_En_Daiku") +DEFINE_DMA_ENTRY(ovl_En_Nwc, "ovl_En_Nwc") +DEFINE_DMA_ENTRY(ovl_Item_Inbox, "ovl_Item_Inbox") +DEFINE_DMA_ENTRY(ovl_En_Ge1, "ovl_En_Ge1") +DEFINE_DMA_ENTRY(ovl_Obj_Blockstop, "ovl_Obj_Blockstop") +DEFINE_DMA_ENTRY(ovl_En_Sda, "ovl_En_Sda") +DEFINE_DMA_ENTRY(ovl_En_Clear_Tag, "ovl_En_Clear_Tag") +DEFINE_DMA_ENTRY(ovl_En_Gm, "ovl_En_Gm") +DEFINE_DMA_ENTRY(ovl_En_Ms, "ovl_En_Ms") +DEFINE_DMA_ENTRY(ovl_En_Hs, "ovl_En_Hs") +DEFINE_DMA_ENTRY(ovl_Bg_Ingate, "ovl_Bg_Ingate") +DEFINE_DMA_ENTRY(ovl_En_Kanban, "ovl_En_Kanban") +DEFINE_DMA_ENTRY(ovl_En_Attack_Niw, "ovl_En_Attack_Niw") +DEFINE_DMA_ENTRY(ovl_En_Mk, "ovl_En_Mk") +DEFINE_DMA_ENTRY(ovl_En_Owl, "ovl_En_Owl") +DEFINE_DMA_ENTRY(ovl_En_Ishi, "ovl_En_Ishi") +DEFINE_DMA_ENTRY(ovl_Obj_Hana, "ovl_Obj_Hana") +DEFINE_DMA_ENTRY(ovl_Obj_Lightswitch, "ovl_Obj_Lightswitch") +DEFINE_DMA_ENTRY(ovl_Obj_Mure2, "ovl_Obj_Mure2") +DEFINE_DMA_ENTRY(ovl_En_Fu, "ovl_En_Fu") +DEFINE_DMA_ENTRY(ovl_En_Stream, "ovl_En_Stream") +DEFINE_DMA_ENTRY(ovl_En_Mm, "ovl_En_Mm") +DEFINE_DMA_ENTRY(ovl_En_Weather_Tag, "ovl_En_Weather_Tag") +DEFINE_DMA_ENTRY(ovl_En_Ani, "ovl_En_Ani") +DEFINE_DMA_ENTRY(ovl_En_Js, "ovl_En_Js") +DEFINE_DMA_ENTRY(ovl_En_Okarina_Effect, "ovl_En_Okarina_Effect") +DEFINE_DMA_ENTRY(ovl_En_Mag, "ovl_En_Mag") +DEFINE_DMA_ENTRY(ovl_Elf_Msg2, "ovl_Elf_Msg2") +DEFINE_DMA_ENTRY(ovl_Bg_F40_Swlift, "ovl_Bg_F40_Swlift") +DEFINE_DMA_ENTRY(ovl_En_Kakasi, "ovl_En_Kakasi") +DEFINE_DMA_ENTRY(ovl_Obj_Makeoshihiki, "ovl_Obj_Makeoshihiki") +DEFINE_DMA_ENTRY(ovl_Oceff_Spot, "ovl_Oceff_Spot") +DEFINE_DMA_ENTRY(ovl_En_Torch, "ovl_En_Torch") +DEFINE_DMA_ENTRY(ovl_Shot_Sun, "ovl_Shot_Sun") +DEFINE_DMA_ENTRY(ovl_Obj_Roomtimer, "ovl_Obj_Roomtimer") +DEFINE_DMA_ENTRY(ovl_En_Ssh, "ovl_En_Ssh") +DEFINE_DMA_ENTRY(ovl_Oceff_Wipe, "ovl_Oceff_Wipe") +DEFINE_DMA_ENTRY(ovl_Effect_Ss_Dust, "ovl_Effect_Ss_Dust") +DEFINE_DMA_ENTRY(ovl_Effect_Ss_Kirakira, "ovl_Effect_Ss_Kirakira") +DEFINE_DMA_ENTRY(ovl_Effect_Ss_Bomb2, "ovl_Effect_Ss_Bomb2") +DEFINE_DMA_ENTRY(ovl_Effect_Ss_Blast, "ovl_Effect_Ss_Blast") +DEFINE_DMA_ENTRY(ovl_Effect_Ss_G_Spk, "ovl_Effect_Ss_G_Spk") +DEFINE_DMA_ENTRY(ovl_Effect_Ss_D_Fire, "ovl_Effect_Ss_D_Fire") +DEFINE_DMA_ENTRY(ovl_Effect_Ss_Bubble, "ovl_Effect_Ss_Bubble") +DEFINE_DMA_ENTRY(ovl_Effect_Ss_G_Ripple, "ovl_Effect_Ss_G_Ripple") +DEFINE_DMA_ENTRY(ovl_Effect_Ss_G_Splash, "ovl_Effect_Ss_G_Splash") +DEFINE_DMA_ENTRY(ovl_Effect_Ss_G_Fire, "ovl_Effect_Ss_G_Fire") +DEFINE_DMA_ENTRY(ovl_Effect_Ss_Lightning, "ovl_Effect_Ss_Lightning") +DEFINE_DMA_ENTRY(ovl_Effect_Ss_Dt_Bubble, "ovl_Effect_Ss_Dt_Bubble") +DEFINE_DMA_ENTRY(ovl_Effect_Ss_Hahen, "ovl_Effect_Ss_Hahen") +DEFINE_DMA_ENTRY(ovl_Effect_Ss_Stick, "ovl_Effect_Ss_Stick") +DEFINE_DMA_ENTRY(ovl_Effect_Ss_Sibuki, "ovl_Effect_Ss_Sibuki") +DEFINE_DMA_ENTRY(ovl_Effect_Ss_Stone1, "ovl_Effect_Ss_Stone1") +DEFINE_DMA_ENTRY(ovl_Effect_Ss_Hitmark, "ovl_Effect_Ss_Hitmark") +DEFINE_DMA_ENTRY(ovl_Effect_Ss_Fhg_Flash, "ovl_Effect_Ss_Fhg_Flash") +DEFINE_DMA_ENTRY(ovl_Effect_Ss_K_Fire, "ovl_Effect_Ss_K_Fire") +DEFINE_DMA_ENTRY(ovl_Effect_Ss_Solder_Srch_Ball, "ovl_Effect_Ss_Solder_Srch_Ball") +DEFINE_DMA_ENTRY(ovl_Effect_Ss_Kakera, "ovl_Effect_Ss_Kakera") +DEFINE_DMA_ENTRY(ovl_Effect_Ss_Ice_Piece, "ovl_Effect_Ss_Ice_Piece") +DEFINE_DMA_ENTRY(ovl_Effect_Ss_En_Ice, "ovl_Effect_Ss_En_Ice") +DEFINE_DMA_ENTRY(ovl_Effect_Ss_Fire_Tail, "ovl_Effect_Ss_Fire_Tail") +DEFINE_DMA_ENTRY(ovl_Effect_Ss_En_Fire, "ovl_Effect_Ss_En_Fire") +DEFINE_DMA_ENTRY(ovl_Effect_Ss_Extra, "ovl_Effect_Ss_Extra") +DEFINE_DMA_ENTRY(ovl_Effect_Ss_Dead_Db, "ovl_Effect_Ss_Dead_Db") +DEFINE_DMA_ENTRY(ovl_Effect_Ss_Dead_Dd, "ovl_Effect_Ss_Dead_Dd") +DEFINE_DMA_ENTRY(ovl_Effect_Ss_Dead_Ds, "ovl_Effect_Ss_Dead_Ds") +DEFINE_DMA_ENTRY(ovl_Oceff_Storm, "ovl_Oceff_Storm") +DEFINE_DMA_ENTRY(ovl_Obj_Demo, "ovl_Obj_Demo") +DEFINE_DMA_ENTRY(ovl_En_Minislime, "ovl_En_Minislime") +DEFINE_DMA_ENTRY(ovl_En_Nutsball, "ovl_En_Nutsball") +DEFINE_DMA_ENTRY(ovl_Oceff_Wipe2, "ovl_Oceff_Wipe2") +DEFINE_DMA_ENTRY(ovl_Oceff_Wipe3, "ovl_Oceff_Wipe3") +DEFINE_DMA_ENTRY(ovl_En_Dg, "ovl_En_Dg") +DEFINE_DMA_ENTRY(ovl_En_Si, "ovl_En_Si") +DEFINE_DMA_ENTRY(ovl_Obj_Comb, "ovl_Obj_Comb") +DEFINE_DMA_ENTRY(ovl_Obj_Kibako2, "ovl_Obj_Kibako2") +DEFINE_DMA_ENTRY(ovl_En_Hs2, "ovl_En_Hs2") +DEFINE_DMA_ENTRY(ovl_Obj_Mure3, "ovl_Obj_Mure3") +DEFINE_DMA_ENTRY(ovl_En_Tg, "ovl_En_Tg") +DEFINE_DMA_ENTRY(ovl_En_Wf, "ovl_En_Wf") +DEFINE_DMA_ENTRY(ovl_En_Skb, "ovl_En_Skb") +DEFINE_DMA_ENTRY(ovl_En_Gs, "ovl_En_Gs") +DEFINE_DMA_ENTRY(ovl_Obj_Sound, "ovl_Obj_Sound") +DEFINE_DMA_ENTRY(ovl_En_Crow, "ovl_En_Crow") +DEFINE_DMA_ENTRY(ovl_En_Cow, "ovl_En_Cow") +DEFINE_DMA_ENTRY(ovl_Oceff_Wipe4, "ovl_Oceff_Wipe4") +DEFINE_DMA_ENTRY(ovl_En_Zo, "ovl_En_Zo") +DEFINE_DMA_ENTRY(ovl_Effect_Ss_Ice_Smoke, "ovl_Effect_Ss_Ice_Smoke") +DEFINE_DMA_ENTRY(ovl_Obj_Makekinsuta, "ovl_Obj_Makekinsuta") +DEFINE_DMA_ENTRY(ovl_En_Ge3, "ovl_En_Ge3") +DEFINE_DMA_ENTRY(ovl_Obj_Hamishi, "ovl_Obj_Hamishi") +DEFINE_DMA_ENTRY(ovl_En_Zl4, "ovl_En_Zl4") +DEFINE_DMA_ENTRY(ovl_En_Mm2, "ovl_En_Mm2") +DEFINE_DMA_ENTRY(ovl_Door_Spiral, "ovl_Door_Spiral") +DEFINE_DMA_ENTRY(ovl_Obj_Pzlblock, "ovl_Obj_Pzlblock") +DEFINE_DMA_ENTRY(ovl_Obj_Toge, "ovl_Obj_Toge") +DEFINE_DMA_ENTRY(ovl_Obj_Armos, "ovl_Obj_Armos") +DEFINE_DMA_ENTRY(ovl_Obj_Boyo, "ovl_Obj_Boyo") +DEFINE_DMA_ENTRY(ovl_En_Grasshopper, "ovl_En_Grasshopper") +DEFINE_DMA_ENTRY(ovl_Obj_Grass, "ovl_Obj_Grass") +DEFINE_DMA_ENTRY(ovl_Obj_Grass_Carry, "ovl_Obj_Grass_Carry") +DEFINE_DMA_ENTRY(ovl_Obj_Grass_Unit, "ovl_Obj_Grass_Unit") +DEFINE_DMA_ENTRY(ovl_Bg_Fire_Wall, "ovl_Bg_Fire_Wall") +DEFINE_DMA_ENTRY(ovl_En_Bu, "ovl_En_Bu") +DEFINE_DMA_ENTRY(ovl_En_Encount3, "ovl_En_Encount3") +DEFINE_DMA_ENTRY(ovl_En_Jso, "ovl_En_Jso") +DEFINE_DMA_ENTRY(ovl_Obj_Chikuwa, "ovl_Obj_Chikuwa") +DEFINE_DMA_ENTRY(ovl_En_Knight, "ovl_En_Knight") +DEFINE_DMA_ENTRY(ovl_En_Warp_tag, "ovl_En_Warp_tag") +DEFINE_DMA_ENTRY(ovl_En_Aob_01, "ovl_En_Aob_01") +DEFINE_DMA_ENTRY(ovl_En_Boj_01, "ovl_En_Boj_01") +DEFINE_DMA_ENTRY(ovl_En_Boj_02, "ovl_En_Boj_02") +DEFINE_DMA_ENTRY(ovl_En_Boj_03, "ovl_En_Boj_03") +DEFINE_DMA_ENTRY(ovl_En_Encount4, "ovl_En_Encount4") +DEFINE_DMA_ENTRY(ovl_En_Bom_Bowl_Man, "ovl_En_Bom_Bowl_Man") +DEFINE_DMA_ENTRY(ovl_En_Syateki_Man, "ovl_En_Syateki_Man") +DEFINE_DMA_ENTRY(ovl_Bg_Icicle, "ovl_Bg_Icicle") +DEFINE_DMA_ENTRY(ovl_En_Syateki_Crow, "ovl_En_Syateki_Crow") +DEFINE_DMA_ENTRY(ovl_En_Boj_04, "ovl_En_Boj_04") +DEFINE_DMA_ENTRY(ovl_En_Cne_01, "ovl_En_Cne_01") +DEFINE_DMA_ENTRY(ovl_En_Bba_01, "ovl_En_Bba_01") +DEFINE_DMA_ENTRY(ovl_En_Bji_01, "ovl_En_Bji_01") +DEFINE_DMA_ENTRY(ovl_Bg_Spdweb, "ovl_Bg_Spdweb") +DEFINE_DMA_ENTRY(ovl_En_Mt_tag, "ovl_En_Mt_tag") +DEFINE_DMA_ENTRY(ovl_Boss_01, "ovl_Boss_01") +DEFINE_DMA_ENTRY(ovl_Boss_02, "ovl_Boss_02") +DEFINE_DMA_ENTRY(ovl_Boss_03, "ovl_Boss_03") +DEFINE_DMA_ENTRY(ovl_Boss_04, "ovl_Boss_04") +DEFINE_DMA_ENTRY(ovl_Boss_05, "ovl_Boss_05") +DEFINE_DMA_ENTRY(ovl_Boss_06, "ovl_Boss_06") +DEFINE_DMA_ENTRY(ovl_Boss_07, "ovl_Boss_07") +DEFINE_DMA_ENTRY(ovl_Bg_Dy_Yoseizo, "ovl_Bg_Dy_Yoseizo") +DEFINE_DMA_ENTRY(ovl_En_Boj_05, "ovl_En_Boj_05") +DEFINE_DMA_ENTRY(ovl_En_Sob1, "ovl_En_Sob1") +DEFINE_DMA_ENTRY(ovl_En_Go, "ovl_En_Go") +DEFINE_DMA_ENTRY(ovl_En_Raf, "ovl_En_Raf") +DEFINE_DMA_ENTRY(ovl_Obj_Funen, "ovl_Obj_Funen") +DEFINE_DMA_ENTRY(ovl_Obj_Raillift, "ovl_Obj_Raillift") +DEFINE_DMA_ENTRY(ovl_Bg_Numa_Hana, "ovl_Bg_Numa_Hana") +DEFINE_DMA_ENTRY(ovl_Obj_Flowerpot, "ovl_Obj_Flowerpot") +DEFINE_DMA_ENTRY(ovl_Obj_Spinyroll, "ovl_Obj_Spinyroll") +DEFINE_DMA_ENTRY(ovl_Dm_Hina, "ovl_Dm_Hina") +DEFINE_DMA_ENTRY(ovl_En_Syateki_Wf, "ovl_En_Syateki_Wf") +DEFINE_DMA_ENTRY(ovl_Obj_Skateblock, "ovl_Obj_Skateblock") +DEFINE_DMA_ENTRY(ovl_Effect_En_Ice_Block, "ovl_Effect_En_Ice_Block") +DEFINE_DMA_ENTRY(ovl_Obj_Iceblock, "ovl_Obj_Iceblock") +DEFINE_DMA_ENTRY(ovl_En_Bigpamet, "ovl_En_Bigpamet") +DEFINE_DMA_ENTRY(ovl_Bg_Dblue_Movebg, "ovl_Bg_Dblue_Movebg") +DEFINE_DMA_ENTRY(ovl_En_Syateki_Dekunuts, "ovl_En_Syateki_Dekunuts") +DEFINE_DMA_ENTRY(ovl_Elf_Msg3, "ovl_Elf_Msg3") +DEFINE_DMA_ENTRY(ovl_En_Fg, "ovl_En_Fg") +DEFINE_DMA_ENTRY(ovl_Dm_Ravine, "ovl_Dm_Ravine") +DEFINE_DMA_ENTRY(ovl_Dm_Sa, "ovl_Dm_Sa") +DEFINE_DMA_ENTRY(ovl_En_Slime, "ovl_En_Slime") +DEFINE_DMA_ENTRY(ovl_En_Pr, "ovl_En_Pr") +DEFINE_DMA_ENTRY(ovl_Obj_Toudai, "ovl_Obj_Toudai") +DEFINE_DMA_ENTRY(ovl_Obj_Entotu, "ovl_Obj_Entotu") +DEFINE_DMA_ENTRY(ovl_Obj_Bell, "ovl_Obj_Bell") +DEFINE_DMA_ENTRY(ovl_En_Syateki_Okuta, "ovl_En_Syateki_Okuta") +DEFINE_DMA_ENTRY(ovl_Obj_Shutter, "ovl_Obj_Shutter") +DEFINE_DMA_ENTRY(ovl_Dm_Zl, "ovl_Dm_Zl") +DEFINE_DMA_ENTRY(ovl_En_Ru, "ovl_En_Ru") +DEFINE_DMA_ENTRY(ovl_En_Elfgrp, "ovl_En_Elfgrp") +DEFINE_DMA_ENTRY(ovl_Dm_Tsg, "ovl_Dm_Tsg") +DEFINE_DMA_ENTRY(ovl_En_Baguo, "ovl_En_Baguo") +DEFINE_DMA_ENTRY(ovl_Obj_Vspinyroll, "ovl_Obj_Vspinyroll") +DEFINE_DMA_ENTRY(ovl_Obj_Smork, "ovl_Obj_Smork") +DEFINE_DMA_ENTRY(ovl_En_Test2, "ovl_En_Test2") +DEFINE_DMA_ENTRY(ovl_En_Test3, "ovl_En_Test3") +DEFINE_DMA_ENTRY(ovl_En_Test4, "ovl_En_Test4") +DEFINE_DMA_ENTRY(ovl_En_Bat, "ovl_En_Bat") +DEFINE_DMA_ENTRY(ovl_En_Sekihi, "ovl_En_Sekihi") +DEFINE_DMA_ENTRY(ovl_En_Wiz, "ovl_En_Wiz") +DEFINE_DMA_ENTRY(ovl_En_Wiz_Brock, "ovl_En_Wiz_Brock") +DEFINE_DMA_ENTRY(ovl_En_Wiz_Fire, "ovl_En_Wiz_Fire") +DEFINE_DMA_ENTRY(ovl_Eff_Change, "ovl_Eff_Change") +DEFINE_DMA_ENTRY(ovl_Dm_Statue, "ovl_Dm_Statue") +DEFINE_DMA_ENTRY(ovl_Obj_Fireshield, "ovl_Obj_Fireshield") +DEFINE_DMA_ENTRY(ovl_Bg_Ladder, "ovl_Bg_Ladder") +DEFINE_DMA_ENTRY(ovl_En_Mkk, "ovl_En_Mkk") +DEFINE_DMA_ENTRY(ovl_Demo_Getitem, "ovl_Demo_Getitem") +DEFINE_DMA_ENTRY(ovl_En_Dnb, "ovl_En_Dnb") +DEFINE_DMA_ENTRY(ovl_En_Dnh, "ovl_En_Dnh") +DEFINE_DMA_ENTRY(ovl_En_Dnk, "ovl_En_Dnk") +DEFINE_DMA_ENTRY(ovl_En_Dnq, "ovl_En_Dnq") +DEFINE_DMA_ENTRY(ovl_Bg_Keikoku_Saku, "ovl_Bg_Keikoku_Saku") +DEFINE_DMA_ENTRY(ovl_Obj_Hugebombiwa, "ovl_Obj_Hugebombiwa") +DEFINE_DMA_ENTRY(ovl_En_Firefly2, "ovl_En_Firefly2") +DEFINE_DMA_ENTRY(ovl_En_Rat, "ovl_En_Rat") +DEFINE_DMA_ENTRY(ovl_En_Water_Effect, "ovl_En_Water_Effect") +DEFINE_DMA_ENTRY(ovl_En_Kusa2, "ovl_En_Kusa2") +DEFINE_DMA_ENTRY(ovl_Bg_Spout_Fire, "ovl_Bg_Spout_Fire") +DEFINE_DMA_ENTRY(ovl_En_Dy_Extra, "ovl_En_Dy_Extra") +DEFINE_DMA_ENTRY(ovl_En_Bal, "ovl_En_Bal") +DEFINE_DMA_ENTRY(ovl_En_Ginko_Man, "ovl_En_Ginko_Man") +DEFINE_DMA_ENTRY(ovl_En_Warp_Uzu, "ovl_En_Warp_Uzu") +DEFINE_DMA_ENTRY(ovl_Obj_Driftice, "ovl_Obj_Driftice") +DEFINE_DMA_ENTRY(ovl_En_Look_Nuts, "ovl_En_Look_Nuts") +DEFINE_DMA_ENTRY(ovl_En_Mushi2, "ovl_En_Mushi2") +DEFINE_DMA_ENTRY(ovl_En_Fall, "ovl_En_Fall") +DEFINE_DMA_ENTRY(ovl_En_Mm3, "ovl_En_Mm3") +DEFINE_DMA_ENTRY(ovl_Bg_Crace_Movebg, "ovl_Bg_Crace_Movebg") +DEFINE_DMA_ENTRY(ovl_En_Dno, "ovl_En_Dno") +DEFINE_DMA_ENTRY(ovl_En_Pr2, "ovl_En_Pr2") +DEFINE_DMA_ENTRY(ovl_En_Prz, "ovl_En_Prz") +DEFINE_DMA_ENTRY(ovl_En_Jso2, "ovl_En_Jso2") +DEFINE_DMA_ENTRY(ovl_Obj_Etcetera, "ovl_Obj_Etcetera") +DEFINE_DMA_ENTRY(ovl_En_Egol, "ovl_En_Egol") +DEFINE_DMA_ENTRY(ovl_Obj_Mine, "ovl_Obj_Mine") +DEFINE_DMA_ENTRY(ovl_Obj_Purify, "ovl_Obj_Purify") +DEFINE_DMA_ENTRY(ovl_En_Tru, "ovl_En_Tru") +DEFINE_DMA_ENTRY(ovl_En_Trt, "ovl_En_Trt") +DEFINE_DMA_ENTRY(ovl_En_Test5, "ovl_En_Test5") +DEFINE_DMA_ENTRY(ovl_En_Test6, "ovl_En_Test6") +DEFINE_DMA_ENTRY(ovl_En_Az, "ovl_En_Az") +DEFINE_DMA_ENTRY(ovl_En_Estone, "ovl_En_Estone") +DEFINE_DMA_ENTRY(ovl_Bg_Hakugin_Post, "ovl_Bg_Hakugin_Post") +DEFINE_DMA_ENTRY(ovl_Dm_Opstage, "ovl_Dm_Opstage") +DEFINE_DMA_ENTRY(ovl_Dm_Stk, "ovl_Dm_Stk") +DEFINE_DMA_ENTRY(ovl_Dm_Char00, "ovl_Dm_Char00") +DEFINE_DMA_ENTRY(ovl_Dm_Char01, "ovl_Dm_Char01") +DEFINE_DMA_ENTRY(ovl_Dm_Char02, "ovl_Dm_Char02") +DEFINE_DMA_ENTRY(ovl_Dm_Char03, "ovl_Dm_Char03") +DEFINE_DMA_ENTRY(ovl_Dm_Char04, "ovl_Dm_Char04") +DEFINE_DMA_ENTRY(ovl_Dm_Char05, "ovl_Dm_Char05") +DEFINE_DMA_ENTRY(ovl_Dm_Char06, "ovl_Dm_Char06") +DEFINE_DMA_ENTRY(ovl_Dm_Char07, "ovl_Dm_Char07") +DEFINE_DMA_ENTRY(ovl_Dm_Char08, "ovl_Dm_Char08") +DEFINE_DMA_ENTRY(ovl_Dm_Char09, "ovl_Dm_Char09") +DEFINE_DMA_ENTRY(ovl_Obj_Tokeidai, "ovl_Obj_Tokeidai") +DEFINE_DMA_ENTRY(ovl_En_Mnk, "ovl_En_Mnk") +DEFINE_DMA_ENTRY(ovl_En_Egblock, "ovl_En_Egblock") +DEFINE_DMA_ENTRY(ovl_En_Guard_Nuts, "ovl_En_Guard_Nuts") +DEFINE_DMA_ENTRY(ovl_Bg_Hakugin_Bombwall, "ovl_Bg_Hakugin_Bombwall") +DEFINE_DMA_ENTRY(ovl_Obj_Tokei_Tobira, "ovl_Obj_Tokei_Tobira") +DEFINE_DMA_ENTRY(ovl_Bg_Hakugin_Elvpole, "ovl_Bg_Hakugin_Elvpole") +DEFINE_DMA_ENTRY(ovl_En_Ma4, "ovl_En_Ma4") +DEFINE_DMA_ENTRY(ovl_En_Twig, "ovl_En_Twig") +DEFINE_DMA_ENTRY(ovl_En_Po_Fusen, "ovl_En_Po_Fusen") +DEFINE_DMA_ENTRY(ovl_En_Door_Etc, "ovl_En_Door_Etc") +DEFINE_DMA_ENTRY(ovl_En_Bigokuta, "ovl_En_Bigokuta") +DEFINE_DMA_ENTRY(ovl_Bg_Icefloe, "ovl_Bg_Icefloe") +DEFINE_DMA_ENTRY(ovl_fbdemo_triforce, "ovl_fbdemo_triforce") +DEFINE_DMA_ENTRY(ovl_fbdemo_wipe1, "ovl_fbdemo_wipe1") +DEFINE_DMA_ENTRY(ovl_fbdemo_wipe3, "ovl_fbdemo_wipe3") +DEFINE_DMA_ENTRY(ovl_fbdemo_wipe4, "ovl_fbdemo_wipe4") +DEFINE_DMA_ENTRY(ovl_fbdemo_wipe5, "ovl_fbdemo_wipe5") +DEFINE_DMA_ENTRY(ovl_Effect_Ss_Sbn, "ovl_Effect_Ss_Sbn") +DEFINE_DMA_ENTRY(ovl_Obj_Ocarinalift, "ovl_Obj_Ocarinalift") +DEFINE_DMA_ENTRY(ovl_En_Time_Tag, "ovl_En_Time_Tag") +DEFINE_DMA_ENTRY(ovl_Bg_Open_Shutter, "ovl_Bg_Open_Shutter") +DEFINE_DMA_ENTRY(ovl_Bg_Open_Spot, "ovl_Bg_Open_Spot") +DEFINE_DMA_ENTRY(ovl_Bg_Fu_Kaiten, "ovl_Bg_Fu_Kaiten") +DEFINE_DMA_ENTRY(ovl_Obj_Aqua, "ovl_Obj_Aqua") +DEFINE_DMA_ENTRY(ovl_En_Elforg, "ovl_En_Elforg") +DEFINE_DMA_ENTRY(ovl_En_Elfbub, "ovl_En_Elfbub") +DEFINE_DMA_ENTRY(ovl_En_Fu_Mato, "ovl_En_Fu_Mato") +DEFINE_DMA_ENTRY(ovl_En_Fu_Kago, "ovl_En_Fu_Kago") +DEFINE_DMA_ENTRY(ovl_En_Osn, "ovl_En_Osn") +DEFINE_DMA_ENTRY(ovl_Bg_Ctower_Gear, "ovl_Bg_Ctower_Gear") +DEFINE_DMA_ENTRY(ovl_En_Trt2, "ovl_En_Trt2") +DEFINE_DMA_ENTRY(ovl_Obj_Tokei_Step, "ovl_Obj_Tokei_Step") +DEFINE_DMA_ENTRY(ovl_Bg_Lotus, "ovl_Bg_Lotus") +DEFINE_DMA_ENTRY(ovl_En_Kame, "ovl_En_Kame") +DEFINE_DMA_ENTRY(ovl_Obj_Takaraya_Wall, "ovl_Obj_Takaraya_Wall") +DEFINE_DMA_ENTRY(ovl_Bg_Fu_Mizu, "ovl_Bg_Fu_Mizu") +DEFINE_DMA_ENTRY(ovl_En_Sellnuts, "ovl_En_Sellnuts") +DEFINE_DMA_ENTRY(ovl_Bg_Dkjail_Ivy, "ovl_Bg_Dkjail_Ivy") +DEFINE_DMA_ENTRY(ovl_Obj_Visiblock, "ovl_Obj_Visiblock") +DEFINE_DMA_ENTRY(ovl_En_Takaraya, "ovl_En_Takaraya") +DEFINE_DMA_ENTRY(ovl_En_Tsn, "ovl_En_Tsn") +DEFINE_DMA_ENTRY(ovl_En_Ds2n, "ovl_En_Ds2n") +DEFINE_DMA_ENTRY(ovl_En_Fsn, "ovl_En_Fsn") +DEFINE_DMA_ENTRY(ovl_En_Shn, "ovl_En_Shn") +DEFINE_DMA_ENTRY(ovl_En_Stop_heishi, "ovl_En_Stop_heishi") +DEFINE_DMA_ENTRY(ovl_Obj_Bigicicle, "ovl_Obj_Bigicicle") +DEFINE_DMA_ENTRY(ovl_En_Lift_Nuts, "ovl_En_Lift_Nuts") +DEFINE_DMA_ENTRY(ovl_En_Tk, "ovl_En_Tk") +DEFINE_DMA_ENTRY(ovl_Bg_Market_Step, "ovl_Bg_Market_Step") +DEFINE_DMA_ENTRY(ovl_Obj_Lupygamelift, "ovl_Obj_Lupygamelift") +DEFINE_DMA_ENTRY(ovl_En_Test7, "ovl_En_Test7") +DEFINE_DMA_ENTRY(ovl_Obj_Lightblock, "ovl_Obj_Lightblock") +DEFINE_DMA_ENTRY(ovl_Mir_Ray2, "ovl_Mir_Ray2") +DEFINE_DMA_ENTRY(ovl_En_Wdhand, "ovl_En_Wdhand") +DEFINE_DMA_ENTRY(ovl_En_Gamelupy, "ovl_En_Gamelupy") +DEFINE_DMA_ENTRY(ovl_Bg_Danpei_Movebg, "ovl_Bg_Danpei_Movebg") +DEFINE_DMA_ENTRY(ovl_En_Snowwd, "ovl_En_Snowwd") +DEFINE_DMA_ENTRY(ovl_En_Pm, "ovl_En_Pm") +DEFINE_DMA_ENTRY(ovl_En_Gakufu, "ovl_En_Gakufu") +DEFINE_DMA_ENTRY(ovl_Elf_Msg4, "ovl_Elf_Msg4") +DEFINE_DMA_ENTRY(ovl_Elf_Msg5, "ovl_Elf_Msg5") +DEFINE_DMA_ENTRY(ovl_En_Col_Man, "ovl_En_Col_Man") +DEFINE_DMA_ENTRY(ovl_En_Talk_Gibud, "ovl_En_Talk_Gibud") +DEFINE_DMA_ENTRY(ovl_En_Giant, "ovl_En_Giant") +DEFINE_DMA_ENTRY(ovl_Obj_Snowball, "ovl_Obj_Snowball") +DEFINE_DMA_ENTRY(ovl_Boss_Hakugin, "ovl_Boss_Hakugin") +DEFINE_DMA_ENTRY(ovl_En_Gb2, "ovl_En_Gb2") +DEFINE_DMA_ENTRY(ovl_En_Onpuman, "ovl_En_Onpuman") +DEFINE_DMA_ENTRY(ovl_Bg_Tobira01, "ovl_Bg_Tobira01") +DEFINE_DMA_ENTRY(ovl_En_Tag_Obj, "ovl_En_Tag_Obj") +DEFINE_DMA_ENTRY(ovl_Obj_Dhouse, "ovl_Obj_Dhouse") +DEFINE_DMA_ENTRY(ovl_Obj_Hakaisi, "ovl_Obj_Hakaisi") +DEFINE_DMA_ENTRY(ovl_Bg_Hakugin_Switch, "ovl_Bg_Hakugin_Switch") +DEFINE_DMA_ENTRY(ovl_En_Snowman, "ovl_En_Snowman") +DEFINE_DMA_ENTRY(ovl_TG_Sw, "ovl_TG_Sw") +DEFINE_DMA_ENTRY(ovl_En_Po_Sisters, "ovl_En_Po_Sisters") +DEFINE_DMA_ENTRY(ovl_En_Pp, "ovl_En_Pp") +DEFINE_DMA_ENTRY(ovl_En_Hakurock, "ovl_En_Hakurock") +DEFINE_DMA_ENTRY(ovl_En_Hanabi, "ovl_En_Hanabi") +DEFINE_DMA_ENTRY(ovl_Obj_Dowsing, "ovl_Obj_Dowsing") +DEFINE_DMA_ENTRY(ovl_Obj_Wind, "ovl_Obj_Wind") +DEFINE_DMA_ENTRY(ovl_En_Racedog, "ovl_En_Racedog") +DEFINE_DMA_ENTRY(ovl_En_Kendo_Js, "ovl_En_Kendo_Js") +DEFINE_DMA_ENTRY(ovl_Bg_Botihasira, "ovl_Bg_Botihasira") +DEFINE_DMA_ENTRY(ovl_En_Fish2, "ovl_En_Fish2") +DEFINE_DMA_ENTRY(ovl_En_Pst, "ovl_En_Pst") +DEFINE_DMA_ENTRY(ovl_En_Poh, "ovl_En_Poh") +DEFINE_DMA_ENTRY(ovl_Obj_Spidertent, "ovl_Obj_Spidertent") +DEFINE_DMA_ENTRY(ovl_En_Zoraegg, "ovl_En_Zoraegg") +DEFINE_DMA_ENTRY(ovl_En_Kbt, "ovl_En_Kbt") +DEFINE_DMA_ENTRY(ovl_En_Gg, "ovl_En_Gg") +DEFINE_DMA_ENTRY(ovl_En_Maruta, "ovl_En_Maruta") +DEFINE_DMA_ENTRY(ovl_Obj_Snowball2, "ovl_Obj_Snowball2") +DEFINE_DMA_ENTRY(ovl_En_Gg2, "ovl_En_Gg2") +DEFINE_DMA_ENTRY(ovl_Obj_Ghaka, "ovl_Obj_Ghaka") +DEFINE_DMA_ENTRY(ovl_En_Dnp, "ovl_En_Dnp") +DEFINE_DMA_ENTRY(ovl_En_Dai, "ovl_En_Dai") +DEFINE_DMA_ENTRY(ovl_Bg_Goron_Oyu, "ovl_Bg_Goron_Oyu") +DEFINE_DMA_ENTRY(ovl_En_Kgy, "ovl_En_Kgy") +DEFINE_DMA_ENTRY(ovl_En_Invadepoh, "ovl_En_Invadepoh") +DEFINE_DMA_ENTRY(ovl_En_Gk, "ovl_En_Gk") +DEFINE_DMA_ENTRY(ovl_En_An, "ovl_En_An") +DEFINE_DMA_ENTRY(ovl_En_Bee, "ovl_En_Bee") +DEFINE_DMA_ENTRY(ovl_En_Ot, "ovl_En_Ot") +DEFINE_DMA_ENTRY(ovl_En_Dragon, "ovl_En_Dragon") +DEFINE_DMA_ENTRY(ovl_Obj_Dora, "ovl_Obj_Dora") +DEFINE_DMA_ENTRY(ovl_En_Bigpo, "ovl_En_Bigpo") +DEFINE_DMA_ENTRY(ovl_Obj_Kendo_Kanban, "ovl_Obj_Kendo_Kanban") +DEFINE_DMA_ENTRY(ovl_Obj_Hariko, "ovl_Obj_Hariko") +DEFINE_DMA_ENTRY(ovl_En_Sth, "ovl_En_Sth") +DEFINE_DMA_ENTRY(ovl_Bg_Sinkai_Kabe, "ovl_Bg_Sinkai_Kabe") +DEFINE_DMA_ENTRY(ovl_Bg_Haka_Curtain, "ovl_Bg_Haka_Curtain") +DEFINE_DMA_ENTRY(ovl_Bg_Kin2_Bombwall, "ovl_Bg_Kin2_Bombwall") +DEFINE_DMA_ENTRY(ovl_Bg_Kin2_Fence, "ovl_Bg_Kin2_Fence") +DEFINE_DMA_ENTRY(ovl_Bg_Kin2_Picture, "ovl_Bg_Kin2_Picture") +DEFINE_DMA_ENTRY(ovl_Bg_Kin2_Shelf, "ovl_Bg_Kin2_Shelf") +DEFINE_DMA_ENTRY(ovl_En_Rail_Skb, "ovl_En_Rail_Skb") +DEFINE_DMA_ENTRY(ovl_En_Jg, "ovl_En_Jg") +DEFINE_DMA_ENTRY(ovl_En_Tru_Mt, "ovl_En_Tru_Mt") +DEFINE_DMA_ENTRY(ovl_Obj_Um, "ovl_Obj_Um") +DEFINE_DMA_ENTRY(ovl_En_Neo_Reeba, "ovl_En_Neo_Reeba") +DEFINE_DMA_ENTRY(ovl_Bg_Mbar_Chair, "ovl_Bg_Mbar_Chair") +DEFINE_DMA_ENTRY(ovl_Bg_Ikana_Block, "ovl_Bg_Ikana_Block") +DEFINE_DMA_ENTRY(ovl_Bg_Ikana_Mirror, "ovl_Bg_Ikana_Mirror") +DEFINE_DMA_ENTRY(ovl_Bg_Ikana_Rotaryroom, "ovl_Bg_Ikana_Rotaryroom") +DEFINE_DMA_ENTRY(ovl_Bg_Dblue_Balance, "ovl_Bg_Dblue_Balance") +DEFINE_DMA_ENTRY(ovl_Bg_Dblue_Waterfall, "ovl_Bg_Dblue_Waterfall") +DEFINE_DMA_ENTRY(ovl_En_Kaizoku, "ovl_En_Kaizoku") +DEFINE_DMA_ENTRY(ovl_En_Ge2, "ovl_En_Ge2") +DEFINE_DMA_ENTRY(ovl_En_Ma_Yts, "ovl_En_Ma_Yts") +DEFINE_DMA_ENTRY(ovl_En_Ma_Yto, "ovl_En_Ma_Yto") +DEFINE_DMA_ENTRY(ovl_Obj_Tokei_Turret, "ovl_Obj_Tokei_Turret") +DEFINE_DMA_ENTRY(ovl_Bg_Dblue_Elevator, "ovl_Bg_Dblue_Elevator") +DEFINE_DMA_ENTRY(ovl_Obj_Warpstone, "ovl_Obj_Warpstone") +DEFINE_DMA_ENTRY(ovl_En_Zog, "ovl_En_Zog") +DEFINE_DMA_ENTRY(ovl_Obj_Rotlift, "ovl_Obj_Rotlift") +DEFINE_DMA_ENTRY(ovl_Obj_Jg_Gakki, "ovl_Obj_Jg_Gakki") +DEFINE_DMA_ENTRY(ovl_Bg_Inibs_Movebg, "ovl_Bg_Inibs_Movebg") +DEFINE_DMA_ENTRY(ovl_En_Zot, "ovl_En_Zot") +DEFINE_DMA_ENTRY(ovl_Obj_Tree, "ovl_Obj_Tree") +DEFINE_DMA_ENTRY(ovl_Obj_Y2lift, "ovl_Obj_Y2lift") +DEFINE_DMA_ENTRY(ovl_Obj_Y2shutter, "ovl_Obj_Y2shutter") +DEFINE_DMA_ENTRY(ovl_Obj_Boat, "ovl_Obj_Boat") +DEFINE_DMA_ENTRY(ovl_Obj_Taru, "ovl_Obj_Taru") +DEFINE_DMA_ENTRY(ovl_Obj_Hunsui, "ovl_Obj_Hunsui") +DEFINE_DMA_ENTRY(ovl_En_Jc_Mato, "ovl_En_Jc_Mato") +DEFINE_DMA_ENTRY(ovl_Mir_Ray3, "ovl_Mir_Ray3") +DEFINE_DMA_ENTRY(ovl_En_Zob, "ovl_En_Zob") +DEFINE_DMA_ENTRY(ovl_Elf_Msg6, "ovl_Elf_Msg6") +DEFINE_DMA_ENTRY(ovl_Obj_Nozoki, "ovl_Obj_Nozoki") +DEFINE_DMA_ENTRY(ovl_En_Toto, "ovl_En_Toto") +DEFINE_DMA_ENTRY(ovl_En_Railgibud, "ovl_En_Railgibud") +DEFINE_DMA_ENTRY(ovl_En_Baba, "ovl_En_Baba") +DEFINE_DMA_ENTRY(ovl_En_Suttari, "ovl_En_Suttari") +DEFINE_DMA_ENTRY(ovl_En_Zod, "ovl_En_Zod") +DEFINE_DMA_ENTRY(ovl_En_Kujiya, "ovl_En_Kujiya") +DEFINE_DMA_ENTRY(ovl_En_Geg, "ovl_En_Geg") +DEFINE_DMA_ENTRY(ovl_Obj_Kinoko, "ovl_Obj_Kinoko") +DEFINE_DMA_ENTRY(ovl_Obj_Yasi, "ovl_Obj_Yasi") +DEFINE_DMA_ENTRY(ovl_En_Tanron1, "ovl_En_Tanron1") +DEFINE_DMA_ENTRY(ovl_En_Tanron2, "ovl_En_Tanron2") +DEFINE_DMA_ENTRY(ovl_En_Tanron3, "ovl_En_Tanron3") +DEFINE_DMA_ENTRY(ovl_Obj_Chan, "ovl_Obj_Chan") +DEFINE_DMA_ENTRY(ovl_En_Zos, "ovl_En_Zos") +DEFINE_DMA_ENTRY(ovl_En_S_Goro, "ovl_En_S_Goro") +DEFINE_DMA_ENTRY(ovl_En_Nb, "ovl_En_Nb") +DEFINE_DMA_ENTRY(ovl_En_Ja, "ovl_En_Ja") +DEFINE_DMA_ENTRY(ovl_Bg_F40_Block, "ovl_Bg_F40_Block") +DEFINE_DMA_ENTRY(ovl_Bg_F40_Switch, "ovl_Bg_F40_Switch") +DEFINE_DMA_ENTRY(ovl_En_Po_Composer, "ovl_En_Po_Composer") +DEFINE_DMA_ENTRY(ovl_En_Guruguru, "ovl_En_Guruguru") +DEFINE_DMA_ENTRY(ovl_Oceff_Wipe5, "ovl_Oceff_Wipe5") +DEFINE_DMA_ENTRY(ovl_En_Stone_heishi, "ovl_En_Stone_heishi") +DEFINE_DMA_ENTRY(ovl_Oceff_Wipe6, "ovl_Oceff_Wipe6") +DEFINE_DMA_ENTRY(ovl_En_Scopenuts, "ovl_En_Scopenuts") +DEFINE_DMA_ENTRY(ovl_En_Scopecrow, "ovl_En_Scopecrow") +DEFINE_DMA_ENTRY(ovl_Oceff_Wipe7, "ovl_Oceff_Wipe7") +DEFINE_DMA_ENTRY(ovl_Eff_Kamejima_Wave, "ovl_Eff_Kamejima_Wave") +DEFINE_DMA_ENTRY(ovl_En_Hg, "ovl_En_Hg") +DEFINE_DMA_ENTRY(ovl_En_Hgo, "ovl_En_Hgo") +DEFINE_DMA_ENTRY(ovl_En_Zov, "ovl_En_Zov") +DEFINE_DMA_ENTRY(ovl_En_Ah, "ovl_En_Ah") +DEFINE_DMA_ENTRY(ovl_Obj_Hgdoor, "ovl_Obj_Hgdoor") +DEFINE_DMA_ENTRY(ovl_Bg_Ikana_Bombwall, "ovl_Bg_Ikana_Bombwall") +DEFINE_DMA_ENTRY(ovl_Bg_Ikana_Ray, "ovl_Bg_Ikana_Ray") +DEFINE_DMA_ENTRY(ovl_Bg_Ikana_Shutter, "ovl_Bg_Ikana_Shutter") +DEFINE_DMA_ENTRY(ovl_Bg_Haka_Bombwall, "ovl_Bg_Haka_Bombwall") +DEFINE_DMA_ENTRY(ovl_Bg_Haka_Tomb, "ovl_Bg_Haka_Tomb") +DEFINE_DMA_ENTRY(ovl_En_Sc_Ruppe, "ovl_En_Sc_Ruppe") +DEFINE_DMA_ENTRY(ovl_Bg_Iknv_Doukutu, "ovl_Bg_Iknv_Doukutu") +DEFINE_DMA_ENTRY(ovl_Bg_Iknv_Obj, "ovl_Bg_Iknv_Obj") +DEFINE_DMA_ENTRY(ovl_En_Pamera, "ovl_En_Pamera") +DEFINE_DMA_ENTRY(ovl_Obj_HsStump, "ovl_Obj_HsStump") +DEFINE_DMA_ENTRY(ovl_En_Hidden_Nuts, "ovl_En_Hidden_Nuts") +DEFINE_DMA_ENTRY(ovl_En_Zow, "ovl_En_Zow") +DEFINE_DMA_ENTRY(ovl_En_Talk, "ovl_En_Talk") +DEFINE_DMA_ENTRY(ovl_En_Al, "ovl_En_Al") +DEFINE_DMA_ENTRY(ovl_En_Tab, "ovl_En_Tab") +DEFINE_DMA_ENTRY(ovl_En_Nimotsu, "ovl_En_Nimotsu") +DEFINE_DMA_ENTRY(ovl_En_Hit_Tag, "ovl_En_Hit_Tag") +DEFINE_DMA_ENTRY(ovl_En_Ruppecrow, "ovl_En_Ruppecrow") +DEFINE_DMA_ENTRY(ovl_En_Tanron4, "ovl_En_Tanron4") +DEFINE_DMA_ENTRY(ovl_En_Tanron5, "ovl_En_Tanron5") +DEFINE_DMA_ENTRY(ovl_En_Tanron6, "ovl_En_Tanron6") +DEFINE_DMA_ENTRY(ovl_En_Daiku2, "ovl_En_Daiku2") +DEFINE_DMA_ENTRY(ovl_En_Muto, "ovl_En_Muto") +DEFINE_DMA_ENTRY(ovl_En_Baisen, "ovl_En_Baisen") +DEFINE_DMA_ENTRY(ovl_En_Heishi, "ovl_En_Heishi") +DEFINE_DMA_ENTRY(ovl_En_Demo_heishi, "ovl_En_Demo_heishi") +DEFINE_DMA_ENTRY(ovl_En_Dt, "ovl_En_Dt") +DEFINE_DMA_ENTRY(ovl_En_Cha, "ovl_En_Cha") +DEFINE_DMA_ENTRY(ovl_Obj_Dinner, "ovl_Obj_Dinner") +DEFINE_DMA_ENTRY(ovl_Eff_Lastday, "ovl_Eff_Lastday") +DEFINE_DMA_ENTRY(ovl_Bg_Ikana_Dharma, "ovl_Bg_Ikana_Dharma") +DEFINE_DMA_ENTRY(ovl_En_Akindonuts, "ovl_En_Akindonuts") +DEFINE_DMA_ENTRY(ovl_Eff_Stk, "ovl_Eff_Stk") +DEFINE_DMA_ENTRY(ovl_En_Ig, "ovl_En_Ig") +DEFINE_DMA_ENTRY(ovl_En_Rg, "ovl_En_Rg") +DEFINE_DMA_ENTRY(ovl_En_Osk, "ovl_En_Osk") +DEFINE_DMA_ENTRY(ovl_En_Sth2, "ovl_En_Sth2") +DEFINE_DMA_ENTRY(ovl_En_Yb, "ovl_En_Yb") +DEFINE_DMA_ENTRY(ovl_En_Rz, "ovl_En_Rz") +DEFINE_DMA_ENTRY(ovl_En_Scopecoin, "ovl_En_Scopecoin") +DEFINE_DMA_ENTRY(ovl_En_Bjt, "ovl_En_Bjt") +DEFINE_DMA_ENTRY(ovl_En_Bomjima, "ovl_En_Bomjima") +DEFINE_DMA_ENTRY(ovl_En_Bomjimb, "ovl_En_Bomjimb") +DEFINE_DMA_ENTRY(ovl_En_Bombers, "ovl_En_Bombers") +DEFINE_DMA_ENTRY(ovl_En_Bombers2, "ovl_En_Bombers2") +DEFINE_DMA_ENTRY(ovl_En_Bombal, "ovl_En_Bombal") +DEFINE_DMA_ENTRY(ovl_Obj_Moon_Stone, "ovl_Obj_Moon_Stone") +DEFINE_DMA_ENTRY(ovl_Obj_Mu_Pict, "ovl_Obj_Mu_Pict") +DEFINE_DMA_ENTRY(ovl_Bg_Ikninside, "ovl_Bg_Ikninside") +DEFINE_DMA_ENTRY(ovl_Eff_Zoraband, "ovl_Eff_Zoraband") +DEFINE_DMA_ENTRY(ovl_Obj_Kepn_Koya, "ovl_Obj_Kepn_Koya") +DEFINE_DMA_ENTRY(ovl_Obj_Usiyane, "ovl_Obj_Usiyane") +DEFINE_DMA_ENTRY(ovl_En_Nnh, "ovl_En_Nnh") +DEFINE_DMA_ENTRY(ovl_Obj_Kzsaku, "ovl_Obj_Kzsaku") +DEFINE_DMA_ENTRY(ovl_Obj_Milk_Bin, "ovl_Obj_Milk_Bin") +DEFINE_DMA_ENTRY(ovl_En_Kitan, "ovl_En_Kitan") +DEFINE_DMA_ENTRY(ovl_Bg_Astr_Bombwall, "ovl_Bg_Astr_Bombwall") +DEFINE_DMA_ENTRY(ovl_Bg_Iknin_Susceil, "ovl_Bg_Iknin_Susceil") +DEFINE_DMA_ENTRY(ovl_En_Bsb, "ovl_En_Bsb") +DEFINE_DMA_ENTRY(ovl_En_Recepgirl, "ovl_En_Recepgirl") +DEFINE_DMA_ENTRY(ovl_En_Thiefbird, "ovl_En_Thiefbird") +DEFINE_DMA_ENTRY(ovl_En_Jgame_Tsn, "ovl_En_Jgame_Tsn") +DEFINE_DMA_ENTRY(ovl_Obj_Jgame_Light, "ovl_Obj_Jgame_Light") +DEFINE_DMA_ENTRY(ovl_Obj_Yado, "ovl_Obj_Yado") +DEFINE_DMA_ENTRY(ovl_Demo_Syoten, "ovl_Demo_Syoten") +DEFINE_DMA_ENTRY(ovl_Demo_Moonend, "ovl_Demo_Moonend") +DEFINE_DMA_ENTRY(ovl_Bg_Lbfshot, "ovl_Bg_Lbfshot") +DEFINE_DMA_ENTRY(ovl_Bg_Last_Bwall, "ovl_Bg_Last_Bwall") +DEFINE_DMA_ENTRY(ovl_En_And, "ovl_En_And") +DEFINE_DMA_ENTRY(ovl_En_Invadepoh_Demo, "ovl_En_Invadepoh_Demo") +DEFINE_DMA_ENTRY(ovl_Obj_Danpeilift, "ovl_Obj_Danpeilift") +DEFINE_DMA_ENTRY(ovl_En_Fall2, "ovl_En_Fall2") +DEFINE_DMA_ENTRY(ovl_Dm_Al, "ovl_Dm_Al") +DEFINE_DMA_ENTRY(ovl_Dm_An, "ovl_Dm_An") +DEFINE_DMA_ENTRY(ovl_Dm_Ah, "ovl_Dm_Ah") +DEFINE_DMA_ENTRY(ovl_Dm_Nb, "ovl_Dm_Nb") +DEFINE_DMA_ENTRY(ovl_En_Drs, "ovl_En_Drs") +DEFINE_DMA_ENTRY(ovl_En_Ending_Hero, "ovl_En_Ending_Hero") +DEFINE_DMA_ENTRY(ovl_Dm_Bal, "ovl_Dm_Bal") +DEFINE_DMA_ENTRY(ovl_En_Paper, "ovl_En_Paper") +DEFINE_DMA_ENTRY(ovl_En_Hint_Skb, "ovl_En_Hint_Skb") +DEFINE_DMA_ENTRY(ovl_Dm_Tag, "ovl_Dm_Tag") +DEFINE_DMA_ENTRY(ovl_En_Bh, "ovl_En_Bh") +DEFINE_DMA_ENTRY(ovl_En_Ending_Hero2, "ovl_En_Ending_Hero2") +DEFINE_DMA_ENTRY(ovl_En_Ending_Hero3, "ovl_En_Ending_Hero3") +DEFINE_DMA_ENTRY(ovl_En_Ending_Hero4, "ovl_En_Ending_Hero4") +DEFINE_DMA_ENTRY(ovl_En_Ending_Hero5, "ovl_En_Ending_Hero5") +DEFINE_DMA_ENTRY(ovl_En_Ending_Hero6, "ovl_En_Ending_Hero6") +DEFINE_DMA_ENTRY(ovl_Dm_Gm, "ovl_Dm_Gm") +DEFINE_DMA_ENTRY(ovl_Obj_Swprize, "ovl_Obj_Swprize") +DEFINE_DMA_ENTRY(ovl_En_Invisible_Ruppe, "ovl_En_Invisible_Ruppe") +DEFINE_DMA_ENTRY(ovl_Obj_Ending, "ovl_Obj_Ending") +DEFINE_DMA_ENTRY(ovl_En_Rsn, "ovl_En_Rsn") +DEFINE_DMA_ENTRY(gameplay_keep, "gameplay_keep") +DEFINE_DMA_ENTRY(gameplay_field_keep, "gameplay_field_keep") +DEFINE_DMA_ENTRY(gameplay_dangeon_keep, "gameplay_dangeon_keep") +DEFINE_DMA_ENTRY_UNSET(gameplay_object_exchange_static, "gameplay_object_exchange_static") +DEFINE_DMA_ENTRY(object_link_boy, "object_link_boy") +DEFINE_DMA_ENTRY(object_link_child, "object_link_child") +DEFINE_DMA_ENTRY(object_link_goron, "object_link_goron") +DEFINE_DMA_ENTRY(object_link_zora, "object_link_zora") +DEFINE_DMA_ENTRY(object_link_nuts, "object_link_nuts") +DEFINE_DMA_ENTRY(object_mask_ki_tan, "object_mask_ki_tan") +DEFINE_DMA_ENTRY(object_mask_rabit, "object_mask_rabit") +DEFINE_DMA_ENTRY(object_mask_skj, "object_mask_skj") +DEFINE_DMA_ENTRY(object_mask_truth, "object_mask_truth") +DEFINE_DMA_ENTRY(object_mask_gibudo, "object_mask_gibudo") +DEFINE_DMA_ENTRY(object_mask_json, "object_mask_json") +DEFINE_DMA_ENTRY(object_mask_kerfay, "object_mask_kerfay") +DEFINE_DMA_ENTRY(object_mask_bigelf, "object_mask_bigelf") +DEFINE_DMA_ENTRY(object_mask_kyojin, "object_mask_kyojin") +DEFINE_DMA_ENTRY(object_mask_romerny, "object_mask_romerny") +DEFINE_DMA_ENTRY(object_mask_posthat, "object_mask_posthat") +DEFINE_DMA_ENTRY(object_mask_zacho, "object_mask_zacho") +DEFINE_DMA_ENTRY(object_mask_stone, "object_mask_stone") +DEFINE_DMA_ENTRY(object_mask_bree, "object_mask_bree") +DEFINE_DMA_ENTRY(object_mask_gero, "object_mask_gero") +DEFINE_DMA_ENTRY(object_mask_yofukasi, "object_mask_yofukasi") +DEFINE_DMA_ENTRY(object_mask_meoto, "object_mask_meoto") +DEFINE_DMA_ENTRY(object_mask_dancer, "object_mask_dancer") +DEFINE_DMA_ENTRY(object_mask_bakuretu, "object_mask_bakuretu") +DEFINE_DMA_ENTRY(object_mask_bu_san, "object_mask_bu_san") +DEFINE_DMA_ENTRY(object_mask_goron, "object_mask_goron") +DEFINE_DMA_ENTRY(object_mask_zora, "object_mask_zora") +DEFINE_DMA_ENTRY(object_mask_nuts, "object_mask_nuts") +DEFINE_DMA_ENTRY(object_mask_boy, "object_mask_boy") +DEFINE_DMA_ENTRY(object_box, "object_box") +DEFINE_DMA_ENTRY(object_okuta, "object_okuta") +DEFINE_DMA_ENTRY(object_wallmaster, "object_wallmaster") +DEFINE_DMA_ENTRY(object_dy_obj, "object_dy_obj") +DEFINE_DMA_ENTRY(object_firefly, "object_firefly") +DEFINE_DMA_ENTRY(object_dodongo, "object_dodongo") +DEFINE_DMA_ENTRY(object_niw, "object_niw") +DEFINE_DMA_ENTRY(object_tite, "object_tite") +DEFINE_DMA_ENTRY(object_ph, "object_ph") +DEFINE_DMA_ENTRY(object_dinofos, "object_dinofos") +DEFINE_DMA_ENTRY(object_zl1, "object_zl1") +DEFINE_DMA_ENTRY(object_bubble, "object_bubble") +DEFINE_DMA_ENTRY(object_test3, "object_test3") +DEFINE_DMA_ENTRY(object_famos, "object_famos") +DEFINE_DMA_ENTRY(object_st, "object_st") +DEFINE_DMA_ENTRY(object_thiefbird, "object_thiefbird") +DEFINE_DMA_ENTRY(object_bombf, "object_bombf") +DEFINE_DMA_ENTRY(object_am, "object_am") +DEFINE_DMA_ENTRY(object_dekubaba, "object_dekubaba") +DEFINE_DMA_ENTRY(object_warp1, "object_warp1") +DEFINE_DMA_ENTRY(object_b_heart, "object_b_heart") +DEFINE_DMA_ENTRY(object_dekunuts, "object_dekunuts") +DEFINE_DMA_ENTRY(object_bb, "object_bb") +DEFINE_DMA_ENTRY(object_death, "object_death") +DEFINE_DMA_ENTRY(object_hata, "object_hata") +DEFINE_DMA_ENTRY(object_wood02, "object_wood02") +DEFINE_DMA_ENTRY(object_trap, "object_trap") +DEFINE_DMA_ENTRY(object_vm, "object_vm") +DEFINE_DMA_ENTRY(object_efc_star_field, "object_efc_star_field") +DEFINE_DMA_ENTRY(object_rd, "object_rd") +DEFINE_DMA_ENTRY(object_yukimura_obj, "object_yukimura_obj") +DEFINE_DMA_ENTRY(object_horse_link_child, "object_horse_link_child") +DEFINE_DMA_ENTRY(object_syokudai, "object_syokudai") +DEFINE_DMA_ENTRY(object_efc_tw, "object_efc_tw") +DEFINE_DMA_ENTRY(object_gi_key, "object_gi_key") +DEFINE_DMA_ENTRY(object_mir_ray, "object_mir_ray") +DEFINE_DMA_ENTRY(object_ctower_rot, "object_ctower_rot") +DEFINE_DMA_ENTRY(object_bdoor, "object_bdoor") +DEFINE_DMA_ENTRY(object_sb, "object_sb") +DEFINE_DMA_ENTRY(object_gi_melody, "object_gi_melody") +DEFINE_DMA_ENTRY(object_gi_heart, "object_gi_heart") +DEFINE_DMA_ENTRY(object_gi_compass, "object_gi_compass") +DEFINE_DMA_ENTRY(object_gi_bosskey, "object_gi_bosskey") +DEFINE_DMA_ENTRY(object_gi_nuts, "object_gi_nuts") +DEFINE_DMA_ENTRY(object_gi_hearts, "object_gi_hearts") +DEFINE_DMA_ENTRY(object_gi_arrowcase, "object_gi_arrowcase") +DEFINE_DMA_ENTRY(object_gi_bombpouch, "object_gi_bombpouch") +DEFINE_DMA_ENTRY(object_in, "object_in") +DEFINE_DMA_ENTRY(object_os_anime, "object_os_anime") +DEFINE_DMA_ENTRY(object_gi_bottle, "object_gi_bottle") +DEFINE_DMA_ENTRY(object_gi_stick, "object_gi_stick") +DEFINE_DMA_ENTRY(object_gi_map, "object_gi_map") +DEFINE_DMA_ENTRY(object_oF1d_map, "object_oF1d_map") +DEFINE_DMA_ENTRY(object_ru2, "object_ru2") +DEFINE_DMA_ENTRY(object_gi_magicpot, "object_gi_magicpot") +DEFINE_DMA_ENTRY(object_gi_bomb_1, "object_gi_bomb_1") +DEFINE_DMA_ENTRY(object_ma2, "object_ma2") +DEFINE_DMA_ENTRY(object_gi_purse, "object_gi_purse") +DEFINE_DMA_ENTRY(object_rr, "object_rr") +DEFINE_DMA_ENTRY(object_gi_arrow, "object_gi_arrow") +DEFINE_DMA_ENTRY(object_gi_bomb_2, "object_gi_bomb_2") +DEFINE_DMA_ENTRY(object_gi_shield_2, "object_gi_shield_2") +DEFINE_DMA_ENTRY(object_gi_hookshot, "object_gi_hookshot") +DEFINE_DMA_ENTRY(object_gi_ocarina, "object_gi_ocarina") +DEFINE_DMA_ENTRY(object_gi_milk, "object_gi_milk") +DEFINE_DMA_ENTRY(object_ma1, "object_ma1") +DEFINE_DMA_ENTRY(object_ny, "object_ny") +DEFINE_DMA_ENTRY(object_fr, "object_fr") +DEFINE_DMA_ENTRY(object_gi_bow, "object_gi_bow") +DEFINE_DMA_ENTRY(object_gi_glasses, "object_gi_glasses") +DEFINE_DMA_ENTRY(object_gi_liquid, "object_gi_liquid") +DEFINE_DMA_ENTRY(object_ani, "object_ani") +DEFINE_DMA_ENTRY(object_gi_shield_3, "object_gi_shield_3") +DEFINE_DMA_ENTRY(object_gi_bean, "object_gi_bean") +DEFINE_DMA_ENTRY(object_gi_fish, "object_gi_fish") +DEFINE_DMA_ENTRY(object_gi_longsword, "object_gi_longsword") +DEFINE_DMA_ENTRY(object_zo, "object_zo") +DEFINE_DMA_ENTRY(object_umajump, "object_umajump") +DEFINE_DMA_ENTRY(object_mastergolon, "object_mastergolon") +DEFINE_DMA_ENTRY(object_masterzoora, "object_masterzoora") +DEFINE_DMA_ENTRY(object_aob, "object_aob") +DEFINE_DMA_ENTRY(object_ik, "object_ik") +DEFINE_DMA_ENTRY(object_ahg, "object_ahg") +DEFINE_DMA_ENTRY(object_cne, "object_cne") +DEFINE_DMA_ENTRY(object_bji, "object_bji") +DEFINE_DMA_ENTRY(object_bba, "object_bba") +DEFINE_DMA_ENTRY(object_an1, "object_an1") +DEFINE_DMA_ENTRY(object_boj, "object_boj") +DEFINE_DMA_ENTRY(object_fz, "object_fz") +DEFINE_DMA_ENTRY(object_bob, "object_bob") +DEFINE_DMA_ENTRY(object_ge1, "object_ge1") +DEFINE_DMA_ENTRY(object_yabusame_point, "object_yabusame_point") +DEFINE_DMA_ENTRY(object_d_hsblock, "object_d_hsblock") +DEFINE_DMA_ENTRY(object_d_lift, "object_d_lift") +DEFINE_DMA_ENTRY(object_mamenoki, "object_mamenoki") +DEFINE_DMA_ENTRY(object_goroiwa, "object_goroiwa") +DEFINE_DMA_ENTRY(object_toryo, "object_toryo") +DEFINE_DMA_ENTRY(object_daiku, "object_daiku") +DEFINE_DMA_ENTRY(object_nwc, "object_nwc") +DEFINE_DMA_ENTRY(object_gm, "object_gm") +DEFINE_DMA_ENTRY(object_ms, "object_ms") +DEFINE_DMA_ENTRY(object_hs, "object_hs") +DEFINE_DMA_ENTRY(object_lightswitch, "object_lightswitch") +DEFINE_DMA_ENTRY(object_kusa, "object_kusa") +DEFINE_DMA_ENTRY(object_tsubo, "object_tsubo") +DEFINE_DMA_ENTRY(object_kanban, "object_kanban") +DEFINE_DMA_ENTRY(object_owl, "object_owl") +DEFINE_DMA_ENTRY(object_mk, "object_mk") +DEFINE_DMA_ENTRY(object_fu, "object_fu") +DEFINE_DMA_ENTRY(object_gi_ki_tan_mask, "object_gi_ki_tan_mask") +DEFINE_DMA_ENTRY(object_gi_mask18, "object_gi_mask18") +DEFINE_DMA_ENTRY(object_gi_rabit_mask, "object_gi_rabit_mask") +DEFINE_DMA_ENTRY(object_gi_truth_mask, "object_gi_truth_mask") +DEFINE_DMA_ENTRY(object_stream, "object_stream") +DEFINE_DMA_ENTRY(object_mm, "object_mm") +DEFINE_DMA_ENTRY(object_js, "object_js") +DEFINE_DMA_ENTRY(object_cs, "object_cs") +DEFINE_DMA_ENTRY(object_gi_soldout, "object_gi_soldout") +DEFINE_DMA_ENTRY(object_mag, "object_mag") +DEFINE_DMA_ENTRY(object_gi_golonmask, "object_gi_golonmask") +DEFINE_DMA_ENTRY(object_gi_zoramask, "object_gi_zoramask") +DEFINE_DMA_ENTRY(object_ka, "object_ka") +DEFINE_DMA_ENTRY(object_zg, "object_zg") +DEFINE_DMA_ENTRY(object_gi_m_arrow, "object_gi_m_arrow") +DEFINE_DMA_ENTRY(object_ds2, "object_ds2") +DEFINE_DMA_ENTRY(object_fish, "object_fish") +DEFINE_DMA_ENTRY(object_gi_sutaru, "object_gi_sutaru") +DEFINE_DMA_ENTRY(object_ssh, "object_ssh") +DEFINE_DMA_ENTRY(object_bigslime, "object_bigslime") +DEFINE_DMA_ENTRY(object_bg, "object_bg") +DEFINE_DMA_ENTRY(object_bombiwa, "object_bombiwa") +DEFINE_DMA_ENTRY(object_hintnuts, "object_hintnuts") +DEFINE_DMA_ENTRY(object_rsn, "object_rsn") +DEFINE_DMA_ENTRY(object_gla, "object_gla") +DEFINE_DMA_ENTRY(object_geldb, "object_geldb") +DEFINE_DMA_ENTRY(object_dog, "object_dog") +DEFINE_DMA_ENTRY(object_kibako2, "object_kibako2") +DEFINE_DMA_ENTRY(object_dns, "object_dns") +DEFINE_DMA_ENTRY(object_dnk, "object_dnk") +DEFINE_DMA_ENTRY(object_gi_insect, "object_gi_insect") +DEFINE_DMA_ENTRY(object_gi_ghost, "object_gi_ghost") +DEFINE_DMA_ENTRY(object_gi_soul, "object_gi_soul") +DEFINE_DMA_ENTRY(object_f40_obj, "object_f40_obj") +DEFINE_DMA_ENTRY(object_gi_rupy, "object_gi_rupy") +DEFINE_DMA_ENTRY(object_po_composer, "object_po_composer") +DEFINE_DMA_ENTRY(object_mu, "object_mu") +DEFINE_DMA_ENTRY(object_wf, "object_wf") +DEFINE_DMA_ENTRY(object_skb, "object_skb") +DEFINE_DMA_ENTRY(object_gs, "object_gs") +DEFINE_DMA_ENTRY(object_ps, "object_ps") +DEFINE_DMA_ENTRY(object_omoya_obj, "object_omoya_obj") +DEFINE_DMA_ENTRY(object_crow, "object_crow") +DEFINE_DMA_ENTRY(object_cow, "object_cow") +DEFINE_DMA_ENTRY(object_gi_sword_1, "object_gi_sword_1") +DEFINE_DMA_ENTRY(object_zl4, "object_zl4") +DEFINE_DMA_ENTRY(object_grasshopper, "object_grasshopper") +DEFINE_DMA_ENTRY(object_boyo, "object_boyo") +DEFINE_DMA_ENTRY(object_fwall, "object_fwall") +DEFINE_DMA_ENTRY(object_jso, "object_jso") +DEFINE_DMA_ENTRY(object_knight, "object_knight") +DEFINE_DMA_ENTRY(object_icicle, "object_icicle") +DEFINE_DMA_ENTRY(object_spdweb, "object_spdweb") +DEFINE_DMA_ENTRY(object_boss01, "object_boss01") +DEFINE_DMA_ENTRY(object_boss02, "object_boss02") +DEFINE_DMA_ENTRY(object_boss03, "object_boss03") +DEFINE_DMA_ENTRY(object_boss04, "object_boss04") +DEFINE_DMA_ENTRY(object_boss05, "object_boss05") +DEFINE_DMA_ENTRY(object_boss07, "object_boss07") +DEFINE_DMA_ENTRY(object_raf, "object_raf") +DEFINE_DMA_ENTRY(object_funen, "object_funen") +DEFINE_DMA_ENTRY(object_raillift, "object_raillift") +DEFINE_DMA_ENTRY(object_numa_obj, "object_numa_obj") +DEFINE_DMA_ENTRY(object_flowerpot, "object_flowerpot") +DEFINE_DMA_ENTRY(object_spinyroll, "object_spinyroll") +DEFINE_DMA_ENTRY(object_ice_block, "object_ice_block") +DEFINE_DMA_ENTRY(object_keikoku_demo, "object_keikoku_demo") +DEFINE_DMA_ENTRY(object_slime, "object_slime") +DEFINE_DMA_ENTRY(object_pr, "object_pr") +DEFINE_DMA_ENTRY(object_f52_obj, "object_f52_obj") +DEFINE_DMA_ENTRY(object_f53_obj, "object_f53_obj") +DEFINE_DMA_ENTRY(object_kibako, "object_kibako") +DEFINE_DMA_ENTRY(object_sek, "object_sek") +DEFINE_DMA_ENTRY(object_gmo, "object_gmo") +DEFINE_DMA_ENTRY(object_bat, "object_bat") +DEFINE_DMA_ENTRY(object_sekihil, "object_sekihil") +DEFINE_DMA_ENTRY(object_sekihig, "object_sekihig") +DEFINE_DMA_ENTRY(object_sekihin, "object_sekihin") +DEFINE_DMA_ENTRY(object_sekihiz, "object_sekihiz") +DEFINE_DMA_ENTRY(object_wiz, "object_wiz") +DEFINE_DMA_ENTRY(object_ladder, "object_ladder") +DEFINE_DMA_ENTRY(object_mkk, "object_mkk") +DEFINE_DMA_ENTRY(object_keikoku_obj, "object_keikoku_obj") +DEFINE_DMA_ENTRY(object_sichitai_obj, "object_sichitai_obj") +DEFINE_DMA_ENTRY(object_dekucity_ana_obj, "object_dekucity_ana_obj") +DEFINE_DMA_ENTRY(object_rat, "object_rat") +DEFINE_DMA_ENTRY(object_water_effect, "object_water_effect") +DEFINE_DMA_ENTRY(object_dblue_object, "object_dblue_object") +DEFINE_DMA_ENTRY(object_bal, "object_bal") +DEFINE_DMA_ENTRY(object_warp_uzu, "object_warp_uzu") +DEFINE_DMA_ENTRY(object_driftice, "object_driftice") +DEFINE_DMA_ENTRY(object_fall, "object_fall") +DEFINE_DMA_ENTRY(object_hanareyama_obj, "object_hanareyama_obj") +DEFINE_DMA_ENTRY(object_crace_object, "object_crace_object") +DEFINE_DMA_ENTRY(object_dno, "object_dno") +DEFINE_DMA_ENTRY(object_obj_tokeidai, "object_obj_tokeidai") +DEFINE_DMA_ENTRY(object_eg, "object_eg") +DEFINE_DMA_ENTRY(object_tru, "object_tru") +DEFINE_DMA_ENTRY(object_trt, "object_trt") +DEFINE_DMA_ENTRY(object_hakugin_obj, "object_hakugin_obj") +DEFINE_DMA_ENTRY(object_horse_game_check, "object_horse_game_check") +DEFINE_DMA_ENTRY(object_stk, "object_stk") +DEFINE_DMA_ENTRY(object_mnk, "object_mnk") +DEFINE_DMA_ENTRY(object_gi_bottle_red, "object_gi_bottle_red") +DEFINE_DMA_ENTRY(object_tokei_tobira, "object_tokei_tobira") +DEFINE_DMA_ENTRY(object_az, "object_az") +DEFINE_DMA_ENTRY(object_twig, "object_twig") +DEFINE_DMA_ENTRY(object_dekucity_obj, "object_dekucity_obj") +DEFINE_DMA_ENTRY(object_po_fusen, "object_po_fusen") +DEFINE_DMA_ENTRY(object_racetsubo, "object_racetsubo") +DEFINE_DMA_ENTRY(object_ha, "object_ha") +DEFINE_DMA_ENTRY(object_bigokuta, "object_bigokuta") +DEFINE_DMA_ENTRY(object_open_obj, "object_open_obj") +DEFINE_DMA_ENTRY(object_fu_kaiten, "object_fu_kaiten") +DEFINE_DMA_ENTRY(object_fu_mato, "object_fu_mato") +DEFINE_DMA_ENTRY(object_mtoride, "object_mtoride") +DEFINE_DMA_ENTRY(object_osn, "object_osn") +DEFINE_DMA_ENTRY(object_tokei_step, "object_tokei_step") +DEFINE_DMA_ENTRY(object_lotus, "object_lotus") +DEFINE_DMA_ENTRY(object_tl, "object_tl") +DEFINE_DMA_ENTRY(object_dkjail_obj, "object_dkjail_obj") +DEFINE_DMA_ENTRY(object_visiblock, "object_visiblock") +DEFINE_DMA_ENTRY(object_tsn, "object_tsn") +DEFINE_DMA_ENTRY(object_ds2n, "object_ds2n") +DEFINE_DMA_ENTRY(object_fsn, "object_fsn") +DEFINE_DMA_ENTRY(object_shn, "object_shn") +DEFINE_DMA_ENTRY(object_bigicicle, "object_bigicicle") +DEFINE_DMA_ENTRY(object_gi_bottle_15, "object_gi_bottle_15") +DEFINE_DMA_ENTRY(object_tk, "object_tk") +DEFINE_DMA_ENTRY(object_market_obj, "object_market_obj") +DEFINE_DMA_ENTRY(object_gi_reserve00, "object_gi_reserve00") +DEFINE_DMA_ENTRY(object_gi_reserve01, "object_gi_reserve01") +DEFINE_DMA_ENTRY(object_lightblock, "object_lightblock") +DEFINE_DMA_ENTRY(object_takaraya_objects, "object_takaraya_objects") +DEFINE_DMA_ENTRY(object_wdhand, "object_wdhand") +DEFINE_DMA_ENTRY(object_sdn, "object_sdn") +DEFINE_DMA_ENTRY(object_snowwd, "object_snowwd") +DEFINE_DMA_ENTRY(object_giant, "object_giant") +DEFINE_DMA_ENTRY(object_comb, "object_comb") +DEFINE_DMA_ENTRY(object_hana, "object_hana") +DEFINE_DMA_ENTRY(object_boss_hakugin, "object_boss_hakugin") +DEFINE_DMA_ENTRY(object_meganeana_obj, "object_meganeana_obj") +DEFINE_DMA_ENTRY(object_gi_nutsmask, "object_gi_nutsmask") +DEFINE_DMA_ENTRY(object_stk2, "object_stk2") +DEFINE_DMA_ENTRY(object_spot11_obj, "object_spot11_obj") +DEFINE_DMA_ENTRY(object_danpei_object, "object_danpei_object") +DEFINE_DMA_ENTRY(object_dhouse, "object_dhouse") +DEFINE_DMA_ENTRY(object_hakaisi, "object_hakaisi") +DEFINE_DMA_ENTRY(object_po, "object_po") +DEFINE_DMA_ENTRY(object_snowman, "object_snowman") +DEFINE_DMA_ENTRY(object_po_sisters, "object_po_sisters") +DEFINE_DMA_ENTRY(object_pp, "object_pp") +DEFINE_DMA_ENTRY(object_goronswitch, "object_goronswitch") +DEFINE_DMA_ENTRY(object_delf, "object_delf") +DEFINE_DMA_ENTRY(object_botihasira, "object_botihasira") +DEFINE_DMA_ENTRY(object_gi_bigbomb, "object_gi_bigbomb") +DEFINE_DMA_ENTRY(object_pst, "object_pst") +DEFINE_DMA_ENTRY(object_bsmask, "object_bsmask") +DEFINE_DMA_ENTRY(object_spidertent, "object_spidertent") +DEFINE_DMA_ENTRY(object_zoraegg, "object_zoraegg") +DEFINE_DMA_ENTRY(object_kbt, "object_kbt") +DEFINE_DMA_ENTRY(object_gg, "object_gg") +DEFINE_DMA_ENTRY(object_maruta, "object_maruta") +DEFINE_DMA_ENTRY(object_ghaka, "object_ghaka") +DEFINE_DMA_ENTRY(object_oyu, "object_oyu") +DEFINE_DMA_ENTRY(object_dnq, "object_dnq") +DEFINE_DMA_ENTRY(object_dai, "object_dai") +DEFINE_DMA_ENTRY(object_kgy, "object_kgy") +DEFINE_DMA_ENTRY(object_fb, "object_fb") +DEFINE_DMA_ENTRY(object_taisou, "object_taisou") +DEFINE_DMA_ENTRY(object_gk, "object_gk") +DEFINE_DMA_ENTRY(object_haka_obj, "object_haka_obj") +DEFINE_DMA_ENTRY(object_dnt, "object_dnt") +DEFINE_DMA_ENTRY(object_yukiyama, "object_yukiyama") +DEFINE_DMA_ENTRY(object_icefloe, "object_icefloe") +DEFINE_DMA_ENTRY(object_gi_gold_dust, "object_gi_gold_dust") +DEFINE_DMA_ENTRY(object_gi_bottle_16, "object_gi_bottle_16") +DEFINE_DMA_ENTRY(object_gi_bottle_22, "object_gi_bottle_22") +DEFINE_DMA_ENTRY(object_bee, "object_bee") +DEFINE_DMA_ENTRY(object_ot, "object_ot") +DEFINE_DMA_ENTRY(object_utubo, "object_utubo") +DEFINE_DMA_ENTRY(object_dora, "object_dora") +DEFINE_DMA_ENTRY(object_gi_loach, "object_gi_loach") +DEFINE_DMA_ENTRY(object_gi_seahorse, "object_gi_seahorse") +DEFINE_DMA_ENTRY(object_bigpo, "object_bigpo") +DEFINE_DMA_ENTRY(object_hariko, "object_hariko") +DEFINE_DMA_ENTRY(object_dnj, "object_dnj") +DEFINE_DMA_ENTRY(object_sinkai_kabe, "object_sinkai_kabe") +DEFINE_DMA_ENTRY(object_kin2_obj, "object_kin2_obj") +DEFINE_DMA_ENTRY(object_ishi, "object_ishi") +DEFINE_DMA_ENTRY(object_hakugin_demo, "object_hakugin_demo") +DEFINE_DMA_ENTRY(object_jg, "object_jg") +DEFINE_DMA_ENTRY(object_gi_sword_2, "object_gi_sword_2") +DEFINE_DMA_ENTRY(object_gi_sword_3, "object_gi_sword_3") +DEFINE_DMA_ENTRY(object_gi_sword_4, "object_gi_sword_4") +DEFINE_DMA_ENTRY(object_um, "object_um") +DEFINE_DMA_ENTRY(object_rb, "object_rb") +DEFINE_DMA_ENTRY(object_mbar_obj, "object_mbar_obj") +DEFINE_DMA_ENTRY(object_ikana_obj, "object_ikana_obj") +DEFINE_DMA_ENTRY(object_kz, "object_kz") +DEFINE_DMA_ENTRY(object_tokei_turret, "object_tokei_turret") +DEFINE_DMA_ENTRY(object_zog, "object_zog") +DEFINE_DMA_ENTRY(object_rotlift, "object_rotlift") +DEFINE_DMA_ENTRY(object_posthouse_obj, "object_posthouse_obj") +DEFINE_DMA_ENTRY(object_gi_mask09, "object_gi_mask09") +DEFINE_DMA_ENTRY(object_gi_mask14, "object_gi_mask14") +DEFINE_DMA_ENTRY(object_gi_mask15, "object_gi_mask15") +DEFINE_DMA_ENTRY(object_inibs_object, "object_inibs_object") +DEFINE_DMA_ENTRY(object_tree, "object_tree") +DEFINE_DMA_ENTRY(object_kaizoku_obj, "object_kaizoku_obj") +DEFINE_DMA_ENTRY(object_gi_reserve_b_00, "object_gi_reserve_b_00") +DEFINE_DMA_ENTRY(object_gi_reserve_c_00, "object_gi_reserve_c_00") +DEFINE_DMA_ENTRY(object_zob, "object_zob") +DEFINE_DMA_ENTRY(object_milkbar, "object_milkbar") +DEFINE_DMA_ENTRY(object_dmask, "object_dmask") +DEFINE_DMA_ENTRY(object_gi_reserve_c_01, "object_gi_reserve_c_01") +DEFINE_DMA_ENTRY(object_zod, "object_zod") +DEFINE_DMA_ENTRY(object_kumo30, "object_kumo30") +DEFINE_DMA_ENTRY(object_obj_yasi, "object_obj_yasi") +DEFINE_DMA_ENTRY(object_tanron1, "object_tanron1") +DEFINE_DMA_ENTRY(object_tanron2, "object_tanron2") +DEFINE_DMA_ENTRY(object_tanron3, "object_tanron3") +DEFINE_DMA_ENTRY(object_gi_magicmushroom, "object_gi_magicmushroom") +DEFINE_DMA_ENTRY(object_obj_chan, "object_obj_chan") +DEFINE_DMA_ENTRY(object_gi_mask10, "object_gi_mask10") +DEFINE_DMA_ENTRY(object_zos, "object_zos") +DEFINE_DMA_ENTRY(object_an2, "object_an2") +DEFINE_DMA_ENTRY(object_an3, "object_an3") +DEFINE_DMA_ENTRY(object_f40_switch, "object_f40_switch") +DEFINE_DMA_ENTRY(object_lodmoon, "object_lodmoon") +DEFINE_DMA_ENTRY(object_tro, "object_tro") +DEFINE_DMA_ENTRY(object_gi_mask12, "object_gi_mask12") +DEFINE_DMA_ENTRY(object_gi_mask23, "object_gi_mask23") +DEFINE_DMA_ENTRY(object_gi_bottle_21, "object_gi_bottle_21") +DEFINE_DMA_ENTRY(object_gi_camera, "object_gi_camera") +DEFINE_DMA_ENTRY(object_kamejima, "object_kamejima") +DEFINE_DMA_ENTRY(object_nb, "object_nb") +DEFINE_DMA_ENTRY(object_harfgibud, "object_harfgibud") +DEFINE_DMA_ENTRY(object_zov, "object_zov") +DEFINE_DMA_ENTRY(object_ah, "object_ah") +DEFINE_DMA_ENTRY(object_hgdoor, "object_hgdoor") +DEFINE_DMA_ENTRY(object_dor01, "object_dor01") +DEFINE_DMA_ENTRY(object_dor02, "object_dor02") +DEFINE_DMA_ENTRY(object_dor03, "object_dor03") +DEFINE_DMA_ENTRY(object_dor04, "object_dor04") +DEFINE_DMA_ENTRY(object_last_obj, "object_last_obj") +DEFINE_DMA_ENTRY(object_redead_obj, "object_redead_obj") +DEFINE_DMA_ENTRY(object_ikninside_obj, "object_ikninside_obj") +DEFINE_DMA_ENTRY(object_iknv_obj, "object_iknv_obj") +DEFINE_DMA_ENTRY(object_pamera, "object_pamera") +DEFINE_DMA_ENTRY(object_hsstump, "object_hsstump") +DEFINE_DMA_ENTRY(object_zm, "object_zm") +DEFINE_DMA_ENTRY(object_al, "object_al") +DEFINE_DMA_ENTRY(object_tab, "object_tab") +DEFINE_DMA_ENTRY(object_secom_obj, "object_secom_obj") +DEFINE_DMA_ENTRY(object_dt, "object_dt") +DEFINE_DMA_ENTRY(object_gi_mask03, "object_gi_mask03") +DEFINE_DMA_ENTRY(object_cha, "object_cha") +DEFINE_DMA_ENTRY(object_obj_dinner, "object_obj_dinner") +DEFINE_DMA_ENTRY(object_gi_reserve_b_01, "object_gi_reserve_b_01") +DEFINE_DMA_ENTRY(object_lastday, "object_lastday") +DEFINE_DMA_ENTRY(object_bai, "object_bai") +DEFINE_DMA_ENTRY(object_ikn_demo, "object_ikn_demo") +DEFINE_DMA_ENTRY(object_gi_fieldmap, "object_gi_fieldmap") +DEFINE_DMA_ENTRY(object_big_fwall, "object_big_fwall") +DEFINE_DMA_ENTRY(object_hunsui, "object_hunsui") +DEFINE_DMA_ENTRY(object_uch, "object_uch") +DEFINE_DMA_ENTRY(object_tanron4, "object_tanron4") +DEFINE_DMA_ENTRY(object_tanron5, "object_tanron5") +DEFINE_DMA_ENTRY(object_in2, "object_in2") +DEFINE_DMA_ENTRY(object_yb, "object_yb") +DEFINE_DMA_ENTRY(object_rz, "object_rz") +DEFINE_DMA_ENTRY(object_bjt, "object_bjt") +DEFINE_DMA_ENTRY(object_taru, "object_taru") +DEFINE_DMA_ENTRY(object_moonston, "object_moonston") +DEFINE_DMA_ENTRY(object_gi_schedule, "object_gi_schedule") +DEFINE_DMA_ENTRY(object_gi_stonemask, "object_gi_stonemask") +DEFINE_DMA_ENTRY(object_zoraband, "object_zoraband") +DEFINE_DMA_ENTRY(object_kepn_koya, "object_kepn_koya") +DEFINE_DMA_ENTRY(object_obj_usiyane, "object_obj_usiyane") +DEFINE_DMA_ENTRY(object_gi_mask05, "object_gi_mask05") +DEFINE_DMA_ENTRY(object_gi_mask11, "object_gi_mask11") +DEFINE_DMA_ENTRY(object_gi_mask20, "object_gi_mask20") +DEFINE_DMA_ENTRY(object_nnh, "object_nnh") +DEFINE_DMA_ENTRY(object_kzsaku, "object_kzsaku") +DEFINE_DMA_ENTRY(object_obj_milk_bin, "object_obj_milk_bin") +DEFINE_DMA_ENTRY(object_random_obj, "object_random_obj") +DEFINE_DMA_ENTRY(object_kujiya, "object_kujiya") +DEFINE_DMA_ENTRY(object_kitan, "object_kitan") +DEFINE_DMA_ENTRY(object_gi_mask06, "object_gi_mask06") +DEFINE_DMA_ENTRY(object_gi_mask16, "object_gi_mask16") +DEFINE_DMA_ENTRY(object_astr_obj, "object_astr_obj") +DEFINE_DMA_ENTRY(object_bsb, "object_bsb") +DEFINE_DMA_ENTRY(object_fall2, "object_fall2") +DEFINE_DMA_ENTRY(object_sth, "object_sth") +DEFINE_DMA_ENTRY(object_gi_mssa, "object_gi_mssa") +DEFINE_DMA_ENTRY(object_smtower, "object_smtower") +DEFINE_DMA_ENTRY(object_gi_mask21, "object_gi_mask21") +DEFINE_DMA_ENTRY(object_yado_obj, "object_yado_obj") +DEFINE_DMA_ENTRY(object_syoten, "object_syoten") +DEFINE_DMA_ENTRY(object_moonend, "object_moonend") +DEFINE_DMA_ENTRY(object_ob, "object_ob") +DEFINE_DMA_ENTRY(object_gi_bottle_04, "object_gi_bottle_04") +DEFINE_DMA_ENTRY(object_and, "object_and") +DEFINE_DMA_ENTRY(object_obj_danpeilift, "object_obj_danpeilift") +DEFINE_DMA_ENTRY(object_drs, "object_drs") +DEFINE_DMA_ENTRY(object_msmo, "object_msmo") +DEFINE_DMA_ENTRY(object_an4, "object_an4") +DEFINE_DMA_ENTRY(object_wdor01, "object_wdor01") +DEFINE_DMA_ENTRY(object_wdor02, "object_wdor02") +DEFINE_DMA_ENTRY(object_wdor03, "object_wdor03") +DEFINE_DMA_ENTRY(object_wdor04, "object_wdor04") +DEFINE_DMA_ENTRY(object_wdor05, "object_wdor05") +DEFINE_DMA_ENTRY(object_stk3, "object_stk3") +DEFINE_DMA_ENTRY(object_kinsta1_obj, "object_kinsta1_obj") +DEFINE_DMA_ENTRY(object_kinsta2_obj, "object_kinsta2_obj") +DEFINE_DMA_ENTRY(object_bh, "object_bh") +DEFINE_DMA_ENTRY(object_gi_mask17, "object_gi_mask17") +DEFINE_DMA_ENTRY(object_gi_mask22, "object_gi_mask22") +DEFINE_DMA_ENTRY(object_lbfshot, "object_lbfshot") +DEFINE_DMA_ENTRY(object_fusen, "object_fusen") +DEFINE_DMA_ENTRY(object_ending_obj, "object_ending_obj") +DEFINE_DMA_ENTRY(object_gi_mask13, "object_gi_mask13") +DEFINE_DMA_ENTRY(scene_texture_01, "scene_texture_01") +DEFINE_DMA_ENTRY(scene_texture_02, "scene_texture_02") +DEFINE_DMA_ENTRY(scene_texture_03, "scene_texture_03") +DEFINE_DMA_ENTRY(scene_texture_04, "scene_texture_04") +DEFINE_DMA_ENTRY(scene_texture_05, "scene_texture_05") +DEFINE_DMA_ENTRY(scene_texture_06, "scene_texture_06") +DEFINE_DMA_ENTRY(scene_texture_07, "scene_texture_07") +DEFINE_DMA_ENTRY(scene_texture_08, "scene_texture_08") +DEFINE_DMA_ENTRY(nintendo_rogo_static, "nintendo_rogo_static") +DEFINE_DMA_ENTRY(title_static, "title_static") +DEFINE_DMA_ENTRY(memerrmsg, "memerrmsg") +DEFINE_DMA_ENTRY(locerrmsg, "locerrmsg") +DEFINE_DMA_ENTRY(parameter_static, "parameter_static") +DEFINE_DMA_ENTRY(week_static, "week_static") +DEFINE_DMA_ENTRY(daytelop_static, "daytelop_static") +DEFINE_DMA_ENTRY(ger_daytelop_static, "ger_daytelop_static") +DEFINE_DMA_ENTRY(fra_daytelop_static, "fra_daytelop_static") +DEFINE_DMA_ENTRY(esp_daytelop_static, "esp_daytelop_static") +DEFINE_DMA_ENTRY(d2_fine_static, "d2_fine_static") +DEFINE_DMA_ENTRY(d2_cloud_static, "d2_cloud_static") +DEFINE_DMA_ENTRY(d2_fine_pal_static, "d2_fine_pal_static") +DEFINE_DMA_ENTRY(elf_message_field, "elf_message_field") +DEFINE_DMA_ENTRY(elf_message_ydan, "elf_message_ydan") +DEFINE_DMA_ENTRY(Z2_20SICHITAI2, "Z2_20SICHITAI2") +DEFINE_DMA_ENTRY(Z2_20SICHITAI2_room_00, "Z2_20SICHITAI2_room_00") +DEFINE_DMA_ENTRY(Z2_20SICHITAI2_room_01, "Z2_20SICHITAI2_room_01") +DEFINE_DMA_ENTRY(Z2_20SICHITAI2_room_02, "Z2_20SICHITAI2_room_02") +DEFINE_DMA_ENTRY(Z2_WITCH_SHOP, "Z2_WITCH_SHOP") +DEFINE_DMA_ENTRY(Z2_WITCH_SHOP_room_00, "Z2_WITCH_SHOP_room_00") +DEFINE_DMA_ENTRY(Z2_LAST_BS, "Z2_LAST_BS") +DEFINE_DMA_ENTRY(Z2_LAST_BS_room_00, "Z2_LAST_BS_room_00") +DEFINE_DMA_ENTRY(Z2_HAKASHITA, "Z2_HAKASHITA") +DEFINE_DMA_ENTRY(Z2_HAKASHITA_room_00, "Z2_HAKASHITA_room_00") +DEFINE_DMA_ENTRY(Z2_HAKASHITA_room_01, "Z2_HAKASHITA_room_01") +DEFINE_DMA_ENTRY(Z2_HAKASHITA_room_02, "Z2_HAKASHITA_room_02") +DEFINE_DMA_ENTRY(Z2_HAKASHITA_room_03, "Z2_HAKASHITA_room_03") +DEFINE_DMA_ENTRY(Z2_HAKASHITA_room_04, "Z2_HAKASHITA_room_04") +DEFINE_DMA_ENTRY(Z2_AYASHIISHOP, "Z2_AYASHIISHOP") +DEFINE_DMA_ENTRY(Z2_AYASHIISHOP_room_00, "Z2_AYASHIISHOP_room_00") +DEFINE_DMA_ENTRY(Z2_AYASHIISHOP_room_01, "Z2_AYASHIISHOP_room_01") +DEFINE_DMA_ENTRY(Z2_OMOYA, "Z2_OMOYA") +DEFINE_DMA_ENTRY(Z2_OMOYA_room_00, "Z2_OMOYA_room_00") +DEFINE_DMA_ENTRY(Z2_OMOYA_room_01, "Z2_OMOYA_room_01") +DEFINE_DMA_ENTRY(Z2_OMOYA_room_02, "Z2_OMOYA_room_02") +DEFINE_DMA_ENTRY(Z2_BOWLING, "Z2_BOWLING") +DEFINE_DMA_ENTRY(Z2_BOWLING_room_00, "Z2_BOWLING_room_00") +DEFINE_DMA_ENTRY(Z2_SONCHONOIE, "Z2_SONCHONOIE") +DEFINE_DMA_ENTRY(Z2_SONCHONOIE_room_00, "Z2_SONCHONOIE_room_00") +DEFINE_DMA_ENTRY(Z2_SONCHONOIE_room_01, "Z2_SONCHONOIE_room_01") +DEFINE_DMA_ENTRY(Z2_SONCHONOIE_room_02, "Z2_SONCHONOIE_room_02") +DEFINE_DMA_ENTRY(Z2_SONCHONOIE_room_03, "Z2_SONCHONOIE_room_03") +DEFINE_DMA_ENTRY(Z2_IKANA, "Z2_IKANA") +DEFINE_DMA_ENTRY(Z2_IKANA_room_00, "Z2_IKANA_room_00") +DEFINE_DMA_ENTRY(Z2_IKANA_room_01, "Z2_IKANA_room_01") +DEFINE_DMA_ENTRY(Z2_IKANA_room_02, "Z2_IKANA_room_02") +DEFINE_DMA_ENTRY(Z2_IKANA_room_03, "Z2_IKANA_room_03") +DEFINE_DMA_ENTRY(Z2_IKANA_room_04, "Z2_IKANA_room_04") +DEFINE_DMA_ENTRY(Z2_KAIZOKU, "Z2_KAIZOKU") +DEFINE_DMA_ENTRY(Z2_KAIZOKU_room_00, "Z2_KAIZOKU_room_00") +DEFINE_DMA_ENTRY(Z2_MILK_BAR, "Z2_MILK_BAR") +DEFINE_DMA_ENTRY(Z2_MILK_BAR_room_00, "Z2_MILK_BAR_room_00") +DEFINE_DMA_ENTRY(Z2_INISIE_N, "Z2_INISIE_N") +DEFINE_DMA_ENTRY(Z2_INISIE_N_room_00, "Z2_INISIE_N_room_00") +DEFINE_DMA_ENTRY(Z2_INISIE_N_room_01, "Z2_INISIE_N_room_01") +DEFINE_DMA_ENTRY(Z2_INISIE_N_room_02, "Z2_INISIE_N_room_02") +DEFINE_DMA_ENTRY(Z2_INISIE_N_room_03, "Z2_INISIE_N_room_03") +DEFINE_DMA_ENTRY(Z2_INISIE_N_room_04, "Z2_INISIE_N_room_04") +DEFINE_DMA_ENTRY(Z2_INISIE_N_room_05, "Z2_INISIE_N_room_05") +DEFINE_DMA_ENTRY(Z2_INISIE_N_room_06, "Z2_INISIE_N_room_06") +DEFINE_DMA_ENTRY(Z2_INISIE_N_room_07, "Z2_INISIE_N_room_07") +DEFINE_DMA_ENTRY(Z2_INISIE_N_room_08, "Z2_INISIE_N_room_08") +DEFINE_DMA_ENTRY(Z2_INISIE_N_room_09, "Z2_INISIE_N_room_09") +DEFINE_DMA_ENTRY(Z2_INISIE_N_room_10, "Z2_INISIE_N_room_10") +DEFINE_DMA_ENTRY(Z2_INISIE_N_room_11, "Z2_INISIE_N_room_11") +DEFINE_DMA_ENTRY(Z2_TAKARAYA, "Z2_TAKARAYA") +DEFINE_DMA_ENTRY(Z2_TAKARAYA_room_00, "Z2_TAKARAYA_room_00") +DEFINE_DMA_ENTRY(Z2_INISIE_R, "Z2_INISIE_R") +DEFINE_DMA_ENTRY(Z2_INISIE_R_room_00, "Z2_INISIE_R_room_00") +DEFINE_DMA_ENTRY(Z2_INISIE_R_room_01, "Z2_INISIE_R_room_01") +DEFINE_DMA_ENTRY(Z2_INISIE_R_room_02, "Z2_INISIE_R_room_02") +DEFINE_DMA_ENTRY(Z2_INISIE_R_room_03, "Z2_INISIE_R_room_03") +DEFINE_DMA_ENTRY(Z2_INISIE_R_room_04, "Z2_INISIE_R_room_04") +DEFINE_DMA_ENTRY(Z2_INISIE_R_room_05, "Z2_INISIE_R_room_05") +DEFINE_DMA_ENTRY(Z2_INISIE_R_room_06, "Z2_INISIE_R_room_06") +DEFINE_DMA_ENTRY(Z2_INISIE_R_room_07, "Z2_INISIE_R_room_07") +DEFINE_DMA_ENTRY(Z2_INISIE_R_room_08, "Z2_INISIE_R_room_08") +DEFINE_DMA_ENTRY(Z2_INISIE_R_room_09, "Z2_INISIE_R_room_09") +DEFINE_DMA_ENTRY(Z2_INISIE_R_room_10, "Z2_INISIE_R_room_10") +DEFINE_DMA_ENTRY(Z2_INISIE_R_room_11, "Z2_INISIE_R_room_11") +DEFINE_DMA_ENTRY(Z2_OKUJOU, "Z2_OKUJOU") +DEFINE_DMA_ENTRY(Z2_OKUJOU_room_00, "Z2_OKUJOU_room_00") +DEFINE_DMA_ENTRY(Z2_OPENINGDAN, "Z2_OPENINGDAN") +DEFINE_DMA_ENTRY(Z2_OPENINGDAN_room_00, "Z2_OPENINGDAN_room_00") +DEFINE_DMA_ENTRY(Z2_OPENINGDAN_room_01, "Z2_OPENINGDAN_room_01") +DEFINE_DMA_ENTRY(Z2_MITURIN, "Z2_MITURIN") +DEFINE_DMA_ENTRY(Z2_MITURIN_room_00, "Z2_MITURIN_room_00") +DEFINE_DMA_ENTRY(Z2_MITURIN_room_01, "Z2_MITURIN_room_01") +DEFINE_DMA_ENTRY(Z2_MITURIN_room_02, "Z2_MITURIN_room_02") +DEFINE_DMA_ENTRY(Z2_MITURIN_room_03, "Z2_MITURIN_room_03") +DEFINE_DMA_ENTRY(Z2_MITURIN_room_04, "Z2_MITURIN_room_04") +DEFINE_DMA_ENTRY(Z2_MITURIN_room_05, "Z2_MITURIN_room_05") +DEFINE_DMA_ENTRY(Z2_MITURIN_room_06, "Z2_MITURIN_room_06") +DEFINE_DMA_ENTRY(Z2_MITURIN_room_07, "Z2_MITURIN_room_07") +DEFINE_DMA_ENTRY(Z2_MITURIN_room_08, "Z2_MITURIN_room_08") +DEFINE_DMA_ENTRY(Z2_MITURIN_room_09, "Z2_MITURIN_room_09") +DEFINE_DMA_ENTRY(Z2_MITURIN_room_10, "Z2_MITURIN_room_10") +DEFINE_DMA_ENTRY(Z2_MITURIN_room_11, "Z2_MITURIN_room_11") +DEFINE_DMA_ENTRY(Z2_MITURIN_room_12, "Z2_MITURIN_room_12") +DEFINE_DMA_ENTRY(Z2_13HUBUKINOMITI, "Z2_13HUBUKINOMITI") +DEFINE_DMA_ENTRY(Z2_13HUBUKINOMITI_room_00, "Z2_13HUBUKINOMITI_room_00") +DEFINE_DMA_ENTRY(Z2_CASTLE, "Z2_CASTLE") +DEFINE_DMA_ENTRY(Z2_CASTLE_room_00, "Z2_CASTLE_room_00") +DEFINE_DMA_ENTRY(Z2_CASTLE_room_01, "Z2_CASTLE_room_01") +DEFINE_DMA_ENTRY(Z2_CASTLE_room_02, "Z2_CASTLE_room_02") +DEFINE_DMA_ENTRY(Z2_CASTLE_room_03, "Z2_CASTLE_room_03") +DEFINE_DMA_ENTRY(Z2_CASTLE_room_04, "Z2_CASTLE_room_04") +DEFINE_DMA_ENTRY(Z2_CASTLE_room_05, "Z2_CASTLE_room_05") +DEFINE_DMA_ENTRY(Z2_CASTLE_room_06, "Z2_CASTLE_room_06") +DEFINE_DMA_ENTRY(Z2_CASTLE_room_07, "Z2_CASTLE_room_07") +DEFINE_DMA_ENTRY(Z2_CASTLE_room_08, "Z2_CASTLE_room_08") +DEFINE_DMA_ENTRY(Z2_CASTLE_room_09, "Z2_CASTLE_room_09") +DEFINE_DMA_ENTRY(Z2_DEKUTES, "Z2_DEKUTES") +DEFINE_DMA_ENTRY(Z2_DEKUTES_room_00, "Z2_DEKUTES_room_00") +DEFINE_DMA_ENTRY(Z2_MITURIN_BS, "Z2_MITURIN_BS") +DEFINE_DMA_ENTRY(Z2_MITURIN_BS_room_00, "Z2_MITURIN_BS_room_00") +DEFINE_DMA_ENTRY(Z2_SYATEKI_MIZU, "Z2_SYATEKI_MIZU") +DEFINE_DMA_ENTRY(Z2_SYATEKI_MIZU_room_00, "Z2_SYATEKI_MIZU_room_00") +DEFINE_DMA_ENTRY(Z2_HAKUGIN, "Z2_HAKUGIN") +DEFINE_DMA_ENTRY(Z2_HAKUGIN_room_00, "Z2_HAKUGIN_room_00") +DEFINE_DMA_ENTRY(Z2_HAKUGIN_room_01, "Z2_HAKUGIN_room_01") +DEFINE_DMA_ENTRY(Z2_HAKUGIN_room_02, "Z2_HAKUGIN_room_02") +DEFINE_DMA_ENTRY(Z2_HAKUGIN_room_03, "Z2_HAKUGIN_room_03") +DEFINE_DMA_ENTRY(Z2_HAKUGIN_room_04, "Z2_HAKUGIN_room_04") +DEFINE_DMA_ENTRY(Z2_HAKUGIN_room_05, "Z2_HAKUGIN_room_05") +DEFINE_DMA_ENTRY(Z2_HAKUGIN_room_06, "Z2_HAKUGIN_room_06") +DEFINE_DMA_ENTRY(Z2_HAKUGIN_room_07, "Z2_HAKUGIN_room_07") +DEFINE_DMA_ENTRY(Z2_HAKUGIN_room_08, "Z2_HAKUGIN_room_08") +DEFINE_DMA_ENTRY(Z2_HAKUGIN_room_09, "Z2_HAKUGIN_room_09") +DEFINE_DMA_ENTRY(Z2_HAKUGIN_room_10, "Z2_HAKUGIN_room_10") +DEFINE_DMA_ENTRY(Z2_HAKUGIN_room_11, "Z2_HAKUGIN_room_11") +DEFINE_DMA_ENTRY(Z2_HAKUGIN_room_12, "Z2_HAKUGIN_room_12") +DEFINE_DMA_ENTRY(Z2_HAKUGIN_room_13, "Z2_HAKUGIN_room_13") +DEFINE_DMA_ENTRY(Z2_ROMANYMAE, "Z2_ROMANYMAE") +DEFINE_DMA_ENTRY(Z2_ROMANYMAE_room_00, "Z2_ROMANYMAE_room_00") +DEFINE_DMA_ENTRY(Z2_PIRATE, "Z2_PIRATE") +DEFINE_DMA_ENTRY(Z2_PIRATE_room_00, "Z2_PIRATE_room_00") +DEFINE_DMA_ENTRY(Z2_PIRATE_room_01, "Z2_PIRATE_room_01") +DEFINE_DMA_ENTRY(Z2_PIRATE_room_02, "Z2_PIRATE_room_02") +DEFINE_DMA_ENTRY(Z2_PIRATE_room_03, "Z2_PIRATE_room_03") +DEFINE_DMA_ENTRY(Z2_PIRATE_room_04, "Z2_PIRATE_room_04") +DEFINE_DMA_ENTRY(Z2_PIRATE_room_05, "Z2_PIRATE_room_05") +DEFINE_DMA_ENTRY(Z2_PIRATE_room_06, "Z2_PIRATE_room_06") +DEFINE_DMA_ENTRY(Z2_PIRATE_room_07, "Z2_PIRATE_room_07") +DEFINE_DMA_ENTRY(Z2_PIRATE_room_08, "Z2_PIRATE_room_08") +DEFINE_DMA_ENTRY(Z2_PIRATE_room_09, "Z2_PIRATE_room_09") +DEFINE_DMA_ENTRY(Z2_PIRATE_room_10, "Z2_PIRATE_room_10") +DEFINE_DMA_ENTRY(Z2_PIRATE_room_11, "Z2_PIRATE_room_11") +DEFINE_DMA_ENTRY(Z2_PIRATE_room_12, "Z2_PIRATE_room_12") +DEFINE_DMA_ENTRY(Z2_PIRATE_room_13, "Z2_PIRATE_room_13") +DEFINE_DMA_ENTRY(Z2_PIRATE_room_14, "Z2_PIRATE_room_14") +DEFINE_DMA_ENTRY(Z2_SYATEKI_MORI, "Z2_SYATEKI_MORI") +DEFINE_DMA_ENTRY(Z2_SYATEKI_MORI_room_00, "Z2_SYATEKI_MORI_room_00") +DEFINE_DMA_ENTRY(Z2_SINKAI, "Z2_SINKAI") +DEFINE_DMA_ENTRY(Z2_SINKAI_room_00, "Z2_SINKAI_room_00") +DEFINE_DMA_ENTRY(Z2_YOUSEI_IZUMI, "Z2_YOUSEI_IZUMI") +DEFINE_DMA_ENTRY(Z2_YOUSEI_IZUMI_room_00, "Z2_YOUSEI_IZUMI_room_00") +DEFINE_DMA_ENTRY(Z2_YOUSEI_IZUMI_room_01, "Z2_YOUSEI_IZUMI_room_01") +DEFINE_DMA_ENTRY(Z2_YOUSEI_IZUMI_room_02, "Z2_YOUSEI_IZUMI_room_02") +DEFINE_DMA_ENTRY(Z2_YOUSEI_IZUMI_room_03, "Z2_YOUSEI_IZUMI_room_03") +DEFINE_DMA_ENTRY(Z2_YOUSEI_IZUMI_room_04, "Z2_YOUSEI_IZUMI_room_04") +DEFINE_DMA_ENTRY(Z2_KINSTA1, "Z2_KINSTA1") +DEFINE_DMA_ENTRY(Z2_KINSTA1_room_00, "Z2_KINSTA1_room_00") +DEFINE_DMA_ENTRY(Z2_KINSTA1_room_01, "Z2_KINSTA1_room_01") +DEFINE_DMA_ENTRY(Z2_KINSTA1_room_02, "Z2_KINSTA1_room_02") +DEFINE_DMA_ENTRY(Z2_KINSTA1_room_03, "Z2_KINSTA1_room_03") +DEFINE_DMA_ENTRY(Z2_KINSTA1_room_04, "Z2_KINSTA1_room_04") +DEFINE_DMA_ENTRY(Z2_KINSTA1_room_05, "Z2_KINSTA1_room_05") +DEFINE_DMA_ENTRY(Z2_KINDAN2, "Z2_KINDAN2") +DEFINE_DMA_ENTRY(Z2_KINDAN2_room_00, "Z2_KINDAN2_room_00") +DEFINE_DMA_ENTRY(Z2_KINDAN2_room_01, "Z2_KINDAN2_room_01") +DEFINE_DMA_ENTRY(Z2_KINDAN2_room_02, "Z2_KINDAN2_room_02") +DEFINE_DMA_ENTRY(Z2_KINDAN2_room_03, "Z2_KINDAN2_room_03") +DEFINE_DMA_ENTRY(Z2_KINDAN2_room_04, "Z2_KINDAN2_room_04") +DEFINE_DMA_ENTRY(Z2_KINDAN2_room_05, "Z2_KINDAN2_room_05") +DEFINE_DMA_ENTRY(Z2_TENMON_DAI, "Z2_TENMON_DAI") +DEFINE_DMA_ENTRY(Z2_TENMON_DAI_room_00, "Z2_TENMON_DAI_room_00") +DEFINE_DMA_ENTRY(Z2_TENMON_DAI_room_01, "Z2_TENMON_DAI_room_01") +DEFINE_DMA_ENTRY(Z2_LAST_DEKU, "Z2_LAST_DEKU") +DEFINE_DMA_ENTRY(Z2_LAST_DEKU_room_00, "Z2_LAST_DEKU_room_00") +DEFINE_DMA_ENTRY(Z2_LAST_DEKU_room_01, "Z2_LAST_DEKU_room_01") +DEFINE_DMA_ENTRY(Z2_22DEKUCITY, "Z2_22DEKUCITY") +DEFINE_DMA_ENTRY(Z2_22DEKUCITY_room_00, "Z2_22DEKUCITY_room_00") +DEFINE_DMA_ENTRY(Z2_22DEKUCITY_room_01, "Z2_22DEKUCITY_room_01") +DEFINE_DMA_ENTRY(Z2_22DEKUCITY_room_02, "Z2_22DEKUCITY_room_02") +DEFINE_DMA_ENTRY(Z2_KAJIYA, "Z2_KAJIYA") +DEFINE_DMA_ENTRY(Z2_KAJIYA_room_00, "Z2_KAJIYA_room_00") +DEFINE_DMA_ENTRY(Z2_00KEIKOKU, "Z2_00KEIKOKU") +DEFINE_DMA_ENTRY(Z2_00KEIKOKU_room_00, "Z2_00KEIKOKU_room_00") +DEFINE_DMA_ENTRY(Z2_POSTHOUSE, "Z2_POSTHOUSE") +DEFINE_DMA_ENTRY(Z2_POSTHOUSE_room_00, "Z2_POSTHOUSE_room_00") +DEFINE_DMA_ENTRY(Z2_LABO, "Z2_LABO") +DEFINE_DMA_ENTRY(Z2_LABO_room_00, "Z2_LABO_room_00") +DEFINE_DMA_ENTRY(Z2_DANPEI2TEST, "Z2_DANPEI2TEST") +DEFINE_DMA_ENTRY(Z2_DANPEI2TEST_room_00, "Z2_DANPEI2TEST_room_00") +DEFINE_DMA_ENTRY(Z2_DANPEI2TEST_room_01, "Z2_DANPEI2TEST_room_01") +DEFINE_DMA_ENTRY(Z2_16GORON_HOUSE, "Z2_16GORON_HOUSE") +DEFINE_DMA_ENTRY(Z2_16GORON_HOUSE_room_00, "Z2_16GORON_HOUSE_room_00") +DEFINE_DMA_ENTRY(Z2_16GORON_HOUSE_room_01, "Z2_16GORON_HOUSE_room_01") +DEFINE_DMA_ENTRY(Z2_33ZORACITY, "Z2_33ZORACITY") +DEFINE_DMA_ENTRY(Z2_33ZORACITY_room_00, "Z2_33ZORACITY_room_00") +DEFINE_DMA_ENTRY(Z2_8ITEMSHOP, "Z2_8ITEMSHOP") +DEFINE_DMA_ENTRY(Z2_8ITEMSHOP_room_00, "Z2_8ITEMSHOP_room_00") +DEFINE_DMA_ENTRY(Z2_F01, "Z2_F01") +DEFINE_DMA_ENTRY(Z2_F01_room_00, "Z2_F01_room_00") +DEFINE_DMA_ENTRY(Z2_INISIE_BS, "Z2_INISIE_BS") +DEFINE_DMA_ENTRY(Z2_INISIE_BS_room_00, "Z2_INISIE_BS_room_00") +DEFINE_DMA_ENTRY(Z2_30GYOSON, "Z2_30GYOSON") +DEFINE_DMA_ENTRY(Z2_30GYOSON_room_00, "Z2_30GYOSON_room_00") +DEFINE_DMA_ENTRY(Z2_31MISAKI, "Z2_31MISAKI") +DEFINE_DMA_ENTRY(Z2_31MISAKI_room_00, "Z2_31MISAKI_room_00") +DEFINE_DMA_ENTRY(Z2_TAKARAKUJI, "Z2_TAKARAKUJI") +DEFINE_DMA_ENTRY(Z2_TAKARAKUJI_room_00, "Z2_TAKARAKUJI_room_00") +DEFINE_DMA_ENTRY(Z2_TORIDE, "Z2_TORIDE") +DEFINE_DMA_ENTRY(Z2_TORIDE_room_00, "Z2_TORIDE_room_00") +DEFINE_DMA_ENTRY(Z2_FISHERMAN, "Z2_FISHERMAN") +DEFINE_DMA_ENTRY(Z2_FISHERMAN_room_00, "Z2_FISHERMAN_room_00") +DEFINE_DMA_ENTRY(Z2_GORONSHOP, "Z2_GORONSHOP") +DEFINE_DMA_ENTRY(Z2_GORONSHOP_room_00, "Z2_GORONSHOP_room_00") +DEFINE_DMA_ENTRY(Z2_DEKU_KING, "Z2_DEKU_KING") +DEFINE_DMA_ENTRY(Z2_DEKU_KING_room_00, "Z2_DEKU_KING_room_00") +DEFINE_DMA_ENTRY(Z2_LAST_GORON, "Z2_LAST_GORON") +DEFINE_DMA_ENTRY(Z2_LAST_GORON_room_00, "Z2_LAST_GORON_room_00") +DEFINE_DMA_ENTRY(Z2_LAST_GORON_room_01, "Z2_LAST_GORON_room_01") +DEFINE_DMA_ENTRY(Z2_24KEMONOMITI, "Z2_24KEMONOMITI") +DEFINE_DMA_ENTRY(Z2_24KEMONOMITI_room_00, "Z2_24KEMONOMITI_room_00") +DEFINE_DMA_ENTRY(Z2_F01_B, "Z2_F01_B") +DEFINE_DMA_ENTRY(Z2_F01_B_room_00, "Z2_F01_B_room_00") +DEFINE_DMA_ENTRY(Z2_F01C, "Z2_F01C") +DEFINE_DMA_ENTRY(Z2_F01C_room_00, "Z2_F01C_room_00") +DEFINE_DMA_ENTRY(Z2_BOTI, "Z2_BOTI") +DEFINE_DMA_ENTRY(Z2_BOTI_room_00, "Z2_BOTI_room_00") +DEFINE_DMA_ENTRY(Z2_BOTI_room_01, "Z2_BOTI_room_01") +DEFINE_DMA_ENTRY(Z2_HAKUGIN_BS, "Z2_HAKUGIN_BS") +DEFINE_DMA_ENTRY(Z2_HAKUGIN_BS_room_00, "Z2_HAKUGIN_BS_room_00") +DEFINE_DMA_ENTRY(Z2_20SICHITAI, "Z2_20SICHITAI") +DEFINE_DMA_ENTRY(Z2_20SICHITAI_room_00, "Z2_20SICHITAI_room_00") +DEFINE_DMA_ENTRY(Z2_20SICHITAI_room_01, "Z2_20SICHITAI_room_01") +DEFINE_DMA_ENTRY(Z2_20SICHITAI_room_02, "Z2_20SICHITAI_room_02") +DEFINE_DMA_ENTRY(Z2_21MITURINMAE, "Z2_21MITURINMAE") +DEFINE_DMA_ENTRY(Z2_21MITURINMAE_room_00, "Z2_21MITURINMAE_room_00") +DEFINE_DMA_ENTRY(Z2_LAST_ZORA, "Z2_LAST_ZORA") +DEFINE_DMA_ENTRY(Z2_LAST_ZORA_room_00, "Z2_LAST_ZORA_room_00") +DEFINE_DMA_ENTRY(Z2_11GORONNOSATO2, "Z2_11GORONNOSATO2") +DEFINE_DMA_ENTRY(Z2_11GORONNOSATO2_room_00, "Z2_11GORONNOSATO2_room_00") +DEFINE_DMA_ENTRY(Z2_11GORONNOSATO2_room_01, "Z2_11GORONNOSATO2_room_01") +DEFINE_DMA_ENTRY(Z2_SEA, "Z2_SEA") +DEFINE_DMA_ENTRY(Z2_SEA_room_00, "Z2_SEA_room_00") +DEFINE_DMA_ENTRY(Z2_SEA_room_01, "Z2_SEA_room_01") +DEFINE_DMA_ENTRY(Z2_SEA_room_02, "Z2_SEA_room_02") +DEFINE_DMA_ENTRY(Z2_SEA_room_03, "Z2_SEA_room_03") +DEFINE_DMA_ENTRY(Z2_SEA_room_04, "Z2_SEA_room_04") +DEFINE_DMA_ENTRY(Z2_SEA_room_05, "Z2_SEA_room_05") +DEFINE_DMA_ENTRY(Z2_SEA_room_06, "Z2_SEA_room_06") +DEFINE_DMA_ENTRY(Z2_SEA_room_07, "Z2_SEA_room_07") +DEFINE_DMA_ENTRY(Z2_SEA_room_08, "Z2_SEA_room_08") +DEFINE_DMA_ENTRY(Z2_SEA_room_09, "Z2_SEA_room_09") +DEFINE_DMA_ENTRY(Z2_SEA_room_10, "Z2_SEA_room_10") +DEFINE_DMA_ENTRY(Z2_SEA_room_11, "Z2_SEA_room_11") +DEFINE_DMA_ENTRY(Z2_SEA_room_12, "Z2_SEA_room_12") +DEFINE_DMA_ENTRY(Z2_SEA_room_13, "Z2_SEA_room_13") +DEFINE_DMA_ENTRY(Z2_SEA_room_14, "Z2_SEA_room_14") +DEFINE_DMA_ENTRY(Z2_SEA_room_15, "Z2_SEA_room_15") +DEFINE_DMA_ENTRY(Z2_35TAKI, "Z2_35TAKI") +DEFINE_DMA_ENTRY(Z2_35TAKI_room_00, "Z2_35TAKI_room_00") +DEFINE_DMA_ENTRY(Z2_REDEAD, "Z2_REDEAD") +DEFINE_DMA_ENTRY(Z2_REDEAD_room_00, "Z2_REDEAD_room_00") +DEFINE_DMA_ENTRY(Z2_REDEAD_room_01, "Z2_REDEAD_room_01") +DEFINE_DMA_ENTRY(Z2_REDEAD_room_02, "Z2_REDEAD_room_02") +DEFINE_DMA_ENTRY(Z2_REDEAD_room_03, "Z2_REDEAD_room_03") +DEFINE_DMA_ENTRY(Z2_REDEAD_room_04, "Z2_REDEAD_room_04") +DEFINE_DMA_ENTRY(Z2_REDEAD_room_05, "Z2_REDEAD_room_05") +DEFINE_DMA_ENTRY(Z2_REDEAD_room_06, "Z2_REDEAD_room_06") +DEFINE_DMA_ENTRY(Z2_REDEAD_room_07, "Z2_REDEAD_room_07") +DEFINE_DMA_ENTRY(Z2_REDEAD_room_08, "Z2_REDEAD_room_08") +DEFINE_DMA_ENTRY(Z2_REDEAD_room_09, "Z2_REDEAD_room_09") +DEFINE_DMA_ENTRY(Z2_REDEAD_room_10, "Z2_REDEAD_room_10") +DEFINE_DMA_ENTRY(Z2_REDEAD_room_11, "Z2_REDEAD_room_11") +DEFINE_DMA_ENTRY(Z2_REDEAD_room_12, "Z2_REDEAD_room_12") +DEFINE_DMA_ENTRY(Z2_REDEAD_room_13, "Z2_REDEAD_room_13") +DEFINE_DMA_ENTRY(Z2_BANDROOM, "Z2_BANDROOM") +DEFINE_DMA_ENTRY(Z2_BANDROOM_room_00, "Z2_BANDROOM_room_00") +DEFINE_DMA_ENTRY(Z2_BANDROOM_room_01, "Z2_BANDROOM_room_01") +DEFINE_DMA_ENTRY(Z2_BANDROOM_room_02, "Z2_BANDROOM_room_02") +DEFINE_DMA_ENTRY(Z2_BANDROOM_room_03, "Z2_BANDROOM_room_03") +DEFINE_DMA_ENTRY(Z2_BANDROOM_room_04, "Z2_BANDROOM_room_04") +DEFINE_DMA_ENTRY(Z2_11GORONNOSATO, "Z2_11GORONNOSATO") +DEFINE_DMA_ENTRY(Z2_11GORONNOSATO_room_00, "Z2_11GORONNOSATO_room_00") +DEFINE_DMA_ENTRY(Z2_11GORONNOSATO_room_01, "Z2_11GORONNOSATO_room_01") +DEFINE_DMA_ENTRY(Z2_GORON_HAKA, "Z2_GORON_HAKA") +DEFINE_DMA_ENTRY(Z2_GORON_HAKA_room_00, "Z2_GORON_HAKA_room_00") +DEFINE_DMA_ENTRY(Z2_SECOM, "Z2_SECOM") +DEFINE_DMA_ENTRY(Z2_SECOM_room_00, "Z2_SECOM_room_00") +DEFINE_DMA_ENTRY(Z2_SECOM_room_01, "Z2_SECOM_room_01") +DEFINE_DMA_ENTRY(Z2_10YUKIYAMANOMURA, "Z2_10YUKIYAMANOMURA") +DEFINE_DMA_ENTRY(Z2_10YUKIYAMANOMURA_room_00, "Z2_10YUKIYAMANOMURA_room_00") +DEFINE_DMA_ENTRY(Z2_TOUGITES, "Z2_TOUGITES") +DEFINE_DMA_ENTRY(Z2_TOUGITES_room_00, "Z2_TOUGITES_room_00") +DEFINE_DMA_ENTRY(Z2_DANPEI, "Z2_DANPEI") +DEFINE_DMA_ENTRY(Z2_DANPEI_room_00, "Z2_DANPEI_room_00") +DEFINE_DMA_ENTRY(Z2_DANPEI_room_01, "Z2_DANPEI_room_01") +DEFINE_DMA_ENTRY(Z2_DANPEI_room_02, "Z2_DANPEI_room_02") +DEFINE_DMA_ENTRY(Z2_DANPEI_room_03, "Z2_DANPEI_room_03") +DEFINE_DMA_ENTRY(Z2_DANPEI_room_04, "Z2_DANPEI_room_04") +DEFINE_DMA_ENTRY(Z2_DANPEI_room_05, "Z2_DANPEI_room_05") +DEFINE_DMA_ENTRY(Z2_DANPEI_room_06, "Z2_DANPEI_room_06") +DEFINE_DMA_ENTRY(Z2_DANPEI_room_07, "Z2_DANPEI_room_07") +DEFINE_DMA_ENTRY(Z2_DANPEI_room_08, "Z2_DANPEI_room_08") +DEFINE_DMA_ENTRY(Z2_IKANAMAE, "Z2_IKANAMAE") +DEFINE_DMA_ENTRY(Z2_IKANAMAE_room_00, "Z2_IKANAMAE_room_00") +DEFINE_DMA_ENTRY(Z2_DOUJOU, "Z2_DOUJOU") +DEFINE_DMA_ENTRY(Z2_DOUJOU_room_00, "Z2_DOUJOU_room_00") +DEFINE_DMA_ENTRY(Z2_MUSICHOUSE, "Z2_MUSICHOUSE") +DEFINE_DMA_ENTRY(Z2_MUSICHOUSE_room_00, "Z2_MUSICHOUSE_room_00") +DEFINE_DMA_ENTRY(Z2_IKNINSIDE, "Z2_IKNINSIDE") +DEFINE_DMA_ENTRY(Z2_IKNINSIDE_room_00, "Z2_IKNINSIDE_room_00") +DEFINE_DMA_ENTRY(Z2_IKNINSIDE_room_01, "Z2_IKNINSIDE_room_01") +DEFINE_DMA_ENTRY(Z2_MAP_SHOP, "Z2_MAP_SHOP") +DEFINE_DMA_ENTRY(Z2_MAP_SHOP_room_00, "Z2_MAP_SHOP_room_00") +DEFINE_DMA_ENTRY(Z2_F40, "Z2_F40") +DEFINE_DMA_ENTRY(Z2_F40_room_00, "Z2_F40_room_00") +DEFINE_DMA_ENTRY(Z2_F41, "Z2_F41") +DEFINE_DMA_ENTRY(Z2_F41_room_00, "Z2_F41_room_00") +DEFINE_DMA_ENTRY(Z2_10YUKIYAMANOMURA2, "Z2_10YUKIYAMANOMURA2") +DEFINE_DMA_ENTRY(Z2_10YUKIYAMANOMURA2_room_00, "Z2_10YUKIYAMANOMURA2_room_00") +DEFINE_DMA_ENTRY(Z2_10YUKIYAMANOMURA2_room_01, "Z2_10YUKIYAMANOMURA2_room_01") +DEFINE_DMA_ENTRY(Z2_14YUKIDAMANOMITI, "Z2_14YUKIDAMANOMITI") +DEFINE_DMA_ENTRY(Z2_14YUKIDAMANOMITI_room_00, "Z2_14YUKIDAMANOMITI_room_00") +DEFINE_DMA_ENTRY(Z2_12HAKUGINMAE, "Z2_12HAKUGINMAE") +DEFINE_DMA_ENTRY(Z2_12HAKUGINMAE_room_00, "Z2_12HAKUGINMAE_room_00") +DEFINE_DMA_ENTRY(Z2_17SETUGEN, "Z2_17SETUGEN") +DEFINE_DMA_ENTRY(Z2_17SETUGEN_room_00, "Z2_17SETUGEN_room_00") +DEFINE_DMA_ENTRY(Z2_17SETUGEN2, "Z2_17SETUGEN2") +DEFINE_DMA_ENTRY(Z2_17SETUGEN2_room_00, "Z2_17SETUGEN2_room_00") +DEFINE_DMA_ENTRY(Z2_SEA_BS, "Z2_SEA_BS") +DEFINE_DMA_ENTRY(Z2_SEA_BS_room_00, "Z2_SEA_BS_room_00") +DEFINE_DMA_ENTRY(Z2_RANDOM, "Z2_RANDOM") +DEFINE_DMA_ENTRY(Z2_RANDOM_room_00, "Z2_RANDOM_room_00") +DEFINE_DMA_ENTRY(Z2_RANDOM_room_01, "Z2_RANDOM_room_01") +DEFINE_DMA_ENTRY(Z2_RANDOM_room_02, "Z2_RANDOM_room_02") +DEFINE_DMA_ENTRY(Z2_RANDOM_room_03, "Z2_RANDOM_room_03") +DEFINE_DMA_ENTRY(Z2_RANDOM_room_04, "Z2_RANDOM_room_04") +DEFINE_DMA_ENTRY(Z2_RANDOM_room_05, "Z2_RANDOM_room_05") +DEFINE_DMA_ENTRY(Z2_YADOYA, "Z2_YADOYA") +DEFINE_DMA_ENTRY(Z2_YADOYA_room_00, "Z2_YADOYA_room_00") +DEFINE_DMA_ENTRY(Z2_YADOYA_room_01, "Z2_YADOYA_room_01") +DEFINE_DMA_ENTRY(Z2_YADOYA_room_02, "Z2_YADOYA_room_02") +DEFINE_DMA_ENTRY(Z2_YADOYA_room_03, "Z2_YADOYA_room_03") +DEFINE_DMA_ENTRY(Z2_YADOYA_room_04, "Z2_YADOYA_room_04") +DEFINE_DMA_ENTRY(Z2_KONPEKI_ENT, "Z2_KONPEKI_ENT") +DEFINE_DMA_ENTRY(Z2_KONPEKI_ENT_room_00, "Z2_KONPEKI_ENT_room_00") +DEFINE_DMA_ENTRY(Z2_INSIDETOWER, "Z2_INSIDETOWER") +DEFINE_DMA_ENTRY(Z2_INSIDETOWER_room_00, "Z2_INSIDETOWER_room_00") +DEFINE_DMA_ENTRY(Z2_INSIDETOWER_room_01, "Z2_INSIDETOWER_room_01") +DEFINE_DMA_ENTRY(Z2_26SARUNOMORI, "Z2_26SARUNOMORI") +DEFINE_DMA_ENTRY(Z2_26SARUNOMORI_room_00, "Z2_26SARUNOMORI_room_00") +DEFINE_DMA_ENTRY(Z2_26SARUNOMORI_room_01, "Z2_26SARUNOMORI_room_01") +DEFINE_DMA_ENTRY(Z2_26SARUNOMORI_room_02, "Z2_26SARUNOMORI_room_02") +DEFINE_DMA_ENTRY(Z2_26SARUNOMORI_room_03, "Z2_26SARUNOMORI_room_03") +DEFINE_DMA_ENTRY(Z2_26SARUNOMORI_room_04, "Z2_26SARUNOMORI_room_04") +DEFINE_DMA_ENTRY(Z2_26SARUNOMORI_room_05, "Z2_26SARUNOMORI_room_05") +DEFINE_DMA_ENTRY(Z2_26SARUNOMORI_room_06, "Z2_26SARUNOMORI_room_06") +DEFINE_DMA_ENTRY(Z2_26SARUNOMORI_room_07, "Z2_26SARUNOMORI_room_07") +DEFINE_DMA_ENTRY(Z2_26SARUNOMORI_room_08, "Z2_26SARUNOMORI_room_08") +DEFINE_DMA_ENTRY(Z2_LOST_WOODS, "Z2_LOST_WOODS") +DEFINE_DMA_ENTRY(Z2_LOST_WOODS_room_00, "Z2_LOST_WOODS_room_00") +DEFINE_DMA_ENTRY(Z2_LOST_WOODS_room_01, "Z2_LOST_WOODS_room_01") +DEFINE_DMA_ENTRY(Z2_LOST_WOODS_room_02, "Z2_LOST_WOODS_room_02") +DEFINE_DMA_ENTRY(Z2_LAST_LINK, "Z2_LAST_LINK") +DEFINE_DMA_ENTRY(Z2_LAST_LINK_room_00, "Z2_LAST_LINK_room_00") +DEFINE_DMA_ENTRY(Z2_LAST_LINK_room_01, "Z2_LAST_LINK_room_01") +DEFINE_DMA_ENTRY(Z2_LAST_LINK_room_02, "Z2_LAST_LINK_room_02") +DEFINE_DMA_ENTRY(Z2_LAST_LINK_room_03, "Z2_LAST_LINK_room_03") +DEFINE_DMA_ENTRY(Z2_LAST_LINK_room_04, "Z2_LAST_LINK_room_04") +DEFINE_DMA_ENTRY(Z2_LAST_LINK_room_05, "Z2_LAST_LINK_room_05") +DEFINE_DMA_ENTRY(Z2_LAST_LINK_room_06, "Z2_LAST_LINK_room_06") +DEFINE_DMA_ENTRY(Z2_LAST_LINK_room_07, "Z2_LAST_LINK_room_07") +DEFINE_DMA_ENTRY(Z2_SOUGEN, "Z2_SOUGEN") +DEFINE_DMA_ENTRY(Z2_SOUGEN_room_00, "Z2_SOUGEN_room_00") +DEFINE_DMA_ENTRY(Z2_BOMYA, "Z2_BOMYA") +DEFINE_DMA_ENTRY(Z2_BOMYA_room_00, "Z2_BOMYA_room_00") +DEFINE_DMA_ENTRY(Z2_KYOJINNOMA, "Z2_KYOJINNOMA") +DEFINE_DMA_ENTRY(Z2_KYOJINNOMA_room_00, "Z2_KYOJINNOMA_room_00") +DEFINE_DMA_ENTRY(Z2_KOEPONARACE, "Z2_KOEPONARACE") +DEFINE_DMA_ENTRY(Z2_KOEPONARACE_room_00, "Z2_KOEPONARACE_room_00") +DEFINE_DMA_ENTRY(Z2_GORONRACE, "Z2_GORONRACE") +DEFINE_DMA_ENTRY(Z2_GORONRACE_room_00, "Z2_GORONRACE_room_00") +DEFINE_DMA_ENTRY(Z2_TOWN, "Z2_TOWN") +DEFINE_DMA_ENTRY(Z2_TOWN_room_00, "Z2_TOWN_room_00") +DEFINE_DMA_ENTRY(Z2_ICHIBA, "Z2_ICHIBA") +DEFINE_DMA_ENTRY(Z2_ICHIBA_room_00, "Z2_ICHIBA_room_00") +DEFINE_DMA_ENTRY(Z2_BACKTOWN, "Z2_BACKTOWN") +DEFINE_DMA_ENTRY(Z2_BACKTOWN_room_00, "Z2_BACKTOWN_room_00") +DEFINE_DMA_ENTRY(Z2_CLOCKTOWER, "Z2_CLOCKTOWER") +DEFINE_DMA_ENTRY(Z2_CLOCKTOWER_room_00, "Z2_CLOCKTOWER_room_00") +DEFINE_DMA_ENTRY(Z2_ALLEY, "Z2_ALLEY") +DEFINE_DMA_ENTRY(Z2_ALLEY_room_00, "Z2_ALLEY_room_00") +DEFINE_DMA_ENTRY(SPOT00, "SPOT00") +DEFINE_DMA_ENTRY(SPOT00_room_00, "SPOT00_room_00") +DEFINE_DMA_ENTRY(KAKUSIANA, "KAKUSIANA") +DEFINE_DMA_ENTRY(KAKUSIANA_room_00, "KAKUSIANA_room_00") +DEFINE_DMA_ENTRY(KAKUSIANA_room_01, "KAKUSIANA_room_01") +DEFINE_DMA_ENTRY(KAKUSIANA_room_02, "KAKUSIANA_room_02") +DEFINE_DMA_ENTRY(KAKUSIANA_room_03, "KAKUSIANA_room_03") +DEFINE_DMA_ENTRY(KAKUSIANA_room_04, "KAKUSIANA_room_04") +DEFINE_DMA_ENTRY(KAKUSIANA_room_05, "KAKUSIANA_room_05") +DEFINE_DMA_ENTRY(KAKUSIANA_room_06, "KAKUSIANA_room_06") +DEFINE_DMA_ENTRY(KAKUSIANA_room_07, "KAKUSIANA_room_07") +DEFINE_DMA_ENTRY(KAKUSIANA_room_08, "KAKUSIANA_room_08") +DEFINE_DMA_ENTRY(KAKUSIANA_room_09, "KAKUSIANA_room_09") +DEFINE_DMA_ENTRY(KAKUSIANA_room_10, "KAKUSIANA_room_10") +DEFINE_DMA_ENTRY(KAKUSIANA_room_11, "KAKUSIANA_room_11") +DEFINE_DMA_ENTRY(KAKUSIANA_room_12, "KAKUSIANA_room_12") +DEFINE_DMA_ENTRY(KAKUSIANA_room_13, "KAKUSIANA_room_13") +DEFINE_DMA_ENTRY(KAKUSIANA_room_14, "KAKUSIANA_room_14") +DEFINE_DMA_ENTRY(bump_texture_static, "bump_texture_static") +DEFINE_DMA_ENTRY_UNSET(anime_model_1_static, "anime_model_1_static") +DEFINE_DMA_ENTRY_UNSET(anime_model_2_static, "anime_model_2_static") +DEFINE_DMA_ENTRY_UNSET(anime_model_3_static, "anime_model_3_static") +DEFINE_DMA_ENTRY_UNSET(anime_model_4_static, "anime_model_4_static") +DEFINE_DMA_ENTRY_UNSET(anime_model_5_static, "anime_model_5_static") +DEFINE_DMA_ENTRY_UNSET(anime_model_6_static, "anime_model_6_static") +DEFINE_DMA_ENTRY_UNSET(anime_texture_1_static, "anime_texture_1_static") +DEFINE_DMA_ENTRY_UNSET(anime_texture_2_static, "anime_texture_2_static") +DEFINE_DMA_ENTRY_UNSET(anime_texture_3_static, "anime_texture_3_static") +DEFINE_DMA_ENTRY_UNSET(anime_texture_4_static, "anime_texture_4_static") +DEFINE_DMA_ENTRY_UNSET(anime_texture_5_static, "anime_texture_5_static") +DEFINE_DMA_ENTRY_UNSET(anime_texture_6_static, "anime_texture_6_static") +DEFINE_DMA_ENTRY_UNSET(softsprite_matrix_static, "softsprite_matrix_static") diff --git a/include/tables/dmadata_table.h b/include/tables/dmadata_table.h new file mode 100644 index 0000000000..a5ad2a21f0 --- /dev/null +++ b/include/tables/dmadata_table.h @@ -0,0 +1,9 @@ +/** + * Select dmadata table for version + */ +#ifdef NON_MATCHING +// For non-matching builds, dmadata is generated from the specfile segments +#include "dmadata_table_spec.h" +#else +#include "dmadata/dmadata_table_us.h" +#endif diff --git a/include/variables.h b/include/variables.h index 2db27bd1e9..0c246ef4b5 100644 --- a/include/variables.h +++ b/include/variables.h @@ -6,12 +6,6 @@ #include "macros.h" // data -extern size_t gDmaMgrDmaBuffSize; -extern vs32 gIrqMgrResetStatus; -extern volatile OSTime sIrqMgrResetTime; -extern volatile OSTime gIrqMgrRetraceTime; -extern s32 sIrqMgrRetraceCount; - // extern UNK_TYPE1 sGfxPrintFontTLUT; // extern UNK_TYPE1 sGfxPrintRainbowTLUT; // extern UNK_TYPE1 sGfxPrintRainbowData; @@ -27,8 +21,6 @@ extern void* gYaz0DecompressDstEnd; // extern UNK_TYPE4 D_8009CD10; // extern UNK_TYPE4 sArenaLockMsg; - -extern DmaEntry dmadata[1568]; // extern UNK_TYPE1 D_80186028; extern u8 sDropTable[DROP_TABLE_SIZE * DROP_TABLE_NUMBER]; diff --git a/include/yaz0.h b/include/yaz0.h new file mode 100644 index 0000000000..22c0eea302 --- /dev/null +++ b/include/yaz0.h @@ -0,0 +1,8 @@ +#ifndef YAZ0_H +#define YAZ0_H + +#include "ultra64.h" + +void Yaz0_Decompress(uintptr_t romStart, void* dst, size_t size); + +#endif diff --git a/include/z64dma.h b/include/z64dma.h index 964be9c598..4fdf94f7aa 100644 --- a/include/z64dma.h +++ b/include/z64dma.h @@ -2,16 +2,17 @@ #define Z64DMA_H #include "ultra64.h" +#include "unk.h" typedef struct { - /* 0x00 */ uintptr_t vromAddr; // VROM address (source) - /* 0x04 */ void* dramAddr; // DRAM address (destination) - /* 0x08 */ u32 size; // File Transfer size - /* 0x0C */ char* filename; // Filename for debugging - /* 0x10 */ s32 line; // Line for debugging - /* 0x14 */ s32 unk14; + /* 0x00 */ uintptr_t vromAddr; // VROM address (source) + /* 0x04 */ void* dramAddr; // DRAM address (destination) + /* 0x08 */ size_t size; // File Transfer size + /* 0x0C */ char* filename; // Filename for debugging + /* 0x10 */ s32 line; // Line for debugging + /* 0x14 */ s32 unk14; /* 0x18 */ OSMesgQueue* notifyQueue; // Message queue for the notification message - /* 0x1C */ OSMesg notifyMsg; // Completion notification message + /* 0x1C */ OSMesg notifyMsg; // Completion notification message } DmaRequest; // size = 0x20 typedef struct { @@ -21,4 +22,25 @@ typedef struct { /* 0xC */ uintptr_t romEnd; } DmaEntry; // size = 0x10 +#define DMAMGR_DEFAULT_BUFSIZE ALIGN16(0x2000) + +extern DmaEntry gDmaDataTable[]; +extern size_t gDmaMgrDmaBuffSize; + +// Standard DMA Requests +s32 DmaMgr_RequestAsync(DmaRequest* req, void* ram, uintptr_t vrom, size_t size, UNK_TYPE unused, OSMesgQueue* queue, void* msg); +s32 DmaMgr_RequestSync(void* ram, uintptr_t vrom, size_t size); + +// Special-purpose DMA Requests + +s32 DmaMgr_DmaRomToRam(uintptr_t rom, void* ram, size_t size); +s32 DmaMgr_TranslateVromToRom(uintptr_t vrom); +s32 DmaMgr_AudioDmaHandler(OSPiHandle* pihandle, OSIoMesg* mb, s32 direction); +const char* func_800809F4(uintptr_t vrom); + +// Thread Management + +void DmaMgr_Init(void); +void DmaMgr_Stop(void); + #endif diff --git a/include/z64thread.h b/include/z64thread.h index 21a397fe51..905f08f7f5 100644 --- a/include/z64thread.h +++ b/include/z64thread.h @@ -13,16 +13,17 @@ #define Z_THREAD_ID_DMAMGR 18 #define Z_THREAD_ID_IRQMGR 19 -#define Z_PRIORITY_SLOWLY 5 -#define Z_PRIORITY_GRAPH 9 -#define Z_PRIORITY_AUDIOMGR 11 -#define Z_PRIORITY_IDLE 12 -#define Z_PRIORITY_MAIN 12 -#define Z_PRIORITY_FLASHROM 13 -#define Z_PRIORITY_PADMGR 15 -#define Z_PRIORITY_SCHED 16 -#define Z_PRIORITY_DMAMGR 17 -#define Z_PRIORITY_IRQMGR 18 -#define Z_PRIORITY_FAULT OS_PRIORITY_APPMAX +#define Z_PRIORITY_SLOWLY 5 +#define Z_PRIORITY_GRAPH 9 +#define Z_PRIORITY_DMAMGR_LOW 10 +#define Z_PRIORITY_AUDIOMGR 11 +#define Z_PRIORITY_IDLE 12 +#define Z_PRIORITY_MAIN 12 +#define Z_PRIORITY_FLASHROM 13 +#define Z_PRIORITY_PADMGR 15 +#define Z_PRIORITY_SCHED 16 +#define Z_PRIORITY_DMAMGR 17 +#define Z_PRIORITY_IRQMGR 18 +#define Z_PRIORITY_FAULT OS_PRIORITY_APPMAX #endif diff --git a/spec b/spec index c9b48c7e13..547a70d259 100644 --- a/spec +++ b/spec @@ -247,7 +247,7 @@ endseg beginseg name "dmadata" - include "build/asm/dmadata/dmadata.o" + include "build/src/dmadata/dmadata.o" endseg beginseg @@ -280,6 +280,7 @@ endseg beginseg name "icon_item_static_syms" + flags SYMS romalign 0x1000 include "build/assets/archives/icon_item_static/icon_item_static_yar.symbols.o" number 8 @@ -287,6 +288,7 @@ endseg beginseg name "icon_item_24_static_syms" + flags SYMS romalign 0x1000 include "build/assets/archives/icon_item_24_static/icon_item_24_static_yar.symbols.o" number 9 @@ -366,6 +368,7 @@ endseg beginseg name "schedule_dma_static_syms" + flags SYMS include "build/assets/archives/schedule_dma_static/schedule_dma_static_yar.symbols.o" number 7 endseg diff --git a/src/boot/O2/loadfragment.c b/src/boot/O2/loadfragment.c index 4da7a78b1e..c4831bbcb5 100644 --- a/src/boot/O2/loadfragment.c +++ b/src/boot/O2/loadfragment.c @@ -146,7 +146,7 @@ size_t Fragment_Load(uintptr_t vromStart, uintptr_t vromEnd, void* vramStart, vo if (gLoadLogSeverity >= 3) {} end = (uintptr_t)allocatedRamAddr + size; - DmaMgr_SendRequest0(allocatedRamAddr, vromStart, size); + DmaMgr_RequestSync(allocatedRamAddr, vromStart, size); ovlRelocs = (OverlayRelocationSection*)(end - ((s32*)end)[-1]); @@ -191,7 +191,7 @@ void* Fragment_AllocateAndLoad(uintptr_t vromStart, uintptr_t vromEnd, void* vra if (gLoadLogSeverity >= 3) {} - DmaMgr_SendRequest0(allocatedRamAddr, vromStart, size); + DmaMgr_RequestSync(allocatedRamAddr, vromStart, size); if (gLoadLogSeverity >= 3) {} diff --git a/src/boot/O2/loadfragment2.c b/src/boot/O2/loadfragment2.c index 44b64f532e..460a7f43f1 100644 --- a/src/boot/O2/loadfragment2.c +++ b/src/boot/O2/loadfragment2.c @@ -142,7 +142,7 @@ size_t Overlay_Load(uintptr_t vromStart, uintptr_t vromEnd, void* ramStart, void if (gOverlayLogSeverity >= 3) {} end = (uintptr_t)allocatedRamAddr + size; - DmaMgr_SendRequest0(allocatedRamAddr, vromStart, size); + DmaMgr_RequestSync(allocatedRamAddr, vromStart, size); ovlRelocs = (OverlayRelocationSection*)(end - ((s32*)end)[-1]); diff --git a/src/boot/idle.c b/src/boot/idle.c index cb35fafe87..492f107e13 100644 --- a/src/boot/idle.c +++ b/src/boot/idle.c @@ -73,8 +73,8 @@ void Main_Init(void) { prevSize = gDmaMgrDmaBuffSize; gDmaMgrDmaBuffSize = 0; - DmaMgr_SendRequestImpl(&dmaReq, SEGMENT_START(code), SEGMENT_ROM_START(code), SEGMENT_ROM_SIZE_ALT(code), 0, &mq, - NULL); + DmaMgr_RequestAsync(&dmaReq, SEGMENT_START(code), SEGMENT_ROM_START(code), SEGMENT_ROM_SIZE_ALT(code), 0, &mq, + NULL); Main_InitScreen(); Main_InitMemory(); osRecvMesg(&mq, NULL, OS_MESG_BLOCK); @@ -87,7 +87,7 @@ void Main_Init(void) { void Main_ThreadEntry(void* arg) { StackCheck_Init(&sIrqMgrStackInfo, sIrqMgrStack, STACK_TOP(sIrqMgrStack), 0, 0x100, "irqmgr"); IrqMgr_Init(&gIrqMgr, STACK_TOP(sIrqMgrStack), Z_PRIORITY_IRQMGR, 1); - DmaMgr_Start(); + DmaMgr_Init(); Main_Init(); Main(arg); DmaMgr_Stop(); diff --git a/src/boot/yaz0.c b/src/boot/yaz0.c index 8626628f8d..fb51da7f9f 100644 --- a/src/boot/yaz0.c +++ b/src/boot/yaz0.c @@ -1,7 +1,10 @@ +#include "yaz0.h" + #include "global.h" #include "fault.h" #include "libc64/sprintf.h" #include "libc64/sleep.h" +#include "z64dma.h" u8 sYaz0DataBuffer[0x400] ALIGNED(16); u8* sYaz0CurDataEnd; @@ -10,7 +13,7 @@ u32 sYaz0CurSize; u8* sYaz0MaxPtr; void* gYaz0DecompressDstEnd; -void* Yaz0_FirstDMA() { +void* Yaz0_FirstDMA(void) { u32 pad0; u32 dmaSize; u32 curSize; @@ -51,7 +54,7 @@ void* Yaz0_NextDMA(void* curSrcPos) { } } else { oldPri = osGetThreadPri(NULL); - osSetThreadPri(NULL, 0x7F); + osSetThreadPri(NULL, OS_PRIORITY_APPMAX); osSyncPrintf("圧縮展開異常\n"); osSetThreadPri(NULL, oldPri); } diff --git a/src/boot/z_std_dma.c b/src/boot/z_std_dma.c index 205771f92a..8661fe02c9 100644 --- a/src/boot/z_std_dma.c +++ b/src/boot/z_std_dma.c @@ -1,21 +1,55 @@ -#include "prevent_bss_reordering.h" -#include "global.h" +/** + * @file z_std_dma.c + * + * This file implements a system for structuring the ROM image and retrieving data. It is designed to have the same + * external interface regardless of whether the ROM segments are compressed or not. + * + * The ROM image is partitioned into regions that are entered into the DMA data table `gDmaDataTable`. External code + * does not directly address locations on the ROM image directly, instead a "Virtual ROM" addressing is used. Virtual + * ROM is defined to be the ROM address of a segment in a totally uncompressed ROM. For uncompressed ROMs, "physical" + * ROM and VROM addresses coincide. The DMA data table converts VROM to ROM addresses so that code may exclusively use + * VROM addresses even if the ROM is compressed. + * + * External code typically submits requests to the DMA Manager asking for a transfer in terms of Virtual ROM; the DMA + * Manager translates this to the physical ROM address, performs the transfer to RAM and decompresses the data if + * required. + * Requests are processed in the order they are received and may be submitted both synchronously and asynchronously. + * + * There are some additional provisions to ensure that audio DMA is particularly high-speed, the audio data is assumed + * to be uncompressed and the request queue and address translation is skipped. + */ +#include "z64dma.h" + #include "carthandle.h" #include "fault.h" +#include "macros.h" +#include "segment_symbols.h" #include "stack.h" #include "stackcheck.h" -#include "z64dma.h" +#include "yaz0.h" #include "z64thread.h" -size_t gDmaMgrDmaBuffSize = 0x2000; +size_t gDmaMgrDmaBuffSize = DMAMGR_DEFAULT_BUFSIZE; StackEntry sDmaMgrStackInfo; u16 sNumDmaEntries; OSMesgQueue sDmaMgrMsgQueue; -OSMesg sDmaMgrMsgs[32]; +OSMesg sDmaMgrMsgBuf[32]; OSThread sDmaMgrThread; STACK(sDmaMgrStack, 0x500); +/** + * Transfer `size` bytes from physical ROM address `rom` to `ram`. + * + * This function is intended for internal use only, however it is possible to use this function externally in which + * case it behaves as a synchronous transfer, data is available as soon as this function returns. + * + * Transfers are divided into chunks based on the current value of `gDmaMgrDmaBuffSize` to avoid congestion of the PI + * so that higher priority transfers can still be carried out in a timely manner. The transfers are sent in a queue to + * the OS PI Manager which performs the transfer. + * + * @return 0 if successful, -1 if the DMA could not be queued with the PI Manager. + */ s32 DmaMgr_DmaRomToRam(uintptr_t rom, void* ram, size_t size) { OSIoMesg ioMsg; OSMesgQueue queue; @@ -28,14 +62,14 @@ s32 DmaMgr_DmaRomToRam(uintptr_t rom, void* ram, size_t size) { if (buffSize != 0) { while (buffSize < size) { - ioMsg.hdr.pri = 0; + ioMsg.hdr.pri = OS_MESG_PRI_NORMAL; ioMsg.hdr.retQueue = &queue; ioMsg.devAddr = rom; ioMsg.dramAddr = ram; ioMsg.size = buffSize; - ret = osEPiStartDma(gCartHandle, &ioMsg, 0); + ret = osEPiStartDma(gCartHandle, &ioMsg, OS_READ); if (ret != 0) { - goto END; + goto end; } osRecvMesg(&queue, NULL, OS_MESG_BLOCK); @@ -44,46 +78,52 @@ s32 DmaMgr_DmaRomToRam(uintptr_t rom, void* ram, size_t size) { ram = (u8*)ram + buffSize; } } - ioMsg.hdr.pri = 0; + + ioMsg.hdr.pri = OS_MESG_PRI_NORMAL; ioMsg.hdr.retQueue = &queue; ioMsg.devAddr = rom; ioMsg.dramAddr = ram; ioMsg.size = size; - ret = osEPiStartDma(gCartHandle, &ioMsg, 0); + ret = osEPiStartDma(gCartHandle, &ioMsg, OS_READ); if (ret != 0) { - goto END; + goto end; } osRecvMesg(&queue, NULL, OS_MESG_BLOCK); osInvalDCache(ram, size); -END: +end: return ret; } -s32 DmaMgr_DmaHandler(OSPiHandle* pihandle, OSIoMesg* mb, s32 direction) { +/** + * Callback function to facilitate audio DMA. Audio DMA does not use the request queue as audio data is often needed + * very soon after the request is sent, requiring a higher priority method for enqueueing a DMA on the OS PI command + * queue. + * + * @param pihandle Cartridge ROM PI Handle. + * @param mb IO Message describing the transfer. + * @param direction Read or write. + * @return 0 if the IO Message was successfully put on the OS PI command queue, < 0 otherwise + */ +s32 DmaMgr_AudioDmaHandler(OSPiHandle* pihandle, OSIoMesg* mb, s32 direction) { return osEPiStartDma(pihandle, mb, direction); } DmaEntry* DmaMgr_FindDmaEntry(uintptr_t vrom) { - DmaEntry* curr; + DmaEntry* entry; - for (curr = dmadata; curr->vromEnd != 0; curr++) { - if (vrom < curr->vromStart) { - continue; + for (entry = gDmaDataTable; entry->vromEnd != 0; entry++) { + if ((vrom >= entry->vromStart) && (vrom < entry->vromEnd)) { + return entry; } - if (vrom >= curr->vromEnd) { - continue; - } - - return curr; } return NULL; } -u32 DmaMgr_TranslateVromToRom(uintptr_t vrom) { +s32 DmaMgr_TranslateVromToRom(uintptr_t vrom) { DmaEntry* entry = DmaMgr_FindDmaEntry(vrom); if (entry != NULL) { @@ -105,65 +145,69 @@ s32 DmaMgr_FindDmaIndex(uintptr_t vrom) { DmaEntry* entry = DmaMgr_FindDmaEntry(vrom); if (entry != NULL) { - return entry - dmadata; + return entry - gDmaDataTable; } return -1; } -const char* func_800809F4(u32 a0) { +const char* func_800809F4(uintptr_t vrom) { return "??"; } -void DmaMgr_ProcessMsg(DmaRequest* req) { - uintptr_t vrom; - void* ram; - size_t size; +void DmaMgr_ProcessRequest(DmaRequest* req) { + uintptr_t vrom = req->vromAddr; + void* ram = req->dramAddr; + size_t size = req->size; uintptr_t romStart; size_t romSize; - DmaEntry* dmaEntry; - s32 index; - - vrom = req->vromAddr; - ram = req->dramAddr; - size = req->size; - - index = DmaMgr_FindDmaIndex(vrom); + DmaEntry* entry; + s32 index = DmaMgr_FindDmaIndex(vrom); if ((index >= 0) && (index < sNumDmaEntries)) { - dmaEntry = &dmadata[index]; - if (dmaEntry->romEnd == 0) { - if (dmaEntry->vromEnd < (vrom + size)) { + entry = &gDmaDataTable[index]; + if (entry->romEnd == 0) { + // romEnd of 0 indicates that the file is uncompressed. Files that are stored uncompressed can have + // only part of their content loaded into RAM, so DMA only the requested region. + if (entry->vromEnd < (vrom + size)) { + // Error, vrom + size ends up in a different file than it started in Fault_AddHungupAndCrash("../z_std_dma.c", 499); } - DmaMgr_DmaRomToRam((dmaEntry->romStart + vrom) - dmaEntry->vromStart, (u8*)ram, size); - return; + DmaMgr_DmaRomToRam((entry->romStart + vrom) - entry->vromStart, ram, size); + } else { + // File is compressed. Files that are stored compressed must be loaded into RAM all at once. + + romSize = entry->romEnd - entry->romStart; + romStart = entry->romStart; + + if (vrom != entry->vromStart) { + // Error, requested vrom is not the start of a file + Fault_AddHungupAndCrash("../z_std_dma.c", 518); + } + + if (size != (entry->vromEnd - entry->vromStart)) { + // Error, only part of the file was requested + Fault_AddHungupAndCrash("../z_std_dma.c", 525); + } + + // Reduce the thread priority and decompress the file, the decompression routine handles the DMA + // in chunks. Restores the thread priority when done. + osSetThreadPri(NULL, Z_PRIORITY_DMAMGR_LOW); + Yaz0_Decompress(romStart, ram, romSize); + osSetThreadPri(NULL, Z_PRIORITY_DMAMGR); } - - romSize = dmaEntry->romEnd - dmaEntry->romStart; - romStart = dmaEntry->romStart; - - if (vrom != dmaEntry->vromStart) { - Fault_AddHungupAndCrash("../z_std_dma.c", 518); - } - - if (size != (dmaEntry->vromEnd - dmaEntry->vromStart)) { - Fault_AddHungupAndCrash("../z_std_dma.c", 525); - } - - osSetThreadPri(NULL, 10); - Yaz0_Decompress(romStart, ram, romSize); - osSetThreadPri(NULL, 17); } else { + // Error, invalid index Fault_AddHungupAndCrash("../z_std_dma.c", 558); } } -void DmaMgr_ThreadEntry(void* a0) { +void DmaMgr_ThreadEntry(void* arg) { OSMesg msg; DmaRequest* req; - while (1) { + while (true) { + // Wait for DMA Requests to arrive from other threads osRecvMesg(&sDmaMgrMsgQueue, &msg, OS_MESG_BLOCK); if (msg == NULL) { @@ -172,32 +216,56 @@ void DmaMgr_ThreadEntry(void* a0) { req = (DmaRequest*)msg; - DmaMgr_ProcessMsg(req); - if (req->notifyQueue) { + DmaMgr_ProcessRequest(req); + + // Notify the sender that the request has been processed + if (req->notifyQueue != NULL) { osSendMesg(req->notifyQueue, req->notifyMsg, OS_MESG_NOBLOCK); } } } -s32 DmaMgr_SendRequestImpl(DmaRequest* request, void* vramStart, uintptr_t vromStart, size_t size, UNK_TYPE4 unused, - OSMesgQueue* queue, OSMesg msg) { +/** + * Submit an asynchronous DMA request. Unlike other DMA requests, this will not block the + * current thread. Data arrival is not immediate however, ensure that the request has completed by awaiting a message + * sent to `queue` when the DMA operation has completed. + * + * @param req DMA request, filled out internally. + * @param ram Location in DRAM for data to be written. + * @param vrom Virtual ROM location for data to be read. + * @param size Transfer size. + * @param queue Message queue to notify with `msg` once the transfer is complete. + * @param msg Message to send to `queue` once the transfer is complete. + * @return -2 if Irq is in NMI reset state, 0 otherwise + */ +s32 DmaMgr_RequestAsync(DmaRequest* req, void* ram, uintptr_t vrom, size_t size, UNK_TYPE4 unused, OSMesgQueue* queue, + OSMesg msg) { if (gIrqMgrResetStatus >= 2) { return -2; } - request->vromAddr = vromStart; - request->dramAddr = vramStart; - request->size = size; - request->unk14 = 0; - request->notifyQueue = queue; - request->notifyMsg = msg; + req->vromAddr = vrom; + req->dramAddr = ram; + req->size = size; + req->unk14 = 0; + req->notifyQueue = queue; + req->notifyMsg = msg; - osSendMesg(&sDmaMgrMsgQueue, request, OS_MESG_BLOCK); + osSendMesg(&sDmaMgrMsgQueue, (OSMesg)req, OS_MESG_BLOCK); return 0; } -s32 DmaMgr_SendRequest0(void* vramStart, uintptr_t vromStart, size_t size) { +/** + * Submit a synchronous DMA request. This will block the current thread until the requested transfer is complete. Data + * is immediately available as soon as this function returns. + * + * @param ram Location in DRAM for data to be written. + * @param vrom Virtual ROM location for data to be read. + * @param size Transfer size. + * @return 0 + */ +s32 DmaMgr_RequestSync(void* ram, uintptr_t vrom, size_t size) { DmaRequest req; OSMesgQueue queue; OSMesg msg[1]; @@ -205,33 +273,32 @@ s32 DmaMgr_SendRequest0(void* vramStart, uintptr_t vromStart, size_t size) { osCreateMesgQueue(&queue, msg, ARRAY_COUNT(msg)); - ret = DmaMgr_SendRequestImpl(&req, vramStart, vromStart, size, 0, &queue, NULL); - - if (ret == -1) { + ret = DmaMgr_RequestAsync(&req, ram, vrom, size, 0, &queue, NULL); + if (ret == -1) { // DmaMgr_RequestAsync does not return -1 return ret; - } else { - osRecvMesg(&queue, NULL, OS_MESG_BLOCK); } + osRecvMesg(&queue, NULL, OS_MESG_BLOCK); + return 0; } -void DmaMgr_Start(void) { - DmaMgr_DmaRomToRam(SEGMENT_ROM_START(dmadata), dmadata, SEGMENT_ROM_SIZE(dmadata)); +void DmaMgr_Init(void) { + DmaMgr_DmaRomToRam(SEGMENT_ROM_START(dmadata), gDmaDataTable, SEGMENT_ROM_SIZE(dmadata)); { - DmaEntry* iter = dmadata; - u32 idx = 0; + DmaEntry* entry = gDmaDataTable; + s32 index = 0; - while (iter->vromEnd != 0) { - iter++; - idx++; + while (entry->vromEnd != 0) { + entry++; + index++; } - sNumDmaEntries = idx; + sNumDmaEntries = index; } - osCreateMesgQueue(&sDmaMgrMsgQueue, sDmaMgrMsgs, ARRAY_COUNT(sDmaMgrMsgs)); + osCreateMesgQueue(&sDmaMgrMsgQueue, sDmaMgrMsgBuf, ARRAY_COUNT(sDmaMgrMsgBuf)); 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); diff --git a/src/code/audio_thread_manager.c b/src/code/audio_thread_manager.c index 12941eb2dc..dd74c5a32e 100644 --- a/src/code/audio_thread_manager.c +++ b/src/code/audio_thread_manager.c @@ -80,7 +80,7 @@ void AudioMgr_ThreadEntry(void* arg) { s32 exit; Audio_Init(); - AudioLoad_SetDmaHandler(DmaMgr_DmaHandler); + AudioLoad_SetDmaHandler(DmaMgr_AudioDmaHandler); Audio_InitSound(); osSendMesg(&audioMgr->lockQueue, NULL, OS_MESG_BLOCK); IrqMgr_AddClient(audioMgr->irqMgr, &irqClient, &audioMgr->interruptQueue); diff --git a/src/code/graph.c b/src/code/graph.c index d9264d9b4a..eb0277f3af 100644 --- a/src/code/graph.c +++ b/src/code/graph.c @@ -1,4 +1,3 @@ -#include "prevent_bss_reordering.h" #include "z64.h" #include "regs.h" #include "functions.h" diff --git a/src/code/sys_cmpdma.c b/src/code/sys_cmpdma.c index 71d92c1873..5f236eb7be 100644 --- a/src/code/sys_cmpdma.c +++ b/src/code/sys_cmpdma.c @@ -1,6 +1,9 @@ #include "global.h" #include "libc64/malloc.h" +#include "yaz0.h" +#include "z64dma.h" + typedef struct { /* 0x0 */ union { u32 dmaWord[2]; diff --git a/src/code/sys_initial_check.c b/src/code/sys_initial_check.c index 3f46a58183..4e4326e829 100644 --- a/src/code/sys_initial_check.c +++ b/src/code/sys_initial_check.c @@ -71,7 +71,7 @@ void Check_ClearRGBA16(u16* buffer) { * Draw error message textures directly to a screen buffer at the end of normal RDRAM */ void Check_DrawExpansionPakErrorMessage(void) { - DmaMgr_SendRequest0(CHECK_ERRMSG_STATIC_SEGMENT, SEGMENT_ROM_START(memerrmsg), SEGMENT_SIZE(memerrmsg)); + DmaMgr_RequestSync(CHECK_ERRMSG_STATIC_SEGMENT, SEGMENT_ROM_START(memerrmsg), SEGMENT_SIZE(memerrmsg)); Check_ClearRGBA16((u16*)FAULT_FB_ADDRESS); Check_DrawI4Texture((u16*)FAULT_FB_ADDRESS, 96, 71, MEMERRMSG_WIDTH, MEMERRMSG_HEIGHT, CHECK_ERRMSG_STATIC_SEGMENT); Check_DrawI4Texture((u16*)FAULT_FB_ADDRESS, 96, 127, MEMERRMSG_WIDTH, MEMERRMSG_HEIGHT, @@ -85,7 +85,7 @@ void Check_DrawExpansionPakErrorMessage(void) { * Draw error message texture directly to a screen buffer at the end of normal RDRAM */ void Check_DrawRegionLockErrorMessage(void) { - DmaMgr_SendRequest0(CHECK_ERRMSG_STATIC_SEGMENT, SEGMENT_ROM_START(locerrmsg), SEGMENT_SIZE(locerrmsg)); + DmaMgr_RequestSync(CHECK_ERRMSG_STATIC_SEGMENT, SEGMENT_ROM_START(locerrmsg), SEGMENT_SIZE(locerrmsg)); Check_ClearRGBA16((u16*)FAULT_FB_ADDRESS); Check_DrawI4Texture((u16*)FAULT_FB_ADDRESS, 56, 112, LOCERRMSG_WIDTH, LOCERRMSG_HEIGHT, CHECK_ERRMSG_STATIC_SEGMENT); diff --git a/src/code/z_kanfont.c b/src/code/z_kanfont.c index 2a42998b49..af55acc990 100644 --- a/src/code/z_kanfont.c +++ b/src/code/z_kanfont.c @@ -8,15 +8,14 @@ void Font_LoadCharNES(PlayState* play, u8 codePointIndex, s32 offset) { MessageContext* msgCtx = &play->msgCtx; Font* font = &msgCtx->font; - DmaMgr_SendRequest0(&font->charBuf[font->unk_11D88][offset], - SEGMENT_ROM_START_OFFSET(nes_font_static, (codePointIndex - ' ') * FONT_CHAR_TEX_SIZE), - FONT_CHAR_TEX_SIZE); + DmaMgr_RequestSync(&font->charBuf[font->unk_11D88][offset], + SEGMENT_ROM_START_OFFSET(nes_font_static, (codePointIndex - ' ') * FONT_CHAR_TEX_SIZE), + FONT_CHAR_TEX_SIZE); } void Font_LoadMessageBoxEndIcon(Font* font, u16 icon) { - DmaMgr_SendRequest0(&font->iconBuf, - SEGMENT_ROM_START_OFFSET(message_static, 5 * 0x1000 + icon * FONT_CHAR_TEX_SIZE), - FONT_CHAR_TEX_SIZE); + DmaMgr_RequestSync(&font->iconBuf, SEGMENT_ROM_START_OFFSET(message_static, 5 * 0x1000 + icon * FONT_CHAR_TEX_SIZE), + FONT_CHAR_TEX_SIZE); } static u8 sFontOrdering[] = { @@ -39,7 +38,7 @@ void Font_LoadOrderedFont(Font* font) { loadOffset = 0; } - DmaMgr_SendRequest0(writeLocation, SEGMENT_ROM_START(nes_font_static) + loadOffset, FONT_CHAR_TEX_SIZE); + DmaMgr_RequestSync(writeLocation, SEGMENT_ROM_START(nes_font_static) + loadOffset, FONT_CHAR_TEX_SIZE); if (sFontOrdering[codePointIndex] == 0x8C) { break; } diff --git a/src/code/z_kankyo.c b/src/code/z_kankyo.c index f58de2c6bc..ffe480837c 100644 --- a/src/code/z_kankyo.c +++ b/src/code/z_kankyo.c @@ -1084,8 +1084,8 @@ void Environment_UpdateSkybox(u8 skyboxId, EnvironmentContext* envCtx, SkyboxCon envCtx->skyboxDmaState = SKYBOX_DMA_TEXTURE1_START; size = sNormalSkyFiles[skybox1Index].file.vromEnd - sNormalSkyFiles[skybox1Index].file.vromStart; osCreateMesgQueue(&envCtx->loadQueue, envCtx->loadMsg, ARRAY_COUNT(envCtx->loadMsg)); - DmaMgr_SendRequestImpl(&envCtx->dmaRequest, skyboxCtx->staticSegments[0], - sNormalSkyFiles[skybox1Index].file.vromStart, size, 0, &envCtx->loadQueue, NULL); + DmaMgr_RequestAsync(&envCtx->dmaRequest, skyboxCtx->staticSegments[0], + sNormalSkyFiles[skybox1Index].file.vromStart, size, 0, &envCtx->loadQueue, NULL); envCtx->skybox1Index = skybox1Index; } @@ -1093,8 +1093,8 @@ void Environment_UpdateSkybox(u8 skyboxId, EnvironmentContext* envCtx, SkyboxCon envCtx->skyboxDmaState = SKYBOX_DMA_TEXTURE2_START; size = sNormalSkyFiles[skybox2Index].file.vromEnd - sNormalSkyFiles[skybox2Index].file.vromStart; osCreateMesgQueue(&envCtx->loadQueue, envCtx->loadMsg, ARRAY_COUNT(envCtx->loadMsg)); - DmaMgr_SendRequestImpl(&envCtx->dmaRequest, skyboxCtx->staticSegments[1], - sNormalSkyFiles[skybox2Index].file.vromStart, size, 0, &envCtx->loadQueue, NULL); + DmaMgr_RequestAsync(&envCtx->dmaRequest, skyboxCtx->staticSegments[1], + sNormalSkyFiles[skybox2Index].file.vromStart, size, 0, &envCtx->loadQueue, NULL); envCtx->skybox2Index = skybox2Index; } diff --git a/src/code/z_message.c b/src/code/z_message.c index 7e6c9356ac..4bac94d584 100644 --- a/src/code/z_message.c +++ b/src/code/z_message.c @@ -2270,9 +2270,9 @@ void Message_Decode(PlayState* play) { decodedBufPos += playerNameLen - 1; spC0 += playerNameLen * (16.0f * msgCtx->textCharScale); } else if (curChar == 0x201) { - DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1000, SEGMENT_ROM_START(message_texture_static), 0x900); - DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1900, SEGMENT_ROM_START(message_texture_static) + 0x900, - 0x900); + DmaMgr_RequestSync(msgCtx->textboxSegment + 0x1000, SEGMENT_ROM_START(message_texture_static), 0x900); + DmaMgr_RequestSync(msgCtx->textboxSegment + 0x1900, SEGMENT_ROM_START(message_texture_static) + 0x900, + 0x900); numLines = 2; spD2 = 2; msgCtx->unk12012 = msgCtx->textboxY + 8; @@ -3038,8 +3038,8 @@ void func_80150A84(PlayState* play) { s32 textBoxType = msgCtx->textBoxType; if (D_801CFC78[textBoxType] != 14) { - DmaMgr_SendRequest0(msgCtx->textboxSegment, - SEGMENT_ROM_START(message_static) + D_801CFC78[textBoxType] * 0x1000, 0x1000); + DmaMgr_RequestSync(msgCtx->textboxSegment, SEGMENT_ROM_START(message_static) + D_801CFC78[textBoxType] * 0x1000, + 0x1000); if (!play->pauseCtx.bombersNotebookOpen) { if ((textBoxType == TEXTBOX_TYPE_0) || (textBoxType == TEXTBOX_TYPE_6) || (textBoxType == TEXTBOX_TYPE_A) || @@ -3166,18 +3166,18 @@ void Message_OpenText(PlayState* play, u16 textId) { if (msgCtx->textIsCredits) { Message_FindCreditsMessage(play, textId); msgCtx->msgLength = font->messageEnd; - DmaMgr_SendRequest0(&font->msgBuf, SEGMENT_ROM_START(staff_message_data_static) + font->messageStart, - font->messageEnd); + DmaMgr_RequestSync(&font->msgBuf, SEGMENT_ROM_START(staff_message_data_static) + font->messageStart, + font->messageEnd); } else if (gSaveContext.options.language == LANGUAGE_JPN) { Message_FindMessage(play, textId); msgCtx->msgLength = font->messageEnd; - DmaMgr_SendRequest0(&font->msgBuf, SEGMENT_ROM_START(message_data_static) + font->messageStart, - font->messageEnd); + DmaMgr_RequestSync(&font->msgBuf, SEGMENT_ROM_START(message_data_static) + font->messageStart, + font->messageEnd); } else { Message_FindMessageNES(play, textId); msgCtx->msgLength = font->messageEnd; - DmaMgr_SendRequest0(&font->msgBuf, SEGMENT_ROM_START(message_data_static) + font->messageStart, - font->messageEnd); + DmaMgr_RequestSync(&font->msgBuf, SEGMENT_ROM_START(message_data_static) + font->messageStart, + font->messageEnd); } msgCtx->choiceNum = 0; @@ -3265,13 +3265,13 @@ void func_801514B0(PlayState* play, u16 arg1, u8 arg2) { if (gSaveContext.options.language == LANGUAGE_JPN) { Message_FindMessage(play, arg1); msgCtx->msgLength = font->messageEnd; - DmaMgr_SendRequest0(&font->msgBuf, SEGMENT_ROM_START(message_data_static) + font->messageStart, - font->messageEnd); + DmaMgr_RequestSync(&font->msgBuf, SEGMENT_ROM_START(message_data_static) + font->messageStart, + font->messageEnd); } else { Message_FindMessageNES(play, arg1); msgCtx->msgLength = font->messageEnd; - DmaMgr_SendRequest0(&font->msgBuf, SEGMENT_ROM_START(message_data_static) + font->messageStart, - font->messageEnd); + DmaMgr_RequestSync(&font->msgBuf, SEGMENT_ROM_START(message_data_static) + font->messageStart, + font->messageEnd); } msgCtx->choiceNum = 0; msgCtx->textUnskippable = false; @@ -3285,7 +3285,7 @@ void func_801514B0(PlayState* play, u16 arg1, u8 arg2) { msgCtx->textBoxPos = arg2; msgCtx->unk11F0C = msgCtx->unk11F08 & 0xF; msgCtx->textUnskippable = true; - DmaMgr_SendRequest0(msgCtx->textboxSegment, SEGMENT_ROM_START(message_static) + (D_801CFC78[0] << 12), 0x1000); + DmaMgr_RequestSync(msgCtx->textboxSegment, SEGMENT_ROM_START(message_static) + (D_801CFC78[0] << 12), 0x1000); msgCtx->textboxColorRed = 0; msgCtx->textboxColorGreen = 0; msgCtx->textboxColorBlue = 0; diff --git a/src/code/z_message_nes.c b/src/code/z_message_nes.c index db74d56c1c..bca40c4711 100644 --- a/src/code/z_message_nes.c +++ b/src/code/z_message_nes.c @@ -1084,9 +1084,9 @@ void Message_DecodeNES(PlayState* play) { } decodedBufPos--; } else if (curChar == 0xC1) { - DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1000, SEGMENT_ROM_START(message_texture_static), 0x900); - DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1900, SEGMENT_ROM_START(message_texture_static) + 0x900, - 0x900); + DmaMgr_RequestSync(msgCtx->textboxSegment + 0x1000, SEGMENT_ROM_START(message_texture_static), 0x900); + DmaMgr_RequestSync(msgCtx->textboxSegment + 0x1900, SEGMENT_ROM_START(message_texture_static) + 0x900, + 0x900); numLines = 2; spC6 = 2; msgCtx->unk12012 = msgCtx->textboxY + 8; diff --git a/src/code/z_message_staff.c b/src/code/z_message_staff.c index 1219f3dc7d..e5f0eb246c 100644 --- a/src/code/z_message_staff.c +++ b/src/code/z_message_staff.c @@ -627,10 +627,10 @@ void Message_DecodeCredits(PlayState* play) { msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos + 1]; Message_LoadItemIcon(play, font->msgBuf.schar[msgCtx->msgBufPos + 1], msgCtx->textboxY + 10); } else if (curChar == 0x15) { - DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1000, - (uintptr_t)SEGMENT_ROM_START(message_texture_static) + 0x900, 0x900); - DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1900, - (uintptr_t)SEGMENT_ROM_START(message_texture_static) + 0x900, 0x900); + DmaMgr_RequestSync(msgCtx->textboxSegment + 0x1000, + (uintptr_t)SEGMENT_ROM_START(message_texture_static) + 0x900, 0x900); + DmaMgr_RequestSync(msgCtx->textboxSegment + 0x1900, + (uintptr_t)SEGMENT_ROM_START(message_texture_static) + 0x900, 0x900); msgCtx->msgBufPos += 3; msgCtx->unk12012 = msgCtx->textboxY + 8; numLines = 2; diff --git a/src/code/z_parameter.c b/src/code/z_parameter.c index f2b4330fc7..7d0340e14c 100644 --- a/src/code/z_parameter.c +++ b/src/code/z_parameter.c @@ -919,8 +919,8 @@ void Interface_NewDay(PlayState* play, s32 day) { } // Loads day number from week_static for the three-day clock - DmaMgr_SendRequest0((void*)(play->interfaceCtx.doActionSegment + 0x780), - SEGMENT_ROM_START_OFFSET(week_static, i * 0x510), 0x510); + DmaMgr_RequestSync((void*)(play->interfaceCtx.doActionSegment + 0x780), + SEGMENT_ROM_START_OFFSET(week_static, i * 0x510), 0x510); // i is used to store sceneId for (i = 0; i < ARRAY_COUNT(gSaveContext.save.saveInfo.permanentSceneFlags); i++) { @@ -6586,8 +6586,8 @@ void Interface_LoadStory(PlayState* play, s32 osMesgFlag) { break; } osCreateMesgQueue(&interfaceCtx->storyMsgQueue, &interfaceCtx->storyMsgBuf, 1); - DmaMgr_SendRequestImpl(&interfaceCtx->dmaRequest, interfaceCtx->storySegment, interfaceCtx->storyAddr, - interfaceCtx->storySize, 0, &interfaceCtx->storyMsgQueue, NULL); + DmaMgr_RequestAsync(&interfaceCtx->dmaRequest, interfaceCtx->storySegment, interfaceCtx->storyAddr, + interfaceCtx->storySize, 0, &interfaceCtx->storyMsgQueue, NULL); interfaceCtx->storyDmaStatus = STORY_DMA_LOADING; // fallthrough case STORY_DMA_LOADING: @@ -7121,12 +7121,11 @@ void Interface_Init(PlayState* play) { parameterStaticSize = SEGMENT_ROM_SIZE(parameter_static); interfaceCtx->parameterSegment = THA_AllocTailAlign16(&play->state.tha, parameterStaticSize); - DmaMgr_SendRequest0(interfaceCtx->parameterSegment, SEGMENT_ROM_START(parameter_static), parameterStaticSize); + DmaMgr_RequestSync(interfaceCtx->parameterSegment, SEGMENT_ROM_START(parameter_static), parameterStaticSize); interfaceCtx->doActionSegment = THA_AllocTailAlign16(&play->state.tha, 0xC90); - DmaMgr_SendRequest0(interfaceCtx->doActionSegment, SEGMENT_ROM_START(do_action_static), 0x300); - DmaMgr_SendRequest0(interfaceCtx->doActionSegment + 0x300, SEGMENT_ROM_START_OFFSET(do_action_static, 0x480), - 0x180); + DmaMgr_RequestSync(interfaceCtx->doActionSegment, SEGMENT_ROM_START(do_action_static), 0x300); + DmaMgr_RequestSync(interfaceCtx->doActionSegment + 0x300, SEGMENT_ROM_START_OFFSET(do_action_static, 0x480), 0x180); Interface_NewDay(play, CURRENT_DAY); diff --git a/src/code/z_play.c b/src/code/z_play.c index 046eae6760..7e285f02f2 100644 --- a/src/code/z_play.c +++ b/src/code/z_play.c @@ -1554,7 +1554,7 @@ void* Play_LoadFile(PlayState* this, RomFile* entry) { size_t size = entry->vromEnd - entry->vromStart; void* allocp = THA_AllocTailAlign16(&this->state.tha, size); - DmaMgr_SendRequest0(allocp, entry->vromStart, size); + DmaMgr_RequestSync(allocp, entry->vromStart, size); return allocp; } diff --git a/src/code/z_play_hireso.c b/src/code/z_play_hireso.c index 1871bc67f0..eee85e07d4 100644 --- a/src/code/z_play_hireso.c +++ b/src/code/z_play_hireso.c @@ -1106,8 +1106,8 @@ void BombersNotebook_LoadFiles(BombersNotebook* this, s32 flag) { } CmpDma_LoadAllFiles(this->scheduleDmaSegmentStart, this->scheduleDmaSegment, this->scheduleDmaSegmentSize); osCreateMesgQueue(&this->loadQueue, this->loadMsg, ARRAY_COUNT(this->loadMsg)); - DmaMgr_SendRequestImpl(&this->dmaRequest, this->scheduleSegment, this->scheduleSegmentStart, - this->scheduleSegmentSize, 0, &this->loadQueue, NULL); + DmaMgr_RequestAsync(&this->dmaRequest, this->scheduleSegment, this->scheduleSegmentStart, + this->scheduleSegmentSize, 0, &this->loadQueue, NULL); this->loadState = BOMBERS_NOTEBOOK_LOAD_STATE_STARTED; // fallthrough case BOMBERS_NOTEBOOK_LOAD_STATE_STARTED: diff --git a/src/code/z_player_lib.c b/src/code/z_player_lib.c index 8901069e36..07b772c79b 100644 --- a/src/code/z_player_lib.c +++ b/src/code/z_player_lib.c @@ -200,9 +200,9 @@ void func_801229FC(Player* player) { s16 objectId = sMaskObjectIds[(u8)player->maskId - 1]; osCreateMesgQueue(&player->maskObjectLoadQueue, &player->maskObjectLoadMsg, 1); - DmaMgr_SendRequestImpl(&player->maskDmaRequest, player->maskObjectSegment, gObjectTable[objectId].vromStart, - gObjectTable[objectId].vromEnd - gObjectTable[objectId].vromStart, 0, - &player->maskObjectLoadQueue, NULL); + DmaMgr_RequestAsync(&player->maskDmaRequest, player->maskObjectSegment, gObjectTable[objectId].vromStart, + gObjectTable[objectId].vromEnd - gObjectTable[objectId].vromStart, 0, + &player->maskObjectLoadQueue, NULL); player->maskObjectLoadState++; } else if (player->maskObjectLoadState == 2) { if (osRecvMesg(&player->maskObjectLoadQueue, NULL, OS_MESG_NOBLOCK) == 0) { diff --git a/src/code/z_room.c b/src/code/z_room.c index 5dc9c452fe..71a60fd50f 100644 --- a/src/code/z_room.c +++ b/src/code/z_room.c @@ -560,8 +560,8 @@ s32 Room_StartRoomTransition(PlayState* play, RoomContext* roomCtx, s32 index) { (size + 8) * roomCtx->activeMemPage - 7)); osCreateMesgQueue(&roomCtx->loadQueue, roomCtx->loadMsg, ARRAY_COUNT(roomCtx->loadMsg)); - DmaMgr_SendRequestImpl(&roomCtx->dmaRequest, roomCtx->activeRoomVram, play->roomList[index].vromStart, size, 0, - &roomCtx->loadQueue, NULL); + DmaMgr_RequestAsync(&roomCtx->dmaRequest, roomCtx->activeRoomVram, play->roomList[index].vromStart, size, 0, + &roomCtx->loadQueue, NULL); roomCtx->activeMemPage ^= 1; return 1; diff --git a/src/code/z_scene.c b/src/code/z_scene.c index b6d3ed1942..6fe2718ff5 100644 --- a/src/code/z_scene.c +++ b/src/code/z_scene.c @@ -22,7 +22,7 @@ s32 Object_SpawnPersistent(ObjectContext* objectCtx, s16 id) { if (1) {} if (size != 0) { - DmaMgr_SendRequest0(objectCtx->slots[objectCtx->numEntries].segment, gObjectTable[id].vromStart, size); + DmaMgr_RequestSync(objectCtx->slots[objectCtx->numEntries].segment, gObjectTable[id].vromStart, size); } if (objectCtx->numEntries < ARRAY_COUNT(objectCtx->slots) - 1) { @@ -87,8 +87,8 @@ void Object_UpdateEntries(ObjectContext* objectCtx) { entry->id = 0; } else { osCreateMesgQueue(&entry->loadQueue, &entry->loadMsg, 1); - DmaMgr_SendRequestImpl(&entry->dmaReq, entry->segment, objectFile->vromStart, size, 0, - &entry->loadQueue, NULL); + DmaMgr_RequestAsync(&entry->dmaReq, entry->segment, objectFile->vromStart, size, 0, + &entry->loadQueue, NULL); } } else if (!osRecvMesg(&entry->loadQueue, NULL, OS_MESG_NOBLOCK)) { entry->id = id; @@ -132,7 +132,7 @@ void Object_LoadAll(ObjectContext* objectCtx) { continue; } - DmaMgr_SendRequest0(objectCtx->slots[i].segment, gObjectTable[id].vromStart, vromSize); + DmaMgr_RequestSync(objectCtx->slots[i].segment, gObjectTable[id].vromStart, vromSize); } } @@ -372,7 +372,7 @@ void Scene_LoadAreaTextures(PlayState* play, s32 fileIndex) { if (size != 0) { play->roomCtx.unk74 = THA_AllocTailAlign16(&play->state.tha, size); - DmaMgr_SendRequest0(play->roomCtx.unk74, vromStart, size); + DmaMgr_RequestSync(play->roomCtx.unk74, vromStart, size); } } diff --git a/src/code/z_skelanime.c b/src/code/z_skelanime.c index c7062332c4..9c4e523913 100644 --- a/src/code/z_skelanime.c +++ b/src/code/z_skelanime.c @@ -1011,7 +1011,7 @@ void AnimationContext_SetLoadFrame(PlayState* play, PlayerAnimationHeader* anima s32 pad; osCreateMesgQueue(&entry->data.load.msgQueue, entry->data.load.msg, ARRAY_COUNT(entry->data.load.msg)); - DmaMgr_SendRequestImpl( + DmaMgr_RequestAsync( &entry->data.load.req, frameTable, LINK_ANIMETION_OFFSET(playerAnimHeader->linkAnimSegment, (sizeof(Vec3s) * limbCount + sizeof(s16)) * frame), sizeof(Vec3s) * limbCount + sizeof(s16), 0, &entry->data.load.msgQueue, NULL); diff --git a/src/code/z_vr_box.c b/src/code/z_vr_box.c index 23f00d2460..7819de4df6 100644 --- a/src/code/z_vr_box.c +++ b/src/code/z_vr_box.c @@ -197,19 +197,19 @@ void Skybox_Setup(GameState* gameState, SkyboxContext* skyboxCtx, s16 skyboxId) skyboxCtx->staticSegments[0] = gLoBuffer.skyboxBuffer; size = SEGMENT_ROM_SIZE(d2_cloud_static); segment = (void*)ALIGN8((uintptr_t)skyboxCtx->staticSegments[0] + size); - DmaMgr_SendRequest0(skyboxCtx->staticSegments[0], SEGMENT_ROM_START(d2_cloud_static), size); + DmaMgr_RequestSync(skyboxCtx->staticSegments[0], SEGMENT_ROM_START(d2_cloud_static), size); // Send a DMA request for the clear sky texture skyboxCtx->staticSegments[1] = segment; size = SEGMENT_ROM_SIZE(d2_fine_static); segment = (void*)ALIGN8((uintptr_t)segment + size); - DmaMgr_SendRequest0(skyboxCtx->staticSegments[1], SEGMENT_ROM_START(d2_fine_static), size); + DmaMgr_RequestSync(skyboxCtx->staticSegments[1], SEGMENT_ROM_START(d2_fine_static), size); // Send a DMA request for the skybox palette skyboxCtx->paletteStaticSegment = segment; size = SEGMENT_ROM_SIZE(d2_fine_pal_static); segment = (void*)ALIGN8((uintptr_t)segment + size); - DmaMgr_SendRequest0(skyboxCtx->paletteStaticSegment, SEGMENT_ROM_START(d2_fine_pal_static), size); + DmaMgr_RequestSync(skyboxCtx->paletteStaticSegment, SEGMENT_ROM_START(d2_fine_pal_static), size); skyboxCtx->prim.r = 145; skyboxCtx->prim.g = 120; @@ -244,14 +244,14 @@ void func_80143324(PlayState* play, SkyboxContext* skyboxCtx, s16 skyboxId) { // Send a DMA request for the clear sky texture size = SEGMENT_ROM_SIZE(d2_fine_static); - DmaMgr_SendRequestImpl(&skyboxCtx->unk188, skyboxCtx->staticSegments[0], - SEGMENT_ROM_START(d2_fine_static), size, 0, &skyboxCtx->loadQueue, NULL); + DmaMgr_RequestAsync(&skyboxCtx->unk188, skyboxCtx->staticSegments[0], SEGMENT_ROM_START(d2_fine_static), + size, 0, &skyboxCtx->loadQueue, NULL); } else { // Send a DMA request for the cloudy sky texture size = SEGMENT_ROM_SIZE(d2_cloud_static); - DmaMgr_SendRequestImpl(&skyboxCtx->unk188, skyboxCtx->staticSegments[0], - SEGMENT_ROM_START(d2_cloud_static), size, 0, &skyboxCtx->loadQueue, NULL); + DmaMgr_RequestAsync(&skyboxCtx->unk188, skyboxCtx->staticSegments[0], + SEGMENT_ROM_START(d2_cloud_static), size, 0, &skyboxCtx->loadQueue, NULL); } osRecvMesg(&skyboxCtx->loadQueue, NULL, OS_MESG_BLOCK); @@ -261,14 +261,14 @@ void func_80143324(PlayState* play, SkyboxContext* skyboxCtx, s16 skyboxId) { // Send a DMA request for the clear sky texture size = SEGMENT_ROM_SIZE(d2_fine_static); - DmaMgr_SendRequestImpl(&skyboxCtx->unk1A8, skyboxCtx->staticSegments[1], - SEGMENT_ROM_START(d2_fine_static), size, 0, &skyboxCtx->loadQueue, NULL); + DmaMgr_RequestAsync(&skyboxCtx->unk1A8, skyboxCtx->staticSegments[1], SEGMENT_ROM_START(d2_fine_static), + size, 0, &skyboxCtx->loadQueue, NULL); } else { // Send a DMA request for the cloudy sky texture size = SEGMENT_ROM_SIZE(d2_cloud_static); - DmaMgr_SendRequestImpl(&skyboxCtx->unk1A8, skyboxCtx->staticSegments[1], - SEGMENT_ROM_START(d2_cloud_static), size, 0, &skyboxCtx->loadQueue, NULL); + DmaMgr_RequestAsync(&skyboxCtx->unk1A8, skyboxCtx->staticSegments[1], + SEGMENT_ROM_START(d2_cloud_static), size, 0, &skyboxCtx->loadQueue, NULL); } osRecvMesg(&skyboxCtx->loadQueue, NULL, OS_MESG_BLOCK); @@ -277,8 +277,8 @@ void func_80143324(PlayState* play, SkyboxContext* skyboxCtx, s16 skyboxId) { size = SEGMENT_ROM_SIZE(d2_fine_pal_static); // Send a DMA request for the skybox palette - DmaMgr_SendRequestImpl(&skyboxCtx->unk1C8, skyboxCtx->paletteStaticSegment, - SEGMENT_ROM_START(d2_fine_pal_static), size, 0, &skyboxCtx->loadQueue, NULL); + DmaMgr_RequestAsync(&skyboxCtx->unk1C8, skyboxCtx->paletteStaticSegment, + SEGMENT_ROM_START(d2_fine_pal_static), size, 0, &skyboxCtx->loadQueue, NULL); osRecvMesg(&skyboxCtx->loadQueue, NULL, OS_MESG_BLOCK); break; diff --git a/src/dmadata/dmadata.c b/src/dmadata/dmadata.c new file mode 100644 index 0000000000..988e0aface --- /dev/null +++ b/src/dmadata/dmadata.c @@ -0,0 +1,28 @@ +#include "segment_symbols.h" +#include "z64dma.h" + +// Linker symbol declarations (used in the table below) +#define DEFINE_DMA_ENTRY(name, _nameString) DECLARE_ROM_SEGMENT(name) +#define DEFINE_DMA_ENTRY_UNSET(name, _nameString) DECLARE_ROM_SEGMENT(name) + +#include "tables/dmadata_table.h" + +#undef DEFINE_DMA_ENTRY +#undef DEFINE_DMA_ENTRY_UNSET + +// dmadata Table definition +#define DEFINE_DMA_ENTRY(name, _nameString) \ + { SEGMENT_ROM_START(name), SEGMENT_ROM_END(name), SEGMENT_ROM_START(name), 0 }, +#define DEFINE_DMA_ENTRY_UNSET(name, _nameString) \ + { SEGMENT_ROM_START(name), SEGMENT_ROM_END(name), 0xFFFFFFFF, 0xFFFFFFFF }, + +DmaEntry gDmaDataTable[] = { +#include "tables/dmadata_table.h" + { 0 }, +}; + +#undef DEFINE_DMA_ENTRY +#undef DEFINE_DMA_ENTRY_UNSET + +u8 sDmaDataPadding[0xF0] = { 0 }; +static s32 sBssPad; diff --git a/src/overlays/actors/ovl_player_actor/z_player.c b/src/overlays/actors/ovl_player_actor/z_player.c index 866a6f395b..78555673aa 100644 --- a/src/overlays/actors/ovl_player_actor/z_player.c +++ b/src/overlays/actors/ovl_player_actor/z_player.c @@ -7316,9 +7316,9 @@ void func_80838830(Player* this, s16 objectId) { if (objectId != OBJECT_UNSET_0) { this->giObjectLoading = true; osCreateMesgQueue(&this->giObjectLoadQueue, &this->giObjectLoadMsg, 1); - DmaMgr_SendRequestImpl(&this->giObjectDmaRequest, this->giObjectSegment, gObjectTable[objectId].vromStart, - gObjectTable[objectId].vromEnd - gObjectTable[objectId].vromStart, 0, - &this->giObjectLoadQueue, NULL); + DmaMgr_RequestAsync(&this->giObjectDmaRequest, this->giObjectSegment, gObjectTable[objectId].vromStart, + gObjectTable[objectId].vromEnd - gObjectTable[objectId].vromStart, 0, + &this->giObjectLoadQueue, NULL); } } diff --git a/src/overlays/gamestates/ovl_daytelop/z_daytelop.c b/src/overlays/gamestates/ovl_daytelop/z_daytelop.c index 034f14412f..19b9670e16 100644 --- a/src/overlays/gamestates/ovl_daytelop/z_daytelop.c +++ b/src/overlays/gamestates/ovl_daytelop/z_daytelop.c @@ -216,11 +216,11 @@ void DayTelop_LoadGraphics(DayTelopState* this) { size_t segmentSize = SEGMENT_ROM_SIZE(daytelop_static); this->daytelopStaticFile = THA_AllocTailAlign16(&this->state.tha, segmentSize); - DmaMgr_SendRequest0(this->daytelopStaticFile, SEGMENT_ROM_START(daytelop_static), segmentSize); + DmaMgr_RequestSync(this->daytelopStaticFile, SEGMENT_ROM_START(daytelop_static), segmentSize); segmentSize = SEGMENT_ROM_SIZE(icon_item_gameover_static); this->gameoverStaticFile = THA_AllocTailAlign16(&this->state.tha, segmentSize); - DmaMgr_SendRequest0(this->gameoverStaticFile, SEGMENT_ROM_START(icon_item_gameover_static), segmentSize); + DmaMgr_RequestSync(this->gameoverStaticFile, SEGMENT_ROM_START(icon_item_gameover_static), segmentSize); } void DayTelop_Init(GameState* thisx) { diff --git a/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c b/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c index 83d1de86a2..f20341c86c 100644 --- a/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c +++ b/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c @@ -2522,15 +2522,15 @@ void FileSelect_Init(GameState* thisx) { size = SEGMENT_ROM_SIZE(title_static); this->staticSegment = THA_AllocTailAlign16(&this->state.tha, size); - DmaMgr_SendRequest0(this->staticSegment, SEGMENT_ROM_START(title_static), size); + DmaMgr_RequestSync(this->staticSegment, SEGMENT_ROM_START(title_static), size); size = SEGMENT_ROM_SIZE(parameter_static); this->parameterSegment = THA_AllocTailAlign16(&this->state.tha, size); - DmaMgr_SendRequest0(this->parameterSegment, SEGMENT_ROM_START(parameter_static), size); + DmaMgr_RequestSync(this->parameterSegment, SEGMENT_ROM_START(parameter_static), size); size = gObjectTable[OBJECT_MAG].vromEnd - gObjectTable[OBJECT_MAG].vromStart; this->titleSegment = THA_AllocTailAlign16(&this->state.tha, size); - DmaMgr_SendRequest0(this->titleSegment, gObjectTable[OBJECT_MAG].vromStart, size); + DmaMgr_RequestSync(this->titleSegment, gObjectTable[OBJECT_MAG].vromStart, size); Audio_SetSpec(0xA); // Setting ioData to 1 and writing it to ioPort 7 will skip the harp intro diff --git a/src/overlays/gamestates/ovl_title/z_title.c b/src/overlays/gamestates/ovl_title/z_title.c index 3e87bb72eb..d4a75e4878 100644 --- a/src/overlays/gamestates/ovl_title/z_title.c +++ b/src/overlays/gamestates/ovl_title/z_title.c @@ -155,7 +155,7 @@ void ConsoleLogo_Init(GameState* thisx) { uintptr_t segmentSize = SEGMENT_ROM_SIZE(nintendo_rogo_static); this->staticSegment = THA_AllocTailAlign16(&this->state.tha, segmentSize); - DmaMgr_SendRequest0(this->staticSegment, SEGMENT_ROM_START(nintendo_rogo_static), segmentSize); + DmaMgr_RequestSync(this->staticSegment, SEGMENT_ROM_START(nintendo_rogo_static), segmentSize); GameState_SetFramerateDivisor(&this->state, 1); Matrix_Init(&this->state); diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.c b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.c index d6fb4f42dd..01ab115236 100644 --- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.c +++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.c @@ -2877,7 +2877,7 @@ void KaleidoScope_Update(PlayState* play) { if (func_8010A0A4(play)) { size_t size = SEGMENT_ROM_SIZE(icon_item_dungeon_static); - DmaMgr_SendRequest0(pauseCtx->iconItemAltSegment, SEGMENT_ROM_START(icon_item_dungeon_static), size); + DmaMgr_RequestSync(pauseCtx->iconItemAltSegment, SEGMENT_ROM_START(icon_item_dungeon_static), size); iconItemLangSegment = func_801068FC(play, (void*)ALIGN16((uintptr_t)pauseCtx->iconItemAltSegment + size), size); sInDungeonScene = true; @@ -2886,13 +2886,13 @@ void KaleidoScope_Update(PlayState* play) { sInDungeonScene = false; size = SEGMENT_ROM_SIZE(icon_item_field_static); - DmaMgr_SendRequest0(pauseCtx->iconItemAltSegment, SEGMENT_ROM_START(icon_item_field_static), size); + DmaMgr_RequestSync(pauseCtx->iconItemAltSegment, SEGMENT_ROM_START(icon_item_field_static), size); iconItemLangSegment = (void*)ALIGN16((uintptr_t)pauseCtx->iconItemAltSegment + size); } pauseCtx->iconItemLangSegment = iconItemLangSegment; size2 = SEGMENT_ROM_SIZE(icon_item_jpn_static); - DmaMgr_SendRequest0(pauseCtx->iconItemLangSegment, SEGMENT_ROM_START(icon_item_jpn_static), size2); + DmaMgr_RequestSync(pauseCtx->iconItemLangSegment, SEGMENT_ROM_START(icon_item_jpn_static), size2); pauseCtx->nameSegment = (void*)ALIGN16((uintptr_t)pauseCtx->iconItemLangSegment + size2); func_8011552C(play, DO_ACTION_INFO); @@ -2903,8 +2903,8 @@ void KaleidoScope_Update(PlayState* play) { } pauseCtx->iconItemVtxSegment = (void*)ALIGN16((uintptr_t)pauseCtx->nameSegment + 0xA00); - DmaMgr_SendRequest0(pauseCtx->iconItemVtxSegment, SEGMENT_ROM_START(icon_item_vtx_static), - SEGMENT_ROM_SIZE(icon_item_vtx_static)); + DmaMgr_RequestSync(pauseCtx->iconItemVtxSegment, SEGMENT_ROM_START(icon_item_vtx_static), + SEGMENT_ROM_SIZE(icon_item_vtx_static)); pauseCtx->unk_2B6 = 255; pauseCtx->unk_2B7 = 255; @@ -3195,11 +3195,11 @@ void KaleidoScope_Update(PlayState* play) { pauseCtx->iconItemAltSegment = (void*)ALIGN16((uintptr_t)pauseCtx->iconItem24Segment + size1); size2 = SEGMENT_ROM_SIZE(icon_item_gameover_static); - DmaMgr_SendRequest0(pauseCtx->iconItemAltSegment, SEGMENT_ROM_START(icon_item_gameover_static), size2); + DmaMgr_RequestSync(pauseCtx->iconItemAltSegment, SEGMENT_ROM_START(icon_item_gameover_static), size2); pauseCtx->iconItemLangSegment = (void*)ALIGN16((uintptr_t)pauseCtx->iconItemAltSegment + size2); - DmaMgr_SendRequest0(pauseCtx->iconItemLangSegment, SEGMENT_ROM_START(icon_item_jpn_static), - SEGMENT_ROM_SIZE(icon_item_jpn_static)); + DmaMgr_RequestSync(pauseCtx->iconItemLangSegment, SEGMENT_ROM_START(icon_item_jpn_static), + SEGMENT_ROM_SIZE(icon_item_jpn_static)); gSaveContext.timerStates[TIMER_ID_MOON_CRASH] = TIMER_STATE_OFF; @@ -3440,11 +3440,11 @@ void KaleidoScope_Update(PlayState* play) { pauseCtx->iconItemAltSegment = (void*)ALIGN16((uintptr_t)pauseCtx->iconItemSegment + size0); sInDungeonScene = false; size1 = SEGMENT_ROM_SIZE(icon_item_field_static); - DmaMgr_SendRequest0(pauseCtx->iconItemAltSegment, SEGMENT_ROM_START(icon_item_field_static), size1); + DmaMgr_RequestSync(pauseCtx->iconItemAltSegment, SEGMENT_ROM_START(icon_item_field_static), size1); pauseCtx->iconItemLangSegment = (void*)ALIGN16((uintptr_t)pauseCtx->iconItemAltSegment + size1); size2 = SEGMENT_ROM_SIZE(icon_item_jpn_static); - DmaMgr_SendRequest0(pauseCtx->iconItemLangSegment, SEGMENT_ROM_START(icon_item_jpn_static), size2); + DmaMgr_RequestSync(pauseCtx->iconItemLangSegment, SEGMENT_ROM_START(icon_item_jpn_static), size2); pauseCtx->nameSegment = (void*)ALIGN16((uintptr_t)pauseCtx->iconItemLangSegment + size2); func_8011552C(play, DO_ACTION_WARP); @@ -3452,8 +3452,8 @@ void KaleidoScope_Update(PlayState* play) { Kaleido_LoadMapNameStatic(pauseCtx->nameSegment, worldMapCursorPoint); pauseCtx->iconItemVtxSegment = (void*)ALIGN16((uintptr_t)pauseCtx->nameSegment + 0xA00); - DmaMgr_SendRequest0(pauseCtx->iconItemVtxSegment, SEGMENT_ROM_START(icon_item_vtx_static), - SEGMENT_ROM_SIZE(icon_item_vtx_static)); + DmaMgr_RequestSync(pauseCtx->iconItemVtxSegment, SEGMENT_ROM_START(icon_item_vtx_static), + SEGMENT_ROM_SIZE(icon_item_vtx_static)); pauseCtx->state = PAUSE_STATE_OWL_WARP_3; sGameOverRectPosY = 98; diff --git a/tools/.gitignore b/tools/.gitignore index f880941119..510eba35b7 100644 --- a/tools/.gitignore +++ b/tools/.gitignore @@ -4,5 +4,6 @@ yaz0 makeromfs elf2rom +mkdmadata mkldscript vtxdis \ No newline at end of file diff --git a/tools/buildtools/Makefile b/tools/buildtools/Makefile index 57c5d05426..f84d5c0f57 100644 --- a/tools/buildtools/Makefile +++ b/tools/buildtools/Makefile @@ -1,5 +1,5 @@ CFLAGS := -Wall -Wextra -Wpedantic -std=c99 -g -Os -PROGRAMS := elf2rom makeromfs mkldscript reloc_prereq yaz0 makeyar +PROGRAMS := elf2rom makeromfs mkdmadata mkldscript reloc_prereq yaz0 makeyar ifeq ($(shell command -v clang >/dev/null 2>&1; echo $$?),0) CC := clang @@ -14,6 +14,7 @@ clean: elf2rom_SOURCES := elf2rom.c elf32.c n64chksum.c util.c makeromfs_SOURCES := makeromfs.c n64chksum.c util.c +mkdmadata_SOURCES := mkdmadata.c spec.c util.c mkldscript_SOURCES := mkldscript.c spec.c util.c reloc_prereq_SOURCES := reloc_prereq.c spec.c util.c yaz0_SOURCES := yaz0tool.c yaz0.c util.c diff --git a/tools/buildtools/mkdmadata.c b/tools/buildtools/mkdmadata.c new file mode 100644 index 0000000000..1dfd07e7f6 --- /dev/null +++ b/tools/buildtools/mkdmadata.c @@ -0,0 +1,67 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "spec.h" +#include "util.h" + +struct Segment* g_segments; +int g_segmentsCount; + +static void write_dmadata_table(FILE *fout) +{ + int i; + + for (i = 0; i < g_segmentsCount; i++) { + // Don't emit dma entry for segments set with NOLOAD + if (g_segments[i].flags & FLAG_NOLOAD) { + continue; + } + + if (g_segments[i].flags & FLAG_SYMS) { + // For segments set with SYMS, unset in the dma table + fprintf(fout, "DEFINE_DMA_ENTRY_UNSET(%s, \"%s\")\n", g_segments[i].name, g_segments[i].name); + } else { + fprintf(fout, "DEFINE_DMA_ENTRY(%s, \"%s\")\n", g_segments[i].name, g_segments[i].name); + } + } +} + +static void usage(const char *execname) +{ + fprintf(stderr, "zelda64 dmadata generation tool v0.01\n" + "usage: %s SPEC_FILE DMADATA_TABLE\n" + "SPEC_FILE file describing the organization of object files into segments\n" + "DMADATA_TABLE filename of output dmadata table header\n", + execname); +} + +int main(int argc, char **argv) +{ + FILE *dmaout; + void *spec; + size_t size; + + if (argc != 3) + { + usage(argv[0]); + return 1; + } + + spec = util_read_whole_file(argv[1], &size); + parse_rom_spec(spec, &g_segments, &g_segmentsCount); + + dmaout = fopen(argv[2], "w"); + if (dmaout == NULL) + util_fatal_error("failed to open file '%s' for writing", argv[2]); + write_dmadata_table(dmaout); + fclose(dmaout); + free_rom_spec(g_segments, g_segmentsCount); + free(spec); + + return 0; +} diff --git a/tools/buildtools/spec.c b/tools/buildtools/spec.c index 5a11c47c7e..65c04d5cdd 100644 --- a/tools/buildtools/spec.c +++ b/tools/buildtools/spec.c @@ -76,6 +76,8 @@ static bool parse_flags(char* str, unsigned int* flags) { f |= FLAG_RAW; else if (strcmp(str, "NOLOAD") == 0) f |= FLAG_NOLOAD; + else if (strcmp(str, "SYMS") == 0) + f |= FLAG_SYMS; else return false; diff --git a/tools/buildtools/spec.h b/tools/buildtools/spec.h index 01c6b3d841..8d9a66b264 100644 --- a/tools/buildtools/spec.h +++ b/tools/buildtools/spec.h @@ -28,6 +28,7 @@ enum { FLAG_OBJECT = (1 << 1), FLAG_RAW = (1 << 2), FLAG_NOLOAD = (1 << 3), + FLAG_SYMS = (1 << 4) }; struct Include { diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt index 9c6541ae54..e7c3fceef3 100644 --- a/tools/disasm/functions.txt +++ b/tools/disasm/functions.txt @@ -13,16 +13,16 @@ 0x800805E0:("ViConfig_UpdateVi",), 0x80080748:("ViConfig_UpdateBlack",), 0x80080790:("DmaMgr_DmaRomToRam",), - 0x800808D4:("DmaMgr_DmaHandler",), + 0x800808D4:("DmaMgr_AudioDmaHandler",), 0x800808F4:("DmaMgr_FindDmaEntry",), 0x80080950:("DmaMgr_TranslateVromToRom",), 0x800809BC:("DmaMgr_FindDmaIndex",), 0x800809F4:("func_800809F4",), - 0x80080A08:("DmaMgr_ProcessMsg",), + 0x80080A08:("DmaMgr_ProcessRequest",), 0x80080B84:("DmaMgr_ThreadEntry",), - 0x80080C04:("DmaMgr_SendRequestImpl",), - 0x80080C90:("DmaMgr_SendRequest0",), - 0x80080D0C:("DmaMgr_Start",), + 0x80080C04:("DmaMgr_RequestAsync",), + 0x80080C90:("DmaMgr_RequestSync",), + 0x80080D0C:("DmaMgr_Init",), 0x80080E00:("DmaMgr_Stop",), 0x80080E30:("Yaz0_FirstDMA",), 0x80080ED0:("Yaz0_NextDMA",), diff --git a/tools/namefixer.py b/tools/namefixer.py index cafbac0379..4ca67e53c1 100755 --- a/tools/namefixer.py +++ b/tools/namefixer.py @@ -986,6 +986,9 @@ wordReplace = { "func_8012CA38": "Gfx_SetupDL59_Opa", "Game_SetFramerateDivisor": "GameState_SetFramerateDivisor", + + "DmaMgr_SendRequestImpl": "DmaMgr_RequestAsync", + "DmaMgr_SendRequest0": "DmaMgr_RequestSync", # Structs "ActorAnimationEntry": "AnimationInfo", diff --git a/tools/sizes/boot_functions.csv b/tools/sizes/boot_functions.csv index 2f01be07b3..433e5f31c1 100644 --- a/tools/sizes/boot_functions.csv +++ b/tools/sizes/boot_functions.csv @@ -10,16 +10,16 @@ asm/non_matchings/boot/idle/Idle_ThreadEntry.s,Idle_ThreadEntry,0x80080514,0x33 asm/non_matchings/boot/viconfig/ViConfig_UpdateVi.s,ViConfig_UpdateVi,0x800805E0,0x5A asm/non_matchings/boot/viconfig/ViConfig_UpdateBlack.s,ViConfig_UpdateBlack,0x80080748,0x12 asm/non_matchings/boot/z_std_dma/DmaMgr_DmaRomToRam.s,DmaMgr_DmaRomToRam,0x80080790,0x51 -asm/non_matchings/boot/z_std_dma/DmaMgr_DmaHandler.s,DmaMgr_DmaHandler,0x800808D4,0x8 +asm/non_matchings/boot/z_std_dma/DmaMgr_AudioDmaHandler.s,DmaMgr_AudioDmaHandler,0x800808D4,0x8 asm/non_matchings/boot/z_std_dma/DmaMgr_FindDmaEntry.s,DmaMgr_FindDmaEntry,0x800808F4,0x17 asm/non_matchings/boot/z_std_dma/DmaMgr_TranslateVromToRom.s,DmaMgr_TranslateVromToRom,0x80080950,0x1B asm/non_matchings/boot/z_std_dma/DmaMgr_FindDmaIndex.s,DmaMgr_FindDmaIndex,0x800809BC,0xE asm/non_matchings/boot/z_std_dma/func_800809F4.s,func_800809F4,0x800809F4,0x5 -asm/non_matchings/boot/z_std_dma/DmaMgr_ProcessMsg.s,DmaMgr_ProcessMsg,0x80080A08,0x5F +asm/non_matchings/boot/z_std_dma/DmaMgr_ProcessRequest.s,DmaMgr_ProcessRequest,0x80080A08,0x5F asm/non_matchings/boot/z_std_dma/DmaMgr_ThreadEntry.s,DmaMgr_ThreadEntry,0x80080B84,0x20 -asm/non_matchings/boot/z_std_dma/DmaMgr_SendRequestImpl.s,DmaMgr_SendRequestImpl,0x80080C04,0x23 -asm/non_matchings/boot/z_std_dma/DmaMgr_SendRequest0.s,DmaMgr_SendRequest0,0x80080C90,0x1F -asm/non_matchings/boot/z_std_dma/DmaMgr_Start.s,DmaMgr_Start,0x80080D0C,0x3D +asm/non_matchings/boot/z_std_dma/DmaMgr_RequestAsync.s,DmaMgr_RequestAsync,0x80080C04,0x23 +asm/non_matchings/boot/z_std_dma/DmaMgr_RequestSync.s,DmaMgr_RequestSync,0x80080C90,0x1F +asm/non_matchings/boot/z_std_dma/DmaMgr_Init.s,DmaMgr_Init,0x80080D0C,0x3D asm/non_matchings/boot/z_std_dma/DmaMgr_Stop.s,DmaMgr_Stop,0x80080E00,0xC asm/non_matchings/boot/yaz0/Yaz0_FirstDMA.s,Yaz0_FirstDMA,0x80080E30,0x28 asm/non_matchings/boot/yaz0/Yaz0_NextDMA.s,Yaz0_NextDMA,0x80080ED0,0x48