summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile7
-rw-r--r--asm/bag.s2
-rw-r--r--asm/battle_2.s2
-rw-r--r--asm/blit.s813
-rw-r--r--asm/cable_club.s6
-rw-r--r--asm/evolution_scene.s2
-rw-r--r--asm/intro.s4
-rw-r--r--asm/learn_move.s2
-rw-r--r--asm/link.s18
-rw-r--r--asm/link_rfu.s2
-rw-r--r--asm/link_rfu_2.s20
-rw-r--r--asm/link_rfu_3.s80
-rw-r--r--asm/link_rfu_4.s2316
-rw-r--r--asm/list_menu.s8
-rw-r--r--asm/m4a_1.s27
-rw-r--r--asm/m4a_3.s574
-rw-r--r--asm/macros.inc1
-rw-r--r--asm/main_menu.s8
-rw-r--r--asm/map_name_popup.s2
-rw-r--r--asm/mystery_gift_menu.s410
-rw-r--r--asm/overworld.s6
-rw-r--r--asm/pokedex_screen.s8
-rw-r--r--asm/pokemon_special_anim.s4
-rw-r--r--asm/pokemon_storage_system.s2
-rw-r--r--asm/seagallop.s795
-rw-r--r--asm/slot_machine.s2
-rw-r--r--asm/start_menu.s2
-rw-r--r--asm/text_window.s6
-rw-r--r--asm/title_screen.s6
-rw-r--r--asm/trade.s20
-rw-r--r--asm/union_room_chat.s6
-rw-r--r--asm/unk_8147AA8.s12
-rw-r--r--asm/unk_814D5C8.s2
-rw-r--r--asm/unk_81507FC.s2
-rw-r--r--berry_fix/payload/Makefile12
-rw-r--r--berry_fix/payload/asm/libagbsyscall.s46
-rw-r--r--berry_fix/payload/asm/macros.inc155
-rw-r--r--berry_fix/payload/asm/macros/asm.inc17
-rw-r--r--berry_fix/payload/asm/macros/battle_ai_script.inc554
-rw-r--r--berry_fix/payload/asm/macros/battle_anim.inc266
-rw-r--r--berry_fix/payload/asm/macros/battle_script.inc1228
-rw-r--r--berry_fix/payload/asm/macros/contest_ai_script.inc506
-rw-r--r--berry_fix/payload/asm/macros/ec.inc8
-rw-r--r--berry_fix/payload/asm/macros/event.inc1433
-rw-r--r--berry_fix/payload/asm/macros/field_effect_script.inc42
-rw-r--r--berry_fix/payload/asm/macros/function.inc29
-rw-r--r--berry_fix/payload/asm/macros/m4a.inc13
-rw-r--r--berry_fix/payload/asm/macros/map.inc84
-rw-r--r--berry_fix/payload/asm/macros/movement.inc120
-rw-r--r--berry_fix/payload/asm/macros/music_voice.inc125
-rw-r--r--berry_fix/payload/asm/macros/pokemon_data.inc57
-rw-r--r--berry_fix/payload/constants/gba_constants.inc490
-rw-r--r--berry_fix/payload/include/flash.h2
-rw-r--r--berry_fix/payload/include/gba/defines.h87
-rw-r--r--berry_fix/payload/include/gba/flash_internal.h85
-rw-r--r--berry_fix/payload/include/gba/gba.h12
-rw-r--r--berry_fix/payload/include/gba/io_reg.h770
-rw-r--r--berry_fix/payload/include/gba/isagbprint.h50
-rw-r--r--berry_fix/payload/include/gba/m4a_internal.h467
-rw-r--r--berry_fix/payload/include/gba/macro.h247
-rw-r--r--berry_fix/payload/include/gba/multiboot.h55
-rw-r--r--berry_fix/payload/include/gba/syscall.h57
-rw-r--r--berry_fix/payload/include/gba/types.h146
-rw-r--r--berry_fix/payload/include/global.h2
-rw-r--r--berry_fix/payload/include/main.h2
-rw-r--r--berry_fix/payload/include/rtc.h4
-rw-r--r--berry_fix/payload/include/siirtc.h54
-rw-r--r--berry_fix/payload/ld_script.txt35
-rw-r--r--berry_fix/payload/src/agb_flash.c296
-rw-r--r--berry_fix/payload/src/agb_flash_1m.c86
-rw-r--r--berry_fix/payload/src/agb_flash_le.c31
-rw-r--r--berry_fix/payload/src/agb_flash_mx.c193
-rw-r--r--berry_fix/payload/src/flash.c4
-rw-r--r--berry_fix/payload/src/main.c2
-rw-r--r--berry_fix/payload/src/rtc.c4
-rw-r--r--berry_fix/payload/src/siirtc.c432
-rw-r--r--berry_fix/payload/sym_bss.txt4
-rw-r--r--berry_fix/payload/sym_common.txt2
-rw-r--r--common_syms/m4a.txt (renamed from common_syms/m4a_2.txt)0
-rw-r--r--data/battle_ai_scripts.s3124
-rw-r--r--data/data_83FECCC.s231
-rw-r--r--data/data_8468C98.s37
-rw-r--r--data/link_rfu_4.s54
-rw-r--r--data/mystery_event_script_cmd_table.s1
-rw-r--r--data/mystery_gift_menu.s14
-rw-r--r--data/seagallop/eb_tilemap.binbin0 -> 2048 bytes
-rw-r--r--data/seagallop/ferry_and_wake.pal19
-rw-r--r--data/seagallop/ferry_sprite.pngbin0 -> 595 bytes
-rw-r--r--data/seagallop/wake.pngbin0 -> 574 bytes
-rw-r--r--data/seagallop/water.pngbin0 -> 283 bytes
-rw-r--r--data/seagallop/wb_tilemap.binbin0 -> 2048 bytes
-rw-r--r--data/sound_data.s3399
-rw-r--r--data/specials.inc6
-rw-r--r--graphics/interface/unk_textbox_border.pngbin0 -> 141 bytes
-rw-r--r--graphics_file_rules.mk3
-rw-r--r--include/blit.h17
-rw-r--r--include/constants/maps.h2
-rw-r--r--include/field_fadetransition.h1
-rw-r--r--include/field_weather.h1
-rw-r--r--include/gba/m4a_internal.h2
-rw-r--r--include/global.h7
-rw-r--r--include/help_system.h1
-rw-r--r--include/link.h2
-rw-r--r--include/link_rfu.h12
-rw-r--r--include/list_menu.h2
-rw-r--r--include/menews_jisan.h2
-rw-r--r--include/mevent.h23
-rw-r--r--include/mevent_server.h18
-rw-r--r--include/mystery_event_msg.h2
-rw-r--r--include/mystery_gift_menu.h6
-rw-r--r--include/new_menu_helpers.h1
-rw-r--r--include/overworld.h6
-rw-r--r--include/seagallop.h21
-rw-r--r--include/text_window.h3
-rw-r--r--include/title_screen.h6
-rw-r--r--ld_script.txt18
-rw-r--r--sound/direct_sound_samples/cry_abra.aifbin0 -> 11660 bytes
-rw-r--r--sound/direct_sound_samples/cry_absol.aifbin0 -> 5256 bytes
-rw-r--r--sound/direct_sound_samples/cry_aerodactyl.aifbin0 -> 12142 bytes
-rw-r--r--sound/direct_sound_samples/cry_aggron.aifbin0 -> 12776 bytes
-rw-r--r--sound/direct_sound_samples/cry_aipom.aifbin0 -> 7058 bytes
-rw-r--r--sound/direct_sound_samples/cry_alakazam.aifbin0 -> 15740 bytes
-rw-r--r--sound/direct_sound_samples/cry_altaria.aifbin0 -> 5564 bytes
-rw-r--r--sound/direct_sound_samples/cry_ampharos.aifbin0 -> 8242 bytes
-rw-r--r--sound/direct_sound_samples/cry_anorith.aifbin0 -> 5862 bytes
-rw-r--r--sound/direct_sound_samples/cry_arbok.aifbin0 -> 9648 bytes
-rw-r--r--sound/direct_sound_samples/cry_arcanine.aifbin0 -> 8602 bytes
-rw-r--r--sound/direct_sound_samples/cry_ariados.aifbin0 -> 6170 bytes
-rw-r--r--sound/direct_sound_samples/cry_armaldo.aifbin0 -> 11380 bytes
-rw-r--r--sound/direct_sound_samples/cry_aron.aifbin0 -> 4600 bytes
-rw-r--r--sound/direct_sound_samples/cry_articuno.aifbin0 -> 11792 bytes
-rw-r--r--sound/direct_sound_samples/cry_azumarill.aifbin0 -> 8452 bytes
-rw-r--r--sound/direct_sound_samples/cry_azurill.aifbin0 -> 5212 bytes
-rw-r--r--sound/direct_sound_samples/cry_bagon.aifbin0 -> 3934 bytes
-rw-r--r--sound/direct_sound_samples/cry_baltoy.aifbin0 -> 6264 bytes
-rw-r--r--sound/direct_sound_samples/cry_banette.aifbin0 -> 6334 bytes
-rw-r--r--sound/direct_sound_samples/cry_barboach.aifbin0 -> 4632 bytes
-rw-r--r--sound/direct_sound_samples/cry_bayleef.aifbin0 -> 4414 bytes
-rw-r--r--sound/direct_sound_samples/cry_beautifly.aifbin0 -> 4128 bytes
-rw-r--r--sound/direct_sound_samples/cry_beedrill.aifbin0 -> 9656 bytes
-rw-r--r--sound/direct_sound_samples/cry_beldum.aifbin0 -> 4828 bytes
-rw-r--r--sound/direct_sound_samples/cry_bellossom.aifbin0 -> 7042 bytes
-rw-r--r--sound/direct_sound_samples/cry_bellsprout.aifbin0 -> 3792 bytes
-rw-r--r--sound/direct_sound_samples/cry_blastoise.aifbin0 -> 9622 bytes
-rw-r--r--sound/direct_sound_samples/cry_blaziken.aifbin0 -> 15690 bytes
-rw-r--r--sound/direct_sound_samples/cry_blissey.aifbin0 -> 8278 bytes
-rw-r--r--sound/direct_sound_samples/cry_breloom.aifbin0 -> 6376 bytes
-rw-r--r--sound/direct_sound_samples/cry_bulbasaur.aifbin0 -> 8266 bytes
-rw-r--r--sound/direct_sound_samples/cry_butterfree.aifbin0 -> 5026 bytes
-rw-r--r--sound/direct_sound_samples/cry_cacnea.aifbin0 -> 4488 bytes
-rw-r--r--sound/direct_sound_samples/cry_cacturne.aifbin0 -> 11310 bytes
-rw-r--r--sound/direct_sound_samples/cry_camerupt.aifbin0 -> 11526 bytes
-rw-r--r--sound/direct_sound_samples/cry_carvanha.aifbin0 -> 5048 bytes
-rw-r--r--sound/direct_sound_samples/cry_cascoon.aifbin0 -> 8126 bytes
-rw-r--r--sound/direct_sound_samples/cry_castform.aifbin0 -> 6302 bytes
-rw-r--r--sound/direct_sound_samples/cry_caterpie.aifbin0 -> 4192 bytes
-rw-r--r--sound/direct_sound_samples/cry_celebi.aifbin0 -> 7230 bytes
-rw-r--r--sound/direct_sound_samples/cry_chansey.aifbin0 -> 7390 bytes
-rw-r--r--sound/direct_sound_samples/cry_charizard.aifbin0 -> 9622 bytes
-rw-r--r--sound/direct_sound_samples/cry_charmander.aifbin0 -> 7216 bytes
-rw-r--r--sound/direct_sound_samples/cry_charmeleon.aifbin0 -> 7248 bytes
-rw-r--r--sound/direct_sound_samples/cry_chikorita.aifbin0 -> 2654 bytes
-rw-r--r--sound/direct_sound_samples/cry_chimecho.aifbin0 -> 5040 bytes
-rw-r--r--sound/direct_sound_samples/cry_chinchou.aifbin0 -> 6346 bytes
-rw-r--r--sound/direct_sound_samples/cry_clamperl.aifbin0 -> 9142 bytes
-rw-r--r--sound/direct_sound_samples/cry_claydol.aifbin0 -> 9668 bytes
-rw-r--r--sound/direct_sound_samples/cry_clefable.aifbin0 -> 5294 bytes
-rw-r--r--sound/direct_sound_samples/cry_clefairy.aifbin0 -> 4234 bytes
-rw-r--r--sound/direct_sound_samples/cry_cleffa.aifbin0 -> 2992 bytes
-rw-r--r--sound/direct_sound_samples/cry_cloyster.aifbin0 -> 10354 bytes
-rw-r--r--sound/direct_sound_samples/cry_combusken.aifbin0 -> 14360 bytes
-rw-r--r--sound/direct_sound_samples/cry_corphish.aifbin0 -> 6010 bytes
-rw-r--r--sound/direct_sound_samples/cry_corsola.aifbin0 -> 6440 bytes
-rw-r--r--sound/direct_sound_samples/cry_cradily.aifbin0 -> 14542 bytes
-rw-r--r--sound/direct_sound_samples/cry_crawdaunt.aifbin0 -> 12316 bytes
-rw-r--r--sound/direct_sound_samples/cry_crobat.aifbin0 -> 11562 bytes
-rw-r--r--sound/direct_sound_samples/cry_croconaw.aifbin0 -> 10096 bytes
-rw-r--r--sound/direct_sound_samples/cry_cubone.aifbin0 -> 7558 bytes
-rw-r--r--sound/direct_sound_samples/cry_cyndaquil.aifbin0 -> 3528 bytes
-rw-r--r--sound/direct_sound_samples/cry_delcatty.aifbin0 -> 10518 bytes
-rw-r--r--sound/direct_sound_samples/cry_delibird.aifbin0 -> 8094 bytes
-rw-r--r--sound/direct_sound_samples/cry_deoxys.aifbin0 -> 10388 bytes
-rw-r--r--sound/direct_sound_samples/cry_dewgong.aifbin0 -> 10546 bytes
-rw-r--r--sound/direct_sound_samples/cry_diglett.aifbin0 -> 9698 bytes
-rw-r--r--sound/direct_sound_samples/cry_ditto.aifbin0 -> 5566 bytes
-rw-r--r--sound/direct_sound_samples/cry_dodrio.aifbin0 -> 9712 bytes
-rw-r--r--sound/direct_sound_samples/cry_doduo.aifbin0 -> 9616 bytes
-rw-r--r--sound/direct_sound_samples/cry_donphan.aifbin0 -> 8554 bytes
-rw-r--r--sound/direct_sound_samples/cry_dragonair.aifbin0 -> 8318 bytes
-rw-r--r--sound/direct_sound_samples/cry_dragonite.aifbin0 -> 9502 bytes
-rw-r--r--sound/direct_sound_samples/cry_dratini.aifbin0 -> 5812 bytes
-rw-r--r--sound/direct_sound_samples/cry_drowzee.aifbin0 -> 14494 bytes
-rw-r--r--sound/direct_sound_samples/cry_dugtrio.aifbin0 -> 9686 bytes
-rw-r--r--sound/direct_sound_samples/cry_dunsparce.aifbin0 -> 7926 bytes
-rw-r--r--sound/direct_sound_samples/cry_dusclops.aifbin0 -> 6858 bytes
-rw-r--r--sound/direct_sound_samples/cry_duskull.aifbin0 -> 5310 bytes
-rw-r--r--sound/direct_sound_samples/cry_dustox.aifbin0 -> 6338 bytes
-rw-r--r--sound/direct_sound_samples/cry_eevee.aifbin0 -> 7104 bytes
-rw-r--r--sound/direct_sound_samples/cry_ekans.aifbin0 -> 9626 bytes
-rw-r--r--sound/direct_sound_samples/cry_electabuzz.aifbin0 -> 15380 bytes
-rw-r--r--sound/direct_sound_samples/cry_electrike.aifbin0 -> 6186 bytes
-rw-r--r--sound/direct_sound_samples/cry_electrode.aifbin0 -> 12564 bytes
-rw-r--r--sound/direct_sound_samples/cry_elekid.aifbin0 -> 5284 bytes
-rw-r--r--sound/direct_sound_samples/cry_entei.aifbin0 -> 10198 bytes
-rw-r--r--sound/direct_sound_samples/cry_espeon.aifbin0 -> 9828 bytes
-rw-r--r--sound/direct_sound_samples/cry_exeggcute.aifbin0 -> 9416 bytes
-rw-r--r--sound/direct_sound_samples/cry_exeggutor.aifbin0 -> 15880 bytes
-rw-r--r--sound/direct_sound_samples/cry_exploud.aifbin0 -> 14086 bytes
-rw-r--r--sound/direct_sound_samples/cry_farfetchd.aifbin0 -> 3766 bytes
-rw-r--r--sound/direct_sound_samples/cry_fearow.aifbin0 -> 8602 bytes
-rw-r--r--sound/direct_sound_samples/cry_feebas.aifbin0 -> 3932 bytes
-rw-r--r--sound/direct_sound_samples/cry_feraligatr.aifbin0 -> 12712 bytes
-rw-r--r--sound/direct_sound_samples/cry_flaaffy.aifbin0 -> 6854 bytes
-rw-r--r--sound/direct_sound_samples/cry_flareon.aifbin0 -> 7748 bytes
-rw-r--r--sound/direct_sound_samples/cry_flygon.aifbin0 -> 12974 bytes
-rw-r--r--sound/direct_sound_samples/cry_forretress.aifbin0 -> 9990 bytes
-rw-r--r--sound/direct_sound_samples/cry_furret.aifbin0 -> 3168 bytes
-rw-r--r--sound/direct_sound_samples/cry_gardevoir.aifbin0 -> 12154 bytes
-rw-r--r--sound/direct_sound_samples/cry_gastly.aifbin0 -> 11620 bytes
-rw-r--r--sound/direct_sound_samples/cry_gengar.aifbin0 -> 7372 bytes
-rw-r--r--sound/direct_sound_samples/cry_geodude.aifbin0 -> 11816 bytes
-rw-r--r--sound/direct_sound_samples/cry_girafarig.aifbin0 -> 7346 bytes
-rw-r--r--sound/direct_sound_samples/cry_glalie.aifbin0 -> 10420 bytes
-rw-r--r--sound/direct_sound_samples/cry_gligar.aifbin0 -> 6068 bytes
-rw-r--r--sound/direct_sound_samples/cry_gloom.aifbin0 -> 6246 bytes
-rw-r--r--sound/direct_sound_samples/cry_golbat.aifbin0 -> 9674 bytes
-rw-r--r--sound/direct_sound_samples/cry_goldeen.aifbin0 -> 4936 bytes
-rw-r--r--sound/direct_sound_samples/cry_golduck.aifbin0 -> 5646 bytes
-rw-r--r--sound/direct_sound_samples/cry_golem.aifbin0 -> 7080 bytes
-rw-r--r--sound/direct_sound_samples/cry_gorebyss.aifbin0 -> 11176 bytes
-rw-r--r--sound/direct_sound_samples/cry_granbull.aifbin0 -> 11782 bytes
-rw-r--r--sound/direct_sound_samples/cry_graveler.aifbin0 -> 13900 bytes
-rw-r--r--sound/direct_sound_samples/cry_grimer.aifbin0 -> 5274 bytes
-rw-r--r--sound/direct_sound_samples/cry_groudon.aifbin0 -> 18438 bytes
-rw-r--r--sound/direct_sound_samples/cry_grovyle.aifbin0 -> 10198 bytes
-rw-r--r--sound/direct_sound_samples/cry_growlithe.aifbin0 -> 6696 bytes
-rw-r--r--sound/direct_sound_samples/cry_grumpig.aifbin0 -> 6318 bytes
-rw-r--r--sound/direct_sound_samples/cry_gulpin.aifbin0 -> 4028 bytes
-rw-r--r--sound/direct_sound_samples/cry_gyarados.aifbin0 -> 10078 bytes
-rw-r--r--sound/direct_sound_samples/cry_hariyama.aifbin0 -> 8348 bytes
-rw-r--r--sound/direct_sound_samples/cry_haunter.aifbin0 -> 11714 bytes
-rw-r--r--sound/direct_sound_samples/cry_heracross.aifbin0 -> 9144 bytes
-rw-r--r--sound/direct_sound_samples/cry_hitmonchan.aifbin0 -> 8906 bytes
-rw-r--r--sound/direct_sound_samples/cry_hitmonlee.aifbin0 -> 9318 bytes
-rw-r--r--sound/direct_sound_samples/cry_hitmontop.aifbin0 -> 6936 bytes
-rw-r--r--sound/direct_sound_samples/cry_ho_oh.aifbin0 -> 11260 bytes
-rw-r--r--sound/direct_sound_samples/cry_hoothoot.aifbin0 -> 5458 bytes
-rw-r--r--sound/direct_sound_samples/cry_hoppip.aifbin0 -> 4226 bytes
-rw-r--r--sound/direct_sound_samples/cry_horsea.aifbin0 -> 4754 bytes
-rw-r--r--sound/direct_sound_samples/cry_houndoom.aifbin0 -> 9820 bytes
-rw-r--r--sound/direct_sound_samples/cry_houndour.aifbin0 -> 6332 bytes
-rw-r--r--sound/direct_sound_samples/cry_huntail.aifbin0 -> 7944 bytes
-rw-r--r--sound/direct_sound_samples/cry_hypno.aifbin0 -> 14450 bytes
-rw-r--r--sound/direct_sound_samples/cry_igglybuff.aifbin0 -> 3518 bytes
-rw-r--r--sound/direct_sound_samples/cry_illumise.aifbin0 -> 8536 bytes
-rw-r--r--sound/direct_sound_samples/cry_ivysaur.aifbin0 -> 8270 bytes
-rw-r--r--sound/direct_sound_samples/cry_jigglypuff.aifbin0 -> 2720 bytes
-rw-r--r--sound/direct_sound_samples/cry_jirachi.aifbin0 -> 6758 bytes
-rw-r--r--sound/direct_sound_samples/cry_jolteon.aifbin0 -> 7904 bytes
-rw-r--r--sound/direct_sound_samples/cry_jumpluff.aifbin0 -> 8106 bytes
-rw-r--r--sound/direct_sound_samples/cry_jynx.aifbin0 -> 23606 bytes
-rw-r--r--sound/direct_sound_samples/cry_kabuto.aifbin0 -> 6170 bytes
-rw-r--r--sound/direct_sound_samples/cry_kabutops.aifbin0 -> 6867 bytes
-rw-r--r--sound/direct_sound_samples/cry_kadabra.aifbin0 -> 13408 bytes
-rw-r--r--sound/direct_sound_samples/cry_kakuna.aifbin0 -> 9104 bytes
-rw-r--r--sound/direct_sound_samples/cry_kangaskhan.aifbin0 -> 9334 bytes
-rw-r--r--sound/direct_sound_samples/cry_kecleon.aifbin0 -> 4202 bytes
-rw-r--r--sound/direct_sound_samples/cry_kingdra.aifbin0 -> 6922 bytes
-rw-r--r--sound/direct_sound_samples/cry_kingler.aifbin0 -> 12132 bytes
-rw-r--r--sound/direct_sound_samples/cry_kirlia.aifbin0 -> 6100 bytes
-rw-r--r--sound/direct_sound_samples/cry_koffing.aifbin0 -> 10154 bytes
-rw-r--r--sound/direct_sound_samples/cry_krabby.aifbin0 -> 12112 bytes
-rw-r--r--sound/direct_sound_samples/cry_kyogre.aifbin0 -> 17782 bytes
-rw-r--r--sound/direct_sound_samples/cry_lairon.aifbin0 -> 10392 bytes
-rw-r--r--sound/direct_sound_samples/cry_lanturn.aifbin0 -> 5282 bytes
-rw-r--r--sound/direct_sound_samples/cry_lapras.aifbin0 -> 7408 bytes
-rw-r--r--sound/direct_sound_samples/cry_larvitar.aifbin0 -> 6350 bytes
-rw-r--r--sound/direct_sound_samples/cry_latias.aifbin0 -> 6098 bytes
-rw-r--r--sound/direct_sound_samples/cry_latios.aifbin0 -> 10958 bytes
-rw-r--r--sound/direct_sound_samples/cry_ledian.aifbin0 -> 4214 bytes
-rw-r--r--sound/direct_sound_samples/cry_ledyba.aifbin0 -> 3506 bytes
-rw-r--r--sound/direct_sound_samples/cry_lickitung.aifbin0 -> 7571 bytes
-rw-r--r--sound/direct_sound_samples/cry_lileep.aifbin0 -> 4838 bytes
-rw-r--r--sound/direct_sound_samples/cry_linoone.aifbin0 -> 15248 bytes
-rw-r--r--sound/direct_sound_samples/cry_lombre.aifbin0 -> 7282 bytes
-rw-r--r--sound/direct_sound_samples/cry_lotad.aifbin0 -> 2232 bytes
-rw-r--r--sound/direct_sound_samples/cry_loudred.aifbin0 -> 6582 bytes
-rw-r--r--sound/direct_sound_samples/cry_ludicolo.aifbin0 -> 8398 bytes
-rw-r--r--sound/direct_sound_samples/cry_lugia.aifbin0 -> 18900 bytes
-rw-r--r--sound/direct_sound_samples/cry_lunatone.aifbin0 -> 11956 bytes
-rw-r--r--sound/direct_sound_samples/cry_luvdisc.aifbin0 -> 2456 bytes
-rw-r--r--sound/direct_sound_samples/cry_machamp.aifbin0 -> 8256 bytes
-rw-r--r--sound/direct_sound_samples/cry_machoke.aifbin0 -> 6782 bytes
-rw-r--r--sound/direct_sound_samples/cry_machop.aifbin0 -> 6696 bytes
-rw-r--r--sound/direct_sound_samples/cry_magby.aifbin0 -> 7218 bytes
-rw-r--r--sound/direct_sound_samples/cry_magcargo.aifbin0 -> 10486 bytes
-rw-r--r--sound/direct_sound_samples/cry_magikarp.aifbin0 -> 9492 bytes
-rw-r--r--sound/direct_sound_samples/cry_magmar.aifbin0 -> 7738 bytes
-rw-r--r--sound/direct_sound_samples/cry_magnemite.aifbin0 -> 9610 bytes
-rw-r--r--sound/direct_sound_samples/cry_magneton.aifbin0 -> 11914 bytes
-rw-r--r--sound/direct_sound_samples/cry_makuhita.aifbin0 -> 3704 bytes
-rw-r--r--sound/direct_sound_samples/cry_manectric.aifbin0 -> 10492 bytes
-rw-r--r--sound/direct_sound_samples/cry_mankey.aifbin0 -> 8178 bytes
-rw-r--r--sound/direct_sound_samples/cry_mantine.aifbin0 -> 7884 bytes
-rw-r--r--sound/direct_sound_samples/cry_mareep.aifbin0 -> 3694 bytes
-rw-r--r--sound/direct_sound_samples/cry_marill.aifbin0 -> 6538 bytes
-rw-r--r--sound/direct_sound_samples/cry_marowak.aifbin0 -> 7216 bytes
-rw-r--r--sound/direct_sound_samples/cry_marshtomp.aifbin0 -> 8498 bytes
-rw-r--r--sound/direct_sound_samples/cry_masquerain.aifbin0 -> 9830 bytes
-rw-r--r--sound/direct_sound_samples/cry_mawile.aifbin0 -> 5756 bytes
-rw-r--r--sound/direct_sound_samples/cry_medicham.aifbin0 -> 8246 bytes
-rw-r--r--sound/direct_sound_samples/cry_meditite.aifbin0 -> 4078 bytes
-rw-r--r--sound/direct_sound_samples/cry_meganium.aifbin0 -> 8100 bytes
-rw-r--r--sound/direct_sound_samples/cry_meowth.aifbin0 -> 4796 bytes
-rw-r--r--sound/direct_sound_samples/cry_metagross.aifbin0 -> 19644 bytes
-rw-r--r--sound/direct_sound_samples/cry_metang.aifbin0 -> 9398 bytes
-rw-r--r--sound/direct_sound_samples/cry_metapod.aifbin0 -> 11622 bytes
-rw-r--r--sound/direct_sound_samples/cry_mew.aifbin0 -> 15146 bytes
-rw-r--r--sound/direct_sound_samples/cry_mewtwo.aifbin0 -> 15144 bytes
-rw-r--r--sound/direct_sound_samples/cry_mightyena.aifbin0 -> 9748 bytes
-rw-r--r--sound/direct_sound_samples/cry_milotic.aifbin0 -> 19542 bytes
-rw-r--r--sound/direct_sound_samples/cry_miltank.aifbin0 -> 7424 bytes
-rw-r--r--sound/direct_sound_samples/cry_minun.aifbin0 -> 8004 bytes
-rw-r--r--sound/direct_sound_samples/cry_misdreavus.aifbin0 -> 5816 bytes
-rw-r--r--sound/direct_sound_samples/cry_moltres.aifbin0 -> 11796 bytes
-rw-r--r--sound/direct_sound_samples/cry_mr_mime.aifbin0 -> 9446 bytes
-rw-r--r--sound/direct_sound_samples/cry_mudkip.aifbin0 -> 3776 bytes
-rw-r--r--sound/direct_sound_samples/cry_muk.aifbin0 -> 7374 bytes
-rw-r--r--sound/direct_sound_samples/cry_murkrow.aifbin0 -> 8370 bytes
-rw-r--r--sound/direct_sound_samples/cry_natu.aifbin0 -> 5294 bytes
-rw-r--r--sound/direct_sound_samples/cry_nidoking.aifbin0 -> 12176 bytes
-rw-r--r--sound/direct_sound_samples/cry_nidoqueen.aifbin0 -> 8424 bytes
-rw-r--r--sound/direct_sound_samples/cry_nidoran_f.aifbin0 -> 4858 bytes
-rw-r--r--sound/direct_sound_samples/cry_nidoran_m.aifbin0 -> 5216 bytes
-rw-r--r--sound/direct_sound_samples/cry_nidorina.aifbin0 -> 6394 bytes
-rw-r--r--sound/direct_sound_samples/cry_nidorino.aifbin0 -> 6042 bytes
-rw-r--r--sound/direct_sound_samples/cry_nincada.aifbin0 -> 3244 bytes
-rw-r--r--sound/direct_sound_samples/cry_ninetales.aifbin0 -> 12174 bytes
-rw-r--r--sound/direct_sound_samples/cry_ninjask.aifbin0 -> 6084 bytes
-rw-r--r--sound/direct_sound_samples/cry_noctowl.aifbin0 -> 10564 bytes
-rw-r--r--sound/direct_sound_samples/cry_none.aifbin0 -> 8286 bytes
-rw-r--r--sound/direct_sound_samples/cry_nosepass.aifbin0 -> 6696 bytes
-rw-r--r--sound/direct_sound_samples/cry_numel.aifbin0 -> 4664 bytes
-rw-r--r--sound/direct_sound_samples/cry_nuzleaf.aifbin0 -> 5712 bytes
-rw-r--r--sound/direct_sound_samples/cry_octillery.aifbin0 -> 13084 bytes
-rw-r--r--sound/direct_sound_samples/cry_oddish.aifbin0 -> 7298 bytes
-rw-r--r--sound/direct_sound_samples/cry_omanyte.aifbin0 -> 6672 bytes
-rw-r--r--sound/direct_sound_samples/cry_omastar.aifbin0 -> 6666 bytes
-rw-r--r--sound/direct_sound_samples/cry_onix.aifbin0 -> 12340 bytes
-rw-r--r--sound/direct_sound_samples/cry_paras.aifbin0 -> 13924 bytes
-rw-r--r--sound/direct_sound_samples/cry_parasect.aifbin0 -> 15140 bytes
-rw-r--r--sound/direct_sound_samples/cry_pelipper.aifbin0 -> 5894 bytes
-rw-r--r--sound/direct_sound_samples/cry_persian.aifbin0 -> 9412 bytes
-rw-r--r--sound/direct_sound_samples/cry_phanpy.aifbin0 -> 5664 bytes
-rw-r--r--sound/direct_sound_samples/cry_pichu.aifbin0 -> 3684 bytes
-rw-r--r--sound/direct_sound_samples/cry_pidgeot.aifbin0 -> 8590 bytes
-rw-r--r--sound/direct_sound_samples/cry_pidgeotto.aifbin0 -> 7512 bytes
-rw-r--r--sound/direct_sound_samples/cry_pidgey.aifbin0 -> 1984 bytes
-rw-r--r--sound/direct_sound_samples/cry_pikachu.aifbin0 -> 8316 bytes
-rw-r--r--sound/direct_sound_samples/cry_piloswine.aifbin0 -> 6480 bytes
-rw-r--r--sound/direct_sound_samples/cry_pineco.aifbin0 -> 6690 bytes
-rw-r--r--sound/direct_sound_samples/cry_pinsir.aifbin0 -> 6186 bytes
-rw-r--r--sound/direct_sound_samples/cry_plusle.aifbin0 -> 4504 bytes
-rw-r--r--sound/direct_sound_samples/cry_politoed.aifbin0 -> 9114 bytes
-rw-r--r--sound/direct_sound_samples/cry_poliwag.aifbin0 -> 5562 bytes
-rw-r--r--sound/direct_sound_samples/cry_poliwhirl.aifbin0 -> 3354 bytes
-rw-r--r--sound/direct_sound_samples/cry_poliwrath.aifbin0 -> 5582 bytes
-rw-r--r--sound/direct_sound_samples/cry_ponyta.aifbin0 -> 7524 bytes
-rw-r--r--sound/direct_sound_samples/cry_poochyena.aifbin0 -> 4656 bytes
-rw-r--r--sound/direct_sound_samples/cry_porygon.aifbin0 -> 10002 bytes
-rw-r--r--sound/direct_sound_samples/cry_porygon2.aifbin0 -> 7854 bytes
-rw-r--r--sound/direct_sound_samples/cry_primeape.aifbin0 -> 8086 bytes
-rw-r--r--sound/direct_sound_samples/cry_psyduck.aifbin0 -> 6578 bytes
-rw-r--r--sound/direct_sound_samples/cry_pupitar.aifbin0 -> 4234 bytes
-rw-r--r--sound/direct_sound_samples/cry_quagsire.aifbin0 -> 6684 bytes
-rw-r--r--sound/direct_sound_samples/cry_quilava.aifbin0 -> 5962 bytes
-rw-r--r--sound/direct_sound_samples/cry_qwilfish.aifbin0 -> 5808 bytes
-rw-r--r--sound/direct_sound_samples/cry_raichu.aifbin0 -> 11842 bytes
-rw-r--r--sound/direct_sound_samples/cry_raikou.aifbin0 -> 8704 bytes
-rw-r--r--sound/direct_sound_samples/cry_ralts.aifbin0 -> 5066 bytes
-rw-r--r--sound/direct_sound_samples/cry_rapidash.aifbin0 -> 9292 bytes
-rw-r--r--sound/direct_sound_samples/cry_raticate.aifbin0 -> 4770 bytes
-rw-r--r--sound/direct_sound_samples/cry_rattata.aifbin0 -> 3956 bytes
-rw-r--r--sound/direct_sound_samples/cry_rayquaza.aifbin0 -> 14532 bytes
-rw-r--r--sound/direct_sound_samples/cry_regice.aifbin0 -> 15936 bytes
-rw-r--r--sound/direct_sound_samples/cry_regirock.aifbin0 -> 15862 bytes
-rw-r--r--sound/direct_sound_samples/cry_registeel.aifbin0 -> 11476 bytes
-rw-r--r--sound/direct_sound_samples/cry_relicanth.aifbin0 -> 10072 bytes
-rw-r--r--sound/direct_sound_samples/cry_remoraid.aifbin0 -> 5290 bytes
-rw-r--r--sound/direct_sound_samples/cry_rhydon.aifbin0 -> 10186 bytes
-rw-r--r--sound/direct_sound_samples/cry_rhyhorn.aifbin0 -> 9686 bytes
-rw-r--r--sound/direct_sound_samples/cry_roselia.aifbin0 -> 5382 bytes
-rw-r--r--sound/direct_sound_samples/cry_sableye.aifbin0 -> 5826 bytes
-rw-r--r--sound/direct_sound_samples/cry_salamence.aifbin0 -> 12514 bytes
-rw-r--r--sound/direct_sound_samples/cry_sandshrew.aifbin0 -> 4678 bytes
-rw-r--r--sound/direct_sound_samples/cry_sandslash.aifbin0 -> 6784 bytes
-rw-r--r--sound/direct_sound_samples/cry_sceptile.aifbin0 -> 13012 bytes
-rw-r--r--sound/direct_sound_samples/cry_scizor.aifbin0 -> 11462 bytes
-rw-r--r--sound/direct_sound_samples/cry_scyther.aifbin0 -> 6676 bytes
-rw-r--r--sound/direct_sound_samples/cry_seadra.aifbin0 -> 4228 bytes
-rw-r--r--sound/direct_sound_samples/cry_seaking.aifbin0 -> 9654 bytes
-rw-r--r--sound/direct_sound_samples/cry_sealeo.aifbin0 -> 5928 bytes
-rw-r--r--sound/direct_sound_samples/cry_seedot.aifbin0 -> 4106 bytes
-rw-r--r--sound/direct_sound_samples/cry_seel.aifbin0 -> 8954 bytes
-rw-r--r--sound/direct_sound_samples/cry_sentret.aifbin0 -> 2108 bytes
-rw-r--r--sound/direct_sound_samples/cry_seviper.aifbin0 -> 5820 bytes
-rw-r--r--sound/direct_sound_samples/cry_sharpedo.aifbin0 -> 11488 bytes
-rw-r--r--sound/direct_sound_samples/cry_shedinja.aifbin0 -> 3876 bytes
-rw-r--r--sound/direct_sound_samples/cry_shelgon.aifbin0 -> 9992 bytes
-rw-r--r--sound/direct_sound_samples/cry_shellder.aifbin0 -> 7718 bytes
-rw-r--r--sound/direct_sound_samples/cry_shiftry.aifbin0 -> 9860 bytes
-rw-r--r--sound/direct_sound_samples/cry_shroomish.aifbin0 -> 4436 bytes
-rw-r--r--sound/direct_sound_samples/cry_shuckle.aifbin0 -> 5110 bytes
-rw-r--r--sound/direct_sound_samples/cry_shuppet.aifbin0 -> 4144 bytes
-rw-r--r--sound/direct_sound_samples/cry_silcoon.aifbin0 -> 8074 bytes
-rw-r--r--sound/direct_sound_samples/cry_skarmory.aifbin0 -> 11982 bytes
-rw-r--r--sound/direct_sound_samples/cry_skiploom.aifbin0 -> 6516 bytes
-rw-r--r--sound/direct_sound_samples/cry_skitty.aifbin0 -> 3560 bytes
-rw-r--r--sound/direct_sound_samples/cry_slaking.aifbin0 -> 4970 bytes
-rw-r--r--sound/direct_sound_samples/cry_slakoth.aifbin0 -> 4272 bytes
-rw-r--r--sound/direct_sound_samples/cry_slowbro.aifbin0 -> 6720 bytes
-rw-r--r--sound/direct_sound_samples/cry_slowking.aifbin0 -> 11908 bytes
-rw-r--r--sound/direct_sound_samples/cry_slowpoke.aifbin0 -> 3724 bytes
-rw-r--r--sound/direct_sound_samples/cry_slugma.aifbin0 -> 8536 bytes
-rw-r--r--sound/direct_sound_samples/cry_smeargle.aifbin0 -> 5114 bytes
-rw-r--r--sound/direct_sound_samples/cry_smoochum.aifbin0 -> 5860 bytes
-rw-r--r--sound/direct_sound_samples/cry_sneasel.aifbin0 -> 4586 bytes
-rw-r--r--sound/direct_sound_samples/cry_snorlax.aifbin0 -> 2648 bytes
-rw-r--r--sound/direct_sound_samples/cry_snorunt.aifbin0 -> 8500 bytes
-rw-r--r--sound/direct_sound_samples/cry_snubbull.aifbin0 -> 7220 bytes
-rw-r--r--sound/direct_sound_samples/cry_solrock.aifbin0 -> 8080 bytes
-rw-r--r--sound/direct_sound_samples/cry_spearow.aifbin0 -> 8806 bytes
-rw-r--r--sound/direct_sound_samples/cry_spheal.aifbin0 -> 2880 bytes
-rw-r--r--sound/direct_sound_samples/cry_spinarak.aifbin0 -> 6696 bytes
-rw-r--r--sound/direct_sound_samples/cry_spinda.aifbin0 -> 6216 bytes
-rw-r--r--sound/direct_sound_samples/cry_spoink.aifbin0 -> 3648 bytes
-rw-r--r--sound/direct_sound_samples/cry_squirtle.aifbin0 -> 7222 bytes
-rw-r--r--sound/direct_sound_samples/cry_stantler.aifbin0 -> 11208 bytes
-rw-r--r--sound/direct_sound_samples/cry_starmie.aifbin0 -> 10402 bytes
-rw-r--r--sound/direct_sound_samples/cry_staryu.aifbin0 -> 9934 bytes
-rw-r--r--sound/direct_sound_samples/cry_steelix.aifbin0 -> 18988 bytes
-rw-r--r--sound/direct_sound_samples/cry_sudowoodo.aifbin0 -> 8084 bytes
-rw-r--r--sound/direct_sound_samples/cry_suicune.aifbin0 -> 9126 bytes
-rw-r--r--sound/direct_sound_samples/cry_sunflora.aifbin0 -> 7928 bytes
-rw-r--r--sound/direct_sound_samples/cry_sunkern.aifbin0 -> 4056 bytes
-rw-r--r--sound/direct_sound_samples/cry_surskit.aifbin0 -> 5258 bytes
-rw-r--r--sound/direct_sound_samples/cry_swablu.aifbin0 -> 2824 bytes
-rw-r--r--sound/direct_sound_samples/cry_swalot.aifbin0 -> 8676 bytes
-rw-r--r--sound/direct_sound_samples/cry_swampert.aifbin0 -> 11220 bytes
-rw-r--r--sound/direct_sound_samples/cry_swellow.aifbin0 -> 4524 bytes
-rw-r--r--sound/direct_sound_samples/cry_swinub.aifbin0 -> 6328 bytes
-rw-r--r--sound/direct_sound_samples/cry_taillow.aifbin0 -> 3024 bytes
-rw-r--r--sound/direct_sound_samples/cry_tangela.aifbin0 -> 7550 bytes
-rw-r--r--sound/direct_sound_samples/cry_tauros.aifbin0 -> 9150 bytes
-rw-r--r--sound/direct_sound_samples/cry_teddiursa.aifbin0 -> 8266 bytes
-rw-r--r--sound/direct_sound_samples/cry_tentacool.aifbin0 -> 7960 bytes
-rw-r--r--sound/direct_sound_samples/cry_tentacruel.aifbin0 -> 11458 bytes
-rw-r--r--sound/direct_sound_samples/cry_togepi.aifbin0 -> 5460 bytes
-rw-r--r--sound/direct_sound_samples/cry_togetic.aifbin0 -> 3526 bytes
-rw-r--r--sound/direct_sound_samples/cry_torchic.aifbin0 -> 4840 bytes
-rw-r--r--sound/direct_sound_samples/cry_torkoal.aifbin0 -> 4662 bytes
-rw-r--r--sound/direct_sound_samples/cry_totodile.aifbin0 -> 9152 bytes
-rw-r--r--sound/direct_sound_samples/cry_trapinch.aifbin0 -> 5080 bytes
-rw-r--r--sound/direct_sound_samples/cry_treecko.aifbin0 -> 5836 bytes
-rw-r--r--sound/direct_sound_samples/cry_tropius.aifbin0 -> 16318 bytes
-rw-r--r--sound/direct_sound_samples/cry_typhlosion.aifbin0 -> 18944 bytes
-rw-r--r--sound/direct_sound_samples/cry_tyranitar.aifbin0 -> 11656 bytes
-rw-r--r--sound/direct_sound_samples/cry_tyrogue.aifbin0 -> 8072 bytes
-rw-r--r--sound/direct_sound_samples/cry_umbreon.aifbin0 -> 7746 bytes
-rw-r--r--sound/direct_sound_samples/cry_unown.aifbin0 -> 6576 bytes
-rw-r--r--sound/direct_sound_samples/cry_unused_265.aifbin0 -> 4676 bytes
-rw-r--r--sound/direct_sound_samples/cry_unused_268.aifbin0 -> 8828 bytes
-rw-r--r--sound/direct_sound_samples/cry_ursaring.aifbin0 -> 14862 bytes
-rw-r--r--sound/direct_sound_samples/cry_vaporeon.aifbin0 -> 11018 bytes
-rw-r--r--sound/direct_sound_samples/cry_venomoth.aifbin0 -> 8002 bytes
-rw-r--r--sound/direct_sound_samples/cry_venonat.aifbin0 -> 7746 bytes
-rw-r--r--sound/direct_sound_samples/cry_venusaur.aifbin0 -> 9648 bytes
-rw-r--r--sound/direct_sound_samples/cry_vibrava.aifbin0 -> 7002 bytes
-rw-r--r--sound/direct_sound_samples/cry_victreebel.aifbin0 -> 9630 bytes
-rw-r--r--sound/direct_sound_samples/cry_vigoroth.aifbin0 -> 7168 bytes
-rw-r--r--sound/direct_sound_samples/cry_vileplume.aifbin0 -> 12760 bytes
-rw-r--r--sound/direct_sound_samples/cry_volbeat.aifbin0 -> 5772 bytes
-rw-r--r--sound/direct_sound_samples/cry_voltorb.aifbin0 -> 12346 bytes
-rw-r--r--sound/direct_sound_samples/cry_vulpix.aifbin0 -> 11870 bytes
-rw-r--r--sound/direct_sound_samples/cry_wailmer.aifbin0 -> 14134 bytes
-rw-r--r--sound/direct_sound_samples/cry_wailord.aifbin0 -> 20928 bytes
-rw-r--r--sound/direct_sound_samples/cry_walrein.aifbin0 -> 18067 bytes
-rw-r--r--sound/direct_sound_samples/cry_wartortle.aifbin0 -> 8614 bytes
-rw-r--r--sound/direct_sound_samples/cry_weedle.aifbin0 -> 8124 bytes
-rw-r--r--sound/direct_sound_samples/cry_weepinbell.aifbin0 -> 7310 bytes
-rw-r--r--sound/direct_sound_samples/cry_weezing.aifbin0 -> 10806 bytes
-rw-r--r--sound/direct_sound_samples/cry_whiscash.aifbin0 -> 8478 bytes
-rw-r--r--sound/direct_sound_samples/cry_whismur.aifbin0 -> 4092 bytes
-rw-r--r--sound/direct_sound_samples/cry_wigglytuff.aifbin0 -> 3412 bytes
-rw-r--r--sound/direct_sound_samples/cry_wingull.aifbin0 -> 6132 bytes
-rw-r--r--sound/direct_sound_samples/cry_wobbuffet.aifbin0 -> 10276 bytes
-rw-r--r--sound/direct_sound_samples/cry_wooper.aifbin0 -> 3710 bytes
-rw-r--r--sound/direct_sound_samples/cry_wurmple.aifbin0 -> 4412 bytes
-rw-r--r--sound/direct_sound_samples/cry_wynaut.aifbin0 -> 6932 bytes
-rw-r--r--sound/direct_sound_samples/cry_xatu.aifbin0 -> 7392 bytes
-rw-r--r--sound/direct_sound_samples/cry_yanma.aifbin0 -> 8506 bytes
-rw-r--r--sound/direct_sound_samples/cry_zangoose.aifbin0 -> 4794 bytes
-rw-r--r--sound/direct_sound_samples/cry_zapdos.aifbin0 -> 7724 bytes
-rw-r--r--sound/direct_sound_samples/cry_zigzagoon.aifbin0 -> 5786 bytes
-rw-r--r--sound/direct_sound_samples/cry_zubat.aifbin0 -> 9688 bytes
-rw-r--r--sound/music_player_table.inc6
-rw-r--r--sound/song_table.inc351
-rw-r--r--src/blit.c212
-rw-r--r--src/m4a.c1779
-rw-r--r--src/m4a_2.c912
-rw-r--r--src/m4a_4.c545
-rw-r--r--src/menews_jisan.c4
-rw-r--r--src/mevent.c86
-rw-r--r--src/mevent_8145654.c28
-rw-r--r--src/mevent_server.c92
-rw-r--r--src/mystery_gift_menu.c1756
-rw-r--r--src/script.c4
-rw-r--r--src/seagallop.c460
-rw-r--r--src/text.c2
-rw-r--r--src/window.c6
-rw-r--r--src/window_8bpp.c4
-rw-r--r--sym_common.txt2
-rw-r--r--sym_ewram.txt11
523 files changed, 19872 insertions, 6920 deletions
diff --git a/Makefile b/Makefile
index 495279735..c037886a8 100644
--- a/Makefile
+++ b/Makefile
@@ -115,8 +115,7 @@ $(C_BUILDDIR)/agb_flash.o: CFLAGS := -O -mthumb-interwork
$(C_BUILDDIR)/agb_flash_1m.o: CFLAGS := -O -mthumb-interwork
$(C_BUILDDIR)/agb_flash_mx.o: CFLAGS := -O -mthumb-interwork
-$(C_BUILDDIR)/m4a_2.o: CC1 := tools/agbcc/bin/old_agbcc
-$(C_BUILDDIR)/m4a_4.o: CC1 := tools/agbcc/bin/old_agbcc
+$(C_BUILDDIR)/m4a.o: CC1 := tools/agbcc/bin/old_agbcc
$(C_BUILDDIR)/isagbprn.o: CC1 := tools/agbcc/bin/old_agbcc
$(C_BUILDDIR)/isagbprn.o: CFLAGS := -mthumb-interwork
@@ -138,7 +137,7 @@ $(C_BUILDDIR)/%.o : $(C_SUBDIR)/%.c $$(c_dep)
ifeq ($(NODEP),1)
$(ASM_BUILDDIR)/%.o: asm_dep :=
else
-$(ASM_BUILDDIR)/%.o: asm_dep = $(shell $(SCANINC) $(ASM_SUBDIR)/$*.s)
+$(ASM_BUILDDIR)/%.o: asm_dep = $(shell $(SCANINC) -I . $(ASM_SUBDIR)/$*.s)
endif
$(ASM_BUILDDIR)/%.o: $(ASM_SUBDIR)/%.s $$(asm_dep)
@@ -147,7 +146,7 @@ $(ASM_BUILDDIR)/%.o: $(ASM_SUBDIR)/%.s $$(asm_dep)
ifeq ($(NODEP),1)
$(DATA_ASM_BUILDDIR)/%.o: data_dep :=
else
-$(DATA_ASM_BUILDDIR)/%.o: data_dep = $(shell $(SCANINC) $(DATA_ASM_SUBDIR)/$*.s)
+$(DATA_ASM_BUILDDIR)/%.o: data_dep = $(shell $(SCANINC) -I . $(DATA_ASM_SUBDIR)/$*.s)
endif
$(DATA_ASM_BUILDDIR)/%.o: $(DATA_ASM_SUBDIR)/%.s $$(data_dep)
diff --git a/asm/bag.s b/asm/bag.s
index aeac17e69..702de4e4a 100644
--- a/asm/bag.s
+++ b/asm/bag.s
@@ -423,7 +423,7 @@ sub_810BB74: @ 810BB74
lsrs r0, 24
movs r1, 0x64
movs r2, 0xE
- bl sub_8150048
+ bl DrawTextBorderOuter
pop {r0}
bx r0
thumb_func_end sub_810BB74
diff --git a/asm/battle_2.s b/asm/battle_2.s
index ec9fa32a3..e1dd268aa 100644
--- a/asm/battle_2.s
+++ b/asm/battle_2.s
@@ -1645,7 +1645,7 @@ _08010B2A:
ldrb r0, [r0]
cmp r0, 0
beq _08010B64
- bl sub_80FA4F8
+ bl IsNoOneConnected
lsls r0, 24
cmp r0, 0
beq _08010B82
diff --git a/asm/blit.s b/asm/blit.s
deleted file mode 100644
index 84b56fd67..000000000
--- a/asm/blit.s
+++ /dev/null
@@ -1,813 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/constants.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start BlitBitmapRect4BitWithoutColorKey
-BlitBitmapRect4BitWithoutColorKey: @ 8004A60
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- sub sp, 0x14
- ldr r4, [sp, 0x2C]
- ldr r5, [sp, 0x30]
- ldr r6, [sp, 0x34]
- ldr r7, [sp, 0x38]
- lsls r2, 16
- lsrs r2, 16
- lsls r3, 16
- lsrs r3, 16
- lsls r4, 16
- lsrs r4, 16
- lsls r5, 16
- lsrs r5, 16
- lsls r6, 16
- lsrs r6, 16
- lsls r7, 16
- lsrs r7, 16
- str r4, [sp]
- str r5, [sp, 0x4]
- str r6, [sp, 0x8]
- str r7, [sp, 0xC]
- movs r4, 0xFF
- str r4, [sp, 0x10]
- bl BlitBitmapRect4Bit
- add sp, 0x14
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end BlitBitmapRect4BitWithoutColorKey
-
- thumb_func_start BlitBitmapRect4Bit
-BlitBitmapRect4Bit: @ 8004AA4
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x2C
- str r0, [sp]
- str r1, [sp, 0x4]
- ldr r0, [sp, 0x4C]
- ldr r1, [sp, 0x50]
- ldr r4, [sp, 0x54]
- ldr r5, [sp, 0x58]
- ldr r6, [sp, 0x5C]
- lsls r2, 16
- lsrs r2, 16
- str r2, [sp, 0x8]
- lsls r3, 16
- lsrs r7, r3, 16
- lsls r0, 16
- lsrs r0, 16
- str r0, [sp, 0xC]
- lsls r1, 16
- lsrs r1, 16
- mov r9, r1
- lsls r4, 16
- lsrs r4, 16
- lsls r5, 16
- lsrs r5, 16
- lsls r6, 24
- lsrs r6, 24
- str r6, [sp, 0x10]
- ldr r0, [sp, 0x4]
- ldrh r3, [r0, 0x4]
- ldr r1, [sp, 0xC]
- subs r0, r3, r1
- adds r2, r4
- mov r8, r2
- cmp r0, r4
- bge _08004AF8
- ldr r2, [sp, 0x8]
- adds r0, r2
- mov r8, r0
-_08004AF8:
- ldr r4, [sp, 0x4]
- ldrh r0, [r4, 0x6]
- mov r1, r9
- subs r0, r1
- adds r2, r5, r7
- str r2, [sp, 0x14]
- cmp r0, r5
- bge _08004B0C
- adds r0, r7
- str r0, [sp, 0x14]
-_08004B0C:
- ldr r4, [sp]
- ldrh r1, [r4, 0x4]
- movs r2, 0x7
- adds r0, r1, 0
- ands r0, r2
- adds r1, r0
- asrs r1, 3
- str r1, [sp, 0x18]
- adds r0, r3, 0
- ands r0, r2
- adds r0, r3, r0
- asrs r0, 3
- str r0, [sp, 0x1C]
- ldr r0, [sp, 0x10]
- cmp r0, 0xFF
- bne _08004BCA
- adds r3, r7, 0
- mov r1, r9
- ldr r2, [sp, 0x14]
- cmp r3, r2
- blt _08004B38
- b _08004C72
-_08004B38:
- ldr r5, [sp, 0x8]
- ldr r6, [sp, 0xC]
- adds r4, r3, 0x1
- str r4, [sp, 0x24]
- adds r0, r1, 0x1
- str r0, [sp, 0x28]
- cmp r5, r8
- bge _08004BBE
- movs r7, 0x3
- asrs r0, r3, 3
- ldr r2, [sp, 0x18]
- muls r0, r2
- lsls r0, 5
- mov r10, r0
- lsls r0, r3, 29
- lsrs r0, 27
- mov r9, r0
- asrs r0, r1, 3
- ldr r4, [sp, 0x1C]
- muls r0, r4
- lsls r0, 5
- mov r12, r0
- lsls r0, r1, 29
- lsrs r3, r0, 27
-_08004B68:
- asrs r0, r5, 1
- ands r0, r7
- ldr r2, [sp]
- ldr r1, [r2]
- adds r1, r0
- asrs r0, r5, 3
- lsls r0, 5
- adds r1, r0
- add r1, r10
- mov r4, r9
- adds r2, r1, r4
- asrs r0, r6, 1
- ands r0, r7
- ldr r4, [sp, 0x4]
- ldr r1, [r4]
- adds r1, r0
- asrs r0, r6, 3
- lsls r0, 5
- adds r1, r0
- add r1, r12
- adds r4, r1, r3
- ldrb r2, [r2]
- adds r0, r5, 0
- movs r1, 0x1
- ands r0, r1
- lsls r0, 2
- asrs r2, r0
- movs r0, 0xF
- ands r2, r0
- adds r0, r6, 0
- ands r0, r1
- lsls r1, r0, 2
- lsls r2, r1
- movs r0, 0xF0
- asrs r0, r1
- ldrb r1, [r4]
- ands r0, r1
- orrs r2, r0
- strb r2, [r4]
- adds r5, 0x1
- adds r6, 0x1
- cmp r5, r8
- blt _08004B68
-_08004BBE:
- ldr r3, [sp, 0x24]
- ldr r1, [sp, 0x28]
- ldr r2, [sp, 0x14]
- cmp r3, r2
- blt _08004B38
- b _08004C72
-_08004BCA:
- adds r3, r7, 0
- mov r1, r9
- ldr r4, [sp, 0x14]
- cmp r3, r4
- bge _08004C72
-_08004BD4:
- ldr r5, [sp, 0x8]
- ldr r6, [sp, 0xC]
- adds r0, r3, 0x1
- str r0, [sp, 0x24]
- adds r2, r1, 0x1
- str r2, [sp, 0x28]
- cmp r5, r8
- bge _08004C68
- movs r4, 0x3
- mov r9, r4
- asrs r0, r3, 3
- ldr r2, [sp, 0x18]
- muls r0, r2
- lsls r0, 5
- str r0, [sp, 0x20]
- lsls r0, r3, 29
- lsrs r0, 27
- mov r10, r0
- movs r3, 0x1
- asrs r0, r1, 3
- ldr r4, [sp, 0x1C]
- muls r0, r4
- lsls r0, 5
- mov r12, r0
- lsls r0, r1, 29
- lsrs r7, r0, 27
-_08004C08:
- asrs r0, r5, 1
- mov r1, r9
- ands r0, r1
- ldr r2, [sp]
- ldr r1, [r2]
- adds r1, r0
- asrs r0, r5, 3
- lsls r0, 5
- adds r1, r0
- ldr r4, [sp, 0x20]
- adds r1, r4
- mov r0, r10
- adds r2, r1, r0
- asrs r0, r6, 1
- mov r1, r9
- ands r0, r1
- ldr r4, [sp, 0x4]
- ldr r1, [r4]
- adds r1, r0
- asrs r0, r6, 3
- lsls r0, 5
- adds r1, r0
- add r1, r12
- adds r4, r1, r7
- ldrb r2, [r2]
- adds r0, r5, 0
- ands r0, r3
- lsls r0, 2
- asrs r2, r0
- movs r0, 0xF
- ands r2, r0
- ldr r0, [sp, 0x10]
- cmp r2, r0
- beq _08004C60
- adds r0, r6, 0
- ands r0, r3
- lsls r1, r0, 2
- lsls r2, r1
- movs r0, 0xF0
- asrs r0, r1
- ldrb r1, [r4]
- ands r0, r1
- orrs r2, r0
- strb r2, [r4]
-_08004C60:
- adds r5, 0x1
- adds r6, 0x1
- cmp r5, r8
- blt _08004C08
-_08004C68:
- ldr r3, [sp, 0x24]
- ldr r1, [sp, 0x28]
- ldr r2, [sp, 0x14]
- cmp r3, r2
- blt _08004BD4
-_08004C72:
- add sp, 0x2C
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end BlitBitmapRect4Bit
-
- thumb_func_start FillBitmapRect4Bit
-FillBitmapRect4Bit: @ 8004C84
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x4
- mov r9, r0
- ldr r0, [sp, 0x24]
- ldr r4, [sp, 0x28]
- lsls r1, 16
- lsrs r1, 16
- mov r10, r1
- lsls r2, 16
- lsrs r2, 16
- adds r5, r2, 0
- lsls r3, 16
- lsrs r3, 16
- lsls r0, 16
- lsrs r0, 16
- lsls r4, 24
- lsrs r7, r4, 24
- adds r4, r1, r3
- mov r3, r9
- ldrh r1, [r3, 0x4]
- cmp r4, r1
- ble _08004CBA
- adds r4, r1, 0
-_08004CBA:
- adds r2, r0
- mov r12, r2
- mov r2, r9
- ldrh r0, [r2, 0x6]
- cmp r12, r0
- ble _08004CC8
- mov r12, r0
-_08004CC8:
- movs r0, 0x7
- ands r0, r1
- adds r0, r1, r0
- asrs r0, 3
- str r0, [sp]
- adds r1, r5, 0
- cmp r1, r12
- bge _08004D30
-_08004CD8:
- mov r3, r10
- adds r0, r1, 0x1
- mov r8, r0
- cmp r3, r4
- bge _08004D2A
- asrs r0, r1, 3
- ldr r2, [sp]
- muls r0, r2
- lsls r6, r0, 5
- lsls r0, r1, 29
- lsrs r5, r0, 27
-_08004CEE:
- asrs r2, r3, 1
- movs r0, 0x3
- ands r2, r0
- mov r0, r9
- ldr r1, [r0]
- adds r1, r2
- asrs r0, r3, 3
- lsls r0, 5
- adds r1, r0
- adds r1, r6
- adds r2, r1, r5
- movs r0, 0x1
- ands r0, r3
- cmp r0, 0
- beq _08004D1A
- ldrb r0, [r2]
- movs r1, 0xF
- ands r1, r0
- lsls r0, r7, 4
- orrs r1, r0
- strb r1, [r2]
- b _08004D24
-_08004D1A:
- ldrb r1, [r2]
- movs r0, 0xF0
- ands r0, r1
- orrs r0, r7
- strb r0, [r2]
-_08004D24:
- adds r3, 0x1
- cmp r3, r4
- blt _08004CEE
-_08004D2A:
- mov r1, r8
- cmp r1, r12
- blt _08004CD8
-_08004D30:
- add sp, 0x4
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end FillBitmapRect4Bit
-
- thumb_func_start BlitBitmapRect4BitTo8Bit
-BlitBitmapRect4BitTo8Bit: @ 8004D40
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x3C
- str r0, [sp]
- str r1, [sp, 0x4]
- ldr r0, [sp, 0x5C]
- ldr r1, [sp, 0x60]
- ldr r5, [sp, 0x64]
- ldr r4, [sp, 0x68]
- ldr r6, [sp, 0x6C]
- ldr r7, [sp, 0x70]
- mov r8, r7
- lsls r2, 16
- lsrs r2, 16
- str r2, [sp, 0x8]
- lsls r3, 16
- lsrs r3, 16
- lsls r0, 16
- lsrs r0, 16
- str r0, [sp, 0xC]
- lsls r1, 16
- lsrs r7, r1, 16
- lsls r5, 16
- lsrs r5, 16
- lsls r4, 16
- lsrs r4, 16
- lsls r6, 24
- lsrs r6, 24
- str r6, [sp, 0x10]
- mov r0, r8
- lsls r0, 28
- lsrs r0, 24
- str r0, [sp, 0x14]
- lsls r0, r6, 28
- lsrs r0, 24
- str r0, [sp, 0x28]
- ldr r1, [sp, 0x4]
- ldrh r0, [r1, 0x4]
- ldr r2, [sp, 0xC]
- subs r0, r2
- ldr r1, [sp, 0x8]
- adds r1, r5, r1
- str r1, [sp, 0x18]
- cmp r0, r5
- bge _08004DA6
- ldr r2, [sp, 0x8]
- adds r0, r2
- str r0, [sp, 0x18]
-_08004DA6:
- ldr r5, [sp, 0x4]
- ldrh r1, [r5, 0x6]
- subs r0, r1, r7
- cmp r0, r4
- bge _08004DB8
- adds r0, r3, r1
- subs r0, r7
- str r0, [sp, 0x1C]
- b _08004DBC
-_08004DB8:
- adds r4, r3, r4
- str r4, [sp, 0x1C]
-_08004DBC:
- ldr r0, [sp]
- ldrh r1, [r0, 0x4]
- movs r2, 0x7
- adds r0, r1, 0
- ands r0, r2
- adds r1, r0
- asrs r1, 3
- str r1, [sp, 0x20]
- ldr r5, [sp, 0x4]
- ldrh r1, [r5, 0x4]
- adds r0, r1, 0
- ands r0, r2
- adds r1, r0
- asrs r1, 3
- str r1, [sp, 0x24]
- ldr r0, [sp, 0x10]
- cmp r0, 0xFF
- bne _08004E9C
- adds r2, r3, 0
- adds r5, r7, 0
- ldr r1, [sp, 0x1C]
- cmp r2, r1
- blt _08004DEC
- b _08004F7E
-_08004DEC:
- ldr r3, [sp, 0x8]
- lsrs r3, 1
- str r3, [sp, 0x2C]
- movs r0, 0x3
- ands r3, r0
- str r3, [sp, 0x2C]
- ldr r7, [sp, 0x8]
- lsrs r0, r7, 3
- lsls r0, 5
- str r0, [sp, 0x30]
-_08004E00:
- ldr r0, [sp]
- ldr r1, [r0]
- ldr r3, [sp, 0x2C]
- adds r1, r3
- ldr r7, [sp, 0x30]
- adds r1, r7
- asrs r0, r2, 3
- ldr r3, [sp, 0x20]
- muls r0, r3
- lsls r0, 5
- mov r8, r0
- add r1, r8
- lsls r0, r2, 29
- lsrs r7, r0, 27
- adds r6, r1, r7
- ldr r3, [sp, 0x8]
- ldr r4, [sp, 0xC]
- adds r2, 0x1
- mov r10, r2
- adds r0, r5, 0x1
- str r0, [sp, 0x38]
- ldr r1, [sp, 0x18]
- cmp r3, r1
- bge _08004E90
- asrs r0, r5, 3
- ldr r2, [sp, 0x24]
- muls r0, r2
- lsls r0, 6
- mov r12, r0
- lsls r0, r5, 29
- lsrs r0, 26
- mov r9, r0
-_08004E40:
- movs r0, 0x7
- ands r0, r4
- ldr r5, [sp, 0x4]
- ldr r1, [r5]
- adds r1, r0
- asrs r0, r4, 3
- lsls r0, 6
- adds r1, r0
- add r1, r12
- mov r0, r9
- adds r5, r1, r0
- movs r0, 0x1
- ands r0, r3
- cmp r0, 0
- beq _08004E64
- ldrb r0, [r6]
- lsrs r0, 4
- b _08004E80
-_08004E64:
- asrs r2, r3, 1
- movs r0, 0x3
- ands r2, r0
- ldr r0, [sp]
- ldr r1, [r0]
- adds r1, r2
- asrs r0, r3, 3
- lsls r0, 5
- adds r1, r0
- add r1, r8
- adds r6, r1, r7
- ldrb r1, [r6]
- movs r0, 0xF
- ands r0, r1
-_08004E80:
- ldr r1, [sp, 0x14]
- adds r0, r1, r0
- strb r0, [r5]
- adds r3, 0x1
- adds r4, 0x1
- ldr r2, [sp, 0x18]
- cmp r3, r2
- blt _08004E40
-_08004E90:
- mov r2, r10
- ldr r5, [sp, 0x38]
- ldr r3, [sp, 0x1C]
- cmp r2, r3
- blt _08004E00
- b _08004F7E
-_08004E9C:
- adds r2, r3, 0
- adds r5, r7, 0
- ldr r7, [sp, 0x1C]
- cmp r2, r7
- bge _08004F7E
- ldr r0, [sp, 0x8]
- lsrs r0, 1
- str r0, [sp, 0x34]
- movs r0, 0x3
- ldr r1, [sp, 0x34]
- ands r1, r0
- str r1, [sp, 0x34]
-_08004EB4:
- ldr r3, [sp]
- ldr r1, [r3]
- ldr r7, [sp, 0x34]
- adds r1, r7
- ldr r3, [sp, 0x8]
- lsrs r0, r3, 3
- lsls r0, 5
- adds r1, r0
- asrs r0, r2, 3
- ldr r7, [sp, 0x20]
- muls r0, r7
- lsls r0, 5
- mov r8, r0
- add r1, r8
- lsls r0, r2, 29
- lsrs r7, r0, 27
- adds r6, r1, r7
- ldr r4, [sp, 0xC]
- adds r2, 0x1
- mov r10, r2
- adds r0, r5, 0x1
- str r0, [sp, 0x38]
- ldr r1, [sp, 0x18]
- cmp r3, r1
- bge _08004F74
- asrs r0, r5, 3
- ldr r2, [sp, 0x24]
- muls r0, r2
- lsls r0, 6
- mov r9, r0
- lsls r0, r5, 29
- lsrs r0, 26
- mov r12, r0
-_08004EF6:
- movs r0, 0x1
- ands r0, r3
- cmp r0, 0
- beq _08004F2A
- ldrb r2, [r6]
- movs r0, 0xF0
- ands r0, r2
- ldr r5, [sp, 0x28]
- cmp r0, r5
- beq _08004F6A
- adds r0, r4, 0
- movs r1, 0x7
- ands r0, r1
- ldr r5, [sp, 0x4]
- ldr r1, [r5]
- adds r1, r0
- asrs r0, r4, 3
- lsls r0, 6
- adds r1, r0
- add r1, r9
- mov r0, r12
- adds r5, r1, r0
- lsrs r0, r2, 4
- ldr r1, [sp, 0x14]
- adds r0, r1, r0
- b _08004F68
-_08004F2A:
- asrs r2, r3, 1
- movs r0, 0x3
- ands r2, r0
- ldr r5, [sp]
- ldr r1, [r5]
- adds r1, r2
- asrs r0, r3, 3
- lsls r0, 5
- adds r1, r0
- add r1, r8
- adds r6, r1, r7
- ldrb r0, [r6]
- movs r2, 0xF
- ands r2, r0
- ldr r0, [sp, 0x10]
- cmp r2, r0
- beq _08004F6A
- adds r0, r4, 0
- movs r1, 0x7
- ands r0, r1
- ldr r5, [sp, 0x4]
- ldr r1, [r5]
- adds r1, r0
- asrs r0, r4, 3
- lsls r0, 6
- adds r1, r0
- add r1, r9
- mov r0, r12
- adds r5, r1, r0
- ldr r1, [sp, 0x14]
- adds r0, r1, r2
-_08004F68:
- strb r0, [r5]
-_08004F6A:
- adds r3, 0x1
- adds r4, 0x1
- ldr r2, [sp, 0x18]
- cmp r3, r2
- blt _08004EF6
-_08004F74:
- mov r2, r10
- ldr r5, [sp, 0x38]
- ldr r3, [sp, 0x1C]
- cmp r2, r3
- blt _08004EB4
-_08004F7E:
- add sp, 0x3C
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end BlitBitmapRect4BitTo8Bit
-
- thumb_func_start FillBitmapRect8Bit
-FillBitmapRect8Bit: @ 8004F90
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x8
- mov r8, r0
- ldr r0, [sp, 0x28]
- ldr r4, [sp, 0x2C]
- lsls r1, 16
- lsrs r1, 16
- mov r10, r1
- lsls r2, 16
- lsrs r2, 16
- adds r6, r2, 0
- lsls r3, 16
- lsrs r3, 16
- lsls r0, 16
- lsrs r0, 16
- lsls r4, 24
- lsrs r4, 24
- mov r9, r4
- adds r5, r1, r3
- mov r3, r8
- ldrh r1, [r3, 0x4]
- cmp r5, r1
- ble _08004FC8
- adds r5, r1, 0
-_08004FC8:
- adds r7, r2, r0
- mov r2, r8
- ldrh r0, [r2, 0x6]
- cmp r7, r0
- ble _08004FD4
- adds r7, r0, 0
-_08004FD4:
- movs r0, 0x7
- ands r0, r1
- adds r0, r1, r0
- asrs r0, 3
- str r0, [sp]
- adds r1, r6, 0
- cmp r1, r7
- bge _08005024
-_08004FE4:
- mov r3, r10
- adds r6, r1, 0x1
- str r6, [sp, 0x4]
- cmp r3, r5
- bge _0800501E
- movs r0, 0x7
- mov r12, r0
- asrs r0, r1, 3
- ldr r2, [sp]
- muls r0, r2
- lsls r4, r0, 6
- lsls r0, r1, 29
- lsrs r2, r0, 26
-_08004FFE:
- adds r0, r3, 0
- mov r6, r12
- ands r0, r6
- mov r6, r8
- ldr r1, [r6]
- adds r1, r0
- asrs r0, r3, 3
- lsls r0, 6
- adds r1, r0
- adds r1, r4
- adds r1, r2
- mov r0, r9
- strb r0, [r1]
- adds r3, 0x1
- cmp r3, r5
- blt _08004FFE
-_0800501E:
- ldr r1, [sp, 0x4]
- cmp r1, r7
- blt _08004FE4
-_08005024:
- add sp, 0x8
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end FillBitmapRect8Bit
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/asm/cable_club.s b/asm/cable_club.s
index a403aa659..c7d8a86a6 100644
--- a/asm/cable_club.s
+++ b/asm/cable_club.s
@@ -765,7 +765,7 @@ _08080D3C:
cmp r2, 0x9
bne _08080D54
_08080D44:
- bl sub_80098B8
+ bl CloseLink
bl HideFieldMessageBox
ldr r0, _08080D50 @ =sub_8080F78
b _08080D72
@@ -860,7 +860,7 @@ _08080DF6:
cmp r0, 0x9
bne _08080E20
_08080DFE:
- bl sub_80098B8
+ bl CloseLink
_08080E02:
bl HideFieldMessageBox
ldr r0, _08080E18 @ =gTasks
@@ -2459,7 +2459,7 @@ sub_8081A90: @ 8081A90
lsls r0, 17
cmp r1, r0
ble _08081AC2
- bl sub_80098B8
+ bl CloseLink
ldr r0, _08081ADC @ =c2_800ACD4
bl SetMainCallback2
adds r0, r4, 0
diff --git a/asm/evolution_scene.s b/asm/evolution_scene.s
index c02eef927..f66a066ae 100644
--- a/asm/evolution_scene.s
+++ b/asm/evolution_scene.s
@@ -3691,7 +3691,7 @@ _080CFDBA:
ldrb r0, [r0]
cmp r0, 0
beq _080CFDC6
- bl sub_80FCE44
+ bl DestroyWirelessStatusIndicatorSprite
_080CFDC6:
movs r0, 0x3
bl GetBgTilemapBuffer
diff --git a/asm/intro.s b/asm/intro.s
index 309b636c8..909fee72e 100644
--- a/asm/intro.s
+++ b/asm/intro.s
@@ -2742,14 +2742,14 @@ _080EDC0C:
bl DisableInterrupts
movs r0, 0
bl SetHBlankCallback
- ldr r0, _080EDC3C @ =sub_8078914
+ ldr r0, _080EDC3C @ =CB2_InitTitleScreen
bl SetMainCallback2
_080EDC34:
pop {r4}
pop {r0}
bx r0
.align 2, 0
-_080EDC3C: .4byte sub_8078914
+_080EDC3C: .4byte CB2_InitTitleScreen
thumb_func_end sub_80EDBE8
thumb_func_start sub_80EDC40
diff --git a/asm/learn_move.s b/asm/learn_move.s
index db41257a2..3db64a899 100644
--- a/asm/learn_move.s
+++ b/asm/learn_move.s
@@ -1016,7 +1016,7 @@ _080E4EF4:
lsrs r0, 24
movs r1, 0x1
movs r2, 0xE
- bl sub_8150048
+ bl DrawTextBorderOuter
adds r4, 0x1
cmp r4, 0x7
ble _080E4EF4
diff --git a/asm/link.s b/asm/link.s
index 7130ce69d..4dd79efe1 100644
--- a/asm/link.s
+++ b/asm/link.s
@@ -29,7 +29,7 @@ _08009498:
cmp r0, r1
beq _080094C4
bl sub_800B210
- bl sub_80098B8
+ bl CloseLink
bl RestoreSerialTimer3IntrHandlers
movs r0, 0
b _080094CE
@@ -507,8 +507,8 @@ _080098B0: .4byte gUnknown_3003F30
_080098B4: .4byte gUnknown_3003F2C
thumb_func_end sub_8009804
- thumb_func_start sub_80098B8
-sub_80098B8: @ 80098B8
+ thumb_func_start CloseLink
+CloseLink: @ 80098B8
push {r4,lr}
ldr r0, _080098DC @ =gReceivedRemoteLinkPlayers
movs r4, 0
@@ -529,7 +529,7 @@ _080098CC:
_080098DC: .4byte gReceivedRemoteLinkPlayers
_080098E0: .4byte gWirelessCommType
_080098E4: .4byte gLinkOpen
- thumb_func_end sub_80098B8
+ thumb_func_end CloseLink
thumb_func_start TestBlockTransfer
TestBlockTransfer: @ 80098E8
@@ -1596,7 +1596,7 @@ _0800A100:
bne _0800A112
ldr r0, _0800A11C @ =gUnknown_3003EAC
strb r4, [r0]
- bl sub_80098B8
+ bl CloseLink
_0800A112:
movs r6, 0
ldr r4, _0800A120 @ =gLinkPlayers
@@ -2122,7 +2122,7 @@ sub_800A4BC: @ 800A4BC
ldrb r0, [r0]
cmp r0, 0x1
bne _0800A4D4
- bl sub_80FA4F8
+ bl IsNoOneConnected
lsls r0, 24
lsrs r0, 24
b _0800A4E2
@@ -2833,7 +2833,7 @@ _0800A9E6:
ldr r1, _0800AA1C @ =gUnknown_3003EAC
movs r0, 0x1
strb r0, [r1]
- bl sub_80098B8
+ bl CloseLink
ldr r0, _0800AA20 @ =c2_800ACD4
bl SetMainCallback2
_0800A9F6:
@@ -3045,7 +3045,7 @@ _0800AB5C:
ldr r0, _0800AB90 @ =gLinkVSyncDisabled
movs r4, 0x1
strb r4, [r0]
- bl sub_80098B8
+ bl CloseLink
ldr r1, _0800AB94 @ =gUnknown_3003F80
movs r0, 0
str r0, [r1]
@@ -3198,7 +3198,7 @@ _0800AC8E:
ldr r1, _0800ACB8 @ =gUnknown_3003EAC
movs r0, 0x1
strb r0, [r1]
- bl sub_80098B8
+ bl CloseLink
_0800AC98:
pop {r0}
bx r0
diff --git a/asm/link_rfu.s b/asm/link_rfu.s
index 1fa1aab8f..3638e9e0a 100644
--- a/asm/link_rfu.s
+++ b/asm/link_rfu.s
@@ -7855,7 +7855,7 @@ sub_8100E34: @ 8100E34
movs r0, 0x1
movs r1, 0x1
movs r2, 0xE
- bl sub_8150048
+ bl DrawTextBorderOuter
movs r0, 0
bl sub_8100E7C
movs r0, 0x1
diff --git a/asm/link_rfu_2.s b/asm/link_rfu_2.s
index d36eeca20..e15838946 100644
--- a/asm/link_rfu_2.s
+++ b/asm/link_rfu_2.s
@@ -4012,8 +4012,8 @@ sub_80FA4EC: @ 80FA4EC
_080FA4F4: .4byte gUnknown_3005450
thumb_func_end sub_80FA4EC
- thumb_func_start sub_80FA4F8
-sub_80FA4F8: @ 80FA4F8
+ thumb_func_start IsNoOneConnected
+IsNoOneConnected: @ 80FA4F8
push {lr}
movs r1, 0
ldr r0, _080FA50C @ =gUnknown_3005450
@@ -4027,7 +4027,7 @@ _080FA506:
bx r1
.align 2, 0
_080FA50C: .4byte gUnknown_3005450
- thumb_func_end sub_80FA4F8
+ thumb_func_end IsNoOneConnected
thumb_func_start sub_80FA510
sub_80FA510: @ 80FA510
@@ -5152,7 +5152,7 @@ sub_80FAD98: @ 80FAD98
bne _080FAE30
ldr r6, _080FAE18 @ =gMain
ldr r1, [r6, 0x4]
- ldr r0, _080FAE1C @ =sub_814208C
+ ldr r0, _080FAE1C @ =c2_mystery_gift_e_reader_run
cmp r1, r0
bne _080FADC0
ldr r1, _080FAE20 @ =gWirelessCommType
@@ -5193,13 +5193,13 @@ _080FADF8:
ldrb r0, [r7]
movs r0, 0x2
strb r0, [r7]
- bl sub_80098B8
+ bl CloseLink
b _080FAE62
.align 2, 0
_080FAE10: .4byte gUnknown_3005450
_080FAE14: .4byte gUnknown_3005E10
_080FAE18: .4byte gMain
-_080FAE1C: .4byte sub_814208C
+_080FAE1C: .4byte c2_mystery_gift_e_reader_run
_080FAE20: .4byte gWirelessCommType
_080FAE24: .4byte c2_800ACD4
_080FAE28: .4byte 0x0000069e
@@ -9466,8 +9466,8 @@ _080FCE3C: .4byte 0x00001234
_080FCE40: .4byte gUnknown_843F274
thumb_func_end sub_80FCD74
- thumb_func_start sub_80FCE44
-sub_80FCE44: @ 80FCE44
+ thumb_func_start DestroyWirelessStatusIndicatorSprite
+DestroyWirelessStatusIndicatorSprite: @ 80FCE44
push {r4,lr}
ldr r4, _080FCE90 @ =gSprites
ldr r3, _080FCE94 @ =gUnknown_203ACE4
@@ -9512,7 +9512,7 @@ _080FCE98: .4byte 0x00001234
_080FCE9C: .4byte gMain
_080FCEA0: .4byte gDummyOamData
_080FCEA4: .4byte 0x070003e8
- thumb_func_end sub_80FCE44
+ thumb_func_end DestroyWirelessStatusIndicatorSprite
thumb_func_start sub_80FCEA8
sub_80FCEA8: @ 80FCEA8
@@ -9830,7 +9830,7 @@ _080FD072:
lsrs r0, 24
cmp r0, 0x1
bne _080FD106
- bl sub_80FCE44
+ bl DestroyWirelessStatusIndicatorSprite
_080FD106:
pop {r3}
mov r8, r3
diff --git a/asm/link_rfu_3.s b/asm/link_rfu_3.s
index 776b94c41..7e3718d18 100644
--- a/asm/link_rfu_3.s
+++ b/asm/link_rfu_3.s
@@ -1071,7 +1071,7 @@ _0811615C:
.align 2, 0
_08116164: .4byte gUnknown_8457610
_08116168:
- bl sub_80FCE44
+ bl DestroyWirelessStatusIndicatorSprite
bl sub_80F8DC0
adds r0, r5, 0
bl sub_81161E4
@@ -2347,7 +2347,7 @@ _08116C10:
strb r0, [r6, 0x8]
b _08116D06
_08116C68:
- bl sub_80FCE44
+ bl DestroyWirelessStatusIndicatorSprite
adds r5, r6, 0
adds r5, 0x9
ldr r4, _08116C90 @ =gUnknown_8457754
@@ -2368,14 +2368,14 @@ _08116C68:
_08116C90: .4byte gUnknown_8457754
_08116C94: .4byte gSpecialVar_Result
_08116C98:
- bl sub_80FCE44
+ bl DestroyWirelessStatusIndicatorSprite
ldr r0, _08116CA4 @ =gSpecialVar_Result
movs r1, 0x5
b _08116CDC
.align 2, 0
_08116CA4: .4byte gSpecialVar_Result
_08116CA8:
- bl sub_80FCE44
+ bl DestroyWirelessStatusIndicatorSprite
adds r5, r6, 0
adds r5, 0x9
ldr r4, _08116CC4 @ =gUnknown_8457754
@@ -3911,8 +3911,8 @@ _081179C4: .4byte sub_81175BC
_081179C8: .4byte gTasks
thumb_func_end sub_81179A4
- thumb_func_start sub_81179CC
-sub_81179CC: @ 81179CC
+ thumb_func_start MEvent_CreateTask_Leader
+MEvent_CreateTask_Leader: @ 81179CC
push {r4,lr}
adds r4, r0, 0
ldr r0, _081179FC @ =sub_8117A0C
@@ -3941,7 +3941,7 @@ _081179FC: .4byte sub_8117A0C
_08117A00: .4byte gUnknown_203B05C
_08117A04: .4byte gTasks+0x8
_08117A08: .4byte gSpecialVar_Result
- thumb_func_end sub_81179CC
+ thumb_func_end MEvent_CreateTask_Leader
thumb_func_start sub_8117A0C
sub_8117A0C: @ 8117A0C
@@ -4056,7 +4056,7 @@ _08117AB8:
ldr r0, [r0]
str r0, [sp]
str r1, [sp, 0x4]
- bl sub_81435D4
+ bl GetMysteryGiftBaseBlock
lsls r0, 16
ldr r2, _08117B70 @ =0x0000ffff
ldr r1, [sp, 0x4]
@@ -4067,7 +4067,7 @@ _08117AB8:
bl AddWindow
strb r0, [r5, 0xF]
ldrb r0, [r5, 0xF]
- bl sub_814240C
+ bl MG_DrawTextBorder
ldr r0, _08117B74 @ =gMultiuseListMenuTemplate
adds r2, r0, 0
ldr r1, _08117B78 @ =gUnknown_8456D34
@@ -4113,7 +4113,7 @@ _08117BA4: .4byte gUnknown_203B058
_08117BA8: .4byte gStringVar4
_08117BAC:
ldr r0, _08117BB8 @ =gStringVar4
- bl sub_8142504
+ bl AddTextPrinterToWindow1
movs r0, 0x4
strb r0, [r5, 0xC]
b _08117ECA
@@ -4134,7 +4134,7 @@ _08117BBC:
_08117BD4:
movs r0, 0xD
strb r0, [r5, 0xC]
- bl sub_80FCE44
+ bl DestroyWirelessStatusIndicatorSprite
b _08117ECA
.align 2, 0
_08117BE0: .4byte gMain
@@ -4142,7 +4142,7 @@ _08117BE4:
adds r0, r5, 0
adds r0, 0xD
ldr r1, _08117C08 @ =gUnknown_84577F8
- bl mevent_0814257C
+ bl MG_PrintTextOnWindow1AndWaitButton
cmp r0, 0
bne _08117BF4
b _08117ECA
@@ -4169,7 +4169,7 @@ _08117C12:
adds r1, 0x14
ldr r3, _08117C38 @ =gStringVar4
movs r2, 0
- bl sub_81427A0
+ bl mevent_message_print_and_prompt_yes_no
lsls r0, 24
asrs r4, r0, 24
cmp r4, 0
@@ -4346,7 +4346,7 @@ _08117D88:
b _08117ECA
_08117D94:
ldr r0, _08117DA0 @ =gStringVar4
- bl sub_8142504
+ bl AddTextPrinterToWindow1
movs r0, 0xA
strb r0, [r5, 0xC]
b _08117ECA
@@ -4393,7 +4393,7 @@ _08117DE8:
strb r0, [r5, 0xC]
b _08117ECA
_08117DEE:
- bl sub_80FCE44
+ bl DestroyWirelessStatusIndicatorSprite
bl sub_80F8DC0
ldrb r0, [r5, 0x12]
movs r1, 0
@@ -4416,7 +4416,7 @@ _08117E26:
adds r0, r5, 0
adds r0, 0xD
ldr r1, _08117E44 @ =gUnknown_84571B8
- bl mevent_0814257C
+ bl MG_PrintTextOnWindow1AndWaitButton
cmp r0, 0
beq _08117ECA
adds r0, r4, 0
@@ -4490,8 +4490,8 @@ _08117ECA:
bx r0
thumb_func_end sub_8117A0C
- thumb_func_start sub_8117ED4
-sub_8117ED4: @ 8117ED4
+ thumb_func_start MEvent_CreateTask_CardOrNewsWithFriend
+MEvent_CreateTask_CardOrNewsWithFriend: @ 8117ED4
push {r4,lr}
adds r4, r0, 0
ldr r0, _08117F0C @ =sub_8117F20
@@ -4524,7 +4524,7 @@ _08117F10: .4byte gUnknown_203B05C
_08117F14: .4byte gTasks+0x8
_08117F18: .4byte gUnknown_3002028
_08117F1C: .4byte gSpecialVar_Result
- thumb_func_end sub_8117ED4
+ thumb_func_end MEvent_CreateTask_CardOrNewsWithFriend
thumb_func_start sub_8117F20
sub_8117F20: @ 8117F20
@@ -4585,7 +4585,7 @@ _08117F7C:
b _08118288
_08117FB0:
ldr r0, _08117FBC @ =gUnknown_8458FE4
- bl sub_8142504
+ bl AddTextPrinterToWindow1
movs r0, 0x2
strb r0, [r5, 0x8]
b _08118288
@@ -4609,7 +4609,7 @@ _08117FC0:
ldr r0, [r0]
str r0, [sp]
str r1, [sp, 0x4]
- bl sub_81435D4
+ bl GetMysteryGiftBaseBlock
lsls r0, 16
ldr r2, _08118060 @ =0x0000ffff
ldr r1, [sp, 0x4]
@@ -4623,7 +4623,7 @@ _08117FC0:
bl AddWindow
strb r0, [r5, 0xD]
ldrb r0, [r5, 0xB]
- bl sub_814240C
+ bl MG_DrawTextBorder
ldr r0, _08118068 @ =gMultiuseListMenuTemplate
adds r2, r0, 0
ldr r1, _0811806C @ =gUnknown_8456DDC
@@ -4638,7 +4638,7 @@ _08117FC0:
bl ListMenuInit
strb r0, [r5, 0xE]
ldrb r0, [r5, 0xD]
- bl sub_814240C
+ bl MG_DrawTextBorder
ldrb r0, [r5, 0xD]
movs r1, 0x11
bl FillWindowPixelBuffer
@@ -4766,7 +4766,7 @@ _08118146:
_0811814C: .4byte gMain
_08118150:
ldr r0, _08118184 @ =gUnknown_8459238
- bl sub_8142504
+ bl AddTextPrinterToWindow1
ldr r4, _08118188 @ =gStringVar1
ldrb r0, [r5, 0xF]
lsls r0, 5
@@ -4831,7 +4831,7 @@ _081181D0:
b _08118288
_081181D6:
ldr r0, _081181E8 @ =gUnknown_84576AC
- bl sub_8142504
+ bl AddTextPrinterToWindow1
movs r0, 0
movs r1, 0
bl sub_80FB9E4
@@ -4868,17 +4868,17 @@ _08118222:
adds r0, r4
ldr r1, [r0]
adds r0, r5, 0
- bl mevent_0814257C
+ bl MG_PrintTextOnWindow1AndWaitButton
cmp r0, 0
beq _08118288
- bl sub_80FCE44
+ bl DestroyWirelessStatusIndicatorSprite
b _08118252
.align 2, 0
_08118244: .4byte gUnknown_8457838
_08118248:
- bl sub_80FCE44
+ bl DestroyWirelessStatusIndicatorSprite
ldr r0, _08118264 @ =gUnknown_84571B8
- bl sub_8142504
+ bl AddTextPrinterToWindow1
_08118252:
adds r0, r6, 0
bl DestroyTask
@@ -4910,8 +4910,8 @@ _08118288:
bx r0
thumb_func_end sub_8117F20
- thumb_func_start sub_8118290
-sub_8118290: @ 8118290
+ thumb_func_start MEvent_CreateTask_CardOrNewsOverWireless
+MEvent_CreateTask_CardOrNewsOverWireless: @ 8118290
push {r4,lr}
adds r4, r0, 0
ldr r0, _081182C8 @ =sub_81182DC
@@ -4944,7 +4944,7 @@ _081182CC: .4byte gUnknown_203B05C
_081182D0: .4byte gTasks+0x8
_081182D4: .4byte gUnknown_3002028
_081182D8: .4byte gSpecialVar_Result
- thumb_func_end sub_8118290
+ thumb_func_end MEvent_CreateTask_CardOrNewsOverWireless
thumb_func_start sub_81182DC
sub_81182DC: @ 81182DC
@@ -5004,7 +5004,7 @@ _08118340:
b _08118604
_0811836E:
ldr r0, _0811837C @ =gUnknown_84591DC
- bl sub_8142504
+ bl AddTextPrinterToWindow1
movs r0, 0x2
strb r0, [r5, 0x8]
b _08118604
@@ -5030,7 +5030,7 @@ _08118380:
ldr r0, [r0]
str r0, [sp]
str r1, [sp, 0x4]
- bl sub_81435D4
+ bl GetMysteryGiftBaseBlock
lsls r0, 16
ldr r2, _081183FC @ =0x0000ffff
ldr r1, [sp, 0x4]
@@ -5041,7 +5041,7 @@ _08118380:
bl AddWindow
strb r0, [r5, 0xB]
ldrb r0, [r5, 0xB]
- bl sub_814240C
+ bl MG_DrawTextBorder
ldr r0, _08118400 @ =gMultiuseListMenuTemplate
adds r2, r0, 0
ldr r1, _08118404 @ =gUnknown_8456DDC
@@ -5163,7 +5163,7 @@ _081184BC:
_081184C4: .4byte gMain
_081184C8:
ldr r0, _081184FC @ =gUnknown_845928C
- bl sub_8142504
+ bl AddTextPrinterToWindow1
ldr r4, _08118500 @ =gStringVar1
ldrb r0, [r5, 0xF]
lsls r0, 5
@@ -5228,7 +5228,7 @@ _08118548:
b _08118604
_0811854E:
ldr r0, _08118560 @ =gUnknown_845777C
- bl sub_8142504
+ bl AddTextPrinterToWindow1
movs r0, 0
movs r1, 0
bl sub_80FB9E4
@@ -5281,10 +5281,10 @@ _081185B4:
adds r1, r2
ldr r1, [r1]
_081185C2:
- bl mevent_0814257C
+ bl MG_PrintTextOnWindow1AndWaitButton
cmp r0, 0
beq _08118604
- bl sub_80FCE44
+ bl DestroyWirelessStatusIndicatorSprite
adds r0, r4, 0
bl DestroyTask
bl sub_80F8DC0
@@ -12797,7 +12797,7 @@ _0811C168:
movs r0, 0
movs r1, 0x1
movs r2, 0xD
- bl sub_8150048
+ bl DrawTextBorderOuter
str r5, [sp]
movs r0, 0
adds r1, r6, 0
diff --git a/asm/link_rfu_4.s b/asm/link_rfu_4.s
deleted file mode 100644
index dd9c498a4..000000000
--- a/asm/link_rfu_4.s
+++ /dev/null
@@ -1,2316 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/constants.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start sub_814240C
-sub_814240C: @ 814240C
- push {lr}
- lsls r0, 24
- lsrs r0, 24
- movs r1, 0x1
- movs r2, 0xF
- bl sub_8150048
- pop {r0}
- bx r0
- thumb_func_end sub_814240C
-
- thumb_func_start sub_8142420
-sub_8142420: @ 8142420
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0xC
- movs r0, 0
- mov r8, r0
- movs r0, 0x20
- str r0, [sp]
- movs r0, 0x2
- str r0, [sp, 0x4]
- movs r0, 0x11
- str r0, [sp, 0x8]
- movs r0, 0x3
- movs r1, 0x3
- movs r2, 0
- movs r3, 0
- bl FillBgTilemapBufferRect
- movs r4, 0x1
- movs r1, 0x11
- mov r10, r1
-_0814244E:
- movs r7, 0
- mov r0, r8
- adds r0, 0x2
- movs r1, 0x1
- add r1, r8
- mov r9, r1
- lsls r5, r0, 24
- movs r6, 0
-_0814245E:
- mov r1, r8
- ands r1, r4
- adds r0, r7, 0
- ands r0, r4
- cmp r1, r0
- beq _08142480
- lsrs r2, r6, 24
- str r4, [sp]
- str r4, [sp, 0x4]
- mov r0, r10
- str r0, [sp, 0x8]
- movs r0, 0x3
- movs r1, 0x1
- lsrs r3, r5, 24
- bl FillBgTilemapBufferRect
- b _08142494
-_08142480:
- lsrs r2, r6, 24
- str r4, [sp]
- str r4, [sp, 0x4]
- mov r1, r10
- str r1, [sp, 0x8]
- movs r0, 0x3
- movs r1, 0x2
- lsrs r3, r5, 24
- bl FillBgTilemapBufferRect
-_08142494:
- movs r0, 0x80
- lsls r0, 17
- adds r6, r0
- adds r7, 0x1
- cmp r7, 0x1F
- ble _0814245E
- mov r8, r9
- mov r1, r8
- cmp r1, 0x11
- ble _0814244E
- add sp, 0xC
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end sub_8142420
-
- thumb_func_start sub_81424B8
-sub_81424B8: @ 81424B8
- push {lr}
- sub sp, 0xC
- cmp r0, 0
- beq _081424C6
- cmp r0, 0x1
- beq _081424DE
- b _081424F6
-_081424C6:
- movs r0, 0x20
- str r0, [sp]
- str r0, [sp, 0x4]
- movs r0, 0x11
- str r0, [sp, 0x8]
- movs r0, 0
- movs r1, 0
- movs r2, 0
- movs r3, 0
- bl FillBgTilemapBufferRect
- b _081424F6
-_081424DE:
- movs r0, 0x20
- str r0, [sp]
- movs r0, 0x1E
- str r0, [sp, 0x4]
- movs r0, 0x11
- str r0, [sp, 0x8]
- movs r0, 0
- movs r1, 0
- movs r2, 0
- movs r3, 0x2
- bl FillBgTilemapBufferRect
-_081424F6:
- movs r0, 0
- bl CopyBgTilemapBufferToVram
- add sp, 0xC
- pop {r0}
- bx r0
- thumb_func_end sub_81424B8
-
- thumb_func_start sub_8142504
-sub_8142504: @ 8142504
- push {r4,lr}
- sub sp, 0x14
- adds r1, r0, 0
- ldr r4, _08142558 @ =gStringVar4
- adds r0, r4, 0
- bl StringExpandPlaceholders
- movs r0, 0x1
- movs r1, 0x11
- bl FillWindowPixelBuffer
- movs r1, 0
- str r1, [sp]
- movs r0, 0x2
- str r0, [sp, 0x4]
- ldr r0, _0814255C @ =gUnknown_8466EF0
- str r0, [sp, 0x8]
- str r1, [sp, 0xC]
- str r4, [sp, 0x10]
- movs r0, 0x1
- movs r1, 0x2
- movs r2, 0
- movs r3, 0x2
- bl AddTextPrinterParametrized2
- movs r0, 0x1
- movs r1, 0x1
- movs r2, 0xF
- bl sub_8150048
- movs r0, 0x1
- bl PutWindowTilemap
- movs r0, 0x1
- movs r1, 0x3
- bl CopyWindowToVram
- add sp, 0x14
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08142558: .4byte gStringVar4
-_0814255C: .4byte gUnknown_8466EF0
- thumb_func_end sub_8142504
-
- thumb_func_start sub_8142560
-sub_8142560: @ 8142560
- push {lr}
- movs r0, 0x1
- bl rbox_fill_rectangle
- movs r0, 0x1
- bl ClearWindowTilemap
- movs r0, 0x1
- movs r1, 0x1
- bl CopyWindowToVram
- pop {r0}
- bx r0
- thumb_func_end sub_8142560
-
- thumb_func_start mevent_0814257C
-mevent_0814257C: @ 814257C
- push {r4,lr}
- sub sp, 0xC
- adds r4, r0, 0
- adds r0, r1, 0
- ldrb r2, [r4]
- cmp r2, 0x1
- beq _081425A4
- cmp r2, 0x1
- bgt _08142594
- cmp r2, 0
- beq _0814259E
- b _08142604
-_08142594:
- cmp r2, 0x2
- beq _081425D8
- cmp r2, 0xFF
- beq _08142600
- b _08142604
-_0814259E:
- bl sub_8142504
- b _081425C8
-_081425A4:
- movs r0, 0
- str r0, [sp]
- ldr r0, _081425D0 @ =gUnknown_203F3B0
- str r0, [sp, 0x4]
- adds r0, 0x1
- str r0, [sp, 0x8]
- movs r0, 0x1
- movs r1, 0xD0
- movs r2, 0x14
- movs r3, 0x1
- bl DrawDownArrow
- ldr r0, _081425D4 @ =gMain
- ldrh r1, [r0, 0x2E]
- movs r0, 0x3
- ands r0, r1
- cmp r0, 0
- beq _08142604
-_081425C8:
- ldrb r0, [r4]
- adds r0, 0x1
- b _08142602
- .align 2, 0
-_081425D0: .4byte gUnknown_203F3B0
-_081425D4: .4byte gMain
-_081425D8:
- movs r0, 0x1
- str r0, [sp]
- ldr r0, _081425FC @ =gUnknown_203F3B0
- str r0, [sp, 0x4]
- adds r0, 0x1
- str r0, [sp, 0x8]
- movs r0, 0x1
- movs r1, 0xD0
- movs r2, 0x14
- movs r3, 0x1
- bl DrawDownArrow
- movs r0, 0
- strb r0, [r4]
- bl sub_8142560
- movs r0, 0x1
- b _08142606
- .align 2, 0
-_081425FC: .4byte gUnknown_203F3B0
-_08142600:
- movs r0, 0x2
-_08142602:
- strb r0, [r4]
-_08142604:
- movs r0, 0
-_08142606:
- add sp, 0xC
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end mevent_0814257C
-
- thumb_func_start sub_8142610
-sub_8142610: @ 8142610
- push {lr}
- sub sp, 0xC
- movs r0, 0
- str r0, [sp]
- ldr r0, _08142634 @ =gUnknown_203F3B0
- str r0, [sp, 0x4]
- adds r0, 0x1
- str r0, [sp, 0x8]
- movs r0, 0x1
- movs r1, 0xD0
- movs r2, 0x14
- movs r3, 0x1
- bl DrawDownArrow
- add sp, 0xC
- pop {r0}
- bx r0
- .align 2, 0
-_08142634: .4byte gUnknown_203F3B0
- thumb_func_end sub_8142610
-
- thumb_func_start sub_8142638
-sub_8142638: @ 8142638
- push {lr}
- sub sp, 0xC
- movs r0, 0x1
- str r0, [sp]
- ldr r0, _0814265C @ =gUnknown_203F3B0
- str r0, [sp, 0x4]
- adds r0, 0x1
- str r0, [sp, 0x8]
- movs r0, 0x1
- movs r1, 0xD0
- movs r2, 0x14
- movs r3, 0x1
- bl DrawDownArrow
- add sp, 0xC
- pop {r0}
- bx r0
- .align 2, 0
-_0814265C: .4byte gUnknown_203F3B0
- thumb_func_end sub_8142638
-
- thumb_func_start sub_8142660
-sub_8142660: @ 8142660
- push {r4,lr}
- adds r4, r0, 0
- ldrb r0, [r4]
- cmp r0, 0
- beq _08142670
- cmp r0, 0x1
- beq _0814268C
- b _08142698
-_08142670:
- bl sub_8142610
- ldr r0, _08142688 @ =gMain
- ldrh r1, [r0, 0x2E]
- movs r0, 0x3
- ands r0, r1
- cmp r0, 0
- beq _08142698
- ldrb r0, [r4]
- adds r0, 0x1
- strb r0, [r4]
- b _08142698
- .align 2, 0
-_08142688: .4byte gMain
-_0814268C:
- bl sub_8142638
- movs r0, 0
- strb r0, [r4]
- movs r0, 0x1
- b _0814269A
-_08142698:
- movs r0, 0
-_0814269A:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_8142660
-
- thumb_func_start sub_81426A0
-sub_81426A0: @ 81426A0
- push {r4,lr}
- adds r4, r0, 0
- ldrb r0, [r4]
- cmp r0, 0
- bne _081426B0
- adds r0, r1, 0
- bl sub_8142504
-_081426B0:
- ldrb r0, [r4]
- adds r0, 0x1
- strb r0, [r4]
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x78
- bhi _081426C2
- movs r0, 0
- b _081426CC
-_081426C2:
- movs r0, 0
- strb r0, [r4]
- bl sub_8142560
- movs r0, 0x1
-_081426CC:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_81426A0
-
- thumb_func_start sub_81426D4
-sub_81426D4: @ 81426D4
- push {r4-r7,lr}
- sub sp, 0x24
- lsls r2, 24
- add r1, sp, 0x4
- ldr r0, _081426F8 @ =gUnknown_8466E00
- ldm r0!, {r3-r5}
- stm r1!, {r3-r5}
- ldm r0!, {r3-r5}
- stm r1!, {r3-r5}
- ldr r0, _081426FC @ =gUnknown_8466DA8
- ldr r1, [r0, 0x4]
- ldr r0, [r0]
- str r0, [sp, 0x1C]
- str r1, [sp, 0x20]
- cmp r2, 0
- bne _08142704
- ldr r0, _08142700 @ =gUnknown_8466DD0
- b _08142706
- .align 2, 0
-_081426F8: .4byte gUnknown_8466E00
-_081426FC: .4byte gUnknown_8466DA8
-_08142700: .4byte gUnknown_8466DD0
-_08142704:
- ldr r0, _08142794 @ =gUnknown_8466DE8
-_08142706:
- str r0, [sp, 0x4]
- movs r6, 0
- movs r4, 0
- add r0, sp, 0x4
- add r7, sp, 0x1C
- ldrh r0, [r0, 0xC]
- cmp r6, r0
- bcs _0814273A
- add r5, sp, 0x4
-_08142718:
- ldr r1, [sp, 0x4]
- lsls r0, r4, 3
- adds r0, r1
- ldr r1, [r0]
- ldrb r2, [r5, 0x16]
- lsls r2, 29
- lsrs r2, 29
- movs r0, 0x2
- bl GetStringWidth
- cmp r0, r6
- bls _08142732
- adds r6, r0, 0
-_08142732:
- adds r4, 0x1
- ldrh r0, [r5, 0xC]
- cmp r4, r0
- bcc _08142718
-_0814273A:
- adds r2, r6, 0
- adds r2, 0x9
- lsrs r2, 3
- adds r2, 0x2
- movs r0, 0x2
- negs r0, r0
- ands r2, r0
- lsls r3, r2, 24
- ldr r0, _08142798 @ =0x00ffffff
- ldr r1, [sp, 0x1C]
- ands r1, r0
- orrs r1, r3
- movs r0, 0x1E
- subs r0, r2
- lsls r0, 23
- lsrs r0, 16
- ldr r2, _0814279C @ =0xffff00ff
- ands r1, r2
- orrs r1, r0
- str r1, [sp, 0x1C]
- movs r0, 0xE0
- str r0, [sp]
- adds r0, r7, 0
- add r1, sp, 0x4
- movs r2, 0x1
- movs r3, 0xA
- bl DoMysteryGiftListMenu
- adds r4, r0, 0
- movs r0, 0x1
- negs r0, r0
- cmp r4, r0
- beq _0814278A
- movs r0, 0x2
- bl ClearWindowTilemap
- movs r0, 0x2
- movs r1, 0x1
- bl CopyWindowToVram
-_0814278A:
- adds r0, r4, 0
- add sp, 0x24
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_08142794: .4byte gUnknown_8466DE8
-_08142798: .4byte 0x00ffffff
-_0814279C: .4byte 0xffff00ff
- thumb_func_end sub_81426D4
-
- thumb_func_start sub_81427A0
-sub_81427A0: @ 81427A0
- push {r4-r6,lr}
- sub sp, 0x1C
- adds r5, r0, 0
- adds r4, r1, 0
- adds r1, r3, 0
- lsls r2, 24
- lsrs r6, r2, 24
- ldrb r0, [r5]
- cmp r0, 0x1
- beq _08142834
- cmp r0, 0x1
- bgt _081427BE
- cmp r0, 0
- beq _081427CA
- b _081428E6
-_081427BE:
- cmp r0, 0x2
- beq _0814288C
- cmp r0, 0xFF
- bne _081427C8
- b _081428C2
-_081427C8:
- b _081428E6
-_081427CA:
- ldr r0, _081427D8 @ =gStringVar4
- bl StringExpandPlaceholders
- cmp r6, 0
- bne _081427E0
- ldr r0, _081427DC @ =gUnknown_8466D90
- b _081427E2
- .align 2, 0
-_081427D8: .4byte gStringVar4
-_081427DC: .4byte gUnknown_8466D90
-_081427E0:
- ldr r0, _08142828 @ =gUnknown_8466D98
-_081427E2:
- bl AddWindow
- strh r0, [r4]
- ldrb r0, [r4]
- movs r1, 0x11
- bl FillWindowPixelBuffer
- ldrb r0, [r4]
- movs r2, 0
- str r2, [sp]
- movs r1, 0x2
- str r1, [sp, 0x4]
- ldr r1, _0814282C @ =gUnknown_8466EF0
- str r1, [sp, 0x8]
- str r2, [sp, 0xC]
- ldr r1, _08142830 @ =gStringVar4
- str r1, [sp, 0x10]
- movs r1, 0x2
- movs r3, 0x2
- bl AddTextPrinterParametrized2
- ldrb r0, [r4]
- movs r1, 0x1
- movs r2, 0xF
- bl sub_8150048
- ldrb r0, [r4]
- movs r1, 0x2
- bl CopyWindowToVram
- ldrb r0, [r4]
- bl PutWindowTilemap
- b _0814287E
- .align 2, 0
-_08142828: .4byte gUnknown_8466D98
-_0814282C: .4byte gUnknown_8466EF0
-_08142830: .4byte gStringVar4
-_08142834:
- ldr r0, _08142850 @ =gUnknown_8466DB0
- ldr r1, [r0, 0x4]
- ldr r0, [r0]
- str r0, [sp, 0x14]
- str r1, [sp, 0x18]
- cmp r6, 0
- bne _08142858
- ldr r0, _08142854 @ =0xff00ffff
- ldr r1, [sp, 0x14]
- ands r1, r0
- movs r0, 0x90
- lsls r0, 12
- b _08142862
- .align 2, 0
-_08142850: .4byte gUnknown_8466DB0
-_08142854: .4byte 0xff00ffff
-_08142858:
- ldr r0, _08142888 @ =0xff00ffff
- ldr r1, [sp, 0x14]
- ands r1, r0
- movs r0, 0xF0
- lsls r0, 12
-_08142862:
- orrs r1, r0
- str r1, [sp, 0x14]
- movs r0, 0xA
- str r0, [sp]
- movs r0, 0xE
- str r0, [sp, 0x4]
- movs r0, 0
- str r0, [sp, 0x8]
- add r0, sp, 0x14
- movs r1, 0x2
- movs r2, 0
- movs r3, 0x2
- bl sub_810FF60
-_0814287E:
- ldrb r0, [r5]
- adds r0, 0x1
- strb r0, [r5]
- b _081428E6
- .align 2, 0
-_08142888: .4byte 0xff00ffff
-_0814288C:
- bl ProcessMenuInputNoWrap_
- lsls r0, 24
- asrs r6, r0, 24
- movs r1, 0x80
- lsls r1, 17
- adds r0, r1
- lsrs r0, 24
- cmp r0, 0x2
- bhi _081428E6
- movs r0, 0
- strb r0, [r5]
- ldrb r0, [r4]
- bl rbox_fill_rectangle
- ldrb r0, [r4]
- bl ClearWindowTilemap
- ldrb r0, [r4]
- movs r1, 0x1
- bl CopyWindowToVram
- ldrb r0, [r4]
- bl RemoveWindow
- adds r0, r6, 0
- b _081428EA
-_081428C2:
- movs r0, 0
- strb r0, [r5]
- ldrb r0, [r4]
- bl rbox_fill_rectangle
- ldrb r0, [r4]
- bl ClearWindowTilemap
- ldrb r0, [r4]
- movs r1, 0x1
- bl CopyWindowToVram
- ldrb r0, [r4]
- bl RemoveWindow
- movs r0, 0x1
- negs r0, r0
- b _081428EA
-_081428E6:
- movs r0, 0x2
- negs r0, r0
-_081428EA:
- add sp, 0x1C
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end sub_81427A0
-
- thumb_func_start sub_81428F4
-sub_81428F4: @ 81428F4
- push {r4-r6,lr}
- sub sp, 0x14
- adds r6, r0, 0
- adds r5, r1, 0
- ldrb r0, [r6]
- cmp r0, 0x1
- beq _08142994
- cmp r0, 0x1
- bgt _0814290C
- cmp r0, 0
- beq _08142914
- b _08142A38
-_0814290C:
- cmp r0, 0xFF
- bne _08142912
- b _08142A14
-_08142912:
- b _08142A38
-_08142914:
- cmp r2, 0
- bne _0814292C
- ldr r0, _08142924 @ =gStringVar4
- ldr r1, _08142928 @ =gUnknown_841EA86
- bl StringExpandPlaceholders
- b _08142934
- .align 2, 0
-_08142924: .4byte gStringVar4
-_08142928: .4byte gUnknown_841EA86
-_0814292C:
- ldr r0, _08142984 @ =gStringVar4
- ldr r1, _08142988 @ =gUnknown_841EAB7
- bl StringExpandPlaceholders
-_08142934:
- ldr r0, _0814298C @ =gUnknown_8466DA0
- bl AddWindow
- strh r0, [r5]
- lsls r0, 24
- lsrs r0, 24
- movs r1, 0x11
- bl FillWindowPixelBuffer
- ldrb r0, [r5]
- movs r2, 0
- str r2, [sp]
- movs r1, 0x2
- str r1, [sp, 0x4]
- ldr r1, _08142990 @ =gUnknown_8466EF0
- str r1, [sp, 0x8]
- str r2, [sp, 0xC]
- ldr r1, _08142984 @ =gStringVar4
- str r1, [sp, 0x10]
- movs r1, 0x2
- movs r3, 0x2
- bl AddTextPrinterParametrized2
- ldrb r0, [r5]
- movs r1, 0x1
- movs r2, 0xF
- bl sub_8150048
- ldrb r0, [r5]
- movs r1, 0x2
- bl CopyWindowToVram
- ldrb r0, [r5]
- bl PutWindowTilemap
- ldrb r0, [r6]
- adds r0, 0x1
- strb r0, [r6]
- b _08142A38
- .align 2, 0
-_08142984: .4byte gStringVar4
-_08142988: .4byte gUnknown_841EAB7
-_0814298C: .4byte gUnknown_8466DA0
-_08142990: .4byte gUnknown_8466EF0
-_08142994:
- cmp r3, 0
- beq _081429BC
- cmp r2, 0
- bne _081429AC
- ldr r0, _081429A4 @ =gUnknown_8466DC0
- ldr r1, _081429A8 @ =gUnknown_8466E90
- b _081429D4
- .align 2, 0
-_081429A4: .4byte gUnknown_8466DC0
-_081429A8: .4byte gUnknown_8466E90
-_081429AC:
- ldr r0, _081429B4 @ =gUnknown_8466DC8
- ldr r1, _081429B8 @ =gUnknown_8466EC0
- b _081429D4
- .align 2, 0
-_081429B4: .4byte gUnknown_8466DC8
-_081429B8: .4byte gUnknown_8466EC0
-_081429BC:
- cmp r2, 0
- bne _081429D0
- ldr r0, _081429C8 @ =gUnknown_8466DB8
- ldr r1, _081429CC @ =gUnknown_8466E78
- b _081429D4
- .align 2, 0
-_081429C8: .4byte gUnknown_8466DB8
-_081429CC: .4byte gUnknown_8466E78
-_081429D0:
- ldr r0, _08142A0C @ =gUnknown_8466DC0
- ldr r1, _08142A10 @ =gUnknown_8466EA8
-_081429D4:
- movs r2, 0xE0
- str r2, [sp]
- movs r2, 0x1
- movs r3, 0xA
- bl DoMysteryGiftListMenu
- adds r4, r0, 0
- movs r0, 0x1
- negs r0, r0
- cmp r4, r0
- beq _08142A38
- movs r0, 0
- strb r0, [r6]
- ldrb r0, [r5]
- bl rbox_fill_rectangle
- ldrb r0, [r5]
- bl ClearWindowTilemap
- ldrb r0, [r5]
- movs r1, 0x1
- bl CopyWindowToVram
- ldrb r0, [r5]
- bl RemoveWindow
- adds r0, r4, 0
- b _08142A3C
- .align 2, 0
-_08142A0C: .4byte gUnknown_8466DC0
-_08142A10: .4byte gUnknown_8466EA8
-_08142A14:
- movs r0, 0
- strb r0, [r6]
- ldrb r0, [r5]
- bl rbox_fill_rectangle
- ldrb r0, [r5]
- bl ClearWindowTilemap
- ldrb r0, [r5]
- movs r1, 0x1
- bl CopyWindowToVram
- ldrb r0, [r5]
- bl RemoveWindow
- movs r0, 0x2
- negs r0, r0
- b _08142A3C
-_08142A38:
- movs r0, 0x1
- negs r0, r0
-_08142A3C:
- add sp, 0x14
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end sub_81428F4
-
- thumb_func_start sub_8142A44
-sub_8142A44: @ 8142A44
- push {lr}
- cmp r0, 0
- beq _08142A50
- bl sub_8143E1C
- b _08142A54
-_08142A50:
- bl sub_8143FC8
-_08142A54:
- pop {r1}
- bx r1
- thumb_func_end sub_8142A44
-
- thumb_func_start sub_8142A58
-sub_8142A58: @ 8142A58
- push {r4,r5,lr}
- adds r5, r0, 0
- ldrb r0, [r5]
- cmp r0, 0
- beq _08142A68
- cmp r0, 0x1
- beq _08142A90
- b _08142AAC
-_08142A68:
- cmp r1, 0
- bne _08142A80
- bl sav1_get_mevent_buffer_1
- adds r4, r0, 0
- bl sav1_get_mevent_buffer_2
- adds r1, r0, 0
- adds r0, r4, 0
- bl sub_8145654
- b _08142A88
-_08142A80:
- bl sub_8143D58
- bl sub_8146288
-_08142A88:
- ldrb r0, [r5]
- adds r0, 0x1
- strb r0, [r5]
- b _08142AAC
-_08142A90:
- cmp r1, 0
- bne _08142A9E
- bl sub_814571C
-_08142A98:
- cmp r0, 0
- bne _08142AA4
- b _08142AAC
-_08142A9E:
- bl sub_8146318
- b _08142A98
-_08142AA4:
- movs r0, 0
- strb r0, [r5]
- movs r0, 0x1
- b _08142AAE
-_08142AAC:
- movs r0, 0
-_08142AAE:
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end sub_8142A58
-
- thumb_func_start sub_8142AB4
-sub_8142AB4: @ 8142AB4
- push {lr}
- cmp r0, 0
- bne _08142AC0
- bl sub_8143F38
- b _08142AC4
-_08142AC0:
- bl sub_8143DBC
-_08142AC4:
- movs r0, 0x1
- pop {r1}
- bx r1
- thumb_func_end sub_8142AB4
-
- thumb_func_start sub_8142ACC
-sub_8142ACC: @ 8142ACC
- push {lr}
- cmp r0, 0
- bne _08142AE2
- adds r0, r1, 0
- bl sub_814593C
- cmp r0, 0
- beq _08142AEC
- bl sub_81456F0
- b _08142AF4
-_08142AE2:
- adds r0, r1, 0
- bl sub_8146604
- cmp r0, 0
- bne _08142AF0
-_08142AEC:
- movs r0, 0
- b _08142AF6
-_08142AF0:
- bl sub_81462EC
-_08142AF4:
- movs r0, 0x1
-_08142AF6:
- pop {r1}
- bx r1
- thumb_func_end sub_8142ACC
-
- thumb_func_start sub_8142AFC
-sub_8142AFC: @ 8142AFC
- push {lr}
- cmp r2, 0
- beq _08142B0C
- ldr r3, _08142B08 @ =gUnknown_841ECD3
- b _08142B0E
- .align 2, 0
-_08142B08: .4byte gUnknown_841ECD3
-_08142B0C:
- ldr r3, _08142B1C @ =gUnknown_841EC99
-_08142B0E:
- movs r2, 0x1
- bl sub_81427A0
- lsls r0, 24
- asrs r0, 24
- pop {r1}
- bx r1
- .align 2, 0
-_08142B1C: .4byte gUnknown_841EC99
- thumb_func_end sub_8142AFC
-
- thumb_func_start mevent_message_was_thrown_away
-mevent_message_was_thrown_away: @ 8142B20
- push {lr}
- cmp r1, 0
- beq _08142B30
- ldr r1, _08142B2C @ =gUnknown_841ED9C
- b _08142B32
- .align 2, 0
-_08142B2C: .4byte gUnknown_841ED9C
-_08142B30:
- ldr r1, _08142B3C @ =gUnknown_841ED7B
-_08142B32:
- bl mevent_0814257C
- pop {r1}
- bx r1
- .align 2, 0
-_08142B3C: .4byte gUnknown_841ED7B
- thumb_func_end mevent_message_was_thrown_away
-
- thumb_func_start mevent_save_game
-mevent_save_game: @ 8142B40
- push {r4,lr}
- adds r4, r0, 0
- ldrb r0, [r4]
- cmp r0, 0x4
- bhi _08142BB0
- lsls r0, 2
- ldr r1, _08142B54 @ =_08142B58
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_08142B54: .4byte _08142B58
- .align 2, 0
-_08142B58:
- .4byte _08142B6C
- .4byte _08142B78
- .4byte _08142B80
- .4byte _08142B8C
- .4byte _08142BA4
-_08142B6C:
- ldr r0, _08142B74 @ =gUnknown_841ED2F
- bl sub_8142504
- b _08142B98
- .align 2, 0
-_08142B74: .4byte gUnknown_841ED2F
-_08142B78:
- movs r0, 0
- bl TrySavingData
- b _08142B98
-_08142B80:
- ldr r0, _08142B88 @ =gUnknown_841ED50
- bl sub_8142504
- b _08142B98
- .align 2, 0
-_08142B88: .4byte gUnknown_841ED50
-_08142B8C:
- ldr r0, _08142BA0 @ =gMain
- ldrh r1, [r0, 0x2E]
- movs r0, 0x3
- ands r0, r1
- cmp r0, 0
- beq _08142BB0
-_08142B98:
- ldrb r0, [r4]
- adds r0, 0x1
- strb r0, [r4]
- b _08142BB0
- .align 2, 0
-_08142BA0: .4byte gMain
-_08142BA4:
- movs r0, 0
- strb r0, [r4]
- bl sub_8142560
- movs r0, 0x1
- b _08142BB2
-_08142BB0:
- movs r0, 0
-_08142BB2:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end mevent_save_game
-
- thumb_func_start mevent_message
-mevent_message: @ 8142BB8
- push {r4-r6,lr}
- adds r4, r0, 0
- lsls r1, 24
- lsrs r6, r1, 24
- lsls r2, 24
- lsrs r5, r2, 24
- movs r2, 0
- str r2, [r4]
- cmp r3, 0xE
- bls _08142BCE
- b _08142CE0
-_08142BCE:
- lsls r0, r3, 2
- ldr r1, _08142BD8 @ =_08142BDC
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_08142BD8: .4byte _08142BDC
- .align 2, 0
-_08142BDC:
- .4byte _08142C18
- .4byte _08142C24
- .4byte _08142C30
- .4byte _08142C48
- .4byte _08142C60
- .4byte _08142C6C
- .4byte _08142C78
- .4byte _08142C84
- .4byte _08142C90
- .4byte _08142C9C
- .4byte _08142CA8
- .4byte _08142CC0
- .4byte _08142CCC
- .4byte _08142CD8
- .4byte _08142CDC
-_08142C18:
- movs r0, 0
- str r0, [r4]
- ldr r2, _08142C20 @ =gUnknown_841EA6F
- b _08142CE0
- .align 2, 0
-_08142C20: .4byte gUnknown_841EA6F
-_08142C24:
- movs r0, 0
- str r0, [r4]
- ldr r2, _08142C2C @ =gUnknown_841E9D3
- b _08142CE0
- .align 2, 0
-_08142C2C: .4byte gUnknown_841E9D3
-_08142C30:
- movs r0, 0x1
- str r0, [r4]
- ldr r2, _08142C40 @ =gUnknown_841E866
- cmp r5, 0
- bne _08142CE0
- ldr r2, _08142C44 @ =gUnknown_841E8BD
- b _08142CE0
- .align 2, 0
-_08142C40: .4byte gUnknown_841E866
-_08142C44: .4byte gUnknown_841E8BD
-_08142C48:
- movs r0, 0x1
- str r0, [r4]
- ldr r2, _08142C58 @ =gUnknown_841E88F
- cmp r5, 0
- bne _08142CE0
- ldr r2, _08142C5C @ =gUnknown_841E8E2
- b _08142CE0
- .align 2, 0
-_08142C58: .4byte gUnknown_841E88F
-_08142C5C: .4byte gUnknown_841E8E2
-_08142C60:
- movs r0, 0x1
- str r0, [r4]
- ldr r2, _08142C68 @ =gUnknown_841E90C
- b _08142CE0
- .align 2, 0
-_08142C68: .4byte gUnknown_841E90C
-_08142C6C:
- movs r0, 0
- str r0, [r4]
- ldr r2, _08142C74 @ =gUnknown_841E946
- b _08142CE0
- .align 2, 0
-_08142C74: .4byte gUnknown_841E946
-_08142C78:
- movs r0, 0
- str r0, [r4]
- ldr r2, _08142C80 @ =gUnknown_841E98F
- b _08142CE0
- .align 2, 0
-_08142C80: .4byte gUnknown_841E98F
-_08142C84:
- movs r0, 0
- str r0, [r4]
- ldr r2, _08142C8C @ =gUnknown_841E968
- b _08142CE0
- .align 2, 0
-_08142C8C: .4byte gUnknown_841E968
-_08142C90:
- movs r0, 0
- str r0, [r4]
- ldr r2, _08142C98 @ =gUnknown_841E9AB
- b _08142CE0
- .align 2, 0
-_08142C98: .4byte gUnknown_841E9AB
-_08142C9C:
- movs r0, 0
- str r0, [r4]
- ldr r2, _08142CA4 @ =gUnknown_841E7D1
- b _08142CE0
- .align 2, 0
-_08142CA4: .4byte gUnknown_841E7D1
-_08142CA8:
- movs r0, 0
- str r0, [r4]
- ldr r2, _08142CB8 @ =gUnknown_841EA3F
- cmp r6, 0
- bne _08142CE0
- ldr r2, _08142CBC @ =gUnknown_841EA0D
- b _08142CE0
- .align 2, 0
-_08142CB8: .4byte gUnknown_841EA3F
-_08142CBC: .4byte gUnknown_841EA0D
-_08142CC0:
- movs r0, 0
- str r0, [r4]
- ldr r2, _08142CC8 @ =gUnknown_841E7BC
- b _08142CE0
- .align 2, 0
-_08142CC8: .4byte gUnknown_841E7BC
-_08142CCC:
- movs r0, 0x1
- str r0, [r4]
- ldr r2, _08142CD4 @ =gUnknown_841E92B
- b _08142CE0
- .align 2, 0
-_08142CD4: .4byte gUnknown_841E92B
-_08142CD8:
- movs r0, 0x1
- b _08142CDE
-_08142CDC:
- movs r0, 0
-_08142CDE:
- str r0, [r4]
-_08142CE0:
- adds r0, r2, 0
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end mevent_message
-
- thumb_func_start mevent_08142CE8
-mevent_08142CE8: @ 8142CE8
- push {r4-r6,lr}
- adds r6, r0, 0
- adds r0, r1, 0
- adds r5, r2, 0
- ldrb r4, [r6]
- cmp r4, 0x1
- beq _08142D1A
- cmp r4, 0x1
- bgt _08142D00
- cmp r4, 0
- beq _08142D06
- b _08142D46
-_08142D00:
- cmp r4, 0x2
- beq _08142D30
- b _08142D46
-_08142D06:
- cmp r0, 0
- beq _08142D0E
- bl sub_8142504
-_08142D0E:
- movs r0, 0x81
- lsls r0, 1
- bl PlayFanfare
- strh r4, [r5]
- b _08142D28
-_08142D1A:
- ldrh r0, [r5]
- adds r0, 0x1
- strh r0, [r5]
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0xF0
- bls _08142D46
-_08142D28:
- ldrb r0, [r6]
- adds r0, 0x1
- strb r0, [r6]
- b _08142D46
-_08142D30:
- bl IsFanfareTaskInactive
- lsls r0, 24
- cmp r0, 0
- beq _08142D46
- movs r0, 0
- strb r0, [r6]
- bl sub_8142560
- movs r0, 0x1
- b _08142D48
-_08142D46:
- movs r0, 0
-_08142D48:
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end mevent_08142CE8
-
- thumb_func_start mevent_message_stamp_card_etc_send_status
-mevent_message_stamp_card_etc_send_status: @ 8142D50
- push {r4,lr}
- adds r3, r0, 0
- ldr r1, _08142D6C @ =gUnknown_841E7BC
- movs r0, 0
- str r0, [r3]
- adds r4, r1, 0
- cmp r2, 0xE
- bhi _08142E12
- lsls r0, r2, 2
- ldr r1, _08142D70 @ =_08142D74
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_08142D6C: .4byte gUnknown_841E7BC
-_08142D70: .4byte _08142D74
- .align 2, 0
-_08142D74:
- .4byte _08142DB0
- .4byte _08142DB8
- .4byte _08142DC0
- .4byte _08142DC8
- .4byte _08142DD4
- .4byte _08142DDC
- .4byte _08142DE4
- .4byte _08142DEC
- .4byte _08142DF4
- .4byte _08142DFC
- .4byte _08142E10
- .4byte _08142E04
- .4byte _08142E08
- .4byte _08142E08
- .4byte _08142E10
-_08142DB0:
- ldr r1, _08142DB4 @ =gUnknown_841EA6F
- b _08142E12
- .align 2, 0
-_08142DB4: .4byte gUnknown_841EA6F
-_08142DB8:
- ldr r1, _08142DBC @ =gUnknown_841E9D3
- b _08142E12
- .align 2, 0
-_08142DBC: .4byte gUnknown_841E9D3
-_08142DC0:
- ldr r1, _08142DC4 @ =gUnknown_841EB20
- b _08142DCA
- .align 2, 0
-_08142DC4: .4byte gUnknown_841EB20
-_08142DC8:
- ldr r1, _08142DD0 @ =gUnknown_841EB46
-_08142DCA:
- movs r0, 0x1
- str r0, [r3]
- b _08142E12
- .align 2, 0
-_08142DD0: .4byte gUnknown_841EB46
-_08142DD4:
- ldr r1, _08142DD8 @ =gUnknown_841EB71
- b _08142E12
- .align 2, 0
-_08142DD8: .4byte gUnknown_841EB71
-_08142DDC:
- ldr r1, _08142DE0 @ =gUnknown_841EBAA
- b _08142E12
- .align 2, 0
-_08142DE0: .4byte gUnknown_841EBAA
-_08142DE4:
- ldr r1, _08142DE8 @ =gUnknown_841EC12
- b _08142E12
- .align 2, 0
-_08142DE8: .4byte gUnknown_841EC12
-_08142DEC:
- ldr r1, _08142DF0 @ =gUnknown_841EBDE
- b _08142E12
- .align 2, 0
-_08142DF0: .4byte gUnknown_841EBDE
-_08142DF4:
- ldr r1, _08142DF8 @ =gUnknown_841E9AB
- b _08142E12
- .align 2, 0
-_08142DF8: .4byte gUnknown_841E9AB
-_08142DFC:
- ldr r1, _08142E00 @ =gUnknown_841EC40
- b _08142E12
- .align 2, 0
-_08142E00: .4byte gUnknown_841EC40
-_08142E04:
- adds r1, r4, 0
- b _08142E12
-_08142E08:
- ldr r1, _08142E0C @ =gUnknown_841EB8E
- b _08142E12
- .align 2, 0
-_08142E0C: .4byte gUnknown_841EB8E
-_08142E10:
- ldr r1, _08142E1C @ =gUnknown_841EC6A
-_08142E12:
- adds r0, r1, 0
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_08142E1C: .4byte gUnknown_841EC6A
- thumb_func_end mevent_message_stamp_card_etc_send_status
-
- thumb_func_start sub_8142E20
-sub_8142E20: @ 8142E20
- push {r4,r5,lr}
- sub sp, 0x4
- adds r4, r0, 0
- adds r5, r1, 0
- adds r1, r2, 0
- adds r2, r3, 0
- lsls r1, 24
- lsrs r1, 24
- mov r0, sp
- bl mevent_message_stamp_card_etc_send_status
- adds r1, r0, 0
- ldr r0, [sp]
- cmp r0, 0
- bne _08142E46
- adds r0, r4, 0
- bl mevent_0814257C
- b _08142E4E
-_08142E46:
- adds r0, r4, 0
- adds r2, r5, 0
- bl mevent_08142CE8
-_08142E4E:
- add sp, 0x4
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end sub_8142E20
-
- thumb_func_start task_add_00_mystery_gift
-task_add_00_mystery_gift: @ 8142E58
- push {r4,lr}
- ldr r0, _08142E98 @ =sub_8142EA0
- movs r1, 0
- bl CreateTask
- lsls r0, 24
- lsrs r0, 24
- lsls r4, r0, 2
- adds r4, r0
- lsls r4, 3
- ldr r0, _08142E9C @ =gTasks+0x8
- adds r4, r0
- movs r0, 0
- strb r0, [r4, 0x8]
- strb r0, [r4, 0x9]
- strb r0, [r4, 0xA]
- strb r0, [r4, 0xB]
- strb r0, [r4, 0xC]
- strb r0, [r4, 0xD]
- movs r1, 0
- strh r0, [r4]
- strh r0, [r4, 0x2]
- strh r0, [r4, 0x4]
- strh r0, [r4, 0x6]
- strb r1, [r4, 0xE]
- movs r0, 0x40
- bl AllocZeroed
- str r0, [r4, 0x10]
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08142E98: .4byte sub_8142EA0
-_08142E9C: .4byte gTasks+0x8
- thumb_func_end task_add_00_mystery_gift
-
- thumb_func_start sub_8142EA0
-sub_8142EA0: @ 8142EA0
- push {r4,r5,lr}
- sub sp, 0x4
- lsls r0, 24
- lsrs r4, r0, 24
- lsls r0, r4, 2
- adds r0, r4
- lsls r0, 3
- ldr r1, _08142EC4 @ =gTasks+0x8
- adds r5, r0, r1
- ldrb r0, [r5, 0x8]
- cmp r0, 0x25
- bls _08142EBA
- b _081435C6
-_08142EBA:
- lsls r0, 2
- ldr r1, _08142EC8 @ =_08142ECC
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_08142EC4: .4byte gTasks+0x8
-_08142EC8: .4byte _08142ECC
- .align 2, 0
-_08142ECC:
- .4byte _08142F64
- .4byte _08142F6A
- .4byte _08142FAC
- .4byte _08142FE4
- .4byte _08143008
- .4byte _08143058
- .4byte _081430B8
- .4byte _081430EC
- .4byte _081430FC
- .4byte _08143174
- .4byte _08143198
- .4byte _081431B0
- .4byte _081431E0
- .4byte _0814321C
- .4byte _08143232
- .4byte _08143264
- .4byte _0814358C
- .4byte _081432C2
- .4byte _081432CC
- .4byte _081435C6
- .4byte _081432DE
- .4byte _0814332C
- .4byte _081433A2
- .4byte _081433D2
- .4byte _08143408
- .4byte _08143422
- .4byte _08143436
- .4byte _08143442
- .4byte _08143456
- .4byte _0814346A
- .4byte _0814349C
- .4byte _081434D0
- .4byte _08143514
- .4byte _08143528
- .4byte _08143544
- .4byte _08143558
- .4byte _0814358C
- .4byte _081435AC
-_08142F64:
- movs r0, 0x1
- strb r0, [r5, 0x8]
- b _081435C6
-_08142F6A:
- adds r0, r5, 0
- adds r0, 0x9
- adds r1, r5, 0
- movs r2, 0
- bl sub_81426D4
- adds r1, r0, 0
- cmp r1, 0x1
- beq _08142F94
- cmp r1, 0x1
- bcc _08142F8A
- movs r0, 0x2
- negs r0, r0
- cmp r1, r0
- beq _08142FA6
- b _081435C6
-_08142F8A:
- movs r0, 0
- strb r0, [r5, 0xC]
- bl sub_8143FC8
- b _08142F9A
-_08142F94:
- strb r1, [r5, 0xC]
- bl sub_8143E1C
-_08142F9A:
- cmp r0, 0x1
- bne _08142FA0
- b _081434C4
-_08142FA0:
- movs r0, 0x2
- strb r0, [r5, 0x8]
- b _081435C6
-_08142FA6:
- movs r0, 0x25
- strb r0, [r5, 0x8]
- b _081435C6
-_08142FAC:
- ldrb r0, [r5, 0xC]
- cmp r0, 0
- bne _08142FC0
- adds r0, r5, 0
- adds r0, 0x9
- ldr r1, _08142FBC @ =gUnknown_841E6A1
- b _08142FC6
- .align 2, 0
-_08142FBC: .4byte gUnknown_841E6A1
-_08142FC0:
- adds r0, r5, 0
- adds r0, 0x9
- ldr r1, _08142FE0 @ =gUnknown_841E6DC
-_08142FC6:
- bl mevent_0814257C
- cmp r0, 0
- bne _08142FD0
- b _081435C6
-_08142FD0:
- movs r0, 0x3
- strb r0, [r5, 0x8]
- movs r0, 0
- movs r1, 0x1
- bl sub_8142344
- b _081435C6
- .align 2, 0
-_08142FE0: .4byte gUnknown_841E6DC
-_08142FE4:
- ldrb r0, [r5, 0xC]
- cmp r0, 0
- bne _08142FF8
- ldr r0, _08142FF4 @ =gUnknown_841E717
- bl sub_8142504
- b _08142FFE
- .align 2, 0
-_08142FF4: .4byte gUnknown_841E717
-_08142FF8:
- ldr r0, _08143004 @ =gUnknown_841E741
- bl sub_8142504
-_08142FFE:
- movs r0, 0x4
- strb r0, [r5, 0x8]
- b _081435C6
- .align 2, 0
-_08143004: .4byte gUnknown_841E741
-_08143008:
- adds r0, r5, 0
- adds r0, 0x9
- adds r1, r5, 0
- movs r2, 0x1
- bl sub_81426D4
- adds r4, r0, 0
- cmp r4, 0x1
- beq _08143036
- cmp r4, 0x1
- bcc _08143028
- movs r0, 0x2
- negs r0, r0
- cmp r4, r0
- beq _08143042
- b _081435C6
-_08143028:
- bl sub_8142560
- movs r1, 0
- movs r0, 0x5
- strb r0, [r5, 0x8]
- strb r1, [r5, 0xD]
- b _081435C6
-_08143036:
- bl sub_8142560
- movs r0, 0x5
- strb r0, [r5, 0x8]
- strb r4, [r5, 0xD]
- b _081435C6
-_08143042:
- bl sub_8142560
- ldrb r0, [r5, 0xC]
- bl sub_8142A44
- cmp r0, 0
- beq _08143052
- b _081434C4
-_08143052:
- strb r0, [r5, 0x8]
- movs r0, 0
- b _0814359E
-_08143058:
- ldr r0, _08143074 @ =gStringVar1
- movs r1, 0xFF
- strb r1, [r0]
- ldr r0, _08143078 @ =gStringVar2
- strb r1, [r0]
- ldr r0, _0814307C @ =gStringVar3
- strb r1, [r0]
- ldrb r0, [r5, 0xC]
- cmp r0, 0
- beq _08143080
- cmp r0, 0x1
- beq _0814309A
- b _081430B2
- .align 2, 0
-_08143074: .4byte gStringVar1
-_08143078: .4byte gStringVar2
-_0814307C: .4byte gStringVar3
-_08143080:
- ldrb r0, [r5, 0xD]
- cmp r0, 0x1
- bne _0814308E
- movs r0, 0x15
- bl sub_8117ED4
- b _081430B2
-_0814308E:
- cmp r0, 0
- bne _081430B2
- movs r0, 0x15
- bl sub_8118290
- b _081430B2
-_0814309A:
- ldrb r0, [r5, 0xD]
- cmp r0, 0x1
- bne _081430A8
- movs r0, 0x16
- bl sub_8117ED4
- b _081430B2
-_081430A8:
- cmp r0, 0
- bne _081430B2
- movs r0, 0x16
- bl sub_8118290
-_081430B2:
- movs r0, 0x6
- strb r0, [r5, 0x8]
- b _081435C6
-_081430B8:
- ldr r0, _081430D0 @ =gReceivedRemoteLinkPlayers
- ldrb r0, [r0]
- cmp r0, 0
- beq _081430D4
- movs r0, 0x1
- bl sub_81424B8
- movs r0, 0x7
- strb r0, [r5, 0x8]
- bl mevent_srv_ish_do_init
- b _081435C6
- .align 2, 0
-_081430D0: .4byte gReceivedRemoteLinkPlayers
-_081430D4:
- ldr r0, _081430E8 @ =gSpecialVar_Result
- ldrh r0, [r0]
- cmp r0, 0x5
- beq _081430DE
- b _081435C6
-_081430DE:
- movs r0, 0x1
- bl sub_81424B8
- b _08143464
- .align 2, 0
-_081430E8: .4byte gSpecialVar_Result
-_081430EC:
- ldr r0, _081430F8 @ =gUnknown_841E794
- bl sub_8142504
- movs r0, 0x8
- strb r0, [r5, 0x8]
- b _081435C6
- .align 2, 0
-_081430F8: .4byte gUnknown_841E794
-_081430FC:
- adds r0, r5, 0
- bl mevent_srv_ish_do_exec
- subs r0, 0x2
- cmp r0, 0x4
- bls _0814310A
- b _081435C6
-_0814310A:
- lsls r0, 2
- ldr r1, _08143114 @ =_08143118
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_08143114: .4byte _08143118
- .align 2, 0
-_08143118:
- .4byte _08143156
- .4byte _08143150
- .4byte _0814315C
- .4byte _0814313A
- .4byte _0814312C
-_0814312C:
- bl task_add_05_task_del_08FA224_when_no_RfuFunc
- ldrh r0, [r5]
- strb r0, [r5, 0xE]
- movs r0, 0xD
- strb r0, [r5, 0x8]
- b _081435C6
-_0814313A:
- ldr r4, [r5, 0x10]
- bl mevent_srv_ish_get_buffer
- adds r1, r0, 0
- adds r0, r4, 0
- movs r2, 0x40
- bl memcpy
- bl mevent_srv_ish_inc_flag
- b _081435C6
-_08143150:
- movs r0, 0xA
- strb r0, [r5, 0x8]
- b _081435C6
-_08143156:
- movs r0, 0x9
- strb r0, [r5, 0x8]
- b _081435C6
-_0814315C:
- movs r0, 0xB
- strb r0, [r5, 0x8]
- ldr r0, _0814316C @ =gStringVar1
- ldr r1, _08143170 @ =gLinkPlayers + 8
- bl StringCopy
- b _081435C6
- .align 2, 0
-_0814316C: .4byte gStringVar1
-_08143170: .4byte gLinkPlayers + 8
-_08143174:
- adds r4, r5, 0
- adds r4, 0x9
- bl mevent_srv_ish_get_buffer
- adds r3, r0, 0
- adds r0, r4, 0
- adds r1, r5, 0
- movs r2, 0
- bl sub_81427A0
- lsls r0, 24
- asrs r1, r0, 24
- cmp r1, 0x1
- beq _0814320C
- cmp r1, 0x1
- bcs _081431FA
- movs r0, 0
- b _0814320E
-_08143198:
- adds r4, r5, 0
- adds r4, 0x9
- bl mevent_srv_ish_get_buffer
- adds r1, r0, 0
- adds r0, r4, 0
- bl mevent_0814257C
- cmp r0, 0
- bne _081431AE
- b _081435C6
-_081431AE:
- b _08143212
-_081431B0:
- adds r0, r5, 0
- adds r0, 0x9
- ldr r3, _081431D8 @ =gUnknown_841E7F2
- adds r1, r5, 0
- movs r2, 0
- bl sub_81427A0
- lsls r0, 24
- asrs r1, r0, 24
- cmp r1, 0x1
- beq _0814320C
- cmp r1, 0x1
- bcs _081431FA
- bl sub_8144144
- cmp r0, 0x1
- bne _081431DC
- movs r0, 0xC
- strb r0, [r5, 0x8]
- b _081435C6
- .align 2, 0
-_081431D8: .4byte gUnknown_841E7F2
-_081431DC:
- movs r0, 0
- b _0814320E
-_081431E0:
- adds r0, r5, 0
- adds r0, 0x9
- ldr r3, _08143204 @ =gUnknown_841E823
- adds r1, r5, 0
- movs r2, 0
- bl sub_81427A0
- lsls r0, 24
- asrs r1, r0, 24
- cmp r1, 0x1
- beq _0814320C
- cmp r1, 0x1
- bcc _08143208
-_081431FA:
- movs r0, 0x1
- negs r0, r0
- cmp r1, r0
- beq _0814320C
- b _081435C6
- .align 2, 0
-_08143204: .4byte gUnknown_841E823
-_08143208:
- movs r0, 0
- b _0814320E
-_0814320C:
- movs r0, 0x1
-_0814320E:
- bl mevent_srv_ish_set_param
-_08143212:
- bl mevent_srv_ish_inc_flag
- movs r0, 0x7
- strb r0, [r5, 0x8]
- b _081435C6
-_0814321C:
- bl sub_80FA4F8
- lsls r0, 24
- cmp r0, 0
- bne _08143228
- b _081435C6
-_08143228:
- bl sub_80FCE44
- movs r0, 0xE
- strb r0, [r5, 0x8]
- b _081435C6
-_08143232:
- adds r0, r5, 0
- adds r0, 0x9
- ldr r1, _08143258 @ =gUnknown_841E7A3
- bl sub_81426A0
- cmp r0, 0
- bne _08143242
- b _081435C6
-_08143242:
- ldrb r0, [r5, 0xD]
- cmp r0, 0x1
- bne _08143250
- ldr r0, _0814325C @ =gStringVar1
- ldr r1, _08143260 @ =gLinkPlayers + 8
- bl StringCopy
-_08143250:
- movs r0, 0xF
- strb r0, [r5, 0x8]
- b _081435C6
- .align 2, 0
-_08143258: .4byte gUnknown_841E7A3
-_0814325C: .4byte gStringVar1
-_08143260: .4byte gLinkPlayers + 8
-_08143264:
- ldrb r1, [r5, 0xC]
- ldrb r2, [r5, 0xD]
- ldrb r3, [r5, 0xE]
- mov r0, sp
- bl mevent_message
- adds r1, r0, 0
- cmp r1, 0
- bne _08143278
- ldr r1, [r5, 0x10]
-_08143278:
- ldr r0, [sp]
- cmp r0, 0
- beq _0814328A
- adds r0, r5, 0
- adds r0, 0x9
- adds r2, r5, 0
- bl mevent_08142CE8
- b _08143292
-_0814328A:
- adds r0, r5, 0
- adds r0, 0x9
- bl mevent_0814257C
-_08143292:
- adds r1, r0, 0
- cmp r1, 0
- bne _0814329A
- b _081435C6
-_0814329A:
- ldrb r0, [r5, 0xE]
- cmp r0, 0x3
- bne _081432B4
- ldrb r0, [r5, 0xD]
- cmp r0, 0x1
- bne _081432AE
- movs r0, 0x1
- bl sub_8146C30
- b _081432B4
-_081432AE:
- movs r0, 0x2
- bl sub_8146C30
-_081432B4:
- ldr r0, [sp]
- cmp r0, 0
- beq _081432BC
- b _0814357C
-_081432BC:
- strb r0, [r5, 0x8]
- movs r0, 0
- b _0814359E
-_081432C2:
- adds r0, r5, 0
- adds r0, 0x9
- bl mevent_save_game
- b _08143596
-_081432CC:
- adds r0, r5, 0
- adds r0, 0x9
- ldrb r1, [r5, 0xC]
- bl sub_8142A58
- cmp r0, 0
- bne _081432DC
- b _081435C6
-_081432DC:
- b _0814339C
-_081432DE:
- ldrb r0, [r5, 0xC]
- cmp r0, 0
- bne _08143308
- ldr r2, _08143304 @ =gMain
- ldrh r1, [r2, 0x2E]
- movs r0, 0x1
- ands r0, r1
- cmp r0, 0
- beq _081432F4
- movs r0, 0x15
- strb r0, [r5, 0x8]
-_081432F4:
- ldrh r1, [r2, 0x2E]
- movs r0, 0x2
- ands r0, r1
- cmp r0, 0
- bne _08143300
- b _081435C6
-_08143300:
- b _08143326
- .align 2, 0
-_08143304: .4byte gMain
-_08143308:
- ldr r0, _0814331C @ =gMain
- ldrh r0, [r0, 0x2E]
- bl sub_8146884
- cmp r0, 0
- beq _08143320
- cmp r0, 0x1
- beq _08143326
- b _081435C6
- .align 2, 0
-_0814331C: .4byte gMain
-_08143320:
- bl sub_81467EC
- b _08143402
-_08143326:
- movs r0, 0x1B
- strb r0, [r5, 0x8]
- b _081435C6
-_0814332C:
- ldrb r0, [r5, 0xC]
- cmp r0, 0
- bne _08143346
- bl sub_8144054
- cmp r0, 0
- beq _0814335A
- adds r0, r5, 0
- adds r0, 0x9
- ldrb r2, [r5, 0xC]
- adds r1, r5, 0
- movs r3, 0
- b _08143364
-_08143346:
- bl sub_8143E78
- cmp r0, 0
- beq _0814335A
- adds r0, r5, 0
- adds r0, 0x9
- ldrb r2, [r5, 0xC]
- adds r1, r5, 0
- movs r3, 0
- b _08143364
-_0814335A:
- adds r0, r5, 0
- adds r0, 0x9
- ldrb r2, [r5, 0xC]
- adds r1, r5, 0
- movs r3, 0x1
-_08143364:
- bl sub_81428F4
- adds r1, r0, 0
- cmp r1, 0x1
- beq _08143386
- cmp r1, 0x1
- bcc _08143380
- cmp r1, 0x2
- beq _0814338C
- movs r0, 0x2
- negs r0, r0
- cmp r1, r0
- beq _08143392
- b _081435C6
-_08143380:
- movs r0, 0x1C
- strb r0, [r5, 0x8]
- b _081435C6
-_08143386:
- movs r0, 0x1D
- strb r0, [r5, 0x8]
- b _081435C6
-_0814338C:
- movs r0, 0x16
- strb r0, [r5, 0x8]
- b _081435C6
-_08143392:
- ldrb r0, [r5, 0xC]
- cmp r0, 0x1
- bne _0814339C
- bl sub_8146834
-_0814339C:
- movs r0, 0x14
- strb r0, [r5, 0x8]
- b _081435C6
-_081433A2:
- adds r0, r5, 0
- adds r0, 0x9
- ldrb r2, [r5, 0xC]
- adds r1, r5, 0
- bl sub_8142AFC
- adds r1, r0, 0
- cmp r1, 0
- beq _081433BE
- cmp r1, 0
- ble _081433EC
- cmp r1, 0x1
- beq _08143402
- b _081435C6
-_081433BE:
- ldrb r0, [r5, 0xC]
- cmp r0, 0
- bne _081433FC
- bl sub_8144144
- cmp r0, 0x1
- bne _081433FC
- movs r0, 0x17
- strb r0, [r5, 0x8]
- b _081435C6
-_081433D2:
- adds r0, r5, 0
- adds r0, 0x9
- ldr r3, _081433F8 @ =gUnknown_841ECF9
- adds r1, r5, 0
- movs r2, 0x1
- bl sub_81427A0
- lsls r0, 24
- asrs r1, r0, 24
- cmp r1, 0x1
- beq _08143402
- cmp r1, 0x1
- bcc _081433FC
-_081433EC:
- movs r0, 0x1
- negs r0, r0
- cmp r1, r0
- beq _08143402
- b _081435C6
- .align 2, 0
-_081433F8: .4byte gUnknown_841ECF9
-_081433FC:
- movs r0, 0x18
- strb r0, [r5, 0x8]
- b _081435C6
-_08143402:
- movs r0, 0x15
- strb r0, [r5, 0x8]
- b _081435C6
-_08143408:
- ldrb r0, [r5, 0xC]
- movs r1, 0x1
- bl sub_8142ACC
- cmp r0, 0
- bne _08143416
- b _081435C6
-_08143416:
- ldrb r0, [r5, 0xC]
- bl sub_8142AB4
- movs r0, 0x19
- strb r0, [r5, 0x8]
- b _081435C6
-_08143422:
- adds r0, r5, 0
- adds r0, 0x9
- bl mevent_save_game
- cmp r0, 0
- bne _08143430
- b _081435C6
-_08143430:
- movs r0, 0x1A
- strb r0, [r5, 0x8]
- b _081435C6
-_08143436:
- adds r0, r5, 0
- adds r0, 0x9
- ldrb r1, [r5, 0xC]
- bl mevent_message_was_thrown_away
- b _08143596
-_08143442:
- ldrb r0, [r5, 0xC]
- movs r1, 0
- bl sub_8142ACC
- cmp r0, 0
- bne _08143450
- b _081435C6
-_08143450:
- movs r0, 0
- strb r0, [r5, 0x8]
- b _081435C6
-_08143456:
- ldrb r0, [r5, 0xC]
- movs r1, 0x1
- bl sub_8142ACC
- cmp r0, 0
- bne _08143464
- b _081435C6
-_08143464:
- movs r0, 0x3
- strb r0, [r5, 0x8]
- b _081435C6
-_0814346A:
- ldrb r0, [r5, 0xC]
- movs r1, 0x1
- bl sub_8142ACC
- cmp r0, 0
- bne _08143478
- b _081435C6
-_08143478:
- ldrb r0, [r5, 0xC]
- cmp r0, 0
- beq _08143484
- cmp r0, 0x1
- beq _0814348C
- b _08143492
-_08143484:
- movs r0, 0x15
- bl sub_81179CC
- b _08143492
-_0814348C:
- movs r0, 0x16
- bl sub_81179CC
-_08143492:
- movs r0, 0x1
- strb r0, [r5, 0xD]
- movs r0, 0x1E
- strb r0, [r5, 0x8]
- b _081435C6
-_0814349C:
- ldr r0, _081434B0 @ =gReceivedRemoteLinkPlayers
- ldrb r0, [r0]
- cmp r0, 0
- beq _081434B4
- movs r0, 0x1
- bl sub_81424B8
- movs r0, 0x1F
- strb r0, [r5, 0x8]
- b _081435C6
- .align 2, 0
-_081434B0: .4byte gReceivedRemoteLinkPlayers
-_081434B4:
- ldr r0, _081434CC @ =gSpecialVar_Result
- ldrh r0, [r0]
- cmp r0, 0x5
- beq _081434BE
- b _081435C6
-_081434BE:
- movs r0, 0x1
- bl sub_81424B8
-_081434C4:
- movs r0, 0x12
- strb r0, [r5, 0x8]
- b _081435C6
- .align 2, 0
-_081434CC: .4byte gSpecialVar_Result
-_081434D0:
- ldr r0, _081434F0 @ =gStringVar1
- movs r1, 0xFF
- strb r1, [r0]
- ldr r0, _081434F4 @ =gStringVar2
- strb r1, [r0]
- ldr r0, _081434F8 @ =gStringVar3
- strb r1, [r0]
- ldrb r0, [r5, 0xC]
- cmp r0, 0
- bne _08143500
- ldr r0, _081434FC @ =gUnknown_841EAE7
- bl sub_8142504
- bl mevent_srv_common_do_init_2
- b _0814350A
- .align 2, 0
-_081434F0: .4byte gStringVar1
-_081434F4: .4byte gStringVar2
-_081434F8: .4byte gStringVar3
-_081434FC: .4byte gUnknown_841EAE7
-_08143500:
- ldr r0, _08143510 @ =gUnknown_841EB01
- bl sub_8142504
- bl mevent_srv_common_do_init_1
-_0814350A:
- movs r0, 0x20
- strb r0, [r5, 0x8]
- b _081435C6
- .align 2, 0
-_08143510: .4byte gUnknown_841EB01
-_08143514:
- adds r0, r5, 0
- bl mevent_srv_init_do_exec
- cmp r0, 0x3
- bne _081435C6
- ldrh r0, [r5]
- strb r0, [r5, 0xE]
- movs r0, 0x21
- strb r0, [r5, 0x8]
- b _081435C6
-_08143528:
- bl task_add_05_task_del_08FA224_when_no_RfuFunc
- ldr r0, _0814353C @ =gStringVar1
- ldr r1, _08143540 @ =gLinkPlayers + 0x24
- bl StringCopy
- movs r0, 0x22
- strb r0, [r5, 0x8]
- b _081435C6
- .align 2, 0
-_0814353C: .4byte gStringVar1
-_08143540: .4byte gLinkPlayers + 0x24
-_08143544:
- bl sub_80FA4F8
- lsls r0, 24
- cmp r0, 0
- beq _081435C6
- bl sub_80FCE44
- movs r0, 0x23
- strb r0, [r5, 0x8]
- b _081435C6
-_08143558:
- adds r0, r5, 0
- adds r0, 0x9
- ldrb r2, [r5, 0xD]
- ldrb r3, [r5, 0xE]
- adds r1, r5, 0
- bl sub_8142E20
- cmp r0, 0
- beq _081435C6
- ldr r0, [r5, 0xC]
- ldr r1, _08143584 @ =0x00ffff00
- ands r0, r1
- ldr r1, _08143588 @ =0x00030100
- cmp r0, r1
- bne _0814359A
- movs r0, 0x3
- bl sub_8146C30
-_0814357C:
- movs r0, 0x11
- strb r0, [r5, 0x8]
- b _081435C6
- .align 2, 0
-_08143584: .4byte 0x00ffff00
-_08143588: .4byte 0x00030100
-_0814358C:
- adds r0, r5, 0
- adds r0, 0x9
- ldr r1, _081435A8 @ =gUnknown_841E7BC
- bl mevent_0814257C
-_08143596:
- cmp r0, 0
- beq _081435C6
-_0814359A:
- movs r0, 0
- strb r0, [r5, 0x8]
-_0814359E:
- movs r1, 0
- bl sub_8142344
- b _081435C6
- .align 2, 0
-_081435A8: .4byte gUnknown_841E7BC
-_081435AC:
- bl sub_80098B8
- bl sub_812B484
- ldr r0, [r5, 0x10]
- bl Free
- adds r0, r4, 0
- bl DestroyTask
- ldr r0, _081435D0 @ =sub_81422FC
- bl SetMainCallback2
-_081435C6:
- add sp, 0x4
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_081435D0: .4byte sub_81422FC
- thumb_func_end sub_8142EA0
-
- thumb_func_start sub_81435D4
-sub_81435D4: @ 81435D4
- ldr r0, _081435D8 @ =0x0000019b
- bx lr
- .align 2, 0
-_081435D8: .4byte 0x0000019b
- thumb_func_end sub_81435D4
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/asm/list_menu.s b/asm/list_menu.s
index 3119d53bd..4615e249b 100644
--- a/asm/list_menu.s
+++ b/asm/list_menu.s
@@ -60,7 +60,7 @@ _08106F24:
lsls r2, 24
lsrs r2, 24
ldr r1, [sp, 0x4]
- bl sub_8150048
+ bl DrawTextBorderOuter
_08106F34:
ldr r0, _08106F64 @ =gMultiuseListMenuTemplate
adds r2, r0, 0
@@ -1635,8 +1635,8 @@ sub_8107A9C: @ 8107A9C
_08107AE8: .4byte gUnknown_3005E60
thumb_func_end sub_8107A9C
- thumb_func_start sub_8107AEC
-sub_8107AEC: @ 8107AEC
+ thumb_func_start ListMenuDefaultCursorMoveFunc
+ListMenuDefaultCursorMoveFunc: @ 8107AEC
push {lr}
lsls r1, 24
cmp r1, 0
@@ -1646,7 +1646,7 @@ sub_8107AEC: @ 8107AEC
_08107AFA:
pop {r0}
bx r0
- thumb_func_end sub_8107AEC
+ thumb_func_end ListMenuDefaultCursorMoveFunc
thumb_func_start sub_8107B00
sub_8107B00: @ 8107B00
diff --git a/asm/m4a_1.s b/asm/m4a_1.s
index e78c3e69b..db8476382 100644
--- a/asm/m4a_1.s
+++ b/asm/m4a_1.s
@@ -4,8 +4,6 @@
.syntax unified
- .lcomm gUnknown_030007B8, 0x770
-
.text
thumb_func_start umul3232H32
@@ -1909,3 +1907,28 @@ _081DDD90:
thumb_func_end ply_mod
.align 2, 0 @ Don't pad with nop.
+
+ .bss
+gUnknown_030007B8:
+ .space 0x40
+ .size gUnknown_030007B8, .-gUnknown_030007B8
+
+ .global gMPlayTrack_BGM
+gMPlayTrack_BGM:
+ .space 0x320
+ .size gMPlayTrack_BGM, .-gMPlayTrack_BGM
+
+ .global gMPlayTrack_SE1
+gMPlayTrack_SE1:
+ .space 0xF0
+ .size gMPlayTrack_SE1, .-gMPlayTrack_SE1
+
+ .global gMPlayTrack_SE2
+gMPlayTrack_SE2:
+ .space 0x2D0
+ .size gMPlayTrack_SE2, .-gMPlayTrack_SE2
+
+ .global gMPlayTrack_SE3
+gMPlayTrack_SE3:
+ .space 0x50
+ .size gMPlayTrack_SE3, .-gMPlayTrack_SE3
diff --git a/asm/m4a_3.s b/asm/m4a_3.s
deleted file mode 100644
index a842ae925..000000000
--- a/asm/m4a_3.s
+++ /dev/null
@@ -1,574 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/gba_constants.inc"
- .include "constants/m4a_constants.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start CgbSound
-CgbSound: @ 81DEA70
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x1C
- ldr r0, =SOUND_INFO_PTR
- ldr r0, [r0]
- str r0, [sp, 0x4]
- ldrb r0, [r0, 0xA]
- cmp r0, 0
- beq _081DEA94
- subs r0, 0x1
- ldr r1, [sp, 0x4]
- strb r0, [r1, 0xA]
- b _081DEA9A
- .pool
-_081DEA94:
- movs r0, 0xE
- ldr r2, [sp, 0x4]
- strb r0, [r2, 0xA]
-_081DEA9A:
- movs r6, 0x1
- ldr r0, [sp, 0x4]
- ldr r4, [r0, 0x1C]
-_081DEAA0:
- ldrb r1, [r4]
- movs r0, 0xC7
- ands r0, r1
- adds r2, r6, 0x1
- mov r10, r2
- movs r2, 0x40
- adds r2, r4
- mov r9, r2
- cmp r0, 0
- bne _081DEAB6
- b _081DEEA0
-_081DEAB6:
- cmp r6, 0x2
- beq _081DEAE8
- cmp r6, 0x2
- bgt _081DEAC4
- cmp r6, 0x1
- beq _081DEACA
- b _081DEB20
-_081DEAC4:
- cmp r6, 0x3
- beq _081DEB00
- b _081DEB20
-_081DEACA:
- ldr r0, =REG_NR10
- str r0, [sp, 0x8]
- ldr r7, =REG_NR11
- ldr r2, =REG_NR12
- str r2, [sp, 0xC]
- adds r0, 0x4
- str r0, [sp, 0x10]
- adds r2, 0x2
- b _081DEB30
- .pool
-_081DEAE8:
- ldr r0, =REG_NR10 + 1
- str r0, [sp, 0x8]
- ldr r7, =REG_NR21
- ldr r2, =REG_NR22
- b _081DEB28
- .pool
-_081DEB00:
- ldr r0, =REG_NR30
- str r0, [sp, 0x8]
- ldr r7, =REG_NR31
- ldr r2, =REG_NR32
- str r2, [sp, 0xC]
- adds r0, 0x4
- str r0, [sp, 0x10]
- adds r2, 0x2
- b _081DEB30
- .pool
-_081DEB20:
- ldr r0, =REG_NR30 + 1
- str r0, [sp, 0x8]
- ldr r7, =REG_NR41
- ldr r2, =REG_NR42
-_081DEB28:
- str r2, [sp, 0xC]
- adds r0, 0xB
- str r0, [sp, 0x10]
- adds r2, 0x4
-_081DEB30:
- str r2, [sp, 0x14]
- ldr r0, [sp, 0x4]
- ldrb r0, [r0, 0xA]
- str r0, [sp]
- ldr r2, [sp, 0xC]
- ldrb r0, [r2]
- mov r8, r0
- adds r2, r1, 0
- movs r0, 0x80
- ands r0, r2
- cmp r0, 0
- beq _081DEC26
- movs r3, 0x40
- adds r0, r3, 0
- ands r0, r2
- lsls r0, 24
- lsrs r5, r0, 24
- adds r0, r6, 0x1
- mov r10, r0
- movs r1, 0x40
- adds r1, r4
- mov r9, r1
- cmp r5, 0
- bne _081DEC4A
- movs r0, 0x3
- strb r0, [r4]
- strb r0, [r4, 0x1D]
- adds r0, r4, 0
- str r3, [sp, 0x18]
- bl CgbModVol
- ldr r3, [sp, 0x18]
- cmp r6, 0x2
- beq _081DEB98
- cmp r6, 0x2
- bgt _081DEB8C
- cmp r6, 0x1
- beq _081DEB92
- b _081DEBEC
- .pool
-_081DEB8C:
- cmp r6, 0x3
- beq _081DEBA4
- b _081DEBEC
-_081DEB92:
- ldrb r0, [r4, 0x1F]
- ldr r2, [sp, 0x8]
- strb r0, [r2]
-_081DEB98:
- ldr r0, [r4, 0x24]
- lsls r0, 6
- ldrb r1, [r4, 0x1E]
- adds r0, r1, r0
- strb r0, [r7]
- b _081DEBF8
-_081DEBA4:
- ldr r1, [r4, 0x24]
- ldr r0, [r4, 0x28]
- cmp r1, r0
- beq _081DEBCC
- ldr r2, [sp, 0x8]
- strb r3, [r2]
- ldr r1, =REG_WAVE_RAM
- ldr r2, [r4, 0x24]
- ldr r0, [r2]
- str r0, [r1]
- adds r1, 0x4
- ldr r0, [r2, 0x4]
- str r0, [r1]
- adds r1, 0x4
- ldr r0, [r2, 0x8]
- str r0, [r1]
- adds r1, 0x4
- ldr r0, [r2, 0xC]
- str r0, [r1]
- str r2, [r4, 0x28]
-_081DEBCC:
- ldr r0, [sp, 0x8]
- strb r5, [r0]
- ldrb r0, [r4, 0x1E]
- strb r0, [r7]
- ldrb r0, [r4, 0x1E]
- cmp r0, 0
- beq _081DEBE4
- movs r0, 0xC0
- b _081DEC06
- .pool
-_081DEBE4:
- movs r1, 0x80
- negs r1, r1
- strb r1, [r4, 0x1A]
- b _081DEC08
-_081DEBEC:
- ldrb r0, [r4, 0x1E]
- strb r0, [r7]
- ldr r0, [r4, 0x24]
- lsls r0, 3
- ldr r2, [sp, 0x10]
- strb r0, [r2]
-_081DEBF8:
- ldrb r0, [r4, 0x4]
- adds r0, 0x8
- mov r8, r0
- ldrb r0, [r4, 0x1E]
- cmp r0, 0
- beq _081DEC06
- movs r0, 0x40
-_081DEC06:
- strb r0, [r4, 0x1A]
-_081DEC08:
- ldrb r1, [r4, 0x4]
- movs r2, 0
- strb r1, [r4, 0xB]
- movs r0, 0xFF
- ands r0, r1
- adds r1, r6, 0x1
- mov r10, r1
- movs r1, 0x40
- adds r1, r4
- mov r9, r1
- cmp r0, 0
- bne _081DEC22
- b _081DED5E
-_081DEC22:
- strb r2, [r4, 0x9]
- b _081DED8C
-_081DEC26:
- movs r0, 0x4
- ands r0, r2
- cmp r0, 0
- beq _081DEC58
- ldrb r0, [r4, 0xD]
- subs r0, 0x1
- strb r0, [r4, 0xD]
- movs r2, 0xFF
- ands r0, r2
- lsls r0, 24
- adds r1, r6, 0x1
- mov r10, r1
- movs r2, 0x40
- adds r2, r4
- mov r9, r2
- cmp r0, 0
- ble _081DEC4A
- b _081DED9E
-_081DEC4A:
- lsls r0, r6, 24
- lsrs r0, 24
- bl CgbOscOff
- movs r0, 0
- strb r0, [r4]
- b _081DEE9C
-_081DEC58:
- movs r0, 0x40
- ands r0, r1
- adds r2, r6, 0x1
- mov r10, r2
- movs r2, 0x40
- adds r2, r4
- mov r9, r2
- cmp r0, 0
- beq _081DEC98
- movs r0, 0x3
- ands r0, r1
- cmp r0, 0
- beq _081DEC98
- movs r0, 0xFC
- ands r0, r1
- movs r2, 0
- strb r0, [r4]
- ldrb r1, [r4, 0x7]
- strb r1, [r4, 0xB]
- movs r0, 0xFF
- ands r0, r1
- cmp r0, 0
- beq _081DECCA
- movs r0, 0x1
- ldrb r1, [r4, 0x1D]
- orrs r0, r1
- strb r0, [r4, 0x1D]
- cmp r6, 0x3
- beq _081DED8C
- ldrb r2, [r4, 0x7]
- mov r8, r2
- b _081DED8C
-_081DEC98:
- ldrb r0, [r4, 0xB]
- cmp r0, 0
- bne _081DED8C
- cmp r6, 0x3
- bne _081DECAA
- movs r0, 0x1
- ldrb r1, [r4, 0x1D]
- orrs r0, r1
- strb r0, [r4, 0x1D]
-_081DECAA:
- adds r0, r4, 0
- bl CgbModVol
- movs r0, 0x3
- ldrb r2, [r4]
- ands r0, r2
- cmp r0, 0
- bne _081DECFE
- ldrb r0, [r4, 0x9]
- subs r0, 0x1
- strb r0, [r4, 0x9]
- movs r1, 0xFF
- ands r0, r1
- lsls r0, 24
- cmp r0, 0
- bgt _081DECFA
-_081DECCA:
- ldrb r2, [r4, 0xC]
- ldrb r1, [r4, 0xA]
- adds r0, r2, 0
- muls r0, r1
- adds r0, 0xFF
- asrs r0, 8
- movs r1, 0
- strb r0, [r4, 0x9]
- lsls r0, 24
- cmp r0, 0
- beq _081DEC4A
- movs r0, 0x4
- ldrb r2, [r4]
- orrs r0, r2
- strb r0, [r4]
- movs r0, 0x1
- ldrb r1, [r4, 0x1D]
- orrs r0, r1
- strb r0, [r4, 0x1D]
- cmp r6, 0x3
- beq _081DED9E
- movs r2, 0x8
- mov r8, r2
- b _081DED9E
-_081DECFA:
- ldrb r0, [r4, 0x7]
- b _081DED8A
-_081DECFE:
- cmp r0, 0x1
- bne _081DED0A
-_081DED02:
- ldrb r0, [r4, 0x19]
- strb r0, [r4, 0x9]
- movs r0, 0x7
- b _081DED8A
-_081DED0A:
- cmp r0, 0x2
- bne _081DED4E
- ldrb r0, [r4, 0x9]
- subs r0, 0x1
- strb r0, [r4, 0x9]
- movs r1, 0xFF
- ands r0, r1
- lsls r0, 24
- ldrb r2, [r4, 0x19]
- lsls r1, r2, 24
- cmp r0, r1
- bgt _081DED4A
-_081DED22:
- ldrb r0, [r4, 0x6]
- cmp r0, 0
- bne _081DED32
- movs r0, 0xFC
- ldrb r1, [r4]
- ands r0, r1
- strb r0, [r4]
- b _081DECCA
-_081DED32:
- ldrb r0, [r4]
- subs r0, 0x1
- strb r0, [r4]
- movs r0, 0x1
- ldrb r2, [r4, 0x1D]
- orrs r0, r2
- strb r0, [r4, 0x1D]
- cmp r6, 0x3
- beq _081DED02
- movs r0, 0x8
- mov r8, r0
- b _081DED02
-_081DED4A:
- ldrb r0, [r4, 0x5]
- b _081DED8A
-_081DED4E:
- ldrb r0, [r4, 0x9]
- adds r0, 0x1
- strb r0, [r4, 0x9]
- movs r1, 0xFF
- ands r0, r1
- ldrb r2, [r4, 0xA]
- cmp r0, r2
- bcc _081DED88
-_081DED5E:
- ldrb r0, [r4]
- subs r0, 0x1
- movs r2, 0
- strb r0, [r4]
- ldrb r1, [r4, 0x5]
- strb r1, [r4, 0xB]
- movs r0, 0xFF
- ands r0, r1
- cmp r0, 0
- beq _081DED22
- movs r0, 0x1
- ldrb r1, [r4, 0x1D]
- orrs r0, r1
- strb r0, [r4, 0x1D]
- ldrb r0, [r4, 0xA]
- strb r0, [r4, 0x9]
- cmp r6, 0x3
- beq _081DED8C
- ldrb r2, [r4, 0x5]
- mov r8, r2
- b _081DED8C
-_081DED88:
- ldrb r0, [r4, 0x4]
-_081DED8A:
- strb r0, [r4, 0xB]
-_081DED8C:
- ldrb r0, [r4, 0xB]
- subs r0, 0x1
- strb r0, [r4, 0xB]
- ldr r0, [sp]
- cmp r0, 0
- bne _081DED9E
- subs r0, 0x1
- str r0, [sp]
- b _081DEC98
-_081DED9E:
- movs r0, 0x2
- ldrb r1, [r4, 0x1D]
- ands r0, r1
- cmp r0, 0
- beq _081DEE16
- cmp r6, 0x3
- bgt _081DEDDE
- movs r0, 0x8
- ldrb r2, [r4, 0x1]
- ands r0, r2
- cmp r0, 0
- beq _081DEDDE
- ldr r0, =REG_SOUNDBIAS + 1
- ldrb r0, [r0]
- cmp r0, 0x3F
- bgt _081DEDD0
- ldr r0, [r4, 0x20]
- adds r0, 0x2
- ldr r1, =0x000007fc
- b _081DEDDA
- .pool
-_081DEDD0:
- cmp r0, 0x7F
- bgt _081DEDDE
- ldr r0, [r4, 0x20]
- adds r0, 0x1
- ldr r1, =0x000007fe
-_081DEDDA:
- ands r0, r1
- str r0, [r4, 0x20]
-_081DEDDE:
- cmp r6, 0x4
- beq _081DEDF0
- ldr r0, [r4, 0x20]
- ldr r1, [sp, 0x10]
- strb r0, [r1]
- b _081DEDFE
- .pool
-_081DEDF0:
- ldr r2, [sp, 0x10]
- ldrb r0, [r2]
- movs r1, 0x8
- ands r1, r0
- ldr r0, [r4, 0x20]
- orrs r0, r1
- strb r0, [r2]
-_081DEDFE:
- movs r0, 0xC0
- ldrb r1, [r4, 0x1A]
- ands r0, r1
- adds r1, r4, 0
- adds r1, 0x21
- ldrb r1, [r1]
- adds r0, r1, r0
- strb r0, [r4, 0x1A]
- movs r2, 0xFF
- ands r0, r2
- ldr r1, [sp, 0x14]
- strb r0, [r1]
-_081DEE16:
- movs r0, 0x1
- ldrb r2, [r4, 0x1D]
- ands r0, r2
- cmp r0, 0
- beq _081DEE9C
- ldr r1, =REG_NR51
- ldrb r0, [r1]
- ldrb r2, [r4, 0x1C]
- bics r0, r2
- ldrb r2, [r4, 0x1B]
- orrs r0, r2
- strb r0, [r1]
- cmp r6, 0x3
- bne _081DEE68
- ldr r0, =gCgb3Vol
- ldrb r1, [r4, 0x9]
- adds r0, r1, r0
- ldrb r0, [r0]
- ldr r2, [sp, 0xC]
- strb r0, [r2]
- movs r1, 0x80
- adds r0, r1, 0
- ldrb r2, [r4, 0x1A]
- ands r0, r2
- cmp r0, 0
- beq _081DEE9C
- ldr r0, [sp, 0x8]
- strb r1, [r0]
- ldrb r0, [r4, 0x1A]
- ldr r1, [sp, 0x14]
- strb r0, [r1]
- movs r0, 0x7F
- ldrb r2, [r4, 0x1A]
- ands r0, r2
- strb r0, [r4, 0x1A]
- b _081DEE9C
- .pool
-_081DEE68:
- movs r0, 0xF
- mov r1, r8
- ands r1, r0
- mov r8, r1
- ldrb r2, [r4, 0x9]
- lsls r0, r2, 4
- add r0, r8
- ldr r1, [sp, 0xC]
- strb r0, [r1]
- movs r2, 0x80
- ldrb r0, [r4, 0x1A]
- orrs r0, r2
- ldr r1, [sp, 0x14]
- strb r0, [r1]
- cmp r6, 0x1
- bne _081DEE9C
- ldr r0, [sp, 0x8]
- ldrb r1, [r0]
- movs r0, 0x8
- ands r0, r1
- cmp r0, 0
- bne _081DEE9C
- ldrb r0, [r4, 0x1A]
- orrs r0, r2
- ldr r1, [sp, 0x14]
- strb r0, [r1]
-_081DEE9C:
- movs r0, 0
- strb r0, [r4, 0x1D]
-_081DEEA0:
- mov r6, r10
- mov r4, r9
- cmp r6, 0x4
- bgt _081DEEAA
- b _081DEAA0
-_081DEEAA:
- add sp, 0x1C
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end CgbSound
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/asm/macros.inc b/asm/macros.inc
index 324a8de02..e6813d319 100644
--- a/asm/macros.inc
+++ b/asm/macros.inc
@@ -4,6 +4,7 @@
.include "asm/macros/pokemon_data.inc"
.include "asm/macros/ec.inc"
.include "asm/macros/map.inc"
+ .include "asm/macros/m4a.inc"
.macro region_map_location x, y, width, height, name
.byte \x
diff --git a/asm/main_menu.s b/asm/main_menu.s
index b170db136..d7bf1e406 100644
--- a/asm/main_menu.s
+++ b/asm/main_menu.s
@@ -1005,7 +1005,7 @@ _0800CB64: .4byte gPlttBufferUnfaded
_0800CB68: .4byte gPlttBufferFaded
_0800CB6C: .4byte gUnknown_2031DE0
_0800CB70:
- ldr r0, _0800CB8C @ =sub_81422AC
+ ldr r0, _0800CB8C @ =c2_mystery_gift
bl SetMainCallback2
bl sub_812B478
bl FreeAllWindowBuffers
@@ -1017,7 +1017,7 @@ _0800CB84:
pop {r0}
bx r0
.align 2, 0
-_0800CB8C: .4byte sub_81422AC
+_0800CB8C: .4byte c2_mystery_gift
thumb_func_end sub_800CA94
thumb_func_start sub_800CB90
@@ -1141,7 +1141,7 @@ sub_800CC68: @ 800CC68
ands r0, r1
cmp r0, 0
bne _0800CC86
- ldr r0, _0800CC90 @ =sub_8078914
+ ldr r0, _0800CC90 @ =CB2_InitTitleScreen
bl SetMainCallback2
adds r0, r4, 0
bl DestroyTask
@@ -1151,7 +1151,7 @@ _0800CC86:
bx r0
.align 2, 0
_0800CC8C: .4byte gPaletteFade
-_0800CC90: .4byte sub_8078914
+_0800CC90: .4byte CB2_InitTitleScreen
thumb_func_end sub_800CC68
thumb_func_start sub_800CC94
diff --git a/asm/map_name_popup.s b/asm/map_name_popup.s
index b7e20c4bf..8df50601a 100644
--- a/asm/map_name_popup.s
+++ b/asm/map_name_popup.s
@@ -360,7 +360,7 @@ _080983C6:
adds r0, r4, 0
adds r1, r6, 0
movs r2, 0xD
- bl sub_8150048
+ bl DrawTextBorderOuter
adds r0, r4, 0
bl PutWindowTilemap
adds r0, r5, 0
diff --git a/asm/mystery_gift_menu.s b/asm/mystery_gift_menu.s
deleted file mode 100644
index d6be6db09..000000000
--- a/asm/mystery_gift_menu.s
+++ /dev/null
@@ -1,410 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/constants.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start sub_8142078
-sub_8142078: @ 8142078
- push {lr}
- bl ProcessSpriteCopyRequests
- bl LoadOam
- bl TransferPlttBuffer
- pop {r0}
- bx r0
- thumb_func_end sub_8142078
-
- thumb_func_start sub_814208C
-sub_814208C: @ 814208C
- push {lr}
- bl RunTasks
- bl RunTextPrinters
- bl AnimateSprites
- bl BuildOamBuffer
- pop {r0}
- bx r0
- thumb_func_end sub_814208C
-
- thumb_func_start sub_81420A4
-sub_81420A4: @ 81420A4
- push {r4-r7,lr}
- sub sp, 0xC
- adds r7, r0, 0
- ldr r0, _081420C4 @ =gMain
- movs r1, 0x87
- lsls r1, 3
- adds r6, r0, r1
- ldrb r5, [r6]
- cmp r5, 0x1
- bne _081420BA
- b _081421EC
-_081420BA:
- cmp r5, 0x1
- bgt _081420C8
- cmp r5, 0
- beq _081420D6
- b _081422A0
- .align 2, 0
-_081420C4: .4byte gMain
-_081420C8:
- cmp r5, 0x2
- bne _081420CE
- b _08142254
-_081420CE:
- cmp r5, 0x3
- bne _081420D4
- b _08142274
-_081420D4:
- b _081422A0
-_081420D6:
- movs r0, 0
- bl SetVBlankCallback
- bl ResetPaletteFade
- bl ResetSpriteData
- bl FreeAllSpritePalettes
- bl ResetTasks
- bl ScanlineEffect_Stop
- movs r0, 0x1
- bl ResetBgsAndClearDma3BusyFlags
- ldr r1, _081421E0 @ =gUnknown_8466D60
- movs r0, 0
- movs r2, 0x4
- bl InitBgsFromTemplates
- movs r0, 0
- movs r1, 0
- movs r2, 0
- bl ChangeBgX
- movs r0, 0
- movs r1, 0
- movs r2, 0
- bl ChangeBgY
- movs r0, 0x1
- movs r1, 0
- movs r2, 0
- bl ChangeBgX
- movs r0, 0x1
- movs r1, 0
- movs r2, 0
- bl ChangeBgY
- movs r0, 0x2
- movs r1, 0
- movs r2, 0
- bl ChangeBgX
- movs r0, 0x2
- movs r1, 0
- movs r2, 0
- bl ChangeBgY
- movs r0, 0x3
- movs r1, 0
- movs r2, 0
- bl ChangeBgX
- movs r0, 0x3
- movs r1, 0
- movs r2, 0
- bl ChangeBgY
- movs r4, 0x80
- lsls r4, 4
- adds r0, r4, 0
- bl Alloc
- adds r1, r0, 0
- movs r0, 0x3
- bl SetBgTilemapBuffer
- adds r0, r4, 0
- bl Alloc
- adds r1, r0, 0
- movs r0, 0x2
- bl SetBgTilemapBuffer
- adds r0, r4, 0
- bl Alloc
- adds r1, r0, 0
- movs r0, 0x1
- bl SetBgTilemapBuffer
- adds r0, r4, 0
- bl Alloc
- adds r1, r0, 0
- movs r0, 0
- bl SetBgTilemapBuffer
- movs r0, 0
- movs r1, 0xA
- movs r2, 0xE0
- bl sub_814FE40
- movs r0, 0
- movs r1, 0x1
- movs r2, 0xF0
- bl sub_814FDA0
- ldr r1, _081421E4 @ =gUnknown_8466D30
- movs r2, 0x80
- lsls r2, 1
- str r5, [sp]
- movs r0, 0x3
- movs r3, 0
- bl sub_80F696C
- ldr r0, _081421E8 @ =gUnknown_8466D70
- bl InitWindows
- bl DeactivateAllTextPrinters
- movs r1, 0xC0
- lsls r1, 7
- movs r0, 0
- bl ClearGpuRegBits
- movs r0, 0x50
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x52
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x54
- movs r1, 0
- bl SetGpuReg
- b _0814226C
- .align 2, 0
-_081421E0: .4byte gUnknown_8466D60
-_081421E4: .4byte gUnknown_8466D30
-_081421E8: .4byte gUnknown_8466D70
-_081421EC:
- ldr r0, _08142250 @ =gUnknown_8466D10
- movs r1, 0
- movs r2, 0x20
- bl LoadPalette
- movs r0, 0x2
- bl stdpal_get
- movs r1, 0xD0
- movs r2, 0x20
- bl LoadPalette
- movs r4, 0x20
- str r4, [sp]
- str r4, [sp, 0x4]
- movs r5, 0x11
- str r5, [sp, 0x8]
- movs r0, 0
- movs r1, 0
- movs r2, 0
- movs r3, 0
- bl FillBgTilemapBufferRect
- str r4, [sp]
- str r4, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0x1
- movs r1, 0
- movs r2, 0
- movs r3, 0
- bl FillBgTilemapBufferRect
- str r4, [sp]
- str r4, [sp, 0x4]
- str r5, [sp, 0x8]
- movs r0, 0x2
- movs r1, 0
- movs r2, 0
- movs r3, 0
- bl FillBgTilemapBufferRect
- bl sub_8142420
- lsls r0, r7, 24
- lsrs r0, 24
- movs r1, 0
- bl sub_8142344
- b _0814226C
- .align 2, 0
-_08142250: .4byte gUnknown_8466D10
-_08142254:
- movs r0, 0x3
- bl CopyBgTilemapBufferToVram
- movs r0, 0x2
- bl CopyBgTilemapBufferToVram
- movs r0, 0x1
- bl CopyBgTilemapBufferToVram
- movs r0, 0
- bl CopyBgTilemapBufferToVram
-_0814226C:
- ldrb r0, [r6]
- adds r0, 0x1
- strb r0, [r6]
- b _081422A0
-_08142274:
- movs r0, 0
- bl ShowBg
- movs r0, 0x3
- bl ShowBg
- ldr r0, _08142298 @ =0x00000149
- bl PlayBGM
- ldr r0, _0814229C @ =sub_8142078
- bl SetVBlankCallback
- movs r0, 0xC5
- bl EnableInterrupts
- movs r0, 0x1
- b _081422A2
- .align 2, 0
-_08142298: .4byte 0x00000149
-_0814229C: .4byte sub_8142078
-_081422A0:
- movs r0, 0
-_081422A2:
- add sp, 0xC
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end sub_81420A4
-
- thumb_func_start sub_81422AC
-sub_81422AC: @ 81422AC
- push {lr}
- movs r0, 0
- bl sub_81420A4
- cmp r0, 0
- beq _081422C8
- ldr r0, _081422CC @ =sub_814208C
- bl SetMainCallback2
- ldr r1, _081422D0 @ =gUnknown_203F3B8
- movs r0, 0
- strb r0, [r1]
- bl task_add_00_mystery_gift
-_081422C8:
- pop {r0}
- bx r0
- .align 2, 0
-_081422CC: .4byte sub_814208C
-_081422D0: .4byte gUnknown_203F3B8
- thumb_func_end sub_81422AC
-
- thumb_func_start sub_81422D4
-sub_81422D4: @ 81422D4
- push {lr}
- movs r0, 0x1
- bl sub_81420A4
- cmp r0, 0
- beq _081422F0
- ldr r0, _081422F4 @ =sub_814208C
- bl SetMainCallback2
- ldr r1, _081422F8 @ =gUnknown_203F3B8
- movs r0, 0x1
- strb r0, [r1]
- bl sub_81438A0
-_081422F0:
- pop {r0}
- bx r0
- .align 2, 0
-_081422F4: .4byte sub_814208C
-_081422F8: .4byte gUnknown_203F3B8
- thumb_func_end sub_81422D4
-
- thumb_func_start sub_81422FC
-sub_81422FC: @ 81422FC
- push {lr}
- ldr r1, _0814233C @ =gUnknown_203F3B8
- movs r0, 0
- strb r0, [r1]
- bl FreeAllWindowBuffers
- movs r0, 0
- bl GetBgTilemapBuffer
- bl Free
- movs r0, 0x1
- bl GetBgTilemapBuffer
- bl Free
- movs r0, 0x2
- bl GetBgTilemapBuffer
- bl Free
- movs r0, 0x3
- bl GetBgTilemapBuffer
- bl Free
- ldr r0, _08142340 @ =sub_8078914
- bl SetMainCallback2
- pop {r0}
- bx r0
- .align 2, 0
-_0814233C: .4byte gUnknown_203F3B8
-_08142340: .4byte sub_8078914
- thumb_func_end sub_81422FC
-
- thumb_func_start sub_8142344
-sub_8142344: @ 8142344
- push {r4-r6,lr}
- sub sp, 0x14
- adds r4, r1, 0
- lsls r0, 24
- lsrs r5, r0, 24
- movs r0, 0
- movs r1, 0
- bl FillWindowPixelBuffer
- cmp r5, 0
- bne _081423B4
- ldr r6, _081423A4 @ =gUnknown_841EDCA
- cmp r4, 0x1
- bne _08142362
- ldr r6, _081423A8 @ =gUnknown_8415F51
-_08142362:
- str r5, [sp]
- str r5, [sp, 0x4]
- ldr r4, _081423AC @ =gUnknown_8466EE8
- str r4, [sp, 0x8]
- str r5, [sp, 0xC]
- ldr r0, _081423B0 @ =gUnknown_841EDBD
- str r0, [sp, 0x10]
- movs r0, 0
- movs r1, 0x2
- movs r2, 0x2
- movs r3, 0x2
- bl AddTextPrinterParametrized2
- movs r0, 0
- adds r1, r6, 0
- movs r2, 0
- bl GetStringWidth
- movs r2, 0xDE
- subs r2, r0
- lsls r2, 24
- lsrs r2, 24
- str r5, [sp]
- str r5, [sp, 0x4]
- str r4, [sp, 0x8]
- str r5, [sp, 0xC]
- str r6, [sp, 0x10]
- movs r0, 0
- movs r1, 0
- movs r3, 0x2
- bl AddTextPrinterParametrized2
- b _081423E8
- .align 2, 0
-_081423A4: .4byte gUnknown_841EDCA
-_081423A8: .4byte gUnknown_8415F51
-_081423AC: .4byte gUnknown_8466EE8
-_081423B0: .4byte gUnknown_841EDBD
-_081423B4:
- movs r4, 0
- str r4, [sp]
- str r4, [sp, 0x4]
- ldr r5, _08142400 @ =gUnknown_8466EE8
- str r5, [sp, 0x8]
- str r4, [sp, 0xC]
- ldr r0, _08142404 @ =gUnknown_841DE50
- str r0, [sp, 0x10]
- movs r0, 0
- movs r1, 0x2
- movs r2, 0x2
- movs r3, 0x2
- bl AddTextPrinterParametrized2
- str r4, [sp]
- str r4, [sp, 0x4]
- str r5, [sp, 0x8]
- str r4, [sp, 0xC]
- ldr r0, _08142408 @ =gUnknown_841DE51
- str r0, [sp, 0x10]
- movs r0, 0
- movs r1, 0
- movs r2, 0x78
- movs r3, 0x2
- bl AddTextPrinterParametrized2
-_081423E8:
- movs r0, 0
- movs r1, 0x2
- bl CopyWindowToVram
- movs r0, 0
- bl PutWindowTilemap
- add sp, 0x14
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_08142400: .4byte gUnknown_8466EE8
-_08142404: .4byte gUnknown_841DE50
-_08142408: .4byte gUnknown_841DE51
- thumb_func_end sub_8142344
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/asm/overworld.s b/asm/overworld.s
index b7de72a1e..b041abc0a 100644
--- a/asm/overworld.s
+++ b/asm/overworld.s
@@ -2411,7 +2411,7 @@ _08055DDC:
bgt _08055E24
ldr r0, _08055E1C @ =gMPlayInfo_BGM
ldr r1, [r0]
- ldr r0, _08055E20 @ =gUnknown_86E6B0C
+ ldr r0, _08055E20 @ =gSong_86E6B0C
cmp r1, r0
bne _08055E24
movs r0, 0x4
@@ -2421,7 +2421,7 @@ _08055DDC:
_08055E14: .4byte gSaveBlock1Ptr
_08055E18: .4byte 0x00004f01
_08055E1C: .4byte gMPlayInfo_BGM
-_08055E20: .4byte gUnknown_86E6B0C
+_08055E20: .4byte gSong_86E6B0C
_08055E24:
bl sub_8055D8C
lsls r0, 16
@@ -3890,7 +3890,7 @@ sub_80569BC: @ 80569BC
lsrs r0, 24
cmp r0, 0x1
bne _080569CE
- bl sub_80098B8
+ bl CloseLink
_080569CE:
ldr r0, _080569E4 @ =gWirelessCommType
ldrb r0, [r0]
diff --git a/asm/pokedex_screen.s b/asm/pokedex_screen.s
index 68b30e43b..1d0be1b23 100644
--- a/asm/pokedex_screen.s
+++ b/asm/pokedex_screen.s
@@ -1545,7 +1545,7 @@ sub_810317C: @ 810317C
movs r0, 0x1
movs r1, 0xFF
bl FillWindowPixelBuffer
- ldr r0, _08103234 @ =gUnknown_8415F51
+ ldr r0, _08103234 @ =gText_PickOKExit
bl sub_8104C2C
movs r0, 0
movs r1, 0x2
@@ -1562,7 +1562,7 @@ _08103224: .4byte gUnknown_845216C
_08103228: .4byte gUnknown_203ACF0
_0810322C: .4byte gUnknown_8452174
_08103230: .4byte gUnknown_8415F3D
-_08103234: .4byte gUnknown_8415F51
+_08103234: .4byte gText_PickOKExit
thumb_func_end sub_810317C
thumb_func_start sub_8103238
@@ -1874,7 +1874,7 @@ sub_810345C: @ 810345C
movs r0, 0x1
movs r1, 0xFF
bl FillWindowPixelBuffer
- ldr r0, _08103514 @ =gUnknown_8415F51
+ ldr r0, _08103514 @ =gText_PickOKExit
bl sub_8104C2C
movs r0, 0
movs r1, 0x2
@@ -1891,7 +1891,7 @@ _08103504: .4byte gUnknown_845216C
_08103508: .4byte gUnknown_203ACF0
_0810350C: .4byte gUnknown_8452174
_08103510: .4byte gUnknown_8415F4A
-_08103514: .4byte gUnknown_8415F51
+_08103514: .4byte gText_PickOKExit
thumb_func_end sub_810345C
thumb_func_start sub_8103518
diff --git a/asm/pokemon_special_anim.s b/asm/pokemon_special_anim.s
index 33f64b00b..20ed51bda 100644
--- a/asm/pokemon_special_anim.s
+++ b/asm/pokemon_special_anim.s
@@ -1688,7 +1688,7 @@ sub_811D2A8: @ 811D2A8
movs r0, 0
movs r1, 0x1
movs r2, 0xE
- bl sub_8150048
+ bl DrawTextBorderOuter
movs r0, 0
movs r1, 0x3
bl CopyWindowToVram
@@ -2285,7 +2285,7 @@ sub_811D764: @ 811D764
movs r0, 0x1
movs r1, 0x1
movs r2, 0xE
- bl sub_8150048
+ bl DrawTextBorderOuter
movs r0, 0x2
str r0, [sp]
movs r0, 0x3
diff --git a/asm/pokemon_storage_system.s b/asm/pokemon_storage_system.s
index 826e2f9e4..8b8407ce0 100644
--- a/asm/pokemon_storage_system.s
+++ b/asm/pokemon_storage_system.s
@@ -8311,7 +8311,7 @@ _0808FC7C:
movs r0, 0x1
movs r1, 0x2
movs r2, 0xD
- bl sub_8150048
+ bl DrawTextBorderOuter
movs r0, 0x1
bl PutWindowTilemap
movs r0, 0x1
diff --git a/asm/seagallop.s b/asm/seagallop.s
deleted file mode 100644
index c4bf6cccf..000000000
--- a/asm/seagallop.s
+++ /dev/null
@@ -1,795 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/constants.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start sub_8146E78
-sub_8146E78: @ 8146E78
- push {lr}
- movs r0, 0
- bl SetVBlankCallback
- bl sub_812B478
- ldr r0, _08146E90 @ =sub_8146E94
- bl SetMainCallback2
- pop {r0}
- bx r0
- .align 2, 0
-_08146E90: .4byte sub_8146E94
- thumb_func_end sub_8146E78
-
- thumb_func_start sub_8146E94
-sub_8146E94: @ 8146E94
- push {r4,lr}
- sub sp, 0x8
- ldr r0, _08146EB4 @ =gMain
- movs r1, 0x87
- lsls r1, 3
- adds r0, r1
- ldrb r0, [r0]
- cmp r0, 0x7
- bls _08146EA8
- b _0814703C
-_08146EA8:
- lsls r0, 2
- ldr r1, _08146EB8 @ =_08146EBC
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_08146EB4: .4byte gMain
-_08146EB8: .4byte _08146EBC
- .align 2, 0
-_08146EBC:
- .4byte _08146EDC
- .4byte _08146EE8
- .4byte _08146EEE
- .4byte _08146F20
- .4byte _08146F8C
- .4byte _08146FAC
- .4byte _08146FBE
- .4byte _08146FE4
-_08146EDC:
- movs r0, 0
- bl SetVBlankCallback
- bl sub_81471C4
- b _08146FCE
-_08146EE8:
- bl sub_81472FC
- b _08146FCE
-_08146EEE:
- ldr r4, _08146F18 @ =gUnknown_203F3D0
- movs r0, 0x80
- lsls r0, 4
- bl AllocZeroed
- str r0, [r4]
- movs r0, 0
- bl ResetBgsAndClearDma3BusyFlags
- ldr r1, _08146F1C @ =gUnknown_846AEF8
- movs r0, 0
- movs r2, 0x1
- bl InitBgsFromTemplates
- ldr r1, [r4]
- movs r0, 0x3
- bl SetBgTilemapBuffer
- bl sub_814732C
- b _08146FCE
- .align 2, 0
-_08146F18: .4byte gUnknown_203F3D0
-_08146F1C: .4byte gUnknown_846AEF8
-_08146F20:
- ldr r1, _08146F50 @ =gUnknown_8468C98
- movs r2, 0xA4
- lsls r2, 3
- movs r0, 0x3
- movs r3, 0
- bl LoadBgTiles
- bl sub_81474CC
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _08146F58
- ldr r1, _08146F54 @ =gUnknown_84699D8
- movs r0, 0x20
- str r0, [sp]
- str r0, [sp, 0x4]
- movs r0, 0x3
- movs r2, 0
- movs r3, 0
- bl CopyToBgTilemapBufferRect
- b _08146F6A
- .align 2, 0
-_08146F50: .4byte gUnknown_8468C98
-_08146F54: .4byte gUnknown_84699D8
-_08146F58:
- ldr r1, _08146F84 @ =gUnknown_84691D8
- movs r0, 0x20
- str r0, [sp]
- str r0, [sp, 0x4]
- movs r0, 0x3
- movs r2, 0
- movs r3, 0
- bl CopyToBgTilemapBufferRect
-_08146F6A:
- ldr r0, _08146F88 @ =gUnknown_84691B8
- movs r1, 0x40
- movs r2, 0x20
- bl LoadPalette
- movs r0, 0x2
- bl stdpal_get
- movs r1, 0xF0
- movs r2, 0x20
- bl LoadPalette
- b _08146FCE
- .align 2, 0
-_08146F84: .4byte gUnknown_84691D8
-_08146F88: .4byte gUnknown_84691B8
-_08146F8C:
- bl IsDma3ManagerBusyWithBgCopy
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- beq _0814703C
- movs r0, 0
- bl ShowBg
- movs r0, 0x3
- bl ShowBg
- movs r0, 0x3
- bl CopyBgTilemapBufferToVram
- b _08146FCE
-_08146FAC:
- bl sub_8147384
- movs r0, 0x1
- negs r0, r0
- movs r1, 0x10
- movs r2, 0
- bl BlendPalettes
- b _08146FCE
-_08146FBE:
- movs r0, 0x1
- negs r0, r0
- movs r1, 0
- str r1, [sp]
- movs r2, 0x10
- movs r3, 0
- bl BeginNormalPaletteFade
-_08146FCE:
- ldr r1, _08146FE0 @ =gMain
- movs r0, 0x87
- lsls r0, 3
- adds r1, r0
- ldrb r0, [r1]
- adds r0, 0x1
- strb r0, [r1]
- b _0814703C
- .align 2, 0
-_08146FE0: .4byte gMain
-_08146FE4:
- bl sub_814731C
- ldr r0, _08147044 @ =sub_8147058
- bl SetVBlankCallback
- movs r0, 0x13
- bl PlaySE
- bl sub_81473C4
- movs r1, 0x80
- lsls r1, 6
- movs r0, 0
- bl SetGpuRegBits
- movs r0, 0x48
- movs r1, 0x3F
- bl SetGpuReg
- movs r0, 0x4A
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x40
- movs r1, 0xF0
- bl SetGpuReg
- ldr r1, _08147048 @ =0x00001888
- movs r0, 0x44
- bl SetGpuReg
- ldr r0, _0814704C @ =sub_8147084
- movs r1, 0x8
- bl CreateTask
- ldr r0, _08147050 @ =sub_814706C
- bl SetMainCallback2
- ldr r0, _08147054 @ =gMain
- movs r1, 0x87
- lsls r1, 3
- adds r0, r1
- movs r1, 0
- strb r1, [r0]
-_0814703C:
- add sp, 0x8
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08147044: .4byte sub_8147058
-_08147048: .4byte 0x00001888
-_0814704C: .4byte sub_8147084
-_08147050: .4byte sub_814706C
-_08147054: .4byte gMain
- thumb_func_end sub_8146E94
-
- thumb_func_start sub_8147058
-sub_8147058: @ 8147058
- push {lr}
- bl LoadOam
- bl ProcessSpriteCopyRequests
- bl TransferPlttBuffer
- pop {r0}
- bx r0
- thumb_func_end sub_8147058
-
- thumb_func_start sub_814706C
-sub_814706C: @ 814706C
- push {lr}
- bl RunTasks
- bl AnimateSprites
- bl BuildOamBuffer
- bl UpdatePaletteFade
- pop {r0}
- bx r0
- thumb_func_end sub_814706C
-
- thumb_func_start sub_8147084
-sub_8147084: @ 8147084
- lsls r0, 24
- lsrs r0, 24
- ldr r2, _08147098 @ =gTasks
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r1, r2
- ldr r0, _0814709C @ =sub_81470CC
- str r0, [r1]
- bx lr
- .align 2, 0
-_08147098: .4byte gTasks
-_0814709C: .4byte sub_81470CC
- thumb_func_end sub_8147084
-
- thumb_func_start sub_81470A0
-sub_81470A0: @ 81470A0
- push {lr}
- bl sub_81474CC
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _081470BC
- movs r1, 0xC0
- lsls r1, 3
- movs r0, 0x3
- movs r2, 0x1
- bl ChangeBgX
- b _081470C8
-_081470BC:
- movs r1, 0xC0
- lsls r1, 3
- movs r0, 0x3
- movs r2, 0x2
- bl ChangeBgX
-_081470C8:
- pop {r0}
- bx r0
- thumb_func_end sub_81470A0
-
- thumb_func_start sub_81470CC
-sub_81470CC: @ 81470CC
- push {r4,lr}
- lsls r0, 24
- lsrs r0, 24
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- ldr r0, _08147100 @ =gTasks
- adds r4, r1, r0
- bl sub_81470A0
- ldrh r0, [r4, 0xA]
- adds r0, 0x1
- strh r0, [r4, 0xA]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x8C
- bne _081470FA
- bl Overworld_FadeOutMapMusic
- bl sub_807DC18
- ldr r0, _08147104 @ =sub_8147108
- str r0, [r4]
-_081470FA:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08147100: .4byte gTasks
-_08147104: .4byte sub_8147108
- thumb_func_end sub_81470CC
-
- thumb_func_start sub_8147108
-sub_8147108: @ 8147108
- push {r4,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- bl sub_81470A0
- bl sub_8055FC4
- lsls r0, 24
- cmp r0, 0
- beq _08147136
- ldr r0, _0814713C @ =gPaletteFade
- ldrb r1, [r0, 0x7]
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- bne _08147136
- bl sub_8147140
- bl sub_812B484
- adds r0, r4, 0
- bl DestroyTask
-_08147136:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0814713C: .4byte gPaletteFade
- thumb_func_end sub_8147108
-
- thumb_func_start sub_8147140
-sub_8147140: @ 8147140
- push {r4,lr}
- sub sp, 0x4
- ldr r1, _081471AC @ =gSpecialVar_0x8006
- ldrh r0, [r1]
- cmp r0, 0xA
- bls _08147150
- movs r0, 0
- strh r0, [r1]
-_08147150:
- ldrh r4, [r1]
- lsls r4, 2
- ldr r0, _081471B0 @ =gUnknown_846AEFC
- adds r4, r0
- movs r0, 0
- ldrsb r0, [r4, r0]
- movs r1, 0x1
- ldrsb r1, [r4, r1]
- movs r2, 0x1
- negs r2, r2
- movs r3, 0x2
- ldrsb r3, [r4, r3]
- ldrb r4, [r4, 0x3]
- lsls r4, 24
- asrs r4, 24
- str r4, [sp]
- bl Overworld_SetWarpDestination
- bl play_some_sound
- movs r0, 0x9
- bl PlaySE
- ldr r1, _081471B4 @ =gUnknown_3005020
- ldr r0, _081471B8 @ =sub_807DF64
- str r0, [r1]
- bl warp_in
- ldr r0, _081471BC @ =sub_805671C
- bl SetMainCallback2
- bl ResetInitialPlayerAvatarState
- bl sub_81473A0
- ldr r0, _081471C0 @ =gUnknown_203F3D0
- ldr r0, [r0]
- bl Free
- bl FreeAllWindowBuffers
- add sp, 0x4
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_081471AC: .4byte gSpecialVar_0x8006
-_081471B0: .4byte gUnknown_846AEFC
-_081471B4: .4byte gUnknown_3005020
-_081471B8: .4byte sub_807DF64
-_081471BC: .4byte sub_805671C
-_081471C0: .4byte gUnknown_203F3D0
- thumb_func_end sub_8147140
-
- thumb_func_start sub_81471C4
-sub_81471C4: @ 81471C4
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- sub sp, 0x8
- movs r3, 0xC0
- lsls r3, 19
- movs r4, 0xC0
- lsls r4, 9
- add r0, sp, 0x4
- mov r8, r0
- mov r2, sp
- movs r6, 0
- ldr r1, _081472F4 @ =0x040000d4
- movs r5, 0x80
- lsls r5, 5
- ldr r7, _081472F8 @ =0x81000800
- movs r0, 0x81
- lsls r0, 24
- mov r12, r0
-_081471EA:
- strh r6, [r2]
- mov r0, sp
- str r0, [r1]
- str r3, [r1, 0x4]
- str r7, [r1, 0x8]
- ldr r0, [r1, 0x8]
- adds r3, r5
- subs r4, r5
- cmp r4, r5
- bhi _081471EA
- strh r6, [r2]
- mov r2, sp
- str r2, [r1]
- str r3, [r1, 0x4]
- lsrs r0, r4, 1
- mov r2, r12
- orrs r0, r2
- str r0, [r1, 0x8]
- ldr r0, [r1, 0x8]
- movs r0, 0xE0
- lsls r0, 19
- movs r3, 0x80
- lsls r3, 3
- movs r4, 0
- str r4, [sp, 0x4]
- ldr r2, _081472F4 @ =0x040000d4
- mov r1, r8
- str r1, [r2]
- str r0, [r2, 0x4]
- lsrs r0, r3, 2
- movs r1, 0x85
- lsls r1, 24
- orrs r0, r1
- str r0, [r2, 0x8]
- ldr r0, [r2, 0x8]
- movs r1, 0xA0
- lsls r1, 19
- mov r0, sp
- strh r4, [r0]
- str r0, [r2]
- str r1, [r2, 0x4]
- lsrs r3, 1
- movs r0, 0x81
- lsls r0, 24
- orrs r3, r0
- str r3, [r2, 0x8]
- ldr r0, [r2, 0x8]
- movs r0, 0
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x8
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x10
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x12
- movs r1, 0
- bl SetGpuReg
- movs r0, 0xA
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x14
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x16
- movs r1, 0
- bl SetGpuReg
- movs r0, 0xC
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x18
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x1A
- movs r1, 0
- bl SetGpuReg
- movs r0, 0xE
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x1C
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x1E
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x40
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x44
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x48
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x4A
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x50
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x52
- movs r1, 0
- bl SetGpuReg
- movs r0, 0x54
- movs r1, 0
- bl SetGpuReg
- add sp, 0x8
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_081472F4: .4byte 0x040000d4
-_081472F8: .4byte 0x81000800
- thumb_func_end sub_81471C4
-
- thumb_func_start sub_81472FC
-sub_81472FC: @ 81472FC
- push {lr}
- bl ScanlineEffect_Stop
- bl ResetTasks
- bl ResetSpriteData
- bl dp13_810BB8C
- bl ResetPaletteFade
- bl FreeAllSpritePalettes
- pop {r0}
- bx r0
- thumb_func_end sub_81472FC
-
- thumb_func_start sub_814731C
-sub_814731C: @ 814731C
- push {lr}
- movs r1, 0xCA
- lsls r1, 5
- movs r0, 0
- bl SetGpuReg
- pop {r0}
- bx r0
- thumb_func_end sub_814731C
-
- thumb_func_start sub_814732C
-sub_814732C: @ 814732C
- push {lr}
- movs r0, 0
- movs r1, 0
- movs r2, 0
- bl ChangeBgX
- movs r0, 0
- movs r1, 0
- movs r2, 0
- bl ChangeBgY
- movs r0, 0x1
- movs r1, 0
- movs r2, 0
- bl ChangeBgX
- movs r0, 0x1
- movs r1, 0
- movs r2, 0
- bl ChangeBgY
- movs r0, 0x2
- movs r1, 0
- movs r2, 0
- bl ChangeBgX
- movs r0, 0x2
- movs r1, 0
- movs r2, 0
- bl ChangeBgY
- movs r0, 0x3
- movs r1, 0
- movs r2, 0
- bl ChangeBgX
- movs r0, 0x3
- movs r1, 0
- movs r2, 0
- bl ChangeBgY
- pop {r0}
- bx r0
- thumb_func_end sub_814732C
-
- thumb_func_start sub_8147384
-sub_8147384: @ 8147384
- push {lr}
- ldr r0, _08147398 @ =gUnknown_846AF78
- bl LoadSpriteSheets
- ldr r0, _0814739C @ =gUnknown_846AF90
- bl LoadSpritePalettes
- pop {r0}
- bx r0
- .align 2, 0
-_08147398: .4byte gUnknown_846AF78
-_0814739C: .4byte gUnknown_846AF90
- thumb_func_end sub_8147384
-
- thumb_func_start sub_81473A0
-sub_81473A0: @ 81473A0
- push {r4,lr}
- ldr r4, _081473C0 @ =0x00000bb8
- adds r0, r4, 0
- bl FreeSpriteTilesByTag
- movs r0, 0xFA
- lsls r0, 4
- bl FreeSpriteTilesByTag
- adds r0, r4, 0
- bl FreeSpritePaletteByTag
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_081473C0: .4byte 0x00000bb8
- thumb_func_end sub_81473A0
-
- thumb_func_start sub_81473C4
-sub_81473C4: @ 81473C4
- push {r4,lr}
- ldr r0, _081473FC @ =gUnknown_846AF60
- movs r1, 0
- movs r2, 0x5C
- movs r3, 0
- bl CreateSprite
- lsls r0, 24
- lsrs r0, 24
- ldr r2, _08147400 @ =gSprites
- lsls r1, r0, 4
- adds r1, r0
- lsls r1, 2
- adds r4, r1, r2
- movs r0, 0x30
- strh r0, [r4, 0x2E]
- bl sub_81474CC
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _08147404
- adds r0, r4, 0
- movs r1, 0x1
- bl StartSpriteAnim
- b _08147410
- .align 2, 0
-_081473FC: .4byte gUnknown_846AF60
-_08147400: .4byte gSprites
-_08147404:
- movs r0, 0xF0
- strh r0, [r4, 0x20]
- movs r1, 0x2E
- ldrsh r0, [r4, r1]
- negs r0, r0
- strh r0, [r4, 0x2E]
-_08147410:
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_81473C4
-
- thumb_func_start sub_8147418
-sub_8147418: @ 8147418
- push {r4,r5,lr}
- adds r4, r0, 0
- ldrh r0, [r4, 0x2E]
- ldrh r1, [r4, 0x30]
- adds r0, r1
- strh r0, [r4, 0x30]
- lsls r0, 16
- asrs r5, r0, 20
- strh r5, [r4, 0x24]
- movs r1, 0x32
- ldrsh r0, [r4, r1]
- movs r1, 0x5
- bl __modsi3
- lsls r0, 16
- cmp r0, 0
- bne _08147446
- ldrh r0, [r4, 0x20]
- adds r0, r5
- lsls r0, 16
- asrs r0, 16
- bl sub_814746C
-_08147446:
- ldrh r0, [r4, 0x32]
- adds r0, 0x1
- strh r0, [r4, 0x32]
- movs r1, 0x96
- lsls r1, 1
- adds r0, r1, 0
- ldrh r1, [r4, 0x24]
- adds r0, r1
- lsls r0, 16
- movs r1, 0x96
- lsls r1, 18
- cmp r0, r1
- bls _08147466
- adds r0, r4, 0
- bl DestroySprite
-_08147466:
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end sub_8147418
-
- thumb_func_start sub_814746C
-sub_814746C: @ 814746C
- push {r4,lr}
- adds r1, r0, 0
- ldr r0, _081474A8 @ =gUnknown_846AFD0
- lsls r1, 16
- asrs r1, 16
- movs r2, 0x5C
- movs r3, 0x8
- bl CreateSprite
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x40
- beq _081474A2
- bl sub_81474CC
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _081474A2
- lsls r0, r4, 4
- adds r0, r4
- lsls r0, 2
- ldr r1, _081474AC @ =gSprites
- adds r0, r1
- movs r1, 0x1
- bl StartSpriteAnim
-_081474A2:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_081474A8: .4byte gUnknown_846AFD0
-_081474AC: .4byte gSprites
- thumb_func_end sub_814746C
-
- thumb_func_start sub_81474B0
-sub_81474B0: @ 81474B0
- push {lr}
- adds r2, r0, 0
- adds r0, 0x3F
- ldrb r1, [r0]
- movs r0, 0x10
- ands r0, r1
- cmp r0, 0
- beq _081474C6
- adds r0, r2, 0
- bl DestroySprite
-_081474C6:
- pop {r0}
- bx r0
- thumb_func_end sub_81474B0
-
- thumb_func_start sub_81474CC
-sub_81474CC: @ 81474CC
- push {lr}
- ldr r2, _081474EC @ =gSpecialVar_0x8004
- ldrh r0, [r2]
- cmp r0, 0xA
- bhi _081474F8
- ldr r1, _081474F0 @ =gUnknown_846AF28
- lsls r0, 1
- adds r0, r1
- ldrh r0, [r0]
- ldr r1, _081474F4 @ =gSpecialVar_0x8006
- ldrh r1, [r1]
- asrs r0, r1
- movs r1, 0x1
- ands r0, r1
- b _081474FA
- .align 2, 0
-_081474EC: .4byte gSpecialVar_0x8004
-_081474F0: .4byte gUnknown_846AF28
-_081474F4: .4byte gSpecialVar_0x8006
-_081474F8:
- movs r0, 0x1
-_081474FA:
- pop {r1}
- bx r1
- thumb_func_end sub_81474CC
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/asm/slot_machine.s b/asm/slot_machine.s
index 48cb65638..8d4b0cd9e 100644
--- a/asm/slot_machine.s
+++ b/asm/slot_machine.s
@@ -4215,7 +4215,7 @@ sub_81417E4: @ 81417E4
movs r0, 0
movs r1, 0x1
movs r2, 0xF
- bl sub_8150048
+ bl DrawTextBorderOuter
movs r1, 0x2
str r1, [sp]
movs r0, 0xFF
diff --git a/asm/start_menu.s b/asm/start_menu.s
index 124f64792..d8178a37a 100644
--- a/asm/start_menu.s
+++ b/asm/start_menu.s
@@ -1912,7 +1912,7 @@ _0806FC14:
movs r0, 0
movs r1, 0x8
movs r2, 0xF
- bl sub_8150048
+ bl DrawTextBorderOuter
movs r0, 0
bl PutWindowTilemap
movs r0, 0
diff --git a/asm/text_window.s b/asm/text_window.s
index df5c80739..02a6efcfe 100644
--- a/asm/text_window.s
+++ b/asm/text_window.s
@@ -440,8 +440,8 @@ sub_815001C: @ 815001C
_08150044: .4byte gSaveBlock2Ptr
thumb_func_end sub_815001C
- thumb_func_start sub_8150048
-sub_8150048: @ 8150048
+ thumb_func_start DrawTextBorderOuter
+DrawTextBorderOuter: @ 8150048
push {r4-r7,lr}
mov r7, r10
mov r6, r9
@@ -625,7 +625,7 @@ sub_8150048: @ 8150048
pop {r4-r7}
pop {r0}
bx r0
- thumb_func_end sub_8150048
+ thumb_func_end DrawTextBorderOuter
thumb_func_start sub_81501D0
sub_81501D0: @ 81501D0
diff --git a/asm/title_screen.s b/asm/title_screen.s
index c8261c1d3..a60bc959c 100644
--- a/asm/title_screen.s
+++ b/asm/title_screen.s
@@ -5,8 +5,8 @@
.text
- thumb_func_start sub_8078914
-sub_8078914: @ 8078914
+ thumb_func_start CB2_InitTitleScreen
+CB2_InitTitleScreen: @ 8078914
push {r4-r6,lr}
sub sp, 0xC
ldr r0, _08078930 @ =gMain
@@ -230,7 +230,7 @@ _08078B26:
bx r0
.align 2, 0
_08078B30: .4byte gMain
- thumb_func_end sub_8078914
+ thumb_func_end CB2_InitTitleScreen
thumb_func_start sub_8078B34
sub_8078B34: @ 8078B34
diff --git a/asm/trade.s b/asm/trade.s
index ea2221aa1..70ca6a736 100644
--- a/asm/trade.s
+++ b/asm/trade.s
@@ -422,7 +422,7 @@ _0804C9B0:
ldrb r0, [r0]
cmp r0, 0
beq _0804C9E8
- bl sub_80FA4F8
+ bl IsNoOneConnected
lsls r0, 24
cmp r0, 0
bne _0804C9C4
@@ -1832,7 +1832,7 @@ sub_804D5A4: @ 804D5A4
ldrb r0, [r0]
cmp r0, 0
beq _0804D5FC
- bl sub_80FA4F8
+ bl IsNoOneConnected
lsls r0, 24
cmp r0, 0
beq _0804D620
@@ -1845,7 +1845,7 @@ sub_804D5A4: @ 804D5A4
bl Free
movs r0, 0
str r0, [r5]
- bl sub_80FCE44
+ bl DestroyWirelessStatusIndicatorSprite
ldr r0, _0804D5F8 @ =sub_8050138
bl SetMainCallback2
b _0804D620
@@ -3369,7 +3369,7 @@ _0804E208:
movs r0, 0x1
movs r1, 0x1
movs r2, 0xE
- bl sub_8150048
+ bl DrawTextBorderOuter
movs r0, 0x1
movs r1, 0x11
bl FillWindowPixelBuffer
@@ -4296,7 +4296,7 @@ sub_804E944: @ 804E944
ldr r0, [r0]
bl Free
bl FreeAllWindowBuffers
- bl sub_80FCE44
+ bl DestroyWirelessStatusIndicatorSprite
ldr r0, _0804E984 @ =c2_8056854
bl SetMainCallback2
b _0804E9AA
@@ -5876,7 +5876,7 @@ sub_804F5BC: @ 804F5BC
movs r0, 0
movs r1, 0x14
movs r2, 0xC
- bl sub_8150048
+ bl DrawTextBorderOuter
movs r0, 0
bl PutWindowTilemap
movs r0, 0
@@ -7178,7 +7178,7 @@ _0804FF7A:
lsls r0, 1
cmp r1, r0
bls _0804FFAC
- bl sub_80098B8
+ bl CloseLink
ldr r0, _0804FFC0 @ =c2_800ACD4
bl SetMainCallback2
ldr r1, [r4]
@@ -7432,7 +7432,7 @@ _08050194:
ldr r2, _08050230 @ =0x00001144
adds r0, r2, 0
strh r0, [r1]
- bl sub_80098B8
+ bl CloseLink
_080501A8:
ldr r4, _08050234 @ =gUnknown_2031DAC
movs r0, 0x88
@@ -14745,7 +14745,7 @@ _0805434C:
ldr r0, _08054378 @ =sub_804C718
cmp r1, r0
bne _08054384
- bl sub_80FA4F8
+ bl IsNoOneConnected
lsls r0, 24
cmp r0, 0
beq _08054396
@@ -14819,7 +14819,7 @@ sub_80543C4: @ 80543C4
ldrb r0, [r0]
cmp r0, 0
beq _08054412
- bl sub_80FCE44
+ bl DestroyWirelessStatusIndicatorSprite
_08054412:
ldr r0, _0805443C @ =gMain
ldr r0, [r0, 0x8]
diff --git a/asm/union_room_chat.s b/asm/union_room_chat.s
index fcf0ceb19..6826bdb77 100644
--- a/asm/union_room_chat.s
+++ b/asm/union_room_chat.s
@@ -4288,7 +4288,7 @@ sub_812A424: @ 812A424
ldrb r0, [r0, 0x18]
movs r1, 0x1
movs r2, 0xD
- bl sub_8150048
+ bl DrawTextBorderOuter
ldr r0, [r6]
ldrb r0, [r0, 0x18]
movs r1, 0xE
@@ -4524,7 +4524,7 @@ _0812A6B0:
adds r0, r5, 0
movs r1, 0xA
movs r2, 0x2
- bl sub_8150048
+ bl DrawTextBorderOuter
ldrb r3, [r4, 0x5]
ldrb r0, [r4, 0x6]
str r0, [sp]
@@ -4980,7 +4980,7 @@ sub_812AA10: @ 812AA10
movs r0, 0x3
movs r1, 0x1
movs r2, 0xD
- bl sub_8150048
+ bl DrawTextBorderOuter
ldr r0, _0812AA60 @ =gUnknown_845ABEC
str r0, [sp]
movs r0, 0x3
diff --git a/asm/unk_8147AA8.s b/asm/unk_8147AA8.s
index 36b8940ab..c0451378c 100644
--- a/asm/unk_8147AA8.s
+++ b/asm/unk_8147AA8.s
@@ -5179,7 +5179,7 @@ _0814A124:
ldrb r0, [r0, 0x12]
movs r1, 0x1
movs r2, 0xE
- bl sub_8150048
+ bl DrawTextBorderOuter
movs r0, 0x17
movs r1, 0x7
movs r2, 0
@@ -5265,7 +5265,7 @@ _0814A1D0:
ldrb r0, [r0, 0x12]
movs r1, 0x1
movs r2, 0xE
- bl sub_8150048
+ bl DrawTextBorderOuter
movs r0, 0
bl CopyBgTilemapBufferToVram
_0814A1F4:
@@ -5386,7 +5386,7 @@ _0814A2C0:
ldrb r0, [r0, 0x12]
movs r1, 0x1
movs r2, 0xE
- bl sub_8150048
+ bl DrawTextBorderOuter
movs r0, 0
bl CopyBgTilemapBufferToVram
_0814A2E4:
@@ -5468,7 +5468,7 @@ _0814A364:
ldrb r0, [r0, 0x12]
movs r1, 0x1
movs r2, 0xE
- bl sub_8150048
+ bl DrawTextBorderOuter
movs r0, 0
bl CopyBgTilemapBufferToVram
_0814A388:
@@ -5839,7 +5839,7 @@ _0814A652:
ldrb r0, [r0, 0x12]
movs r1, 0x1
movs r2, 0xE
- bl sub_8150048
+ bl DrawTextBorderOuter
movs r0, 0
bl CopyBgTilemapBufferToVram
ldr r1, [r4]
@@ -7934,7 +7934,7 @@ sub_814B5C4: @ 814B5C4
adds r0, r4, 0
adds r1, r5, 0
movs r2, 0xD
- bl sub_8150048
+ bl DrawTextBorderOuter
adds r0, r4, 0
movs r1, 0x11
bl FillWindowPixelBuffer
diff --git a/asm/unk_814D5C8.s b/asm/unk_814D5C8.s
index 422d34f07..23968f655 100644
--- a/asm/unk_814D5C8.s
+++ b/asm/unk_814D5C8.s
@@ -424,7 +424,7 @@ _0814D962:
bl ClearGpuRegBits
b _0814D9BA
_0814D9A2:
- bl sub_80FCE44
+ bl DestroyWirelessStatusIndicatorSprite
adds r0, r5, 0
bl sub_814EF10
bl sub_815C9F4
diff --git a/asm/unk_81507FC.s b/asm/unk_81507FC.s
index 324a6b48c..19b2b2c43 100644
--- a/asm/unk_81507FC.s
+++ b/asm/unk_81507FC.s
@@ -6478,7 +6478,7 @@ sub_81538D0: @ 81538D0
adds r0, r7, 0
adds r1, r4, 0
movs r2, 0xD
- bl sub_8150048
+ bl DrawTextBorderOuter
adds r0, r7, 0
movs r1, 0x11
bl FillWindowPixelBuffer
diff --git a/berry_fix/payload/Makefile b/berry_fix/payload/Makefile
index b97556774..5cca8a157 100644
--- a/berry_fix/payload/Makefile
+++ b/berry_fix/payload/Makefile
@@ -16,7 +16,7 @@ CPPFLAGS := -I ../../tools/agbcc/include -I ../../tools/agbcc -iquote include -n
ROM := payload.gba
OBJ_DIR := build
CC1 := ../../tools/agbcc/bin/agbcc$(EXE)
-override CFLAGS += -mthumb-interwork -Wimplicit -Wparentheses -Werror -O2 -fhex-asm
+override CC1FLAGS += -mthumb-interwork -Wimplicit -Wparentheses -Werror -O2 -fhex-asm
ELF = $(ROM:.gba=.elf)
@@ -34,7 +34,7 @@ ASFLAGS := -mcpu=arm7tdmi
LDFLAGS = -Map ../$(MAP)
-LIB := -L ../../../tools/agbcc/lib -lagb_flash -lsiirtc -lagbsyscall -lgcc
+LIB := -L ../../../tools/agbcc/lib -lgcc
SHA1 := $(shell { command -v sha1sum || command -v shasum; } 2>/dev/null) -c
GFX := ../../tools/gbagfx/gbagfx$(EXE)
@@ -79,6 +79,12 @@ SUBDIRS := $(sort $(dir $(OBJS)))
$(shell mkdir -p $(SUBDIRS))
+$(C_BUILDDIR)/siirtc.o: CC1FLAGS := -mthumb-interwork
+$(C_BUILDDIR)/agb_flash.o: CC1FLAGS := -O1 -mthumb-interwork
+$(C_BUILDDIR)/agb_flash_1m.o: CC1FLAGS := -O1 -mthumb-interwork
+$(C_BUILDDIR)/agb_flash_mx.o: CC1FLAGS := -O1 -mthumb-interwork
+$(C_BUILDDIR)/agb_flash_le.o: CC1FLAGS := -O1 -mthumb-interwork
+
rom: $(ROM)
# For contributors to make sure a change didn't affect the contents of the ROM.
@@ -116,7 +122,7 @@ endif
$(C_BUILDDIR)/%.o : $(C_SUBDIR)/%.c $$(c_dep)
@$(CPP) $(CPPFLAGS) $< -o $(C_BUILDDIR)/$*.i
- @$(PREPROC) $(C_BUILDDIR)/$*.i charmap.txt | $(CC1) $(CFLAGS) -o $(C_BUILDDIR)/$*.s
+ @$(PREPROC) $(C_BUILDDIR)/$*.i charmap.txt | $(CC1) $(CC1FLAGS) -o $(C_BUILDDIR)/$*.s
$(AS) $(ASFLAGS) -o $@ $(C_BUILDDIR)/$*.s
ifeq ($(NODEP),1)
diff --git a/berry_fix/payload/asm/libagbsyscall.s b/berry_fix/payload/asm/libagbsyscall.s
new file mode 100644
index 000000000..0368c7e70
--- /dev/null
+++ b/berry_fix/payload/asm/libagbsyscall.s
@@ -0,0 +1,46 @@
+ .include "constants/gba_constants.inc"
+ .include "asm/macros.inc"
+
+ .syntax unified
+
+ .text
+
+ thumb_func_start CpuSet
+CpuSet: @ 81E3B64
+ swi 0xB
+ bx lr
+ thumb_func_end CpuSet
+
+ thumb_func_start Div
+Div: @ 81E3B68
+ swi 0x6
+ bx lr
+ thumb_func_end Div
+
+ thumb_func_start Mod
+Mod:
+ swi 0x6
+ adds r0, r1, 0
+ bx lr
+ thumb_func_end Mod
+
+ thumb_func_start LZ77UnCompVram
+LZ77UnCompVram: @ 81E3B6C
+ swi 0x12
+ bx lr
+ thumb_func_end LZ77UnCompVram
+
+ thumb_func_start RegisterRamReset
+RegisterRamReset: @ 81E3B80
+ swi 0x1
+ bx lr
+ thumb_func_end RegisterRamReset
+
+ thumb_func_start VBlankIntrWait
+VBlankIntrWait: @ 81E3BA0
+ movs r2, 0
+ swi 0x5
+ bx lr
+ thumb_func_end VBlankIntrWait
+
+ .align 2, 0 @ Don't pad with nop.
diff --git a/berry_fix/payload/asm/macros.inc b/berry_fix/payload/asm/macros.inc
new file mode 100644
index 000000000..e6813d319
--- /dev/null
+++ b/berry_fix/payload/asm/macros.inc
@@ -0,0 +1,155 @@
+ .include "asm/macros/asm.inc"
+ .include "asm/macros/function.inc"
+ .include "asm/macros/movement.inc"
+ .include "asm/macros/pokemon_data.inc"
+ .include "asm/macros/ec.inc"
+ .include "asm/macros/map.inc"
+ .include "asm/macros/m4a.inc"
+
+ .macro region_map_location x, y, width, height, name
+ .byte \x
+ .byte \y
+ .byte \width
+ .byte \height
+ .4byte gMapName_\name
+ .endm
+
+ .macro obj_tiles address, uncompressed_size, tag
+ .4byte \address
+ .2byte \uncompressed_size
+ .2byte \tag
+ .endm
+
+ .macro null_obj_tiles
+ obj_tiles 0, 0, 0
+ .endm
+
+ .macro obj_pal address, tag
+ .4byte \address
+ .2byte \tag
+ .2byte 0 @ padding
+ .endm
+
+ .macro null_obj_pal
+ obj_pal 0, 0
+ .endm
+
+ .macro paired_pals tag, address
+ .2byte \tag
+ .2byte 0 @ padding
+ .4byte \address
+ .endm
+
+@ For object animation frames.
+ .macro obj_frame_tiles address, uncompressed_size
+ .4byte \address
+ .2byte \uncompressed_size
+ .2byte 0 @ padding
+ .endm
+
+ .macro spr_template tile_tag, pal_tag, oam, anims, images, affine_anims, callback
+ .2byte \tile_tag
+ .2byte \pal_tag
+ .4byte \oam
+ .4byte \anims
+ .4byte \images
+ .4byte \affine_anims
+ .4byte \callback
+ .endm
+
+@ Berry trees have a table defining the palette slot used for each of their 5
+@ stages. However, the first 2 stages always use the same slots regardless of
+@ the type of tree and the slots of the last 3 stages always equal each other.
+ .macro berry_tree_palette_slot_table slot
+ .byte 3, 4, \slot, \slot, \slot
+ .endm
+
+ .macro subsprite x, y, priority, tile_num_offset, size
+ .2byte \x
+ .2byte \y
+ .2byte ((\priority) << 14) | ((\tile_num_offset) << 4) | SPRITE_SIZE_\size
+ .2byte 0 @ padding
+ .endm
+
+ .macro obj_image_anim_frame pic_id, duration, flags = 0
+ .2byte \pic_id
+ .byte (\flags) | (\duration)
+ .byte 0 @ padding
+ .endm
+
+ .macro obj_image_anim_loop count
+ .2byte 0xfffd
+ .byte \count
+ .byte 0 @ padding
+ .endm
+
+ .macro obj_image_anim_jump target_index
+ .2byte 0xfffe
+ .byte \target_index
+ .byte 0 @ padding
+ .endm
+
+ .macro obj_image_anim_end
+ .2byte 0xffff
+ .2byte 0 @ padding
+ .endm
+
+ .macro obj_rot_scal_anim_frame delta_x_scale, delta_y_scale, delta_angle, duration
+ .2byte \delta_x_scale
+ .2byte \delta_y_scale
+ .byte \delta_angle
+ .byte \duration
+ .2byte 0 @ padding
+ .endm
+
+ .macro obj_rot_scal_anim_loop count
+ .2byte 0x7ffd
+ .2byte \count
+ .4byte 0 @ padding
+ .endm
+
+ .macro obj_rot_scal_anim_jump target_index
+ .2byte 0x7ffe
+ .2byte \target_index
+ .4byte 0 @ padding
+ .endm
+
+ .macro obj_rot_scal_anim_end unknown=0
+ .2byte 0x7fff
+ .2byte \unknown
+ .fill 4 @ padding
+ .endm
+
+ .macro credits_entry number, text
+ .4byte \number
+ .4byte \text
+ .endm
+
+ .macro door_anim_frame unknown, offset
+ .byte \unknown
+ .byte 0 @ padding
+ .2byte \offset
+ .endm
+
+ .macro door_anim_gfx metatile_num, unknown, tile_addr, palette_addr
+ .2byte \metatile_num
+ .2byte \unknown
+ .4byte \tile_addr
+ .4byte \palette_addr
+ .endm
+
+ .macro trainer_eye_trainer opp_1, opp_2, opp_3, opp_4, opp_5, map_name
+ .2byte OPPONENT_\opp_1
+ .2byte OPPONENT_\opp_2
+ .2byte OPPONENT_\opp_3
+ .2byte OPPONENT_\opp_4
+ .2byte OPPONENT_\opp_5
+ .2byte GROUP_\map_name
+ .2byte MAP_\map_name
+ .space 2
+ .endm
+
+ .macro window_template bg, top, left, height, width, palno, baseBlock
+ .byte \bg, \top, \left, \height, \width, \palno
+ .2byte \baseBlock
+ .endm
diff --git a/berry_fix/payload/asm/macros/asm.inc b/berry_fix/payload/asm/macros/asm.inc
new file mode 100644
index 000000000..26b2707ca
--- /dev/null
+++ b/berry_fix/payload/asm/macros/asm.inc
@@ -0,0 +1,17 @@
+ .ifndef GUARD_ASM_MACROS_ASM_INC
+ .set GUARD_ASM_MACROS_ASM_INC, 1
+
+ .macro inc x
+ .set \x, \x + 1
+ .endm
+
+ .macro enum_start x=0
+ .set __enum__, \x
+ .endm
+
+ .macro enum constant
+ .equiv \constant, __enum__
+ inc __enum__
+ .endm
+
+ .endif @ GUARD_ASM_MACROS_ASM_INC
diff --git a/berry_fix/payload/asm/macros/battle_ai_script.inc b/berry_fix/payload/asm/macros/battle_ai_script.inc
new file mode 100644
index 000000000..679e30340
--- /dev/null
+++ b/berry_fix/payload/asm/macros/battle_ai_script.inc
@@ -0,0 +1,554 @@
+ .macro if_random_less_than percent, address
+ .byte 0x00
+ .byte \percent
+ .4byte \address
+ .endm
+
+ @ unused
+ .macro if_random_greater_than percent, address
+ .byte 0x01
+ .byte \percent
+ .4byte \address
+ .endm
+
+ @ unused
+ .macro if_random_equal address
+ .byte 0x02
+ .4byte \address
+ .endm
+
+ @ unused
+ .macro if_random_not_equal address
+ .byte 0x03
+ .4byte \address
+ .endm
+
+ .macro score score
+ .byte 0x04
+ .byte \score
+ .endm
+
+ .macro if_hp_less_than target, percent, address
+ .byte 0x05
+ .byte \target
+ .byte \percent
+ .4byte \address
+ .endm
+
+ .macro if_hp_more_than target, percent, address
+ .byte 0x06
+ .byte \target
+ .byte \percent
+ .4byte \address
+ .endm
+
+ .macro if_hp_equal target, percent, address
+ .byte 0x07
+ .byte \target
+ .byte \percent
+ .4byte \address
+ .endm
+
+ .macro if_hp_not_equal target, percent, address
+ .byte 0x08
+ .byte \target
+ .byte \percent
+ .4byte \address
+ .endm
+
+ .macro if_status target, status, address
+ .byte 0x09
+ .byte \target
+ .4byte \status
+ .4byte \address
+ .endm
+
+ .macro if_not_status target, status, address
+ .byte 0x0a
+ .byte \target
+ .4byte \status
+ .4byte \address
+ .endm
+
+ .macro if_status2 target, status, address
+ .byte 0x0b
+ .byte \target
+ .4byte \status
+ .4byte \address
+ .endm
+
+ .macro if_not_status2 target, status, address
+ .byte 0x0c
+ .byte \target
+ .4byte \status
+ .4byte \address
+ .endm
+
+ .macro if_status3 target, status, address
+ .byte 0x0d
+ .byte \target
+ .4byte \status
+ .4byte \address
+ .endm
+
+ .macro if_not_status3 target, status, address
+ .byte 0x0e
+ .byte \target
+ .4byte \status
+ .4byte \address
+ .endm
+
+ .macro if_status4 target, status, address
+ .byte 0x0f
+ .byte \target
+ .4byte \status
+ .4byte \address
+ .endm
+
+ .macro if_not_status4 target, status, address
+ .byte 0x10
+ .byte \target
+ .4byte \status
+ .4byte \address
+ .endm
+
+ .macro if_less_than value, address
+ .byte 0x11
+ .byte \value
+ .4byte \address
+ .endm
+
+ .macro if_more_than value, address
+ .byte 0x12
+ .byte \value
+ .4byte \address
+ .endm
+
+ .macro if_equal value, address
+ .byte 0x13
+ .byte \value
+ .4byte \address
+ .endm
+
+ .macro if_not_equal value, address
+ .byte 0x14
+ .byte \value
+ .4byte \address
+ .endm
+
+ .macro if_less_than_32 value, address
+ .byte 0x15
+ .4byte \value
+ .4byte \address
+ .endm
+
+ .macro if_more_than_32 value, address
+ .byte 0x16
+ .4byte \value
+ .4byte \address
+ .endm
+
+ .macro if_equal_32 value, address
+ .byte 0x17
+ .4byte \value
+ .4byte \address
+ .endm
+
+ .macro if_not_equal_32 value, address
+ .byte 0x18
+ .4byte \value
+ .4byte \address
+ .endm
+
+ .macro if_move move, address
+ .byte 0x19
+ .2byte \move
+ .4byte \address
+ .endm
+
+ .macro if_not_move move, address
+ .byte 0x1a
+ .2byte \move
+ .4byte \address
+ .endm
+
+ .macro if_in_bytes list, address
+ .byte 0x1b
+ .4byte \list
+ .4byte \address
+ .endm
+
+ .macro if_not_in_bytes list, address
+ .byte 0x1c
+ .4byte \list
+ .4byte \address
+ .endm
+
+ .macro if_in_words list, address
+ .byte 0x1d
+ .4byte \list
+ .4byte \address
+ .endm
+
+ .macro if_not_in_words list, address
+ .byte 0x1e
+ .4byte \list
+ .4byte \address
+ .endm
+
+ .macro if_user_can_damage address
+ .byte 0x1f
+ .4byte \address
+ .endm
+
+ .macro if_user_cant_damage address
+ .byte 0x20
+ .4byte \address
+ .endm
+
+ .macro get_turn_count
+ .byte 0x21
+ .endm
+
+ .macro get_type byte
+ .byte 0x22
+ .byte \byte
+ .endm
+
+ @ unused
+ .macro get_move_power
+ .byte 0x23
+ .endm
+
+ .macro is_most_powerful_move
+ .byte 0x24
+ .endm
+
+ .macro get_move target
+ .byte 0x25
+ .byte \target
+ .endm
+
+ .macro if_arg_equal type, address
+ .byte 0x26
+ .byte \type
+ .4byte \address
+ .endm
+
+ @ unused
+ .macro if_arg_not_equal type, address
+ .byte 0x27
+ .byte \type
+ .4byte \address
+ .endm
+
+ .macro if_would_go_first target, address
+ .byte 0x28
+ .byte \target
+ .4byte \address
+ .endm
+
+ .macro if_would_not_go_first target, address
+ .byte 0x29
+ .byte \target
+ .4byte \address
+ .endm
+
+ @ nullsub
+ .macro ai_2a
+ .byte 0x2a
+ .endm
+
+ @ nullsub
+ .macro ai_2b
+ .byte 0x2b
+ .endm
+
+ .macro count_alive_pokemon target
+ .byte 0x2c
+ .byte \target
+ .endm
+
+ @ unused
+ .macro get_considered_move
+ .byte 0x2d
+ .endm
+
+ .macro get_effect
+ .byte 0x2e
+ .endm
+
+ .macro get_ability target
+ .byte 0x2f
+ .byte \target
+ .endm
+
+ @ unused
+ .macro get_highest_possible_damage
+ .byte 0x30
+ .endm
+
+ .macro if_damage_bonus value, address
+ .byte 0x31
+ .byte \value
+ .4byte \address
+ .endm
+
+ @ nullsub
+ .macro ai_32
+ .byte 0x32
+ .endm
+
+ @ nullsub
+ .macro ai_33
+ .byte 0x33
+ .endm
+
+ .macro if_status_in_party target, status, address
+ .byte 0x34
+ .byte \target
+ .4byte \status
+ .4byte \address
+ .endm
+
+ @ bugged
+ .macro if_status_not_in_party target, status, address
+ .byte 0x35
+ .byte \target
+ .4byte \status
+ .4byte \address
+ .endm
+
+ .macro get_weather
+ .byte 0x36
+ .endm
+
+ .macro if_effect byte, address
+ .byte 0x37
+ .byte \byte
+ .4byte \address
+ .endm
+
+ .macro if_not_effect byte, address
+ .byte 0x38
+ .byte \byte
+ .4byte \address
+ .endm
+
+ .macro if_stat_level_less_than target, stat, level, address
+ .byte 0x39
+ .byte \target
+ .byte \stat
+ .byte \level
+ .4byte \address
+ .endm
+
+ .macro if_stat_level_more_than target, stat, level, address
+ .byte 0x3a
+ .byte \target
+ .byte \stat
+ .byte \level
+ .4byte \address
+ .endm
+
+ .macro if_stat_level_equal target, stat, level, address
+ .byte 0x3b
+ .byte \target
+ .byte \stat
+ .byte \level
+ .4byte \address
+ .endm
+
+ .macro if_stat_level_not_equal target, stat, level, address
+ .byte 0x3c
+ .byte \target
+ .byte \stat
+ .byte \level
+ .4byte \address
+ .endm
+
+ .macro if_can_faint address
+ .byte 0x3d
+ .4byte \address
+ .endm
+
+ .macro if_cant_faint address
+ .byte 0x3e
+ .4byte \address
+ .endm
+
+ @ unused
+ .macro if_has_move, target, move, address
+ .byte 0x3f
+ .byte \target
+ .2byte \move
+ .4byte \address
+ .endm
+
+ @ unused
+ .macro if_dont_have_move, target, move, address
+ .byte 0x40
+ .byte \target
+ .2byte \move
+ .4byte \address
+ .endm
+
+ .macro if_move_effect target, effect, address
+ .byte 0x41
+ .byte \target
+ .byte \effect
+ .4byte \address
+ .endm
+
+ .macro if_not_move_effect target, effect, address
+ .byte 0x42
+ .byte \target
+ .byte \effect
+ .4byte \address
+ .endm
+
+ .macro if_last_move_did_damage target, byte, address
+ .byte 0x43
+ .byte \target
+ .byte \byte
+ .4byte \address
+ .endm
+
+ .macro if_encored target, address
+ .byte 0x44
+ .byte \target
+ .4byte \address
+ .endm
+
+ .macro flee
+ .byte 0x45
+ .endm
+
+ .macro if_random_100 address
+ .byte 0x46
+ .4byte \address
+ .endm
+
+ .macro watch
+ .byte 0x47
+ .endm
+
+ .macro get_hold_effect target
+ .byte 0x48
+ .byte \target
+ .endm
+
+ .macro get_gender target
+ .byte 0x49
+ .byte \target
+ .endm
+
+ .macro is_first_turn target
+ .byte 0x4a
+ .byte \target
+ .endm
+
+ .macro get_stockpile_count target
+ .byte 0x4b
+ .byte \target
+ .endm
+
+ .macro is_double_battle
+ .byte 0x4c
+ .endm
+
+ .macro get_item target
+ .byte 0x4d
+ .byte \target
+ .endm
+
+ .macro get_move_type_from_result
+ .byte 0x4e
+ .endm
+
+ .macro get_move_power_from_result
+ .byte 0x4f
+ .endm
+
+ .macro get_move_effect_from_result
+ .byte 0x50
+ .endm
+
+ .macro get_protect_count target
+ .byte 0x51
+ .byte \target
+ .endm
+
+ @ nullsub
+ .macro ai_52
+ .byte 0x52
+ .endm
+
+ @ nullsub
+ .macro ai_53
+ .byte 0x53
+ .endm
+
+ @ nullsub
+ .macro ai_54
+ .byte 0x54
+ .endm
+
+ @ nullsub
+ .macro ai_55
+ .byte 0x55
+ .endm
+
+ @ nullsub
+ .macro ai_56
+ .byte 0x56
+ .endm
+
+ @ nullsub
+ .macro ai_57
+ .byte 0x57
+ .endm
+
+ @ unused
+ .macro call address
+ .byte 0x58
+ .4byte \address
+ .endm
+
+ .macro jump address
+ .byte 0x59
+ .4byte \address
+ .endm
+
+ .macro end
+ .byte 0x5a
+ .endm
+
+ .macro if_level_cond cond, address
+ .byte 0x5b
+ .byte \cond
+ .4byte \address
+ .endm
+
+ .macro if_user_higher_level address
+ if_level_cond 0, \address
+ .endm
+
+ .macro if_target_higher_level address
+ if_level_cond 1, \address
+ .endm
+
+ .macro if_equal_levels address
+ if_level_cond 2, \address
+ .endm
+
+ @ unused
+ .macro if_taunted address
+ .byte 0x5c
+ .4byte \address
+ .endm
+
+ .macro if_not_taunted address
+ .byte 0x5d
+ .4byte \address
+ .endm
diff --git a/berry_fix/payload/asm/macros/battle_anim.inc b/berry_fix/payload/asm/macros/battle_anim.inc
new file mode 100644
index 000000000..4ff845032
--- /dev/null
+++ b/berry_fix/payload/asm/macros/battle_anim.inc
@@ -0,0 +1,266 @@
+ .macro loadsprite id
+ .byte 0x00
+ .2byte \id
+ .endm
+
+ .macro unloadsprite id
+ .byte 0x01
+ .2byte \id
+ .endm
+
+ .macro sprite template, priority, argv:vararg
+ .byte 0x02
+ .4byte \template
+ .byte \priority
+ .byte (.Lsprite_\@_2 - .Lsprite_\@_1) / 2
+.Lsprite_\@_1:
+ .2byte \argv
+.Lsprite_\@_2:
+ .endm
+
+ .macro createtask addr, priority, argv:vararg
+ .byte 0x03
+ .4byte \addr
+ .byte \priority
+ .byte (.Lcreatetask_\@_2 - .Lcreatetask_\@_1) / 2
+.Lcreatetask_\@_1:
+ .2byte \argv
+.Lcreatetask_\@_2:
+ .endm
+
+ .macro pause delay
+ .byte 0x04
+ .byte \delay
+ .endm
+
+ .macro wait
+ .byte 0x05
+ .endm
+
+ .macro hang1
+ .byte 0x06
+ .endm
+
+ .macro hang2
+ .byte 0x07
+ .endm
+
+ .macro end
+ .byte 0x08
+ .endm
+
+ .macro playse id
+ .byte 0x09
+ .2byte \id
+ .endm
+
+ .macro monbg which
+ .byte 0x0A
+ .byte \which
+ .endm
+
+ .macro clearmonbg which
+ .byte 0x0B
+ .byte \which
+ .endm
+
+ .macro setalpha eva, evb
+ .byte 0x0C
+ .2byte ((\evb) << 8) | (\eva)
+ .endm
+
+ .macro blendoff
+ .byte 0x0D
+ .endm
+
+ .macro call addr
+ .byte 0x0E
+ .4byte \addr
+ .endm
+
+ .macro ret
+ .byte 0x0F
+ .endm
+
+ .macro setvar var_num, value
+ .byte 0x10
+ .byte \var_num
+ .2byte \value
+ .endm
+
+ .macro ifelse addr1, addr2
+ .byte 0x11
+ .4byte \addr1
+ .4byte \addr2
+ .endm
+
+ .macro jumpif cond, addr
+ .byte 0x12
+ .byte \cond
+ .4byte \addr
+ .endm
+
+ .macro jump addr
+ .byte 0x13
+ .4byte \addr
+ .endm
+
+ .macro fadetobg id
+ .byte 0x14
+ .byte \id
+ .endm
+
+ .macro restorebg
+ .byte 0x15
+ .endm
+
+ .macro waitbgfadeout
+ .byte 0x16
+ .endm
+
+ .macro waitbgfadein
+ .byte 0x17
+ .endm
+
+ .macro changebg id
+ .byte 0x18
+ .byte \id
+ .endm
+
+ .macro panse_19 id, pan
+ .byte 0x19
+ .2byte \id
+ .byte \pan
+ .endm
+
+ .macro setpan pan
+ .byte 0x1A
+ .byte \pan
+ .endm
+
+ .macro panse_1B id, pan_start, pan_end, step, delay
+ .byte 0x1B
+ .2byte \id
+ .byte \pan_start
+ .byte \pan_end
+ .byte \step
+ .byte \delay
+ .endm
+
+ .macro panse_1C id, pan, delay, count
+ .byte 0x1C
+ .2byte \id
+ .byte \pan
+ .byte \delay
+ .byte \count
+ .endm
+
+ .macro panse_1D id, pan, count
+ .byte 0x1D
+ .2byte \id
+ .byte \pan
+ .byte \count
+ .endm
+
+ .macro setbldcnt bldcnt
+ .byte 0x1E
+ .2byte \bldcnt
+ .endm
+
+ .macro createtask_1F addr, argv:vararg
+ .byte 0x1F
+ .4byte \addr
+ .byte (.Lcreatetask_1F_\@_2 - .Lcreatetask_1F_\@_1) / 2
+.Lcreatetask_1F_\@_1:
+ .2byte \argv
+.Lcreatetask_1F_\@_2:
+ .endm
+
+ .macro waitsound
+ .byte 0x20
+ .endm
+
+ .macro jumpvareq var_num, value, addr
+ .byte 0x21
+ .byte \var_num
+ .2byte \value
+ .4byte \addr
+ .endm
+
+ .macro monbg_22 unk
+ .byte 0x22
+ .byte \unk
+ .endm
+
+ .macro clearmonbg_23 unk
+ .byte 0x23
+ .byte \unk
+ .endm
+
+ .macro jumpunkcond addr
+ .byte 0x24
+ .4byte \addr
+ .endm
+
+ .macro fadetobg_25 a, b, c
+ .byte 0x25
+ .byte \a
+ .byte \b
+ .byte \c
+ .endm
+
+ .macro panse_26 id, pan_start, pan_end, step, delay
+ .byte 0x26
+ .2byte \id
+ .byte \pan_start
+ .byte \pan_end
+ .byte \step
+ .byte \delay
+ .endm
+
+ .macro panse_27 id, pan_start, pan_end, step, delay
+ .byte 0x27
+ .2byte \id
+ .byte \pan_start
+ .byte \pan_end
+ .byte \step
+ .byte \delay
+ .endm
+
+ .macro monbgprio_28 unk
+ .byte 0x28
+ .byte \unk
+ .endm
+
+ .macro monbgprio_29
+ .byte 0x29
+ .endm
+
+ .macro monbgprio_2A unk
+ .byte 0x2A
+ .byte \unk
+ .endm
+
+ .macro invisible side
+ .byte 0x2B
+ .byte \side
+ .endm
+
+ .macro visible side
+ .byte 0x2C
+ .byte \side
+ .endm
+
+ .macro doublebattle_2D unk
+ .byte 0x2D
+ .byte \unk
+ .endm
+
+ .macro doublebattle_2E unk
+ .byte 0x2E
+ .byte \unk
+ .endm
+
+ .macro stopsound
+ .byte 0x2F
+ .endm
diff --git a/berry_fix/payload/asm/macros/battle_script.inc b/berry_fix/payload/asm/macros/battle_script.inc
new file mode 100644
index 000000000..5dd1d5a1a
--- /dev/null
+++ b/berry_fix/payload/asm/macros/battle_script.inc
@@ -0,0 +1,1228 @@
+@ 0 ==
+@ 1 !=
+@ 2 <
+@ 3 >
+@ 4 &=
+
+ .macro calculatedamage
+ critical
+ atk5
+ atk6
+ atk7
+ .endm
+
+
+ .macro attackcanceler
+ .byte 0x00
+ .endm
+
+ .macro accuracycheck address, param1
+ .byte 0x01
+ .4byte \address
+ .2byte \param1
+ .endm
+
+ .macro attackstring
+ .byte 0x02
+ .endm
+
+ .macro ppreduce
+ .byte 0x03
+ .endm
+
+ .macro critcalc
+ .byte 0x04
+ .endm
+
+ .macro atk5
+ .byte 0x05
+ .endm
+
+ .macro atk6
+ .byte 0x06
+ .endm
+
+ .macro atk7
+ .byte 0x07
+ .endm
+
+ .macro atk8
+ .byte 0x08
+ .endm
+
+ .macro attackanimation
+ .byte 0x09
+ .endm
+
+ .macro waitanimation
+ .byte 0x0a
+ .endm
+
+ .macro graphicalhpupdate bank
+ .byte 0x0b
+ .byte \bank
+ .endm
+
+ .macro datahpupdate bank
+ .byte 0x0c
+ .byte \bank
+ .endm
+
+ .macro critmessage
+ .byte 0x0d
+ .endm
+
+ .macro missmessage
+ .byte 0x0e
+ .endm
+
+ .macro resultmessage
+ .byte 0x0f
+ .endm
+
+ .macro printstring string
+ .byte 0x10
+ .2byte \string
+ .endm
+
+ .macro printstring2 string
+ .byte 0x11
+ .2byte \string
+ .endm
+
+ .macro waitmessage delay
+ .byte 0x12
+ .2byte \delay
+ .endm
+
+ .macro printfromtable table
+ .byte 0x13
+ .4byte \table
+ .endm
+
+ .macro printfromtable2 table
+ .byte 0x14
+ .4byte \table
+ .endm
+
+ .macro seteffectwithchancetarget
+ .byte 0x15
+ .endm
+
+ .macro seteffecttarget
+ .byte 0x16
+ .endm
+
+ .macro seteffectuser
+ .byte 0x17
+ .endm
+
+ .macro clearstatus bank
+ .byte 0x18
+ .byte \bank
+ .endm
+
+ .macro faintpokemon bank, param2, param3
+ .byte 0x19
+ .byte \bank
+ .byte \param2
+ .4byte \param3
+ .endm
+
+ .macro atk1a param1
+ .byte 0x1a
+ .byte \param1
+ .endm
+
+ .macro atk1b bank
+ .byte 0x1b
+ .byte \bank
+ .endm
+
+ .macro jumpifstatus bank, status, address
+ .byte 0x1c
+ .byte \bank
+ .4byte \status
+ .4byte \address
+ .endm
+
+ .macro jumpifsecondarytstatus bank, status, address
+ .byte 0x1d
+ .byte \bank
+ .4byte \status
+ .4byte \address
+ .endm
+
+ .macro jumpifability bank, ability, address
+ .byte 0x1e
+ .byte \bank
+ .byte \ability
+ .4byte \address
+ .endm
+
+ .macro jumpifhalverset bank, status, address
+ .byte 0x1f
+ .byte \bank
+ .2byte \status
+ .4byte \address
+ .endm
+
+ .macro jumpifstat bank, flag, quantity, statid, address
+ .byte 0x20
+ .byte \bank
+ .byte \flag
+ .byte \quantity
+ .byte \statid
+ .4byte \address
+ .endm
+
+ .macro jumpifspecialstatusflag bank, mask, status, address
+ .byte 0x21
+ .byte \bank
+ .4byte \mask
+ .byte \status
+ .4byte \address
+ .endm
+
+ .macro jumpiftype bank, type, address
+ .byte 0x22
+ .byte \bank
+ .byte \type
+ .4byte \address
+ .endm
+
+ .macro atk23 bank
+ .byte 0x23
+ .byte \bank
+ .endm
+
+ .macro atk24 address
+ .byte 0x24
+ .4byte \address
+ .endm
+
+ .macro atk25
+ .byte 0x25
+ .endm
+
+ .macro atk26 param1
+ .byte 0x26
+ .byte \param1
+ .endm
+
+ .macro atk27 address
+ .byte 0x27
+ .4byte \address
+ .endm
+
+ .macro jump address
+ .byte 0x28
+ .4byte \address
+ .endm
+
+ .macro jumpifbyte ifflag, checkaddr, compare, address
+ .byte 0x29
+ .byte \ifflag
+ .4byte \checkaddr
+ .byte \compare
+ .4byte \address
+ .endm
+
+ .macro jumpifhalfword ifflag, checkaddr, compare, address
+ .byte 0x2a
+ .byte \ifflag
+ .4byte \checkaddr
+ .2byte \compare
+ .4byte \address
+ .endm
+
+ .macro jumpifword ifflag, checkaddr, compare, address
+ .byte 0x2b
+ .byte \ifflag
+ .4byte \checkaddr
+ .4byte \compare
+ .4byte \address
+ .endm
+
+ .macro jumpifarrayequal mem1, mem2, size, address
+ .byte 0x2c
+ .4byte \mem1
+ .4byte \mem2
+ .byte \size
+ .4byte \address
+ .endm
+
+ .macro jumpifarraynotequal mem1, mem2, size, address
+ .byte 0x2d
+ .4byte \mem1
+ .4byte \mem2
+ .byte \size
+ .4byte \address
+ .endm
+
+ .macro setbyte pointer, value
+ .byte 0x2e
+ .4byte \pointer
+ .byte \value
+ .endm
+
+ .macro addbyte pointer, value
+ .byte 0x2f
+ .4byte \pointer
+ .byte \value
+ .endm
+
+ .macro subtractbyte pointer, value
+ .byte 0x30
+ .4byte \pointer
+ .byte \value
+ .endm
+
+ .macro copyarray destination, source, size
+ .byte 0x31
+ .4byte \destination
+ .4byte \source
+ .byte \size
+ .endm
+
+ .macro atk32 param1, param2, param3, byte
+ .byte 0x32
+ .4byte \param1
+ .4byte \param2
+ .4byte \param3
+ .byte \byte
+ .endm
+
+ .macro orbyte pointer, value
+ .byte 0x33
+ .4byte \pointer
+ .byte \value
+ .endm
+
+ .macro orhalfword pointer, value
+ .byte 0x34
+ .4byte \pointer
+ .2byte \value
+ .endm
+
+ .macro orword pointer, value
+ .byte 0x35
+ .4byte \pointer
+ .4byte \value
+ .endm
+
+ .macro bicbyte pointer, value
+ .byte 0x36
+ .4byte \pointer
+ .byte \value
+ .endm
+
+ .macro bichalfword pointer, value
+ .byte 0x37
+ .4byte \pointer
+ .2byte \value
+ .endm
+
+ .macro bicword pointer, value
+ .byte 0x38
+ .4byte \pointer
+ .4byte \value
+ .endm
+
+ .macro pause pause_duration
+ .byte 0x39
+ .2byte \pause_duration
+ .endm
+
+ .macro waitstateatk
+ .byte 0x3a
+ .endm
+
+ .macro somethinghealatk3b bank
+ .byte 0x3b
+ .byte \bank
+ .endm
+
+ .macro return
+ .byte 0x3c
+ .endm
+
+ .macro end
+ .byte 0x3d
+ .endm
+
+ .macro end2
+ .byte 0x3e
+ .endm
+
+ .macro end3
+ .byte 0x3f
+ .endm
+
+ .macro atk40 address
+ .byte 0x40
+ .4byte \address
+ .endm
+
+ .macro callatk address
+ .byte 0x41
+ .4byte \address
+ .endm
+
+ .macro jumpiftype2 bank, type, address
+ .byte 0x42
+ .byte \bank
+ .byte \type
+ .4byte \address
+ .endm
+
+ .macro jumpifabilitypresent ability, address
+ .byte 0x43
+ .byte \ability
+ .4byte \address
+ .endm
+
+ .macro atk44
+ .byte 0x44
+ .endm
+
+ .macro playanimation bank, animation, var_address
+ .byte 0x45
+ .byte \bank
+ .byte \animation
+ .4byte \var_address
+ .endm
+
+ .macro atk46 bank, address, int
+ .byte 0x46
+ .byte \bank
+ .4byte \address
+ .4byte \int
+ .endm
+
+ .macro atk47
+ .byte 0x47
+ .endm
+
+ .macro playstatchangeanimation bank, color, byte
+ .byte 0x48
+ .byte \bank
+ .byte \color
+ .byte \byte
+ .endm
+
+ .macro atk49 byte1, byte2
+ .byte 0x49
+ .byte \byte1
+ .byte \byte2
+ .endm
+
+ .macro damagecalc2
+ .byte 0x4a
+ .endm
+
+ .macro atk4b
+ .byte 0x4b
+ .endm
+
+ .macro switch1 bank
+ .byte 0x4c
+ .byte \bank
+ .endm
+
+ .macro switch2 bank
+ .byte 0x4d
+ .byte \bank
+ .endm
+
+ .macro switch3 bank, byte
+ .byte 0x4e
+ .byte \bank
+ .byte \byte
+ .endm
+
+ .macro jumpifcannotswitch bank, address
+ .byte 0x4f
+ .byte \bank
+ .4byte \address
+ .endm
+
+ .macro openpartyscreen bank, address
+ .byte 0x50
+ .byte \bank
+ .4byte \address
+ .endm
+
+ .macro atk51 bank, param2
+ .byte 0x51
+ .byte \bank
+ .byte \param2
+ .endm
+
+ .macro atk52 bank
+ .byte 0x52
+ .byte \bank
+ .endm
+
+ .macro atk53 bank
+ .byte 0x53
+ .byte \bank
+ .endm
+
+ .macro atk54 word
+ .byte 0x54
+ .2byte \word
+ .endm
+
+ .macro atk55 int
+ .byte 0x55
+ .4byte \int
+ .endm
+
+ .macro atk56 bank_or_side
+ .byte 0x56
+ .byte \bank_or_side
+ .endm
+
+ .macro atk57
+ .byte 0x57
+ .endm
+
+ .macro atk58 bank
+ .byte 0x58
+ .byte \bank
+ .endm
+
+ .macro checkiflearnmoveinbattle param1, param2, bank_maybe
+ .byte 0x59
+ .4byte \param1
+ .4byte \param2
+ .byte \bank_maybe
+ .endm
+
+ .macro atk5a address
+ .byte 0x5a
+ .4byte \address
+ .endm
+
+ .macro atk5b address
+ .byte 0x5b
+ .4byte \address
+ .endm
+
+ .macro atk5c bank
+ .byte 0x5c
+ .byte \bank
+ .endm
+
+ .macro atk5d
+ .byte 0x5d
+ .endm
+
+ .macro atk5e bank
+ .byte 0x5e
+ .byte \bank
+ .endm
+
+ .macro atk5f
+ .byte 0x5f
+ .endm
+
+ .macro atk60 byte
+ .byte 0x60
+ .byte \byte
+ .endm
+
+ .macro atk61 bank_or_side
+ .byte 0x61
+ .byte \bank_or_side
+ .endm
+
+ .macro atk62 bank_or_side
+ .byte 0x62
+ .byte \bank_or_side
+ .endm
+
+ .macro jumptoattack bank
+ .byte 0x63
+ .byte \bank
+ .endm
+
+ .macro statusanimation bank
+ .byte 0x64
+ .byte \bank
+ .endm
+
+ .macro atk65 bank_or_side, address
+ .byte 0x65
+ .byte \bank_or_side
+ .4byte \address
+ .endm
+
+ .macro atk66 bank_or_side, bank_or_side2, address
+ .byte 0x66
+ .byte \bank_or_side
+ .byte \bank_or_side2
+ .4byte \address
+ .endm
+
+ .macro atk67
+ .byte 0x67
+ .endm
+
+ .macro atk68
+ .byte 0x68
+ .endm
+
+ .macro atk69
+ .byte 0x69
+ .endm
+
+ .macro removeitem bank
+ .byte 0x6a
+ .byte \bank
+ .endm
+
+ .macro atk6b
+ .byte 0x6b
+ .endm
+
+ .macro atk6c
+ .byte 0x6c
+ .endm
+
+ .macro atk6d
+ .byte 0x6d
+ .endm
+
+ .macro atk6e
+ .byte 0x6e
+ .endm
+
+ .macro atk6f bank
+ .byte 0x6f
+ .byte \bank
+ .endm
+
+ .macro atk70 bank
+ .byte 0x70
+ .byte \bank
+ .endm
+
+ .macro atk71
+ .byte 0x71
+ .endm
+
+ .macro atk72 address
+ .byte 0x72
+ .4byte \address
+ .endm
+
+ .macro atk73 bank
+ .byte 0x73
+ .byte \bank
+ .endm
+
+ .macro atk74 bank
+ .byte 0x74
+ .byte \bank
+ .endm
+
+ .macro atk75
+ .byte 0x75
+ .endm
+
+ .macro atk76 bank, byte
+ .byte 0x76
+ .byte \bank
+ .byte \byte
+ .endm
+
+ .macro setprotect
+ .byte 0x77
+ .endm
+
+ .macro faintifabilitynotdamp
+ .byte 0x78
+ .endm
+
+ .macro setuserhptozero
+ .byte 0x79
+ .endm
+
+ .macro jumpwhiletargetvalid address
+ .byte 0x7a
+ .4byte \address
+ .endm
+
+ .macro setdamageasrestorehalfmaxhp address, byte
+ .byte 0x7b
+ .4byte \address
+ .byte \byte
+ .endm
+
+ .macro jumptolastusedattack
+ .byte 0x7c
+ .endm
+
+ .macro setrain
+ .byte 0x7d
+ .endm
+
+ .macro setreflect
+ .byte 0x7e
+ .endm
+
+ .macro setleechseed
+ .byte 0x7f
+ .endm
+
+ .macro manipulatedamage id
+ .byte 0x80
+ .byte \id
+ .endm
+
+ .macro setrest address
+ .byte 0x81
+ .4byte \address
+ .endm
+
+ .macro jumpifnotfirstturn address
+ .byte 0x82
+ .4byte \address
+ .endm
+
+ .macro nop3
+ .byte 0x83
+ .endm
+
+ .macro jumpifcannotsleep address
+ .byte 0x84
+ .4byte \address
+ .endm
+
+ .macro stockpile
+ .byte 0x85
+ .endm
+
+ .macro stockpiletobasedamage address
+ .byte 0x86
+ .4byte \address
+ .endm
+
+ .macro stockpiletohprecovery address
+ .byte 0x87
+ .4byte \address
+ .endm
+
+ .macro negativedamage
+ .byte 0x88
+ .endm
+
+ .macro statbuffchange target, address
+ .byte 0x89
+ .byte \target
+ .4byte \address
+ .endm
+
+ .macro normalisebuffs
+ .byte 0x8a
+ .endm
+
+ .macro setbide
+ .byte 0x8b
+ .endm
+
+ .macro confuseifrepeatingattackends
+ .byte 0x8c
+ .endm
+
+ .macro setloopcounter count
+ .byte 0x8d
+ .byte \count
+ .endm
+
+ .macro atk8e
+ .byte 0x8e
+ .endm
+
+ .macro forcerandomswitch address
+ .byte 0x8f
+ .4byte \address
+ .endm
+
+ .macro changetypestoenemyattacktype address
+ .byte 0x90
+ .4byte \address
+ .endm
+
+ .macro givemoney
+ .byte 0x91
+ .endm
+
+ .macro setlightscreen
+ .byte 0x92
+ .endm
+
+ .macro koplussomethings address
+ .byte 0x93
+ .4byte \address
+ .endm
+
+ .macro gethalfcurrentenemyhp
+ .byte 0x94
+ .endm
+
+ .macro setsandstorm
+ .byte 0x95
+ .endm
+
+ .macro weatherdamage
+ .byte 0x96
+ .endm
+
+ .macro tryinfatuatetarget address
+ .byte 0x97
+ .4byte \address
+ .endm
+
+ .macro atk98 byte
+ .byte 0x98
+ .byte \byte
+ .endm
+
+ .macro setmisteffect
+ .byte 0x99
+ .endm
+
+ .macro setincreasedcriticalchance
+ .byte 0x9a
+ .endm
+
+ .macro transformdataexecution
+ .byte 0x9b
+ .endm
+
+ .macro setsubstituteeffect
+ .byte 0x9c
+ .endm
+
+ .macro copyattack address
+ .byte 0x9d
+ .4byte \address
+ .endm
+
+ .macro metronomeeffect
+ .byte 0x9e
+ .endm
+
+ .macro nightshadedamageeffect
+ .byte 0x9f
+ .endm
+
+ .macro psywavedamageeffect
+ .byte 0xa0
+ .endm
+
+ .macro counterdamagecalculator address
+ .byte 0xa1
+ .4byte \address
+ .endm
+
+ .macro mirrorcoatdamagecalculator address
+ .byte 0xa2
+ .4byte \address
+ .endm
+
+ .macro disablelastusedattack address
+ .byte 0xa3
+ .4byte \address
+ .endm
+
+ .macro setencore address
+ .byte 0xa4
+ .4byte \address
+ .endm
+
+ .macro painsplitdamagecalculator address
+ .byte 0xa5
+ .4byte \address
+ .endm
+
+ .macro settypetorandomresistance address
+ .byte 0xa6
+ .4byte \address
+ .endm
+
+ .macro setalwayshitflag
+ .byte 0xa7
+ .endm
+
+ .macro copymovepermanently address
+ .byte 0xa8
+ .4byte \address
+ .endm
+
+ .macro selectrandommovefromusermoves address
+ .byte 0xa9
+ .4byte \address
+ .endm
+
+ .macro destinybondeffect
+ .byte 0xaa
+ .endm
+
+ .macro atkab
+ .byte 0xab
+ .endm
+
+ .macro remaininghptopower
+ .byte 0xac
+ .endm
+
+ .macro reducepprandom address
+ .byte 0xad
+ .4byte \address
+ .endm
+
+ .macro clearstatusifnotsoundproofed
+ .byte 0xae
+ .endm
+
+ .macro cursetarget address
+ .byte 0xaf
+ .4byte \address
+ .endm
+
+ .macro setspikes address
+ .byte 0xb0
+ .4byte \address
+ .endm
+
+ .macro setforesight
+ .byte 0xb1
+ .endm
+
+ .macro setperishsong address
+ .byte 0xb2
+ .4byte \address
+ .endm
+
+ .macro rolloutdamagecalculation
+ .byte 0xb3
+ .endm
+
+ .macro jumpifconfusedandattackmaxed bank, address
+ .byte 0xb4
+ .byte \bank
+ .4byte \address
+ .endm
+
+ .macro furycutterdamagecalculation
+ .byte 0xb5
+ .endm
+
+ .macro happinesstodamagecalculation
+ .byte 0xb6
+ .endm
+
+ .macro presentdamagecalculation
+ .byte 0xb7
+ .endm
+
+ .macro setsafeguard
+ .byte 0xb8
+ .endm
+
+ .macro magnitudedamagecalculation
+ .byte 0xb9
+ .endm
+
+ .macro atkba address
+ .byte 0xba
+ .4byte \address
+ .endm
+
+ .macro setsunny
+ .byte 0xbb
+ .endm
+
+ .macro maxattackhalvehp address
+ .byte 0xbc
+ .4byte \address
+ .endm
+
+ .macro copyfoestats address
+ .byte 0xbd
+ .4byte \address
+ .endm
+
+ .macro breakfree
+ .byte 0xbe
+ .endm
+
+ .macro setcurled
+ .byte 0xbf
+ .endm
+
+ .macro recoverbasedonsunlight address
+ .byte 0xc0
+ .4byte \address
+ .endm
+
+ .macro hiddenpowerdamagecalculation
+ .byte 0xc1
+ .endm
+
+ .macro selectnexttarget
+ .byte 0xc2
+ .endm
+
+ .macro setfutureattack address
+ .byte 0xc3
+ .4byte \address
+ .endm
+
+ .macro beatupcalculation address1, address2
+ .byte 0xc4
+ .4byte \address1
+ .4byte \address2
+ .endm
+
+ .macro hidepreattack
+ .byte 0xc5
+ .endm
+
+ .macro unhidepostattack
+ .byte 0xc6
+ .endm
+
+ .macro setminimize
+ .byte 0xc7
+ .endm
+
+ .macro sethail
+ .byte 0xc8
+ .endm
+
+ .macro jumpifattackandspecialattackcannotfall address
+ .byte 0xc9
+ .4byte \address
+ .endm
+
+ .macro setforcedtarget
+ .byte 0xca
+ .endm
+
+ .macro setcharge
+ .byte 0xcb
+ .endm
+
+ .macro callterrainattack
+ .byte 0xcc
+ .endm
+
+ .macro cureifburnedparalysedorpoisoned address
+ .byte 0xcd
+ .4byte \address
+ .endm
+
+ .macro settorment address
+ .byte 0xce
+ .4byte \address
+ .endm
+
+ .macro jumpifnodamage address
+ .byte 0xcf
+ .4byte \address
+ .endm
+
+ .macro settaunt address
+ .byte 0xd0
+ .4byte \address
+ .endm
+
+ .macro sethelpinghand address
+ .byte 0xd1
+ .4byte \address
+ .endm
+
+ .macro itemswap address
+ .byte 0xd2
+ .4byte \address
+ .endm
+
+ .macro copyability address
+ .byte 0xd3
+ .4byte \address
+ .endm
+
+ .macro atkd4 byte, address
+ .byte 0xd4
+ .byte \byte
+ .4byte \address
+ .endm
+
+ .macro setroots address
+ .byte 0xd5
+ .4byte \address
+ .endm
+
+ .macro doubledamagedealtifdamaged
+ .byte 0xd6
+ .endm
+
+ .macro setyawn address
+ .byte 0xd7
+ .4byte \address
+ .endm
+
+ .macro setdamagetohealthdifference address
+ .byte 0xd8
+ .4byte \address
+ .endm
+
+ .macro scaledamagebyhealthratio
+ .byte 0xd9
+ .endm
+
+ .macro abilityswap address
+ .byte 0xda
+ .4byte \address
+ .endm
+
+ .macro imprisoneffect address
+ .byte 0xdb
+ .4byte \address
+ .endm
+
+ .macro setgrudge address
+ .byte 0xdc
+ .4byte \address
+ .endm
+
+ .macro weightdamagecalculation
+ .byte 0xdd
+ .endm
+
+ .macro assistattackselect address
+ .byte 0xde
+ .4byte \address
+ .endm
+
+ .macro setmagiccoat address
+ .byte 0xdf
+ .4byte \address
+ .endm
+
+ .macro setstealstatchange address
+ .byte 0xe0
+ .4byte \address
+ .endm
+
+ .macro atke1 address
+ .byte 0xe1
+ .4byte \address
+ .endm
+
+ .macro atke2 bank
+ .byte 0xe2
+ .byte \bank
+ .endm
+
+ .macro jumpiffainted bank, address
+ .byte 0xe3
+ .byte \bank
+ .4byte \address
+ .endm
+
+ .macro naturepowereffect
+ .byte 0xe4
+ .endm
+
+ .macro pickupitemcalculation
+ .byte 0xe5
+ .endm
+
+ .macro actualcastformswitch
+ .byte 0xe6
+ .endm
+
+ .macro castformswitch
+ .byte 0xe7
+ .endm
+
+ .macro settypebasedhalvers address
+ .byte 0xe8
+ .4byte \address
+ .endm
+
+ .macro seteffectbyweather
+ .byte 0xe9
+ .endm
+
+ .macro recycleitem address
+ .byte 0xea
+ .4byte \address
+ .endm
+
+ .macro settypetoterrain address
+ .byte 0xeb
+ .4byte \address
+ .endm
+
+ .macro pursuitwhenswitched address
+ .byte 0xec
+ .4byte \address
+ .endm
+
+ .macro snatchmove
+ .byte 0xed
+ .endm
+
+ .macro removereflectlightscreen
+ .byte 0xee
+ .endm
+
+ .macro pokemoncatchfunction
+ .byte 0xef
+ .endm
+
+ .macro catchpoke
+ .byte 0xf0
+ .endm
+
+ .macro capturesomethingf1 address
+ .byte 0xf1
+ .4byte \address
+ .endm
+
+ .macro capturesomethingf2
+ .byte 0xf2
+ .endm
+
+ .macro capturesomethingf3 address
+ .byte 0xf3
+ .4byte \address
+ .endm
+
+ .macro removehp
+ .byte 0xf4
+ .endm
+
+ .macro curestatusfirstword
+ .byte 0xf5
+ .endm
+
+ .macro atkf6
+ .byte 0xf6
+ .endm
+
+ .macro activesidesomething
+ .byte 0xf7
+ .endm
+
+ .macro atkf8 bank
+ .byte 0xf8
+ .byte \bank
+ .endm
diff --git a/berry_fix/payload/asm/macros/contest_ai_script.inc b/berry_fix/payload/asm/macros/contest_ai_script.inc
new file mode 100644
index 000000000..05d70e351
--- /dev/null
+++ b/berry_fix/payload/asm/macros/contest_ai_script.inc
@@ -0,0 +1,506 @@
+@ Add a positive/negative value to the score of the move being evaluated.
+
+ .macro score score
+ .byte 0x00
+ .byte \score
+ .endm
+
+@ turn (AKA "Appeal No.")
+
+ .macro get_turn
+ .byte 0x01
+ .endm
+
+ .macro if_turn_less_than param, addr
+ .byte 0x02
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_turn_more_than param, addr
+ .byte 0x03
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_turn_eq param, addr
+ .byte 0x04
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_turn_not_eq param, addr
+ .byte 0x05
+ .byte \param
+ .4byte \addr
+ .endm
+
+@ audience excitement
+
+ .macro get_excitement
+ .byte 0x06
+ .endm
+
+ .macro if_excitement_less_than param, addr
+ .byte 0x07
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_excitement_more_than param, addr
+ .byte 0x08
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_excitement_eq param, addr
+ .byte 0x09
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_excitement_not_eq param, addr
+ .byte 0x0A
+ .byte \param
+ .4byte \addr
+ .endm
+
+@ the order that the user goes in the current turn
+
+ .macro get_user_order
+ .byte 0x0B
+ .endm
+
+ .macro if_user_order_less_than param addr
+ .byte 0x0C
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_user_order_more_than param addr
+ .byte 0x0D
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_user_order_eq param addr
+ .byte 0x0E
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_user_order_not_eq param addr
+ .byte 0x0F
+ .byte \param
+ .4byte \addr
+ .endm
+
+@ user condition
+
+ .macro get_user_condition
+ .byte 0x10
+ .endm
+
+ .macro if_user_condition_less_than param, addr
+ .byte 0x11
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_user_condition_more_than param, addr
+ .byte 0x12
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_user_condition_eq param, addr
+ .byte 0x13
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_user_condition_not_eq param, addr
+ .byte 0x14
+ .byte \param
+ .4byte \addr
+ .endm
+
+@ 15
+@ 16
+@ 17
+@ 18
+@ 19
+@ 1A
+@ 1B
+@ 1C
+@ 1D
+@ 1E
+
+@ contest type
+
+ .macro get_contest_type
+ .byte 0x1F
+ .endm
+
+ .macro if_contest_type_eq param, addr
+ .byte 0x20
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_contest_type_not_eq param, addr
+ .byte 0x21
+ .byte \param
+ .4byte \addr
+ .endm
+
+@ move excitement (change in excitement due to move)
+
+ .macro get_move_excitement
+ .byte 0x22
+ .endm
+
+ .macro if_move_excitement_less_than param, addr
+ .byte 0x23
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_move_excitement_more_than param, addr
+ .byte 0x24
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_move_excitement_eq param, addr
+ .byte 0x25
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_move_excitement_not_eq param, addr
+ .byte 0x26
+ .byte \param
+ .4byte \addr
+ .endm
+
+@ move effect
+
+ .macro get_effect
+ .byte 0x27
+ .endm
+
+ .macro if_effect_eq param, addr
+ .byte 0x28
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_effect_not_eq param, addr
+ .byte 0x29
+ .byte \param
+ .4byte \addr
+ .endm
+
+@ move effect type
+
+ .macro get_effect_type
+ .byte 0x2A
+ .endm
+
+ .macro if_effect_type_eq param, addr
+ .byte 0x2B
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_effect_type_not_eq param, addr
+ .byte 0x2C
+ .byte \param
+ .4byte \addr
+ .endm
+
+@ whether the current move is the most appealing in the user's moveset
+
+ .macro check_most_appealing_move
+ .byte 0x2D
+ .endm
+
+ .macro if_most_appealing_move addr
+ .byte 0x2E
+ .4byte \addr
+ .endm
+
+@ 2F
+@ 30
+@ 31
+@ 32
+@ 33
+@ 34
+@ 35
+@ 36
+@ 37
+@ 38
+@ 39
+@ 3A
+
+@ number of times current move has been used
+
+ .macro get_move_used_count
+ .byte 0x3B
+ .endm
+
+ .macro if_move_used_count_less_than param, addr
+ .byte 0x3C
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_move_used_count_more_than param, addr
+ .byte 0x3D
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_move_used_count_eq param, addr
+ .byte 0x3E
+ .byte \param
+ .4byte \addr
+ .endm
+
+ .macro if_move_used_count_not_eq param, addr
+ .byte 0x3F
+ .byte \param
+ .4byte \addr
+ .endm
+
+@ whether the current move is a combo starter (with another move in the moveset)
+
+ .macro check_combo_starter
+ .byte 0x40
+ .endm
+
+ .macro if_combo_starter addr
+ .byte 0x41
+ .4byte \addr
+ .endm
+
+ .macro if_not_combo_starter addr
+ .byte 0x42
+ .4byte \addr
+ .endm
+
+@ whether the current move is a combo finisher (with another move in the moveset)
+
+ .macro check_combo_finisher
+ .byte 0x43
+ .endm
+
+ .macro if_combo_finisher addr
+ .byte 0x44
+ .4byte \addr
+ .endm
+
+ .macro if_not_combo_finisher addr
+ .byte 0x45
+ .4byte \addr
+ .endm
+
+@ whether the current move would finish a combo
+
+ .macro check_would_finish_combo
+ .byte 0x46
+ .endm
+
+ .macro if_would_finish_combo addr
+ .byte 0x47
+ .4byte \addr
+ .endm
+
+ .macro if_would_not_finish_combo addr
+ .byte 0x48
+ .4byte \addr
+ .endm
+
+@ condition of mon (indexed by order)
+
+ .macro get_condition mon
+ .byte 0x49
+ .byte \mon
+ .endm
+
+ .macro if_condition_less_than mon, value, addr
+ .byte 0x4A
+ .byte \mon
+ .byte \value
+ .4byte \addr
+ .endm
+
+ .macro if_condition_more_than mon, value, addr
+ .byte 0x4B
+ .byte \mon
+ .byte \value
+ .4byte \addr
+ .endm
+
+ .macro if_condition_eq mon, value, addr
+ .byte 0x4C
+ .byte \mon
+ .byte \value
+ .4byte \addr
+ .endm
+
+ .macro if_condition_not_eq mon, value, addr
+ .byte 0x4D
+ .byte \mon
+ .byte \value
+ .4byte \addr
+ .endm
+
+@ whether the mon used a combo starter move
+@ Even though this value is always 1 or 0 (i.e. TRUE/FALSE),
+@ there are less-than and greater-than comparison operations for some reason.
+
+ .macro get_used_combo_starter mon
+ .byte 0x4E
+ .byte \mon
+ .endm
+
+ .macro if_used_combo_starter_less_than mon, value, addr
+ .byte 0x4F
+ .byte \mon
+ .byte \value
+ .4byte \addr
+ .endm
+
+ .macro if_used_combo_starter_more_than mon, value, addr
+ .byte 0x50
+ .byte \mon
+ .byte \value
+ .4byte \addr
+ .endm
+
+
+ .macro if_used_combo_starter_eq mon, value, addr
+ .byte 0x51
+ .byte \mon
+ .byte \value
+ .4byte \addr
+ .endm
+
+ .macro if_used_combo_starter_not_eq mon, value, addr
+ .byte 0x52
+ .byte \mon
+ .byte \value
+ .4byte \addr
+ .endm
+
+@ whether the mon can make an appeal
+
+ .macro check_can_participate mon
+ .byte 0x53
+ .byte \mon
+ .endm
+
+ .macro if_can_participate mon, addr
+ .byte 0x54
+ .byte \mon
+ .4byte \addr
+ .endm
+
+ .macro if_cannot_participate mon, addr
+ .byte 0x55
+ .byte \mon
+ .4byte \addr
+ .endm
+
+@ 56
+@ 57
+
+ .macro contest_58 param addr
+ .byte 0x58
+ .byte \param
+ .4byte \addr
+ .endm
+
+@ 59
+@ 5A
+@ 5B
+@ 5C
+@ 5D
+@ 5E
+@ 5F
+@ 60
+@ 61
+@ 62
+@ 63
+@ 64
+@ 65
+@ 66
+@ 67
+@ 68
+@ 69
+@ 6A
+@ 6B
+@ 6C
+@ 6D
+@ 6E
+@ 6F
+@ 70
+@ 71
+@ 72
+@ 73
+@ 74
+@ 75
+@ 76
+@ 77
+@ 78
+@ 79
+@ 7A
+@ 7B
+@ 7C
+
+ .macro if_random param addr
+ .byte 0x7D
+ .byte \param
+ .4byte \addr
+ .endm
+
+@ 7E
+
+ .macro jump addr
+ .byte 0x7F
+ .4byte \addr
+ .endm
+
+ .macro call addr
+ .byte 0x80
+ .4byte \addr
+ .endm
+
+ .macro end
+ .byte 0x81
+ .endm
+
+ .macro check_user_has_exciting_move
+ .byte 0x82
+ .endm
+
+ .macro if_user_has_exciting_move addr
+ .byte 0x83
+ .4byte \addr
+ .endm
+
+ .macro if_user_doesnt_have_exciting_move addr
+ .byte 0x84
+ .4byte \addr
+ .endm
+
+@ 85
+@ 86
+
+ .macro if_effect_in_user_moveset param addr
+ .byte 0x87
+ .2byte \param
+ .4byte \addr
+ .endm
diff --git a/berry_fix/payload/asm/macros/ec.inc b/berry_fix/payload/asm/macros/ec.inc
new file mode 100644
index 000000000..d3fd45c2f
--- /dev/null
+++ b/berry_fix/payload/asm/macros/ec.inc
@@ -0,0 +1,8 @@
+
+ .macro ec_duplicates count
+ .2byte 0xff00 + \count
+ .endm
+
+ .macro ec_words_by_letter label
+ .2byte (gEasyChatWordsByLetter_\label - gEasyChatWordsAlphabetized) / 2
+ .endm
diff --git a/berry_fix/payload/asm/macros/event.inc b/berry_fix/payload/asm/macros/event.inc
new file mode 100644
index 000000000..d805aecb5
--- /dev/null
+++ b/berry_fix/payload/asm/macros/event.inc
@@ -0,0 +1,1433 @@
+ @ Does nothing.
+ .macro nop
+ .byte 0x00
+ .endm
+
+ @ Does nothing.
+ .macro nop1
+ .byte 0x01
+ .endm
+
+ @ Terminates script execution.
+ .macro end
+ .byte 0x02
+ .endm
+
+ @ Jumps back to after the last-executed call statement, and continues script execution from there.
+ .macro return
+ .byte 0x03
+ .endm
+
+ @ Jumps to destination and continues script execution from there. The location of the calling script is remembered and can be returned to later.
+ .macro call destination
+ .byte 0x04
+ .4byte \destination
+ .endm
+
+ @ Jumps to destination and continues script execution from there.
+ .macro goto destination
+ .byte 0x05
+ .4byte \destination
+ .endm
+
+ @ If the result of the last comparison matches condition (see Comparison operators), jumps to destination and continues script execution from there.
+ .macro goto_if condition, destination
+ .byte 0x06
+ .byte \condition
+ .4byte \destination
+ .endm
+
+ @ If the result of the last comparison matches condition (see Comparison operators), calls destination.
+ .macro call_if condition, destination
+ .byte 0x07
+ .byte \condition
+ .4byte \destination
+ .endm
+
+ @ Jumps to the standard function at index function.
+ .macro gotostd function
+ .byte 0x08
+ .byte \function
+ .endm
+
+ @ Calls the standard function at index function.
+ .macro callstd function
+ .byte 0x09
+ .byte \function
+ .endm
+
+ @ If the result of the last comparison matches condition (see Comparison operators), jumps to the standard function at index function.
+ .macro gotostd_if condition, function
+ .byte 0x0a
+ .byte \condition
+ .byte \function
+ .endm
+
+ @ If the result of the last comparison matches condition (see Comparison operators), calls the standard function at index function.
+ .macro callstd_if condition, function
+ .byte 0x0b
+ .byte \condition
+ .byte \function
+ .endm
+
+ @ Executes a script stored in a default RAM location.
+ .macro gotoram
+ .byte 0x0c
+ .endm
+
+ @ Terminates script execution and "resets the script RAM".
+ .macro killscript
+ .byte 0x0d
+ .endm
+
+ @ Sets mystery event status
+ .macro setmysteryeventstatus value
+ .byte 0x0e
+ .byte \value
+ .endm
+
+ @ Sets the specified script bank to immediate value.
+ .macro loadword destination, value
+ .byte 0x0f
+ .byte \destination
+ .4byte \value
+ .endm
+
+ @ Sets the specified script bank to immediate value.
+ .macro loadbyte destination, value
+ .byte 0x10
+ .byte \destination
+ .byte \value
+ .endm
+
+ @ Sets the byte at offset to value.
+ .macro writebytetoaddr value, offset
+ .byte 0x11
+ .byte \value
+ .4byte \offset
+ .endm
+
+ @ Copies the byte value at source into the specified script bank.
+ .macro loadbytefromaddr destination, source
+ .byte 0x12
+ .byte \destination
+ .4byte \source
+ .endm
+
+ @ Not sure. Judging from XSE's description I think it takes the least-significant byte in bank source and writes it to destination.
+ .macro setptrbyte source, destination
+ .byte 0x13
+ .byte \source
+ .4byte \destination
+ .endm
+
+ @ Copies the contents of bank source into bank destination.
+ .macro copylocal destination, source
+ .byte 0x14
+ .byte \destination
+ .byte \source
+ .endm
+
+ @ Copies the byte at source to destination, replacing whatever byte was previously there.
+ .macro copybyte destination, source
+ .byte 0x15
+ .4byte \destination
+ .4byte \source
+ .endm
+
+ @ Changes the value of destination to value.
+ .macro setvar destination, value
+ .byte 0x16
+ .2byte \destination
+ .2byte \value
+ .endm
+
+ @ Changes the value of destination by adding value to it. Overflow is not prevented (0xFFFF + 1 = 0x0000).
+ .macro addvar destination, value
+ .byte 0x17
+ .2byte \destination
+ .2byte \value
+ .endm
+
+ @ Changes the value of destination by subtracting value to it. Overflow is not prevented (0x0000 - 1 = 0xFFFF).
+ .macro subvar destination, value
+ .byte 0x18
+ .2byte \destination
+ .2byte \value
+ .endm
+
+ @ Copies the value of source into destination.
+ .macro copyvar destination, source
+ .byte 0x19
+ .2byte \destination
+ .2byte \source
+ .endm
+
+ @ If source is not a variable, then this function acts like setvar. Otherwise, it acts like copyvar.
+ .macro setorcopyvar destination, source
+ .byte 0x1a
+ .2byte \destination
+ .2byte \source
+ .endm
+
+ @ Compares the values of script banks a and b, after forcing the values to bytes.
+ .macro compare_local_to_local byte1, byte2
+ .byte 0x1b
+ .byte \byte1
+ .byte \byte2
+ .endm
+
+ @ Compares the least-significant byte of the value of script bank a to a fixed byte value (b).
+ .macro compare_local_to_value a, b
+ .byte 0x1c
+ .byte \a
+ .byte \b
+ .endm
+
+ @ Compares the least-significant byte of the value of script bank a to the byte located at offset b.
+ .macro compare_local_to_addr a, b
+ .byte 0x1d
+ .byte \a
+ .4byte \b
+ .endm
+
+ @ Compares the byte located at offset a to the least-significant byte of the value of script bank b.
+ .macro compare_addr_to_local a, b
+ .byte 0x1e
+ .4byte \a
+ .byte \b
+ .endm
+
+ @ Compares the byte located at offset a to a fixed byte value (b).
+ .macro compare_addr_to_value a, b
+ .byte 0x1f
+ .4byte \a
+ .byte \b
+ .endm
+
+ @ Compares the byte located at offset a to the byte located at offset b.
+ .macro compare_addr_to_addr a, b
+ .byte 0x20
+ .4byte \a
+ .4byte \b
+ .endm
+
+ @ Compares the value of `var` to a fixed word value (b).
+ .macro compare_var_to_value var, value
+ .byte 0x21
+ .2byte \var
+ .2byte \value
+ .endm
+
+ @ Compares the value of `var` to the value of `var2`.
+ .macro compare_var_to_var var1, var2
+ .byte 0x22
+ .2byte \var1
+ .2byte \var2
+ .endm
+
+ @ Generic compare macro which attempts to deduce argument types based on their values
+ @ Any values between 0x4000 to 0x4FFF and 0x8000 to 0x8FFF are considered event variable identifiers
+ .macro compare arg1, arg2
+ .if ((\arg1 >> 12) == 4 || (\arg1 >> 12) == 8) && ((\arg2 >> 12) == 4 || (\arg2 >> 12) == 8)
+ compare_var_to_var \arg1, \arg2
+ .elseif ((\arg1 >> 12) == 4 || (\arg1 >> 12) == 8) && (\arg2 >= 0 && \arg2 <= 0xFFFF)
+ compare_var_to_value \arg1, \arg2
+ .else
+ .error "Invalid arguments for 'compare'"
+ .endif
+ .endm
+
+ @ Calls the native C function stored at `func`.
+ .macro callnative func
+ .byte 0x23
+ .4byte \func
+ .endm
+
+ @ Replaces the script with the function stored at `func`. Execution returns to the bytecode script when func returns TRUE.
+ .macro gotonative func
+ .byte 0x24
+ .4byte \func
+ .endm
+
+ @ Calls a special function; that is, a piece of ASM code designed for use by scripts and listed in a table of pointers.
+ .macro special function
+ .byte 0x25
+ .2byte SPECIAL_\function
+ .endm
+
+ @ Calls a special function. That function's output (if any) will be written to the variable you specify.
+ .macro specialvar output, function
+ .byte 0x26
+ .2byte \output
+ .2byte SPECIAL_\function
+ .endm
+
+ @ Blocks script execution until a command or ASM code manually unblocks it. Generally used with specific commands and specials. If this command runs, and a subsequent command or piece of ASM does not unblock state, the script will remain blocked indefinitely (essentially a hang).
+ .macro waitstate
+ .byte 0x27
+ .endm
+
+ @ Blocks script execution for time (frames? milliseconds?).
+ .macro delay time
+ .byte 0x28
+ .2byte \time
+ .endm
+
+ @ Sets a to 1.
+ .macro setflag a
+ .byte 0x29
+ .2byte \a
+ .endm
+
+ @ Sets a to 0.
+ .macro clearflag a
+ .byte 0x2a
+ .2byte \a
+ .endm
+
+ @ Compares a to 1.
+ .macro checkflag a
+ .byte 0x2b
+ .2byte \a
+ .endm
+
+ @ In FireRed, this command is a nop.
+ .macro initclock hour minute
+ .byte 0x2c
+ .endm
+
+ @ In FireRed, this command is a nop.
+ .macro dodailyevents
+ .byte 0x2d
+ .endm
+
+ @ Resets the values of variables 0x8000, 0x8001, and 0x8002.
+ .macro gettime
+ .byte 0x2e
+ .endm
+
+ @ Plays the specified (sound_number) sound. Only one sound may play at a time, with newer ones interrupting older ones.
+ .macro playse sound_number
+ .byte 0x2f
+ .2byte \sound_number
+ .endm
+
+ @ Blocks script execution until the currently-playing sound (triggered by sound) finishes playing.
+ .macro waitse
+ .byte 0x30
+ .endm
+
+ @ Plays the specified (fanfare_number) fanfare.
+ .macro playfanfare fanfare_number
+ .byte 0x31
+ .2byte \fanfare_number
+ .endm
+
+ @ Blocks script execution until all currently-playing fanfares finish.
+ .macro waitfanfare
+ .byte 0x32
+ .endm
+
+ @ Plays the specified (song_number) song. The byte is apparently supposed to be 0x00.
+ .macro playbgm song_number, unknown
+ .byte 0x33
+ .2byte \song_number
+ .byte \unknown
+ .endm
+
+ @ Plays the specified (song_number) song.
+ .macro savebgm song_number
+ .byte 0x34
+ .2byte \song_number
+ .endm
+
+ @ Crossfades the currently-playing song into the map's default song.
+ .macro fadedefaultbgm
+ .byte 0x35
+ .endm
+
+ @ Crossfades the currently-playng song into the specified (song_number) song.
+ .macro fadenewbgm song_number
+ .byte 0x36
+ .2byte \song_number
+ .endm
+
+ @ Fades out the currently-playing song.
+ .macro fadeoutbgm speed
+ .byte 0x37
+ .byte \speed
+ .endm
+
+ @ Fades the currently-playing song back in.
+ .macro fadeinbgm speed
+ .byte 0x38
+ .byte \speed
+ .endm
+
+ @ Sends the player to Warp warp on Map bank.map. If the specified warp is 0xFF, then the player will instead be sent to (X, Y) on the map.
+ .macro warp map, warp, X, Y
+ .byte 0x39
+ map \map
+ .byte \warp
+ .2byte \X
+ .2byte \Y
+ .endm
+
+ @ Clone of warp that does not play a sound effect.
+ .macro warpsilent map, warp, X, Y
+ .byte 0x3a
+ map \map
+ .byte \warp
+ .2byte \X
+ .2byte \Y
+ .endm
+
+ @ Clone of warp that uses "a walking effect".
+ .macro warpdoor map, warp, X, Y
+ .byte 0x3b
+ map \map
+ .byte \warp
+ .2byte \X
+ .2byte \Y
+ .endm
+
+ @ Warps the player to another map using a hole animation.
+ .macro warphole map
+ .byte 0x3c
+ map \map
+ .endm
+
+ @ Clone of warp that uses a teleport effect. It is apparently only used in R/S/E.[source]
+ .macro warpteleport map, warp, X, Y
+ .byte 0x3d
+ map \map
+ .byte \warp
+ .2byte \X
+ .2byte \Y
+ .endm
+
+ @ Clone of warp. Used by an (unused?) Safari Zone script to return the player to the gatehouse and end the Safari Game.
+ .macro setwarp map, warp, X, Y
+ .byte 0x3e
+ map \map
+ .byte \warp
+ .2byte \X
+ .2byte \Y
+ .endm
+
+ @ Sets a default warp place. If a warp tries to send the player to Warp 127 on Map 127.127, they will instead be sent here. Useful when a map has warps that need to go to script-controlled locations (i.e. elevators).
+ .macro setdynamicwarp map, warp, X, Y
+ .byte 0x3f
+ map \map
+ .byte \warp
+ .2byte \X
+ .2byte \Y
+ .endm
+
+ @ Clone of warp3, except that this writes data to different offsets...
+ .macro setdivewarp map, warp, X, Y
+ .byte 0x40
+ map \map
+ .byte \warp
+ .2byte \X
+ .2byte \Y
+ .endm
+
+ @ Clone of warp3, except that this writes data to different offsets...
+ .macro setholewarp map, warp, X, Y
+ .byte 0x41
+ map \map
+ .byte \warp
+ .2byte \X
+ .2byte \Y
+ .endm
+
+ @ Retrieves the player's zero-indexed X- and Y-coordinates in the map, and stores them in the specified variables.
+ .macro getplayerxy X, Y
+ .byte 0x42
+ .2byte \X
+ .2byte \Y
+ .endm
+
+ @ Retrieves the number of Pokmon in the player's party, and stores that number in variable 0x800D (LASTRESULT).
+ .macro countpokemon
+ .byte 0x43
+ .endm
+
+ @ Attempts to add quantity of item index to the player's Bag. If the player has enough room, the item will be added and variable 0x800D (LASTRESULT) will be set to 0x0001; otherwise, LASTRESULT is set to 0x0000.
+ .macro additem index, quantity
+ .byte 0x44
+ .2byte \index
+ .2byte \quantity
+ .endm
+
+ @ Removes quantity of item index from the player's Bag.
+ .macro removeitem index, quantity
+ .byte 0x45
+ .2byte \index
+ .2byte \quantity
+ .endm
+
+ @ Checks if the player has enough space in their Bag to hold quantity more of item index. Sets variable 0x800D (LASTRESULT) to 0x0001 if there is room, or 0x0000 is there is no room.
+ .macro checkitemspace index, quantity
+ .byte 0x46
+ .2byte \index
+ .2byte \quantity
+ .endm
+
+ @ Checks if the player has quantity or more of item index in their Bag. Sets variable 0x800D (LASTRESULT) to 0x0001 if the player has enough of the item, or 0x0000 if they have fewer than quantity of the item.
+ .macro checkitem index, quantity
+ .byte 0x47
+ .2byte \index
+ .2byte \quantity
+ .endm
+
+ @ Checks which Bag pocket the specified (index) item belongs in, and writes the value to variable 0x800D (LASTRESULT). This script is used to show the name of the proper Bag pocket when the player receives an item via callstd (simplified to giveitem in XSE).
+ .macro checkitemtype index
+ .byte 0x48
+ .2byte \index
+ .endm
+
+ @ Adds a quantity amount of item index to the player's PC. Both arguments can be variables.
+ .macro givepcitem index, quantity
+ .byte 0x49
+ .2byte \index
+ .2byte \quantity
+ .endm
+
+ @ Checks for quantity amount of item index in the player's PC. Both arguments can be variables.
+ .macro checkpcitem index, quantity
+ .byte 0x4a
+ .2byte \index
+ .2byte \quantity
+ .endm
+
+ @ In FireRed, this command is a nop. (The argument is read, but not used for anything.)
+ .macro adddecor decoration
+ .byte 0x4b
+ .2byte \decoration
+ .endm
+
+ @ In FireRed, this command is a nop. (The argument is read, but not used for anything.)
+ .macro removedecor decoration
+ .byte 0x4c
+ .2byte \decoration
+ .endm
+
+ @ In FireRed, this command is a nop. (The argument is read, but not used for anything.)
+ .macro hasdecor decoration
+ .byte 0x4d
+ .2byte \decoration
+ .endm
+
+ @ In FireRed, this command is a nop. (The argument is read, but not used for anything.)
+ .macro checkdecor decoration
+ .byte 0x4e
+ .2byte \decoration
+ .endm
+
+ @ Applies the movement data at movements to the specified (index) Person event. Also closes any standard message boxes that are still open.
+ @ This command in fact uses variables to access the Person event ID. So, for example, if you setvar 0x8000 to 0x3, and then use applymovementpos 0x8000 @move1, Person event 3 will have the movements at @move1 applied to them. Thank you Shiny Quagsire for bringing this to my attention.
+ .macro applymovement index, movements, mapGroup, mapNum
+ .ifb \mapGroup
+ .byte 0x4f
+ .2byte \index
+ .4byte \movements
+ .else
+ .byte 0x50
+ .2byte \index
+ .4byte \movements
+ .byte \mapGroup
+ .byte \mapNum
+ .endif
+ .endm
+
+ @ Blocks script execution until the movements being applied to the specified (index) Person event finish. If the specified Person event is 0x0000, then the command will block script execution until all Person events affected by applymovement finish their movements. If the specified Person event is not currently being manipulated with applymovement, then this command does nothing.
+ .macro waitmovement index, mapBank, mapNum
+ .ifb \mapBank
+ .byte 0x51
+ .2byte \index
+ .else
+ .byte 0x52
+ .2byte \index
+ .byte \mapBank
+ .byte \mapNum
+ .endif
+ .endm
+
+ @ Attempts to hide the specified (local_ID, a local ID) Person event on the specified map, by setting its visibility flag if it has a valid one. If the Person does not have a valid visibility flag, this command does nothing.
+ @ If no map is specified, then the current map is used
+ .macro removeobject localId, mapGroup, mapNum
+ .ifb \mapGroup
+ .byte 0x53
+ .2byte \localId
+ .else
+ .byte 0x54
+ .2byte \localId
+ .byte \mapGroup
+ .byte \mapNum
+ .endif
+ .endm
+
+ .macro addobject localId, mapGroup, mapNum
+ .ifb \mapGroup
+ .byte 0x55
+ .2byte \localId
+ .else
+ .byte 0x56
+ .2byte \localId
+ .byte \mapGroup
+ .byte \mapNum
+ .endif
+ .endm
+
+ @ Sets the specified (index) Object's position on the current map.
+ .macro setobjectxy index, x, y
+ .byte 0x57
+ .2byte \index
+ .2byte \x
+ .2byte \y
+ .endm
+
+ .macro showobject index, map
+ .byte 0x58
+ .2byte \index
+ map \map
+ .endm
+
+ .macro hideobject index, map
+ .byte 0x59
+ .2byte \index
+ map \map
+ .endm
+
+ @ If the script was called by an Object, then that Object will turn to face toward the metatile that the player is standing on.
+ .macro faceplayer
+ .byte 0x5a
+ .endm
+
+ .macro turnobject index, direction
+ .byte 0x5b
+ .2byte \index
+ .byte \direction
+ .endm
+
+ @ If the Trainer flag for Trainer index is not set, this command does absolutely nothing.
+ .macro trainerbattle type, trainer, word, pointer1, pointer2, pointer3, pointer4
+ .byte 0x5c
+ .byte \type
+ .2byte \trainer
+ .2byte \word
+ .if \type == 0
+ .4byte \pointer1 @ text
+ .4byte \pointer2 @ text
+ .elseif \type == 1
+ .4byte \pointer1 @ text
+ .4byte \pointer2 @ text
+ .4byte \pointer3 @ event script
+ .elseif \type == 2
+ .4byte \pointer1 @ text
+ .4byte \pointer2 @ text
+ .4byte \pointer3 @ event script
+ .elseif \type == 3
+ .4byte \pointer1 @ text
+ .elseif \type == 4
+ .4byte \pointer1 @ text
+ .4byte \pointer2 @ text
+ .4byte \pointer3 @ text
+ .elseif \type == 5
+ .4byte \pointer1 @ text
+ .4byte \pointer2 @ text
+ .elseif \type == 6
+ .4byte \pointer1 @ text
+ .4byte \pointer2 @ text
+ .4byte \pointer3 @ text
+ .4byte \pointer4 @ event script
+ .elseif \type == 7
+ .4byte \pointer1 @ text
+ .4byte \pointer2 @ text
+ .4byte \pointer3 @ text
+ .elseif \type == 8
+ .4byte \pointer1 @ text
+ .4byte \pointer2 @ text
+ .4byte \pointer3 @ text
+ .4byte \pointer4 @ event script
+ .endif
+ .endm
+
+
+ @ Starts a trainer battle using the battle information stored in RAM (usually by trainerbattle, which actually calls this command behind-the-scenes), and blocks script execution until the battle finishes.
+ .macro battlebegin
+ .byte 0x5d
+ .endm
+
+ .macro ontrainerbattleend
+ .byte 0x5e
+ .endm
+
+ .macro ontrainerbattleendgoto
+ .byte 0x5f
+ .endm
+
+ @ Compares Flag (trainer + 0x500) to 1. (If the flag is set, then the trainer has been defeated by the player.)
+ .macro checktrainerflag trainer
+ .byte 0x60
+ .2byte \trainer
+ .endm
+
+ @ Sets Flag (trainer + 0x500). (I didn't make a mistake. The command names actually are backwards.)
+ .macro settrainerflag trainer
+ .byte 0x61
+ .2byte \trainer
+ .endm
+
+ @ Clears Flag (trainer + 0x500). (I didn't make a mistake. The command names actually are backwards.)
+ .macro cleartrainerflag trainer
+ .byte 0x62
+ .2byte \trainer
+ .endm
+
+ .macro setobjectxyperm index, x, y
+ .byte 0x63
+ .2byte \index
+ .2byte \x
+ .2byte \y
+ .endm
+
+ .macro moveobjectoffscreen index
+ .byte 0x64
+ .2byte \index
+ .endm
+
+ .macro setobjectmovementtype word, byte
+ .byte 0x65
+ .2byte \word
+ .byte \byte
+ .endm
+
+ @ If a standard message box (or its text) is being drawn on-screen, this command blocks script execution until the box and its text have been fully drawn.
+ .macro waitmessage
+ .byte 0x66
+ .endm
+
+ @ Starts displaying a standard message box containing the specified text. If text is a pointer, then the string at that offset will be loaded and used. If text is script bank 0, then the value of script bank 0 will be treated as a pointer to the text. (You can use loadpointer to place a string pointer in a script bank.)
+ .macro message text
+ .byte 0x67
+ .4byte \text
+ .endm
+
+ @ Holds the current message box open until the player presses a key. The message box is then closed.
+ .macro closemessage
+ .byte 0x68
+ .endm
+
+ @ Ceases movement for all Objects on-screen.
+ .macro lockall
+ .byte 0x69
+ .endm
+
+ @ If the script was called by an Object, then that Object's movement will cease.
+ .macro lock
+ .byte 0x6a
+ .endm
+
+ @ Resumes normal movement for all Objects on-screen, and closes any standard message boxes that are still open.
+ .macro releaseall
+ .byte 0x6b
+ .endm
+
+ @ If the script was called by an Object, then that Object's movement will resume. This command also closes any standard message boxes that are still open.
+ .macro release
+ .byte 0x6c
+ .endm
+
+ @ Blocks script execution until the player presses any key.
+ .macro waitbuttonpress
+ .byte 0x6d
+ .endm
+
+ @ Displays a YES/NO multichoice box at the specified coordinates, and blocks script execution until the user makes a selection. Their selection is stored in variable 0x800D (LASTRESULT); 0x0000 for "NO" or if the user pressed B, and 0x0001 for "YES".
+ .macro yesnobox x, y
+ .byte 0x6e
+ .byte \x
+ .byte \y
+ .endm
+
+ @ Displays a multichoice box from which the user can choose a selection, and blocks script execution until a selection is made. Lists of options are predefined and the one to be used is specified with list. If b is set to a non-zero value, then the user will not be allowed to back out of the multichoice with the B button.
+ .macro multichoice x, y, list, b
+ .byte 0x6f
+ .byte \x
+ .byte \y
+ .byte \list
+ .byte \b
+ .endm
+
+ @ Displays a multichoice box from which the user can choose a selection, and blocks script execution until a selection is made. Lists of options are predefined and the one to be used is specified with list. The default argument determines the initial position of the cursor when the box is first opened; it is zero-indexed, and if it is too large, it is treated as 0x00. If b is set to a non-zero value, then the user will not be allowed to back out of the multichoice with the B button.
+ .macro multichoicedefault x, y, list, default, b
+ .byte 0x70
+ .byte \x
+ .byte \y
+ .byte \list
+ .byte \default
+ .byte \b
+ .endm
+
+ @ Displays a multichoice box from which the user can choose a selection, and blocks script execution until a selection is made. Lists of options are predefined and the one to be used is specified with list. The per_row argument determines how many list items will be shown on a single row of the box.
+ .macro multichoicegrid x, y, list, per_row, B
+ .byte 0x71
+ .byte \x
+ .byte \y
+ .byte \list
+ .byte \per_row
+ .byte \B
+ .endm
+
+ .macro drawbox
+ .byte 0x72
+ .endm
+
+ .macro erasebox byte1, byte2, byte3, byte4
+ .byte 0x73
+ .byte \byte1
+ .byte \byte2
+ .byte \byte3
+ .byte \byte4
+ .endm
+
+ .macro drawboxtext
+ .byte 0x74
+ .endm
+
+ @ Displays a box containing the front sprite for the specified (species) Pokemon species.
+ .macro drawmonpic species, x, y
+ .byte 0x75
+ .2byte \species
+ .byte \x
+ .byte \y
+ .endm
+
+ @ Hides all boxes displayed with drawmonpic.
+ .macro erasemonpic
+ .byte 0x76
+ .endm
+
+ @ Draws an image of the winner of the contest. In FireRed, this command is a nop. (The argument is discarded.)
+ .macro drawcontestwinner a
+ .byte 0x77
+ .byte \a
+ .endm
+
+ @ Displays the string at pointer as braille text in a standard message box. The string must be formatted to use braille characters.
+ .macro braillemessage text
+ .byte 0x78
+ .4byte \text
+ .endm
+
+ @ Gives the player one of the specified (species) Pokmon at level level holding item. The unknown arguments should all be zeroes.
+ .macro givepoke species, level, item, unknown1, unknown2, unknown3
+ .byte 0x79
+ .2byte \species
+ .byte \level
+ .2byte \item
+ .4byte \unknown1
+ .4byte \unknown2
+ .byte \unknown3
+ .endm
+
+ .macro giveegg species
+ .byte 0x7a
+ .2byte \species
+ .endm
+
+ .macro setpokemove byte1, byte2, word
+ .byte 0x7b
+ .byte \byte1
+ .byte \byte2
+ .2byte \word
+ .endm
+
+ @ Checks if at least one Pokémon in the player's party knows the specified (index) attack. If so, variable 0x800D (LASTRESULT) is set to the (zero-indexed) slot number of the first Pokémon that knows the move. If not, LASTRESULT is set to 0x0006. Variable 0x8004 is also set to this Pokémon's species.
+ .macro checkpartymove index
+ .byte 0x7c
+ .2byte \index
+ .endm
+
+ @ Writes the name of the Pokemon at index species to the specified buffer.
+ .macro getspeciesname out, species
+ .byte 0x7d
+ .byte \out
+ .2byte \species
+ .endm
+
+ @ Writes the name of the species of the first Pokémon in the player's party to the specified buffer.
+ .macro getfirstpartypokename out
+ .byte 0x7e
+ .byte \out
+ .endm
+
+ @ Writes the nickname of the Pokemon in slot slot (zero-indexed) of the player's party to the specified buffer. If an empty or invalid slot is specified, ten spaces ("") are written to the buffer.
+ .macro getpartypokename out, slot
+ .byte 0x7f
+ .byte \out
+ .2byte \slot
+ .endm
+
+ @ Writes the name of the item at index item to the specified buffer. If the specified index is larger than the number of items in the game (0x176), the name of item 0 ("????????") is buffered instead.
+ .macro getitemname out, item
+ .byte 0x80
+ .byte \out
+ .2byte \item
+ .endm
+
+ @ Writes the name of the decoration at index decoration to the specified buffer. In FireRed, this command is a nop.
+ .macro getdecorname out, decoration
+ .byte 0x81
+ .byte \out
+ .2byte \decoration
+ .endm
+
+ @ Writes the name of the move at index move to the specified buffer.
+ .macro getmovename out, move
+ .byte 0x82
+ .byte \out
+ .2byte \move
+ .endm
+
+ @ Converts the value of input to a decimal string, and writes that string to the specified buffer.
+ .macro getnumberstring out, input
+ .byte 0x83
+ .byte \out
+ .2byte \input
+ .endm
+
+ @ Writes the standard string identified by index to the specified buffer. This command has no protections in place at all, so specifying an invalid standard string (e.x. 0x2B) can and usually will cause data corruption.
+ .macro getstdstring out, index
+ .byte 0x84
+ .byte \out
+ .2byte \index
+ .endm
+
+ @ Copies the string at offset to the specified buffer.
+ .macro getstring out, offset
+ .byte 0x85
+ .byte \out
+ .4byte \offset
+ .endm
+
+ @ Opens the Pokemart system, offering the specified products for sale.
+ .macro pokemart products
+ .byte 0x86
+ .4byte \products
+ .endm
+
+ @ Apparent clone of pokemart.
+ .macro pokemartdecor products
+ .byte 0x87
+ .4byte \products
+ .endm
+
+ @ Apparent clone of pokemart.
+ .macro pokemartbp products
+ .byte 0x88
+ .4byte \products
+ .endm
+
+ @ Starts up the slot machine minigame.
+ .macro playslotmachine word
+ .byte 0x89
+ .2byte \word
+ .endm
+
+ @ In FireRed, this command is a nop.
+ .macro plantberrytree
+ .byte 0x8a
+ .endm
+
+ @ In FireRed, this command sets the byte at 0x03000EA8 to 0x01. I do not know what that means.
+ .macro choosecontestpkmn
+ .byte 0x8b
+ .endm
+
+ @ In FireRed, this command is a nop.
+ .macro startcontest
+ .byte 0x8c
+ .endm
+
+ @ In FireRed, this command is a nop.
+ .macro showcontestresults
+ .byte 0x8d
+ .endm
+
+ @ In FireRed, this command is a nop.
+ .macro contestlinktransfer
+ .byte 0x8e
+ .endm
+
+ @ Stores a random integer between 0 and limit in variable 0x800D (LASTRESULT).
+ .macro random limit
+ .byte 0x8f
+ .2byte \limit
+ .endm
+
+ @ If check is 0x00, this command adds value to the player's money.
+ .macro givemoney value, check
+ .byte 0x90
+ .4byte \value
+ .byte \check
+ .endm
+
+ @ If check is 0x00, this command subtracts value from the player's money.
+ .macro takemoney value, check
+ .byte 0x91
+ .4byte \value
+ .byte \check
+ .endm
+
+ @ If check is 0x00, this command will check if the player has value or more money; script variable 0x800D (LASTRESULT) is set to 0x0001 if the player has enough money, or 0x0000 if the do not.
+ .macro checkmoney value, check
+ .byte 0x92
+ .4byte \value
+ .byte \check
+ .endm
+
+ @ Spawns a secondary box showing how much money the player has.
+ .macro showmoneybox x, y, check
+ .byte 0x93
+ .byte \x
+ .byte \y
+ .byte \check
+ .endm
+
+ @ Hides the secondary box spawned by showmoney.
+ .macro hidemoneybox
+ .byte 0x94
+ .endm
+
+ @ Updates the secondary box spawned by showmoney. Consumes but does not use arguments.
+ .macro updatemoneybox x, y, check
+ .byte 0x95
+ .byte \x
+ .byte \y
+ .byte \check
+ .endm
+
+ @ In FireRed, this command is a nop.
+ .macro getpricereduction
+ .byte 0x96
+ .endm
+
+ @ Fades the screen to black or back, using the specified effect. Effect 0x00 fades in, and effect 0x01 fades out. I don't know if other effects exist.
+ .macro fadescreen effect
+ .byte 0x97
+ .byte \effect
+ .endm
+
+ @ Fades the screen to and from black and white. Mode 0x00 fades from black, mode 0x01 fades out to black, mode 0x2 fades in from white, and mode 0x3 fades out to white. Other modes may exist.
+ .macro fadescreenspeed effect, speed
+ .byte 0x98
+ .byte \effect
+ .byte \speed
+ .endm
+
+ .macro setflashradius word
+ .byte 0x99
+ .2byte \word
+ .endm
+
+ .macro animateflash byte
+ .byte 0x9a
+ .byte \byte
+ .endm
+
+ .macro messageautoscroll pointer
+ .byte 0x9b
+ .4byte \pointer
+ .endm
+
+ @ Executes the specified field move animation.
+ .macro dofieldeffect animation
+ .byte 0x9c
+ .2byte \animation
+ .endm
+
+ @ Sets up the field effect argument argument with the value value.
+ .macro setfieldeffectarg argument, param
+ .byte 0x9d
+ .byte \argument
+ .2byte \param
+ .endm
+
+ @ Blocks script execution until all playing field move animations complete.
+ .macro waitfieldeffect animation
+ .byte 0x9e
+ .2byte \animation
+ .endm
+
+ @ Sets which healing place the player will return to if all of the Pokemon in their party faint.
+ .macro setrespawn flightspot
+ .byte 0x9f
+ .2byte \flightspot
+ .endm
+
+ @ Checks the player's gender. If male, then 0x0000 is stored in variable 0x800D (LASTRESULT). If female, then 0x0001 is stored in LASTRESULT.
+ .macro checkplayergender
+ .byte 0xa0
+ .endm
+
+ @ Plays the specified (species) Pokemon's cry. You can use waitcry to block script execution until the sound finishes.
+ .macro playmoncry species, effect
+ .byte 0xa1
+ .2byte \species
+ .2byte \effect
+ .endm
+
+ @ Changes the metatile at (x, y) on the current map.
+ .macro setmetatile x, y, metatile_number, tile_attrib
+ .byte 0xa2
+ .2byte \x
+ .2byte \y
+ .2byte \metatile_number
+ .2byte \tile_attrib
+ .endm
+
+ @ Queues a weather change to the default weather for the map.
+ .macro resetweather
+ .byte 0xa3
+ .endm
+
+ @ Queues a weather change to type weather.
+ .macro setweather type
+ .byte 0xa4
+ .2byte \type
+ .endm
+
+ @ Executes the weather change queued with resetweather or setweather. The current weather will smoothly fade into the queued weather.
+ .macro doweather
+ .byte 0xa5
+ .endm
+
+ @ This command manages cases in which maps have tiles that change state when stepped on (specifically, cracked/breakable floors).
+ .macro setstepcallback subroutine
+ .byte 0xa6
+ .byte \subroutine
+ .endm
+
+ .macro setmaplayoutindex index
+ .byte 0xa7
+ .2byte \index
+ .endm
+
+ .macro setobjectpriority index, map, priority
+ .byte 0xa8
+ .2byte \index
+ map \map
+ .byte \priority
+ .endm
+
+ .macro resetobjectpriority index, map
+ .byte 0xa9
+ .2byte \index
+ map \map
+ .endm
+
+ .macro createvobject sprite, byte2, x, y, elevation, direction
+ .byte 0xaa
+ .byte \sprite
+ .byte \byte2
+ .2byte \x
+ .2byte \y
+ .byte \elevation
+ .byte \direction
+ .endm
+
+ .macro turnvobject index, direction
+ .byte 0xab
+ .byte \index
+ .byte \direction
+ .endm
+
+ @ Opens the door metatile at (X, Y) with an animation.
+ .macro opendoor x, y
+ .byte 0xac
+ .2byte \x
+ .2byte \y
+ .endm
+
+ @ Closes the door metatile at (X, Y) with an animation.
+ .macro closedoor x, y
+ .byte 0xad
+ .2byte \x
+ .2byte \y
+ .endm
+
+ @ Waits for the door animation started with opendoor or closedoor to finish.
+ .macro waitdooranim
+ .byte 0xae
+ .endm
+
+ @ Sets the door tile at (x, y) to be open without an animation.
+ .macro setdooropen x, y
+ .byte 0xaf
+ .2byte \x
+ .2byte \y
+ .endm
+
+ @ Sets the door tile at (x, y) to be closed without an animation.
+ .macro setdoorclosed2 x, y
+ .byte 0xb0
+ .2byte \x
+ .2byte \y
+ .endm
+
+ @ In Emerald, this command consumes its parameters and does nothing. In FireRed, this command is a nop.
+ .macro addelevmenuitem a, b, c, d
+ .byte 0xb1
+ .byte \a
+ .2byte \b
+ .2byte \c
+ .2byte \d
+ .endm
+
+ @ In FireRed and Emerald, this command is a nop.
+ .macro showelevmenu
+ .byte 0xb2
+ .endm
+
+ .macro checkcoins out
+ .byte 0xb3
+ .2byte \out
+ .endm
+
+ .macro givecoins count
+ .byte 0xb4
+ .2byte \count
+ .endm
+
+ .macro takecoins word
+ .byte 0xb5
+ .2byte \word
+ .endm
+
+ @ Prepares to start a wild battle against a species at Level level holding item. Running this command will not affect normal wild battles. You start the prepared battle with dowildbattle.
+ .macro setwildbattle species, level, item
+ .byte 0xb6
+ .2byte \species
+ .byte \level
+ .2byte \item
+ .endm
+
+ @ Starts a wild battle against the Pokemon generated by setwildbattle. Blocks script execution until the battle finishes.
+ .macro dowildbattle
+ .byte 0xb7
+ .endm
+
+ .macro setvaddress long, word
+ .byte 0xb8
+ .4byte \long
+ .2byte \word
+ .endm
+
+ .macro vgoto pointer
+ .byte 0xb9
+ .4byte \pointer
+ .endm
+
+ .macro vcall pointer
+ .byte 0xba
+ .4byte \pointer
+ .endm
+
+ .macro vgoto_if byte, pointer
+ .byte 0xbb
+ .byte \byte
+ .4byte \pointer
+ .endm
+
+ .macro vcall_if byte, pointer
+ .byte 0xbc
+ .byte \byte
+ .4byte \pointer
+ .endm
+
+ .macro vmessage pointer
+ .byte 0xbd
+ .4byte \pointer
+ .endm
+
+ .macro vloadptr pointer
+ .byte 0xbe
+ .4byte \pointer
+ .endm
+
+ .macro vbufferstring byte, pointer
+ .byte 0xbf
+ .byte \byte
+ .4byte \pointer
+ .endm
+
+ @ Spawns a secondary box showing how many Coins the player has.
+ .macro showcoinsbox x, y
+ .byte 0xc0
+ .byte \x
+ .byte \y
+ .endm
+
+ @ Hides the secondary box spawned by showcoins. It consumes its arguments but doesn't use them.
+ .macro hidecoinsbox x, y
+ .byte 0xc1
+ .byte \x
+ .byte \y
+ .endm
+
+ @ Updates the secondary box spawned by showcoins. It consumes its arguments but doesn't use them.
+ .macro updatecoinsbox x, y
+ .byte 0xc2
+ .byte \x
+ .byte \y
+ .endm
+
+ @ Increases the value of the specified game stat by 1. The stat's value will not be allowed to exceed 0x00FFFFFF.
+ .macro incrementgamestat stat
+ .byte 0xc3
+ .byte \stat
+ .endm
+
+ @ Sets the destination that using an Escape Rope or Dig will take the player to.
+ .macro setescapewarp map, warp, x, y
+ .byte 0xc4
+ map \map
+ .byte \warp
+ .2byte \x
+ .2byte \y
+ .endm
+
+ @ Blocks script execution until cry finishes.
+ .macro waitmoncry
+ .byte 0xc5
+ .endm
+
+ @ Writes the name of the specified (box) PC box to the specified buffer.
+ .macro bufferboxname out, box
+ .byte 0xc6
+ .byte \out
+ .2byte \box
+ .endm
+
+ @ Sets the color of the text in standard message boxes. 0x00 produces blue (male) text, 0x01 produces red (female) text, 0xFF resets the color to the default for the current OW's gender, and all other values produce black text.
+ .macro textcolor color
+ .byte 0xc7
+ .byte \color
+ .endm
+
+ @ The exact purpose of this command is unknown, but it is related to the blue help-text box that appears on the bottom of the screen when the Main Menu is opened.
+ .macro loadhelp pointer
+ .byte 0xc8
+ .4byte \pointer
+ .endm
+
+ @ The exact purpose of this command is unknown, but it is related to the blue help-text box that appears on the bottom of the screen when the Main Menu is opened.
+ .macro unloadhelp
+ .byte 0xc9
+ .endm
+
+ @ After using this command, all standard message boxes will use the signpost frame.
+ .macro signmsg
+ .byte 0xca
+ .endm
+
+ @ Ends the effects of signmsg, returning message box frames to normal.
+ .macro normalmsg
+ .byte 0xcb
+ .endm
+
+ @ Compares the value of a hidden variable to a dword.
+ .macro comparehiddenvar a, value
+ .byte 0xcc
+ .byte \a
+ .4byte \value
+ .endm
+
+ @ Makes the Pokemon in the specified slot of the player's party obedient. It will not randomly disobey orders in battle.
+ .macro setmonobedient slot
+ .byte 0xcd
+ .2byte \slot
+ .endm
+
+ @ Checks if the Pokemon in the specified slot of the player's party is obedient. If the Pokemon is disobedient, 0x0001 is written to script variable 0x800D (LASTRESULT). If the Pokemon is obedient (or if the specified slot is empty or invalid), 0x0000 is written.
+ .macro checkmonobedience slot
+ .byte 0xce
+ .2byte \slot
+ .endm
+
+ @ Depending on factors I haven't managed to understand yet, this command may cause script execution to jump to the offset specified by the pointer at 0x020375C0.
+ .macro execram
+ .byte 0xcf
+ .endm
+
+ @ Sets worldmapflag to 1. This allows the player to Fly to the corresponding map, if that map has a flightspot.
+ .macro setworldmapflag worldmapflag
+ .byte 0xd0
+ .2byte \worldmapflag
+ .endm
+
+ @ Clone of warpteleport? It is apparently only used in FR/LG, and only with specials.[source]
+ .macro warpteleport2 map, warp, x, y
+ .byte 0xd1
+ map \map
+ .byte \warp
+ .2byte \x
+ .2byte \y
+ .endm
+
+ @ Changes the location where the player caught the Pokemon in the specified slot of their party.
+ .macro setmonmetlocation slot, location
+ .byte 0xd2
+ .2byte \slot
+ .byte \location
+ .endm
+
+ .macro getbraillestringwidth pointer
+ .byte 0xd3
+ .4byte \pointer
+ .endm
+
+ .macro bufferitemnameplural out, item, quantity
+ .byte 0xd4
+ .byte \out
+ .2byte \item
+ .2byte \quantity
+ .endm
+
+
+@ Supplementary
+
+ .macro goto_if_eq dest
+ goto_if 1, \dest
+ .endm
+
+ .macro switch var
+ copyvar 0x8000, \var
+ .endm
+
+ .macro case condition, dest
+ compare_var_to_value 0x8000, \condition
+ goto_if_eq \dest
+ .endm
+
+ .macro msgbox text, type=4
+ loadword 0, \text
+ callstd \type
+ .endm
+
+ @ Message box types
+ MSGBOX_YESNO = 5
+
+ YES = 1
+ NO = 0
+
+ .macro giveitem item, amount=1, function=0
+ setorcopyvar 0x8000, \item
+ setorcopyvar 0x8001, \amount
+ callstd \function
+ .endm
diff --git a/berry_fix/payload/asm/macros/field_effect_script.inc b/berry_fix/payload/asm/macros/field_effect_script.inc
new file mode 100644
index 000000000..d5895b0ef
--- /dev/null
+++ b/berry_fix/payload/asm/macros/field_effect_script.inc
@@ -0,0 +1,42 @@
+ .macro loadtiles address
+ .byte 0
+ .4byte \address
+ .endm
+
+ .macro loadfadedpal address
+ .byte 1
+ .4byte \address
+ .endm
+
+ .macro loadpal address
+ .byte 2
+ .4byte \address
+ .endm
+
+ .macro callnative address
+ .byte 3
+ .4byte \address
+ .endm
+
+ .macro end
+ .byte 4
+ .endm
+
+ .macro loadgfx_callnative tiles_address, palette_address, function_address
+ .byte 5
+ .4byte \tiles_address
+ .4byte \palette_address
+ .4byte \function_address
+ .endm
+
+ .macro loadtiles_callnative tiles_address, function_address
+ .byte 6
+ .4byte \tiles_address
+ .4byte \function_address
+ .endm
+
+ .macro loadfadedpal_callnative palette_address, function_address
+ .byte 7
+ .4byte \palette_address
+ .4byte \function_address
+ .endm
diff --git a/berry_fix/payload/asm/macros/function.inc b/berry_fix/payload/asm/macros/function.inc
new file mode 100644
index 000000000..67fb373a8
--- /dev/null
+++ b/berry_fix/payload/asm/macros/function.inc
@@ -0,0 +1,29 @@
+ .macro arm_func_start name
+ .align 2, 0
+ .global \name
+ .arm
+ .type \name, function
+ .endm
+
+ .macro arm_func_end name
+ .size \name, .-\name
+ .endm
+
+ .macro thumb_func_start name
+ .align 2, 0
+ .global \name
+ .thumb
+ .thumb_func
+ .type \name, function
+ .endm
+
+ .macro non_word_aligned_thumb_func_start name
+ .global \name
+ .thumb
+ .thumb_func
+ .type \name, function
+ .endm
+
+ .macro thumb_func_end name
+ .size \name, .-\name
+ .endm
diff --git a/berry_fix/payload/asm/macros/m4a.inc b/berry_fix/payload/asm/macros/m4a.inc
new file mode 100644
index 000000000..6c5abc09b
--- /dev/null
+++ b/berry_fix/payload/asm/macros/m4a.inc
@@ -0,0 +1,13 @@
+ .macro song label, music_player, unknown
+ .4byte \label
+ .2byte \music_player
+ .2byte \unknown
+ .endm
+
+ .macro music_player info_struct, track_struct, unknown_1, unknown_2
+ .4byte \info_struct
+ .4byte \track_struct
+ .byte \unknown_1
+ .space 1
+ .2byte \unknown_2
+ .endm
diff --git a/berry_fix/payload/asm/macros/map.inc b/berry_fix/payload/asm/macros/map.inc
new file mode 100644
index 000000000..9c68e8414
--- /dev/null
+++ b/berry_fix/payload/asm/macros/map.inc
@@ -0,0 +1,84 @@
+ .macro map map_id
+ .byte \map_id >> 8 @ map group
+ .byte \map_id & 0xFF @ map num
+ .endm
+
+ .macro map_script type, address
+ .byte \type
+ .4byte \address
+ .endm
+
+ .macro map_script_2 word1, word2, address
+ .2byte \word1
+ .2byte \word2
+ .4byte \address
+ .endm
+
+ .macro object_event byte1, word1, byte2, byte3, byte4, byte5, byte6, byte7, byte8, byte9, byte10, byte11, byte12, byte13, byte14, script, word2, byte15, byte16
+ .byte \byte1
+ .2byte \word1
+ .byte \byte2, \byte3, \byte4, \byte5, \byte6, \byte7, \byte8, \byte9, \byte10, \byte11, \byte12, \byte13, \byte14
+ .4byte \script
+ .2byte \word2
+ .byte \byte15, \byte16
+ inc _num_npcs
+ .endm
+
+ .macro warp_def x, y, byte, warp, map_id
+ .2byte \x, \y
+ .byte \byte, \warp
+ .byte \map_id & 0xFF @ map num
+ .byte \map_id >> 8 @ map group
+ inc _num_warps
+ .endm
+
+ .macro coord_event x, y, byte1, byte2, word1, word2, word3, script
+ .2byte \x, \y
+ .byte \byte1, \byte2
+ .2byte \word1, \word2, \word3
+ .4byte \script
+ inc _num_traps
+ .endm
+
+ .macro bg_event x, y, byte, kind, word, arg6, arg7, arg8
+ .2byte \x, \y
+ .byte \byte, \kind
+ .2byte \word
+ .if \kind < 5
+ .4byte \arg6
+ .else
+ .2byte \arg6
+ .byte \arg7, \arg8
+ .endif
+ inc _num_signs
+ .endm
+
+ .macro map_events npcs, warps, traps, signs
+ .byte _num_npcs, _num_warps, _num_traps, _num_signs
+ .4byte \npcs, \warps, \traps, \signs
+ reset_map_events
+ .endm
+
+ .macro reset_map_events
+ .set _num_npcs, 0
+ .set _num_warps, 0
+ .set _num_traps, 0
+ .set _num_signs, 0
+ .endm
+
+ reset_map_events
+
+
+ .equiv connection_down, 1
+ .equiv connection_up, 2
+ .equiv connection_left, 3
+ .equiv connection_right, 4
+ .equiv connection_dive, 5
+ .equiv connection_emerge, 6
+
+ .macro connection direction, offset, map, filler
+ .4byte connection_\direction
+ .4byte \offset
+ map \map
+ .space 2
+ .endm
diff --git a/berry_fix/payload/asm/macros/movement.inc b/berry_fix/payload/asm/macros/movement.inc
new file mode 100644
index 000000000..909b24916
--- /dev/null
+++ b/berry_fix/payload/asm/macros/movement.inc
@@ -0,0 +1,120 @@
+ .macro create_movement name
+ enum _\name
+ .macro \name
+ .byte _\name
+ .endm
+ .endm
+
+ enum_start
+ create_movement step_00
+ create_movement step_01
+ create_movement step_02
+ create_movement step_03
+ create_movement slow_step_down
+ create_movement slow_step_up
+ create_movement slow_step_left
+ create_movement slow_step_right
+ create_movement step_down
+ create_movement step_up
+ create_movement step_left
+ create_movement step_right
+ create_movement fast_step_down
+ create_movement fast_step_up
+ create_movement fast_step_left
+ create_movement fast_step_right
+ create_movement step_10
+ create_movement step_11
+ create_movement step_12
+ create_movement step_13
+ create_movement step_14
+ create_movement step_15
+ create_movement step_16
+ create_movement step_17
+ create_movement step_18
+ create_movement step_19
+ create_movement step_1a
+ create_movement step_1b
+ create_movement step_1c
+ create_movement step_1d
+ create_movement step_1e
+ create_movement step_1f
+ create_movement step_20
+ create_movement step_21
+ create_movement step_22
+ create_movement step_23
+ create_movement step_24
+ create_movement step_25
+ create_movement step_26
+ create_movement step_27
+ create_movement step_28
+ create_movement step_29
+ create_movement step_2a
+ create_movement step_2b
+ create_movement step_2c
+ create_movement step_2d
+ create_movement step_2e
+ create_movement step_2f
+ create_movement step_30
+ create_movement step_31
+ create_movement step_32
+ create_movement step_33
+ create_movement step_34
+ create_movement step_35
+ create_movement step_36
+ create_movement step_37
+ create_movement step_38
+ create_movement step_39
+ create_movement step_3a
+ create_movement step_3b
+ create_movement step_3c
+ create_movement step_3d
+ create_movement step_3e
+ create_movement step_3f
+ create_movement step_40
+ create_movement step_41
+ create_movement step_42
+ create_movement step_43
+ create_movement step_44
+ create_movement step_45
+ create_movement step_46
+ create_movement step_47
+ create_movement step_48
+ create_movement step_49
+ create_movement step_4a
+ create_movement step_4b
+ create_movement step_4c
+ create_movement step_4d
+ create_movement step_4e
+ create_movement step_4f
+ create_movement step_50
+ create_movement step_51
+ create_movement step_52
+ create_movement step_53
+ create_movement step_54
+ create_movement step_55
+ create_movement step_56
+ create_movement step_57
+ create_movement step_58
+ create_movement step_59
+ create_movement step_5a
+ create_movement step_5b
+ create_movement step_5c
+ create_movement step_5d
+ create_movement step_5e
+ create_movement step_5f
+ create_movement step_60
+ create_movement step_61
+ create_movement step_62
+ create_movement step_63
+ create_movement step_64
+ create_movement step_65
+
+ enum_start 0x91
+ create_movement step_91
+ create_movement step_92
+
+ enum_start 0x96
+ create_movement step_96
+
+ enum_start 0xfe
+ create_movement step_end
diff --git a/berry_fix/payload/asm/macros/music_voice.inc b/berry_fix/payload/asm/macros/music_voice.inc
new file mode 100644
index 000000000..b7a9e7f8d
--- /dev/null
+++ b/berry_fix/payload/asm/macros/music_voice.inc
@@ -0,0 +1,125 @@
+ .macro voice_directsound base_midi_key, pan, sample_data_pointer, attack, decay, sustain, release
+ .byte 0
+ _voice_directsound \base_midi_key, \pan, \sample_data_pointer, \attack, \decay, \sustain, \release
+ .endm
+
+ .macro voice_directsound_no_resample base_midi_key, pan, sample_data_pointer, attack, decay, sustain, release
+ .byte 8
+ _voice_directsound \base_midi_key, \pan, \sample_data_pointer, \attack, \decay, \sustain, \release
+ .endm
+
+ .macro voice_directsound_alt base_midi_key, pan, sample_data_pointer, attack, decay, sustain, release
+ .byte 16
+ _voice_directsound \base_midi_key, \pan, \sample_data_pointer, \attack, \decay, \sustain, \release
+ .endm
+
+ .macro _voice_directsound base_midi_key, pan, sample_data_pointer, attack, decay, sustain, release
+ .byte \base_midi_key
+ .byte 0
+ .if \pan != 0
+ .byte (0x80 | \pan)
+ .else
+ .byte 0
+ .endif
+ .4byte \sample_data_pointer
+ .byte \attack
+ .byte \decay
+ .byte \sustain
+ .byte \release
+ .endm
+
+ .macro voice_square_1 sweep, duty_cycle, attack, decay, sustain, release
+ _voice_square_1 1, \sweep, \duty_cycle, \attack, \decay, \sustain, \release
+ .endm
+
+ .macro voice_square_1_alt sweep, duty_cycle, attack, decay, sustain, release
+ _voice_square_1 9, \sweep, \duty_cycle, \attack, \decay, \sustain, \release
+ .endm
+
+ .macro _voice_square_1 type, sweep, duty_cycle, attack, decay, sustain, release
+ .byte \type, 60, 0
+ .byte \sweep
+ .byte (\duty_cycle & 0x3)
+ .byte 0, 0, 0
+ .byte (\attack & 0x7)
+ .byte (\decay & 0x7)
+ .byte (\sustain & 0xF)
+ .byte (\release & 0x7)
+ .endm
+
+ .macro voice_square_2 duty_cycle, attack, decay, sustain, release
+ _voice_square_2 2, \duty_cycle, \attack, \decay, \sustain, \release
+ .endm
+
+ .macro voice_square_2_alt duty_cycle, attack, decay, sustain, release
+ _voice_square_2 10, \duty_cycle, \attack, \decay, \sustain, \release
+ .endm
+
+ .macro _voice_square_2 type, duty_cycle, attack, decay, sustain, release
+ .byte \type, 60, 0, 0
+ .byte (\duty_cycle & 0x3)
+ .byte 0, 0, 0
+ .byte (\attack & 0x7)
+ .byte (\decay & 0x7)
+ .byte (\sustain & 0xF)
+ .byte (\release & 0x7)
+ .endm
+
+ .macro voice_programmable_wave wave_samples_pointer, attack, decay, sustain, release
+ _voice_programmable_wave 3, \wave_samples_pointer, \attack, \decay, \sustain, \release
+ .endm
+
+ .macro voice_programmable_wave_alt wave_samples_pointer, attack, decay, sustain, release
+ _voice_programmable_wave 11, \wave_samples_pointer, \attack, \decay, \sustain, \release
+ .endm
+
+ .macro _voice_programmable_wave type, wave_samples_pointer, attack, decay, sustain, release
+ .byte \type, 60, 0, 0
+ .4byte \wave_samples_pointer
+ .byte (\attack & 0x7)
+ .byte (\decay & 0x7)
+ .byte (\sustain & 0xF)
+ .byte (\release & 0x7)
+ .endm
+
+ .macro voice_noise period, attack, decay, sustain, release
+ _voice_noise 4, \period, \attack, \decay, \sustain, \release
+ .endm
+
+ .macro voice_noise_alt period, attack, decay, sustain, release
+ _voice_noise 12, \period, \attack, \decay, \sustain, \release
+ .endm
+
+ .macro _voice_noise type, period, attack, decay, sustain, release
+ .byte \type, 60, 0, 0
+ .byte (\period & 0x1)
+ .byte 0, 0, 0
+ .byte (\attack & 0x7)
+ .byte (\decay & 0x7)
+ .byte (\sustain & 0xF)
+ .byte (\release & 0x7)
+ .endm
+
+ .macro voice_keysplit voice_group_pointer, keysplit_table_pointer
+ .byte 0x40, 0, 0, 0
+ .4byte \voice_group_pointer
+ .4byte \keysplit_table_pointer
+ .endm
+
+ .macro voice_keysplit_all voice_group_pointer
+ .byte 0x80, 0, 0, 0
+ .4byte \voice_group_pointer
+ .4byte 0
+ .endm
+
+ .macro cry sample
+ .byte 0x20, 60, 0, 0
+ .4byte \sample
+ .byte 0xff, 0, 0xff, 0
+ .endm
+
+ .macro cry2 sample
+ .byte 0x30, 60, 0, 0
+ .4byte \sample
+ .byte 0xff, 0, 0xff, 0
+ .endm
diff --git a/berry_fix/payload/asm/macros/pokemon_data.inc b/berry_fix/payload/asm/macros/pokemon_data.inc
new file mode 100644
index 000000000..b0a5f22e3
--- /dev/null
+++ b/berry_fix/payload/asm/macros/pokemon_data.inc
@@ -0,0 +1,57 @@
+ .macro pokedex_entry pokemon_name, height, weight, pokemon_scale, pokemon_offset, trainer_scale, trainer_offset
+ .2byte \height @ in decimeters
+ .2byte \weight @ in hectograms
+ .4byte DexDescription_\pokemon_name\()_1
+ .4byte DexDescription_\pokemon_name\()_2
+ .2byte 0 @ unused
+ .2byte \pokemon_scale
+ .2byte \pokemon_offset
+ .2byte \trainer_scale
+ .2byte \trainer_offset
+ .2byte 0 @ padding
+ .endm
+
+ .macro base_stats hp, attack, defense, speed, sp_attack, sp_defense
+ .byte \hp
+ .byte \attack
+ .byte \defense
+ .byte \speed
+ .byte \sp_attack
+ .byte \sp_defense
+ .endm
+
+ .macro ev_yield hp, attack, defense, speed, sp_attack, sp_defense
+ .2byte (\sp_defense << 10) | (\sp_attack << 8) | (\speed << 6) | (\defense << 4) | (\attack << 2) | \hp
+ .endm
+
+ .macro level_up_move level, move
+ .2byte (\level << 9) | \move
+ .endm
+
+ .macro evo_entry method, parameter, target_species
+ .2byte \method
+ .2byte \parameter
+ .2byte \target_species
+ .2byte 0 @ padding
+ .endm
+
+ .macro empty_evo_entries count
+ .fill 8 * \count, 1, 0
+ .endm
+
+ .macro egg_moves_begin species
+ .2byte 20000 + \species
+ .endm
+
+@ If the min level equals the max level, only one level argument is needed.
+ .macro wild_mon species, min_level, max_level
+ .byte \min_level
+
+ .ifb \max_level
+ .byte \min_level
+ .else
+ .byte \max_level
+ .endif
+
+ .2byte SPECIES_\species
+ .endm
diff --git a/berry_fix/payload/constants/gba_constants.inc b/berry_fix/payload/constants/gba_constants.inc
new file mode 100644
index 000000000..9d59c8fcd
--- /dev/null
+++ b/berry_fix/payload/constants/gba_constants.inc
@@ -0,0 +1,490 @@
+ .set PSR_USR_MODE, 0x00000010
+ .set PSR_FIQ_MODE, 0x00000011
+ .set PSR_IRQ_MODE, 0x00000012
+ .set PSR_SVC_MODE, 0x00000013
+ .set PSR_ABT_MODE, 0x00000017
+ .set PSR_UND_MODE, 0x0000001b
+ .set PSR_SYS_MODE, 0x0000001f
+ .set PSR_MODE_MASK, 0x0000001f
+ .set PSR_T_BIT, 0x00000020
+ .set PSR_F_BIT, 0x00000040
+ .set PSR_I_BIT, 0x00000080
+
+ .set EWRAM_START, 0x02000000
+ .set EWRAM_END, EWRAM_START + 0x40000
+ .set IWRAM_START, 0x03000000
+ .set IWRAM_END, IWRAM_START + 0x8000
+
+ .set PLTT, 0x5000000
+ .set BG_PLTT, PLTT
+ .set OBJ_PLTT, PLTT + 0x200
+
+ .set VRAM, 0x6000000
+ .set BG_VRAM, VRAM
+ .set OBJ_VRAM0, VRAM + 0x10000 @ text-mode BG
+ .set OBJ_VRAM1, VRAM + 0x14000 @ bitmap-mode BG
+
+ .set OAM, 0x7000000
+
+ .set SOUND_INFO_PTR, 0x3007FF0
+ .set INTR_CHECK, 0x3007FF8
+ .set INTR_VECTOR, 0x3007FFC
+
+ .set INTR_FLAG_VBLANK, 1 << 0
+ .set INTR_FLAG_HBLANK, 1 << 1
+ .set INTR_FLAG_VCOUNT, 1 << 2
+ .set INTR_FLAG_TIMER0, 1 << 3
+ .set INTR_FLAG_TIMER1, 1 << 4
+ .set INTR_FLAG_TIMER2, 1 << 5
+ .set INTR_FLAG_TIMER3, 1 << 6
+ .set INTR_FLAG_SERIAL, 1 << 7
+ .set INTR_FLAG_DMA0, 1 << 8
+ .set INTR_FLAG_DMA1, 1 << 9
+ .set INTR_FLAG_DMA2, 1 << 10
+ .set INTR_FLAG_DMA3, 1 << 11
+ .set INTR_FLAG_KEYPAD, 1 << 12
+ .set INTR_FLAG_GAMEPAK, 1 << 13
+
+ .set VCOUNT_VBLANK, 160
+ .set TOTAL_SCANLINES, 228
+
+ .set REG_BASE, 0x4000000 @ I/O register base address
+
+@ I/O register offsets
+ .set OFFSET_REG_DISPCNT, 0x0
+ .set OFFSET_REG_DISPSTAT, 0x4
+ .set OFFSET_REG_VCOUNT, 0x6
+ .set OFFSET_REG_BG0CNT, 0x8
+ .set OFFSET_REG_BG1CNT, 0xa
+ .set OFFSET_REG_BG2CNT, 0xc
+ .set OFFSET_REG_BG3CNT, 0xe
+ .set OFFSET_REG_BG0HOFS, 0x10
+ .set OFFSET_REG_BG0VOFS, 0x12
+ .set OFFSET_REG_BG1HOFS, 0x14
+ .set OFFSET_REG_BG1VOFS, 0x16
+ .set OFFSET_REG_BG2HOFS, 0x18
+ .set OFFSET_REG_BG2VOFS, 0x1a
+ .set OFFSET_REG_BG3HOFS, 0x1c
+ .set OFFSET_REG_BG3VOFS, 0x1e
+ .set OFFSET_REG_BG2PA, 0x20
+ .set OFFSET_REG_BG2PB, 0x22
+ .set OFFSET_REG_BG2PC, 0x24
+ .set OFFSET_REG_BG2PD, 0x26
+ .set OFFSET_REG_BG2X_L, 0x28
+ .set OFFSET_REG_BG2X_H, 0x2a
+ .set OFFSET_REG_BG2Y_L, 0x2c
+ .set OFFSET_REG_BG2Y_H, 0x2e
+ .set OFFSET_REG_BG3PA, 0x30
+ .set OFFSET_REG_BG3PB, 0x32
+ .set OFFSET_REG_BG3PC, 0x34
+ .set OFFSET_REG_BG3PD, 0x36
+ .set OFFSET_REG_BG3X_L, 0x38
+ .set OFFSET_REG_BG3X_H, 0x3a
+ .set OFFSET_REG_BG3Y_L, 0x3c
+ .set OFFSET_REG_BG3Y_H, 0x3e
+ .set OFFSET_REG_WIN0H, 0x40
+ .set OFFSET_REG_WIN1H, 0x42
+ .set OFFSET_REG_WIN0V, 0x44
+ .set OFFSET_REG_WIN1V, 0x46
+ .set OFFSET_REG_WININ, 0x48
+ .set OFFSET_REG_WINOUT, 0x4a
+ .set OFFSET_REG_MOSAIC, 0x4c
+ .set OFFSET_REG_BLDCNT, 0x50
+ .set OFFSET_REG_BLDALPHA, 0x52
+ .set OFFSET_REG_BLDY, 0x54
+
+ .set OFFSET_REG_SOUND1CNT, 0x60
+ .set OFFSET_REG_SOUND1CNT_L, 0x60
+ .set OFFSET_REG_NR10, 0x60
+ .set OFFSET_REG_SOUND1CNT_H, 0x62
+ .set OFFSET_REG_NR11, 0x62
+ .set OFFSET_REG_NR12, 0x63
+ .set OFFSET_REG_SOUND1CNT_X, 0x64
+ .set OFFSET_REG_NR13, 0x64
+ .set OFFSET_REG_NR14, 0x65
+ .set OFFSET_REG_SOUND2CNT, 0x68
+ .set OFFSET_REG_SOUND2CNT_L, 0x68
+ .set OFFSET_REG_NR21, 0x68
+ .set OFFSET_REG_NR22, 0x69
+ .set OFFSET_REG_SOUND2CNT_H, 0x6c
+ .set OFFSET_REG_NR23, 0x6c
+ .set OFFSET_REG_NR24, 0x6d
+ .set OFFSET_REG_SOUND3CNT, 0x70
+ .set OFFSET_REG_SOUND3CNT_L, 0x70
+ .set OFFSET_REG_NR30, 0x70
+ .set OFFSET_REG_SOUND3CNT_H, 0x72
+ .set OFFSET_REG_NR31, 0x72
+ .set OFFSET_REG_NR32, 0x73
+ .set OFFSET_REG_SOUND3CNT_X, 0x74
+ .set OFFSET_REG_NR33, 0x74
+ .set OFFSET_REG_NR34, 0x75
+ .set OFFSET_REG_SOUND4CNT, 0x78
+ .set OFFSET_REG_SOUND4CNT_L, 0x78
+ .set OFFSET_REG_NR41, 0x78
+ .set OFFSET_REG_NR42, 0x79
+ .set OFFSET_REG_SOUND4CNT_H, 0x7c
+ .set OFFSET_REG_NR43, 0x7c
+ .set OFFSET_REG_NR44, 0x7d
+ .set OFFSET_REG_SOUNDCNT, 0x80
+ .set OFFSET_REG_SOUNDCNT_L, 0x80
+ .set OFFSET_REG_NR50, 0x80
+ .set OFFSET_REG_NR51, 0x81
+ .set OFFSET_REG_SOUNDCNT_H, 0x82
+ .set OFFSET_REG_SOUNDCNT_X, 0x84
+ .set OFFSET_REG_NR52, 0x84
+ .set OFFSET_REG_SOUNDBIAS, 0x88
+ .set OFFSET_REG_WAVE_RAM, 0x90
+ .set OFFSET_REG_WAVE_RAM0, 0x90
+ .set OFFSET_REG_WAVE_RAM0_L, 0x90
+ .set OFFSET_REG_WAVE_RAM0_H, 0x92
+ .set OFFSET_REG_WAVE_RAM1, 0x94
+ .set OFFSET_REG_WAVE_RAM1_L, 0x94
+ .set OFFSET_REG_WAVE_RAM1_H, 0x96
+ .set OFFSET_REG_WAVE_RAM2, 0x98
+ .set OFFSET_REG_WAVE_RAM2_L, 0x98
+ .set OFFSET_REG_WAVE_RAM2_H, 0x9a
+ .set OFFSET_REG_WAVE_RAM3, 0x9c
+ .set OFFSET_REG_WAVE_RAM3_L, 0x9c
+ .set OFFSET_REG_WAVE_RAM3_H, 0x9e
+ .set OFFSET_REG_FIFO, 0xa0
+ .set OFFSET_REG_FIFO_A, 0xa0
+ .set OFFSET_REG_FIFO_A_L, 0xa0
+ .set OFFSET_REG_FIFO_A_H, 0xa2
+ .set OFFSET_REG_FIFO_B, 0xa4
+ .set OFFSET_REG_FIFO_B_L, 0xa4
+ .set OFFSET_REG_FIFO_B_H, 0xa6
+
+ .set OFFSET_REG_DMA0, 0xb0
+ .set OFFSET_REG_DMA0SAD, 0xb0
+ .set OFFSET_REG_DMA0SAD_L, 0xb0
+ .set OFFSET_REG_DMA0SAD_H, 0xb2
+ .set OFFSET_REG_DMA0DAD, 0xb4
+ .set OFFSET_REG_DMA0DAD_L, 0xb4
+ .set OFFSET_REG_DMA0DAD_H, 0xb6
+ .set OFFSET_REG_DMA0CNT, 0xb8
+ .set OFFSET_REG_DMA0CNT_L, 0xb8
+ .set OFFSET_REG_DMA0CNT_H, 0xba
+ .set OFFSET_REG_DMA1, 0xbc
+ .set OFFSET_REG_DMA1SAD, 0xbc
+ .set OFFSET_REG_DMA1SAD_L, 0xbc
+ .set OFFSET_REG_DMA1SAD_H, 0xbe
+ .set OFFSET_REG_DMA1DAD, 0xc0
+ .set OFFSET_REG_DMA1DAD_L, 0xc0
+ .set OFFSET_REG_DMA1DAD_H, 0xc2
+ .set OFFSET_REG_DMA1CNT, 0xc4
+ .set OFFSET_REG_DMA1CNT_L, 0xc4
+ .set OFFSET_REG_DMA1CNT_H, 0xc6
+ .set OFFSET_REG_DMA2, 0xc8
+ .set OFFSET_REG_DMA2SAD, 0xc8
+ .set OFFSET_REG_DMA2SAD_L, 0xc8
+ .set OFFSET_REG_DMA2SAD_H, 0xca
+ .set OFFSET_REG_DMA2DAD, 0xcc
+ .set OFFSET_REG_DMA2DAD_L, 0xcc
+ .set OFFSET_REG_DMA2DAD_H, 0xce
+ .set OFFSET_REG_DMA2CNT, 0xd0
+ .set OFFSET_REG_DMA2CNT_L, 0xd0
+ .set OFFSET_REG_DMA2CNT_H, 0xd2
+ .set OFFSET_REG_DMA3, 0xd4
+ .set OFFSET_REG_DMA3SAD, 0xd4
+ .set OFFSET_REG_DMA3SAD_L, 0xd4
+ .set OFFSET_REG_DMA3SAD_H, 0xd6
+ .set OFFSET_REG_DMA3DAD, 0xd8
+ .set OFFSET_REG_DMA3DAD_L, 0xd8
+ .set OFFSET_REG_DMA3DAD_H, 0xda
+ .set OFFSET_REG_DMA3CNT, 0xdc
+ .set OFFSET_REG_DMA3CNT_L, 0xdc
+ .set OFFSET_REG_DMA3CNT_H, 0xde
+
+ .set OFFSET_REG_TM0CNT, 0x100
+ .set OFFSET_REG_TM0CNT_L, 0x100
+ .set OFFSET_REG_TM0CNT_H, 0x102
+ .set OFFSET_REG_TM1CNT, 0x104
+ .set OFFSET_REG_TM1CNT_L, 0x104
+ .set OFFSET_REG_TM1CNT_H, 0x106
+ .set OFFSET_REG_TM2CNT, 0x108
+ .set OFFSET_REG_TM2CNT_L, 0x108
+ .set OFFSET_REG_TM2CNT_H, 0x10a
+ .set OFFSET_REG_TM3CNT, 0x10c
+ .set OFFSET_REG_TM3CNT_L, 0x10c
+ .set OFFSET_REG_TM3CNT_H, 0x10e
+
+ .set OFFSET_REG_SIOCNT, 0x128
+ .set OFFSET_REG_SIODATA8, 0x12a
+ .set OFFSET_REG_SIODATA32, 0x120
+ .set OFFSET_REG_SIOMLT_SEND, 0x12a
+ .set OFFSET_REG_SIOMLT_RECV, 0x120
+ .set OFFSET_REG_SIOMULTI0, 0x120
+ .set OFFSET_REG_SIOMULTI1, 0x122
+ .set OFFSET_REG_SIOMULTI2, 0x124
+ .set OFFSET_REG_SIOMULTI3, 0x126
+
+ .set OFFSET_REG_KEYINPUT, 0x130
+ .set OFFSET_REG_KEYCNT, 0x132
+
+ .set OFFSET_REG_RCNT, 0x134
+
+ .set OFFSET_REG_JOYCNT, 0x140
+ .set OFFSET_REG_JOYSTAT, 0x158
+ .set OFFSET_REG_JOY_RECV, 0x150
+ .set OFFSET_REG_JOY_RECV_L, 0x150
+ .set OFFSET_REG_JOY_RECV_H, 0x152
+ .set OFFSET_REG_JOY_TRANS, 0x154
+ .set OFFSET_REG_JOY_TRANS_L, 0x154
+ .set OFFSET_REG_JOY_TRANS_H, 0x156
+
+ .set OFFSET_REG_IME, 0x208
+ .set OFFSET_REG_IE, 0x200
+ .set OFFSET_REG_IF, 0x202
+
+ .set OFFSET_REG_WAITCNT, 0x204
+
+@ I/O register addresses
+ .set REG_DISPCNT, REG_BASE + OFFSET_REG_DISPCNT
+ .set REG_DISPSTAT, REG_BASE + OFFSET_REG_DISPSTAT
+ .set REG_VCOUNT, REG_BASE + OFFSET_REG_VCOUNT
+ .set REG_BG0CNT, REG_BASE + OFFSET_REG_BG0CNT
+ .set REG_BG1CNT, REG_BASE + OFFSET_REG_BG1CNT
+ .set REG_BG2CNT, REG_BASE + OFFSET_REG_BG2CNT
+ .set REG_BG3CNT, REG_BASE + OFFSET_REG_BG3CNT
+ .set REG_BG0HOFS, REG_BASE + OFFSET_REG_BG0HOFS
+ .set REG_BG0VOFS, REG_BASE + OFFSET_REG_BG0VOFS
+ .set REG_BG1HOFS, REG_BASE + OFFSET_REG_BG1HOFS
+ .set REG_BG1VOFS, REG_BASE + OFFSET_REG_BG1VOFS
+ .set REG_BG2HOFS, REG_BASE + OFFSET_REG_BG2HOFS
+ .set REG_BG2VOFS, REG_BASE + OFFSET_REG_BG2VOFS
+ .set REG_BG3HOFS, REG_BASE + OFFSET_REG_BG3HOFS
+ .set REG_BG3VOFS, REG_BASE + OFFSET_REG_BG3VOFS
+ .set REG_BG2PA, REG_BASE + OFFSET_REG_BG2PA
+ .set REG_BG2PB, REG_BASE + OFFSET_REG_BG2PB
+ .set REG_BG2PC, REG_BASE + OFFSET_REG_BG2PC
+ .set REG_BG2PD, REG_BASE + OFFSET_REG_BG2PD
+ .set REG_BG2X_L, REG_BASE + OFFSET_REG_BG2X_L
+ .set REG_BG2X_H, REG_BASE + OFFSET_REG_BG2X_H
+ .set REG_BG2Y_L, REG_BASE + OFFSET_REG_BG2Y_L
+ .set REG_BG2Y_H, REG_BASE + OFFSET_REG_BG2Y_H
+ .set REG_BG3PA, REG_BASE + OFFSET_REG_BG3PA
+ .set REG_BG3PB, REG_BASE + OFFSET_REG_BG3PB
+ .set REG_BG3PC, REG_BASE + OFFSET_REG_BG3PC
+ .set REG_BG3PD, REG_BASE + OFFSET_REG_BG3PD
+ .set REG_BG3X_L, REG_BASE + OFFSET_REG_BG3X_L
+ .set REG_BG3X_H, REG_BASE + OFFSET_REG_BG3X_H
+ .set REG_BG3Y_L, REG_BASE + OFFSET_REG_BG3Y_L
+ .set REG_BG3Y_H, REG_BASE + OFFSET_REG_BG3Y_H
+ .set REG_WIN0H, REG_BASE + OFFSET_REG_WIN0H
+ .set REG_WIN1H, REG_BASE + OFFSET_REG_WIN1H
+ .set REG_WIN0V, REG_BASE + OFFSET_REG_WIN0V
+ .set REG_WIN1V, REG_BASE + OFFSET_REG_WIN1V
+ .set REG_WININ, REG_BASE + OFFSET_REG_WININ
+ .set REG_WINOUT, REG_BASE + OFFSET_REG_WINOUT
+ .set REG_MOSAIC, REG_BASE + OFFSET_REG_MOSAIC
+ .set REG_BLDCNT, REG_BASE + OFFSET_REG_BLDCNT
+ .set REG_BLDALPHA, REG_BASE + OFFSET_REG_BLDALPHA
+ .set REG_BLDY, REG_BASE + OFFSET_REG_BLDY
+
+ .set REG_SOUND1CNT, REG_BASE + OFFSET_REG_SOUND1CNT
+ .set REG_SOUND1CNT_L, REG_BASE + OFFSET_REG_SOUND1CNT_L
+ .set REG_NR10, REG_BASE + OFFSET_REG_NR10
+ .set REG_SOUND1CNT_H, REG_BASE + OFFSET_REG_SOUND1CNT_H
+ .set REG_NR11, REG_BASE + OFFSET_REG_NR11
+ .set REG_NR12, REG_BASE + OFFSET_REG_NR12
+ .set REG_SOUND1CNT_X, REG_BASE + OFFSET_REG_SOUND1CNT_X
+ .set REG_NR13, REG_BASE + OFFSET_REG_NR13
+ .set REG_NR14, REG_BASE + OFFSET_REG_NR14
+ .set REG_SOUND2CNT, REG_BASE + OFFSET_REG_SOUND2CNT
+ .set REG_SOUND2CNT_L, REG_BASE + OFFSET_REG_SOUND2CNT_L
+ .set REG_NR21, REG_BASE + OFFSET_REG_NR21
+ .set REG_NR22, REG_BASE + OFFSET_REG_NR22
+ .set REG_SOUND2CNT_H, REG_BASE + OFFSET_REG_SOUND2CNT_H
+ .set REG_NR23, REG_BASE + OFFSET_REG_NR23
+ .set REG_NR24, REG_BASE + OFFSET_REG_NR24
+ .set REG_SOUND3CNT, REG_BASE + OFFSET_REG_SOUND3CNT
+ .set REG_SOUND3CNT_L, REG_BASE + OFFSET_REG_SOUND3CNT_L
+ .set REG_NR30, REG_BASE + OFFSET_REG_NR30
+ .set REG_SOUND3CNT_H, REG_BASE + OFFSET_REG_SOUND3CNT_H
+ .set REG_NR31, REG_BASE + OFFSET_REG_NR31
+ .set REG_NR32, REG_BASE + OFFSET_REG_NR32
+ .set REG_SOUND3CNT_X, REG_BASE + OFFSET_REG_SOUND3CNT_X
+ .set REG_NR33, REG_BASE + OFFSET_REG_NR33
+ .set REG_NR34, REG_BASE + OFFSET_REG_NR34
+ .set REG_SOUND4CNT, REG_BASE + OFFSET_REG_SOUND4CNT
+ .set REG_SOUND4CNT_L, REG_BASE + OFFSET_REG_SOUND4CNT_L
+ .set REG_NR41, REG_BASE + OFFSET_REG_NR41
+ .set REG_NR42, REG_BASE + OFFSET_REG_NR42
+ .set REG_SOUND4CNT_H, REG_BASE + OFFSET_REG_SOUND4CNT_H
+ .set REG_NR43, REG_BASE + OFFSET_REG_NR43
+ .set REG_NR44, REG_BASE + OFFSET_REG_NR44
+ .set REG_SOUNDCNT, REG_BASE + OFFSET_REG_SOUNDCNT
+ .set REG_SOUNDCNT_L, REG_BASE + OFFSET_REG_SOUNDCNT_L
+ .set REG_NR50, REG_BASE + OFFSET_REG_NR50
+ .set REG_NR51, REG_BASE + OFFSET_REG_NR51
+ .set REG_SOUNDCNT_H, REG_BASE + OFFSET_REG_SOUNDCNT_H
+ .set REG_SOUNDCNT_X, REG_BASE + OFFSET_REG_SOUNDCNT_X
+ .set REG_NR52, REG_BASE + OFFSET_REG_NR52
+ .set REG_SOUNDBIAS, REG_BASE + OFFSET_REG_SOUNDBIAS
+ .set REG_WAVE_RAM, REG_BASE + OFFSET_REG_WAVE_RAM
+ .set REG_WAVE_RAM0, REG_BASE + OFFSET_REG_WAVE_RAM0
+ .set REG_WAVE_RAM0_L, REG_BASE + OFFSET_REG_WAVE_RAM0_L
+ .set REG_WAVE_RAM0_H, REG_BASE + OFFSET_REG_WAVE_RAM0_H
+ .set REG_WAVE_RAM1, REG_BASE + OFFSET_REG_WAVE_RAM1
+ .set REG_WAVE_RAM1_L, REG_BASE + OFFSET_REG_WAVE_RAM1_L
+ .set REG_WAVE_RAM1_H, REG_BASE + OFFSET_REG_WAVE_RAM1_H
+ .set REG_WAVE_RAM2, REG_BASE + OFFSET_REG_WAVE_RAM2
+ .set REG_WAVE_RAM2_L, REG_BASE + OFFSET_REG_WAVE_RAM2_L
+ .set REG_WAVE_RAM2_H, REG_BASE + OFFSET_REG_WAVE_RAM2_H
+ .set REG_WAVE_RAM3, REG_BASE + OFFSET_REG_WAVE_RAM3
+ .set REG_WAVE_RAM3_L, REG_BASE + OFFSET_REG_WAVE_RAM3_L
+ .set REG_WAVE_RAM3_H, REG_BASE + OFFSET_REG_WAVE_RAM3_H
+ .set REG_FIFO, REG_BASE + OFFSET_REG_FIFO
+ .set REG_FIFO_A, REG_BASE + OFFSET_REG_FIFO_A
+ .set REG_FIFO_A_L, REG_BASE + OFFSET_REG_FIFO_A_L
+ .set REG_FIFO_A_H, REG_BASE + OFFSET_REG_FIFO_A_H
+ .set REG_FIFO_B, REG_BASE + OFFSET_REG_FIFO_B
+ .set REG_FIFO_B_L, REG_BASE + OFFSET_REG_FIFO_B_L
+ .set REG_FIFO_B_H, REG_BASE + OFFSET_REG_FIFO_B_H
+
+ .set REG_DMA0, REG_BASE + OFFSET_REG_DMA0
+ .set REG_DMA0SAD, REG_BASE + OFFSET_REG_DMA0SAD
+ .set REG_DMA0SAD_L, REG_BASE + OFFSET_REG_DMA0SAD_L
+ .set REG_DMA0SAD_H, REG_BASE + OFFSET_REG_DMA0SAD_H
+ .set REG_DMA0DAD, REG_BASE + OFFSET_REG_DMA0DAD
+ .set REG_DMA0DAD_L, REG_BASE + OFFSET_REG_DMA0DAD_L
+ .set REG_DMA0DAD_H, REG_BASE + OFFSET_REG_DMA0DAD_H
+ .set REG_DMA0CNT, REG_BASE + OFFSET_REG_DMA0CNT
+ .set REG_DMA0CNT_L, REG_BASE + OFFSET_REG_DMA0CNT_L
+ .set REG_DMA0CNT_H, REG_BASE + OFFSET_REG_DMA0CNT_H
+ .set REG_DMA1, REG_BASE + OFFSET_REG_DMA1
+ .set REG_DMA1SAD, REG_BASE + OFFSET_REG_DMA1SAD
+ .set REG_DMA1SAD_L, REG_BASE + OFFSET_REG_DMA1SAD_L
+ .set REG_DMA1SAD_H, REG_BASE + OFFSET_REG_DMA1SAD_H
+ .set REG_DMA1DAD, REG_BASE + OFFSET_REG_DMA1DAD
+ .set REG_DMA1DAD_L, REG_BASE + OFFSET_REG_DMA1DAD_L
+ .set REG_DMA1DAD_H, REG_BASE + OFFSET_REG_DMA1DAD_H
+ .set REG_DMA1CNT, REG_BASE + OFFSET_REG_DMA1CNT
+ .set REG_DMA1CNT_L, REG_BASE + OFFSET_REG_DMA1CNT_L
+ .set REG_DMA1CNT_H, REG_BASE + OFFSET_REG_DMA1CNT_H
+ .set REG_DMA2, REG_BASE + OFFSET_REG_DMA2
+ .set REG_DMA2SAD, REG_BASE + OFFSET_REG_DMA2SAD
+ .set REG_DMA2SAD_L, REG_BASE + OFFSET_REG_DMA2SAD_L
+ .set REG_DMA2SAD_H, REG_BASE + OFFSET_REG_DMA2SAD_H
+ .set REG_DMA2DAD, REG_BASE + OFFSET_REG_DMA2DAD
+ .set REG_DMA2DAD_L, REG_BASE + OFFSET_REG_DMA2DAD_L
+ .set REG_DMA2DAD_H, REG_BASE + OFFSET_REG_DMA2DAD_H
+ .set REG_DMA2CNT, REG_BASE + OFFSET_REG_DMA2CNT
+ .set REG_DMA2CNT_L, REG_BASE + OFFSET_REG_DMA2CNT_L
+ .set REG_DMA2CNT_H, REG_BASE + OFFSET_REG_DMA2CNT_H
+ .set REG_DMA3, REG_BASE + OFFSET_REG_DMA3
+ .set REG_DMA3SAD, REG_BASE + OFFSET_REG_DMA3SAD
+ .set REG_DMA3SAD_L, REG_BASE + OFFSET_REG_DMA3SAD_L
+ .set REG_DMA3SAD_H, REG_BASE + OFFSET_REG_DMA3SAD_H
+ .set REG_DMA3DAD, REG_BASE + OFFSET_REG_DMA3DAD
+ .set REG_DMA3DAD_L, REG_BASE + OFFSET_REG_DMA3DAD_L
+ .set REG_DMA3DAD_H, REG_BASE + OFFSET_REG_DMA3DAD_H
+ .set REG_DMA3CNT, REG_BASE + OFFSET_REG_DMA3CNT
+ .set REG_DMA3CNT_L, REG_BASE + OFFSET_REG_DMA3CNT_L
+ .set REG_DMA3CNT_H, REG_BASE + OFFSET_REG_DMA3CNT_H
+
+ .set REG_TM0CNT, REG_BASE + OFFSET_REG_TM0CNT
+ .set REG_TM0CNT_L, REG_BASE + OFFSET_REG_TM0CNT_L
+ .set REG_TM0CNT_H, REG_BASE + OFFSET_REG_TM0CNT_H
+ .set REG_TM1CNT, REG_BASE + OFFSET_REG_TM1CNT
+ .set REG_TM1CNT_L, REG_BASE + OFFSET_REG_TM1CNT_L
+ .set REG_TM1CNT_H, REG_BASE + OFFSET_REG_TM1CNT_H
+ .set REG_TM2CNT, REG_BASE + OFFSET_REG_TM2CNT
+ .set REG_TM2CNT_L, REG_BASE + OFFSET_REG_TM2CNT_L
+ .set REG_TM2CNT_H, REG_BASE + OFFSET_REG_TM2CNT_H
+ .set REG_TM3CNT, REG_BASE + OFFSET_REG_TM3CNT
+ .set REG_TM3CNT_L, REG_BASE + OFFSET_REG_TM3CNT_L
+ .set REG_TM3CNT_H, REG_BASE + OFFSET_REG_TM3CNT_H
+
+ .set REG_SIOCNT, REG_BASE + OFFSET_REG_SIOCNT
+ .set REG_SIODATA8, REG_BASE + OFFSET_REG_SIODATA8
+ .set REG_SIODATA32, REG_BASE + OFFSET_REG_SIODATA32
+ .set REG_SIOMLT_SEND, REG_BASE + OFFSET_REG_SIOMLT_SEND
+ .set REG_SIOMLT_RECV, REG_BASE + OFFSET_REG_SIOMLT_RECV
+ .set REG_SIOMULTI0, REG_BASE + OFFSET_REG_SIOMULTI0
+ .set REG_SIOMULTI1, REG_BASE + OFFSET_REG_SIOMULTI1
+ .set REG_SIOMULTI2, REG_BASE + OFFSET_REG_SIOMULTI2
+ .set REG_SIOMULTI3, REG_BASE + OFFSET_REG_SIOMULTI3
+
+ .set REG_KEYINPUT, REG_BASE + OFFSET_REG_KEYINPUT
+ .set REG_KEYCNT, REG_BASE + OFFSET_REG_KEYCNT
+
+ .set REG_RCNT, REG_BASE + OFFSET_REG_RCNT
+
+ .set REG_JOYCNT, REG_BASE + OFFSET_REG_JOYCNT
+ .set REG_JOYSTAT, REG_BASE + OFFSET_REG_JOYSTAT
+ .set REG_JOY_RECV, REG_BASE + OFFSET_REG_JOY_RECV
+ .set REG_JOY_RECV_L, REG_BASE + OFFSET_REG_JOY_RECV_L
+ .set REG_JOY_RECV_H, REG_BASE + OFFSET_REG_JOY_RECV_H
+ .set REG_JOY_TRANS, REG_BASE + OFFSET_REG_JOY_TRANS
+ .set REG_JOY_TRANS_L, REG_BASE + OFFSET_REG_JOY_TRANS_L
+ .set REG_JOY_TRANS_H, REG_BASE + OFFSET_REG_JOY_TRANS_H
+
+ .set REG_IME, REG_BASE + OFFSET_REG_IME
+ .set REG_IE, REG_BASE + OFFSET_REG_IE
+ .set REG_IF, REG_BASE + OFFSET_REG_IF
+
+ .set REG_WAITCNT, REG_BASE + OFFSET_REG_WAITCNT
+
+@ DMA register constants
+
+ .set DMA_DEST_INC, 0x0000
+ .set DMA_DEST_DEC, 0x0020
+ .set DMA_DEST_FIXED, 0x0040
+ .set DMA_DEST_RELOAD, 0x0060
+ .set DMA_SRC_INC, 0x0000
+ .set DMA_SRC_DEC, 0x0080
+ .set DMA_SRC_FIXED, 0x0100
+ .set DMA_REPEAT, 0x0200
+ .set DMA_16BIT, 0x0000
+ .set DMA_32BIT, 0x0400
+ .set DMA_DREQ_ON, 0x0800
+ .set DMA_START_NOW, 0x0000
+ .set DMA_START_VBLANK, 0x1000
+ .set DMA_START_HBLANK, 0x2000
+ .set DMA_START_SPECIAL, 0x3000
+ .set DMA_INTR_ENABLE, 0x4000
+ .set DMA_ENABLE, 0x8000
+
+@ OAM attribute constants
+
+ .set OAM_OBJ_NORMAL, 0x00000000
+ .set OAM_OBJ_BLEND, 0x00000400
+ .set OAM_OBJ_WINDOW, 0x00000800
+
+ .set OAM_AFFINE_NONE, 0x00000000
+ .set OAM_AFFINE_NORMAL_SIZE, 0x00000100
+ .set OAM_OBJ_DISABLED, 0x00000200
+ .set OAM_AFFINE_DOUBLE_SIZE, 0x00000300
+
+ .set OAM_MOSAIC_OFF, 0x00000000
+ .set OAM_MOSAIC_ON, 0x00001000
+
+ .set OAM_4BPP, 0x00000000
+ .set OAM_8BPP, 0x00002000
+
+ .set OAM_H_FLIP, 0x10000000
+ .set OAM_V_FLIP, 0x20000000
+
+ .set OAM_SQUARE, 0x00000000
+ .set OAM_H_RECTANGLE, 0x00004000
+ .set OAM_V_RECTANGLE, 0x00008000
+ .set OAM_SIZE_0, 0x00000000
+ .set OAM_SIZE_1, 0x40000000
+ .set OAM_SIZE_2, 0x80000000
+ .set OAM_SIZE_3, 0xc0000000
+
+ .set OAM_SIZE_8x8, OAM_SIZE_0 | OAM_SQUARE
+ .set OAM_SIZE_16x16, OAM_SIZE_1 | OAM_SQUARE
+ .set OAM_SIZE_32x32, OAM_SIZE_2 | OAM_SQUARE
+ .set OAM_SIZE_64x64, OAM_SIZE_3 | OAM_SQUARE
+
+ .set OAM_SIZE_16x8, OAM_SIZE_0 | OAM_H_RECTANGLE
+ .set OAM_SIZE_32x8, OAM_SIZE_1 | OAM_H_RECTANGLE
+ .set OAM_SIZE_32x16, OAM_SIZE_2 | OAM_H_RECTANGLE
+ .set OAM_SIZE_64x32, OAM_SIZE_3 | OAM_H_RECTANGLE
+
+ .set OAM_SIZE_8x16, OAM_SIZE_0 | OAM_V_RECTANGLE
+ .set OAM_SIZE_8x32, OAM_SIZE_1 | OAM_V_RECTANGLE
+ .set OAM_SIZE_16x32, OAM_SIZE_2 | OAM_V_RECTANGLE
+ .set OAM_SIZE_32x64, OAM_SIZE_3 | OAM_V_RECTANGLE
diff --git a/berry_fix/payload/include/flash.h b/berry_fix/payload/include/flash.h
index 26de88216..7fc35896d 100644
--- a/berry_fix/payload/include/flash.h
+++ b/berry_fix/payload/include/flash.h
@@ -1,7 +1,7 @@
#ifndef GUARD_FLASH_H
#define GUARD_FLASH_H
-#include <gba/gba.h>
+#include "gba/gba.h"
enum
{
diff --git a/berry_fix/payload/include/gba/defines.h b/berry_fix/payload/include/gba/defines.h
new file mode 100644
index 000000000..289518cf3
--- /dev/null
+++ b/berry_fix/payload/include/gba/defines.h
@@ -0,0 +1,87 @@
+#ifndef GUARD_GBA_DEFINES
+#define GUARD_GBA_DEFINES
+
+#include <stddef.h>
+
+#define TRUE 1
+#define FALSE 0
+
+#define BSS_DATA __attribute__((section(".bss")))
+#define IWRAM_DATA __attribute__((section("iwram_data")))
+#define EWRAM_DATA __attribute__((section("ewram_data")))
+#define UNUSED __attribute__((unused))
+#define NAKED __attribute__((naked))
+
+#define ALIGNED(n) __attribute__((aligned(n)))
+
+#define SOUND_INFO_PTR (*(struct SoundInfo **)0x3007FF0)
+#define INTR_CHECK (*(u16 *)0x3007FF8)
+#define INTR_VECTOR (*(void **)0x3007FFC)
+
+#define EWRAM_START 0x02000000
+#define EWRAM_END (EWRAM_START + 0x40000)
+#define IWRAM_START 0x03000000
+#define IWRAM_END (IWRAM_START + 0x8000)
+
+#define PLTT 0x5000000
+#define PLTT_SIZE 0x400
+
+#define BG_PLTT PLTT
+#define BG_PLTT_SIZE 0x200
+
+#define OBJ_PLTT (PLTT + 0x200)
+#define OBJ_PLTT_SIZE 0x200
+
+#define VRAM 0x6000000
+#define VRAM_SIZE 0x18000
+
+#define BG_VRAM VRAM
+#define BG_VRAM_SIZE 0x10000
+#define BG_CHAR_SIZE 0x4000
+#define BG_SCREEN_SIZE 0x800
+#define BG_CHAR_ADDR(n) (void *)(BG_VRAM + (0x4000 * (n)))
+#define BG_SCREEN_ADDR(n) (void *)(BG_VRAM + (0x800 * (n)))
+#define BG_TILE_ADDR(n) (void *)(BG_VRAM + (0x80 * (n)))
+
+#define BG_TILE_H_FLIP(n) (0x400 + (n))
+#define BG_TILE_V_FLIP(n) (0x800 + (n))
+
+// text-mode BG
+#define OBJ_VRAM0 (void *)(VRAM + 0x10000)
+#define OBJ_VRAM0_SIZE 0x8000
+
+// bitmap-mode BG
+#define OBJ_VRAM1 (void *)(VRAM + 0x14000)
+#define OBJ_VRAM1_SIZE 0x4000
+
+#define OAM 0x7000000
+#define OAM_SIZE 0x400
+
+#define ROM_HEADER_SIZE 0xC0
+
+#define DISPLAY_WIDTH 240
+#define DISPLAY_HEIGHT 160
+
+#define TILE_SIZE_4BPP 32
+#define TILE_SIZE_8BPP 64
+
+#define TILE_OFFSET_4BPP(n) ((n) * TILE_SIZE_4BPP)
+#define TILE_OFFSET_8BPP(n) ((n) * TILE_SIZE_8BPP)
+
+#define TOTAL_OBJ_TILE_COUNT 1024
+
+#define RGB(r, g, b) ((r) | ((g) << 5) | ((b) << 10))
+#define RGB2(r, g, b) (((b) << 10) | ((g) << 5) | (r))
+#define _RGB(r, g, b) ((((b) & 0x1F) << 10) + (((g) & 0x1F) << 5) + ((r) & 0x1F))
+
+#define RGB_BLACK RGB(0, 0, 0)
+#define RGB_WHITE RGB(31, 31, 31)
+#define RGB_RED RGB(31, 0, 0)
+#define RGB_GREEN RGB(0, 31, 0)
+#define RGB_BLUE RGB(0, 0, 31)
+#define RGB_YELLOW RGB(31, 31, 0)
+#define RGB_MAGENTA RGB(31, 0, 31)
+#define RGB_CYAN RGB(0, 31, 31)
+#define RGB_WHITEALPHA (RGB_WHITE | 0x8000)
+
+#endif // GUARD_GBA_DEFINES
diff --git a/berry_fix/payload/include/gba/flash_internal.h b/berry_fix/payload/include/gba/flash_internal.h
new file mode 100644
index 000000000..6fbec31f1
--- /dev/null
+++ b/berry_fix/payload/include/gba/flash_internal.h
@@ -0,0 +1,85 @@
+#ifndef GUARD_GBA_FLASH_INTERNAL_H
+#define GUARD_GBA_FLASH_INTERNAL_H
+
+#include "gba/gba.h"
+
+#define FLASH_BASE ((u8 *)0xE000000)
+
+#define FLASH_WRITE(addr, data) ((*(vu8 *)(FLASH_BASE + (addr))) = (data))
+
+#define FLASH_ROM_SIZE_1M 131072 // 1 megabit ROM
+
+#define SECTORS_PER_BANK 16
+
+struct FlashSector
+{
+ u32 size;
+ u8 shift;
+ u16 count;
+ u16 top;
+};
+
+struct FlashType {
+ u32 romSize;
+ struct FlashSector sector;
+ u16 wait[2]; // game pak bus read/write wait
+
+ // TODO: add support for anonymous unions/structs if possible
+ union {
+ struct {
+ u8 makerId;
+ u8 deviceId;
+ } separate;
+ u16 joined;
+ } ids;
+};
+
+struct FlashSetupInfo
+{
+ u16 (*programFlashByte)(u16, u32, u8);
+ u16 (*programFlashSector)(u16, void *);
+ u16 (*eraseFlashChip)(void);
+ u16 (*eraseFlashSector)(u16);
+ u16 (*WaitForFlashWrite)(u8, u8 *, u8);
+ const u16 *maxTime;
+ struct FlashType type;
+};
+
+extern u16 gFlashNumRemainingBytes;
+
+extern u16 (*ProgramFlashByte)(u16, u32, u8);
+extern u16 (*ProgramFlashSector)(u16, void *);
+extern u16 (*EraseFlashChip)(void);
+extern u16 (*EraseFlashSector)(u16);
+extern u16 (*WaitForFlashWrite)(u8, u8 *, u8);
+extern const u16 *gFlashMaxTime;
+extern const struct FlashType *gFlash;
+
+extern u8 (*PollFlashStatus)(u8 *);
+extern u8 gFlashTimeoutFlag;
+
+extern const struct FlashSetupInfo MX29L010;
+extern const struct FlashSetupInfo LE26FV10N1TS;
+extern const struct FlashSetupInfo DefaultFlash;
+
+void SwitchFlashBank(u8 bankNum);
+u16 ReadFlashId(void);
+void StartFlashTimer(u8 phase);
+void SetReadFlash1(u16 *dest);
+void StopFlashTimer(void);
+u16 SetFlashTimerIntr(u8 timerNum, void (**intrFunc)(void));
+u32 ProgramFlashSectorAndVerify(u16 sectorNum, u8 *src);
+void ReadFlash(u16 sectorNum, u32 offset, void *dest, u32 size);
+u32 ProgramFlashSectorAndVerifyNBytes(u16 sectorNum, void *dataSrc, u32 n);
+
+u16 WaitForFlashWrite_Common(u8 phase, u8 *addr, u8 lastData);
+
+u16 EraseFlashChip_MX(void);
+u16 EraseFlashSector_MX(u16 sectorNum);
+u16 ProgramFlashByte_MX(u16 sectorNum, u32 offset, u8 data);
+u16 ProgramFlashSector_MX(u16 sectorNum, void *src);
+
+// agb_flash_1m
+u32 IdentifyFlash(void);
+
+#endif // GUARD_GBA_FLASH_INTERNAL_H
diff --git a/berry_fix/payload/include/gba/gba.h b/berry_fix/payload/include/gba/gba.h
new file mode 100644
index 000000000..349344031
--- /dev/null
+++ b/berry_fix/payload/include/gba/gba.h
@@ -0,0 +1,12 @@
+#ifndef GUARD_GBA_GBA_H
+#define GUARD_GBA_GBA_H
+
+#include "gba/defines.h"
+#include "gba/io_reg.h"
+#include "gba/types.h"
+#include "gba/multiboot.h"
+#include "gba/syscall.h"
+#include "gba/macro.h"
+#include "gba/isagbprint.h"
+
+#endif // GUARD_GBA_GBA_H
diff --git a/berry_fix/payload/include/gba/io_reg.h b/berry_fix/payload/include/gba/io_reg.h
new file mode 100644
index 000000000..df79b084d
--- /dev/null
+++ b/berry_fix/payload/include/gba/io_reg.h
@@ -0,0 +1,770 @@
+#ifndef GUARD_GBA_IO_REG_H
+#define GUARD_GBA_IO_REG_H
+
+#define REG_BASE 0x4000000 // I/O register base address
+
+// I/O register offsets
+
+#define REG_OFFSET_DISPCNT 0x0
+#define REG_OFFSET_DISPSTAT 0x4
+#define REG_OFFSET_VCOUNT 0x6
+#define REG_OFFSET_BG0CNT 0x8
+#define REG_OFFSET_BG1CNT 0xa
+#define REG_OFFSET_BG2CNT 0xc
+#define REG_OFFSET_BG3CNT 0xe
+#define REG_OFFSET_BG0HOFS 0x10
+#define REG_OFFSET_BG0VOFS 0x12
+#define REG_OFFSET_BG1HOFS 0x14
+#define REG_OFFSET_BG1VOFS 0x16
+#define REG_OFFSET_BG2HOFS 0x18
+#define REG_OFFSET_BG2VOFS 0x1a
+#define REG_OFFSET_BG3HOFS 0x1c
+#define REG_OFFSET_BG3VOFS 0x1e
+#define REG_OFFSET_BG2PA 0x20
+#define REG_OFFSET_BG2PB 0x22
+#define REG_OFFSET_BG2PC 0x24
+#define REG_OFFSET_BG2PD 0x26
+#define REG_OFFSET_BG2X 0x28
+#define REG_OFFSET_BG2X_L 0x28
+#define REG_OFFSET_BG2X_H 0x2a
+#define REG_OFFSET_BG2Y 0x2c
+#define REG_OFFSET_BG2Y_L 0x2c
+#define REG_OFFSET_BG2Y_H 0x2e
+#define REG_OFFSET_BG3PA 0x30
+#define REG_OFFSET_BG3PB 0x32
+#define REG_OFFSET_BG3PC 0x34
+#define REG_OFFSET_BG3PD 0x36
+#define REG_OFFSET_BG3X 0x38
+#define REG_OFFSET_BG3X_L 0x38
+#define REG_OFFSET_BG3X_H 0x3a
+#define REG_OFFSET_BG3Y 0x3c
+#define REG_OFFSET_BG3Y_L 0x3c
+#define REG_OFFSET_BG3Y_H 0x3e
+#define REG_OFFSET_WIN0H 0x40
+#define REG_OFFSET_WIN1H 0x42
+#define REG_OFFSET_WIN0V 0x44
+#define REG_OFFSET_WIN1V 0x46
+#define REG_OFFSET_WININ 0x48
+#define REG_OFFSET_WINOUT 0x4a
+#define REG_OFFSET_MOSAIC 0x4c
+#define REG_OFFSET_BLDCNT 0x50
+#define REG_OFFSET_BLDALPHA 0x52
+#define REG_OFFSET_BLDY 0x54
+
+#define REG_OFFSET_SOUND1CNT_L 0x60
+#define REG_OFFSET_NR10 0x60
+#define REG_OFFSET_SOUND1CNT_H 0x62
+#define REG_OFFSET_NR11 0x62
+#define REG_OFFSET_NR12 0x63
+#define REG_OFFSET_SOUND1CNT_X 0x64
+#define REG_OFFSET_NR13 0x64
+#define REG_OFFSET_NR14 0x65
+#define REG_OFFSET_SOUND2CNT_L 0x68
+#define REG_OFFSET_NR21 0x68
+#define REG_OFFSET_NR22 0x69
+#define REG_OFFSET_SOUND2CNT_H 0x6c
+#define REG_OFFSET_NR23 0x6c
+#define REG_OFFSET_NR24 0x6d
+#define REG_OFFSET_SOUND3CNT_L 0x70
+#define REG_OFFSET_NR30 0x70
+#define REG_OFFSET_SOUND3CNT_H 0x72
+#define REG_OFFSET_NR31 0x72
+#define REG_OFFSET_NR32 0x73
+#define REG_OFFSET_SOUND3CNT_X 0x74
+#define REG_OFFSET_NR33 0x74
+#define REG_OFFSET_NR34 0x75
+#define REG_OFFSET_SOUND4CNT_L 0x78
+#define REG_OFFSET_NR41 0x78
+#define REG_OFFSET_NR42 0x79
+#define REG_OFFSET_SOUND4CNT_H 0x7c
+#define REG_OFFSET_NR43 0x7c
+#define REG_OFFSET_NR44 0x7d
+#define REG_OFFSET_SOUNDCNT_L 0x80
+#define REG_OFFSET_NR50 0x80
+#define REG_OFFSET_NR51 0x81
+#define REG_OFFSET_SOUNDCNT_H 0x82
+#define REG_OFFSET_SOUNDCNT_X 0x84
+#define REG_OFFSET_NR52 0x84
+#define REG_OFFSET_SOUNDBIAS 0x88
+#define REG_OFFSET_SOUNDBIAS_L 0x88
+#define REG_OFFSET_SOUNDBIAS_H 0x89
+#define REG_OFFSET_WAVE_RAM0 0x90
+#define REG_OFFSET_WAVE_RAM1 0x94
+#define REG_OFFSET_WAVE_RAM2 0x98
+#define REG_OFFSET_WAVE_RAM3 0x9c
+#define REG_OFFSET_FIFO_A 0xa0
+#define REG_OFFSET_FIFO_B 0xa4
+
+#define REG_OFFSET_DMA0 0xb0
+#define REG_OFFSET_DMA0SAD 0xb0
+#define REG_OFFSET_DMA0SAD_L 0xb0
+#define REG_OFFSET_DMA0SAD_H 0xb2
+#define REG_OFFSET_DMA0DAD 0xb4
+#define REG_OFFSET_DMA0DAD_L 0xb4
+#define REG_OFFSET_DMA0DAD_H 0xb6
+#define REG_OFFSET_DMA0CNT 0xb8
+#define REG_OFFSET_DMA0CNT_L 0xb8
+#define REG_OFFSET_DMA0CNT_H 0xba
+#define REG_OFFSET_DMA1 0xbc
+#define REG_OFFSET_DMA1SAD 0xbc
+#define REG_OFFSET_DMA1SAD_L 0xbc
+#define REG_OFFSET_DMA1SAD_H 0xbe
+#define REG_OFFSET_DMA1DAD 0xc0
+#define REG_OFFSET_DMA1DAD_L 0xc0
+#define REG_OFFSET_DMA1DAD_H 0xc2
+#define REG_OFFSET_DMA1CNT 0xc4
+#define REG_OFFSET_DMA1CNT_L 0xc4
+#define REG_OFFSET_DMA1CNT_H 0xc6
+#define REG_OFFSET_DMA2 0xc8
+#define REG_OFFSET_DMA2SAD 0xc8
+#define REG_OFFSET_DMA2SAD_L 0xc8
+#define REG_OFFSET_DMA2SAD_H 0xca
+#define REG_OFFSET_DMA2DAD 0xcc
+#define REG_OFFSET_DMA2DAD_L 0xcc
+#define REG_OFFSET_DMA2DAD_H 0xce
+#define REG_OFFSET_DMA2CNT 0xd0
+#define REG_OFFSET_DMA2CNT_L 0xd0
+#define REG_OFFSET_DMA2CNT_H 0xd2
+#define REG_OFFSET_DMA3 0xd4
+#define REG_OFFSET_DMA3SAD 0xd4
+#define REG_OFFSET_DMA3SAD_L 0xd4
+#define REG_OFFSET_DMA3SAD_H 0xd6
+#define REG_OFFSET_DMA3DAD 0xd8
+#define REG_OFFSET_DMA3DAD_L 0xd8
+#define REG_OFFSET_DMA3DAD_H 0xda
+#define REG_OFFSET_DMA3CNT 0xdc
+#define REG_OFFSET_DMA3CNT_L 0xdc
+#define REG_OFFSET_DMA3CNT_H 0xde
+
+#define REG_OFFSET_TMCNT 0x100
+#define REG_OFFSET_TMCNT_L 0x100
+#define REG_OFFSET_TMCNT_H 0x102
+#define REG_OFFSET_TM0CNT 0x100
+#define REG_OFFSET_TM0CNT_L 0x100
+#define REG_OFFSET_TM0CNT_H 0x102
+#define REG_OFFSET_TM1CNT 0x104
+#define REG_OFFSET_TM1CNT_L 0x104
+#define REG_OFFSET_TM1CNT_H 0x106
+#define REG_OFFSET_TM2CNT 0x108
+#define REG_OFFSET_TM2CNT_L 0x108
+#define REG_OFFSET_TM2CNT_H 0x10a
+#define REG_OFFSET_TM3CNT 0x10c
+#define REG_OFFSET_TM3CNT_L 0x10c
+#define REG_OFFSET_TM3CNT_H 0x10e
+
+#define REG_OFFSET_SIOCNT 0x128
+#define REG_OFFSET_SIODATA8 0x12a
+#define REG_OFFSET_SIODATA32 0x120
+#define REG_OFFSET_SIOMLT_SEND 0x12a
+#define REG_OFFSET_SIOMLT_RECV 0x120
+#define REG_OFFSET_SIOMULTI0 0x120
+#define REG_OFFSET_SIOMULTI1 0x122
+#define REG_OFFSET_SIOMULTI2 0x124
+#define REG_OFFSET_SIOMULTI3 0x126
+
+#define REG_OFFSET_KEYINPUT 0x130
+#define REG_OFFSET_KEYCNT 0x132
+
+#define REG_OFFSET_RCNT 0x134
+
+#define REG_OFFSET_JOYCNT 0x140
+#define REG_OFFSET_JOYSTAT 0x158
+#define REG_OFFSET_JOY_RECV 0x150
+#define REG_OFFSET_JOY_RECV_L 0x150
+#define REG_OFFSET_JOY_RECV_H 0x152
+#define REG_OFFSET_JOY_TRANS 0x154
+#define REG_OFFSET_JOY_TRANS_L 0x154
+#define REG_OFFSET_JOY_TRANS_H 0x156
+
+#define REG_OFFSET_IME 0x208
+#define REG_OFFSET_IE 0x200
+#define REG_OFFSET_IF 0x202
+
+#define REG_OFFSET_WAITCNT 0x204
+
+// I/O register addresses
+
+#define REG_ADDR_DISPCNT (REG_BASE + REG_OFFSET_DISPCNT)
+#define REG_ADDR_DISPSTAT (REG_BASE + REG_OFFSET_DISPSTAT)
+#define REG_ADDR_VCOUNT (REG_BASE + REG_OFFSET_VCOUNT)
+#define REG_ADDR_BG0CNT (REG_BASE + REG_OFFSET_BG0CNT)
+#define REG_ADDR_BG1CNT (REG_BASE + REG_OFFSET_BG1CNT)
+#define REG_ADDR_BG2CNT (REG_BASE + REG_OFFSET_BG2CNT)
+#define REG_ADDR_BG3CNT (REG_BASE + REG_OFFSET_BG3CNT)
+#define REG_ADDR_BG0HOFS (REG_BASE + REG_OFFSET_BG0HOFS)
+#define REG_ADDR_BG0VOFS (REG_BASE + REG_OFFSET_BG0VOFS)
+#define REG_ADDR_BG1HOFS (REG_BASE + REG_OFFSET_BG1HOFS)
+#define REG_ADDR_BG1VOFS (REG_BASE + REG_OFFSET_BG1VOFS)
+#define REG_ADDR_BG2HOFS (REG_BASE + REG_OFFSET_BG2HOFS)
+#define REG_ADDR_BG2VOFS (REG_BASE + REG_OFFSET_BG2VOFS)
+#define REG_ADDR_BG3HOFS (REG_BASE + REG_OFFSET_BG3HOFS)
+#define REG_ADDR_BG3VOFS (REG_BASE + REG_OFFSET_BG3VOFS)
+#define REG_ADDR_BG2PA (REG_BASE + REG_OFFSET_BG2PA)
+#define REG_ADDR_BG2PB (REG_BASE + REG_OFFSET_BG2PB)
+#define REG_ADDR_BG2PC (REG_BASE + REG_OFFSET_BG2PC)
+#define REG_ADDR_BG2PD (REG_BASE + REG_OFFSET_BG2PD)
+#define REG_ADDR_BG2X (REG_BASE + REG_OFFSET_BG2X)
+#define REG_ADDR_BG2X_L (REG_BASE + REG_OFFSET_BG2X_L)
+#define REG_ADDR_BG2X_H (REG_BASE + REG_OFFSET_BG2X_H)
+#define REG_ADDR_BG2Y (REG_BASE + REG_OFFSET_BG2Y)
+#define REG_ADDR_BG2Y_L (REG_BASE + REG_OFFSET_BG2Y_L)
+#define REG_ADDR_BG2Y_H (REG_BASE + REG_OFFSET_BG2Y_H)
+#define REG_ADDR_BG3PA (REG_BASE + REG_OFFSET_BG3PA)
+#define REG_ADDR_BG3PB (REG_BASE + REG_OFFSET_BG3PB)
+#define REG_ADDR_BG3PC (REG_BASE + REG_OFFSET_BG3PC)
+#define REG_ADDR_BG3PD (REG_BASE + REG_OFFSET_BG3PD)
+#define REG_ADDR_BG3X (REG_BASE + REG_OFFSET_BG3X)
+#define REG_ADDR_BG3X_L (REG_BASE + REG_OFFSET_BG3X_L)
+#define REG_ADDR_BG3X_H (REG_BASE + REG_OFFSET_BG3X_H)
+#define REG_ADDR_BG3Y (REG_BASE + REG_OFFSET_BG3Y)
+#define REG_ADDR_BG3Y_L (REG_BASE + REG_OFFSET_BG3Y_L)
+#define REG_ADDR_BG3Y_H (REG_BASE + REG_OFFSET_BG3Y_H)
+#define REG_ADDR_WIN0H (REG_BASE + REG_OFFSET_WIN0H)
+#define REG_ADDR_WIN1H (REG_BASE + REG_OFFSET_WIN1H)
+#define REG_ADDR_WIN0V (REG_BASE + REG_OFFSET_WIN0V)
+#define REG_ADDR_WIN1V (REG_BASE + REG_OFFSET_WIN1V)
+#define REG_ADDR_WININ (REG_BASE + REG_OFFSET_WININ)
+#define REG_ADDR_WINOUT (REG_BASE + REG_OFFSET_WINOUT)
+#define REG_ADDR_MOSAIC (REG_BASE + REG_OFFSET_MOSAIC)
+#define REG_ADDR_BLDCNT (REG_BASE + REG_OFFSET_BLDCNT)
+#define REG_ADDR_BLDALPHA (REG_BASE + REG_OFFSET_BLDALPHA)
+#define REG_ADDR_BLDY (REG_BASE + REG_OFFSET_BLDY)
+
+#define REG_ADDR_SOUND1CNT_L (REG_BASE + REG_OFFSET_SOUND1CNT_L)
+#define REG_ADDR_NR10 (REG_BASE + REG_OFFSET_NR10)
+#define REG_ADDR_SOUND1CNT_H (REG_BASE + REG_OFFSET_SOUND1CNT_H)
+#define REG_ADDR_NR11 (REG_BASE + REG_OFFSET_NR11)
+#define REG_ADDR_NR12 (REG_BASE + REG_OFFSET_NR12)
+#define REG_ADDR_SOUND1CNT_X (REG_BASE + REG_OFFSET_SOUND1CNT_X)
+#define REG_ADDR_NR13 (REG_BASE + REG_OFFSET_NR13)
+#define REG_ADDR_NR14 (REG_BASE + REG_OFFSET_NR14)
+#define REG_ADDR_SOUND2CNT_L (REG_BASE + REG_OFFSET_SOUND2CNT_L)
+#define REG_ADDR_NR21 (REG_BASE + REG_OFFSET_NR21)
+#define REG_ADDR_NR22 (REG_BASE + REG_OFFSET_NR22)
+#define REG_ADDR_SOUND2CNT_H (REG_BASE + REG_OFFSET_SOUND2CNT_H)
+#define REG_ADDR_NR23 (REG_BASE + REG_OFFSET_NR23)
+#define REG_ADDR_NR24 (REG_BASE + REG_OFFSET_NR24)
+#define REG_ADDR_SOUND3CNT_L (REG_BASE + REG_OFFSET_SOUND3CNT_L)
+#define REG_ADDR_NR30 (REG_BASE + REG_OFFSET_NR30)
+#define REG_ADDR_SOUND3CNT_H (REG_BASE + REG_OFFSET_SOUND3CNT_H)
+#define REG_ADDR_NR31 (REG_BASE + REG_OFFSET_NR31)
+#define REG_ADDR_NR32 (REG_BASE + REG_OFFSET_NR32)
+#define REG_ADDR_SOUND3CNT_X (REG_BASE + REG_OFFSET_SOUND3CNT_X)
+#define REG_ADDR_NR33 (REG_BASE + REG_OFFSET_NR33)
+#define REG_ADDR_NR34 (REG_BASE + REG_OFFSET_NR34)
+#define REG_ADDR_SOUND4CNT_L (REG_BASE + REG_OFFSET_SOUND4CNT_L)
+#define REG_ADDR_NR41 (REG_BASE + REG_OFFSET_NR41)
+#define REG_ADDR_NR42 (REG_BASE + REG_OFFSET_NR42)
+#define REG_ADDR_SOUND4CNT_H (REG_BASE + REG_OFFSET_SOUND4CNT_H)
+#define REG_ADDR_NR43 (REG_BASE + REG_OFFSET_NR43)
+#define REG_ADDR_NR44 (REG_BASE + REG_OFFSET_NR44)
+#define REG_ADDR_SOUNDCNT_L (REG_BASE + REG_OFFSET_SOUNDCNT_L)
+#define REG_ADDR_NR50 (REG_BASE + REG_OFFSET_NR50)
+#define REG_ADDR_NR51 (REG_BASE + REG_OFFSET_NR51)
+#define REG_ADDR_SOUNDCNT_H (REG_BASE + REG_OFFSET_SOUNDCNT_H)
+#define REG_ADDR_SOUNDCNT_X (REG_BASE + REG_OFFSET_SOUNDCNT_X)
+#define REG_ADDR_NR52 (REG_BASE + REG_OFFSET_NR52)
+#define REG_ADDR_SOUNDBIAS (REG_BASE + REG_OFFSET_SOUNDBIAS)
+#define REG_ADDR_SOUNDBIAS_L (REG_BASE + REG_OFFSET_SOUNDBIAS_L)
+#define REG_ADDR_SOUNDBIAS_H (REG_BASE + REG_OFFSET_SOUNDBIAS_H)
+#define REG_ADDR_WAVE_RAM0 (REG_BASE + REG_OFFSET_WAVE_RAM0)
+#define REG_ADDR_WAVE_RAM1 (REG_BASE + REG_OFFSET_WAVE_RAM1)
+#define REG_ADDR_WAVE_RAM2 (REG_BASE + REG_OFFSET_WAVE_RAM2)
+#define REG_ADDR_WAVE_RAM3 (REG_BASE + REG_OFFSET_WAVE_RAM3)
+#define REG_ADDR_FIFO_A (REG_BASE + REG_OFFSET_FIFO_A)
+#define REG_ADDR_FIFO_B (REG_BASE + REG_OFFSET_FIFO_B)
+
+#define REG_ADDR_DMA0 (REG_BASE + REG_OFFSET_DMA0)
+#define REG_ADDR_DMA0SAD (REG_BASE + REG_OFFSET_DMA0SAD)
+#define REG_ADDR_DMA0DAD (REG_BASE + REG_OFFSET_DMA0DAD)
+#define REG_ADDR_DMA0CNT (REG_BASE + REG_OFFSET_DMA0CNT)
+#define REG_ADDR_DMA0CNT_L (REG_BASE + REG_OFFSET_DMA0CNT_L)
+#define REG_ADDR_DMA0CNT_H (REG_BASE + REG_OFFSET_DMA0CNT_H)
+#define REG_ADDR_DMA1 (REG_BASE + REG_OFFSET_DMA1)
+#define REG_ADDR_DMA1SAD (REG_BASE + REG_OFFSET_DMA1SAD)
+#define REG_ADDR_DMA1DAD (REG_BASE + REG_OFFSET_DMA1DAD)
+#define REG_ADDR_DMA1CNT (REG_BASE + REG_OFFSET_DMA1CNT)
+#define REG_ADDR_DMA1CNT_L (REG_BASE + REG_OFFSET_DMA1CNT_L)
+#define REG_ADDR_DMA1CNT_H (REG_BASE + REG_OFFSET_DMA1CNT_H)
+#define REG_ADDR_DMA2 (REG_BASE + REG_OFFSET_DMA2)
+#define REG_ADDR_DMA2SAD (REG_BASE + REG_OFFSET_DMA2SAD)
+#define REG_ADDR_DMA2DAD (REG_BASE + REG_OFFSET_DMA2DAD)
+#define REG_ADDR_DMA2CNT (REG_BASE + REG_OFFSET_DMA2CNT)
+#define REG_ADDR_DMA2CNT_L (REG_BASE + REG_OFFSET_DMA2CNT_L)
+#define REG_ADDR_DMA2CNT_H (REG_BASE + REG_OFFSET_DMA2CNT_H)
+#define REG_ADDR_DMA3 (REG_BASE + REG_OFFSET_DMA3)
+#define REG_ADDR_DMA3SAD (REG_BASE + REG_OFFSET_DMA3SAD)
+#define REG_ADDR_DMA3DAD (REG_BASE + REG_OFFSET_DMA3DAD)
+#define REG_ADDR_DMA3CNT (REG_BASE + REG_OFFSET_DMA3CNT)
+#define REG_ADDR_DMA3CNT_L (REG_BASE + REG_OFFSET_DMA3CNT_L)
+#define REG_ADDR_DMA3CNT_H (REG_BASE + REG_OFFSET_DMA3CNT_H)
+
+#define REG_ADDR_TMCNT (REG_BASE + REG_OFFSET_TMCNT)
+#define REG_ADDR_TMCNT_L (REG_BASE + REG_OFFSET_TMCNT_L)
+#define REG_ADDR_TMCNT_H (REG_BASE + REG_OFFSET_TMCNT_H)
+#define REG_ADDR_TM0CNT (REG_BASE + REG_OFFSET_TM0CNT)
+#define REG_ADDR_TM0CNT_L (REG_BASE + REG_OFFSET_TM0CNT_L)
+#define REG_ADDR_TM0CNT_H (REG_BASE + REG_OFFSET_TM0CNT_H)
+#define REG_ADDR_TM1CNT (REG_BASE + REG_OFFSET_TM1CNT)
+#define REG_ADDR_TM1CNT_L (REG_BASE + REG_OFFSET_TM1CNT_L)
+#define REG_ADDR_TM1CNT_H (REG_BASE + REG_OFFSET_TM1CNT_H)
+#define REG_ADDR_TM2CNT (REG_BASE + REG_OFFSET_TM2CNT)
+#define REG_ADDR_TM2CNT_L (REG_BASE + REG_OFFSET_TM2CNT_L)
+#define REG_ADDR_TM2CNT_H (REG_BASE + REG_OFFSET_TM2CNT_H)
+#define REG_ADDR_TM3CNT (REG_BASE + REG_OFFSET_TM3CNT)
+#define REG_ADDR_TM3CNT_L (REG_BASE + REG_OFFSET_TM3CNT_L)
+#define REG_ADDR_TM3CNT_H (REG_BASE + REG_OFFSET_TM3CNT_H)
+
+#define REG_ADDR_SIOCNT (REG_BASE + REG_OFFSET_SIOCNT)
+#define REG_ADDR_SIODATA8 (REG_BASE + REG_OFFSET_SIODATA8)
+#define REG_ADDR_SIODATA32 (REG_BASE + REG_OFFSET_SIODATA32)
+#define REG_ADDR_SIOMLT_SEND (REG_BASE + REG_OFFSET_SIOMLT_SEND)
+#define REG_ADDR_SIOMLT_RECV (REG_BASE + REG_OFFSET_SIOMLT_RECV)
+#define REG_ADDR_SIOMULTI0 (REG_BASE + REG_OFFSET_SIOMULTI0)
+#define REG_ADDR_SIOMULTI1 (REG_BASE + REG_OFFSET_SIOMULTI1)
+#define REG_ADDR_SIOMULTI2 (REG_BASE + REG_OFFSET_SIOMULTI2)
+#define REG_ADDR_SIOMULTI3 (REG_BASE + REG_OFFSET_SIOMULTI3)
+
+#define REG_ADDR_KEYINPUT (REG_BASE + REG_OFFSET_KEYINPUT)
+#define REG_ADDR_KEYCNT (REG_BASE + REG_OFFSET_KEYCNT)
+
+#define REG_ADDR_RCNT (REG_BASE + REG_OFFSET_RCNT)
+
+#define REG_ADDR_JOYCNT (REG_BASE + REG_OFFSET_JOYCNT)
+#define REG_ADDR_JOYSTAT (REG_BASE + REG_OFFSET_JOYSTAT)
+#define REG_ADDR_JOY_RECV (REG_BASE + REG_OFFSET_JOY_RECV)
+#define REG_ADDR_JOY_RECV_L (REG_BASE + REG_OFFSET_JOY_RECV_L)
+#define REG_ADDR_JOY_RECV_H (REG_BASE + REG_OFFSET_JOY_RECV_H)
+#define REG_ADDR_JOY_TRANS (REG_BASE + REG_OFFSET_JOY_TRANS)
+#define REG_ADDR_JOY_TRANS_L (REG_BASE + REG_OFFSET_JOY_TRANS_L)
+#define REG_ADDR_JOY_TRANS_H (REG_BASE + REG_OFFSET_JOY_TRANS_H)
+
+#define REG_ADDR_IME (REG_BASE + REG_OFFSET_IME)
+#define REG_ADDR_IE (REG_BASE + REG_OFFSET_IE)
+#define REG_ADDR_IF (REG_BASE + REG_OFFSET_IF)
+
+#define REG_ADDR_WAITCNT (REG_BASE + REG_OFFSET_WAITCNT)
+
+// I/O registers
+
+#define REG_DISPCNT (*(vu16 *)REG_ADDR_DISPCNT)
+#define REG_DISPSTAT (*(vu16 *)REG_ADDR_DISPSTAT)
+#define REG_VCOUNT (*(vu16 *)REG_ADDR_VCOUNT)
+#define REG_BG0CNT (*(vu16 *)REG_ADDR_BG0CNT)
+#define REG_BG1CNT (*(vu16 *)REG_ADDR_BG1CNT)
+#define REG_BG2CNT (*(vu16 *)REG_ADDR_BG2CNT)
+#define REG_BG3CNT (*(vu16 *)REG_ADDR_BG3CNT)
+#define REG_BG0HOFS (*(vu16 *)REG_ADDR_BG0HOFS)
+#define REG_BG0VOFS (*(vu16 *)REG_ADDR_BG0VOFS)
+#define REG_BG1HOFS (*(vu16 *)REG_ADDR_BG1HOFS)
+#define REG_BG1VOFS (*(vu16 *)REG_ADDR_BG1VOFS)
+#define REG_BG2HOFS (*(vu16 *)REG_ADDR_BG2HOFS)
+#define REG_BG2VOFS (*(vu16 *)REG_ADDR_BG2VOFS)
+#define REG_BG3HOFS (*(vu16 *)REG_ADDR_BG3HOFS)
+#define REG_BG3VOFS (*(vu16 *)REG_ADDR_BG3VOFS)
+#define REG_BG2PA (*(vu16 *)REG_ADDR_BG2PA)
+#define REG_BG2PB (*(vu16 *)REG_ADDR_BG2PB)
+#define REG_BG2PC (*(vu16 *)REG_ADDR_BG2PC)
+#define REG_BG2PD (*(vu16 *)REG_ADDR_BG2PD)
+#define REG_BG2X (*(vu32 *)REG_ADDR_BG2X)
+#define REG_BG2X_L (*(vu16 *)REG_ADDR_BG2X_L)
+#define REG_BG2X_H (*(vu16 *)REG_ADDR_BG2X_H)
+#define REG_BG2Y (*(vu32 *)REG_ADDR_BG2Y)
+#define REG_BG2Y_L (*(vu16 *)REG_ADDR_BG2Y_L)
+#define REG_BG2Y_H (*(vu16 *)REG_ADDR_BG2Y_H)
+#define REG_BG3PA (*(vu16 *)REG_ADDR_BG3PA)
+#define REG_BG3PB (*(vu16 *)REG_ADDR_BG3PB)
+#define REG_BG3PC (*(vu16 *)REG_ADDR_BG3PC)
+#define REG_BG3PD (*(vu16 *)REG_ADDR_BG3PD)
+#define REG_BG3X (*(vu32 *)REG_ADDR_BG3X)
+#define REG_BG3X_L (*(vu16 *)REG_ADDR_BG3X_L)
+#define REG_BG3X_H (*(vu16 *)REG_ADDR_BG3X_H)
+#define REG_BG3Y (*(vu32 *)REG_ADDR_BG3Y)
+#define REG_BG3Y_L (*(vu16 *)REG_ADDR_BG3Y_L)
+#define REG_BG3Y_H (*(vu16 *)REG_ADDR_BG3Y_H)
+#define REG_WIN0H (*(vu16 *)REG_ADDR_WIN0H)
+#define REG_WIN1H (*(vu16 *)REG_ADDR_WIN1H)
+#define REG_WIN0V (*(vu16 *)REG_ADDR_WIN0V)
+#define REG_WIN1V (*(vu16 *)REG_ADDR_WIN1V)
+#define REG_WININ (*(vu16 *)REG_ADDR_WININ)
+#define REG_WINOUT (*(vu16 *)REG_ADDR_WINOUT)
+#define REG_MOSAIC (*(vu16 *)REG_ADDR_MOSAIC)
+#define REG_BLDCNT (*(vu16 *)REG_ADDR_BLDCNT)
+#define REG_BLDALPHA (*(vu16 *)REG_ADDR_BLDALPHA)
+#define REG_BLDY (*(vu16 *)REG_ADDR_BLDY)
+
+#define REG_SOUND1CNT_L (*(vu16 *)REG_ADDR_SOUND1CNT_L)
+#define REG_NR10 (*(vu8 *)REG_ADDR_NR10)
+#define REG_SOUND1CNT_H (*(vu16 *)REG_ADDR_SOUND1CNT_H)
+#define REG_NR11 (*(vu8 *)REG_ADDR_NR11)
+#define REG_NR12 (*(vu8 *)REG_ADDR_NR12)
+#define REG_SOUND1CNT_X (*(vu16 *)REG_ADDR_SOUND1CNT_X)
+#define REG_NR13 (*(vu8 *)REG_ADDR_NR13)
+#define REG_NR14 (*(vu8 *)REG_ADDR_NR14)
+#define REG_SOUND2CNT_L (*(vu16 *)REG_ADDR_SOUND2CNT_L)
+#define REG_NR21 (*(vu8 *)REG_ADDR_NR21)
+#define REG_NR22 (*(vu8 *)REG_ADDR_NR22)
+#define REG_SOUND2CNT_H (*(vu16 *)REG_ADDR_SOUND2CNT_H)
+#define REG_NR23 (*(vu8 *)REG_ADDR_NR23)
+#define REG_NR24 (*(vu8 *)REG_ADDR_NR24)
+#define REG_SOUND3CNT_L (*(vu16 *)REG_ADDR_SOUND3CNT_L)
+#define REG_NR30 (*(vu8 *)REG_ADDR_NR30)
+#define REG_SOUND3CNT_H (*(vu16 *)REG_ADDR_SOUND3CNT_H)
+#define REG_NR31 (*(vu8 *)REG_ADDR_NR31)
+#define REG_NR32 (*(vu8 *)REG_ADDR_NR32)
+#define REG_SOUND3CNT_X (*(vu16 *)REG_ADDR_SOUND3CNT_X)
+#define REG_NR33 (*(vu8 *)REG_ADDR_NR33)
+#define REG_NR34 (*(vu8 *)REG_ADDR_NR34)
+#define REG_SOUND4CNT_L (*(vu16 *)REG_ADDR_SOUND4CNT_L)
+#define REG_NR41 (*(vu8 *)REG_ADDR_NR41)
+#define REG_NR42 (*(vu8 *)REG_ADDR_NR42)
+#define REG_SOUND4CNT_H (*(vu16 *)REG_ADDR_SOUND4CNT_H)
+#define REG_NR43 (*(vu8 *)REG_ADDR_NR43)
+#define REG_NR44 (*(vu8 *)REG_ADDR_NR44)
+#define REG_SOUNDCNT_L (*(vu16 *)REG_ADDR_SOUNDCNT_L)
+#define REG_NR50 (*(vu8 *)REG_ADDR_NR50)
+#define REG_NR51 (*(vu8 *)REG_ADDR_NR51)
+#define REG_SOUNDCNT_H (*(vu16 *)REG_ADDR_SOUNDCNT_H)
+#define REG_SOUNDCNT_X (*(vu16 *)REG_ADDR_SOUNDCNT_X)
+#define REG_NR52 (*(vu8 *)REG_ADDR_NR52)
+#define REG_SOUNDBIAS (*(vu16 *)REG_ADDR_SOUNDBIAS)
+#define REG_SOUNDBIAS_L (*(vu8 *)REG_ADDR_SOUNDBIAS_L)
+#define REG_SOUNDBIAS_H (*(vu8 *)REG_ADDR_SOUNDBIAS_H)
+#define REG_WAVE_RAM0 (*(vu32 *)REG_ADDR_WAVE_RAM0)
+#define REG_WAVE_RAM1 (*(vu32 *)REG_ADDR_WAVE_RAM1)
+#define REG_WAVE_RAM2 (*(vu32 *)REG_ADDR_WAVE_RAM2)
+#define REG_WAVE_RAM3 (*(vu32 *)REG_ADDR_WAVE_RAM3)
+#define REG_FIFO_A (*(vu32 *)REG_ADDR_FIFO_A)
+#define REG_FIFO_B (*(vu32 *)REG_ADDR_FIFO_B)
+
+#define REG_DMA0SAD (*(vu32 *)REG_ADDR_DMA0SAD)
+#define REG_DMA0DAD (*(vu32 *)REG_ADDR_DMA0DAD)
+#define REG_DMA0CNT (*(vu32 *)REG_ADDR_DMA0CNT)
+#define REG_DMA0CNT_L (*(vu16 *)REG_ADDR_DMA0CNT_L)
+#define REG_DMA0CNT_H (*(vu16 *)REG_ADDR_DMA0CNT_H)
+
+#define REG_DMA1SAD (*(vu32 *)REG_ADDR_DMA1SAD)
+#define REG_DMA1DAD (*(vu32 *)REG_ADDR_DMA1DAD)
+#define REG_DMA1CNT (*(vu32 *)REG_ADDR_DMA1CNT)
+#define REG_DMA1CNT_L (*(vu16 *)REG_ADDR_DMA1CNT_L)
+#define REG_DMA1CNT_H (*(vu16 *)REG_ADDR_DMA1CNT_H)
+
+#define REG_DMA2SAD (*(vu32 *)REG_ADDR_DMA2SAD)
+#define REG_DMA2DAD (*(vu32 *)REG_ADDR_DMA2DAD)
+#define REG_DMA2CNT (*(vu32 *)REG_ADDR_DMA2CNT)
+#define REG_DMA2CNT_L (*(vu16 *)REG_ADDR_DMA2CNT_L)
+#define REG_DMA2CNT_H (*(vu16 *)REG_ADDR_DMA2CNT_H)
+
+#define REG_DMA3SAD (*(vu32 *)REG_ADDR_DMA3SAD)
+#define REG_DMA3DAD (*(vu32 *)REG_ADDR_DMA3DAD)
+#define REG_DMA3CNT (*(vu32 *)REG_ADDR_DMA3CNT)
+#define REG_DMA3CNT_L (*(vu16 *)REG_ADDR_DMA3CNT_L)
+#define REG_DMA3CNT_H (*(vu16 *)REG_ADDR_DMA3CNT_H)
+
+#define REG_TMCNT(n) (*(vu16 *)(REG_ADDR_TMCNT + ((n) * 4)))
+#define REG_TMCNT_L(n) (*(vu16 *)(REG_ADDR_TMCNT_L + ((n) * 4)))
+#define REG_TMCNT_H(n) (*(vu16 *)(REG_ADDR_TMCNT_H + ((n) * 4)))
+#define REG_TM0CNT (*(vu32 *)REG_ADDR_TM0CNT)
+#define REG_TM0CNT_L (*(vu16 *)REG_ADDR_TM0CNT_L)
+#define REG_TM0CNT_H (*(vu16 *)REG_ADDR_TM0CNT_H)
+#define REG_TM1CNT (*(vu32 *)REG_ADDR_TM1CNT)
+#define REG_TM1CNT_L (*(vu16 *)REG_ADDR_TM1CNT_L)
+#define REG_TM1CNT_H (*(vu16 *)REG_ADDR_TM1CNT_H)
+#define REG_TM2CNT (*(vu32 *)REG_ADDR_TM2CNT)
+#define REG_TM2CNT_L (*(vu16 *)REG_ADDR_TM2CNT_L)
+#define REG_TM2CNT_H (*(vu16 *)REG_ADDR_TM2CNT_H)
+#define REG_TM3CNT (*(vu32 *)REG_ADDR_TM3CNT)
+#define REG_TM3CNT_L (*(vu16 *)REG_ADDR_TM3CNT_L)
+#define REG_TM3CNT_H (*(vu16 *)REG_ADDR_TM3CNT_H)
+
+#define REG_SIOCNT (*(vu16 *)REG_ADDR_SIOCNT)
+#define REG_SIODATA8 (*(vu16 *)REG_ADDR_SIODATA8)
+#define REG_SIODATA32 (*(vu32 *)REG_ADDR_SIODATA32)
+#define REG_SIOMLT_SEND (*(vu16 *)REG_ADDR_SIOMLT_SEND)
+#define REG_SIOMLT_RECV (*(vu64 *)REG_ADDR_SIOMLT_RECV)
+#define REG_SIOMULTI0 (*(vu16 *)REG_ADDR_SIOMULTI0)
+#define REG_SIOMULTI1 (*(vu16 *)REG_ADDR_SIOMULTI1)
+#define REG_SIOMULTI2 (*(vu16 *)REG_ADDR_SIOMULTI2)
+#define REG_SIOMULTI3 (*(vu16 *)REG_ADDR_SIOMULTI3)
+
+#define REG_KEYINPUT (*(vu16 *)REG_ADDR_KEYINPUT)
+#define REG_KEYCNT (*(vu16 *)REG_ADDR_KEYCNT)
+
+#define REG_RCNT (*(vu16 *)REG_ADDR_RCNT)
+
+#define REG_IME (*(vu16 *)REG_ADDR_IME)
+#define REG_IE (*(vu16 *)REG_ADDR_IE)
+#define REG_IF (*(vu16 *)REG_ADDR_IF)
+
+#define REG_WAITCNT (*(vu16 *)REG_ADDR_WAITCNT)
+
+// I/O register fields
+
+// DISPCNT
+#define DISPCNT_MODE_0 0x0000 // BG0: text, BG1: text, BG2: text, BG3: text
+#define DISPCNT_MODE_1 0x0001 // BG0: text, BG1: text, BG2: affine, BG3: off
+#define DISPCNT_MODE_2 0x0002 // BG0: off, BG1: off, BG2: affine, BG3: affine
+#define DISPCNT_MODE_3 0x0003 // Bitmap mode, 240x160, BGR555 color
+#define DISPCNT_MODE_4 0x0004 // Bitmap mode, 240x160, 256 color palette
+#define DISPCNT_MODE_5 0x0005 // Bitmap mode, 160x128, BGR555 color
+#define DISPCNT_HBLANK_INTERVAL 0x0020 // Allow access to OAM during H-Blank
+#define DISPCNT_OBJ_1D_MAP 0x0040
+#define DISPCNT_FORCED_BLANK 0x0080
+#define DISPCNT_BG0_ON 0x0100
+#define DISPCNT_BG1_ON 0x0200
+#define DISPCNT_BG2_ON 0x0400
+#define DISPCNT_BG3_ON 0x0800
+#define DISPCNT_BG_ALL_ON 0x0F00
+#define DISPCNT_OBJ_ON 0x1000
+#define DISPCNT_WIN0_ON 0x2000
+#define DISPCNT_WIN1_ON 0x4000
+#define DISPCNT_OBJWIN_ON 0x8000
+
+// DISPSTAT
+#define DISPSTAT_VBLANK 0x0001 // in V-Blank
+#define DISPSTAT_HBLANK 0x0002 // in H-Blank
+#define DISPSTAT_VCOUNT 0x0004 // V-Count match
+#define DISPSTAT_VBLANK_INTR 0x0008 // V-Blank interrupt enabled
+#define DISPSTAT_HBLANK_INTR 0x0010 // H-Blank interrupt enabled
+#define DISPSTAT_VCOUNT_INTR 0x0020 // V-Count interrupt enabled
+
+// BGCNT
+#define BGCNT_PRIORITY(n) (n) // Values 0 - 3. Lower priority BGs will be drawn on top of higher priority BGs.
+#define BGCNT_CHARBASE(n) ((n) << 2) // Values 0 - 3. Base block for tile pixel data.
+#define BGCNT_MOSAIC 0x0040
+#define BGCNT_16COLOR 0x0000 // 4 bits per pixel
+#define BGCNT_256COLOR 0x0080 // 8 bits per pixel
+#define BGCNT_SCREENBASE(n) ((n) << 8) // Values 0 - 31. Base block for tile map.
+#define BGCNT_WRAP 0x2000 // Only affects affine BGs. Text BGs wrap by default.
+#define BGCNT_TXT256x256 0x0000 // Internal screen size size of text mode BG in pixels.
+#define BGCNT_TXT512x256 0x4000
+#define BGCNT_TXT256x512 0x8000
+#define BGCNT_TXT512x512 0xC000
+#define BGCNT_AFF128x128 0x0000 // Internal screen size size of affine mode BG in pixels.
+#define BGCNT_AFF256x256 0x4000
+#define BGCNT_AFF512x512 0x8000
+#define BGCNT_AFF1024x1024 0xC000
+
+// WININ/OUT
+#define WININ_WIN0_BG0 (1 << 0)
+#define WININ_WIN0_BG1 (1 << 1)
+#define WININ_WIN0_BG2 (1 << 2)
+#define WININ_WIN0_BG3 (1 << 3)
+#define WININ_WIN0_BG_ALL (WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3)
+#define WININ_WIN0_OBJ (1 << 4)
+#define WININ_WIN0_CLR (1 << 5)
+#define WININ_WIN1_BG0 (1 << 8)
+#define WININ_WIN1_BG1 (1 << 9)
+#define WININ_WIN1_BG2 (1 << 10)
+#define WININ_WIN1_BG3 (1 << 11)
+#define WININ_WIN1_BG_ALL (WININ_WIN1_BG0 | WININ_WIN1_BG1 | WININ_WIN1_BG2 | WININ_WIN1_BG3)
+#define WININ_WIN1_OBJ (1 << 12)
+#define WININ_WIN1_CLR (1 << 13)
+
+#define WINOUT_WIN01_BG0 (1 << 0)
+#define WINOUT_WIN01_BG1 (1 << 1)
+#define WINOUT_WIN01_BG2 (1 << 2)
+#define WINOUT_WIN01_BG3 (1 << 3)
+#define WINOUT_WIN01_BG_ALL (WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3)
+#define WINOUT_WIN01_OBJ (1 << 4)
+#define WINOUT_WIN01_CLR (1 << 5)
+#define WINOUT_WINOBJ_BG0 (1 << 8)
+#define WINOUT_WINOBJ_BG1 (1 << 9)
+#define WINOUT_WINOBJ_BG2 (1 << 10)
+#define WINOUT_WINOBJ_BG3 (1 << 11)
+#define WINOUT_WINOBJ_BG_ALL (WINOUT_WINOBJ_BG0 | WINOUT_WINOBJ_BG1 | WINOUT_WINOBJ_BG2 | WINOUT_WINOBJ_BG3)
+#define WINOUT_WINOBJ_OBJ (1 << 12)
+#define WINOUT_WINOBJ_CLR (1 << 13)
+
+#define WIN_RANGE(a, b) (((a) << 8) | (b))
+#define WIN_RANGE2(a, b) ((b) | ((a) << 8))
+
+// BLDCNT
+// Bits 0-5 select layers for the 1st target
+#define BLDCNT_TGT1_BG0 (1 << 0)
+#define BLDCNT_TGT1_BG1 (1 << 1)
+#define BLDCNT_TGT1_BG2 (1 << 2)
+#define BLDCNT_TGT1_BG3 (1 << 3)
+#define BLDCNT_TGT1_OBJ (1 << 4)
+#define BLDCNT_TGT1_BD (1 << 5)
+#define BLDCNT_TGT1_ALL (BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD)
+// Bits 6-7 select the special effect
+#define BLDCNT_EFFECT_NONE (0 << 6) // no special effect
+#define BLDCNT_EFFECT_BLEND (1 << 6) // 1st+2nd targets mixed (controlled by BLDALPHA)
+#define BLDCNT_EFFECT_LIGHTEN (2 << 6) // 1st target becomes whiter (controlled by BLDY)
+#define BLDCNT_EFFECT_DARKEN (3 << 6) // 1st target becomes blacker (controlled by BLDY)
+// Bits 8-13 select layers for the 2nd target
+#define BLDCNT_TGT2_BG0 (1 << 8)
+#define BLDCNT_TGT2_BG1 (1 << 9)
+#define BLDCNT_TGT2_BG2 (1 << 10)
+#define BLDCNT_TGT2_BG3 (1 << 11)
+#define BLDCNT_TGT2_OBJ (1 << 12)
+#define BLDCNT_TGT2_BD (1 << 13)
+#define BLDCNT_TGT2_ALL (BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD)
+
+// BLDALPHA
+#define BLDALPHA_BLEND(target1, target2) (((target2) << 8) | (target1))
+
+// SOUNDCNT_H
+#define SOUND_CGB_MIX_QUARTER 0x0000
+#define SOUND_CGB_MIX_HALF 0x0001
+#define SOUND_CGB_MIX_FULL 0x0002
+#define SOUND_A_MIX_HALF 0x0000
+#define SOUND_A_MIX_FULL 0x0004
+#define SOUND_B_MIX_HALF 0x0000
+#define SOUND_B_MIX_FULL 0x0008
+#define SOUND_ALL_MIX_FULL 0x000E
+#define SOUND_A_RIGHT_OUTPUT 0x0100
+#define SOUND_A_LEFT_OUTPUT 0x0200
+#define SOUND_A_TIMER_0 0x0000
+#define SOUND_A_TIMER_1 0x0400
+#define SOUND_A_FIFO_RESET 0x0800
+#define SOUND_B_RIGHT_OUTPUT 0x1000
+#define SOUND_B_LEFT_OUTPUT 0x2000
+#define SOUND_B_TIMER_0 0x0000
+#define SOUND_B_TIMER_1 0x4000
+#define SOUND_B_FIFO_RESET 0x8000
+
+// SOUNDCNT_X
+#define SOUND_1_ON 0x0001
+#define SOUND_2_ON 0x0002
+#define SOUND_3_ON 0x0004
+#define SOUND_4_ON 0x0008
+#define SOUND_MASTER_ENABLE 0x0080
+
+// DMA
+#define DMA_DEST_INC 0x0000
+#define DMA_DEST_DEC 0x0020
+#define DMA_DEST_FIXED 0x0040
+#define DMA_DEST_RELOAD 0x0060
+#define DMA_SRC_INC 0x0000
+#define DMA_SRC_DEC 0x0080
+#define DMA_SRC_FIXED 0x0100
+#define DMA_REPEAT 0x0200
+#define DMA_16BIT 0x0000
+#define DMA_32BIT 0x0400
+#define DMA_DREQ_ON 0x0800
+#define DMA_START_NOW 0x0000
+#define DMA_START_VBLANK 0x1000
+#define DMA_START_HBLANK 0x2000
+#define DMA_START_SPECIAL 0x3000
+#define DMA_START_MASK 0x3000
+#define DMA_INTR_ENABLE 0x4000
+#define DMA_ENABLE 0x8000
+
+// timer
+#define TIMER_1CLK 0x00
+#define TIMER_64CLK 0x01
+#define TIMER_256CLK 0x02
+#define TIMER_1024CLK 0x03
+#define TIMER_INTR_ENABLE 0x40
+#define TIMER_ENABLE 0x80
+
+// serial
+#define SIO_ID 0x0030 // Communication ID
+
+#define SIO_8BIT_MODE 0x0000 // Normal 8-bit communication mode
+#define SIO_32BIT_MODE 0x1000 // Normal 32-bit communication mode
+#define SIO_MULTI_MODE 0x2000 // Multi-player communication mode
+#define SIO_UART_MODE 0x3000 // UART communication mode
+
+#define SIO_9600_BPS 0x0000 // baud rate 9600 bps
+#define SIO_38400_BPS 0x0001 // 38400 bps
+#define SIO_57600_BPS 0x0002 // 57600 bps
+#define SIO_115200_BPS 0x0003 // 115200 bps
+
+#define SIO_MULTI_SI 0x0004 // Multi-player communication SI terminal
+#define SIO_MULTI_SD 0x0008 // SD terminal
+#define SIO_MULTI_BUSY 0x0080
+
+#define SIO_ERROR 0x0040 // Detect error
+#define SIO_START 0x0080 // Start transfer
+#define SIO_ENABLE 0x0080 // Enable SIO
+
+#define SIO_INTR_ENABLE 0x4000
+
+#define SIO_MULTI_SI_SHIFT 2
+#define SIO_MULTI_SI_MASK 0x1
+#define SIO_MULTI_DI_SHIFT 3
+#define SIO_MULTI_DI_MASK 0x1
+
+// keys
+#define A_BUTTON 0x0001
+#define B_BUTTON 0x0002
+#define SELECT_BUTTON 0x0004
+#define START_BUTTON 0x0008
+#define DPAD_RIGHT 0x0010
+#define DPAD_LEFT 0x0020
+#define DPAD_UP 0x0040
+#define DPAD_DOWN 0x0080
+#define R_BUTTON 0x0100
+#define L_BUTTON 0x0200
+#define KEYS_MASK 0x03FF
+#define KEY_INTR_ENABLE 0x0400
+#define KEY_OR_INTR 0x0000
+#define KEY_AND_INTR 0x8000
+#define DPAD_ANY ((DPAD_RIGHT | DPAD_LEFT | DPAD_UP | DPAD_DOWN))
+#define JOY_EXCL_DPAD 0x030F
+
+// interrupt flags
+#define INTR_FLAG_VBLANK (1 << 0)
+#define INTR_FLAG_HBLANK (1 << 1)
+#define INTR_FLAG_VCOUNT (1 << 2)
+#define INTR_FLAG_TIMER0 (1 << 3)
+#define INTR_FLAG_TIMER1 (1 << 4)
+#define INTR_FLAG_TIMER2 (1 << 5)
+#define INTR_FLAG_TIMER3 (1 << 6)
+#define INTR_FLAG_SERIAL (1 << 7)
+#define INTR_FLAG_DMA0 (1 << 8)
+#define INTR_FLAG_DMA1 (1 << 9)
+#define INTR_FLAG_DMA2 (1 << 10)
+#define INTR_FLAG_DMA3 (1 << 11)
+#define INTR_FLAG_KEYPAD (1 << 12)
+#define INTR_FLAG_GAMEPAK (1 << 13)
+
+// WAITCNT
+#define WAITCNT_SRAM_4 (0 << 0)
+#define WAITCNT_SRAM_3 (1 << 0)
+#define WAITCNT_SRAM_2 (2 << 0)
+#define WAITCNT_SRAM_8 (3 << 0)
+#define WAITCNT_SRAM_MASK (3 << 0)
+
+#define WAITCNT_WS0_N_4 (0 << 2)
+#define WAITCNT_WS0_N_3 (1 << 2)
+#define WAITCNT_WS0_N_2 (2 << 2)
+#define WAITCNT_WS0_N_8 (3 << 2)
+#define WAITCNT_WS0_N_MASK (3 << 2)
+
+#define WAITCNT_WS0_S_2 (0 << 4)
+#define WAITCNT_WS0_S_1 (1 << 4)
+
+#define WAITCNT_WS1_N_4 (0 << 5)
+#define WAITCNT_WS1_N_3 (1 << 5)
+#define WAITCNT_WS1_N_2 (2 << 5)
+#define WAITCNT_WS1_N_8 (3 << 5)
+#define WAITCNT_WS1_N_MASK (3 << 5)
+
+#define WAITCNT_WS1_S_4 (0 << 7)
+#define WAITCNT_WS1_S_1 (1 << 7)
+
+#define WAITCNT_WS2_N_4 (0 << 8)
+#define WAITCNT_WS2_N_3 (1 << 8)
+#define WAITCNT_WS2_N_2 (2 << 8)
+#define WAITCNT_WS2_N_8 (3 << 8)
+#define WAITCNT_WS2_N_MASK (3 << 8)
+
+#define WAITCNT_WS2_S_8 (0 << 10)
+#define WAITCNT_WS2_S_1 (1 << 10)
+
+#define WAITCNT_PHI_OUT_NONE (0 << 11)
+#define WAITCNT_PHI_OUT_4MHZ (1 << 11)
+#define WAITCNT_PHI_OUT_8MHZ (2 << 11)
+#define WAITCNT_PHI_OUT_16MHZ (3 << 11)
+#define WAITCNT_PHI_OUT_MASK (3 << 11)
+
+#define WAITCNT_PREFETCH_ENABLE (1 << 14)
+
+#define WAITCNT_AGB (0 << 15)
+#define WAITCNT_CGB (1 << 15)
+
+#endif // GUARD_GBA_IO_REG_H
diff --git a/berry_fix/payload/include/gba/isagbprint.h b/berry_fix/payload/include/gba/isagbprint.h
new file mode 100644
index 000000000..c5eb456c3
--- /dev/null
+++ b/berry_fix/payload/include/gba/isagbprint.h
@@ -0,0 +1,50 @@
+#ifndef GUARD_GBA_ISAGBPRINT_H
+#define GUARD_GBA_ISAGBPRINT_H
+
+#ifdef NDEBUG
+#define AGBPrintInit()
+#define AGBPutc(cChr)
+#define AGBPrint(pBuf)
+#define AGBPrintf(pBuf, ...)
+#define AGBPrintFlush1Block()
+#define AGBPrintFlush()
+#define AGBAssert(pFile, nLine, pExpression, nStopProgram)
+#else
+void AGBPrintInit(void);
+void AGBPutc(const char cChr);
+void AGBPrint(const char *pBuf);
+void AGBPrintf(const char *pBuf, ...);
+void AGBPrintFlush1Block(void);
+void AGBPrintFlush(void);
+void AGBAssert(const char *pFile, int nLine, const char *pExpression, int nStopProgram);
+#endif
+
+#undef AGB_ASSERT
+#ifdef NDEBUG
+#define AGB_ASSERT(exp)
+#else
+#define AGB_ASSERT(exp) (exp) ? ((void*)0) : AGBAssert(__FILE__, __LINE__, #exp, 1);
+#endif
+
+#undef AGB_WARNING
+#ifdef NDEBUG
+#define AGB_WARNING(exp)
+#else
+#define AGB_WARNING(exp) (exp) ? ((void*)0) : AGBAssert(__FILE__, __LINE__, #exp, 0);
+#endif
+
+// for matching purposes
+
+#ifdef NDEBUG
+#define AGB_ASSERT_EX(exp, file, line)
+#else
+#define AGB_ASSERT_EX(exp, file, line) (exp) ? ((void*)0) : AGBAssert(file, line, #exp, 1);
+#endif
+
+#ifdef NDEBUG
+#define AGB_WARNING_EX(exp, file, line)
+#else
+#define AGB_WARNING_EX(exp, file, line) (exp) ? ((void*)0) : AGBAssert(file, line, #exp, 0);
+#endif
+
+#endif // GUARD_GBA_ISAGBPRINT_H
diff --git a/berry_fix/payload/include/gba/m4a_internal.h b/berry_fix/payload/include/gba/m4a_internal.h
new file mode 100644
index 000000000..339a0774e
--- /dev/null
+++ b/berry_fix/payload/include/gba/m4a_internal.h
@@ -0,0 +1,467 @@
+#ifndef GUARD_GBA_M4A_INTERNAL_H
+#define GUARD_GBA_M4A_INTERNAL_H
+
+#include "gba/gba.h"
+
+// ASCII encoding of 'Smsh' in reverse
+// This is presumably short for SMASH, the developer of MKS4AGB.
+#define ID_NUMBER 0x68736D53
+
+#define C_V 0x40 // center value for PAN, BEND, and TUNE
+
+#define SOUND_MODE_REVERB_VAL 0x0000007F
+#define SOUND_MODE_REVERB_SET 0x00000080
+#define SOUND_MODE_MAXCHN 0x00000F00
+#define SOUND_MODE_MAXCHN_SHIFT 8
+#define SOUND_MODE_MASVOL 0x0000F000
+#define SOUND_MODE_MASVOL_SHIFT 12
+#define SOUND_MODE_FREQ_05734 0x00010000
+#define SOUND_MODE_FREQ_07884 0x00020000
+#define SOUND_MODE_FREQ_10512 0x00030000
+#define SOUND_MODE_FREQ_13379 0x00040000
+#define SOUND_MODE_FREQ_15768 0x00050000
+#define SOUND_MODE_FREQ_18157 0x00060000
+#define SOUND_MODE_FREQ_21024 0x00070000
+#define SOUND_MODE_FREQ_26758 0x00080000
+#define SOUND_MODE_FREQ_31536 0x00090000
+#define SOUND_MODE_FREQ_36314 0x000A0000
+#define SOUND_MODE_FREQ_40137 0x000B0000
+#define SOUND_MODE_FREQ_42048 0x000C0000
+#define SOUND_MODE_FREQ 0x000F0000
+#define SOUND_MODE_FREQ_SHIFT 16
+#define SOUND_MODE_DA_BIT_9 0x00800000
+#define SOUND_MODE_DA_BIT_8 0x00900000
+#define SOUND_MODE_DA_BIT_7 0x00A00000
+#define SOUND_MODE_DA_BIT_6 0x00B00000
+#define SOUND_MODE_DA_BIT 0x00B00000
+#define SOUND_MODE_DA_BIT_SHIFT 20
+
+struct WaveData
+{
+ u16 type;
+ u16 status;
+ u32 freq;
+ u32 loopStart;
+ u32 size; // number of samples
+ s8 data[1]; // samples
+};
+
+#define TONEDATA_TYPE_CGB 0x07
+#define TONEDATA_TYPE_FIX 0x08
+#define TONEDATA_TYPE_SPL 0x40 // key split
+#define TONEDATA_TYPE_RHY 0x80 // rhythm
+
+#define TONEDATA_P_S_PAN 0xc0
+#define TONEDATA_P_S_PAM TONEDATA_P_S_PAN
+
+struct ToneData
+{
+ u8 type;
+ u8 key;
+ u8 length; // sound length (compatible sound)
+ u8 pan_sweep; // pan or sweep (compatible sound ch. 1)
+ struct WaveData *wav;
+ u8 attack;
+ u8 decay;
+ u8 sustain;
+ u8 release;
+};
+
+struct CgbChannel
+{
+ u8 sf;
+ u8 ty;
+ u8 rightVolume;
+ u8 leftVolume;
+ u8 at;
+ u8 de;
+ u8 su;
+ u8 re;
+ u8 ky;
+ u8 ev;
+ u8 eg;
+ u8 ec;
+ u8 echoVolume;
+ u8 echoLength;
+ u8 d1;
+ u8 d2;
+ u8 gt;
+ u8 mk;
+ u8 ve;
+ u8 pr;
+ u8 rp;
+ u8 d3[3];
+ u8 d5;
+ u8 sg;
+ u8 n4;
+ u8 pan;
+ u8 panMask;
+ u8 mo;
+ u8 le;
+ u8 sw;
+ u32 fr;
+ u32 wp;
+ u32 cp;
+ u32 tp;
+ u32 pp;
+ u32 np;
+ u8 d4[8];
+};
+
+struct MusicPlayerTrack;
+
+struct SoundChannel
+{
+ u8 status;
+ u8 type;
+ u8 rightVolume;
+ u8 leftVolume;
+ u8 attack;
+ u8 decay;
+ u8 sustain;
+ u8 release;
+ u8 ky;
+ u8 ev;
+ u8 er;
+ u8 el;
+ u8 echoVolume;
+ u8 echoLength;
+ u8 d1;
+ u8 d2;
+ u8 gt;
+ u8 mk;
+ u8 ve;
+ u8 pr;
+ u8 rp;
+ u8 d3[3];
+ u32 ct;
+ u32 fw;
+ u32 freq;
+ struct WaveData *wav;
+ u32 cp;
+ struct MusicPlayerTrack *track;
+ u32 pp;
+ u32 np;
+ u32 d4;
+ u16 xpi;
+ u16 xpc;
+};
+
+#define MAX_DIRECTSOUND_CHANNELS 12
+
+#define PCM_DMA_BUF_SIZE 1584 // size of Direct Sound buffer
+
+struct SoundInfo
+{
+ // This field is normally equal to ID_NUMBER but it is set to other
+ // values during sensitive operations for locking purposes.
+ // This field should be volatile but isn't. This could potentially cause
+ // race conditions.
+ u32 ident;
+
+ vu8 pcmDmaCounter;
+
+ // Direct Sound
+ u8 reverb;
+ u8 maxChans;
+ u8 masterVolume;
+ u8 freq;
+
+ u8 mode;
+ u8 c15;
+ u8 pcmDmaPeriod; // number of V-blanks per PCM DMA
+ u8 maxLines;
+ u8 gap[3];
+ s32 pcmSamplesPerVBlank;
+ s32 pcmFreq;
+ s32 divFreq;
+ struct CgbChannel *cgbChans;
+ u32 func;
+ u32 intp;
+ void (*CgbSound)(void);
+ void (*CgbOscOff)(u8);
+ u32 (*MidiKeyToCgbFreq)(u8, u8, u8);
+ u32 MPlayJumpTable;
+ u32 plynote;
+ u32 ExtVolPit;
+ u8 gap2[16];
+ struct SoundChannel chans[MAX_DIRECTSOUND_CHANNELS];
+ s8 pcmBuffer[PCM_DMA_BUF_SIZE * 2];
+};
+
+struct SongHeader
+{
+ u8 trackCount;
+ u8 blockCount;
+ u8 priority;
+ u8 reverb;
+ struct ToneData *tone;
+ u8 *part[1];
+};
+
+struct PokemonCrySong
+{
+ u8 trackCount;
+ u8 blockCount;
+ u8 priority;
+ u8 reverb;
+ struct ToneData *tone;
+ u8 *part[2];
+ u8 gap;
+ u8 part0; // 0x11
+ u8 tuneValue; // 0x12
+ u8 gotoCmd; // 0x13
+ u32 gotoTarget; // 0x14
+ u8 part1; // 0x18
+ u8 tuneValue2; // 0x19
+ u8 cont[2]; // 0x1A
+ u8 volCmd; // 0x1C
+ u8 volumeValue; // 0x1D
+ u8 unkCmd0D[2]; // 0x1E
+ u32 unkCmd0DParam; // 0x20
+ u8 xreleCmd[2]; // 0x24
+ u8 releaseValue; // 0x26
+ u8 panCmd;
+ u8 panValue; // 0x28
+ u8 tieCmd; // 0x29
+ u8 tieKeyValue; // 0x2A
+ u8 tieVelocityValue; // 0x2B
+ u8 unkCmd0C[2]; // 0x2C
+ u16 unkCmd0CParam; // 0x2E
+ u8 end[2]; // 0x30
+};
+
+#define MPT_FLG_VOLSET 0x01
+#define MPT_FLG_VOLCHG 0x03
+#define MPT_FLG_PITSET 0x04
+#define MPT_FLG_PITCHG 0x0C
+#define MPT_FLG_START 0x40
+#define MPT_FLG_EXIST 0x80
+
+struct MusicPlayerTrack
+{
+ u8 flags;
+ u8 wait;
+ u8 patternLevel;
+ u8 repN;
+ u8 gateTime;
+ u8 key;
+ u8 velocity;
+ u8 runningStatus;
+ u8 keyM;
+ u8 pitM;
+ s8 keyShift;
+ s8 keyShiftX;
+ s8 tune;
+ u8 pitX;
+ s8 bend;
+ u8 bendRange;
+ u8 volMR;
+ u8 volML;
+ u8 vol;
+ u8 volX;
+ s8 pan;
+ s8 panX;
+ s8 modM;
+ u8 mod;
+ u8 modT;
+ u8 lfoSpeed;
+ u8 lfoSpeedC;
+ u8 lfoDelay;
+ u8 lfoDelayC;
+ u8 priority;
+ u8 echoVolume;
+ u8 echoLength;
+ struct SoundChannel *chan;
+ struct ToneData tone;
+ u8 gap[10];
+ u16 unk_3A;
+ u32 unk_3C;
+ u8 *cmdPtr;
+ u8 *patternStack[3];
+};
+
+#define MUSICPLAYER_STATUS_TRACK 0x0000ffff
+#define MUSICPLAYER_STATUS_PAUSE 0x80000000
+
+#define MAX_MUSICPLAYER_TRACKS 16
+
+#define TEMPORARY_FADE 0x0001
+#define FADE_IN 0x0002
+#define FADE_VOL_MAX 64
+#define FADE_VOL_SHIFT 2
+
+struct MusicPlayerInfo
+{
+ struct SongHeader *songHeader;
+ u32 status;
+ u8 trackCount;
+ u8 priority;
+ u8 cmd;
+ u8 unk_B;
+ u32 clock;
+ u8 gap[8];
+ u8 *memAccArea;
+ u16 tempoD;
+ u16 tempoU;
+ u16 tempoI;
+ u16 tempoC;
+ u16 fadeOI;
+ u16 fadeOC;
+ u16 fadeOV;
+ struct MusicPlayerTrack *tracks;
+ struct ToneData *tone;
+ u32 ident;
+ u32 func;
+ u32 intp;
+};
+
+struct MusicPlayer
+{
+ struct MusicPlayerInfo *info;
+ struct MusicPlayerTrack *track;
+ u8 unk_8;
+ u16 unk_A;
+};
+
+struct Song
+{
+ struct SongHeader *header;
+ u16 ms;
+ u16 me;
+};
+
+extern const struct MusicPlayer gMPlayTable[];
+extern const struct Song gSongTable[];
+
+
+
+extern u8 gMPlayMemAccArea[];
+
+//u8 gPokemonCrySong[52];
+//u8 gPokemonCrySongs[52 * MAX_POKEMON_CRIES];
+
+#define MAX_POKEMON_CRIES 2
+
+extern struct PokemonCrySong gPokemonCrySong;
+extern struct PokemonCrySong gPokemonCrySongs[];
+
+extern struct MusicPlayerInfo gPokemonCryMusicPlayers[];
+extern struct MusicPlayerTrack gPokemonCryTracks[];
+
+extern char SoundMainRAM[];
+
+extern void *gMPlayJumpTable[];
+
+typedef void (*XcmdFunc)(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+extern const XcmdFunc gXcmdTable[];
+
+extern struct CgbChannel gCgbChans[];
+
+extern const u8 gScaleTable[];
+extern const u32 gFreqTable[];
+extern const u16 gPcmSamplesPerVBlankTable[];
+
+extern const u8 gCgbScaleTable[];
+extern const s16 gCgbFreqTable[];
+extern const u8 gNoiseTable[];
+
+extern const struct PokemonCrySong gPokemonCrySongTemplate;
+
+extern const struct ToneData voicegroup000;
+
+extern char gNumMusicPlayers[];
+extern char gMaxLines[];
+
+#define NUM_MUSIC_PLAYERS ((u16)gNumMusicPlayers)
+#define MAX_LINES ((u32)gMaxLines)
+
+u32 umul3232H32(u32 multiplier, u32 multiplicand);
+void SoundMain(void);
+void SoundMainBTM(void);
+void TrackStop(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
+void MPlayMain(void);
+void RealClearChain(void *x);
+
+void MPlayContinue(struct MusicPlayerInfo *mplayInfo);
+void MPlayStart(struct MusicPlayerInfo *mplayInfo, struct SongHeader *songHeader);
+void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo);
+void FadeOutBody(struct MusicPlayerInfo *mplayInfo);
+void TrkVolPitSet(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
+void MPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed);
+void ClearChain(void *x);
+void Clear64byte(void *addr);
+void SoundInit(struct SoundInfo *soundInfo);
+void MPlayExtender(struct CgbChannel *cgbChans);
+void m4aSoundMode(u32 mode);
+void MPlayOpen(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track, u8 a3);
+void CgbSound(void);
+void CgbOscOff(u8);
+u32 MidiKeyToCgbFreq(u8, u8, u8);
+void DummyFunc(void);
+void MPlayJumpTableCopy(void **mplayJumpTable);
+void SampleFreqSet(u32 freq);
+void m4aSoundVSyncOn(void);
+void m4aSoundVSyncOff(void);
+
+void m4aMPlayTempoControl(struct MusicPlayerInfo *mplayInfo, u16 tempo);
+void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 volume);
+void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s16 pitch);
+void m4aMPlayPanpotControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s8 pan);
+void ClearModM(struct MusicPlayerTrack *track);
+void m4aMPlayModDepthSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 modDepth);
+void m4aMPlayLFOSpeedSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 lfoSpeed);
+
+struct MusicPlayerInfo *SetPokemonCryTone(struct ToneData *tone);
+void SetPokemonCryVolume(u8 val);
+void SetPokemonCryPanpot(s8 val);
+void SetPokemonCryPitch(s16 val);
+void SetPokemonCryLength(u16 val);
+void SetPokemonCryRelease(u8 val);
+void SetPokemonCryProgress(u32 val);
+int IsPokemonCryPlaying(struct MusicPlayerInfo *mplayInfo);
+void SetPokemonCryChorus(s8 val);
+void SetPokemonCryStereo(u32 val);
+void SetPokemonCryPriority(u8 val);
+
+// sound command handler functions
+void ply_fine(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_goto(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_patt(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_pend(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_rept(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_memacc(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_prio(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_tempo(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_keysh(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_voice(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_vol(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_pan(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_bend(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_bendr(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_lfos(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_lfodl(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_mod(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_modt(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_tune(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_port(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_xcmd(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_endtie(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_note(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+
+// extended sound command handler functions
+void ply_xxx(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_xwave(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_xtype(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_xatta(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_xdeca(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_xsust(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_xrele(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_xiecv(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_xiecl(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_xleng(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_xswee(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_xcmd_0C(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+void ply_xcmd_0D(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
+
+#endif // GUARD_GBA_M4A_INTERNAL_H
diff --git a/berry_fix/payload/include/gba/macro.h b/berry_fix/payload/include/gba/macro.h
new file mode 100644
index 000000000..6f9c55f2e
--- /dev/null
+++ b/berry_fix/payload/include/gba/macro.h
@@ -0,0 +1,247 @@
+#ifndef GUARD_GBA_MACRO_H
+#define GUARD_GBA_MACRO_H
+
+#define CPU_FILL(value, dest, size, bit) \
+{ \
+ vu##bit tmp = (vu##bit)(value); \
+ CpuSet((void *)&tmp, \
+ dest, \
+ CPU_SET_##bit##BIT | CPU_SET_SRC_FIXED | ((size)/(bit/8) & 0x1FFFFF)); \
+}
+
+#define CpuFill16(value, dest, size) CPU_FILL(value, dest, size, 16)
+#define CpuFill32(value, dest, size) CPU_FILL(value, dest, size, 32)
+
+#define CPU_COPY(src, dest, size, bit) CpuSet(src, dest, CPU_SET_##bit##BIT | ((size)/(bit/8) & 0x1FFFFF))
+
+#define CpuCopy16(src, dest, size) CPU_COPY(src, dest, size, 16)
+#define CpuCopy32(src, dest, size) CPU_COPY(src, dest, size, 32)
+
+#define CpuFastFill(value, dest, size) \
+{ \
+ vu32 tmp = (vu32)(value); \
+ CpuFastSet((void *)&tmp, \
+ dest, \
+ CPU_FAST_SET_SRC_FIXED | ((size)/(32/8) & 0x1FFFFF)); \
+}
+
+#define CpuFastFill16(value, dest, size) CpuFastFill(((value) << 16) | (value), (dest), (size))
+
+#define CpuFastFill8(value, dest, size) CpuFastFill(((value) << 24) | ((value) << 16) | ((value) << 8) | (value), (dest), (size))
+
+#define CpuFastCopy(src, dest, size) CpuFastSet(src, dest, ((size)/(32/8) & 0x1FFFFF))
+
+#define DmaSet(dmaNum, src, dest, control) \
+{ \
+ vu32 *dmaRegs = (vu32 *)REG_ADDR_DMA##dmaNum; \
+ dmaRegs[0] = (vu32)(src); \
+ dmaRegs[1] = (vu32)(dest); \
+ dmaRegs[2] = (vu32)(control); \
+ dmaRegs[2]; \
+}
+
+#define DMA_FILL(dmaNum, value, dest, size, bit) \
+{ \
+ vu##bit tmp = (vu##bit)(value); \
+ DmaSet(dmaNum, \
+ &tmp, \
+ dest, \
+ (DMA_ENABLE | DMA_START_NOW | DMA_##bit##BIT | DMA_SRC_FIXED | DMA_DEST_INC) << 16 \
+ | ((size)/(bit/8))); \
+}
+
+#define DmaFill16(dmaNum, value, dest, size) DMA_FILL(dmaNum, value, dest, size, 16)
+#define DmaFill32(dmaNum, value, dest, size) DMA_FILL(dmaNum, value, dest, size, 32)
+
+// Note that the DMA clear macros cause the DMA control value to be calculated
+// at runtime rather than compile time. The size is divided by the DMA transfer
+// unit size (2 or 4 bytes) and then combined with the DMA control flags using a
+// bitwise OR operation.
+
+#define DMA_CLEAR(dmaNum, dest, size, bit) \
+{ \
+ vu##bit *_dest = (vu##bit *)(dest); \
+ u32 _size = size; \
+ DmaFill##bit(dmaNum, 0, _dest, _size); \
+}
+
+#define DmaClear16(dmaNum, dest, size) DMA_CLEAR(dmaNum, dest, size, 16)
+#define DmaClear32(dmaNum, dest, size) DMA_CLEAR(dmaNum, dest, size, 32)
+
+#define DMA_COPY(dmaNum, src, dest, size, bit) \
+ DmaSet(dmaNum, \
+ src, \
+ dest, \
+ (DMA_ENABLE | DMA_START_NOW | DMA_##bit##BIT | DMA_SRC_INC | DMA_DEST_INC) << 16 \
+ | ((size)/(bit/8)))
+
+#define DmaCopy16(dmaNum, src, dest, size) DMA_COPY(dmaNum, src, dest, size, 16)
+#define DmaCopy32(dmaNum, src, dest, size) DMA_COPY(dmaNum, src, dest, size, 32)
+
+#define DmaCopyLarge(dmaNum, src, dest, size, block, bit) \
+{ \
+ const void *_src = src; \
+ void *_dest = (void *)dest; \
+ u32 _size = size; \
+ while (1) \
+ { \
+ DmaCopy##bit(dmaNum, _src, _dest, (block)); \
+ _src += (block); \
+ _dest += (block); \
+ _size -= (block); \
+ if (_size <= (block)) \
+ { \
+ DmaCopy##bit(dmaNum, _src, _dest, _size); \
+ break; \
+ } \
+ } \
+}
+
+#define DmaCopyLarge16(dmaNum, src, dest, size, block) DmaCopyLarge(dmaNum, src, dest, size, block, 16)
+
+#define DmaCopyLarge32(dmaNum, src, dest, size, block) DmaCopyLarge(dmaNum, src, dest, size, block, 32)
+
+#define DmaFillLarge(dmaNum, value, dest, size, block, bit) \
+{ \
+ void *_dest = (void *)dest; \
+ u32 _size = size; \
+ while (1) \
+ { \
+ DmaFill##bit(dmaNum, value, _dest, (block)); \
+ _dest += (block); \
+ _size -= (block); \
+ if (_size <= (block)) \
+ { \
+ DmaFill##bit(dmaNum, value, _dest, _size); \
+ break; \
+ } \
+ } \
+}
+
+#define DmaFillLarge16(dmaNum, value, dest, size, block) DmaFillLarge(dmaNum, value, dest, size, block, 16)
+
+#define DmaFillLarge32(dmaNum, value, dest, size, block) DmaFillLarge(dmaNum, value, dest, size, block, 32)
+
+#define DmaClearLarge(dmaNum, dest, size, block, bit) \
+{ \
+ void *_dest = (void *)dest; \
+ u32 _size = size; \
+ while (1) \
+ { \
+ DmaFill##bit(dmaNum, 0, _dest, (block)); \
+ _dest += (block); \
+ _size -= (block); \
+ if (_size <= (block)) \
+ { \
+ DmaFill##bit(dmaNum, 0, _dest, _size); \
+ break; \
+ } \
+ } \
+}
+
+#define DmaClearLarge16(dmaNum, dest, size, block) DmaClearLarge(dmaNum, dest, size, block, 16)
+
+#define DmaClearLarge32(dmaNum, dest, size, block) DmaClearLarge(dmaNum, dest, size, block, 32)
+
+#define DmaCopyDefvars(dmaNum, src, dest, size, bit) \
+{ \
+ const void *_src = src; \
+ void *_dest = (void *)(dest); \
+ u32 _size = size; \
+ DmaCopy##bit(dmaNum, _src, _dest, _size); \
+}
+
+#define DmaCopy16Defvars(dmaNum, src, dest, size) DmaCopyDefvars(dmaNum, src, dest, size, 16)
+#define DmaCopy32Defvars(dmaNum, src, dest, size) DmaCopyDefvars(dmaNum, src, dest, size, 32)
+
+#define DmaFillDefvars(dmaNum, value, dest, size, bit) \
+{ \
+ void *_dest = (void *)dest; \
+ u32 _size = size; \
+ DmaFill##bit(dmaNum, value, _dest, _size); \
+}
+
+#define DmaFill16Defvars(dmaNum, value, dest, size) DmaFillDefvars(dmaNum, value, dest, size, 16)
+#define DmaFill32Defvars(dmaNum, value, dest, size) DmaFillDefvars(dmaNum, value, dest, size, 32)
+
+#define DmaClearDefvars(dmaNum, dest, size, bit) \
+{ \
+ void *_dest = (void *)dest; \
+ u32 _size = size; \
+ DmaClear##bit(dmaNum, _dest, _size); \
+}
+
+#define DmaClear16Defvars(dmaNum, dest, size) DmaClearDefvars(dmaNum, dest, size, 16)
+#define DmaClear32Defvars(dmaNum, dest, size) DmaClearDefvars(dmaNum, dest, size, 32)
+
+#define DmaStop(dmaNum) \
+{ \
+ vu16 *dmaRegs = (vu16 *)REG_ADDR_DMA##dmaNum; \
+ dmaRegs[5] &= ~(DMA_START_MASK | DMA_DREQ_ON | DMA_REPEAT); \
+ dmaRegs[5] &= ~DMA_ENABLE; \
+ dmaRegs[5]; \
+}
+
+#define IntrEnable(flags) \
+{ \
+ u16 imeTemp; \
+ \
+ imeTemp = REG_IME; \
+ REG_IME = 0; \
+ REG_IE |= flags; \
+ REG_IME = imeTemp; \
+} \
+// from pokeemerald
+// Maximum amount of data we will transfer in one operation
+#define MAX_DMA_BLOCK_SIZE 0x1000
+
+#define MAX_DMA_REQUESTS 128
+
+#define DMA_REQUEST_COPY32 1
+#define DMA_REQUEST_FILL32 2
+#define DMA_REQUEST_COPY16 3
+#define DMA_REQUEST_FILL16 4
+
+#define Dma3CopyLarge_(src, dest, size, bit) \
+{ \
+ const void *_src = src; \
+ void *_dest = (void *)dest; \
+ u32 _size = size; \
+ while (1) \
+ { \
+ if (_size <= MAX_DMA_BLOCK_SIZE) \
+ { \
+ DmaCopy##bit(3, _src, _dest, _size); \
+ break; \
+ } \
+ DmaCopy##bit(3, _src, _dest, MAX_DMA_BLOCK_SIZE); \
+ _src += MAX_DMA_BLOCK_SIZE; \
+ _dest += MAX_DMA_BLOCK_SIZE; \
+ _size -= MAX_DMA_BLOCK_SIZE; \
+ } \
+}
+
+#define Dma3CopyLarge16_(src, dest, size) Dma3CopyLarge_(src, dest, size, 16)
+#define Dma3CopyLarge32_(src, dest, size) Dma3CopyLarge_(src, dest, size, 32)
+
+#define Dma3FillLarge_(value, dest, size, bit) \
+{ \
+ void *_dest = (void *)dest; \
+ u32 _size = size; \
+ while (1) \
+ { \
+ if (_size <= MAX_DMA_BLOCK_SIZE) \
+ { \
+ DmaFill##bit(3, value, _dest, _size); \
+ break; \
+ } \
+ DmaFill##bit(3, value, _dest, MAX_DMA_BLOCK_SIZE); \
+ _dest += MAX_DMA_BLOCK_SIZE; \
+ _size -= MAX_DMA_BLOCK_SIZE; \
+ } \
+}
+
+#define Dma3FillLarge16_(value, dest, size) Dma3FillLarge_(value, dest, size, 16)
+#define Dma3FillLarge32_(value, dest, size) Dma3FillLarge_(value, dest, size, 32)
+
+#endif // GUARD_GBA_MACRO_H
diff --git a/berry_fix/payload/include/gba/multiboot.h b/berry_fix/payload/include/gba/multiboot.h
new file mode 100644
index 000000000..14b6594b2
--- /dev/null
+++ b/berry_fix/payload/include/gba/multiboot.h
@@ -0,0 +1,55 @@
+#ifndef GUARD_GBA_MULTIBOOT_H
+#define GUARD_GBA_MULTIBOOT_H
+
+#define MULTIBOOT_NCHILD 3 // Maximum number of slaves
+#define MULTIBOOT_HEADER_SIZE 0xc0 // Header size
+#define MULTIBOOT_SEND_SIZE_MIN 0x100 // Minimum transmission size
+#define MULTIBOOT_SEND_SIZE_MAX 0x40000 // Maximum transmission size
+
+struct MultiBootParam
+{
+ u32 system_work[5]; // 00
+ u8 handshake_data; // 14
+ u8 padding; // 15
+ u16 handshake_timeout; // 16
+ u8 probe_count; // 18
+ u8 client_data[MULTIBOOT_NCHILD]; // 19
+ u8 palette_data; // 1c
+ u8 response_bit; // 1d
+ u8 client_bit; // 1e
+ u8 reserved1; // 1f
+ const u8 *boot_srcp; // 20
+ const u8 *boot_endp; // 24
+ const u8 *masterp;
+ u8 *reserved2[MULTIBOOT_NCHILD];
+ u32 system_work2[4];
+ u8 sendflag;
+ u8 probe_target_bit;
+ u8 check_wait;
+ u8 server_type;
+};
+
+#define MULTIBOOT_ERROR_04 0x04
+#define MULTIBOOT_ERROR_08 0x08
+#define MULTIBOOT_ERROR_0c 0x0c
+#define MULTIBOOT_ERROR_40 0x40
+#define MULTIBOOT_ERROR_44 0x44
+#define MULTIBOOT_ERROR_48 0x48
+#define MULTIBOOT_ERROR_4c 0x4c
+#define MULTIBOOT_ERROR_80 0x80
+#define MULTIBOOT_ERROR_84 0x84
+#define MULTIBOOT_ERROR_88 0x88
+#define MULTIBOOT_ERROR_8c 0x8c
+#define MULTIBOOT_ERROR_NO_PROBE_TARGET 0x50
+#define MULTIBOOT_ERROR_NO_DLREADY 0x60
+#define MULTIBOOT_ERROR_BOOT_FAILURE 0x70
+#define MULTIBOOT_ERROR_HANDSHAKE_FAILURE 0x71
+
+#define MULTIBOOT_CONNECTION_CHECK_WAIT 15
+
+#define MULTIBOOT_SERVER_TYPE_NORMAL 0
+#define MULTIBOOT_SERVER_TYPE_QUICK 1
+
+#define MULTIBOOT_HANDSHAKE_TIMEOUT 400
+
+#endif // GUARD_GBA_MULTIBOOT_H
diff --git a/berry_fix/payload/include/gba/syscall.h b/berry_fix/payload/include/gba/syscall.h
new file mode 100644
index 000000000..eb1bd4e20
--- /dev/null
+++ b/berry_fix/payload/include/gba/syscall.h
@@ -0,0 +1,57 @@
+#ifndef GUARD_GBA_SYSCALL_H
+#define GUARD_GBA_SYSCALL_H
+
+#include "gba/types.h"
+
+#define RESET_EWRAM 0x01
+#define RESET_IWRAM 0x02
+#define RESET_PALETTE 0x04
+#define RESET_VRAM 0x08
+#define RESET_OAM 0x10
+#define RESET_SIO_REGS 0x20
+#define RESET_SOUND_REGS 0x40
+#define RESET_REGS 0x80
+#define RESET_ALL 0xFF
+
+void SoftReset(u32 resetFlags);
+
+void RegisterRamReset(u32 resetFlags);
+
+void VBlankIntrWait(void);
+
+u16 Sqrt(u32 num);
+
+u16 ArcTan2(s16 x, s16 y);
+
+#define CPU_SET_SRC_FIXED 0x01000000
+#define CPU_SET_16BIT 0x00000000
+#define CPU_SET_32BIT 0x04000000
+
+void CpuSet(const void *src, void *dest, u32 control);
+
+#define CPU_FAST_SET_SRC_FIXED 0x01000000
+
+void CpuFastSet(const void *src, void *dest, u32 control);
+
+void BgAffineSet(struct BgAffineSrcData *src, struct BgAffineDstData *dest, s32 count);
+
+void ObjAffineSet(struct ObjAffineSrcData *src, void *dest, s32 count, s32 offset);
+
+void LZ77UnCompWram(const void *src, void *dest);
+
+void LZ77UnCompVram(const void *src, void *dest);
+
+void RLUnCompWram(const void *src, void *dest);
+
+void RLUnCompVram(const void *src, void *dest);
+
+int MultiBoot(struct MultiBootParam *mp);
+
+void SoundBiasReset(void);
+
+void SoundBiasSet(void);
+
+u32 Div(u32 divisor, u32 dividend);
+u32 Mod(u32 divisor, u32 dividend);
+
+#endif // GUARD_GBA_SYSCALL_H
diff --git a/berry_fix/payload/include/gba/types.h b/berry_fix/payload/include/gba/types.h
new file mode 100644
index 000000000..e919abc22
--- /dev/null
+++ b/berry_fix/payload/include/gba/types.h
@@ -0,0 +1,146 @@
+#ifndef GUARD_GBA_TYPES_H
+#define GUARD_GBA_TYPES_H
+
+#include <stdint.h>
+
+typedef uint8_t u8;
+typedef uint16_t u16;
+typedef uint32_t u32;
+typedef uint64_t u64;
+typedef int8_t s8;
+typedef int16_t s16;
+typedef int32_t s32;
+typedef int64_t s64;
+
+typedef volatile u8 vu8;
+typedef volatile u16 vu16;
+typedef volatile u32 vu32;
+typedef volatile u64 vu64;
+typedef volatile s8 vs8;
+typedef volatile s16 vs16;
+typedef volatile s32 vs32;
+typedef volatile s64 vs64;
+
+typedef float f32;
+typedef double f64;
+
+typedef u8 bool8;
+typedef u16 bool16;
+typedef u32 bool32;
+
+struct BgCnt
+{
+ u16 priority:2;
+ u16 charBaseBlock:2;
+ u16 dummy:2;
+ u16 mosaic:1;
+ u16 palettes:1;
+ u16 screenBaseBlock:5;
+ u16 areaOverflowMode:1;
+ u16 screenSize:2;
+};
+typedef volatile struct BgCnt vBgCnt;
+
+struct PlttData
+{
+ u16 r:5; // red
+ u16 g:5; // green
+ u16 b:5; // blue
+ u16 unused_15:1;
+};
+
+struct OamData
+{
+ /*0x00*/ u32 y:8;
+ /*0x01*/ u32 affineMode:2; // 0x1, 0x2 -> 0x4
+ u32 objMode:2; // 0x4, 0x8 -> 0xC
+ u32 mosaic:1; // 0x10
+ u32 bpp:1; // 0x20
+ u32 shape:2; // 0x40, 0x80 -> 0xC0
+
+ /*0x02*/ u32 x:9;
+ u32 matrixNum:5; // bits 3/4 are h-flip/v-flip if not in affine mode
+ u32 size:2;
+
+ /*0x04*/ u16 tileNum:10; // 0x3FF
+ u16 priority:2; // 0x400, 0x800 -> 0xC00
+ u16 paletteNum:4;
+ /*0x06*/ u16 affineParam;
+};
+
+#define ST_OAM_OBJ_NORMAL 0
+#define ST_OAM_OBJ_BLEND 1
+#define ST_OAM_OBJ_WINDOW 2
+
+#define ST_OAM_AFFINE_OFF 0
+#define ST_OAM_AFFINE_NORMAL 1
+#define ST_OAM_AFFINE_ERASE 2
+#define ST_OAM_AFFINE_DOUBLE 3
+
+#define ST_OAM_AFFINE_ON_MASK 1
+#define ST_OAM_AFFINE_DOUBLE_MASK 2
+
+#define ST_OAM_4BPP 0
+#define ST_OAM_8BPP 1
+
+#define ST_OAM_SQUARE 0
+#define ST_OAM_H_RECTANGLE 1
+#define ST_OAM_V_RECTANGLE 2
+
+struct BgAffineSrcData
+{
+ s32 texX;
+ s32 texY;
+ s16 scrX;
+ s16 scrY;
+ s16 sx;
+ s16 sy;
+ u16 alpha;
+};
+
+struct BgAffineDstData
+{
+ s16 pa;
+ s16 pb;
+ s16 pc;
+ s16 pd;
+ s32 dx;
+ s32 dy;
+};
+
+struct ObjAffineSrcData
+{
+ s16 xScale;
+ s16 yScale;
+ u16 rotation;
+};
+
+// Multi-player SIO Control Structure
+struct SioMultiCnt
+{
+ u16 baudRate:2; // baud rate
+ u16 si:1; // SI terminal
+ u16 sd:1; // SD terminal
+ u16 id:2; // ID
+ u16 error:1; // error flag
+ u16 enable:1; // SIO enable
+ u16 unused_11_8:4;
+ u16 mode:2; // communication mode (should equal 2)
+ u16 intrEnable:1; // IRQ enable
+ u16 unused_15:1;
+ u16 data; // data
+};
+
+#define ST_SIO_MULTI_MODE 2 // Multi-player communication mode
+
+// baud rate
+#define ST_SIO_9600_BPS 0 // 9600 bps
+#define ST_SIO_38400_BPS 1 // 38400 bps
+#define ST_SIO_57600_BPS 2 // 57600 bps
+#define ST_SIO_115200_BPS 3 // 115200 bps
+
+typedef void (*MainCallback)(void);
+typedef void (*IntrCallback)(void);
+typedef void (*IntrFunc)(void);
+
+#endif // GUARD_GBA_TYPES_H
diff --git a/berry_fix/payload/include/global.h b/berry_fix/payload/include/global.h
index ad83b544c..c218b5f4e 100644
--- a/berry_fix/payload/include/global.h
+++ b/berry_fix/payload/include/global.h
@@ -1,7 +1,7 @@
#ifndef GUARD_GLOBAL_H
#define GUARD_GLOBAL_H
-#include <gba/gba.h>
+#include "gba/gba.h"
// global.h from pokemon ruby
diff --git a/berry_fix/payload/include/main.h b/berry_fix/payload/include/main.h
index 8f7ef1a5a..cb58d5982 100644
--- a/berry_fix/payload/include/main.h
+++ b/berry_fix/payload/include/main.h
@@ -1,7 +1,7 @@
#ifndef GUARD_MAIN_H
#define GUARD_MAIN_H
-#include <gba/gba.h>
+#include "gba/gba.h"
enum RomHeaderValidationResult
{
diff --git a/berry_fix/payload/include/rtc.h b/berry_fix/payload/include/rtc.h
index 64a1f2295..35654d866 100644
--- a/berry_fix/payload/include/rtc.h
+++ b/berry_fix/payload/include/rtc.h
@@ -1,8 +1,8 @@
#ifndef GUARD_RTC_H
#define GUARD_RTC_H
-#include <gba/gba.h>
-#include <siirtc.h>
+#include "gba/gba.h"
+#include "siirtc.h"
#include "global.h"
extern struct Time gTimeSinceBerryUpdate;
diff --git a/berry_fix/payload/include/siirtc.h b/berry_fix/payload/include/siirtc.h
new file mode 100644
index 000000000..de4fd634d
--- /dev/null
+++ b/berry_fix/payload/include/siirtc.h
@@ -0,0 +1,54 @@
+#ifndef GUARD_RTC_H
+#define GUARD_RTC_H
+
+#include "gba/gba.h"
+
+#define SIIRTCINFO_INTFE 0x01 // frequency interrupt enable
+#define SIIRTCINFO_INTME 0x02 // per-minute interrupt enable
+#define SIIRTCINFO_INTAE 0x04 // alarm interrupt enable
+#define SIIRTCINFO_24HOUR 0x40 // 0: 12-hour mode, 1: 24-hour mode
+#define SIIRTCINFO_POWER 0x80 // power on or power failure occurred
+
+enum
+{
+ MONTH_JAN = 1,
+ MONTH_FEB,
+ MONTH_MAR,
+ MONTH_APR,
+ MONTH_MAY,
+ MONTH_JUN,
+ MONTH_JUL,
+ MONTH_AUG,
+ MONTH_SEP,
+ MONTH_OCT,
+ MONTH_NOV,
+ MONTH_DEC
+};
+
+struct SiiRtcInfo
+{
+ u8 year;
+ u8 month;
+ u8 day;
+ u8 dayOfWeek;
+ u8 hour;
+ u8 minute;
+ u8 second;
+ u8 status;
+ u8 alarmHour;
+ u8 alarmMinute;
+};
+
+void SiiRtcUnprotect(void);
+void SiiRtcProtect(void);
+u8 SiiRtcProbe(void);
+bool8 SiiRtcReset(void);
+bool8 SiiRtcGetStatus(struct SiiRtcInfo *rtc);
+bool8 SiiRtcSetStatus(struct SiiRtcInfo *rtc);
+bool8 SiiRtcGetDateTime(struct SiiRtcInfo *rtc);
+bool8 SiiRtcSetDateTime(struct SiiRtcInfo *rtc);
+bool8 SiiRtcGetTime(struct SiiRtcInfo *rtc);
+bool8 SiiRtcSetTime(struct SiiRtcInfo *rtc);
+bool8 SiiRtcSetAlarm(struct SiiRtcInfo *rtc);
+
+#endif // GUARD_RTC_H
diff --git a/berry_fix/payload/ld_script.txt b/berry_fix/payload/ld_script.txt
index a70ecac09..d0a0af9ed 100644
--- a/berry_fix/payload/ld_script.txt
+++ b/berry_fix/payload/ld_script.txt
@@ -15,26 +15,11 @@ SECTIONS {
lib_text :
ALIGN(4)
{
- *libagb_flash.a:agb_flash.o(.text);
- *libagb_flash.a:agb_flash_1m.o(.text);
- *libagb_flash.a:agb_flash_mx.o(.text);
- *libagbsyscall.a:ArcTan2.o(.text);
- *libagbsyscall.a:BgAffineSet.o(.text);
- *libagbsyscall.a:CpuFastSet.o(.text);
- *libagbsyscall.a:CpuSet.o(.text);
- *libagbsyscall.a:Div.o(.text);
- *libagbsyscall.a:Mod.o(.text);
- *libagbsyscall.a:LZ77UnCompVram.o(.text);
- *libagbsyscall.a:LZ77UnCompWram.o(.text);
- *libagbsyscall.a:MultiBoot.o(.text);
- *libagbsyscall.a:ObjAffineSet.o(.text);
- *libagbsyscall.a:RLUnCompVram.o(.text);
- *libagbsyscall.a:RLUnCompWram.o(.text);
- *libagbsyscall.a:RegisterRamReset.o(.text);
- *libagbsyscall.a:SoftReset.o(.text);
- *libagbsyscall.a:Sqrt.o(.text);
- *libagbsyscall.a:VBlankIntrWait.o(.text);
- *libsiirtc.a:siirtc.o(.text);
+ src/agb_flash.o(.text);
+ src/agb_flash_1m.o(.text);
+ src/agb_flash_mx.o(.text);
+ asm/libagbsyscall.o(.text);
+ src/siirtc.o(.text);
*libgcc.a:_call_via_rX.o(.text);
*libgcc.a:_modsi3.o(.text);
*libgcc.a:_umodsi3.o(.text);
@@ -52,11 +37,11 @@ SECTIONS {
lib_rodata :
ALIGN(4)
{
- *libagb_flash.a:agb_flash.o(.rodata);
- *libagb_flash.a:agb_flash_1m.o(.rodata);
- *libagb_flash.a:agb_flash_mx.o(.rodata);
- *libagb_flash.a:agb_flash_le.o(.rodata);
- *libsiirtc.a:siirtc.o(.rodata);
+ src/agb_flash.o(.rodata);
+ src/agb_flash_1m.o(.rodata);
+ src/agb_flash_mx.o(.rodata);
+ src/agb_flash_le.o(.rodata);
+ src/siirtc.o(.rodata);
}
. = 0x2020000;
diff --git a/berry_fix/payload/src/agb_flash.c b/berry_fix/payload/src/agb_flash.c
new file mode 100644
index 000000000..cda3b73f6
--- /dev/null
+++ b/berry_fix/payload/src/agb_flash.c
@@ -0,0 +1,296 @@
+#include <gba/gba.h>
+#include <gba/flash_internal.h>
+
+static u8 sTimerNum;
+static u16 sTimerCount;
+static vu16 *sTimerReg;
+static u16 sSavedIme;
+
+u8 gFlashTimeoutFlag;
+u8 (*PollFlashStatus)(u8 *);
+const struct FlashType *gFlash;
+u16 gFlashNumRemainingBytes;
+const u16 *gFlashMaxTime;
+
+u16 (*ProgramFlashByte)(u16, u32, u8);
+u16 (*ProgramFlashSector)(u16, void *);
+u16 (*EraseFlashChip)(void);
+u16 (*EraseFlashSector)(u16);
+u16 (*WaitForFlashWrite)(u8, u8 *, u8);
+
+void SetReadFlash1(u16 *dest);
+
+void SwitchFlashBank(u8 bankNum)
+{
+ FLASH_WRITE(0x5555, 0xAA);
+ FLASH_WRITE(0x2AAA, 0x55);
+ FLASH_WRITE(0x5555, 0xB0);
+ FLASH_WRITE(0x0000, bankNum);
+}
+
+#define DELAY() \
+do { \
+ vu16 i; \
+ for (i = 20000; i != 0; i--) \
+ ; \
+} while (0)
+
+u16 ReadFlashId(void)
+{
+ u16 flashId;
+ u16 readFlash1Buffer[0x20];
+ u8 (*readFlash1)(u8 *);
+
+ SetReadFlash1(readFlash1Buffer);
+ readFlash1 = (u8 (*)(u8 *))((s32)readFlash1Buffer + 1);
+
+ // Enter ID mode.
+ FLASH_WRITE(0x5555, 0xAA);
+ FLASH_WRITE(0x2AAA, 0x55);
+ FLASH_WRITE(0x5555, 0x90);
+ DELAY();
+
+ flashId = readFlash1(FLASH_BASE + 1) << 8;
+ flashId |= readFlash1(FLASH_BASE);
+
+ // Leave ID mode.
+ FLASH_WRITE(0x5555, 0xAA);
+ FLASH_WRITE(0x2AAA, 0x55);
+ FLASH_WRITE(0x5555, 0xF0);
+ FLASH_WRITE(0x5555, 0xF0);
+ DELAY();
+
+ return flashId;
+}
+
+void FlashTimerIntr(void)
+{
+ if (sTimerCount != 0 && --sTimerCount == 0)
+ gFlashTimeoutFlag = 1;
+}
+
+u16 SetFlashTimerIntr(u8 timerNum, void (**intrFunc)(void))
+{
+ if (timerNum >= 4)
+ return 1;
+
+ sTimerNum = timerNum;
+ sTimerReg = &REG_TMCNT(sTimerNum);
+ *intrFunc = FlashTimerIntr;
+ return 0;
+}
+
+void StartFlashTimer(u8 phase)
+{
+ const u16 *maxTime = &gFlashMaxTime[phase * 3];
+ sSavedIme = REG_IME;
+ REG_IME = 0;
+ sTimerReg[1] = 0;
+ REG_IE |= (INTR_FLAG_TIMER0 << sTimerNum);
+ gFlashTimeoutFlag = 0;
+ sTimerCount = *maxTime++;
+ *sTimerReg++ = *maxTime++;
+ *sTimerReg-- = *maxTime++;
+ REG_IF = (INTR_FLAG_TIMER0 << sTimerNum);
+ REG_IME = 1;
+}
+
+void StopFlashTimer(void)
+{
+ REG_IME = 0;
+ *sTimerReg++ = 0;
+ *sTimerReg-- = 0;
+ REG_IE &= ~(INTR_FLAG_TIMER0 << sTimerNum);
+ REG_IME = sSavedIme;
+}
+
+u8 ReadFlash1(u8 *addr)
+{
+ return *addr;
+}
+
+void SetReadFlash1(u16 *dest)
+{
+ u16 *src;
+ u16 i;
+
+ PollFlashStatus = (u8 (*)(u8 *))((s32)dest + 1);
+
+ src = (u16 *)ReadFlash1;
+ src = (u16 *)((s32)src ^ 1);
+
+ i = ((s32)SetReadFlash1 - (s32)ReadFlash1) >> 1;
+
+ while (i != 0)
+ {
+ *dest++ = *src++;
+ i--;
+ }
+}
+
+void ReadFlash_Core(u8 *src, u8 *dest, u32 size)
+{
+ while (size-- != 0)
+ {
+ *dest++ = *src++;
+ }
+}
+
+void ReadFlash(u16 sectorNum, u32 offset, void *dest, u32 size)
+{
+ u8 *src;
+ u16 i;
+ u16 readFlash_Core_Buffer[0x40];
+ u16 *funcSrc;
+ u16 *funcDest;
+ void (*readFlash_Core)(u8 *, u8 *, u32);
+
+ REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8;
+
+ if (gFlash->romSize == FLASH_ROM_SIZE_1M)
+ {
+ SwitchFlashBank(sectorNum / SECTORS_PER_BANK);
+ sectorNum %= SECTORS_PER_BANK;
+ }
+
+ funcSrc = (u16 *)ReadFlash_Core;
+ funcSrc = (u16 *)((s32)funcSrc ^ 1);
+ funcDest = readFlash_Core_Buffer;
+
+ i = ((s32)ReadFlash - (s32)ReadFlash_Core) >> 1;
+
+ while (i != 0)
+ {
+ *funcDest++ = *funcSrc++;
+ i--;
+ }
+
+ readFlash_Core = (void (*)(u8 *, u8 *, u32))((s32)readFlash_Core_Buffer + 1);
+
+ src = FLASH_BASE + (sectorNum << gFlash->sector.shift) + offset;
+
+ readFlash_Core(src, dest, size);
+}
+
+u32 VerifyFlashSector_Core(u8 *src, u8 *tgt, u32 size)
+{
+ while (size-- != 0)
+ {
+ if (*tgt++ != *src++)
+ return (u32)(tgt - 1);
+ }
+
+ return 0;
+}
+
+u32 VerifyFlashSector(u16 sectorNum, u8 *src)
+{
+ u16 i;
+ u16 verifyFlashSector_Core_Buffer[0x80];
+ u16 *funcSrc;
+ u16 *funcDest;
+ u8 *tgt;
+ u16 size;
+ u32 (*verifyFlashSector_Core)(u8 *, u8 *, u32);
+
+ REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8;
+
+ if (gFlash->romSize == FLASH_ROM_SIZE_1M)
+ {
+ SwitchFlashBank(sectorNum / SECTORS_PER_BANK);
+ sectorNum %= SECTORS_PER_BANK;
+ }
+
+ funcSrc = (u16 *)VerifyFlashSector_Core;
+ funcSrc = (u16 *)((s32)funcSrc ^ 1);
+ funcDest = verifyFlashSector_Core_Buffer;
+
+ i = ((s32)VerifyFlashSector - (s32)VerifyFlashSector_Core) >> 1;
+
+ while (i != 0)
+ {
+ *funcDest++ = *funcSrc++;
+ i--;
+ }
+
+ verifyFlashSector_Core = (u32 (*)(u8 *, u8 *, u32))((s32)verifyFlashSector_Core_Buffer + 1);
+
+ tgt = FLASH_BASE + (sectorNum << gFlash->sector.shift);
+ size = gFlash->sector.size;
+
+ return verifyFlashSector_Core(src, tgt, size);
+}
+
+u32 VerifyFlashSectorNBytes(u16 sectorNum, u8 *src, u32 n)
+{
+ u16 i;
+ u16 verifyFlashSector_Core_Buffer[0x80];
+ u16 *funcSrc;
+ u16 *funcDest;
+ u8 *tgt;
+ u32 (*verifyFlashSector_Core)(u8 *, u8 *, u32);
+
+ if (gFlash->romSize == FLASH_ROM_SIZE_1M)
+ {
+ SwitchFlashBank(sectorNum / SECTORS_PER_BANK);
+ sectorNum %= SECTORS_PER_BANK;
+ }
+
+ REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8;
+
+ funcSrc = (u16 *)VerifyFlashSector_Core;
+ funcSrc = (u16 *)((s32)funcSrc ^ 1);
+ funcDest = verifyFlashSector_Core_Buffer;
+
+ i = ((s32)VerifyFlashSector - (s32)VerifyFlashSector_Core) >> 1;
+
+ while (i != 0)
+ {
+ *funcDest++ = *funcSrc++;
+ i--;
+ }
+
+ verifyFlashSector_Core = (u32 (*)(u8 *, u8 *, u32))((s32)verifyFlashSector_Core_Buffer + 1);
+
+ tgt = FLASH_BASE + (sectorNum << gFlash->sector.shift);
+
+ return verifyFlashSector_Core(src, tgt, n);
+}
+
+u32 ProgramFlashSectorAndVerify(u16 sectorNum, u8 *src)
+{
+ u8 i;
+ u32 result;
+
+ for (i = 0; i < 3; i++)
+ {
+ result = ProgramFlashSector(sectorNum, src);
+ if (result != 0)
+ continue;
+
+ result = VerifyFlashSector(sectorNum, src);
+ if (result == 0)
+ break;
+ }
+
+ return result;
+}
+
+u32 ProgramFlashSectorAndVerifyNBytes(u16 sectorNum, void *src, u32 n)
+{
+ u8 i;
+ u32 result;
+
+ for (i = 0; i < 3; i++)
+ {
+ result = ProgramFlashSector(sectorNum, src);
+ if (result != 0)
+ continue;
+
+ result = VerifyFlashSectorNBytes(sectorNum, src, n);
+ if (result == 0)
+ break;
+ }
+
+ return result;
+}
diff --git a/berry_fix/payload/src/agb_flash_1m.c b/berry_fix/payload/src/agb_flash_1m.c
new file mode 100644
index 000000000..7f8bdeb5f
--- /dev/null
+++ b/berry_fix/payload/src/agb_flash_1m.c
@@ -0,0 +1,86 @@
+#include "gba/gba.h"
+#include "gba/flash_internal.h"
+
+static const char AgbLibFlashVersion[] = "FLASH1M_V103";
+
+const struct FlashSetupInfo * const sSetupInfos[] =
+{
+ &MX29L010,
+ &LE26FV10N1TS,
+ &DefaultFlash
+};
+
+u32 IdentifyFlash(void)
+{
+ u16 result;
+ u16 flashId;
+ const struct FlashSetupInfo * const *setupInfo;
+
+ REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8;
+
+ flashId = ReadFlashId();
+
+ setupInfo = sSetupInfos;
+ result = 1;
+
+ for (;;)
+ {
+ if ((*setupInfo)->type.ids.separate.makerId == 0)
+ break;
+
+ if (flashId == (*setupInfo)->type.ids.joined)
+ {
+ result = 0;
+ break;
+ }
+
+ setupInfo++;
+ }
+
+ ProgramFlashByte = (*setupInfo)->programFlashByte;
+ ProgramFlashSector = (*setupInfo)->programFlashSector;
+ EraseFlashChip = (*setupInfo)->eraseFlashChip;
+ EraseFlashSector = (*setupInfo)->eraseFlashSector;
+ WaitForFlashWrite = (*setupInfo)->WaitForFlashWrite;
+ gFlashMaxTime = (*setupInfo)->maxTime;
+ gFlash = &(*setupInfo)->type;
+
+ return result;
+}
+
+u16 WaitForFlashWrite_Common(u8 phase, u8 *addr, u8 lastData)
+{
+ u16 result = 0;
+ u8 status;
+
+ StartFlashTimer(phase);
+
+ while ((status = PollFlashStatus(addr)) != lastData)
+ {
+ if (status & 0x20)
+ {
+ // The write operation exceeded the flash chip's time limit.
+
+ if (PollFlashStatus(addr) == lastData)
+ break;
+
+ FLASH_WRITE(0x5555, 0xF0);
+ result = phase | 0xA000u;
+ break;
+ }
+
+ if (gFlashTimeoutFlag)
+ {
+ if (PollFlashStatus(addr) == lastData)
+ break;
+
+ FLASH_WRITE(0x5555, 0xF0);
+ result = phase | 0xC000u;
+ break;
+ }
+ }
+
+ StopFlashTimer();
+
+ return result;
+}
diff --git a/berry_fix/payload/src/agb_flash_le.c b/berry_fix/payload/src/agb_flash_le.c
new file mode 100644
index 000000000..39d956e27
--- /dev/null
+++ b/berry_fix/payload/src/agb_flash_le.c
@@ -0,0 +1,31 @@
+#include "gba/gba.h"
+#include "gba/flash_internal.h"
+
+const u16 leMaxTime[] =
+{
+ 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,
+ 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,
+ 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,
+ 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,
+};
+
+const struct FlashSetupInfo LE26FV10N1TS =
+{
+ ProgramFlashByte_MX,
+ ProgramFlashSector_MX,
+ EraseFlashChip_MX,
+ EraseFlashSector_MX,
+ WaitForFlashWrite_Common,
+ leMaxTime,
+ {
+ 131072, // ROM size
+ {
+ 4096, // sector size
+ 12, // bit shift to multiply by sector size (4096 == 1 << 12)
+ 32, // number of sectors
+ 0 // appears to be unused
+ },
+ { 3, 1 }, // wait state setup data
+ { { 0x62, 0x13 } } // ID
+ }
+};
diff --git a/berry_fix/payload/src/agb_flash_mx.c b/berry_fix/payload/src/agb_flash_mx.c
new file mode 100644
index 000000000..68eb00cd8
--- /dev/null
+++ b/berry_fix/payload/src/agb_flash_mx.c
@@ -0,0 +1,193 @@
+#include "gba/gba.h"
+#include "gba/flash_internal.h"
+
+const u16 mxMaxTime[] =
+{
+ 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,
+ 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,
+ 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,
+ 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,
+};
+
+const struct FlashSetupInfo MX29L010 =
+{
+ ProgramFlashByte_MX,
+ ProgramFlashSector_MX,
+ EraseFlashChip_MX,
+ EraseFlashSector_MX,
+ WaitForFlashWrite_Common,
+ mxMaxTime,
+ {
+ 131072, // ROM size
+ {
+ 4096, // sector size
+ 12, // bit shift to multiply by sector size (4096 == 1 << 12)
+ 32, // number of sectors
+ 0 // appears to be unused
+ },
+ { 3, 1 }, // wait state setup data
+ { { 0xC2, 0x09 } } // ID
+ }
+};
+
+const struct FlashSetupInfo DefaultFlash =
+{
+ ProgramFlashByte_MX,
+ ProgramFlashSector_MX,
+ EraseFlashChip_MX,
+ EraseFlashSector_MX,
+ WaitForFlashWrite_Common,
+ mxMaxTime,
+ {
+ 131072, // ROM size
+ {
+ 4096, // sector size
+ 12, // bit shift to multiply by sector size (4096 == 1 << 12)
+ 32, // number of sectors
+ 0 // appears to be unused
+ },
+ { 3, 1 }, // wait state setup data
+ { { 0x00, 0x00 } } // ID of 0
+ }
+};
+
+u16 EraseFlashChip_MX(void)
+{
+ u16 result;
+ u16 readFlash1Buffer[0x20];
+
+ REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0];
+
+ FLASH_WRITE(0x5555, 0xAA);
+ FLASH_WRITE(0x2AAA, 0x55);
+ FLASH_WRITE(0x5555, 0x80);
+ FLASH_WRITE(0x5555, 0xAA);
+ FLASH_WRITE(0x2AAA, 0x55);
+ FLASH_WRITE(0x5555, 0x10);
+
+ SetReadFlash1(readFlash1Buffer);
+
+ result = WaitForFlashWrite(3, FLASH_BASE, 0xFF);
+
+ REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8;
+
+ return result;
+}
+
+u16 EraseFlashSector_MX(u16 sectorNum)
+{
+ u16 numTries;
+ u16 result;
+ u8 *addr;
+ u16 readFlash1Buffer[0x20];
+
+ if (sectorNum >= gFlash->sector.count)
+ return 0x80FF;
+
+ SwitchFlashBank(sectorNum / SECTORS_PER_BANK);
+ sectorNum %= SECTORS_PER_BANK;
+
+ numTries = 0;
+
+try_erase:
+ REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0];
+
+ addr = FLASH_BASE + (sectorNum << gFlash->sector.shift);
+
+ FLASH_WRITE(0x5555, 0xAA);
+ FLASH_WRITE(0x2AAA, 0x55);
+ FLASH_WRITE(0x5555, 0x80);
+ FLASH_WRITE(0x5555, 0xAA);
+ FLASH_WRITE(0x2AAA, 0x55);
+ *addr = 0x30;
+
+ SetReadFlash1(readFlash1Buffer);
+
+ result = WaitForFlashWrite(2, addr, 0xFF);
+
+ if (!(result & 0xA000) || numTries > 3)
+ goto done;
+
+ numTries++;
+
+ goto try_erase;
+
+done:
+ REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8;
+
+ return result;
+}
+
+u16 ProgramFlashByte_MX(u16 sectorNum, u32 offset, u8 data)
+{
+ u8 *addr;
+ u16 readFlash1Buffer[0x20];
+
+ if (offset >= gFlash->sector.size)
+ return 0x8000;
+
+ SwitchFlashBank(sectorNum / SECTORS_PER_BANK);
+ sectorNum %= SECTORS_PER_BANK;
+
+ addr = FLASH_BASE + (sectorNum << gFlash->sector.shift) + offset;
+
+ SetReadFlash1(readFlash1Buffer);
+
+ REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0];
+
+ FLASH_WRITE(0x5555, 0xAA);
+ FLASH_WRITE(0x2AAA, 0x55);
+ FLASH_WRITE(0x5555, 0xA0);
+ *addr = data;
+
+ return WaitForFlashWrite(1, addr, data);
+}
+
+static u16 ProgramByte(u8 *src, u8 *dest)
+{
+ FLASH_WRITE(0x5555, 0xAA);
+ FLASH_WRITE(0x2AAA, 0x55);
+ FLASH_WRITE(0x5555, 0xA0);
+ *dest = *src;
+
+ return WaitForFlashWrite(1, dest, *src);
+}
+
+u16 ProgramFlashSector_MX(u16 sectorNum, void *src)
+{
+ u16 result;
+ u8 *dest;
+ u16 readFlash1Buffer[0x20];
+
+ if (sectorNum >= gFlash->sector.count)
+ return 0x80FF;
+
+ result = EraseFlashSector_MX(sectorNum);
+
+ if (result != 0)
+ return result;
+
+ SwitchFlashBank(sectorNum / SECTORS_PER_BANK);
+ sectorNum %= SECTORS_PER_BANK;
+
+ SetReadFlash1(readFlash1Buffer);
+
+ REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0];
+
+ gFlashNumRemainingBytes = gFlash->sector.size;
+ dest = FLASH_BASE + (sectorNum << gFlash->sector.shift);
+
+ while (gFlashNumRemainingBytes > 0)
+ {
+ result = ProgramByte(src, dest);
+
+ if (result != 0)
+ break;
+
+ gFlashNumRemainingBytes--;
+ src++;
+ dest++;
+ }
+
+ return result;
+}
diff --git a/berry_fix/payload/src/flash.c b/berry_fix/payload/src/flash.c
index 3a0369dda..1f09d0b8f 100644
--- a/berry_fix/payload/src/flash.c
+++ b/berry_fix/payload/src/flash.c
@@ -1,5 +1,5 @@
-#include <gba/gba.h>
-#include <agb_flash.h>
+#include "gba/gba.h"
+#include "gba/flash_internal.h"
#include "constants/vars.h"
#include "global.h"
#include "main.h"
diff --git a/berry_fix/payload/src/main.c b/berry_fix/payload/src/main.c
index 249150665..325d3830e 100644
--- a/berry_fix/payload/src/main.c
+++ b/berry_fix/payload/src/main.c
@@ -1,4 +1,4 @@
-#include <gba/gba.h>
+#include "gba/gba.h"
#include "global.h"
#include "main.h"
#include "rtc.h"
diff --git a/berry_fix/payload/src/rtc.c b/berry_fix/payload/src/rtc.c
index 97692e205..e73f522aa 100644
--- a/berry_fix/payload/src/rtc.c
+++ b/berry_fix/payload/src/rtc.c
@@ -1,5 +1,5 @@
-#include <gba/gba.h>
-#include <siirtc.h>
+#include "gba/gba.h"
+#include "siirtc.h"
#include "global.h"
#include "main.h"
diff --git a/berry_fix/payload/src/siirtc.c b/berry_fix/payload/src/siirtc.c
new file mode 100644
index 000000000..965a068f1
--- /dev/null
+++ b/berry_fix/payload/src/siirtc.c
@@ -0,0 +1,432 @@
+// Ruby/Sapphire/Emerald cartridges contain a Seiko Instruments Inc. (SII)
+// S-3511A real-time clock (RTC). This library ("SIIRTC_V001") is for
+// communicating with the RTC.
+
+#include "gba/gba.h"
+#include "siirtc.h"
+
+#define STATUS_INTFE 0x02 // frequency interrupt enable
+#define STATUS_INTME 0x08 // per-minute interrupt enable
+#define STATUS_INTAE 0x20 // alarm interrupt enable
+#define STATUS_24HOUR 0x40 // 0: 12-hour mode, 1: 24-hour mode
+#define STATUS_POWER 0x80 // power on or power failure occurred
+
+#define TEST_MODE 0x80 // flag in the "second" byte
+
+#define ALARM_AM 0x00
+#define ALARM_PM 0x80
+
+#define OFFSET_YEAR offsetof(struct SiiRtcInfo, year)
+#define OFFSET_MONTH offsetof(struct SiiRtcInfo, month)
+#define OFFSET_DAY offsetof(struct SiiRtcInfo, day)
+#define OFFSET_DAY_OF_WEEK offsetof(struct SiiRtcInfo, dayOfWeek)
+#define OFFSET_HOUR offsetof(struct SiiRtcInfo, hour)
+#define OFFSET_MINUTE offsetof(struct SiiRtcInfo, minute)
+#define OFFSET_SECOND offsetof(struct SiiRtcInfo, second)
+#define OFFSET_STATUS offsetof(struct SiiRtcInfo, status)
+#define OFFSET_ALARM_HOUR offsetof(struct SiiRtcInfo, alarmHour)
+#define OFFSET_ALARM_MINUTE offsetof(struct SiiRtcInfo, alarmMinute)
+
+#define INFO_BUF(info, index) (*((u8 *)(info) + (index)))
+
+#define DATETIME_BUF(info, index) INFO_BUF(info, OFFSET_YEAR + index)
+#define DATETIME_BUF_LEN (OFFSET_SECOND - OFFSET_YEAR + 1)
+
+#define TIME_BUF(info, index) INFO_BUF(info, OFFSET_HOUR + index)
+#define TIME_BUF_LEN (OFFSET_SECOND - OFFSET_HOUR + 1)
+
+#define WR 0 // command for writing data
+#define RD 1 // command for reading data
+
+#define CMD(n) (0x60 | (n << 1))
+
+#define CMD_RESET CMD(0)
+#define CMD_STATUS CMD(1)
+#define CMD_DATETIME CMD(2)
+#define CMD_TIME CMD(3)
+#define CMD_ALARM CMD(4)
+
+#define GPIO_PORT_DATA (*(vu16 *)0x80000C4)
+#define GPIO_PORT_DIRECTION (*(vu16 *)0x80000C6)
+#define GPIO_PORT_READ_ENABLE (*(vu16 *)0x80000C8)
+
+extern vu16 GPIOPortDirection;
+
+static u16 sDummy; // unused variable
+static bool8 sLocked;
+
+static int WriteCommand(u8 value);
+static int WriteData(u8 value);
+static u8 ReadData();
+static void EnableGpioPortRead();
+static void DisableGpioPortRead();
+
+static const char AgbLibRtcVersion[] = "SIIRTC_V001";
+
+void SiiRtcUnprotect()
+{
+ EnableGpioPortRead();
+ sLocked = FALSE;
+}
+
+void SiiRtcProtect()
+{
+ DisableGpioPortRead();
+ sLocked = TRUE;
+}
+
+u8 SiiRtcProbe()
+{
+ u8 errorCode;
+ struct SiiRtcInfo rtc;
+
+ if (!SiiRtcGetStatus(&rtc))
+ return 0;
+
+ errorCode = 0;
+
+ if ((rtc.status & (SIIRTCINFO_POWER | SIIRTCINFO_24HOUR)) == SIIRTCINFO_POWER
+ || (rtc.status & (SIIRTCINFO_POWER | SIIRTCINFO_24HOUR)) == 0)
+ {
+ // The RTC is in 12-hour mode. Reset it and switch to 24-hour mode.
+
+ // Note that the conditions are redundant and equivalent to simply
+ // "(rtc.status & SIIRTCINFO_24HOUR) == 0". It's possible that this
+ // was also intended to handle resetting the clock after power failure
+ // but a mistake was made.
+
+ if (!SiiRtcReset())
+ return 0;
+
+ errorCode++;
+ }
+
+ SiiRtcGetTime(&rtc);
+
+ if (rtc.second & TEST_MODE)
+ {
+ // The RTC is in test mode. Reset it to leave test mode.
+
+ if (!SiiRtcReset())
+ return (errorCode << 4) & 0xF0;
+
+ errorCode++;
+ }
+
+ return (errorCode << 4) | 1;
+}
+
+bool8 SiiRtcReset()
+{
+ u8 result;
+ struct SiiRtcInfo rtc;
+
+ if (sLocked == TRUE)
+ return FALSE;
+
+ sLocked = TRUE;
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 5;
+
+ GPIO_PORT_DIRECTION = 7;
+
+ WriteCommand(CMD_RESET | WR);
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 1;
+
+ sLocked = FALSE;
+
+ rtc.status = SIIRTCINFO_24HOUR;
+
+ result = SiiRtcSetStatus(&rtc);
+
+ return result;
+}
+
+bool8 SiiRtcGetStatus(struct SiiRtcInfo *rtc)
+{
+ u8 statusData;
+
+ if (sLocked == TRUE)
+ return FALSE;
+
+ sLocked = TRUE;
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 5;
+
+ GPIO_PORT_DIRECTION = 7;
+
+ WriteCommand(CMD_STATUS | RD);
+
+ GPIO_PORT_DIRECTION = 5;
+
+ statusData = ReadData();
+
+ rtc->status = (statusData & (STATUS_POWER | STATUS_24HOUR))
+ | ((statusData & STATUS_INTAE) >> 3)
+ | ((statusData & STATUS_INTME) >> 2)
+ | ((statusData & STATUS_INTFE) >> 1);
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 1;
+
+ sLocked = FALSE;
+
+ return TRUE;
+}
+
+bool8 SiiRtcSetStatus(struct SiiRtcInfo *rtc)
+{
+ u8 statusData;
+
+ if (sLocked == TRUE)
+ return FALSE;
+
+ sLocked = TRUE;
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 5;
+
+ statusData = STATUS_24HOUR
+ | ((rtc->status & SIIRTCINFO_INTAE) << 3)
+ | ((rtc->status & SIIRTCINFO_INTME) << 2)
+ | ((rtc->status & SIIRTCINFO_INTFE) << 1);
+
+ GPIO_PORT_DIRECTION = 7;
+
+ WriteCommand(CMD_STATUS | WR);
+
+ WriteData(statusData);
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 1;
+
+ sLocked = FALSE;
+
+ return TRUE;
+}
+
+bool8 SiiRtcGetDateTime(struct SiiRtcInfo *rtc)
+{
+ u8 i;
+
+ if (sLocked == TRUE)
+ return FALSE;
+
+ sLocked = TRUE;
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 5;
+
+ GPIO_PORT_DIRECTION = 7;
+
+ WriteCommand(CMD_DATETIME | RD);
+
+ GPIO_PORT_DIRECTION = 5;
+
+ for (i = 0; i < DATETIME_BUF_LEN; i++)
+ DATETIME_BUF(rtc, i) = ReadData();
+
+ INFO_BUF(rtc, OFFSET_HOUR) &= 0x7F;
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 1;
+
+ sLocked = FALSE;
+
+ return TRUE;
+}
+
+bool8 SiiRtcSetDateTime(struct SiiRtcInfo *rtc)
+{
+ u8 i;
+
+ if (sLocked == TRUE)
+ return FALSE;
+
+ sLocked = TRUE;
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 5;
+
+ GPIO_PORT_DIRECTION = 7;
+
+ WriteCommand(CMD_DATETIME | WR);
+
+ for (i = 0; i < DATETIME_BUF_LEN; i++)
+ WriteData(DATETIME_BUF(rtc, i));
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 1;
+
+ sLocked = FALSE;
+
+ return TRUE;
+}
+
+bool8 SiiRtcGetTime(struct SiiRtcInfo *rtc)
+{
+ u8 i;
+
+ if (sLocked == TRUE)
+ return FALSE;
+
+ sLocked = TRUE;
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 5;
+
+ GPIO_PORT_DIRECTION = 7;
+
+ WriteCommand(CMD_TIME | RD);
+
+ GPIO_PORT_DIRECTION = 5;
+
+ for (i = 0; i < TIME_BUF_LEN; i++)
+ TIME_BUF(rtc, i) = ReadData();
+
+ INFO_BUF(rtc, OFFSET_HOUR) &= 0x7F;
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 1;
+
+ sLocked = FALSE;
+
+ return TRUE;
+}
+
+bool8 SiiRtcSetTime(struct SiiRtcInfo *rtc)
+{
+ u8 i;
+
+ if (sLocked == TRUE)
+ return FALSE;
+
+ sLocked = TRUE;
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 5;
+
+ GPIO_PORT_DIRECTION = 7;
+
+ WriteCommand(CMD_TIME | WR);
+
+ for (i = 0; i < TIME_BUF_LEN; i++)
+ WriteData(TIME_BUF(rtc, i));
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 1;
+
+ sLocked = FALSE;
+
+ return TRUE;
+}
+
+bool8 SiiRtcSetAlarm(struct SiiRtcInfo *rtc)
+{
+ u8 i;
+ u8 alarmData[2];
+
+ if (sLocked == TRUE)
+ return FALSE;
+
+ sLocked = TRUE;
+
+ // Decode BCD.
+ alarmData[0] = (rtc->alarmHour & 0xF) + 10 * ((rtc->alarmHour >> 4) & 0xF);
+
+ // The AM/PM flag must be set correctly even in 24-hour mode.
+
+ if (alarmData[0] < 12)
+ alarmData[0] = rtc->alarmHour | ALARM_AM;
+ else
+ alarmData[0] = rtc->alarmHour | ALARM_PM;
+
+ alarmData[1] = rtc->alarmMinute;
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 5;
+
+ GPIOPortDirection = 7; // Why is this the only instance that uses a symbol?
+
+ WriteCommand(CMD_ALARM | WR);
+
+ for (i = 0; i < 2; i++)
+ WriteData(alarmData[i]);
+
+ GPIO_PORT_DATA = 1;
+ GPIO_PORT_DATA = 1;
+
+ sLocked = FALSE;
+
+ return TRUE;
+}
+
+static int WriteCommand(u8 value)
+{
+ u8 i;
+ u8 temp;
+
+ for (i = 0; i < 8; i++)
+ {
+ temp = ((value >> (7 - i)) & 1);
+ GPIO_PORT_DATA = (temp << 1) | 4;
+ GPIO_PORT_DATA = (temp << 1) | 4;
+ GPIO_PORT_DATA = (temp << 1) | 4;
+ GPIO_PORT_DATA = (temp << 1) | 5;
+ }
+
+ // control reaches end of non-void function
+}
+
+static int WriteData(u8 value)
+{
+ u8 i;
+ u8 temp;
+
+ for (i = 0; i < 8; i++)
+ {
+ temp = ((value >> i) & 1);
+ GPIO_PORT_DATA = (temp << 1) | 4;
+ GPIO_PORT_DATA = (temp << 1) | 4;
+ GPIO_PORT_DATA = (temp << 1) | 4;
+ GPIO_PORT_DATA = (temp << 1) | 5;
+ }
+
+ // control reaches end of non-void function
+}
+
+static u8 ReadData()
+{
+ u8 i;
+ u8 temp;
+ u8 value;
+
+ for (i = 0; i < 8; i++)
+ {
+ GPIO_PORT_DATA = 4;
+ GPIO_PORT_DATA = 4;
+ GPIO_PORT_DATA = 4;
+ GPIO_PORT_DATA = 4;
+ GPIO_PORT_DATA = 4;
+ GPIO_PORT_DATA = 5;
+
+ temp = ((GPIO_PORT_DATA & 2) >> 1);
+ value = (value >> 1) | (temp << 7); // UB: accessing uninitialized var
+ }
+
+ return value;
+}
+
+static void EnableGpioPortRead()
+{
+ GPIO_PORT_READ_ENABLE = 1;
+}
+
+static void DisableGpioPortRead()
+{
+ GPIO_PORT_READ_ENABLE = 0;
+}
diff --git a/berry_fix/payload/sym_bss.txt b/berry_fix/payload/sym_bss.txt
index 17bb7f204..3b1c62ae9 100644
--- a/berry_fix/payload/sym_bss.txt
+++ b/berry_fix/payload/sym_bss.txt
@@ -1,5 +1,5 @@
.include "src/main.o"
.include "src/rtc.o"
.include "src/flash.o"
- .include "*libagb_flash.a:agb_flash.o"
- .include "*libsiirtc.a:siirtc.o"
+ .include "src/agb_flash.o"
+ .include "src/siirtc.o"
diff --git a/berry_fix/payload/sym_common.txt b/berry_fix/payload/sym_common.txt
index e284737fc..28b47f52e 100644
--- a/berry_fix/payload/sym_common.txt
+++ b/berry_fix/payload/sym_common.txt
@@ -26,4 +26,4 @@ gCurSaveChunk:
gFlashIdentIsValid: @ 0x0300123C
.space 0x4
- .include "*libagb_flash.a:agb_flash.o"
+ .include "agb_flash.o"
diff --git a/common_syms/m4a_2.txt b/common_syms/m4a.txt
index 6e7b3c93e..6e7b3c93e 100644
--- a/common_syms/m4a_2.txt
+++ b/common_syms/m4a.txt
diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s
index bb0c1883c..944275acc 100644
--- a/data/battle_ai_scripts.s
+++ b/data/battle_ai_scripts.s
@@ -1,4 +1,3126 @@
+ .include "asm/macros.inc"
+ .include "constants/constants.inc"
+ .include "asm/macros/battle_ai_script.inc"
+
.section script_data, "aw", %progbits
BattleAIs:: @ 81D9BF4
- .incbin "baserom.gba", 0x1D9BF4, 0x20FC
+ .4byte AI_CheckBadMove
+ .4byte AI_TryToFaint
+ .4byte AI_CheckViability
+ .4byte AI_SetupFirstTurn
+ .4byte AI_Risky
+ .4byte AI_PreferStrongestMove
+ .4byte AI_PreferBatonPass
+ .4byte AI_DoubleBattle
+ .4byte AI_HPAware
+ .4byte AI_Unknown
+ .4byte AI_Ret
+ .4byte AI_Ret
+ .4byte AI_Ret
+ .4byte AI_Ret
+ .4byte AI_Ret
+ .4byte AI_Ret
+ .4byte AI_Ret
+ .4byte AI_Ret
+ .4byte AI_Ret
+ .4byte AI_Ret
+ .4byte AI_Ret
+ .4byte AI_Ret
+ .4byte AI_Ret
+ .4byte AI_Ret
+ .4byte AI_Ret
+ .4byte AI_Ret
+ .4byte AI_Ret
+ .4byte AI_Ret
+ .4byte AI_Ret
+ .4byte AI_Roaming
+ .4byte AI_Safari
+ .4byte AI_FirstBattle
+
+AI_CheckBadMove:: @ 81D9C74
+ is_most_powerful_move
+ if_equal 0, AI_sub_81D9CE0
+ if_damage_bonus 0, AI_sub_81DA433
+ get_ability 0
+ if_equal 10, AI_sub_81D9CA6
+ if_equal 11, AI_sub_81D9CB3
+ if_equal 18, AI_sub_81D9CC0
+ if_equal 25, AI_sub_81D9CCD
+ if_equal 26, AI_sub_81D9CD8
+ jump AI_sub_81D9CE0
+
+AI_sub_81D9CA6:: @ 81D9CA6
+ get_type 4
+ if_arg_equal 13, AI_sub_81DA436
+ jump AI_sub_81D9CE0
+
+AI_sub_81D9CB3:: @ 81D9CB3
+ get_type 4
+ if_arg_equal 11, AI_sub_81DA436
+ jump AI_sub_81D9CE0
+
+AI_sub_81D9CC0:: @ 81D9CC0
+ get_type 4
+ if_arg_equal 10, AI_sub_81DA436
+ jump AI_sub_81D9CE0
+
+AI_sub_81D9CCD:: @ 81D9CCD
+ if_damage_bonus 80, AI_sub_81D9CE0
+ jump AI_sub_81DA433
+
+AI_sub_81D9CD8:: @ 81D9CD8
+ get_type 4
+ if_arg_equal 4, AI_sub_81DA433
+
+AI_sub_81D9CE0:: @ 81D9CE0
+ get_ability 0
+ if_not_equal 43, AI_sub_81D9D27
+ if_move 45, AI_sub_81DA433
+ if_move 46, AI_sub_81DA433
+ if_move 47, AI_sub_81DA433
+ if_move 48, AI_sub_81DA433
+ if_move 103, AI_sub_81DA433
+ if_move 173, AI_sub_81DA433
+ if_move 253, AI_sub_81DA433
+ if_move 319, AI_sub_81DA433
+ if_move 320, AI_sub_81DA433
+
+AI_sub_81D9D27:: @ 81D9D27
+ if_effect 1, AI_sub_81D9FB6
+ if_effect 7, AI_sub_81D9FCF
+ if_effect 8, AI_sub_81DA008
+ if_effect 10, AI_sub_81DA020
+ if_effect 11, AI_sub_81DA029
+ if_effect 12, AI_sub_81DA032
+ if_effect 13, AI_sub_81DA03B
+ if_effect 14, AI_sub_81DA044
+ if_effect 15, AI_sub_81DA04D
+ if_effect 16, AI_sub_81DA056
+ if_effect 18, AI_sub_81DA05F
+ if_effect 19, AI_sub_81DA074
+ if_effect 20, AI_sub_81DA081
+ if_effect 21, AI_sub_81DA08E
+ if_effect 22, AI_sub_81DA09B
+ if_effect 23, AI_sub_81DA0A8
+ if_effect 24, AI_sub_81DA0BD
+ if_effect 25, AI_sub_81DA0D4
+ if_effect 26, AI_sub_81DA1B2
+ if_effect 28, AI_sub_81DA14A
+ if_effect 33, AI_sub_81DA15B
+ if_effect 35, AI_sub_81DA18A
+ if_effect 38, AI_sub_81DA195
+ if_effect 39, AI_sub_81DA1B2
+ if_effect 40, AI_sub_81DA1B2
+ if_effect 46, AI_sub_81DA1CC
+ if_effect 47, AI_sub_81DA1D7
+ if_effect 49, AI_sub_81DA1E2
+ if_effect 50, AI_sub_81DA020
+ if_effect 51, AI_sub_81DA029
+ if_effect 52, AI_sub_81DA032
+ if_effect 53, AI_sub_81DA03B
+ if_effect 54, AI_sub_81DA044
+ if_effect 55, AI_sub_81DA04D
+ if_effect 56, AI_sub_81DA056
+ if_effect 58, AI_sub_81DA05F
+ if_effect 59, AI_sub_81DA074
+ if_effect 60, AI_sub_81DA081
+ if_effect 61, AI_sub_81DA08E
+ if_effect 62, AI_sub_81DA09B
+ if_effect 63, AI_sub_81DA0A8
+ if_effect 64, AI_sub_81DA0BD
+ if_effect 65, AI_sub_81DA1F5
+ if_effect 66, AI_sub_81DA15B
+ if_effect 67, AI_sub_81DA200
+ if_effect 79, AI_sub_81DA219
+ if_effect 80, AI_sub_81DA1B2
+ if_effect 84, AI_sub_81DA22B
+ if_effect 86, AI_sub_81DA246
+ if_effect 87, AI_sub_81DA1B2
+ if_effect 88, AI_sub_81DA1B2
+ if_effect 89, AI_sub_81DA1B2
+ if_effect 90, AI_sub_81DA24E
+ if_effect 92, AI_sub_81DA256
+ if_effect 97, AI_sub_81DA256
+ if_effect 99, AI_sub_81DA1B2
+ if_effect 106, AI_sub_81DA261
+ if_effect 107, AI_sub_81D9FF3
+ if_effect 108, AI_sub_81DA056
+ if_effect 109, AI_sub_81DA26C
+ if_effect 112, AI_sub_81DA27D
+ if_effect 113, AI_sub_81DA288
+ if_effect 114, AI_sub_81DA293
+ if_effect 115, AI_sub_81DA29E
+ if_effect 118, AI_sub_81DA1E2
+ if_effect 120, AI_sub_81DA2A6
+ if_effect 121, AI_sub_81DA1B2
+ if_effect 122, AI_sub_81DA1B2
+ if_effect 123, AI_sub_81DA1B2
+ if_effect 124, AI_sub_81DA2E6
+ if_effect 126, AI_sub_81DA1AA
+ if_effect 127, AI_sub_81DA301
+ if_effect -126, AI_sub_81DA1B2
+ if_effect -120, AI_sub_81DA30A
+ if_effect -119, AI_sub_81DA312
+ if_effect -114, AI_sub_81DA019
+ if_effect -113, AI_sub_81DA0D4
+ if_effect -112, AI_sub_81DA1B2
+ if_effect -111, AI_sub_81DA1B2
+ if_effect -108, AI_sub_81DA31A
+ if_effect -103, AI_sub_81DA433
+ if_effect -100, AI_sub_81DA029
+ if_effect -98, AI_sub_81DA325
+ if_effect -96, AI_sub_81DA32E
+ if_effect -95, AI_sub_81DA337
+ if_effect -94, AI_sub_81DA337
+ if_effect -92, AI_sub_81DA346
+ if_effect -91, AI_sub_81DA34E
+ if_effect -90, AI_sub_81DA1E2
+ if_effect -89, AI_sub_81DA359
+ if_effect -88, AI_sub_81DA2F1
+ if_effect -86, AI_sub_81DA1B2
+ if_effect -80, AI_sub_81DA37E
+ if_effect -79, AI_sub_81DA386
+ if_effect -75, AI_sub_81DA38F
+ if_effect -74, AI_sub_81DA1B2
+ if_effect -72, AI_sub_81DA39A
+ if_effect -68, AI_sub_81DA386
+ if_effect -67, AI_sub_81DA1B2
+ if_effect -64, AI_sub_81DA3A3
+ if_effect -63, AI_sub_81DA3AE
+ if_effect -60, AI_sub_81DA1B2
+ if_effect -55, AI_sub_81DA3B9
+ if_effect -51, AI_sub_81DA3C4
+ if_effect -50, AI_sub_81DA3D5
+ if_effect -48, AI_sub_81DA3E6
+ if_effect -46, AI_sub_81DA3F7
+ if_effect -45, AI_sub_81DA402
+ if_effect -44, AI_sub_81DA413
+ end
+
+AI_sub_81D9FB6:: @ 81D9FB6
+ get_ability 0
+ if_equal 15, AI_sub_81DA433
+ if_equal 72, AI_sub_81DA433
+ if_status 0, 255, AI_sub_81DA433
+ end
+
+AI_sub_81D9FCF:: @ 81D9FCF
+ if_damage_bonus 0, AI_sub_81DA433
+ get_ability 0
+ if_equal 6, AI_sub_81DA433
+ count_alive_pokemon 1
+ if_not_equal 0, AI_sub_81D9FF2
+ count_alive_pokemon 0
+ if_not_equal 0, AI_sub_81DA433
+ jump AI_sub_81DA424
+
+AI_sub_81D9FF2:: @ 81D9FF2
+ end
+
+AI_sub_81D9FF3:: @ 81D9FF3
+ if_status2 0, 0x8000000, AI_sub_81DA433
+ if_not_status 0, 7, AI_sub_81DA430
+ end
+
+AI_sub_81DA008:: @ 81DA008
+ if_not_status 0, 7, AI_sub_81DA430
+ if_damage_bonus 0, AI_sub_81DA433
+ end
+
+AI_sub_81DA019:: @ 81DA019
+ if_hp_less_than 1, 51, AI_sub_81DA433
+
+AI_sub_81DA020:: @ 81DA020
+ if_stat_level_equal 1, 1, 12, AI_sub_81DA433
+ end
+
+AI_sub_81DA029:: @ 81DA029
+ if_stat_level_equal 1, 2, 12, AI_sub_81DA433
+ end
+
+AI_sub_81DA032:: @ 81DA032
+ if_stat_level_equal 1, 3, 12, AI_sub_81DA433
+ end
+
+AI_sub_81DA03B:: @ 81DA03B
+ if_stat_level_equal 1, 4, 12, AI_sub_81DA433
+ end
+
+AI_sub_81DA044:: @ 81DA044
+ if_stat_level_equal 1, 5, 12, AI_sub_81DA433
+ end
+
+AI_sub_81DA04D:: @ 81DA04D
+ if_stat_level_equal 1, 6, 12, AI_sub_81DA433
+ end
+
+AI_sub_81DA056:: @ 81DA056
+ if_stat_level_equal 1, 7, 12, AI_sub_81DA433
+ end
+
+AI_sub_81DA05F:: @ 81DA05F
+ if_stat_level_equal 0, 1, 0, AI_sub_81DA433
+ get_ability 0
+ if_equal 52, AI_sub_81DA433
+ jump AI_sub_81DA0C5
+
+AI_sub_81DA074:: @ 81DA074
+ if_stat_level_equal 0, 2, 0, AI_sub_81DA433
+ jump AI_sub_81DA0C5
+
+AI_sub_81DA081:: @ 81DA081
+ if_stat_level_equal 0, 3, 0, AI_sub_81DA433
+ jump AI_sub_81DA0C5
+
+AI_sub_81DA08E:: @ 81DA08E
+ if_stat_level_equal 0, 4, 0, AI_sub_81DA433
+ jump AI_sub_81DA0C5
+
+AI_sub_81DA09B:: @ 81DA09B
+ if_stat_level_equal 0, 5, 0, AI_sub_81DA433
+ jump AI_sub_81DA0C5
+
+AI_sub_81DA0A8:: @ 81DA0A8
+ if_stat_level_equal 0, 6, 0, AI_sub_81DA433
+ get_ability 0
+ if_equal 51, AI_sub_81DA433
+ jump AI_sub_81DA0C5
+
+AI_sub_81DA0BD:: @ 81DA0BD
+ if_stat_level_equal 0, 7, 0, AI_sub_81DA433
+
+AI_sub_81DA0C5:: @ 81DA0C5
+ get_ability 0
+ if_equal 29, AI_sub_81DA433
+ if_equal 73, AI_sub_81DA433
+ end
+
+AI_sub_81DA0D4:: @ 81DA0D4
+ if_stat_level_less_than 1, 1, 6, AI_sub_81DA149
+ if_stat_level_less_than 1, 2, 6, AI_sub_81DA149
+ if_stat_level_less_than 1, 3, 6, AI_sub_81DA149
+ if_stat_level_less_than 1, 4, 6, AI_sub_81DA149
+ if_stat_level_less_than 1, 5, 6, AI_sub_81DA149
+ if_stat_level_less_than 1, 6, 6, AI_sub_81DA149
+ if_stat_level_less_than 1, 7, 6, AI_sub_81DA149
+ if_stat_level_more_than 0, 1, 6, AI_sub_81DA149
+ if_stat_level_more_than 0, 2, 6, AI_sub_81DA149
+ if_stat_level_more_than 0, 3, 6, AI_sub_81DA149
+ if_stat_level_more_than 0, 4, 6, AI_sub_81DA149
+ if_stat_level_more_than 0, 5, 6, AI_sub_81DA149
+ if_stat_level_more_than 0, 6, 6, AI_sub_81DA149
+ if_stat_level_more_than 0, 7, 6, AI_sub_81DA149
+ jump AI_sub_81DA433
+
+AI_sub_81DA149:: @ 81DA149
+ end
+
+AI_sub_81DA14A:: @ 81DA14A
+ count_alive_pokemon 0
+ if_equal 0, AI_sub_81DA433
+ get_ability 0
+ if_equal 21, AI_sub_81DA433
+ end
+
+AI_sub_81DA15B:: @ 81DA15B
+ get_type 0
+ if_equal 8, AI_sub_81DA433
+ if_equal 3, AI_sub_81DA433
+ get_type 2
+ if_equal 8, AI_sub_81DA433
+ if_equal 3, AI_sub_81DA433
+ get_ability 0
+ if_equal 17, AI_sub_81DA433
+ if_status 0, 255, AI_sub_81DA433
+ end
+
+AI_sub_81DA18A:: @ 81DA18A
+ if_status4 1, 2, AI_sub_81DA430
+ end
+
+AI_sub_81DA195:: @ 81DA195
+ if_damage_bonus 0, AI_sub_81DA433
+ get_ability 0
+ if_equal 5, AI_sub_81DA433
+ if_level_cond 1, AI_sub_81DA433
+ end
+
+AI_sub_81DA1AA:: @ 81DA1AA
+ get_ability 0
+ if_equal 26, AI_sub_81DA433
+
+AI_sub_81DA1B2:: @ 81DA1B2
+ if_damage_bonus 0, AI_sub_81DA433
+ get_ability 0
+ if_not_equal 25, AI_sub_81DA1CB
+ if_damage_bonus 80, AI_sub_81DA1CB
+ jump AI_sub_81DA433
+
+AI_sub_81DA1CB:: @ 81DA1CB
+ end
+
+AI_sub_81DA1CC:: @ 81DA1CC
+ if_status4 1, 256, AI_sub_81DA430
+ end
+
+AI_sub_81DA1D7:: @ 81DA1D7
+ if_status2 1, 1048576, AI_sub_81DA433
+ end
+
+AI_sub_81DA1E2:: @ 81DA1E2
+ if_status2 0, 7, AI_sub_81DA42D
+ get_ability 0
+ if_equal 20, AI_sub_81DA433
+ end
+
+AI_sub_81DA1F5:: @ 81DA1F5
+ if_status4 1, 1, AI_sub_81DA430
+ end
+
+AI_sub_81DA200:: @ 81DA200
+ if_damage_bonus 0, AI_sub_81DA433
+ get_ability 0
+ if_equal 7, AI_sub_81DA433
+ if_status 0, 255, AI_sub_81DA433
+ end
+
+AI_sub_81DA219:: @ 81DA219
+ if_status2 1, 16777216, AI_sub_81DA430
+ if_hp_less_than 1, 26, AI_sub_81DA433
+ end
+
+AI_sub_81DA22B:: @ 81DA22B
+ if_status3 0, 4, AI_sub_81DA433
+ get_type 0
+ if_equal 12, AI_sub_81DA433
+ get_type 2
+ if_equal 12, AI_sub_81DA433
+ end
+
+AI_sub_81DA246:: @ 81DA246
+ if_last_move_did_damage 0, 0, AI_sub_81DA430
+ end
+
+AI_sub_81DA24E:: @ 81DA24E
+ if_last_move_did_damage 0, 1, AI_sub_81DA430
+ end
+
+AI_sub_81DA256:: @ 81DA256
+ if_not_status 1, 7, AI_sub_81DA430
+ end
+
+AI_sub_81DA261:: @ 81DA261
+ if_status2 0, 67108864, AI_sub_81DA433
+ end
+
+AI_sub_81DA26C:: @ 81DA26C
+ if_stat_level_equal 1, 1, 12, AI_sub_81DA433
+ if_stat_level_equal 1, 2, 12, AI_sub_81DA430
+ end
+
+AI_sub_81DA27D:: @ 81DA27D
+ if_status4 0, 16, AI_sub_81DA433
+ end
+
+AI_sub_81DA288:: @ 81DA288
+ if_status2 0, 536870912, AI_sub_81DA433
+ end
+
+AI_sub_81DA293:: @ 81DA293
+ if_status3 0, 32, AI_sub_81DA433
+ end
+
+AI_sub_81DA29E:: @ 81DA29E
+ get_weather
+ if_equal 2, AI_sub_81DA430
+ end
+
+AI_sub_81DA2A6:: @ 81DA2A6
+ if_status2 0, 983040, AI_sub_81DA433
+ get_ability 0
+ if_equal 12, AI_sub_81DA433
+ get_gender 1
+ if_equal 0, AI_sub_81DA2CB
+ if_equal -2, AI_sub_81DA2D8
+ jump AI_sub_81DA433
+
+AI_sub_81DA2CB:: @ 81DA2CB
+ get_gender 0
+ if_equal -2, AI_sub_81DA2E5
+ jump AI_sub_81DA433
+
+AI_sub_81DA2D8:: @ 81DA2D8
+ get_gender 0
+ if_equal 0, AI_sub_81DA2E5
+ jump AI_sub_81DA433
+
+AI_sub_81DA2E5:: @ 81DA2E5
+ end
+
+AI_sub_81DA2E6:: @ 81DA2E6
+ if_status4 1, 32, AI_sub_81DA430
+ end
+
+AI_sub_81DA2F1:: @ 81DA2F1
+ if_stat_level_equal 0, 1, 0, AI_sub_81DA433
+ if_stat_level_equal 0, 4, 0, AI_sub_81DA430
+
+AI_sub_81DA301:: @ 81DA301
+ count_alive_pokemon 1
+ if_equal 0, AI_sub_81DA433
+ end
+
+AI_sub_81DA30A:: @ 81DA30A
+ get_weather
+ if_equal 1, AI_sub_81DA430
+ end
+
+AI_sub_81DA312:: @ 81DA312
+ get_weather
+ if_equal 0, AI_sub_81DA430
+ end
+
+AI_sub_81DA31A:: @ 81DA31A
+ if_status4 0, 64, AI_sub_81DA433
+ end
+
+AI_sub_81DA325:: @ 81DA325
+ is_first_turn 1
+ if_equal 0, AI_sub_81DA433
+ end
+
+AI_sub_81DA32E:: @ 81DA32E
+ get_stockpile_count 1
+ if_equal 3, AI_sub_81DA433
+ end
+
+AI_sub_81DA337:: @ 81DA337
+ if_damage_bonus 0, AI_sub_81DA433
+ get_stockpile_count 1
+ if_equal 0, AI_sub_81DA433
+ end
+
+AI_sub_81DA346:: @ 81DA346
+ get_weather
+ if_equal 3, AI_sub_81DA430
+ end
+
+AI_sub_81DA34E:: @ 81DA34E
+ if_status2 0, -2147483648, AI_sub_81DA433
+ end
+
+AI_sub_81DA359:: @ 81DA359
+ get_ability 0
+ if_equal 41, AI_sub_81DA433
+ if_status 0, 255, AI_sub_81DA433
+ if_damage_bonus 0, AI_sub_81DA433
+ if_damage_bonus 20, AI_sub_81DA433
+ if_damage_bonus 10, AI_sub_81DA433
+ end
+
+AI_sub_81DA37E:: @ 81DA37E
+ is_double_battle
+ if_equal 0, AI_sub_81DA433
+ end
+
+AI_sub_81DA386:: @ 81DA386
+ get_ability 0
+ if_equal 60, AI_sub_81DA433
+ end
+
+AI_sub_81DA38F:: @ 81DA38F
+ if_status3 1, 1024, AI_sub_81DA433
+ end
+
+AI_sub_81DA39A:: @ 81DA39A
+ get_item 1
+ if_equal 0, AI_sub_81DA433
+ end
+
+AI_sub_81DA3A3:: @ 81DA3A3
+ if_status3 1, 8192, AI_sub_81DA433
+ end
+
+AI_sub_81DA3AE:: @ 81DA3AE
+ if_not_status 1, 216, AI_sub_81DA433
+ end
+
+AI_sub_81DA3B9:: @ 81DA3B9
+ if_status3 1, 65536, AI_sub_81DA433
+ end
+
+AI_sub_81DA3C4:: @ 81DA3C4
+ if_stat_level_equal 0, 1, 0, AI_sub_81DA433
+ if_stat_level_equal 0, 2, 0, AI_sub_81DA430
+ end
+
+AI_sub_81DA3D5:: @ 81DA3D5
+ if_stat_level_equal 1, 2, 12, AI_sub_81DA433
+ if_stat_level_equal 1, 5, 12, AI_sub_81DA430
+ end
+
+AI_sub_81DA3E6:: @ 81DA3E6
+ if_stat_level_equal 1, 1, 12, AI_sub_81DA433
+ if_stat_level_equal 1, 2, 12, AI_sub_81DA430
+ end
+
+AI_sub_81DA3F7:: @ 81DA3F7
+ if_status3 1, 131072, AI_sub_81DA433
+ end
+
+AI_sub_81DA402:: @ 81DA402
+ if_stat_level_equal 1, 4, 12, AI_sub_81DA433
+ if_stat_level_equal 1, 5, 12, AI_sub_81DA430
+ end
+
+AI_sub_81DA413:: @ 81DA413
+ if_stat_level_equal 1, 1, 12, AI_sub_81DA433
+ if_stat_level_equal 1, 3, 12, AI_sub_81DA430
+ end
+
+AI_sub_81DA424:: @ 81DA424
+ score -1
+ end
+
+AI_sub_81DA427:: @ 81DA427
+ score -2
+ end
+
+AI_sub_81DA42A:: @ 81DA42A
+ score -3
+ end
+
+AI_sub_81DA42D:: @ 81DA42D
+ score -5
+ end
+
+AI_sub_81DA430:: @ 81DA430
+ score -8
+ end
+
+AI_sub_81DA433:: @ 81DA433
+ score -10
+ end
+
+AI_sub_81DA436:: @ 81DA436
+ score -12
+ end
+ score 1
+ end
+ score 2
+ end
+ score 3
+ end
+ score 5
+ end
+
+AI_TryToFaint:: @ 81DA445
+ if_effect 1, AI_sub_81DA71C
+ if_effect 3, AI_sub_81DA738
+ if_effect 7, AI_sub_81DA752
+ if_effect 8, AI_sub_81DA7B0
+ if_effect 9, AI_sub_81DA7C4
+ if_effect 10, AI_sub_81DA848
+ if_effect 11, AI_sub_81DA883
+ if_effect 12, AI_sub_81DA8E9
+ if_effect 13, AI_sub_81DA8FF
+ if_effect 14, AI_sub_81DA93A
+ if_effect 15, AI_sub_81DA9A0
+ if_effect 16, AI_sub_81DA9BA
+ if_effect 17, AI_sub_81DAA54
+ if_effect 18, AI_sub_81DAA84
+ if_effect 19, AI_sub_81DAAD6
+ if_effect 20, AI_sub_81DAB0D
+ if_effect 21, AI_sub_81DAB23
+ if_effect 22, AI_sub_81DAB77
+ if_effect 23, AI_sub_81DAB98
+ if_effect 24, AI_sub_81DAC2C
+ if_effect 25, AI_sub_81DAC4D
+ if_effect 26, AI_sub_81DAD10
+ if_effect 28, AI_sub_81DAD1A
+ if_effect 30, AI_sub_81DAD52
+ if_effect 32, AI_sub_81DAD83
+ if_effect 33, AI_sub_81DADDC
+ if_effect 35, AI_sub_81DAE1B
+ if_effect 37, AI_sub_81DAE4A
+ if_effect 38, AI_sub_81DAEAA
+ if_effect 39, AI_sub_81DB645
+ if_effect 40, AI_sub_81DAEAB
+ if_effect 42, AI_sub_81DAEB5
+ if_effect 43, AI_sub_81DAEEB
+ if_effect 49, AI_sub_81DAF1A
+ if_effect 50, AI_sub_81DA848
+ if_effect 51, AI_sub_81DA883
+ if_effect 52, AI_sub_81DA8E9
+ if_effect 53, AI_sub_81DA8FF
+ if_effect 54, AI_sub_81DA93A
+ if_effect 55, AI_sub_81DA9A0
+ if_effect 56, AI_sub_81DA9BA
+ if_effect 58, AI_sub_81DAA84
+ if_effect 59, AI_sub_81DAAD6
+ if_effect 60, AI_sub_81DAB0D
+ if_effect 61, AI_sub_81DAB23
+ if_effect 62, AI_sub_81DAB77
+ if_effect 63, AI_sub_81DAB98
+ if_effect 64, AI_sub_81DAC2C
+ if_effect 65, AI_sub_81DAF3C
+ if_effect 66, AI_sub_81DAF6C
+ if_effect 67, AI_sub_81DAF7D
+ if_effect 70, AI_sub_81DAAF7
+ if_effect 75, AI_sub_81DB645
+ if_effect 78, AI_sub_81DAF9A
+ if_effect 79, AI_sub_81DAFBD
+ if_effect 80, AI_sub_81DB053
+ if_effect 84, AI_sub_81DADDC
+ if_effect 86, AI_sub_81DB07B
+ if_effect 89, AI_sub_81DB09A
+ if_effect 90, AI_sub_81DB13B
+ if_effect 91, AI_sub_81DB1A3
+ if_effect 92, AI_sub_81DB1CF
+ if_effect 94, AI_sub_81DB1D2
+ if_effect 97, AI_sub_81DB1DB
+ if_effect 98, AI_sub_81DB1DE
+ if_effect 99, AI_sub_81DB214
+ if_effect 102, AI_sub_81DB259
+ if_effect 105, AI_sub_81DB270
+ if_effect 106, AI_sub_81DAEB5
+ if_effect 108, AI_sub_81DA9BA
+ if_effect 109, AI_sub_81DB293
+ if_effect 111, AI_sub_81DB2E2
+ if_effect 113, AI_sub_81DB3A3
+ if_effect 116, AI_sub_81DB3D1
+ if_effect 127, AI_sub_81DB3EF
+ if_effect -128, AI_sub_81DB48B
+ if_effect -124, AI_sub_81DAD69
+ if_effect -123, AI_sub_81DAD69
+ if_effect -122, AI_sub_81DAD69
+ if_effect -120, AI_sub_81DB4C1
+ if_effect -119, AI_sub_81DB500
+ if_effect -114, AI_sub_81DB529
+ if_effect -113, AI_sub_81DB538
+ if_effect -112, AI_sub_81DB5A5
+ if_effect -111, AI_sub_81DB645
+ if_effect -105, AI_sub_81DB645
+ if_effect -101, AI_sub_81DB669
+ if_effect -99, AI_sub_81DAD83
+ if_effect -98, AI_sub_81DB6F3
+ if_effect -95, AI_sub_81DB6F6
+ if_effect -94, AI_sub_81DAD83
+ if_effect -92, AI_sub_81DB707
+ if_effect -90, AI_sub_81DAF12
+ if_effect -88, AI_sub_81DA752
+ if_effect -87, AI_sub_81DB730
+ if_effect -86, AI_sub_81DB73D
+ if_effect -85, AI_sub_81DB78C
+ if_effect -79, AI_sub_81DB79E
+ if_effect -78, AI_sub_81DB7E9
+ if_effect -74, AI_sub_81DB820
+ if_effect -73, AI_sub_81DB850
+ if_effect -72, AI_sub_81DB883
+ if_effect -71, AI_sub_81DB8A2
+ if_effect -70, AI_sub_81DB8D0
+ if_effect -68, AI_sub_81DB8E2
+ if_effect -67, AI_sub_81DB8FA
+ if_effect -66, AI_sub_81DB926
+ if_effect -65, AI_sub_81DB7E9
+ if_effect -64, AI_sub_81DB94E
+ if_effect -63, AI_sub_81DB95F
+ if_effect -61, AI_sub_81DB96E
+ if_effect -56, AI_sub_81DAEEB
+ if_effect -55, AI_sub_81DB9D8
+ if_effect -52, AI_sub_81DB9FE
+ if_effect -51, AI_sub_81DAAD6
+ if_effect -50, AI_sub_81DA93A
+ if_effect -48, AI_sub_81DA883
+ if_effect -47, AI_sub_81DAEEB
+ if_effect -46, AI_sub_81DBA26
+ if_effect -45, AI_sub_81DA93A
+ if_effect -44, AI_sub_81DBA4C
+ end
+
+AI_sub_81DA71C:: @ 81DA71C
+ if_move_effect 0, 8, AI_sub_81DA72F
+ if_move_effect 0, 107, AI_sub_81DA72F
+ jump AI_sub_81DA737
+
+AI_sub_81DA72F:: @ 81DA72F
+ if_random_less_than -128, AI_sub_81DA737
+ score 1
+
+AI_sub_81DA737:: @ 81DA737
+ end
+
+AI_sub_81DA738:: @ 81DA738
+ if_damage_bonus 20, AI_sub_81DA749
+ if_damage_bonus 10, AI_sub_81DA749
+ jump AI_sub_81DA751
+
+AI_sub_81DA749:: @ 81DA749
+ if_random_less_than 50, AI_sub_81DA751
+ score -3
+
+AI_sub_81DA751:: @ 81DA751
+ end
+
+AI_sub_81DA752:: @ 81DA752
+ if_stat_level_less_than 0, 7, 7, AI_sub_81DA76C
+ score -1
+ if_stat_level_less_than 0, 7, 10, AI_sub_81DA76C
+ if_random_less_than -128, AI_sub_81DA76C
+ score -1
+
+AI_sub_81DA76C:: @ 81DA76C
+ if_hp_less_than 1, 80, AI_sub_81DA784
+ if_would_go_first 1, AI_sub_81DA784
+ if_random_less_than 50, AI_sub_81DA7AF
+ jump AI_sub_81DA42A
+
+AI_sub_81DA784:: @ 81DA784
+ if_hp_more_than 1, 50, AI_sub_81DA7A7
+ if_random_less_than -128, AI_sub_81DA793
+ score 1
+
+AI_sub_81DA793:: @ 81DA793
+ if_hp_more_than 1, 30, AI_sub_81DA7AF
+ if_random_less_than 50, AI_sub_81DA7AF
+ score 1
+ jump AI_sub_81DA7AF
+
+AI_sub_81DA7A7:: @ 81DA7A7
+ if_random_less_than 50, AI_sub_81DA7AF
+ score -1
+
+AI_sub_81DA7AF:: @ 81DA7AF
+ end
+
+AI_sub_81DA7B0:: @ 81DA7B0
+ if_damage_bonus 10, AI_sub_81DA7C1
+ if_damage_bonus 20, AI_sub_81DA7C1
+ jump AI_sub_81DA7C3
+
+AI_sub_81DA7C1:: @ 81DA7C1
+ score -1
+
+AI_sub_81DA7C3:: @ 81DA7C3
+ end
+
+AI_sub_81DA7C4:: @ 81DA7C4
+ if_would_go_first 1, AI_sub_81DA7E2
+ get_move 0
+ if_not_in_words AI_words_81DA7F8, AI_sub_81DA7E2
+ if_random_less_than -128, AI_sub_81DA7F5
+ score 2
+ jump AI_sub_81DA7F5
+
+AI_sub_81DA7E2:: @ 81DA7E2
+ get_move 0
+ if_in_words AI_words_81DA7F8, AI_sub_81DA7F5
+ if_random_less_than 80, AI_sub_81DA7F5
+ score -1
+
+AI_sub_81DA7F5:: @ 81DA7F5
+ end
+ .space 2
+
+AI_words_81DA7F8:: @ 81DA7F8
+ .align 1
+ .2byte 0x4F
+ .2byte 0x8E
+ .2byte 0x93
+ .2byte 0x5F
+ .2byte 0x2F
+ .2byte 0x140
+ .2byte 0x145
+ .2byte 0x1C
+ .2byte 0x6C
+ .2byte 0x5C
+ .2byte 0xC
+ .2byte 0x20
+ .2byte 0x5A
+ .2byte 0x149
+ .2byte 0xEE
+ .2byte 0xB1
+ .2byte 0x6D
+ .2byte 0xBA
+ .2byte 0x67
+ .2byte 0xB2
+ .2byte 0xB8
+ .2byte 0x139
+ .2byte 0x13F
+ .2byte 0x56
+ .2byte 0x89
+ .2byte 0x4D
+ .2byte 0xF7
+ .2byte 0xDF
+ .2byte 0x3F
+ .2byte 0xF5
+ .2byte 0xA8
+ .2byte 0x157
+ .2byte 0xD5
+ .2byte 0xCF
+ .2byte 0x103
+ .2byte 0x104
+ .2byte 0x10F
+ .2byte 0x114
+ .2byte 0x11D
+ .2byte 0xFFFF
+
+AI_sub_81DA848:: @ 81DA848
+ if_stat_level_less_than 1, 1, 9, AI_sub_81DA85D
+ if_random_less_than 100, AI_sub_81DA86C
+ score -1
+ jump AI_sub_81DA86C
+
+AI_sub_81DA85D:: @ 81DA85D
+ if_hp_not_equal 1, 100, AI_sub_81DA86C
+ if_random_less_than -128, AI_sub_81DA86C
+ score 2
+
+AI_sub_81DA86C:: @ 81DA86C
+ if_hp_more_than 1, 70, AI_sub_81DA882
+ if_hp_less_than 1, 40, AI_sub_81DA880
+ if_random_less_than 40, AI_sub_81DA882
+
+AI_sub_81DA880:: @ 81DA880
+ score -2
+
+AI_sub_81DA882:: @ 81DA882
+ end
+
+AI_sub_81DA883:: @ 81DA883
+ if_stat_level_less_than 1, 2, 9, AI_sub_81DA898
+ if_random_less_than 100, AI_sub_81DA8A7
+ score -1
+ jump AI_sub_81DA8A7
+
+AI_sub_81DA898:: @ 81DA898
+ if_hp_not_equal 1, 100, AI_sub_81DA8A7
+ if_random_less_than -128, AI_sub_81DA8A7
+ score 2
+
+AI_sub_81DA8A7:: @ 81DA8A7
+ if_hp_less_than 1, 70, AI_sub_81DA8B4
+ if_random_less_than -56, AI_sub_81DA8DE
+
+AI_sub_81DA8B4:: @ 81DA8B4
+ if_hp_less_than 1, 40, AI_sub_81DA8DC
+ get_move 0
+ get_move_power_from_result
+ if_equal 0, AI_sub_81DA8D6
+ get_move 0
+ get_move_type_from_result
+ if_not_in_bytes AI_bytes_81DA8DF, AI_sub_81DA8DC
+ if_random_less_than 60, AI_sub_81DA8DE
+
+AI_sub_81DA8D6:: @ 81DA8D6
+ if_random_less_than 60, AI_sub_81DA8DE
+
+AI_sub_81DA8DC:: @ 81DA8DC
+ score -2
+
+AI_sub_81DA8DE:: @ 81DA8DE
+ end
+
+AI_bytes_81DA8DF:: @ 81DA8DF
+ .byte 0
+ .byte 1
+ .byte 3
+ .byte 4
+ .byte 2
+ .byte 5
+ .byte 6
+ .byte 7
+ .byte 8
+ .byte 0xFF
+
+AI_sub_81DA8E9:: @ 81DA8E9
+ if_would_go_first 1, AI_sub_81DA8F6
+ score -3
+ jump AI_sub_81DA8FE
+
+AI_sub_81DA8F6:: @ 81DA8F6
+ if_random_less_than 70, AI_sub_81DA8FE
+ score 3
+
+AI_sub_81DA8FE:: @ 81DA8FE
+ end
+
+AI_sub_81DA8FF:: @ 81DA8FF
+ if_stat_level_less_than 1, 4, 9, AI_sub_81DA914
+ if_random_less_than 100, AI_sub_81DA923
+ score -1
+ jump AI_sub_81DA923
+
+AI_sub_81DA914:: @ 81DA914
+ if_hp_not_equal 1, 100, AI_sub_81DA923
+ if_random_less_than -128, AI_sub_81DA923
+ score 2
+
+AI_sub_81DA923:: @ 81DA923
+ if_hp_more_than 1, 70, AI_sub_81DA939
+ if_hp_less_than 1, 40, AI_sub_81DA937
+ if_random_less_than 70, AI_sub_81DA939
+
+AI_sub_81DA937:: @ 81DA937
+ score -2
+
+AI_sub_81DA939:: @ 81DA939
+ end
+
+AI_sub_81DA93A:: @ 81DA93A
+ if_stat_level_less_than 1, 5, 9, AI_sub_81DA94F
+ if_random_less_than 100, AI_sub_81DA95E
+ score -1
+ jump AI_sub_81DA95E
+
+AI_sub_81DA94F:: @ 81DA94F
+ if_hp_not_equal 1, 100, AI_sub_81DA95E
+ if_random_less_than -128, AI_sub_81DA95E
+ score 2
+
+AI_sub_81DA95E:: @ 81DA95E
+ if_hp_less_than 1, 70, AI_sub_81DA96B
+ if_random_less_than -56, AI_sub_81DA995
+
+AI_sub_81DA96B:: @ 81DA96B
+ if_hp_less_than 1, 40, AI_sub_81DA993
+ get_move 0
+ get_move_power_from_result
+ if_equal 0, AI_sub_81DA98D
+ get_move 0
+ get_move_type_from_result
+ if_in_bytes AI_bytes_81DA996, AI_sub_81DA993
+ if_random_less_than 60, AI_sub_81DA995
+
+AI_sub_81DA98D:: @ 81DA98D
+ if_random_less_than 60, AI_sub_81DA995
+
+AI_sub_81DA993:: @ 81DA993
+ score -2
+
+AI_sub_81DA995:: @ 81DA995
+ end
+
+AI_bytes_81DA996:: @ 81DA996
+ .byte 0
+ .byte 1
+ .byte 3
+ .byte 4
+ .byte 2
+ .byte 5
+ .byte 6
+ .byte 7
+ .byte 8
+ .byte 0xFF
+
+AI_sub_81DA9A0:: @ 81DA9A0
+ if_stat_level_less_than 1, 6, 9, AI_sub_81DA9B0
+ if_random_less_than 50, AI_sub_81DA9B0
+ score -2
+
+AI_sub_81DA9B0:: @ 81DA9B0
+ if_hp_more_than 1, 70, AI_sub_81DA9B9
+ score -2
+
+AI_sub_81DA9B9:: @ 81DA9B9
+ end
+
+AI_sub_81DA9BA:: @ 81DA9BA
+ if_hp_less_than 1, 90, AI_sub_81DA9C9
+ if_random_less_than 100, AI_sub_81DA9C9
+ score 3
+
+AI_sub_81DA9C9:: @ 81DA9C9
+ if_stat_level_less_than 1, 7, 9, AI_sub_81DA9D9
+ if_random_less_than -128, AI_sub_81DA9D9
+ score -1
+
+AI_sub_81DA9D9:: @ 81DA9D9
+ if_not_status 0, 128, AI_sub_81DA9F8
+ if_hp_more_than 1, 50, AI_sub_81DA9F0
+ if_random_less_than 80, AI_sub_81DA9F8
+
+AI_sub_81DA9F0:: @ 81DA9F0
+ if_random_less_than 50, AI_sub_81DA9F8
+ score 3
+
+AI_sub_81DA9F8:: @ 81DA9F8
+ if_not_status3 0, 4, AI_sub_81DAA0A
+ if_random_less_than 70, AI_sub_81DAA0A
+ score 3
+
+AI_sub_81DAA0A:: @ 81DAA0A
+ if_not_status3 1, 1024, AI_sub_81DAA1C
+ if_random_less_than -128, AI_sub_81DAA1C
+ score 2
+
+AI_sub_81DAA1C:: @ 81DAA1C
+ if_not_status2 0, 268435456, AI_sub_81DAA2E
+ if_random_less_than 70, AI_sub_81DAA2E
+ score 3
+
+AI_sub_81DAA2E:: @ 81DAA2E
+ if_hp_more_than 1, 70, AI_sub_81DAA53
+ if_stat_level_equal 1, 7, 6, AI_sub_81DAA53
+ if_hp_less_than 1, 40, AI_sub_81DAA51
+ if_hp_less_than 0, 40, AI_sub_81DAA51
+ if_random_less_than 70, AI_sub_81DAA53
+
+AI_sub_81DAA51:: @ 81DAA51
+ score -2
+
+AI_sub_81DAA53:: @ 81DAA53
+ end
+
+AI_sub_81DAA54:: @ 81DAA54
+ if_stat_level_more_than 0, 7, 10, AI_sub_81DAA79
+ if_stat_level_less_than 1, 6, 2, AI_sub_81DAA79
+ if_stat_level_more_than 0, 7, 8, AI_sub_81DAA7B
+ if_stat_level_less_than 1, 6, 4, AI_sub_81DAA7B
+ jump AI_sub_81DAA83
+
+AI_sub_81DAA79:: @ 81DAA79
+ score 1
+
+AI_sub_81DAA7B:: @ 81DAA7B
+ if_random_less_than 100, AI_sub_81DAA83
+ score 1
+
+AI_sub_81DAA83:: @ 81DAA83
+ end
+
+AI_sub_81DAA84:: @ 81DAA84
+ if_stat_level_equal 0, 1, 6, AI_sub_81DAAA7
+ score -1
+ if_hp_more_than 1, 90, AI_sub_81DAA97
+ score -1
+
+AI_sub_81DAA97:: @ 81DAA97
+ if_stat_level_more_than 0, 1, 3, AI_sub_81DAAA7
+ if_random_less_than 50, AI_sub_81DAAA7
+ score -2
+
+AI_sub_81DAAA7:: @ 81DAAA7
+ if_hp_more_than 0, 70, AI_sub_81DAAB0
+ score -2
+
+AI_sub_81DAAB0:: @ 81DAAB0
+ get_type 0
+ if_in_bytes AI_bytes_81DAACF, AI_sub_81DAACE
+ get_type 2
+ if_in_bytes AI_bytes_81DAACF, AI_sub_81DAACE
+ if_random_less_than 50, AI_sub_81DAACE
+ score -2
+
+AI_sub_81DAACE:: @ 81DAACE
+ end
+
+AI_bytes_81DAACF:: @ 81DAACF
+ .byte 0
+ .byte 1
+ .byte 4
+ .byte 5
+ .byte 6
+ .byte 8
+ .byte 0xFF
+
+AI_sub_81DAAD6:: @ 81DAAD6
+ if_hp_less_than 1, 70, AI_sub_81DAAE5
+ if_stat_level_more_than 0, 2, 3, AI_sub_81DAAED
+
+AI_sub_81DAAE5:: @ 81DAAE5
+ if_random_less_than 50, AI_sub_81DAAED
+ score -2
+
+AI_sub_81DAAED:: @ 81DAAED
+ if_hp_more_than 0, 70, AI_sub_81DAAF6
+ score -2
+
+AI_sub_81DAAF6:: @ 81DAAF6
+ end
+
+AI_sub_81DAAF7:: @ 81DAAF7
+ if_move 196, AI_sub_81DAB0D
+ if_move 317, AI_sub_81DAB0D
+ if_move 341, AI_sub_81DAB0D
+ end
+
+AI_sub_81DAB0D:: @ 81DAB0D
+ if_would_go_first 1, AI_sub_81DAB1A
+ score -3
+ jump AI_sub_81DAB22
+
+AI_sub_81DAB1A:: @ 81DAB1A
+ if_random_less_than 70, AI_sub_81DAB22
+ score 2
+
+AI_sub_81DAB22:: @ 81DAB22
+ end
+
+AI_sub_81DAB23:: @ 81DAB23
+ if_stat_level_equal 0, 1, 6, AI_sub_81DAB46
+ score -1
+ if_hp_more_than 1, 90, AI_sub_81DAB36
+ score -1
+
+AI_sub_81DAB36:: @ 81DAB36
+ if_stat_level_more_than 0, 4, 3, AI_sub_81DAB46
+ if_random_less_than 50, AI_sub_81DAB46
+ score -2
+
+AI_sub_81DAB46:: @ 81DAB46
+ if_hp_more_than 0, 70, AI_sub_81DAB4F
+ score -2
+
+AI_sub_81DAB4F:: @ 81DAB4F
+ get_type 0
+ if_in_bytes AI_bytes_81DAB6E, AI_sub_81DAB6D
+ get_type 2
+ if_in_bytes AI_bytes_81DAB6E, AI_sub_81DAB6D
+ if_random_less_than 50, AI_sub_81DAB6D
+ score -2
+
+AI_sub_81DAB6D:: @ 81DAB6D
+ end
+
+AI_bytes_81DAB6E:: @ 81DAB6E
+ .byte 10
+ .byte 11
+ .byte 12
+ .byte 13
+ .byte 14
+ .byte 15
+ .byte 16
+ .byte 17
+ .byte 0xFF
+
+AI_sub_81DAB77:: @ 81DAB77
+ if_hp_less_than 1, 70, AI_sub_81DAB86
+ if_stat_level_more_than 0, 5, 3, AI_sub_81DAB8E
+
+AI_sub_81DAB86:: @ 81DAB86
+ if_random_less_than 50, AI_sub_81DAB8E
+ score -2
+
+AI_sub_81DAB8E:: @ 81DAB8E
+ if_hp_more_than 0, 70, AI_sub_81DAB97
+ score -2
+
+AI_sub_81DAB97:: @ 81DAB97
+ end
+
+AI_sub_81DAB98:: @ 81DAB98
+ if_hp_less_than 1, 70, AI_sub_81DABA6
+ if_hp_more_than 0, 70, AI_sub_81DABAE
+
+AI_sub_81DABA6:: @ 81DABA6
+ if_random_less_than 100, AI_sub_81DABAE
+ score -1
+
+AI_sub_81DABAE:: @ 81DABAE
+ if_stat_level_more_than 1, 6, 4, AI_sub_81DABBE
+ if_random_less_than 80, AI_sub_81DABBE
+ score -2
+
+AI_sub_81DABBE:: @ 81DABBE
+ if_not_status 0, 128, AI_sub_81DABD0
+ if_random_less_than 70, AI_sub_81DABD0
+ score 2
+
+AI_sub_81DABD0:: @ 81DABD0
+ if_not_status3 0, 4, AI_sub_81DABE2
+ if_random_less_than 70, AI_sub_81DABE2
+ score 2
+
+AI_sub_81DABE2:: @ 81DABE2
+ if_not_status3 1, 1024, AI_sub_81DABF4
+ if_random_less_than -128, AI_sub_81DABF4
+ score 1
+
+AI_sub_81DABF4:: @ 81DABF4
+ if_not_status2 0, 268435456, AI_sub_81DAC06
+ if_random_less_than 70, AI_sub_81DAC06
+ score 2
+
+AI_sub_81DAC06:: @ 81DAC06
+ if_hp_more_than 1, 70, AI_sub_81DAC2B
+ if_stat_level_equal 0, 6, 6, AI_sub_81DAC2B
+ if_hp_less_than 1, 40, AI_sub_81DAC29
+ if_hp_less_than 0, 40, AI_sub_81DAC29
+ if_random_less_than 70, AI_sub_81DAC2B
+
+AI_sub_81DAC29:: @ 81DAC29
+ score -2
+
+AI_sub_81DAC2B:: @ 81DAC2B
+ end
+
+AI_sub_81DAC2C:: @ 81DAC2C
+ if_hp_less_than 1, 70, AI_sub_81DAC3B
+ if_stat_level_more_than 0, 7, 3, AI_sub_81DAC43
+
+AI_sub_81DAC3B:: @ 81DAC3B
+ if_random_less_than 50, AI_sub_81DAC43
+ score -2
+
+AI_sub_81DAC43:: @ 81DAC43
+ if_hp_more_than 0, 70, AI_sub_81DAC4C
+ score -2
+
+AI_sub_81DAC4C:: @ 81DAC4C
+ end
+
+AI_sub_81DAC4D:: @ 81DAC4D
+ if_stat_level_more_than 1, 1, 8, AI_sub_81DACA2
+ if_stat_level_more_than 1, 2, 8, AI_sub_81DACA2
+ if_stat_level_more_than 1, 4, 8, AI_sub_81DACA2
+ if_stat_level_more_than 1, 5, 8, AI_sub_81DACA2
+ if_stat_level_more_than 1, 7, 8, AI_sub_81DACA2
+ if_stat_level_less_than 0, 1, 4, AI_sub_81DACA2
+ if_stat_level_less_than 0, 2, 4, AI_sub_81DACA2
+ if_stat_level_less_than 0, 4, 4, AI_sub_81DACA2
+ if_stat_level_less_than 0, 5, 4, AI_sub_81DACA2
+ if_stat_level_less_than 0, 6, 4, AI_sub_81DACA2
+ jump AI_sub_81DACAA
+
+AI_sub_81DACA2:: @ 81DACA2
+ if_random_less_than 50, AI_sub_81DACAA
+ score -3
+
+AI_sub_81DACAA:: @ 81DACAA
+ if_stat_level_more_than 0, 1, 8, AI_sub_81DAD07
+ if_stat_level_more_than 0, 2, 8, AI_sub_81DAD07
+ if_stat_level_more_than 0, 4, 8, AI_sub_81DAD07
+ if_stat_level_more_than 0, 5, 8, AI_sub_81DAD07
+ if_stat_level_more_than 0, 7, 8, AI_sub_81DAD07
+ if_stat_level_less_than 1, 1, 4, AI_sub_81DAD07
+ if_stat_level_less_than 1, 2, 4, AI_sub_81DAD07
+ if_stat_level_less_than 1, 4, 4, AI_sub_81DAD07
+ if_stat_level_less_than 1, 5, 4, AI_sub_81DAD07
+ if_stat_level_less_than 1, 6, 4, AI_sub_81DAD07
+ if_random_less_than 50, AI_sub_81DAD0F
+ score -1
+ jump AI_sub_81DAD0F
+
+AI_sub_81DAD07:: @ 81DAD07
+ if_random_less_than 50, AI_sub_81DAD0F
+ score 3
+
+AI_sub_81DAD0F:: @ 81DAD0F
+ end
+
+AI_sub_81DAD10:: @ 81DAD10
+ if_hp_more_than 1, 90, AI_sub_81DAD19
+ score -2
+
+AI_sub_81DAD19:: @ 81DAD19
+ end
+
+AI_sub_81DAD1A:: @ 81DAD1A
+ if_stat_level_more_than 0, 1, 8, AI_sub_81DAD49
+ if_stat_level_more_than 0, 2, 8, AI_sub_81DAD49
+ if_stat_level_more_than 0, 4, 8, AI_sub_81DAD49
+ if_stat_level_more_than 0, 5, 8, AI_sub_81DAD49
+ if_stat_level_more_than 0, 7, 8, AI_sub_81DAD49
+ score -3
+ jump AI_sub_81DAD51
+
+AI_sub_81DAD49:: @ 81DAD49
+ if_random_less_than -128, AI_sub_81DAD51
+ score 2
+
+AI_sub_81DAD51:: @ 81DAD51
+ end
+
+AI_sub_81DAD52:: @ 81DAD52
+ if_hp_more_than 1, 90, AI_sub_81DAD5B
+ score -2
+
+AI_sub_81DAD5B:: @ 81DAD5B
+ get_turn_count
+ if_equal 0, AI_sub_81DAD68
+ if_random_less_than -56, AI_sub_81DA427
+
+AI_sub_81DAD68:: @ 81DAD68
+ end
+
+AI_sub_81DAD69:: @ 81DAD69
+ get_weather
+ if_equal 3, AI_sub_81DAD81
+ if_equal 1, AI_sub_81DAD81
+ if_equal 2, AI_sub_81DAD81
+ jump AI_sub_81DAD83
+
+AI_sub_81DAD81:: @ 81DAD81
+ score -2
+
+AI_sub_81DAD83:: @ 81DAD83
+ if_hp_equal 1, 100, AI_sub_81DADAB
+ if_would_go_first 1, AI_sub_81DADB2
+ score -8
+ jump AI_sub_81DADDB
+ if_hp_less_than 1, 50, AI_sub_81DADC6
+ if_hp_more_than 1, 80, AI_sub_81DADAB
+ if_random_less_than 70, AI_sub_81DADC6
+
+AI_sub_81DADAB:: @ 81DADAB
+ score -3
+ jump AI_sub_81DADDB
+
+AI_sub_81DADB2:: @ 81DADB2
+ if_hp_less_than 1, 70, AI_sub_81DADC6
+ if_random_less_than 30, AI_sub_81DADC6
+ score -3
+ jump AI_sub_81DADDB
+
+AI_sub_81DADC6:: @ 81DADC6
+ if_not_move_effect 0, -61, AI_sub_81DADD3
+ if_random_less_than 100, AI_sub_81DADDB
+
+AI_sub_81DADD3:: @ 81DADD3
+ if_random_less_than 20, AI_sub_81DADDB
+ score 2
+
+AI_sub_81DADDB:: @ 81DADDB
+ end
+
+AI_sub_81DADDC:: @ 81DADDC
+ if_user_cant_damage AI_sub_81DADFF
+ if_hp_more_than 1, 50, AI_sub_81DADF0
+ if_random_less_than 50, AI_sub_81DADF0
+ score -3
+
+AI_sub_81DADF0:: @ 81DADF0
+ if_hp_more_than 0, 50, AI_sub_81DADFF
+ if_random_less_than 50, AI_sub_81DADFF
+ score -3
+
+AI_sub_81DADFF:: @ 81DADFF
+ if_move_effect 1, 14, AI_sub_81DAE12
+ if_move_effect 1, 111, AI_sub_81DAE12
+ jump AI_sub_81DAE1A
+
+AI_sub_81DAE12:: @ 81DAE12
+ if_random_less_than 60, AI_sub_81DAE1A
+ score 2
+
+AI_sub_81DAE1A:: @ 81DAE1A
+ end
+
+AI_sub_81DAE1B:: @ 81DAE1B
+ if_hp_less_than 1, 50, AI_sub_81DAE3E
+ get_type 0
+ if_in_bytes AI_bytes_81DAE41, AI_sub_81DAE40
+ get_type 2
+ if_in_bytes AI_bytes_81DAE41, AI_sub_81DAE40
+ if_random_less_than 50, AI_sub_81DAE40
+
+AI_sub_81DAE3E:: @ 81DAE3E
+ score -2
+
+AI_sub_81DAE40:: @ 81DAE40
+ end
+
+AI_bytes_81DAE41:: @ 81DAE41
+ .byte 10
+ .byte 11
+ .byte 12
+ .byte 13
+ .byte 14
+ .byte 15
+ .byte 16
+ .byte 17
+ .byte 0xFF
+
+AI_sub_81DAE4A:: @ 81DAE4A
+ if_would_go_first 1, AI_sub_81DAE79
+ if_hp_not_equal 1, 100, AI_sub_81DAE5E
+ score -8
+ jump AI_sub_81DAEA9
+
+AI_sub_81DAE5E:: @ 81DAE5E
+ if_hp_less_than 1, 40, AI_sub_81DAE94
+ if_hp_more_than 1, 50, AI_sub_81DAE72
+ if_random_less_than 70, AI_sub_81DAE94
+
+AI_sub_81DAE72:: @ 81DAE72
+ score -3
+ jump AI_sub_81DAEA9
+
+AI_sub_81DAE79:: @ 81DAE79
+ if_hp_less_than 1, 60, AI_sub_81DAE94
+ if_hp_more_than 1, 70, AI_sub_81DAE8D
+ if_random_less_than 50, AI_sub_81DAE94
+
+AI_sub_81DAE8D:: @ 81DAE8D
+ score -3
+ jump AI_sub_81DAEA9
+
+AI_sub_81DAE94:: @ 81DAE94
+ if_not_move_effect 0, -61, AI_sub_81DAEA1
+ if_random_less_than 50, AI_sub_81DAEA9
+
+AI_sub_81DAEA1:: @ 81DAEA1
+ if_random_less_than 10, AI_sub_81DAEA9
+ score 3
+
+AI_sub_81DAEA9:: @ 81DAEA9
+ end
+
+AI_sub_81DAEAA:: @ 81DAEAA
+ end
+
+AI_sub_81DAEAB:: @ 81DAEAB
+ if_hp_more_than 0, 50, AI_sub_81DAEB4
+ score -1
+
+AI_sub_81DAEB4:: @ 81DAEB4
+ end
+
+AI_sub_81DAEB5:: @ 81DAEB5
+ if_status 0, 128, AI_sub_81DAEE2
+ if_status2 0, 268435456, AI_sub_81DAEE2
+ if_status3 0, 32, AI_sub_81DAEE2
+ if_status2 0, 983040, AI_sub_81DAEE2
+ jump AI_sub_81DAEEA
+
+AI_sub_81DAEE2:: @ 81DAEE2
+ if_random_less_than -128, AI_sub_81DAEEA
+ score 1
+
+AI_sub_81DAEEA:: @ 81DAEEA
+ end
+
+AI_sub_81DAEEB:: @ 81DAEEB
+ if_damage_bonus 10, AI_sub_81DAF11
+ if_damage_bonus 20, AI_sub_81DAF11
+ if_damage_bonus 80, AI_sub_81DAF09
+ if_damage_bonus -96, AI_sub_81DAF09
+ if_random_less_than -128, AI_sub_81DAF11
+
+AI_sub_81DAF09:: @ 81DAF09
+ if_random_less_than -128, AI_sub_81DAF11
+ score 1
+
+AI_sub_81DAF11:: @ 81DAF11
+ end
+
+AI_sub_81DAF12:: @ 81DAF12
+ if_random_less_than -128, AI_sub_81DAF1A
+ score 1
+
+AI_sub_81DAF1A:: @ 81DAF1A
+ if_hp_more_than 0, 70, AI_sub_81DAF3B
+ if_random_less_than -128, AI_sub_81DAF29
+ score -1
+
+AI_sub_81DAF29:: @ 81DAF29
+ if_hp_more_than 0, 50, AI_sub_81DAF3B
+ score -1
+ if_hp_more_than 0, 30, AI_sub_81DAF3B
+ score -1
+
+AI_sub_81DAF3B:: @ 81DAF3B
+ end
+
+AI_sub_81DAF3C:: @ 81DAF3C
+ if_hp_less_than 1, 50, AI_sub_81DAF5F
+ get_type 0
+ if_in_bytes AI_bytes_81DAF62, AI_sub_81DAF61
+ get_type 2
+ if_in_bytes AI_bytes_81DAF62, AI_sub_81DAF61
+ if_random_less_than 50, AI_sub_81DAF61
+
+AI_sub_81DAF5F:: @ 81DAF5F
+ score -2
+
+AI_sub_81DAF61:: @ 81DAF61
+ end
+
+AI_bytes_81DAF62:: @ 81DAF62
+ .byte 0
+ .byte 1
+ .byte 2
+ .byte 3
+ .byte 4
+ .byte 5
+ .byte 6
+ .byte 7
+ .byte 8
+ .byte 0xFF
+
+AI_sub_81DAF6C:: @ 81DAF6C
+ if_hp_less_than 1, 50, AI_sub_81DAF7A
+ if_hp_more_than 0, 50, AI_sub_81DAF7C
+
+AI_sub_81DAF7A:: @ 81DAF7A
+ score -1
+
+AI_sub_81DAF7C:: @ 81DAF7C
+ end
+
+AI_sub_81DAF7D:: @ 81DAF7D
+ if_would_go_first 1, AI_sub_81DAF91
+ if_hp_more_than 1, 70, AI_sub_81DAF99
+ score -1
+ jump AI_sub_81DAF99
+
+AI_sub_81DAF91:: @ 81DAF91
+ if_random_less_than 20, AI_sub_81DAF99
+ score 3
+
+AI_sub_81DAF99:: @ 81DAF99
+ end
+
+AI_sub_81DAF9A:: @ 81DAF9A
+ if_would_go_first 1, AI_sub_81DAFBC
+ if_hp_more_than 1, 60, AI_sub_81DAFBC
+ if_hp_less_than 1, 40, AI_sub_81DAFB4
+ if_random_less_than -76, AI_sub_81DAFBC
+
+AI_sub_81DAFB4:: @ 81DAFB4
+ if_random_less_than 50, AI_sub_81DAFBC
+ score -1
+
+AI_sub_81DAFBC:: @ 81DAFBC
+ end
+
+AI_sub_81DAFBD:: @ 81DAFBD
+ if_hp_more_than 1, 90, AI_sub_81DAFEA
+ if_hp_more_than 1, 70, AI_sub_81DAFE2
+ if_hp_more_than 1, 50, AI_sub_81DAFDA
+ if_random_less_than 100, AI_sub_81DAFDA
+ score -1
+
+AI_sub_81DAFDA:: @ 81DAFDA
+ if_random_less_than 100, AI_sub_81DAFE2
+ score -1
+
+AI_sub_81DAFE2:: @ 81DAFE2
+ if_random_less_than 100, AI_sub_81DAFEA
+ score -1
+
+AI_sub_81DAFEA:: @ 81DAFEA
+ if_would_go_first 1, AI_sub_81DB052
+ get_move 0
+ get_move_effect_from_result
+ if_equal 1, AI_sub_81DB022
+ if_equal 33, AI_sub_81DB022
+ if_equal 66, AI_sub_81DB022
+ if_equal 67, AI_sub_81DB022
+ if_equal -89, AI_sub_81DB022
+ if_equal 49, AI_sub_81DB031
+ if_equal 84, AI_sub_81DB040
+ jump AI_sub_81DB052
+
+AI_sub_81DB022:: @ 81DB022
+ if_not_status 0, 255, AI_sub_81DB04A
+ jump AI_sub_81DB052
+
+AI_sub_81DB031:: @ 81DB031
+ if_not_status2 0, 7, AI_sub_81DB04A
+ jump AI_sub_81DB052
+
+AI_sub_81DB040:: @ 81DB040
+ if_status3 0, 4, AI_sub_81DB052
+
+AI_sub_81DB04A:: @ 81DB04A
+ if_random_less_than 100, AI_sub_81DB052
+ score 1
+
+AI_sub_81DB052:: @ 81DB052
+ end
+
+AI_sub_81DB053:: @ 81DB053
+ if_damage_bonus 10, AI_sub_81DB078
+ if_damage_bonus 20, AI_sub_81DB078
+ if_would_go_first 1, AI_sub_81DB071
+ if_hp_more_than 1, 40, AI_sub_81DB078
+ jump AI_sub_81DB07A
+
+AI_sub_81DB071:: @ 81DB071
+ if_hp_less_than 1, 60, AI_sub_81DB07A
+
+AI_sub_81DB078:: @ 81DB078
+ score -1
+
+AI_sub_81DB07A:: @ 81DB07A
+ end
+
+AI_sub_81DB07B:: @ 81DB07B
+ if_would_go_first 1, AI_sub_81DB099
+ get_move 0
+ get_move_power_from_result
+ if_equal 0, AI_sub_81DB091
+ score 1
+ jump AI_sub_81DB099
+
+AI_sub_81DB091:: @ 81DB091
+ if_random_less_than 100, AI_sub_81DB099
+ score -1
+
+AI_sub_81DB099:: @ 81DB099
+ end
+
+AI_sub_81DB09A:: @ 81DB09A
+ if_status 0, 7, AI_sub_81DB12E
+ if_status2 0, 983040, AI_sub_81DB12E
+ if_status2 0, 7, AI_sub_81DB12E
+ if_hp_more_than 1, 30, AI_sub_81DB0C7
+ if_random_less_than 10, AI_sub_81DB0C7
+ score -1
+
+AI_sub_81DB0C7:: @ 81DB0C7
+ if_hp_more_than 1, 50, AI_sub_81DB0D6
+ if_random_less_than 100, AI_sub_81DB0D6
+ score -1
+
+AI_sub_81DB0D6:: @ 81DB0D6
+ get_move 0
+ get_move_power_from_result
+ if_equal 0, AI_sub_81DB105
+ if_not_taunted AI_sub_81DB0EC
+ if_random_less_than 100, AI_sub_81DB0EC
+ score 1
+
+AI_sub_81DB0EC:: @ 81DB0EC
+ get_move 0
+ get_move_type_from_result
+ if_not_in_bytes AI_bytes_81DB131, AI_sub_81DB12E
+ if_random_less_than 100, AI_sub_81DB130
+ score 1
+ jump AI_sub_81DB130
+
+AI_sub_81DB105:: @ 81DB105
+ if_not_taunted AI_sub_81DB112
+ if_random_less_than 100, AI_sub_81DB112
+ score 1
+
+AI_sub_81DB112:: @ 81DB112
+ get_type 0
+ if_in_bytes AI_bytes_81DB131, AI_sub_81DB130
+ get_type 2
+ if_in_bytes AI_bytes_81DB131, AI_sub_81DB130
+ if_random_less_than 50, AI_sub_81DB130
+
+AI_sub_81DB12E:: @ 81DB12E
+ score -1
+
+AI_sub_81DB130:: @ 81DB130
+ end
+
+AI_bytes_81DB131:: @ 81DB131
+ .byte 0
+ .byte 1
+ .byte 2
+ .byte 3
+ .byte 4
+ .byte 5
+ .byte 6
+ .byte 7
+ .byte 8
+ .byte 0xFF
+
+AI_sub_81DB13B:: @ 81DB13B
+ if_last_move_did_damage 0, 0, AI_sub_81DB154
+ if_would_go_first 1, AI_sub_81DB161
+ get_move 0
+ get_move_effect_from_result
+ if_not_in_bytes AI_bytes_81DB164, AI_sub_81DB161
+
+AI_sub_81DB154:: @ 81DB154
+ if_random_less_than 30, AI_sub_81DB163
+ score 3
+ jump AI_sub_81DB163
+
+AI_sub_81DB161:: @ 81DB161
+ score -2
+
+AI_sub_81DB163:: @ 81DB163
+ end
+
+AI_bytes_81DB164:: @ 81DB164
+ .byte 8
+ .byte 10
+ .byte 11
+ .byte 12
+ .byte 13
+ .byte 25
+ .byte 28
+ .byte 30
+ .byte 33
+ .byte 35
+ .byte 37
+ .byte 40
+ .byte 54
+ .byte 49
+ .byte 66
+ .byte 67
+ .byte 84
+ .byte 85
+ .byte 50
+ .byte 90
+ .byte 93
+ .byte 94
+ .byte 102
+ .byte 106
+ .byte 107
+ .byte 111
+ .byte 191
+ .byte 113
+ .byte 114
+ .byte 115
+ .byte 116
+ .byte 118
+ .byte 120
+ .byte 124
+ .byte 136
+ .byte 137
+ .byte 142
+ .byte 143
+ .byte 148
+ .byte 158
+ .byte 160
+ .byte 161
+ .byte 162
+ .byte 164
+ .byte 165
+ .byte 167
+ .byte 172
+ .byte 174
+ .byte 177
+ .byte 178
+ .byte 181
+ .byte 184
+ .byte 188
+ .byte 191
+ .byte 192
+ .byte 193
+ .byte 194
+ .byte 199
+ .byte 201
+ .byte 210
+ .byte 212
+ .byte 213
+ .byte 0xFF
+
+AI_sub_81DB1A3:: @ 81DB1A3
+ if_hp_less_than 0, 80, AI_sub_81DB1CC
+ if_would_go_first 1, AI_sub_81DB1BE
+ if_hp_more_than 1, 40, AI_sub_81DB1CC
+ score 1
+ jump AI_sub_81DB1CE
+
+AI_sub_81DB1BE:: @ 81DB1BE
+ if_hp_more_than 1, 60, AI_sub_81DB1CC
+ score 1
+ jump AI_sub_81DB1CE
+
+AI_sub_81DB1CC:: @ 81DB1CC
+ score -1
+
+AI_sub_81DB1CE:: @ 81DB1CE
+ end
+
+AI_sub_81DB1CF:: @ 81DB1CF
+ score 2
+ end
+
+AI_sub_81DB1D2:: @ 81DB1D2
+ if_random_less_than -128, AI_sub_81DB1DA
+ score 2
+
+AI_sub_81DB1DA:: @ 81DB1DA
+ end
+
+AI_sub_81DB1DB:: @ 81DB1DB
+ score 2
+ end
+
+AI_sub_81DB1DE:: @ 81DB1DE
+ score -1
+ if_would_go_first 1, AI_sub_81DB213
+ if_hp_more_than 1, 70, AI_sub_81DB213
+ if_random_less_than -128, AI_sub_81DB1F5
+ score 1
+
+AI_sub_81DB1F5:: @ 81DB1F5
+ if_hp_more_than 1, 50, AI_sub_81DB213
+ if_random_less_than -128, AI_sub_81DB204
+ score 1
+
+AI_sub_81DB204:: @ 81DB204
+ if_hp_more_than 1, 30, AI_sub_81DB213
+ if_random_less_than 100, AI_sub_81DB213
+ score 2
+
+AI_sub_81DB213:: @ 81DB213
+ end
+
+AI_sub_81DB214:: @ 81DB214
+ if_would_go_first 1, AI_sub_81DB234
+ if_hp_more_than 1, 33, AI_sub_81DB256
+ if_hp_more_than 1, 20, AI_sub_81DB258
+ if_hp_less_than 1, 8, AI_sub_81DB247
+ jump AI_sub_81DB249
+
+AI_sub_81DB234:: @ 81DB234
+ if_hp_more_than 1, 60, AI_sub_81DB256
+ if_hp_more_than 1, 40, AI_sub_81DB258
+ jump AI_sub_81DB249
+
+AI_sub_81DB247:: @ 81DB247
+ score 1
+
+AI_sub_81DB249:: @ 81DB249
+ if_random_less_than 100, AI_sub_81DB258
+ score 1
+ jump AI_sub_81DB258
+
+AI_sub_81DB256:: @ 81DB256
+ score -1
+
+AI_sub_81DB258:: @ 81DB258
+ end
+
+AI_sub_81DB259:: @ 81DB259
+ if_status 0, 255, AI_sub_81DB26F
+ if_status_in_party 0, 255, AI_sub_81DB26F
+ score -5
+
+AI_sub_81DB26F:: @ 81DB26F
+ end
+
+AI_sub_81DB270:: @ 81DB270
+ get_hold_effect 0
+ if_not_in_bytes AI_bytes_81DB28B, AI_sub_81DB288
+ if_random_less_than 50, AI_sub_81DB28A
+ score 1
+ jump AI_sub_81DB28A
+
+AI_sub_81DB288:: @ 81DB288
+ score -2
+
+AI_sub_81DB28A:: @ 81DB28A
+ end
+
+AI_bytes_81DB28B:: @ 81DB28B
+ .byte 3
+ .byte 9
+ .byte 1
+ .byte 22
+ .byte 43
+ .byte 45
+ .byte 65
+ .byte 0xFF
+
+AI_sub_81DB293:: @ 81DB293
+ get_type 1
+ if_equal 7, AI_sub_81DB2D8
+ get_type 3
+ if_equal 7, AI_sub_81DB2D8
+ if_stat_level_more_than 1, 2, 9, AI_sub_81DB2E1
+ if_random_less_than -128, AI_sub_81DB2B3
+ score 1
+
+AI_sub_81DB2B3:: @ 81DB2B3
+ if_stat_level_more_than 1, 2, 7, AI_sub_81DB2E1
+ if_random_less_than -128, AI_sub_81DB2C3
+ score 1
+
+AI_sub_81DB2C3:: @ 81DB2C3
+ if_stat_level_more_than 1, 2, 6, AI_sub_81DB2E1
+ if_random_less_than -128, AI_sub_81DB2E1
+ score 1
+ jump AI_sub_81DB2E1
+
+AI_sub_81DB2D8:: @ 81DB2D8
+ if_hp_more_than 1, 80, AI_sub_81DB2E1
+ score -1
+
+AI_sub_81DB2E1:: @ 81DB2E1
+ end
+
+AI_sub_81DB2E2:: @ 81DB2E2
+ get_protect_count 1
+ if_more_than 1, AI_sub_81DB3A0
+ if_status 1, 128, AI_sub_81DB397
+ if_status2 1, 268435456, AI_sub_81DB397
+ if_status3 1, 32, AI_sub_81DB397
+ if_status2 1, 983040, AI_sub_81DB397
+ if_status3 1, 4, AI_sub_81DB397
+ if_status3 1, 6144, AI_sub_81DB397
+ if_move_effect 0, 32, AI_sub_81DB397
+ if_move_effect 0, -100, AI_sub_81DB397
+ if_status 0, 128, AI_sub_81DB37E
+ if_status2 0, 268435456, AI_sub_81DB37E
+ if_status3 0, 32, AI_sub_81DB37E
+ if_status2 0, 983040, AI_sub_81DB37E
+ if_status3 0, 4, AI_sub_81DB37E
+ if_status3 0, 6144, AI_sub_81DB37E
+ get_move 0
+ get_move_effect_from_result
+ if_not_equal 94, AI_sub_81DB37E
+ jump AI_sub_81DB380
+
+AI_sub_81DB37E:: @ 81DB37E
+ score 2
+
+AI_sub_81DB380:: @ 81DB380
+ get_protect_count 1
+ if_equal 0, AI_sub_81DB3A2
+ score -1
+ if_random_less_than -128, AI_sub_81DB3A2
+ score -1
+ jump AI_sub_81DB3A2
+
+AI_sub_81DB397:: @ 81DB397
+ get_move 0
+ get_move_effect_from_result
+ if_not_equal 94, AI_sub_81DB3A2
+
+AI_sub_81DB3A0:: @ 81DB3A0
+ score -2
+
+AI_sub_81DB3A2:: @ 81DB3A2
+ end
+
+AI_sub_81DB3A3:: @ 81DB3A3
+ get_type 1
+ if_equal 7, AI_sub_81DB3C2
+ get_type 3
+ if_equal 7, AI_sub_81DB3C2
+ if_stat_level_more_than 1, 7, 8, AI_sub_81DB3C8
+ score -2
+ jump AI_sub_81DB3D0
+
+AI_sub_81DB3C2:: @ 81DB3C2
+ if_random_less_than 80, AI_sub_81DB3D0
+
+AI_sub_81DB3C8:: @ 81DB3C8
+ if_random_less_than 80, AI_sub_81DB3D0
+ score 2
+
+AI_sub_81DB3D0:: @ 81DB3D0
+ end
+
+AI_sub_81DB3D1:: @ 81DB3D1
+ if_hp_less_than 1, 4, AI_sub_81DB3DF
+ if_hp_less_than 1, 35, AI_sub_81DB3E6
+
+AI_sub_81DB3DF:: @ 81DB3DF
+ score -1
+ jump AI_sub_81DB3EE
+
+AI_sub_81DB3E6:: @ 81DB3E6
+ if_random_less_than 70, AI_sub_81DB3EE
+ score 1
+
+AI_sub_81DB3EE:: @ 81DB3EE
+ end
+
+AI_sub_81DB3EF:: @ 81DB3EF
+ if_stat_level_more_than 1, 1, 8, AI_sub_81DB41C
+ if_stat_level_more_than 1, 2, 8, AI_sub_81DB41C
+ if_stat_level_more_than 1, 4, 8, AI_sub_81DB41C
+ if_stat_level_more_than 1, 5, 8, AI_sub_81DB41C
+ if_stat_level_more_than 1, 7, 8, AI_sub_81DB41C
+ jump AI_sub_81DB442
+
+AI_sub_81DB41C:: @ 81DB41C
+ if_would_go_first 1, AI_sub_81DB42E
+ if_hp_more_than 1, 60, AI_sub_81DB48A
+ jump AI_sub_81DB435
+
+AI_sub_81DB42E:: @ 81DB42E
+ if_hp_more_than 1, 70, AI_sub_81DB48A
+
+AI_sub_81DB435:: @ 81DB435
+ if_random_less_than 80, AI_sub_81DB48A
+ score 2
+ jump AI_sub_81DB48A
+
+AI_sub_81DB442:: @ 81DB442
+ if_stat_level_more_than 1, 1, 7, AI_sub_81DB46F
+ if_stat_level_more_than 1, 2, 7, AI_sub_81DB46F
+ if_stat_level_more_than 1, 4, 7, AI_sub_81DB46F
+ if_stat_level_more_than 1, 5, 7, AI_sub_81DB46F
+ if_stat_level_more_than 1, 7, 7, AI_sub_81DB46F
+ jump AI_sub_81DB488
+
+AI_sub_81DB46F:: @ 81DB46F
+ if_would_go_first 1, AI_sub_81DB481
+ if_hp_more_than 1, 60, AI_sub_81DB488
+ jump AI_sub_81DB48A
+
+AI_sub_81DB481:: @ 81DB481
+ if_hp_less_than 1, 70, AI_sub_81DB48A
+
+AI_sub_81DB488:: @ 81DB488
+ score -2
+
+AI_sub_81DB48A:: @ 81DB48A
+ end
+
+AI_sub_81DB48B:: @ 81DB48B
+ is_first_turn 1
+ if_not_equal 0, AI_sub_81DB4C0
+ get_type 0
+ if_equal 7, AI_sub_81DB4B8
+ get_type 0
+ if_equal 14, AI_sub_81DB4B8
+ get_type 2
+ if_equal 7, AI_sub_81DB4B8
+ get_type 2
+ if_equal 14, AI_sub_81DB4B8
+ jump AI_sub_81DB4C0
+
+AI_sub_81DB4B8:: @ 81DB4B8
+ if_random_less_than -128, AI_sub_81DB4C0
+ score 1
+
+AI_sub_81DB4C0:: @ 81DB4C0
+ end
+
+AI_sub_81DB4C1:: @ 81DB4C1
+ if_would_go_first 0, AI_sub_81DB4CF
+ get_ability 1
+ if_equal 33, AI_sub_81DB4F6
+
+AI_sub_81DB4CF:: @ 81DB4CF
+ if_hp_less_than 1, 40, AI_sub_81DB4FD
+ get_weather
+ if_equal 3, AI_sub_81DB4F6
+ if_equal 0, AI_sub_81DB4F6
+ if_equal 2, AI_sub_81DB4F6
+ get_ability 1
+ if_equal 44, AI_sub_81DB4F6
+ jump AI_sub_81DB4FF
+
+AI_sub_81DB4F6:: @ 81DB4F6
+ score 1
+ jump AI_sub_81DB4FF
+
+AI_sub_81DB4FD:: @ 81DB4FD
+ score -1
+
+AI_sub_81DB4FF:: @ 81DB4FF
+ end
+
+AI_sub_81DB500:: @ 81DB500
+ if_hp_less_than 1, 40, AI_sub_81DB526
+ get_weather
+ if_equal 3, AI_sub_81DB51F
+ if_equal 1, AI_sub_81DB51F
+ if_equal 2, AI_sub_81DB51F
+ jump AI_sub_81DB528
+
+AI_sub_81DB51F:: @ 81DB51F
+ score 1
+ jump AI_sub_81DB528
+
+AI_sub_81DB526:: @ 81DB526
+ score -1
+
+AI_sub_81DB528:: @ 81DB528
+ end
+
+AI_sub_81DB529:: @ 81DB529
+ if_hp_less_than 1, 90, AI_sub_81DB535
+ jump AI_sub_81DB537
+
+AI_sub_81DB535:: @ 81DB535
+ score -2
+
+AI_sub_81DB537:: @ 81DB537
+ end
+
+AI_sub_81DB538:: @ 81DB538
+ if_stat_level_more_than 0, 1, 8, AI_sub_81DB565
+ if_stat_level_more_than 0, 2, 8, AI_sub_81DB565
+ if_stat_level_more_than 0, 4, 8, AI_sub_81DB565
+ if_stat_level_more_than 0, 5, 8, AI_sub_81DB565
+ if_stat_level_more_than 0, 7, 8, AI_sub_81DB565
+ jump AI_sub_81DB5A2
+
+AI_sub_81DB565:: @ 81DB565
+ if_stat_level_less_than 1, 1, 7, AI_sub_81DB59A
+ if_stat_level_less_than 1, 2, 7, AI_sub_81DB59A
+ if_stat_level_less_than 1, 4, 7, AI_sub_81DB59A
+ if_stat_level_less_than 1, 5, 7, AI_sub_81DB59A
+ if_stat_level_less_than 1, 7, 7, AI_sub_81DB598
+ if_random_less_than 50, AI_sub_81DB5A4
+ jump AI_sub_81DB5A2
+
+AI_sub_81DB598:: @ 81DB598
+ score 1
+
+AI_sub_81DB59A:: @ 81DB59A
+ if_random_less_than -128, AI_sub_81DB5A4
+ score 1
+
+AI_sub_81DB5A2:: @ 81DB5A2
+ score -2
+
+AI_sub_81DB5A4:: @ 81DB5A4
+ end
+
+AI_sub_81DB5A5:: @ 81DB5A5
+ if_status 0, 7, AI_sub_81DB639
+ if_status2 0, 983040, AI_sub_81DB639
+ if_status2 0, 7, AI_sub_81DB639
+ if_hp_more_than 1, 30, AI_sub_81DB5D2
+ if_random_less_than 10, AI_sub_81DB5D2
+ score -1
+
+AI_sub_81DB5D2:: @ 81DB5D2
+ if_hp_more_than 1, 50, AI_sub_81DB5E1
+ if_random_less_than 100, AI_sub_81DB5E1
+ score -1
+
+AI_sub_81DB5E1:: @ 81DB5E1
+ get_move 0
+ get_move_power_from_result
+ if_equal 0, AI_sub_81DB610
+ if_not_taunted AI_sub_81DB5F7
+ if_random_less_than 100, AI_sub_81DB5F7
+ score 1
+
+AI_sub_81DB5F7:: @ 81DB5F7
+ get_move 0
+ get_move_type_from_result
+ if_not_in_bytes AI_bytes_81DB63C, AI_sub_81DB639
+ if_random_less_than 100, AI_sub_81DB63B
+ score 1
+ jump AI_sub_81DB63B
+
+AI_sub_81DB610:: @ 81DB610
+ if_not_taunted AI_sub_81DB61D
+ if_random_less_than 100, AI_sub_81DB61D
+ score 1
+
+AI_sub_81DB61D:: @ 81DB61D
+ get_type 0
+ if_in_bytes AI_bytes_81DB63C, AI_sub_81DB63B
+ get_type 2
+ if_in_bytes AI_bytes_81DB63C, AI_sub_81DB63B
+ if_random_less_than 50, AI_sub_81DB63B
+
+AI_sub_81DB639:: @ 81DB639
+ score -1
+
+AI_sub_81DB63B:: @ 81DB63B
+ end
+
+AI_bytes_81DB63C:: @ 81DB63C
+ .byte 10
+ .byte 11
+ .byte 12
+ .byte 13
+ .byte 14
+ .byte 15
+ .byte 16
+ .byte 17
+ .byte 0xFF
+
+AI_sub_81DB645:: @ 81DB645
+ if_damage_bonus 10, AI_sub_81DB666
+ if_damage_bonus 20, AI_sub_81DB666
+ if_move_effect 0, 111, AI_sub_81DB666
+ if_hp_more_than 1, 38, AI_sub_81DB668
+ score -1
+ jump AI_sub_81DB668
+
+AI_sub_81DB666:: @ 81DB666
+ score -2
+
+AI_sub_81DB668:: @ 81DB668
+ end
+
+AI_sub_81DB669:: @ 81DB669
+ if_not_move_effect 0, 111, AI_sub_81DB677
+ score -1
+ jump AI_sub_81DB6EE
+
+AI_sub_81DB677:: @ 81DB677
+ if_status 0, 128, AI_sub_81DB6E6
+ if_status2 0, 268435456, AI_sub_81DB6E6
+ if_status3 0, 4, AI_sub_81DB6E6
+ get_weather
+ if_equal 3, AI_sub_81DB6A7
+ if_equal 2, AI_sub_81DB6C2
+ jump AI_sub_81DB6D2
+
+AI_sub_81DB6A7:: @ 81DB6A7
+ get_type 1
+ if_in_bytes AI_bytes_81DB6EF, AI_sub_81DB6E6
+ get_type 3
+ if_in_bytes AI_bytes_81DB6EF, AI_sub_81DB6E6
+ jump AI_sub_81DB6D2
+
+AI_sub_81DB6C2:: @ 81DB6C2
+ get_type 1
+ if_equal 15, AI_sub_81DB6E6
+ get_type 3
+ if_equal 15, AI_sub_81DB6E6
+
+AI_sub_81DB6D2:: @ 81DB6D2
+ if_would_go_first 1, AI_sub_81DB6EE
+ get_move 0
+ get_move_effect_from_result
+ if_not_equal 94, AI_sub_81DB6E6
+ jump AI_sub_81DB6EE
+
+AI_sub_81DB6E6:: @ 81DB6E6
+ if_random_less_than 80, AI_sub_81DB6EE
+ score 1
+
+AI_sub_81DB6EE:: @ 81DB6EE
+ end
+
+AI_bytes_81DB6EF:: @ 81DB6EF
+ .byte 4
+ .byte 5
+ .byte 8
+ .byte 0xFF
+
+AI_sub_81DB6F3:: @ 81DB6F3
+ score 2
+ end
+
+AI_sub_81DB6F6:: @ 81DB6F6
+ get_stockpile_count 1
+ if_less_than 2, AI_sub_81DB706
+ if_random_less_than 80, AI_sub_81DB706
+ score 2
+
+AI_sub_81DB706:: @ 81DB706
+ end
+
+AI_sub_81DB707:: @ 81DB707
+ if_hp_less_than 1, 40, AI_sub_81DB72D
+ get_weather
+ if_equal 0, AI_sub_81DB726
+ if_equal 1, AI_sub_81DB726
+ if_equal 2, AI_sub_81DB726
+ jump AI_sub_81DB72F
+
+AI_sub_81DB726:: @ 81DB726
+ score 1
+ jump AI_sub_81DB72F
+
+AI_sub_81DB72D:: @ 81DB72D
+ score -1
+
+AI_sub_81DB72F:: @ 81DB72F
+ end
+
+AI_sub_81DB730:: @ 81DB730
+ if_not_status 0, 216, AI_sub_81DB73C
+ score 1
+
+AI_sub_81DB73C:: @ 81DB73C
+ end
+
+AI_sub_81DB73D:: @ 81DB73D
+ if_damage_bonus 10, AI_sub_81DB77C
+ if_damage_bonus 20, AI_sub_81DB77C
+ if_status 0, 7, AI_sub_81DB789
+ if_status2 0, 983040, AI_sub_81DB783
+ if_status2 0, 7, AI_sub_81DB783
+ is_first_turn 1
+ if_not_equal 0, AI_sub_81DB78B
+ if_random_less_than 100, AI_sub_81DB78B
+ score 1
+ jump AI_sub_81DB78B
+
+AI_sub_81DB77C:: @ 81DB77C
+ score -1
+ jump AI_sub_81DB78B
+
+AI_sub_81DB783:: @ 81DB783
+ if_random_less_than 100, AI_sub_81DB78B
+
+AI_sub_81DB789:: @ 81DB789
+ score 1
+
+AI_sub_81DB78B:: @ 81DB78B
+ end
+
+AI_sub_81DB78C:: @ 81DB78C
+ if_status 0, 64, AI_sub_81DB79B
+ jump AI_sub_81DB79D
+
+AI_sub_81DB79B:: @ 81DB79B
+ score 1
+
+AI_sub_81DB79D:: @ 81DB79D
+ end
+
+AI_sub_81DB79E:: @ 81DB79E
+ get_hold_effect 1
+ if_in_bytes AI_bytes_81DB7E7, AI_sub_81DB7B9
+ if_in_bytes AI_bytes_81DB7DF, AI_sub_81DB7CB
+
+AI_sub_81DB7B2:: @ 81DB7B2
+ score -3
+ jump AI_sub_81DB7DE
+
+AI_sub_81DB7B9:: @ 81DB7B9
+ get_hold_effect 0
+ if_in_bytes AI_bytes_81DB7E7, AI_sub_81DB7B2
+ score 5
+ jump AI_sub_81DB7DE
+
+AI_sub_81DB7CB:: @ 81DB7CB
+ get_hold_effect 0
+ if_in_bytes AI_bytes_81DB7DF, AI_sub_81DB7B2
+ if_random_less_than 50, AI_sub_81DB7DE
+ score 2
+
+AI_sub_81DB7DE:: @ 81DB7DE
+ end
+
+AI_bytes_81DB7DF:: @ 81DB7DF
+ .byte 10
+ .byte 11
+ .byte 12
+ .byte 13
+ .byte 14
+ .byte 24
+ .byte 29
+ .byte 0xFF
+
+AI_bytes_81DB7E7:: @ 81DB7E7
+ .byte 29
+ .byte 0xFF
+
+AI_sub_81DB7E9:: @ 81DB7E9
+ get_ability 1
+ if_in_bytes AI_bytes_81DB80F, AI_sub_81DB7FF
+ get_ability 0
+ if_in_bytes AI_bytes_81DB80F, AI_sub_81DB806
+
+AI_sub_81DB7FF:: @ 81DB7FF
+ score -1
+ jump AI_sub_81DB80E
+
+AI_sub_81DB806:: @ 81DB806
+ if_random_less_than 50, AI_sub_81DB80E
+ score 2
+
+AI_sub_81DB80E:: @ 81DB80E
+ end
+
+AI_bytes_81DB80F:: @ 81DB80F
+ .byte 3
+ .byte 4
+ .byte 8
+ .byte 9
+ .byte 18
+ .byte 25
+ .byte 27
+ .byte 33
+ .byte 37
+ .byte 44
+ .byte 56
+ .byte 61
+ .byte 63
+ .byte 74
+ .byte 34
+ .byte 19
+ .byte 0xFF
+
+AI_sub_81DB820:: @ 81DB820
+ if_damage_bonus 10, AI_sub_81DB84D
+ if_damage_bonus 20, AI_sub_81DB84D
+ if_stat_level_less_than 1, 1, 6, AI_sub_81DB84D
+ if_would_go_first 1, AI_sub_81DB846
+ if_hp_more_than 1, 40, AI_sub_81DB84D
+ jump AI_sub_81DB84F
+
+AI_sub_81DB846:: @ 81DB846
+ if_hp_less_than 1, 60, AI_sub_81DB84F
+
+AI_sub_81DB84D:: @ 81DB84D
+ score -1
+
+AI_sub_81DB84F:: @ 81DB84F
+ end
+
+AI_sub_81DB850:: @ 81DB850
+ if_hp_more_than 0, 30, AI_sub_81DB85F
+ if_random_less_than 100, AI_sub_81DB85F
+ score -1
+
+AI_sub_81DB85F:: @ 81DB85F
+ is_first_turn 1
+ if_equal 0, AI_sub_81DB87A
+ if_random_less_than -106, AI_sub_81DB882
+ score 1
+ jump AI_sub_81DB882
+ if_random_less_than 50, AI_sub_81DB882
+
+AI_sub_81DB87A:: @ 81DB87A
+ if_random_less_than 30, AI_sub_81DB882
+ score -1
+
+AI_sub_81DB882:: @ 81DB882
+ end
+
+AI_sub_81DB883:: @ 81DB883
+ get_item 1
+ if_not_in_bytes AI_bytes_81DB89E, AI_sub_81DB89B
+ if_random_less_than 50, AI_sub_81DB89D
+ score 1
+ jump AI_sub_81DB89D
+
+AI_sub_81DB89B:: @ 81DB89B
+ score -2
+
+AI_sub_81DB89D:: @ 81DB89D
+ end
+
+AI_bytes_81DB89E:: @ 81DB89E
+ .byte 134
+ .byte 141
+ .byte 174
+ .byte 0xFF
+
+AI_sub_81DB8A2:: @ 81DB8A2
+ if_status 0, 7, AI_sub_81DB8CD
+ if_status2 0, 983040, AI_sub_81DB8CD
+ if_status2 0, 7, AI_sub_81DB8CD
+ if_random_less_than -76, AI_sub_81DB8CD
+ score 2
+ jump AI_sub_81DB8CF
+
+AI_sub_81DB8CD:: @ 81DB8CD
+ score -2
+
+AI_sub_81DB8CF:: @ 81DB8CF
+ end
+
+AI_sub_81DB8D0:: @ 81DB8D0
+ if_status4 0, 1, AI_sub_81DB8DF
+ jump AI_sub_81DB8E1
+
+AI_sub_81DB8DF:: @ 81DB8DF
+ score 1
+
+AI_sub_81DB8E1:: @ 81DB8E1
+ end
+
+AI_sub_81DB8E2:: @ 81DB8E2
+ if_hp_less_than 0, 30, AI_sub_81DB8F9
+ is_first_turn 1
+ if_more_than 0, AI_sub_81DB8F9
+ if_random_less_than -76, AI_sub_81DB8F9
+ score 1
+
+AI_sub_81DB8F9:: @ 81DB8F9
+ end
+
+AI_sub_81DB8FA:: @ 81DB8FA
+ if_hp_less_than 0, 70, AI_sub_81DB923
+ if_would_go_first 1, AI_sub_81DB915
+ if_hp_more_than 1, 40, AI_sub_81DB923
+ score 1
+ jump AI_sub_81DB925
+
+AI_sub_81DB915:: @ 81DB915
+ if_hp_more_than 1, 50, AI_sub_81DB923
+ score 1
+ jump AI_sub_81DB925
+
+AI_sub_81DB923:: @ 81DB923
+ score -1
+
+AI_sub_81DB925:: @ 81DB925
+ end
+
+AI_sub_81DB926:: @ 81DB926
+ if_damage_bonus 10, AI_sub_81DB94B
+ if_damage_bonus 20, AI_sub_81DB94B
+ if_would_go_first 1, AI_sub_81DB944
+ if_hp_more_than 0, 50, AI_sub_81DB94D
+ jump AI_sub_81DB94B
+
+AI_sub_81DB944:: @ 81DB944
+ if_hp_more_than 0, 70, AI_sub_81DB94D
+
+AI_sub_81DB94B:: @ 81DB94B
+ score -1
+
+AI_sub_81DB94D:: @ 81DB94D
+ end
+
+AI_sub_81DB94E:: @ 81DB94E
+ is_first_turn 1
+ if_more_than 0, AI_sub_81DB95E
+ if_random_less_than 100, AI_sub_81DB95E
+ score 2
+
+AI_sub_81DB95E:: @ 81DB95E
+ end
+
+AI_sub_81DB95F:: @ 81DB95F
+ if_hp_less_than 0, 50, AI_sub_81DB96B
+ jump AI_sub_81DB96D
+
+AI_sub_81DB96B:: @ 81DB96B
+ score -1
+
+AI_sub_81DB96D:: @ 81DB96D
+ end
+
+AI_sub_81DB96E:: @ 81DB96E
+ is_first_turn 1
+ if_equal 1, AI_sub_81DB9B5
+ if_random_less_than 30, AI_sub_81DB9D7
+ if_would_go_first 1, AI_sub_81DB99B
+ if_hp_not_equal 1, 100, AI_sub_81DB9CF
+ if_hp_less_than 0, 70, AI_sub_81DB9CF
+ if_random_less_than 60, AI_sub_81DB9D7
+ jump AI_sub_81DB9CF
+
+AI_sub_81DB99B:: @ 81DB99B
+ if_hp_more_than 0, 25, AI_sub_81DB9CF
+ if_move_effect 0, 32, AI_sub_81DB9B5
+ if_move_effect 0, -100, AI_sub_81DB9B5
+ jump AI_sub_81DB9C2
+
+AI_sub_81DB9B5:: @ 81DB9B5
+ if_random_less_than -106, AI_sub_81DB9D7
+ score 2
+ jump AI_sub_81DB9D7
+
+AI_sub_81DB9C2:: @ 81DB9C2
+ if_random_less_than -26, AI_sub_81DB9CF
+ score 1
+ jump AI_sub_81DB9D7
+
+AI_sub_81DB9CF:: @ 81DB9CF
+ if_random_less_than 30, AI_sub_81DB9D7
+ score -2
+
+AI_sub_81DB9D7:: @ 81DB9D7
+ end
+
+AI_sub_81DB9D8:: @ 81DB9D8
+ if_hp_less_than 1, 50, AI_sub_81DB9FB
+ get_type 0
+ if_equal 13, AI_sub_81DB9F4
+ get_type 2
+ if_equal 13, AI_sub_81DB9F4
+ jump AI_sub_81DB9FB
+
+AI_sub_81DB9F4:: @ 81DB9F4
+ score 1
+ jump AI_sub_81DB9FD
+
+AI_sub_81DB9FB:: @ 81DB9FB
+ score -1
+
+AI_sub_81DB9FD:: @ 81DB9FD
+ end
+
+AI_sub_81DB9FE:: @ 81DB9FE
+ if_damage_bonus 10, AI_sub_81DBA23
+ if_damage_bonus 20, AI_sub_81DBA23
+ if_would_go_first 1, AI_sub_81DBA1C
+ if_hp_more_than 1, 60, AI_sub_81DBA25
+ jump AI_sub_81DBA23
+
+AI_sub_81DBA1C:: @ 81DBA1C
+ if_hp_more_than 1, 80, AI_sub_81DBA25
+
+AI_sub_81DBA23:: @ 81DBA23
+ score -1
+
+AI_sub_81DBA25:: @ 81DBA25
+ end
+
+AI_sub_81DBA26:: @ 81DBA26
+ if_hp_less_than 1, 50, AI_sub_81DBA49
+ get_type 0
+ if_equal 10, AI_sub_81DBA42
+ get_type 2
+ if_equal 10, AI_sub_81DBA42
+ jump AI_sub_81DBA49
+
+AI_sub_81DBA42:: @ 81DBA42
+ score 1
+ jump AI_sub_81DBA4B
+
+AI_sub_81DBA49:: @ 81DBA49
+ score -1
+
+AI_sub_81DBA4B:: @ 81DBA4B
+ end
+
+AI_sub_81DBA4C:: @ 81DBA4C
+ if_would_go_first 1, AI_sub_81DBA66
+ if_hp_more_than 1, 50, AI_sub_81DBA6E
+ if_random_less_than 70, AI_sub_81DBA6E
+ score -1
+ jump AI_sub_81DBA6E
+
+AI_sub_81DBA66:: @ 81DBA66
+ if_random_less_than -128, AI_sub_81DBA6E
+ score 1
+
+AI_sub_81DBA6E:: @ 81DBA6E
+ end
+
+AI_CheckViability:: @ 81DBA6F
+ if_can_faint AI_sub_81DBA7C
+ is_most_powerful_move
+ if_equal 1, AI_sub_81DA424
+ end
+
+AI_sub_81DBA7C:: @ 81DBA7C
+ if_effect 7, AI_sub_81DBA8C
+ if_not_effect 103, AI_sub_81DBA8A
+ score 2
+
+AI_sub_81DBA8A:: @ 81DBA8A
+ score 4
+
+AI_sub_81DBA8C:: @ 81DBA8C
+ end
+
+AI_SetupFirstTurn:: @ 81DBA8D
+ get_turn_count
+ if_not_equal 0, AI_sub_81DBAA6
+ get_effect
+ if_not_in_bytes AI_bytes_81DBAA7, AI_sub_81DBAA6
+ if_random_less_than 80, AI_sub_81DBAA6
+ score 2
+
+AI_sub_81DBAA6:: @ 81DBAA6
+ end
+
+AI_bytes_81DBAA7:: @ 81DBAA7
+ .byte 10
+ .byte 11
+ .byte 12
+ .byte 13
+ .byte 14
+ .byte 15
+ .byte 16
+ .byte 18
+ .byte 19
+ .byte 20
+ .byte 21
+ .byte 22
+ .byte 23
+ .byte 24
+ .byte 30
+ .byte 35
+ .byte 54
+ .byte 47
+ .byte 49
+ .byte 50
+ .byte 51
+ .byte 52
+ .byte 53
+ .byte 54
+ .byte 55
+ .byte 56
+ .byte 58
+ .byte 59
+ .byte 60
+ .byte 61
+ .byte 62
+ .byte 63
+ .byte 64
+ .byte 65
+ .byte 66
+ .byte 67
+ .byte 79
+ .byte 84
+ .byte 108
+ .byte 109
+ .byte 118
+ .byte 213
+ .byte 187
+ .byte 156
+ .byte 165
+ .byte 166
+ .byte 167
+ .byte 181
+ .byte 192
+ .byte 199
+ .byte 205
+ .byte 206
+ .byte 208
+ .byte 211
+ .byte 213
+ .byte 0xFF
+
+AI_PreferStrongestMove:: @ 81DBADF
+ is_most_powerful_move
+ if_not_equal 0, AI_sub_81DBAEE
+ if_random_less_than 100, AI_sub_81DBAEE
+ score 2
+
+AI_sub_81DBAEE:: @ 81DBAEE
+ end
+
+AI_Risky:: @ 81DBAEF
+ get_effect
+ if_not_in_bytes AI_bytes_81DBB02, AI_sub_81DBB01
+ if_random_less_than -128, AI_sub_81DBB01
+ score 2
+
+AI_sub_81DBB01:: @ 81DBB01
+ end
+
+AI_bytes_81DBB02:: @ 81DBB02
+ .byte 1
+ .byte 7
+ .byte 9
+ .byte 38
+ .byte 43
+ .byte 49
+ .byte 83
+ .byte 88
+ .byte 89
+ .byte 98
+ .byte 118
+ .byte 120
+ .byte 122
+ .byte 140
+ .byte 142
+ .byte 144
+ .byte 170
+ .byte 185
+ .byte 199
+ .byte 0xFF
+
+AI_PreferBatonPass:: @ 81DBB16
+ count_alive_pokemon 1
+ if_equal 0, AI_sub_81DBB3A
+ is_most_powerful_move
+ if_not_equal 0, AI_sub_81DBB3A
+ if_move_effect 1, 127, AI_sub_81DBB32
+ if_random_less_than 80, AI_sub_81DBB01
+
+AI_sub_81DBB32:: @ 81DBB32
+ if_random_less_than 20, AI_sub_81DBB01
+ score 3
+
+AI_sub_81DBB3A:: @ 81DBB3A
+ end
+
+AI_DoubleBattle:: @ 81DBB3B
+ end
+
+AI_HPAware:: @ 81DBB3C
+ if_hp_more_than 1, 70, AI_sub_81DBB59
+ if_hp_more_than 1, 30, AI_sub_81DBB68
+ get_effect
+ if_in_bytes AI_bytes_81DBBFC, AI_sub_81DBB77
+ jump AI_sub_81DBB7F
+
+AI_sub_81DBB59:: @ 81DBB59
+ get_effect
+ if_in_bytes AI_bytes_81DBBC3, AI_sub_81DBB77
+ jump AI_sub_81DBB7F
+
+AI_sub_81DBB68:: @ 81DBB68
+ get_effect
+ if_in_bytes AI_bytes_81DBBD1, AI_sub_81DBB77
+ jump AI_sub_81DBB7F
+
+AI_sub_81DBB77:: @ 81DBB77
+ if_random_less_than 50, AI_sub_81DBB7F
+ score -2
+
+AI_sub_81DBB7F:: @ 81DBB7F
+ if_hp_more_than 0, 70, AI_sub_81DBB9C
+ if_hp_more_than 0, 30, AI_sub_81DBBAB
+ get_effect
+ if_in_bytes AI_bytes_81DBC55, AI_sub_81DBBBA
+ jump AI_sub_81DBBC2
+
+AI_sub_81DBB9C:: @ 81DBB9C
+ get_effect
+ if_in_bytes AI_bytes_81DBC2C, AI_sub_81DBBBA
+ jump AI_sub_81DBBC2
+
+AI_sub_81DBBAB:: @ 81DBBAB
+ get_effect
+ if_in_bytes AI_bytes_81DBC2D, AI_sub_81DBBBA
+ jump AI_sub_81DBBC2
+
+AI_sub_81DBBBA:: @ 81DBBBA
+ if_random_less_than 50, AI_sub_81DBBC2
+ score -2
+
+AI_sub_81DBBC2:: @ 81DBBC2
+ end
+
+AI_bytes_81DBBC3:: @ 81DBBC3
+ .byte 7
+ .byte 32
+ .byte 37
+ .byte 98
+ .byte 99
+ .byte 116
+ .byte 132
+ .byte 133
+ .byte 134
+ .byte 157
+ .byte 168
+ .byte 194
+ .byte 204
+ .byte 0xFF
+
+AI_bytes_81DBBD1:: @ 81DBBD1
+ .byte 7
+ .byte 10
+ .byte 11
+ .byte 12
+ .byte 13
+ .byte 14
+ .byte 15
+ .byte 16
+ .byte 18
+ .byte 19
+ .byte 20
+ .byte 21
+ .byte 22
+ .byte 23
+ .byte 24
+ .byte 26
+ .byte 30
+ .byte 35
+ .byte 46
+ .byte 47
+ .byte 50
+ .byte 51
+ .byte 52
+ .byte 53
+ .byte 54
+ .byte 55
+ .byte 56
+ .byte 58
+ .byte 59
+ .byte 60
+ .byte 61
+ .byte 62
+ .byte 63
+ .byte 64
+ .byte 93
+ .byte 124
+ .byte 142
+ .byte 205
+ .byte 206
+ .byte 208
+ .byte 211
+ .byte 212
+ .byte 0xFF
+
+AI_bytes_81DBBFC:: @ 81DBBFC
+ .byte 10
+ .byte 11
+ .byte 12
+ .byte 13
+ .byte 14
+ .byte 15
+ .byte 16
+ .byte 18
+ .byte 19
+ .byte 20
+ .byte 21
+ .byte 22
+ .byte 23
+ .byte 24
+ .byte 26
+ .byte 30
+ .byte 35
+ .byte 46
+ .byte 47
+ .byte 50
+ .byte 51
+ .byte 52
+ .byte 53
+ .byte 54
+ .byte 55
+ .byte 56
+ .byte 58
+ .byte 59
+ .byte 60
+ .byte 61
+ .byte 62
+ .byte 63
+ .byte 64
+ .byte 81
+ .byte 93
+ .byte 94
+ .byte 124
+ .byte 142
+ .byte 143
+ .byte 144
+ .byte 151
+ .byte 190
+ .byte 205
+ .byte 206
+ .byte 208
+ .byte 211
+ .byte 212
+ .byte 0xFF
+
+AI_bytes_81DBC2C:: @ 81DBC2C
+ .byte 0xFF
+
+AI_bytes_81DBC2D:: @ 81DBC2D
+ .byte 10
+ .byte 11
+ .byte 12
+ .byte 13
+ .byte 14
+ .byte 15
+ .byte 16
+ .byte 18
+ .byte 19
+ .byte 20
+ .byte 21
+ .byte 22
+ .byte 23
+ .byte 24
+ .byte 46
+ .byte 47
+ .byte 50
+ .byte 51
+ .byte 52
+ .byte 53
+ .byte 54
+ .byte 55
+ .byte 56
+ .byte 58
+ .byte 59
+ .byte 60
+ .byte 61
+ .byte 62
+ .byte 63
+ .byte 64
+ .byte 66
+ .byte 91
+ .byte 114
+ .byte 124
+ .byte 205
+ .byte 206
+ .byte 208
+ .byte 211
+ .byte 212
+ .byte 0xFF
+
+AI_bytes_81DBC55:: @ 81DBC55
+ .byte 1
+ .byte 7
+ .byte 10
+ .byte 11
+ .byte 12
+ .byte 13
+ .byte 14
+ .byte 15
+ .byte 16
+ .byte 18
+ .byte 19
+ .byte 20
+ .byte 21
+ .byte 22
+ .byte 23
+ .byte 24
+ .byte 26
+ .byte 30
+ .byte 33
+ .byte 35
+ .byte 38
+ .byte 40
+ .byte 40
+ .byte 46
+ .byte 47
+ .byte 49
+ .byte 50
+ .byte 51
+ .byte 52
+ .byte 53
+ .byte 54
+ .byte 55
+ .byte 56
+ .byte 58
+ .byte 59
+ .byte 60
+ .byte 61
+ .byte 62
+ .byte 63
+ .byte 64
+ .byte 66
+ .byte 67
+ .byte 91
+ .byte 93
+ .byte 94
+ .byte 100
+ .byte 114
+ .byte 118
+ .byte 119
+ .byte 120
+ .byte 124
+ .byte 143
+ .byte 144
+ .byte 167
+ .byte 205
+ .byte 206
+ .byte 208
+ .byte 211
+ .byte 212
+ .byte 0xFF
+
+AI_Unknown:: @ 81DBC91
+ if_not_effect -119, AI_sub_81DBCA7
+ if_equal 0, AI_sub_81DBCA7
+ is_first_turn 1
+ if_equal 0, AI_sub_81DBCA7
+ score 5
+
+AI_sub_81DBCA7:: @ 81DBCA7
+ end
+
+AI_Roaming:: @ 81DBCA8
+ if_status2 1, 57344, AI_sub_81DBCD5
+ if_status2 1, 67108864, AI_sub_81DBCD5
+ get_ability 0
+ if_equal 23, AI_sub_81DBCD5
+ get_ability 1
+ if_equal 26, AI_sub_81DBCD4
+ get_ability 0
+ if_equal 71, AI_sub_81DBCD5
+
+AI_sub_81DBCD4:: @ 81DBCD4
+ flee
+
+AI_sub_81DBCD5:: @ 81DBCD5
+ end
+
+AI_Safari:: @ 81DBCD6
+ if_random_100 AI_sub_81DBCDC
+ watch
+
+AI_sub_81DBCDC:: @ 81DBCDC
+ flee
+
+AI_FirstBattle:: @ 81DBCDD
+ if_hp_equal 0, 20, AI_sub_81DBCEC
+ if_hp_less_than 0, 20, AI_sub_81DBCEC
+ end
+
+AI_sub_81DBCEC:: @ 81DBCEC
+ flee
+
+AI_Ret:: @ 81DBCED
+ end
diff --git a/data/data_83FECCC.s b/data/data_83FECCC.s
index 8fb1d4533..a855e5f7f 100644
--- a/data/data_83FECCC.s
+++ b/data/data_83FECCC.s
@@ -644,7 +644,7 @@ gUnknown_8415F3D:: @ 8415F3D
gUnknown_8415F4A:: @ 8415F4A
.incbin "baserom.gba", 0x415F4A, 0x7
-gUnknown_8415F51:: @ 8415F51
+gText_PickOKExit:: @ 8415F51
.incbin "baserom.gba", 0x415F51, 0x15
gUnknown_8415F66:: @ 8415F66
@@ -2252,10 +2252,10 @@ gUnknown_841D18D:: @ 841D18D
gUnknown_841D198:: @ 841D198
.incbin "baserom.gba", 0x41D198, 0xCB8
-gUnknown_841DE50:: @ 841DE50
+gJPText_MysteryGift:: @ 841DE50
.string "$"
-gUnknown_841DE51:: @ 841DE51
+gJPText_DecideStop:: @ 841DE51
.string "$"
gUnknown_841DE52:: @ 841DE52
@@ -2432,155 +2432,184 @@ gFameCheckerBillName:: @ 841E5F3
gFameCheckerMrFujiName:: @ 841E5F8
.string "FUJI$"
-gUnknown_841E5FD:: @ 841E5FD
- .string "A variety of events will be imported\nover Wireless Communication.$"
+gText_VarietyOfEventsImportedWireless:: @ 841E5FD
+ .string "A variety of events will be imported\n"
+ .string "over Wireless Communication.$"
-gUnknown_841E63F:: @ 841E63F
- .string "Read the WONDER CARDS in your\npossession.$"
+gText_WonderCardsInPossession:: @ 841E63F
+ .string "Read the WONDER CARDS in your\n"
+ .string "possession.$"
-gUnknown_841E669:: @ 841E669
+gText_ReadNewsThatArrived:: @ 841E669
.string "Read the NEWS that arrived.$"
-gUnknown_841E685:: @ 841E685
+gText_ReturnToTitle:: @ 841E685
.string "Return to the title screen.$"
-gUnknown_841E6A1:: @ 841E6A1
- .incbin "baserom.gba", 0x41E6A1, 0x3B
+gText_DontHaveCardNewOneInput:: @ 841E6A1
+ .string "You don’t have a WONDER CARD,\nso a new CARD will be input.$"
-gUnknown_841E6DC:: @ 841E6DC
- .incbin "baserom.gba", 0x41E6DC, 0x3B
+gText_DontHaveNewsNewOneInput:: @ 841E6DC
+ .string "You don’t have any WONDER NEWS,\nso new NEWS will be input.$"
-gUnknown_841E717:: @ 841E717
- .incbin "baserom.gba", 0x41E717, 0x2A
+gText_WhereShouldCardBeAccessed:: @ 841E717
+ .string "Where should the WONDER CARD\nbe accessed?$"
-gUnknown_841E741:: @ 841E741
- .incbin "baserom.gba", 0x41E741, 0x53
+gText_WhereShouldNewsBeAccessed:: @ 841E741
+ .string "Where should the WONDER NEWS\nbe accessed?$"
-gUnknown_841E794:: @ 841E794
- .incbin "baserom.gba", 0x41E794, 0xF
+gUnknown_841E76B:: @ 841E76B
+ .string "Link standby...\n... ... B Button: Cancel$"
-gUnknown_841E7A3:: @ 841E7A3
- .incbin "baserom.gba", 0x41E7A3, 0x19
+gText_Communicating:: @ 841E794
+ .string "Communicating…$"
-gUnknown_841E7BC:: @ 841E7BC
- .incbin "baserom.gba", 0x41E7BC, 0x15
+gText_CommunicationCompleted:: @ 841E7A3
+ .string "Communication completed.$"
-gUnknown_841E7D1:: @ 841E7D1
- .incbin "baserom.gba", 0x41E7D1, 0x21
+gText_CommunicationError:: @ 841E7BC
+ .string "Communication error.$"
-gUnknown_841E7F2:: @ 841E7F2
- .incbin "baserom.gba", 0x41E7F2, 0x31
+gText_CommunicationCanceled:: @ 841E7D1
+ .string "Communication has been canceled.$"
-gUnknown_841E823:: @ 841E823
- .incbin "baserom.gba", 0x41E823, 0x43
+gText_ThrowAwayWonderCard:: @ 841E7F2
+ .string "Throw away the WONDER CARD\nand input a new CARD?$"
-gUnknown_841E866:: @ 841E866
- .incbin "baserom.gba", 0x41E866, 0x29
+gText_HaventReceivedCardsGift:: @ 841E823
+ .string "You haven’t received the CARD’s gift\nyet. Input a new CARD anyway?$"
-gUnknown_841E88F:: @ 841E88F
- .incbin "baserom.gba", 0x41E88F, 0x2E
+gText_WonderCardReceivedFrom:: @ 841E866
+ .string "A WONDER CARD has been received\nfrom {STR_VAR_1}.$"
-gUnknown_841E8BD:: @ 841E8BD
- .incbin "baserom.gba", 0x41E8BD, 0x25
+gText_WonderNewsReceivedFrom:: @ 841E88F
+ .string "A WONDER NEWS item has been\nreceived from {STR_VAR_1}.$"
-gUnknown_841E8E2:: @ 841E8E2
- .incbin "baserom.gba", 0x41E8E2, 0x2A
+gText_WonderCardReceived:: @ 841E8BD
+ .string "A new WONDER CARD has been\nreceived.$"
-gUnknown_841E90C:: @ 841E90C
- .incbin "baserom.gba", 0x41E90C, 0x1F
+gText_WonderNewsReceived:: @ 841E8E2
+ .string "A new WONDER NEWS item has been\nreceived.$"
-gUnknown_841E92B:: @ 841E92B
- .incbin "baserom.gba", 0x41E92B, 0x1B
+gText_NewStampReceived:: @ 841E90C
+ .string "A new STAMP has been received.$"
-gUnknown_841E946:: @ 841E946
- .incbin "baserom.gba", 0x41E946, 0x22
+gText_NewTrainerReceived:: @ 841E92B
+ .string "A new TRAINER has arrived.$"
-gUnknown_841E968:: @ 841E968
- .incbin "baserom.gba", 0x41E968, 0x27
+gText_AlreadyHadCard:: @ 841E946
+ .string "You already had that\nWONDER CARD.$"
-gUnknown_841E98F:: @ 841E98F
- .incbin "baserom.gba", 0x41E98F, 0x1C
+gText_AlreadyHadNews:: @ 841E968
+ .string "You already had that\nWONDER NEWS item.$"
-gUnknown_841E9AB:: @ 841E9AB
- .incbin "baserom.gba", 0x41E9AB, 0x28
+gText_AlreadyHadStamp:: @ 841E98F
+ .string "You already had that\nSTAMP.$"
-gUnknown_841E9D3:: @ 841E9D3
- .incbin "baserom.gba", 0x41E9D3, 0x3A
+gText_NoMoreRoomForStamps:: @ 841E9AB
+ .string "There’s no more room for adding\nSTAMPS.$"
-gUnknown_841EA0D:: @ 841EA0D
- .incbin "baserom.gba", 0x41EA0D, 0x32
+gText_RecordUploadedViaWireless:: @ 841E9D3
+ .string "Your record has been uploaded via\nWIRELESS COMMUNICATION.$"
-gUnknown_841EA3F:: @ 841EA3F
- .incbin "baserom.gba", 0x41EA3F, 0x30
+gText_CantAcceptCardFromTrainer:: @ 841EA0D
+ .string "You can’t accept a WONDER CARD\nfrom this TRAINER.$"
-gUnknown_841EA6F:: @ 841EA6F
- .incbin "baserom.gba", 0x41EA6F, 0x17
+gText_CantAcceptNewsFromTrainer:: @ 841EA3F
+ .string "You can’t accept WONDER NEWS\nfrom this TRAINER.$"
-gUnknown_841EA86:: @ 841EA86
- .incbin "baserom.gba", 0x41EA86, 0x31
+gText_NothingSentOver:: @ 841EA6F
+ .string "Nothing was sent over…$"
-gUnknown_841EAB7:: @ 841EAB7
- .incbin "baserom.gba", 0x41EAB7, 0x30
+gText_WhatToDoWithCards:: @ 841EA86
+ .string "What would you like to do\nwith the WONDER CARDS?$"
-gUnknown_841EAE7:: @ 841EAE7
- .incbin "baserom.gba", 0x41EAE7, 0x1A
+gText_WhatToDoWithNews:: @ 841EAB7
+ .string "What would you like to do\nwith the WONDER NEWS?$"
-gUnknown_841EB01:: @ 841EB01
- .incbin "baserom.gba", 0x41EB01, 0x1F
+gText_SendingWonderCard:: @ 841EAE7
+ .string "Sending your WONDER CARD…$"
-gUnknown_841EB20:: @ 841EB20
- .incbin "baserom.gba", 0x41EB20, 0x26
+gText_SendingWonderNews:: @ 841EB01
+ .string "Sending your WONDER NEWS item…$"
-gUnknown_841EB46:: @ 841EB46
- .incbin "baserom.gba", 0x41EB46, 0x2B
+gText_WonderCardSentTo:: @ 841EB20
+ .string "Your WONDER CARD has been sent\nto {STR_VAR_1}.$"
-gUnknown_841EB71:: @ 841EB71
- .incbin "baserom.gba", 0x41EB71, 0x1D
+gText_WonderNewsSentTo:: @ 841EB46
+ .string "Your WONDER NEWS item has been\nsent to {STR_VAR_1}.$"
-gUnknown_841EB8E:: @ 841EB8E
- .incbin "baserom.gba", 0x41EB8E, 0x1C
+gText_StampSentTo:: @ 841EB71
+ .string "A STAMP has been sent to {STR_VAR_1}.$"
-gUnknown_841EBAA:: @ 841EBAA
- .incbin "baserom.gba", 0x41EBAA, 0x34
+gText_GiftSentTo:: @ 841EB8E
+ .string "A GIFT has been sent to {STR_VAR_1}.$"
-gUnknown_841EBDE:: @ 841EBDE
- .incbin "baserom.gba", 0x41EBDE, 0x34
+gText_OtherTrainerHasCard:: @ 841EBAA
+ .string "The other TRAINER has the same\nWONDER CARD already.$"
-gUnknown_841EC12:: @ 841EC12
- .incbin "baserom.gba", 0x41EC12, 0x2E
+gText_OtherTrainerHasNews:: @ 841EBDE
+ .string "The other TRAINER has the same\nWONDER NEWS already.$"
-gUnknown_841EC40:: @ 841EC40
- .incbin "baserom.gba", 0x41EC40, 0x2A
+gText_OtherTrainerHasStamp:: @ 841EC12
+ .string "The other TRAINER has the same\nSTAMP already.$"
-gUnknown_841EC6A:: @ 841EC6A
- .incbin "baserom.gba", 0x41EC6A, 0x2F
+gText_OtherTrainerCanceled:: @ 841EC40
+ .string "The other TRAINER canceled\ncommunication.$"
-gUnknown_841EC99:: @ 841EC99
- .incbin "baserom.gba", 0x41EC99, 0x3A
+gText_CantSendGiftToTrainer:: @ 841EC6A
+ .string "You can’t send a MYSTERY GIFT to\nthis TRAINER.$"
-gUnknown_841ECD3:: @ 841ECD3
- .incbin "baserom.gba", 0x41ECD3, 0x26
+gText_IfThrowAwayCardEventWontHappen:: @ 841EC99
+ .string "If you throw away the CARD,\nits event won’t happen. Okay?$"
-gUnknown_841ECF9:: @ 841ECF9
- .incbin "baserom.gba", 0x41ECF9, 0x36
+gText_OkayToDiscardNews:: @ 841ECD3
+ .string "Is it okay to discard this\nNEWS item?$"
-gUnknown_841ED2F:: @ 841ED2F
- .incbin "baserom.gba", 0x41ED2F, 0x21
+gText_HaventReceivedGiftOkayToDiscard:: @ 841ECF9
+ .string "You haven’t received the\nGIFT. Is it okay to discard?$"
-gUnknown_841ED50:: @ 841ED50
- .incbin "baserom.gba", 0x41ED50, 0x2B
+gText_DataWillBeSaved:: @ 841ED2F
+ .string "Data will be saved.\nPlease wait.$"
-gUnknown_841ED7B:: @ 841ED7B
- .incbin "baserom.gba", 0x41ED7B, 0x21
+gText_SaveCompletedPressA:: @ 841ED50
+ .string "Save completed.\nPlease press the A Button.$"
-gUnknown_841ED9C:: @ 841ED9C
- .incbin "baserom.gba", 0x41ED9C, 0x21
+gText_WonderCardThrownAway:: @ 841ED7B
+ .string "The WONDER CARD was thrown away.$"
-gUnknown_841EDBD:: @ 841EDBD
- .incbin "baserom.gba", 0x41EDBD, 0xD
+gText_WonderNewsThrownAway:: @ 841ED9C
+ .string "The WONDER NEWS was thrown away.$"
-gUnknown_841EDCA:: @ 841EDCA
- .incbin "baserom.gba", 0x41EDCA, 0x61
+gText_MysteryGift:: @ 841EDBD
+ .string "MYSTERY GIFT$"
+
+gText_PickOKCancel:: @ 841EDCA
+ .string "{KEYGFX_DPAD_UP_DOWN}PICK {KEYGFX_A_BUTTON}OK {KEYGFX_B_BUTTON}EXIT$"
+
+gText_WonderCards::
+ .string "WONDER CARDS$"
+
+gText_WonderNews::
+ .string "WONDER NEWS$"
+
+gText_WirelessCommunication::
+ .string "WIRELESS COMMUNICATION$"
+
+gText_Friend2::
+ .string "FRIEND$"
+
+gText_Exit3::
+ .string "EXIT$"
+
+gText_Receive::
+ .string "RECEIVE$"
+
+gText_Send::
+ .string "SEND$"
+
+gText_Toss::
+ .string "TOSS$"
gUnknown_841EE2B:: @ 841EE2B
.incbin "baserom.gba", 0x41EE2B, 0x17
diff --git a/data/data_8468C98.s b/data/data_8468C98.s
index f850fe141..828932cc6 100644
--- a/data/data_8468C98.s
+++ b/data/data_8468C98.s
@@ -1,38 +1,11 @@
+ .include "asm/macros.inc"
+ .include "constants/constants.inc"
+
.section .rodata
.align 2
-gUnknown_8468C98:: @ 8468C98
- .incbin "baserom.gba", 0x468C98, 0x520
-
-gUnknown_84691B8:: @ 84691B8
- .incbin "baserom.gba", 0x4691B8, 0x20
-
-gUnknown_84691D8:: @ 84691D8
- .incbin "baserom.gba", 0x4691D8, 0x800
-
-gUnknown_84699D8:: @ 84699D8
- .incbin "baserom.gba", 0x4699D8, 0x1520
-
-gUnknown_846AEF8:: @ 846AEF8
- .incbin "baserom.gba", 0x46AEF8, 0x4
-
-gUnknown_846AEFC:: @ 846AEFC
- .incbin "baserom.gba", 0x46AEFC, 0x2C
-
-gUnknown_846AF28:: @ 846AF28
- .incbin "baserom.gba", 0x46AF28, 0x38
-
-gUnknown_846AF60:: @ 846AF60
- .incbin "baserom.gba", 0x46AF60, 0x18
-
-gUnknown_846AF78:: @ 846AF78
- .incbin "baserom.gba", 0x46AF78, 0x18
-
-gUnknown_846AF90:: @ 846AF90
- .incbin "baserom.gba", 0x46AF90, 0x40
-
-gUnknown_846AFD0:: @ 846AFD0
- .incbin "baserom.gba", 0x46AFD0, 0x45C
+gUnknown_846AFE8:: @ 846AFE8
+ .incbin "baserom.gba", 0x46AFE8, 0x444
gUnknown_846B42C:: @ 846B42C
.incbin "baserom.gba", 0x46B42C, 0x10
diff --git a/data/link_rfu_4.s b/data/link_rfu_4.s
deleted file mode 100644
index 20f235a80..000000000
--- a/data/link_rfu_4.s
+++ /dev/null
@@ -1,54 +0,0 @@
- .section .rodata
-
- .align 2
-
-gUnknown_8466D90:: @ 8466D90
- .incbin "baserom.gba", 0x466D90, 0x8
-
-gUnknown_8466D98:: @ 8466D98
- .incbin "baserom.gba", 0x466D98, 0x8
-
-gUnknown_8466DA0:: @ 8466DA0
- .incbin "baserom.gba", 0x466DA0, 0x8
-
-gUnknown_8466DA8:: @ 8466DA8
- .incbin "baserom.gba", 0x466DA8, 0x8
-
-gUnknown_8466DB0:: @ 8466DB0
- .incbin "baserom.gba", 0x466DB0, 0x8
-
-gUnknown_8466DB8:: @ 8466DB8
- .incbin "baserom.gba", 0x466DB8, 0x8
-
-gUnknown_8466DC0:: @ 8466DC0
- .incbin "baserom.gba", 0x466DC0, 0x8
-
-gUnknown_8466DC8:: @ 8466DC8
- .incbin "baserom.gba", 0x466DC8, 0x8
-
-gUnknown_8466DD0:: @ 8466DD0
- .incbin "baserom.gba", 0x466DD0, 0x18
-
-gUnknown_8466DE8:: @ 8466DE8
- .incbin "baserom.gba", 0x466DE8, 0x18
-
-gUnknown_8466E00:: @ 8466E00
- .incbin "baserom.gba", 0x466E00, 0x78
-
-gUnknown_8466E78:: @ 8466E78
- .incbin "baserom.gba", 0x466E78, 0x18
-
-gUnknown_8466E90:: @ 8466E90
- .incbin "baserom.gba", 0x466E90, 0x18
-
-gUnknown_8466EA8:: @ 8466EA8
- .incbin "baserom.gba", 0x466EA8, 0x18
-
-gUnknown_8466EC0:: @ 8466EC0
- .incbin "baserom.gba", 0x466EC0, 0x28
-
-gUnknown_8466EE8:: @ 8466EE8
- .incbin "baserom.gba", 0x466EE8, 0x8
-
-gUnknown_8466EF0:: @ 8466EF0
- .incbin "baserom.gba", 0x466EF0, 0x10
diff --git a/data/mystery_event_script_cmd_table.s b/data/mystery_event_script_cmd_table.s
index 5dbcf50ee..9d74b6282 100644
--- a/data/mystery_event_script_cmd_table.s
+++ b/data/mystery_event_script_cmd_table.s
@@ -1,5 +1,6 @@
.section script_data, "aw", %progbits
+ .align 2
gMysteryEventScriptCmdTable:: @ 81DBCF0
.4byte MEScrCmd_nop
.4byte MEScrCmd_checkcompat
diff --git a/data/mystery_gift_menu.s b/data/mystery_gift_menu.s
deleted file mode 100644
index 9caee4467..000000000
--- a/data/mystery_gift_menu.s
+++ /dev/null
@@ -1,14 +0,0 @@
- .section .rodata
- .align 2
-
-gUnknown_8466D10:: @ 8466D10
- .incbin "baserom.gba", 0x466D10, 0x20
-
-gUnknown_8466D30:: @ 8466D30
- .incbin "baserom.gba", 0x466D30, 0x30
-
-gUnknown_8466D60:: @ 8466D60
- .incbin "baserom.gba", 0x466D60, 0x10
-
-gUnknown_8466D70:: @ 8466D70
- .incbin "baserom.gba", 0x466D70, 0x20
diff --git a/data/seagallop/eb_tilemap.bin b/data/seagallop/eb_tilemap.bin
new file mode 100644
index 000000000..2f912fb18
--- /dev/null
+++ b/data/seagallop/eb_tilemap.bin
Binary files differ
diff --git a/data/seagallop/ferry_and_wake.pal b/data/seagallop/ferry_and_wake.pal
new file mode 100644
index 000000000..c25501332
--- /dev/null
+++ b/data/seagallop/ferry_and_wake.pal
@@ -0,0 +1,19 @@
+JASC-PAL
+0100
+16
+65 123 180
+238 246 255
+222 230 238
+189 205 230
+156 164 189
+139 139 156
+98 98 123
+57 57 106
+197 98 98
+172 65 106
+32 74 156
+197 148 0
+246 213 24
+222 238 255
+255 255 255
+74 106 139
diff --git a/data/seagallop/ferry_sprite.png b/data/seagallop/ferry_sprite.png
new file mode 100644
index 000000000..cc06fbffa
--- /dev/null
+++ b/data/seagallop/ferry_sprite.png
Binary files differ
diff --git a/data/seagallop/wake.png b/data/seagallop/wake.png
new file mode 100644
index 000000000..a5ff28c6e
--- /dev/null
+++ b/data/seagallop/wake.png
Binary files differ
diff --git a/data/seagallop/water.png b/data/seagallop/water.png
new file mode 100644
index 000000000..ccf64591a
--- /dev/null
+++ b/data/seagallop/water.png
Binary files differ
diff --git a/data/seagallop/wb_tilemap.bin b/data/seagallop/wb_tilemap.bin
new file mode 100644
index 000000000..a3c27d319
--- /dev/null
+++ b/data/seagallop/wb_tilemap.bin
Binary files differ
diff --git a/data/sound_data.s b/data/sound_data.s
index 4bbe6ce75..472c25ee1 100644
--- a/data/sound_data.s
+++ b/data/sound_data.s
@@ -1,37 +1,3394 @@
+ .include "asm/macros/m4a.inc"
+ .include "asm/macros/music_voice.inc"
.section .rodata
voicegroup_pokemon_cry:: @ 8489C8C
.incbin "baserom.gba", 0x489C8C, 0x2C88
+ .align 2
gCryTable:: @ 848C914
- .incbin "baserom.gba", 0x48C914, 0x600
+ cry Cry_Bulbasaur
+ cry Cry_Ivysaur
+ cry Cry_Venusaur
+ cry Cry_Charmander
+ cry Cry_Charmeleon
+ cry Cry_Charizard
+ cry Cry_Squirtle
+ cry Cry_Wartortle
+ cry Cry_Blastoise
+ cry Cry_Caterpie
+ cry Cry_Metapod
+ cry Cry_Butterfree
+ cry Cry_Weedle
+ cry Cry_Kakuna
+ cry Cry_Beedrill
+ cry Cry_Pidgey
+ cry Cry_Pidgeotto
+ cry Cry_Pidgeot
+ cry Cry_Rattata
+ cry Cry_Raticate
+ cry Cry_Spearow
+ cry Cry_Fearow
+ cry Cry_Ekans
+ cry Cry_Arbok
+ cry Cry_Pikachu
+ cry Cry_Raichu
+ cry Cry_Sandshrew
+ cry Cry_Sandslash
+ cry Cry_NidoranF
+ cry Cry_Nidorina
+ cry Cry_Nidoqueen
+ cry Cry_NidoranM
+ cry Cry_Nidorino
+ cry Cry_Nidoking
+ cry Cry_Clefairy
+ cry Cry_Clefable
+ cry Cry_Vulpix
+ cry Cry_Ninetales
+ cry Cry_Jigglypuff
+ cry Cry_Wigglytuff
+ cry Cry_Zubat
+ cry Cry_Golbat
+ cry Cry_Oddish
+ cry Cry_Gloom
+ cry Cry_Vileplume
+ cry Cry_Paras
+ cry Cry_Parasect
+ cry Cry_Venonat
+ cry Cry_Venomoth
+ cry Cry_Diglett
+ cry Cry_Dugtrio
+ cry Cry_Meowth
+ cry Cry_Persian
+ cry Cry_Psyduck
+ cry Cry_Golduck
+ cry Cry_Mankey
+ cry Cry_Primeape
+ cry Cry_Growlithe
+ cry Cry_Arcanine
+ cry Cry_Poliwag
+ cry Cry_Poliwhirl
+ cry Cry_Poliwrath
+ cry Cry_Abra
+ cry Cry_Kadabra
+ cry Cry_Alakazam
+ cry Cry_Machop
+ cry Cry_Machoke
+ cry Cry_Machamp
+ cry Cry_Bellsprout
+ cry Cry_Weepinbell
+ cry Cry_Victreebel
+ cry Cry_Tentacool
+ cry Cry_Tentacruel
+ cry Cry_Geodude
+ cry Cry_Graveler
+ cry Cry_Golem
+ cry Cry_Ponyta
+ cry Cry_Rapidash
+ cry Cry_Slowpoke
+ cry Cry_Slowbro
+ cry Cry_Magnemite
+ cry Cry_Magneton
+ cry Cry_Farfetchd
+ cry Cry_Doduo
+ cry Cry_Dodrio
+ cry Cry_Seel
+ cry Cry_Dewgong
+ cry Cry_Grimer
+ cry Cry_Muk
+ cry Cry_Shellder
+ cry Cry_Cloyster
+ cry Cry_Gastly
+ cry Cry_Haunter
+ cry Cry_Gengar
+ cry Cry_Onix
+ cry Cry_Drowzee
+ cry Cry_Hypno
+ cry Cry_Krabby
+ cry Cry_Kingler
+ cry Cry_Voltorb
+ cry Cry_Electrode
+ cry Cry_Exeggcute
+ cry Cry_Exeggutor
+ cry Cry_Cubone
+ cry Cry_Marowak
+ cry Cry_Hitmonlee
+ cry Cry_Hitmonchan
+ cry Cry_Lickitung
+ cry Cry_Koffing
+ cry Cry_Weezing
+ cry Cry_Rhyhorn
+ cry Cry_Rhydon
+ cry Cry_Chansey
+ cry Cry_Tangela
+ cry Cry_Kangaskhan
+ cry Cry_Horsea
+ cry Cry_Seadra
+ cry Cry_Goldeen
+ cry Cry_Seaking
+ cry Cry_Staryu
+ cry Cry_Starmie
+ cry Cry_MrMime
+ cry Cry_Scyther
+ cry Cry_Jynx
+ cry Cry_Electabuzz
+ cry Cry_Magmar
+ cry Cry_Pinsir
+ cry Cry_Tauros
+ cry Cry_Magikarp
+ cry Cry_Gyarados
+ cry Cry_Lapras
+ cry Cry_Ditto
+ cry Cry_Eevee
+ cry Cry_Vaporeon
+ cry Cry_Jolteon
+ cry Cry_Flareon
+ cry Cry_Porygon
+ cry Cry_Omanyte
+ cry Cry_Omastar
+ cry Cry_Kabuto
+ cry Cry_Kabutops
+ cry Cry_Aerodactyl
+ cry Cry_Snorlax
+ cry Cry_Articuno
+ cry Cry_Zapdos
+ cry Cry_Moltres
+ cry Cry_Dratini
+ cry Cry_Dragonair
+ cry Cry_Dragonite
+ cry Cry_Mewtwo
+ cry Cry_Mew
+ cry Cry_Chikorita
+ cry Cry_Bayleef
+ cry Cry_Meganium
+ cry Cry_Cyndaquil
+ cry Cry_Quilava
+ cry Cry_Typhlosion
+ cry Cry_Totodile
+ cry Cry_Croconaw
+ cry Cry_Feraligatr
+ cry Cry_Sentret
+ cry Cry_Furret
+ cry Cry_Hoothoot
+ cry Cry_Noctowl
+ cry Cry_Ledyba
+ cry Cry_Ledian
+ cry Cry_Spinarak
+ cry Cry_Ariados
+ cry Cry_Crobat
+ cry Cry_Chinchou
+ cry Cry_Lanturn
+ cry Cry_Pichu
+ cry Cry_Cleffa
+ cry Cry_Igglybuff
+ cry Cry_Togepi
+ cry Cry_Togetic
+ cry Cry_Natu
+ cry Cry_Xatu
+ cry Cry_Mareep
+ cry Cry_Flaaffy
+ cry Cry_Ampharos
+ cry Cry_Bellossom
+ cry Cry_Marill
+ cry Cry_Azumarill
+ cry Cry_Sudowoodo
+ cry Cry_Politoed
+ cry Cry_Hoppip
+ cry Cry_Skiploom
+ cry Cry_Jumpluff
+ cry Cry_Aipom
+ cry Cry_Sunkern
+ cry Cry_Sunflora
+ cry Cry_Yanma
+ cry Cry_Wooper
+ cry Cry_Quagsire
+ cry Cry_Espeon
+ cry Cry_Umbreon
+ cry Cry_Murkrow
+ cry Cry_Slowking
+ cry Cry_Misdreavus
+ cry Cry_Unown
+ cry Cry_Wobbuffet
+ cry Cry_Girafarig
+ cry Cry_Pineco
+ cry Cry_Forretress
+ cry Cry_Dunsparce
+ cry Cry_Gligar
+ cry Cry_Steelix
+ cry Cry_Snubbull
+ cry Cry_Granbull
+ cry Cry_Qwilfish
+ cry Cry_Scizor
+ cry Cry_Shuckle
+ cry Cry_Heracross
+ cry Cry_Sneasel
+ cry Cry_Teddiursa
+ cry Cry_Ursaring
+ cry Cry_Slugma
+ cry Cry_Magcargo
+ cry Cry_Swinub
+ cry Cry_Piloswine
+ cry Cry_Corsola
+ cry Cry_Remoraid
+ cry Cry_Octillery
+ cry Cry_Delibird
+ cry Cry_Mantine
+ cry Cry_Skarmory
+ cry Cry_Houndour
+ cry Cry_Houndoom
+ cry Cry_Kingdra
+ cry Cry_Phanpy
+ cry Cry_Donphan
+ cry Cry_Porygon2
+ cry Cry_Stantler
+ cry Cry_Smeargle
+ cry Cry_Tyrogue
+ cry Cry_Hitmontop
+ cry Cry_Smoochum
+ cry Cry_Elekid
+ cry Cry_Magby
+ cry Cry_Miltank
+ cry Cry_Blissey
+ cry Cry_Raikou
+ cry Cry_Entei
+ cry Cry_Suicune
+ cry Cry_Larvitar
+ cry Cry_Pupitar
+ cry Cry_Tyranitar
+ cry Cry_Lugia
+ cry Cry_HoOh
+ cry Cry_Celebi
+ cry Cry_Kecleon
+ cry Cry_Roselia
+ cry Cry_Torkoal
+ cry Cry_Electrike
+ cry Cry_Manectric
+ cry Cry_Duskull
+ cry Cry_Latias
+ cry Cry_Wynaut
+ cry Cry_Seviper
+ cry Cry_Sharpedo
+ cry Cry_Zangoose
+ cry Cry_Azurill
+ cry Cry_Swablu
+ cry Cry_Altaria
+ cry Cry_Unused265
+ cry Cry_Taillow
+ cry Cry_Swellow
+ cry Cry_Unused268
+ cry Cry_Spinda
+ cry Cry_Torchic
+ cry Cry_Combusken
+ cry Cry_Blaziken
+ cry Cry_Treecko
+ cry Cry_Grovyle
+ cry Cry_Sceptile
+ cry Cry_Mudkip
+ cry Cry_Marshtomp
+ cry Cry_Swampert
+ cry Cry_Pelipper
+ cry Cry_Wingull
+ cry Cry_Banette
+ cry Cry_Shuppet
+ cry Cry_Lotad
+ cry Cry_Lombre
+ cry Cry_Ludicolo
+ cry Cry_Seedot
+ cry Cry_Nuzleaf
+ cry Cry_Shiftry
+ cry Cry_Carvanha
+ cry Cry_Wurmple
+ cry Cry_Silcoon
+ cry Cry_Beautifly
+ cry Cry_Cascoon
+ cry Cry_Dustox
+ cry Cry_Ralts
+ cry Cry_Kirlia
+ cry Cry_Gardevoir
+ cry Cry_Slakoth
+ cry Cry_Vigoroth
+ cry Cry_Slaking
+ cry Cry_Nincada
+ cry Cry_Ninjask
+ cry Cry_Shedinja
+ cry Cry_Makuhita
+ cry Cry_Hariyama
+ cry Cry_Nosepass
+ cry Cry_Glalie
+ cry Cry_Plusle
+ cry Cry_Minun
+ cry Cry_Surskit
+ cry Cry_Masquerain
+ cry Cry_Skitty
+ cry Cry_Delcatty
+ cry Cry_Gulpin
+ cry Cry_Swalot
+ cry Cry_Numel
+ cry Cry_Camerupt
+ cry Cry_Barboach
+ cry Cry_Whiscash
+ cry Cry_Corphish
+ cry Cry_Crawdaunt
+ cry Cry_Spoink
+ cry Cry_Grumpig
+ cry Cry_Trapinch
+ cry Cry_Vibrava
+ cry Cry_Flygon
+ cry Cry_Cacnea
+ cry Cry_Cacturne
+ cry Cry_Baltoy
+ cry Cry_Claydol
+ cry Cry_Lunatone
+ cry Cry_Solrock
+ cry Cry_Feebas
+ cry Cry_Milotic
+ cry Cry_Absol
+ cry Cry_Meditite
+ cry Cry_Medicham
+ cry Cry_Spheal
+ cry Cry_Sealeo
+ cry Cry_Walrein
+ cry Cry_Clamperl
+ cry Cry_Huntail
+ cry Cry_Gorebyss
+ cry Cry_Lileep
+ cry Cry_Cradily
+ cry Cry_Anorith
+ cry Cry_Armaldo
+ cry Cry_Beldum
+ cry Cry_Metang
+ cry Cry_Metagross
+ cry Cry_Bagon
+ cry Cry_Shelgon
+ cry Cry_Regirock
+ cry Cry_Regice
+ cry Cry_Registeel
+ cry Cry_Castform
+ cry Cry_Volbeat
+ cry Cry_Illumise
+ cry Cry_Poochyena
+ cry Cry_Mightyena
+ cry Cry_Dusclops
+ cry Cry_Sableye
+ cry Cry_Mawile
+ cry Cry_Aron
+ cry Cry_Lairon
+ cry Cry_Aggron
+ cry Cry_Relicanth
+ cry Cry_Luvdisc
+ cry Cry_Groudon
+ cry Cry_Kyogre
+ cry Cry_Rayquaza
+ cry Cry_Salamence
+ cry Cry_Breloom
+ cry Cry_Shroomish
+ cry Cry_Linoone
+ cry Cry_Tropius
+ cry Cry_Wailmer
+ cry Cry_Zigzagoon
+ cry Cry_Exploud
+ cry Cry_Loudred
+ cry Cry_Wailord
+ cry Cry_Whismur
+ cry Cry_Snorunt
+ cry Cry_Latios
+ cry Cry_Jirachi
+ cry Cry_Deoxys
+ cry Cry_Chimecho
-gUnknown_848CF14:: @ 848CF14
- .incbin "baserom.gba", 0x48CF14, 0x600
+ .align 2
+gCryTable2:: @ 848DB44
+ cry2 Cry_Bulbasaur
+ cry2 Cry_Ivysaur
+ cry2 Cry_Venusaur
+ cry2 Cry_Charmander
+ cry2 Cry_Charmeleon
+ cry2 Cry_Charizard
+ cry2 Cry_Squirtle
+ cry2 Cry_Wartortle
+ cry2 Cry_Blastoise
+ cry2 Cry_Caterpie
+ cry2 Cry_Metapod
+ cry2 Cry_Butterfree
+ cry2 Cry_Weedle
+ cry2 Cry_Kakuna
+ cry2 Cry_Beedrill
+ cry2 Cry_Pidgey
+ cry2 Cry_Pidgeotto
+ cry2 Cry_Pidgeot
+ cry2 Cry_Rattata
+ cry2 Cry_Raticate
+ cry2 Cry_Spearow
+ cry2 Cry_Fearow
+ cry2 Cry_Ekans
+ cry2 Cry_Arbok
+ cry2 Cry_Pikachu
+ cry2 Cry_Raichu
+ cry2 Cry_Sandshrew
+ cry2 Cry_Sandslash
+ cry2 Cry_NidoranF
+ cry2 Cry_Nidorina
+ cry2 Cry_Nidoqueen
+ cry2 Cry_NidoranM
+ cry2 Cry_Nidorino
+ cry2 Cry_Nidoking
+ cry2 Cry_Clefairy
+ cry2 Cry_Clefable
+ cry2 Cry_Vulpix
+ cry2 Cry_Ninetales
+ cry2 Cry_Jigglypuff
+ cry2 Cry_Wigglytuff
+ cry2 Cry_Zubat
+ cry2 Cry_Golbat
+ cry2 Cry_Oddish
+ cry2 Cry_Gloom
+ cry2 Cry_Vileplume
+ cry2 Cry_Paras
+ cry2 Cry_Parasect
+ cry2 Cry_Venonat
+ cry2 Cry_Venomoth
+ cry2 Cry_Diglett
+ cry2 Cry_Dugtrio
+ cry2 Cry_Meowth
+ cry2 Cry_Persian
+ cry2 Cry_Psyduck
+ cry2 Cry_Golduck
+ cry2 Cry_Mankey
+ cry2 Cry_Primeape
+ cry2 Cry_Growlithe
+ cry2 Cry_Arcanine
+ cry2 Cry_Poliwag
+ cry2 Cry_Poliwhirl
+ cry2 Cry_Poliwrath
+ cry2 Cry_Abra
+ cry2 Cry_Kadabra
+ cry2 Cry_Alakazam
+ cry2 Cry_Machop
+ cry2 Cry_Machoke
+ cry2 Cry_Machamp
+ cry2 Cry_Bellsprout
+ cry2 Cry_Weepinbell
+ cry2 Cry_Victreebel
+ cry2 Cry_Tentacool
+ cry2 Cry_Tentacruel
+ cry2 Cry_Geodude
+ cry2 Cry_Graveler
+ cry2 Cry_Golem
+ cry2 Cry_Ponyta
+ cry2 Cry_Rapidash
+ cry2 Cry_Slowpoke
+ cry2 Cry_Slowbro
+ cry2 Cry_Magnemite
+ cry2 Cry_Magneton
+ cry2 Cry_Farfetchd
+ cry2 Cry_Doduo
+ cry2 Cry_Dodrio
+ cry2 Cry_Seel
+ cry2 Cry_Dewgong
+ cry2 Cry_Grimer
+ cry2 Cry_Muk
+ cry2 Cry_Shellder
+ cry2 Cry_Cloyster
+ cry2 Cry_Gastly
+ cry2 Cry_Haunter
+ cry2 Cry_Gengar
+ cry2 Cry_Onix
+ cry2 Cry_Drowzee
+ cry2 Cry_Hypno
+ cry2 Cry_Krabby
+ cry2 Cry_Kingler
+ cry2 Cry_Voltorb
+ cry2 Cry_Electrode
+ cry2 Cry_Exeggcute
+ cry2 Cry_Exeggutor
+ cry2 Cry_Cubone
+ cry2 Cry_Marowak
+ cry2 Cry_Hitmonlee
+ cry2 Cry_Hitmonchan
+ cry2 Cry_Lickitung
+ cry2 Cry_Koffing
+ cry2 Cry_Weezing
+ cry2 Cry_Rhyhorn
+ cry2 Cry_Rhydon
+ cry2 Cry_Chansey
+ cry2 Cry_Tangela
+ cry2 Cry_Kangaskhan
+ cry2 Cry_Horsea
+ cry2 Cry_Seadra
+ cry2 Cry_Goldeen
+ cry2 Cry_Seaking
+ cry2 Cry_Staryu
+ cry2 Cry_Starmie
+ cry2 Cry_MrMime
+ cry2 Cry_Scyther
+ cry2 Cry_Jynx
+ cry2 Cry_Electabuzz
+ cry2 Cry_Magmar
+ cry2 Cry_Pinsir
+ cry2 Cry_Tauros
+ cry2 Cry_Magikarp
+ cry2 Cry_Gyarados
+ cry2 Cry_Lapras
+ cry2 Cry_Ditto
+ cry2 Cry_Eevee
+ cry2 Cry_Vaporeon
+ cry2 Cry_Jolteon
+ cry2 Cry_Flareon
+ cry2 Cry_Porygon
+ cry2 Cry_Omanyte
+ cry2 Cry_Omastar
+ cry2 Cry_Kabuto
+ cry2 Cry_Kabutops
+ cry2 Cry_Aerodactyl
+ cry2 Cry_Snorlax
+ cry2 Cry_Articuno
+ cry2 Cry_Zapdos
+ cry2 Cry_Moltres
+ cry2 Cry_Dratini
+ cry2 Cry_Dragonair
+ cry2 Cry_Dragonite
+ cry2 Cry_Mewtwo
+ cry2 Cry_Mew
+ cry2 Cry_Chikorita
+ cry2 Cry_Bayleef
+ cry2 Cry_Meganium
+ cry2 Cry_Cyndaquil
+ cry2 Cry_Quilava
+ cry2 Cry_Typhlosion
+ cry2 Cry_Totodile
+ cry2 Cry_Croconaw
+ cry2 Cry_Feraligatr
+ cry2 Cry_Sentret
+ cry2 Cry_Furret
+ cry2 Cry_Hoothoot
+ cry2 Cry_Noctowl
+ cry2 Cry_Ledyba
+ cry2 Cry_Ledian
+ cry2 Cry_Spinarak
+ cry2 Cry_Ariados
+ cry2 Cry_Crobat
+ cry2 Cry_Chinchou
+ cry2 Cry_Lanturn
+ cry2 Cry_Pichu
+ cry2 Cry_Cleffa
+ cry2 Cry_Igglybuff
+ cry2 Cry_Togepi
+ cry2 Cry_Togetic
+ cry2 Cry_Natu
+ cry2 Cry_Xatu
+ cry2 Cry_Mareep
+ cry2 Cry_Flaaffy
+ cry2 Cry_Ampharos
+ cry2 Cry_Bellossom
+ cry2 Cry_Marill
+ cry2 Cry_Azumarill
+ cry2 Cry_Sudowoodo
+ cry2 Cry_Politoed
+ cry2 Cry_Hoppip
+ cry2 Cry_Skiploom
+ cry2 Cry_Jumpluff
+ cry2 Cry_Aipom
+ cry2 Cry_Sunkern
+ cry2 Cry_Sunflora
+ cry2 Cry_Yanma
+ cry2 Cry_Wooper
+ cry2 Cry_Quagsire
+ cry2 Cry_Espeon
+ cry2 Cry_Umbreon
+ cry2 Cry_Murkrow
+ cry2 Cry_Slowking
+ cry2 Cry_Misdreavus
+ cry2 Cry_Unown
+ cry2 Cry_Wobbuffet
+ cry2 Cry_Girafarig
+ cry2 Cry_Pineco
+ cry2 Cry_Forretress
+ cry2 Cry_Dunsparce
+ cry2 Cry_Gligar
+ cry2 Cry_Steelix
+ cry2 Cry_Snubbull
+ cry2 Cry_Granbull
+ cry2 Cry_Qwilfish
+ cry2 Cry_Scizor
+ cry2 Cry_Shuckle
+ cry2 Cry_Heracross
+ cry2 Cry_Sneasel
+ cry2 Cry_Teddiursa
+ cry2 Cry_Ursaring
+ cry2 Cry_Slugma
+ cry2 Cry_Magcargo
+ cry2 Cry_Swinub
+ cry2 Cry_Piloswine
+ cry2 Cry_Corsola
+ cry2 Cry_Remoraid
+ cry2 Cry_Octillery
+ cry2 Cry_Delibird
+ cry2 Cry_Mantine
+ cry2 Cry_Skarmory
+ cry2 Cry_Houndour
+ cry2 Cry_Houndoom
+ cry2 Cry_Kingdra
+ cry2 Cry_Phanpy
+ cry2 Cry_Donphan
+ cry2 Cry_Porygon2
+ cry2 Cry_Stantler
+ cry2 Cry_Smeargle
+ cry2 Cry_Tyrogue
+ cry2 Cry_Hitmontop
+ cry2 Cry_Smoochum
+ cry2 Cry_Elekid
+ cry2 Cry_Magby
+ cry2 Cry_Miltank
+ cry2 Cry_Blissey
+ cry2 Cry_Raikou
+ cry2 Cry_Entei
+ cry2 Cry_Suicune
+ cry2 Cry_Larvitar
+ cry2 Cry_Pupitar
+ cry2 Cry_Tyranitar
+ cry2 Cry_Lugia
+ cry2 Cry_HoOh
+ cry2 Cry_Celebi
+ cry2 Cry_Kecleon
+ cry2 Cry_Roselia
+ cry2 Cry_Torkoal
+ cry2 Cry_Electrike
+ cry2 Cry_Manectric
+ cry2 Cry_Duskull
+ cry2 Cry_Latias
+ cry2 Cry_Wynaut
+ cry2 Cry_Seviper
+ cry2 Cry_Sharpedo
+ cry2 Cry_Zangoose
+ cry2 Cry_Azurill
+ cry2 Cry_Swablu
+ cry2 Cry_Altaria
+ cry2 Cry_Unused265
+ cry2 Cry_Taillow
+ cry2 Cry_Swellow
+ cry2 Cry_Unused268
+ cry2 Cry_Spinda
+ cry2 Cry_Torchic
+ cry2 Cry_Combusken
+ cry2 Cry_Blaziken
+ cry2 Cry_Treecko
+ cry2 Cry_Grovyle
+ cry2 Cry_Sceptile
+ cry2 Cry_Mudkip
+ cry2 Cry_Marshtomp
+ cry2 Cry_Swampert
+ cry2 Cry_Pelipper
+ cry2 Cry_Wingull
+ cry2 Cry_Banette
+ cry2 Cry_Shuppet
+ cry2 Cry_Lotad
+ cry2 Cry_Lombre
+ cry2 Cry_Ludicolo
+ cry2 Cry_Seedot
+ cry2 Cry_Nuzleaf
+ cry2 Cry_Shiftry
+ cry2 Cry_Carvanha
+ cry2 Cry_Wurmple
+ cry2 Cry_Silcoon
+ cry2 Cry_Beautifly
+ cry2 Cry_Cascoon
+ cry2 Cry_Dustox
+ cry2 Cry_Ralts
+ cry2 Cry_Kirlia
+ cry2 Cry_Gardevoir
+ cry2 Cry_Slakoth
+ cry2 Cry_Vigoroth
+ cry2 Cry_Slaking
+ cry2 Cry_Nincada
+ cry2 Cry_Ninjask
+ cry2 Cry_Shedinja
+ cry2 Cry_Makuhita
+ cry2 Cry_Hariyama
+ cry2 Cry_Nosepass
+ cry2 Cry_Glalie
+ cry2 Cry_Plusle
+ cry2 Cry_Minun
+ cry2 Cry_Surskit
+ cry2 Cry_Masquerain
+ cry2 Cry_Skitty
+ cry2 Cry_Delcatty
+ cry2 Cry_Gulpin
+ cry2 Cry_Swalot
+ cry2 Cry_Numel
+ cry2 Cry_Camerupt
+ cry2 Cry_Barboach
+ cry2 Cry_Whiscash
+ cry2 Cry_Corphish
+ cry2 Cry_Crawdaunt
+ cry2 Cry_Spoink
+ cry2 Cry_Grumpig
+ cry2 Cry_Trapinch
+ cry2 Cry_Vibrava
+ cry2 Cry_Flygon
+ cry2 Cry_Cacnea
+ cry2 Cry_Cacturne
+ cry2 Cry_Baltoy
+ cry2 Cry_Claydol
+ cry2 Cry_Lunatone
+ cry2 Cry_Solrock
+ cry2 Cry_Feebas
+ cry2 Cry_Milotic
+ cry2 Cry_Absol
+ cry2 Cry_Meditite
+ cry2 Cry_Medicham
+ cry2 Cry_Spheal
+ cry2 Cry_Sealeo
+ cry2 Cry_Walrein
+ cry2 Cry_Clamperl
+ cry2 Cry_Huntail
+ cry2 Cry_Gorebyss
+ cry2 Cry_Lileep
+ cry2 Cry_Cradily
+ cry2 Cry_Anorith
+ cry2 Cry_Armaldo
+ cry2 Cry_Beldum
+ cry2 Cry_Metang
+ cry2 Cry_Metagross
+ cry2 Cry_Bagon
+ cry2 Cry_Shelgon
+ cry2 Cry_Regirock
+ cry2 Cry_Regice
+ cry2 Cry_Registeel
+ cry2 Cry_Castform
+ cry2 Cry_Volbeat
+ cry2 Cry_Illumise
+ cry2 Cry_Poochyena
+ cry2 Cry_Mightyena
+ cry2 Cry_Dusclops
+ cry2 Cry_Sableye
+ cry2 Cry_Mawile
+ cry2 Cry_Aron
+ cry2 Cry_Lairon
+ cry2 Cry_Aggron
+ cry2 Cry_Relicanth
+ cry2 Cry_Luvdisc
+ cry2 Cry_Groudon
+ cry2 Cry_Kyogre
+ cry2 Cry_Rayquaza
+ cry2 Cry_Salamence
+ cry2 Cry_Breloom
+ cry2 Cry_Shroomish
+ cry2 Cry_Linoone
+ cry2 Cry_Tropius
+ cry2 Cry_Wailmer
+ cry2 Cry_Zigzagoon
+ cry2 Cry_Exploud
+ cry2 Cry_Loudred
+ cry2 Cry_Wailord
+ cry2 Cry_Whismur
+ cry2 Cry_Snorunt
+ cry2 Cry_Latios
+ cry2 Cry_Jirachi
+ cry2 Cry_Deoxys
+ cry2 Cry_Chimecho
-gUnknown_848D514:: @ 848D514
- .incbin "baserom.gba", 0x48D514, 0x600
+gUnknown_848ED74:: @ 848ED74
+ .incbin "baserom.gba", 0x48ED74, 0x14528
-gUnknown_848DB14:: @ 848DB14
- .incbin "baserom.gba", 0x48DB14, 0x30
+ .include "sound/music_player_table.inc"
+ .include "sound/song_table.inc"
-gCryTable2:: @ 848DB44
- .incbin "baserom.gba", 0x48DB44, 0x600
+ .align 2
+gDirectSoundWaveData_0:: @ 84A3DA8
+ .incbin "baserom.gba", 0x4A3DA8, 0x6BE1C
+
+ .align 2
+Cry_Bulbasaur:: @ 850FBC4
+ .incbin "sound/direct_sound_samples/cry_bulbasaur.bin"
+
+ .align 2
+Cry_Ivysaur:: @ 8510C50
+ .incbin "sound/direct_sound_samples/cry_ivysaur.bin"
+
+ .align 2
+Cry_Venusaur:: @ 8511CE0
+ .incbin "sound/direct_sound_samples/cry_venusaur.bin"
+
+ .align 2
+Cry_Charmander:: @ 8513038
+ .incbin "sound/direct_sound_samples/cry_charmander.bin"
+
+ .align 2
+Cry_Charmeleon:: @ 8513EA8
+ .incbin "sound/direct_sound_samples/cry_charmeleon.bin"
+
+ .align 2
+Cry_Charizard:: @ 8514D28
+ .incbin "sound/direct_sound_samples/cry_charizard.bin"
+
+ .align 2
+Cry_Squirtle:: @ 8516070
+ .incbin "sound/direct_sound_samples/cry_squirtle.bin"
+
+ .align 2
+Cry_Wartortle:: @ 8516EE4
+ .incbin "sound/direct_sound_samples/cry_wartortle.bin"
+
+ .align 2
+Cry_Blastoise:: @ 8518024
+ .incbin "sound/direct_sound_samples/cry_blastoise.bin"
+
+ .align 2
+Cry_Caterpie:: @ 851936C
+ .incbin "sound/direct_sound_samples/cry_caterpie.bin"
+
+ .align 2
+Cry_Metapod:: @ 8519BC4
+ .incbin "sound/direct_sound_samples/cry_metapod.bin"
+
+ .align 2
+Cry_Butterfree:: @ 851B314
+ .incbin "sound/direct_sound_samples/cry_butterfree.bin"
+
+ .align 2
+Cry_Weedle:: @ 851BD1C
+ .incbin "sound/direct_sound_samples/cry_weedle.bin"
+
+ .align 2
+Cry_Kakuna:: @ 851CD60
+ .incbin "sound/direct_sound_samples/cry_kakuna.bin"
+
+ .align 2
+Cry_Beedrill:: @ 851DF9C
+ .incbin "sound/direct_sound_samples/cry_beedrill.bin"
+
+ .align 2
+Cry_Pidgey:: @ 851F2F8
+ .incbin "sound/direct_sound_samples/cry_pidgey.bin"
+
+ .align 2
+Cry_Pidgeotto:: @ 851F6E0
+ .incbin "sound/direct_sound_samples/cry_pidgeotto.bin"
+
+ .align 2
+Cry_Pidgeot:: @ 85205E8
+ .incbin "sound/direct_sound_samples/cry_pidgeot.bin"
+
+ .align 2
+Cry_Rattata:: @ 852171C
+ .incbin "sound/direct_sound_samples/cry_rattata.bin"
+
+ .align 2
+Cry_Raticate:: @ 8521EFC
+ .incbin "sound/direct_sound_samples/cry_raticate.bin"
+
+ .align 2
+Cry_Spearow:: @ 8522880
+ .incbin "sound/direct_sound_samples/cry_spearow.bin"
+
+ .align 2
+Cry_Fearow:: @ 8523A24
+ .incbin "sound/direct_sound_samples/cry_fearow.bin"
+
+ .align 2
+Cry_Ekans:: @ 8524B60
+ .incbin "sound/direct_sound_samples/cry_ekans.bin"
+
+ .align 2
+Cry_Arbok:: @ 8525EAC
+ .incbin "sound/direct_sound_samples/cry_arbok.bin"
+
+ .align 2
+Cry_Pikachu:: @ 8527204
+ .incbin "sound/direct_sound_samples/cry_pikachu.bin"
+
+ .align 2
+Cry_Raichu:: @ 85282AC
+ .incbin "sound/direct_sound_samples/cry_raichu.bin"
+
+ .align 2
+Cry_Sandshrew:: @ 8529A6C
+ .incbin "sound/direct_sound_samples/cry_sandshrew.bin"
+
+ .align 2
+Cry_Sandslash:: @ 852A3C0
+ .incbin "sound/direct_sound_samples/cry_sandslash.bin"
+
+ .align 2
+Cry_NidoranF:: @ 852B150
+ .incbin "sound/direct_sound_samples/cry_nidoran_f.bin"
+
+ .align 2
+Cry_Nidorina:: @ 852BB00
+ .incbin "sound/direct_sound_samples/cry_nidorina.bin"
+
+ .align 2
+Cry_Nidoqueen:: @ 852C7C8
+ .incbin "sound/direct_sound_samples/cry_nidoqueen.bin"
+
+ .align 2
+Cry_NidoranM:: @ 852D8A8
+ .incbin "sound/direct_sound_samples/cry_nidoran_m.bin"
+
+ .align 2
+Cry_Nidorino:: @ 852E310
+ .incbin "sound/direct_sound_samples/cry_nidorino.bin"
+
+ .align 2
+Cry_Nidoking:: @ 852EF24
+ .incbin "sound/direct_sound_samples/cry_nidoking.bin"
+
+ .align 2
+Cry_Clefairy:: @ 8530790
+ .incbin "sound/direct_sound_samples/cry_clefairy.bin"
+
+ .align 2
+Cry_Clefable:: @ 8531000
+ .incbin "sound/direct_sound_samples/cry_clefable.bin"
+
+ .align 2
+Cry_Vulpix:: @ 8531A90
+ .incbin "sound/direct_sound_samples/cry_vulpix.bin"
+
+ .align 2
+Cry_Ninetales:: @ 8533260
+ .incbin "sound/direct_sound_samples/cry_ninetales.bin"
+
+ .align 2
+Cry_Jigglypuff:: @ 8534ACC
+ .incbin "sound/direct_sound_samples/cry_jigglypuff.bin"
+
+ .align 2
+Cry_Wigglytuff:: @ 8535030
+ .incbin "sound/direct_sound_samples/cry_wigglytuff.bin"
+
+ .align 2
+Cry_Zubat:: @ 85356F8
+ .incbin "sound/direct_sound_samples/cry_zubat.bin"
+
+ .align 2
+Cry_Golbat:: @ 8536A64
+ .incbin "sound/direct_sound_samples/cry_golbat.bin"
+
+ .align 2
+Cry_Oddish:: @ 8537DC8
+ .incbin "sound/direct_sound_samples/cry_oddish.bin"
+
+ .align 2
+Cry_Gloom:: @ 8538C64
+ .incbin "sound/direct_sound_samples/cry_gloom.bin"
+
+ .align 2
+Cry_Vileplume:: @ 85398E0
+ .incbin "sound/direct_sound_samples/cry_vileplume.bin"
+
+ .align 2
+Cry_Paras:: @ 853B27C
+ .incbin "sound/direct_sound_samples/cry_paras.bin"
+
+ .align 2
+Cry_Parasect:: @ 853CE70
+ .incbin "sound/direct_sound_samples/cry_parasect.bin"
+
+ .align 2
+Cry_Venonat:: @ 853ECD8
+ .incbin "sound/direct_sound_samples/cry_venonat.bin"
+
+ .align 2
+Cry_Venomoth:: @ 853FC58
+ .incbin "sound/direct_sound_samples/cry_venomoth.bin"
+
+ .align 2
+Cry_Diglett:: @ 8540C5C
+ .incbin "sound/direct_sound_samples/cry_diglett.bin"
+
+ .align 2
+Cry_Dugtrio:: @ 8541FCC
+ .incbin "sound/direct_sound_samples/cry_dugtrio.bin"
+
+ .align 2
+Cry_Meowth:: @ 8543338
+ .incbin "sound/direct_sound_samples/cry_meowth.bin"
+
+ .align 2
+Cry_Persian:: @ 8543CC8
+ .incbin "sound/direct_sound_samples/cry_persian.bin"
+
+ .align 2
+Cry_Psyduck:: @ 8544FA4
+ .incbin "sound/direct_sound_samples/cry_psyduck.bin"
+
+ .align 2
+Cry_Golduck:: @ 8545CCC
+ .incbin "sound/direct_sound_samples/cry_golduck.bin"
+
+ .align 2
+Cry_Mankey:: @ 8546814
+ .incbin "sound/direct_sound_samples/cry_mankey.bin"
+
+ .align 2
+Cry_Primeape:: @ 8547874
+ .incbin "sound/direct_sound_samples/cry_primeape.bin"
+
+ .align 2
+Cry_Growlithe:: @ 85488A4
+ .incbin "sound/direct_sound_samples/cry_growlithe.bin"
+
+ .align 2
+Cry_Arcanine:: @ 8549608
+ .incbin "sound/direct_sound_samples/cry_arcanine.bin"
+
+ .align 2
+Cry_Poliwag:: @ 854A744
+ .incbin "sound/direct_sound_samples/cry_poliwag.bin"
+
+ .align 2
+Cry_Poliwhirl:: @ 854B260
+ .incbin "sound/direct_sound_samples/cry_poliwhirl.bin"
+
+ .align 2
+Cry_Poliwrath:: @ 854B908
+ .incbin "sound/direct_sound_samples/cry_poliwrath.bin"
+
+ .align 2
+Cry_Abra:: @ 854C42C
+ .incbin "sound/direct_sound_samples/cry_abra.bin"
+
+ .align 2
+Cry_Kadabra:: @ 854DB90
+ .incbin "sound/direct_sound_samples/cry_kadabra.bin"
+
+ .align 2
+Cry_Alakazam:: @ 854F678
+ .incbin "sound/direct_sound_samples/cry_alakazam.bin"
+
+ .align 2
+Cry_Machop:: @ 8551614
+ .incbin "sound/direct_sound_samples/cry_machop.bin"
+
+ .align 2
+Cry_Machoke:: @ 8552378
+ .incbin "sound/direct_sound_samples/cry_machoke.bin"
+
+ .align 2
+Cry_Machamp:: @ 8553108
+ .incbin "sound/direct_sound_samples/cry_machamp.bin"
+
+ .align 2
+Cry_Bellsprout:: @ 8554190
+ .incbin "sound/direct_sound_samples/cry_bellsprout.bin"
+
+ .align 2
+Cry_Weepinbell:: @ 855491C
+ .incbin "sound/direct_sound_samples/cry_weepinbell.bin"
+
+ .align 2
+Cry_Victreebel:: @ 85557BC
+ .incbin "sound/direct_sound_samples/cry_victreebel.bin"
+
+ .align 2
+Cry_Tentacool:: @ 8556B08
+ .incbin "sound/direct_sound_samples/cry_tentacool.bin"
+
+ .align 2
+Cry_Tentacruel:: @ 8557AF8
+ .incbin "sound/direct_sound_samples/cry_tentacruel.bin"
+
+ .align 2
+Cry_Geodude:: @ 85591F4
+ .incbin "sound/direct_sound_samples/cry_geodude.bin"
+
+ .align 2
+Cry_Graveler:: @ 855A9A8
+ .incbin "sound/direct_sound_samples/cry_graveler.bin"
+
+ .align 2
+Cry_Golem:: @ 855C590
+ .incbin "sound/direct_sound_samples/cry_golem.bin"
+
+ .align 2
+Cry_Ponyta:: @ 855D3BC
+ .incbin "sound/direct_sound_samples/cry_ponyta.bin"
+
+ .align 2
+Cry_Rapidash:: @ 855E2CC
+ .incbin "sound/direct_sound_samples/cry_rapidash.bin"
+
+ .align 2
+Cry_Slowpoke:: @ 855F56C
+ .incbin "sound/direct_sound_samples/cry_slowpoke.bin"
+
+ .align 2
+Cry_Slowbro:: @ 855FCD4
+ .incbin "sound/direct_sound_samples/cry_slowbro.bin"
+
+ .align 2
+Cry_Magnemite:: @ 8560A44
+ .incbin "sound/direct_sound_samples/cry_magnemite.bin"
+
+ .align 2
+Cry_Magneton:: @ 8561D88
+ .incbin "sound/direct_sound_samples/cry_magneton.bin"
+
+ .align 2
+Cry_Farfetchd:: @ 8563570
+ .incbin "sound/direct_sound_samples/cry_farfetchd.bin"
+
+ .align 2
+Cry_Doduo:: @ 8563CEC
+ .incbin "sound/direct_sound_samples/cry_doduo.bin"
+
+ .align 2
+Cry_Dodrio:: @ 8565030
+ .incbin "sound/direct_sound_samples/cry_dodrio.bin"
+
+ .align 2
+Cry_Seel:: @ 85663A8
+ .incbin "sound/direct_sound_samples/cry_seel.bin"
+
+ .align 2
+Cry_Dewgong:: @ 8567598
+ .incbin "sound/direct_sound_samples/cry_dewgong.bin"
+
+ .align 2
+Cry_Grimer:: @ 8568ABC
+ .incbin "sound/direct_sound_samples/cry_grimer.bin"
+
+ .align 2
+Cry_Muk:: @ 8569544
+ .incbin "sound/direct_sound_samples/cry_muk.bin"
+
+ .align 2
+Cry_Shellder:: @ 856A404
+ .incbin "sound/direct_sound_samples/cry_shellder.bin"
+
+ .align 2
+Cry_Cloyster:: @ 856B378
+ .incbin "sound/direct_sound_samples/cry_cloyster.bin"
+
+ .align 2
+Cry_Gastly:: @ 856C83C
+ .incbin "sound/direct_sound_samples/cry_gastly.bin"
+
+ .align 2
+Cry_Haunter:: @ 856DF8C
+ .incbin "sound/direct_sound_samples/cry_haunter.bin"
+
+ .align 2
+Cry_Gengar:: @ 856F70C
+ .incbin "sound/direct_sound_samples/cry_gengar.bin"
+
+ .align 2
+Cry_Onix:: @ 85705CC
+ .incbin "sound/direct_sound_samples/cry_onix.bin"
+
+ .align 2
+Cry_Drowzee:: @ 8571E90
+ .incbin "sound/direct_sound_samples/cry_drowzee.bin"
+
+ .align 2
+Cry_Hypno:: @ 8573BA8
+ .incbin "sound/direct_sound_samples/cry_hypno.bin"
+
+ .align 2
+Cry_Krabby:: @ 85758AC
+ .incbin "sound/direct_sound_samples/cry_krabby.bin"
+
+ .align 2
+Cry_Kingler:: @ 85770F8
+ .incbin "sound/direct_sound_samples/cry_kingler.bin"
+
+ .align 2
+Cry_Voltorb:: @ 8578950
+ .incbin "sound/direct_sound_samples/cry_voltorb.bin"
+
+ .align 2
+Cry_Electrode:: @ 857A214
+ .incbin "sound/direct_sound_samples/cry_electrode.bin"
+
+ .align 2
+Cry_Exeggcute:: @ 857BB4C
+ .incbin "sound/direct_sound_samples/cry_exeggcute.bin"
+
+ .align 2
+Cry_Exeggutor:: @ 857CE2C
+ .incbin "sound/direct_sound_samples/cry_exeggutor.bin"
+
+ .align 2
+Cry_Cubone:: @ 857EE10
+ .incbin "sound/direct_sound_samples/cry_cubone.bin"
+
+ .align 2
+Cry_Marowak:: @ 857FD30
+ .incbin "sound/direct_sound_samples/cry_marowak.bin"
+
+ .align 2
+Cry_Hitmonlee:: @ 8580BA0
+ .incbin "sound/direct_sound_samples/cry_hitmonlee.bin"
+
+ .align 2
+Cry_Hitmonchan:: @ 8581E4C
+ .incbin "sound/direct_sound_samples/cry_hitmonchan.bin"
+
+ .align 2
+Cry_Lickitung:: @ 8583024
+ .incbin "sound/direct_sound_samples/cry_lickitung.bin"
+
+ .align 2
+Cry_Koffing:: @ 8583F4C
+ .incbin "sound/direct_sound_samples/cry_koffing.bin"
+
+ .align 2
+Cry_Weezing:: @ 85853A8
+ .incbin "sound/direct_sound_samples/cry_weezing.bin"
+
+ .align 2
+Cry_Rhyhorn:: @ 8586954
+ .incbin "sound/direct_sound_samples/cry_rhyhorn.bin"
+
+ .align 2
+Cry_Rhydon:: @ 8587CC0
+ .incbin "sound/direct_sound_samples/cry_rhydon.bin"
+
+ .align 2
+Cry_Chansey:: @ 858912C
+ .incbin "sound/direct_sound_samples/cry_chansey.bin"
+
+ .align 2
+Cry_Tangela:: @ 8589FF8
+ .incbin "sound/direct_sound_samples/cry_tangela.bin"
+
+ .align 2
+Cry_Kangaskhan:: @ 858AF14
+ .incbin "sound/direct_sound_samples/cry_kangaskhan.bin"
+
+ .align 2
+Cry_Horsea:: @ 858C1C8
+ .incbin "sound/direct_sound_samples/cry_horsea.bin"
+
+ .align 2
+Cry_Seadra:: @ 858CB44
+ .incbin "sound/direct_sound_samples/cry_seadra.bin"
+
+ .align 2
+Cry_Goldeen:: @ 858D3B0
+ .incbin "sound/direct_sound_samples/cry_goldeen.bin"
+
+ .align 2
+Cry_Seaking:: @ 858DD88
+ .incbin "sound/direct_sound_samples/cry_seaking.bin"
+
+ .align 2
+Cry_Staryu:: @ 858F0E0
+ .incbin "sound/direct_sound_samples/cry_staryu.bin"
+
+ .align 2
+Cry_Starmie:: @ 85904C8
+ .incbin "sound/direct_sound_samples/cry_starmie.bin"
+
+ .align 2
+Cry_MrMime:: @ 85919A4
+ .incbin "sound/direct_sound_samples/cry_mr_mime.bin"
+
+ .align 2
+Cry_Scyther:: @ 8592C94
+ .incbin "sound/direct_sound_samples/cry_scyther.bin"
+
+ .align 2
+Cry_Jynx:: @ 85939F0
+ .incbin "sound/direct_sound_samples/cry_jynx.bin"
+
+ .align 2
+Cry_Electabuzz:: @ 8596964
+ .incbin "sound/direct_sound_samples/cry_electabuzz.bin"
+
+ .align 2
+Cry_Magmar:: @ 8598848
+ .incbin "sound/direct_sound_samples/cry_magmar.bin"
+
+ .align 2
+Cry_Pinsir:: @ 85997C4
+ .incbin "sound/direct_sound_samples/cry_pinsir.bin"
+
+ .align 2
+Cry_Tauros:: @ 859A420
+ .incbin "sound/direct_sound_samples/cry_tauros.bin"
+
+ .align 2
+Cry_Magikarp:: @ 859B674
+ .incbin "sound/direct_sound_samples/cry_magikarp.bin"
+
+ .align 2
+Cry_Gyarados:: @ 859C97C
+ .incbin "sound/direct_sound_samples/cry_gyarados.bin"
+
+ .align 2
+Cry_Lapras:: @ 859DDB0
+ .incbin "sound/direct_sound_samples/cry_lapras.bin"
+
+ .align 2
+Cry_Ditto:: @ 859EC84
+ .incbin "sound/direct_sound_samples/cry_ditto.bin"
+
+ .align 2
+Cry_Eevee:: @ 859F7A0
+ .incbin "sound/direct_sound_samples/cry_eevee.bin"
+
+ .align 2
+Cry_Vaporeon:: @ 85A05D8
+ .incbin "sound/direct_sound_samples/cry_vaporeon.bin"
+
+ .align 2
+Cry_Jolteon:: @ 85A1BF0
+ .incbin "sound/direct_sound_samples/cry_jolteon.bin"
+
+ .align 2
+Cry_Flareon:: @ 85A2BC4
+ .incbin "sound/direct_sound_samples/cry_flareon.bin"
+
+ .align 2
+Cry_Porygon:: @ 85A3B48
+ .incbin "sound/direct_sound_samples/cry_porygon.bin"
+
+ .align 2
+Cry_Omanyte:: @ 85A4F54
+ .incbin "sound/direct_sound_samples/cry_omanyte.bin"
+
+ .align 2
+Cry_Omastar:: @ 85A5CAC
+ .incbin "sound/direct_sound_samples/cry_omastar.bin"
+
+ .align 2
+Cry_Kabuto:: @ 85A6A00
+ .incbin "sound/direct_sound_samples/cry_kabuto.bin"
+
+ .align 2
+Cry_Kabutops:: @ 85A7654
+ .incbin "sound/direct_sound_samples/cry_kabutops.bin"
+
+ .align 2
+Cry_Aerodactyl:: @ 85A8410
+ .incbin "sound/direct_sound_samples/cry_aerodactyl.bin"
+
+ .align 2
+Cry_Snorlax:: @ 85A9C6C
+ .incbin "sound/direct_sound_samples/cry_snorlax.bin"
+
+ .align 2
+Cry_Articuno:: @ 85AA1A8
+ .incbin "sound/direct_sound_samples/cry_articuno.bin"
+
+ .align 2
+Cry_Zapdos:: @ 85AB950
+ .incbin "sound/direct_sound_samples/cry_zapdos.bin"
+
+ .align 2
+Cry_Moltres:: @ 85AC8C8
+ .incbin "sound/direct_sound_samples/cry_moltres.bin"
+
+ .align 2
+Cry_Dratini:: @ 85AE074
+ .incbin "sound/direct_sound_samples/cry_dratini.bin"
+
+ .align 2
+Cry_Dragonair:: @ 85AEC10
+ .incbin "sound/direct_sound_samples/cry_dragonair.bin"
+
+ .align 2
+Cry_Dragonite:: @ 85AFCB8
+ .incbin "sound/direct_sound_samples/cry_dragonite.bin"
+
+ .align 2
+Cry_Mewtwo:: @ 85B0FC4
+ .incbin "sound/direct_sound_samples/cry_mewtwo.bin"
+
+ .align 2
+Cry_Mew:: @ 85B2E2C
+ .incbin "sound/direct_sound_samples/cry_mew.bin"
+
+ .align 2
+Cry_Chikorita:: @ 85B4C94
+ .incbin "sound/direct_sound_samples/cry_chikorita.bin"
+
+ .align 2
+Cry_Bayleef:: @ 85B51D4
+ .incbin "sound/direct_sound_samples/cry_bayleef.bin"
+
+ .align 2
+Cry_Meganium:: @ 85B5AA0
+ .incbin "sound/direct_sound_samples/cry_meganium.bin"
+
+ .align 2
+Cry_Cyndaquil:: @ 85B6AD8
+ .incbin "sound/direct_sound_samples/cry_cyndaquil.bin"
+
+ .align 2
+Cry_Quilava:: @ 85B71DC
+ .incbin "sound/direct_sound_samples/cry_quilava.bin"
+
+ .align 2
+Cry_Typhlosion:: @ 85B7DC4
+ .incbin "sound/direct_sound_samples/cry_typhlosion.bin"
+
+ .align 2
+Cry_Totodile:: @ 85BA3D4
+ .incbin "sound/direct_sound_samples/cry_totodile.bin"
+
+ .align 2
+Cry_Croconaw:: @ 85BB62C
+ .incbin "sound/direct_sound_samples/cry_croconaw.bin"
+
+ .align 2
+Cry_Feraligatr:: @ 85BCA68
+ .incbin "sound/direct_sound_samples/cry_feraligatr.bin"
+
+ .align 2
+Cry_Sentret:: @ 85BE3EC
+ .incbin "sound/direct_sound_samples/cry_sentret.bin"
+
+ .align 2
+Cry_Furret:: @ 85BE814
+ .incbin "sound/direct_sound_samples/cry_furret.bin"
+
+ .align 2
+Cry_Hoothoot:: @ 85BEE5C
+ .incbin "sound/direct_sound_samples/cry_hoothoot.bin"
+
+ .align 2
+Cry_Noctowl:: @ 85BF940
+ .incbin "sound/direct_sound_samples/cry_noctowl.bin"
+
+ .align 2
+Cry_Ledyba:: @ 85C0E70
+ .incbin "sound/direct_sound_samples/cry_ledyba.bin"
+
+ .align 2
+Cry_Ledian:: @ 85C1568
+ .incbin "sound/direct_sound_samples/cry_ledian.bin"
+
+ .align 2
+Cry_Spinarak:: @ 85C1DCC
+ .incbin "sound/direct_sound_samples/cry_spinarak.bin"
+
+ .align 2
+Cry_Ariados:: @ 85C2B30
+ .incbin "sound/direct_sound_samples/cry_ariados.bin"
+
+ .align 2
+Cry_Crobat:: @ 85C3784
+ .incbin "sound/direct_sound_samples/cry_crobat.bin"
+
+ .align 2
+Cry_Chinchou:: @ 85C4EB4
+ .incbin "sound/direct_sound_samples/cry_chinchou.bin"
+
+ .align 2
+Cry_Lanturn:: @ 85C5B64
+ .incbin "sound/direct_sound_samples/cry_lanturn.bin"
+
+ .align 2
+Cry_Pichu:: @ 85C65F0
+ .incbin "sound/direct_sound_samples/cry_pichu.bin"
+
+ .align 2
+Cry_Cleffa:: @ 85C6D44
+ .incbin "sound/direct_sound_samples/cry_cleffa.bin"
+
+ .align 2
+Cry_Igglybuff:: @ 85C7334
+ .incbin "sound/direct_sound_samples/cry_igglybuff.bin"
+
+ .align 2
+Cry_Togepi:: @ 85C7A30
+ .incbin "sound/direct_sound_samples/cry_togepi.bin"
+
+ .align 2
+Cry_Togetic:: @ 85C8518
+ .incbin "sound/direct_sound_samples/cry_togetic.bin"
+
+ .align 2
+Cry_Natu:: @ 85C8C18
+ .incbin "sound/direct_sound_samples/cry_natu.bin"
+
+ .align 2
+Cry_Xatu:: @ 85C96A8
+ .incbin "sound/direct_sound_samples/cry_xatu.bin"
+
+ .align 2
+Cry_Mareep:: @ 85CA574
+ .incbin "sound/direct_sound_samples/cry_mareep.bin"
+
+ .align 2
+Cry_Flaaffy:: @ 85CACCC
+ .incbin "sound/direct_sound_samples/cry_flaaffy.bin"
+
+ .align 2
+Cry_Ampharos:: @ 85CBA80
+ .incbin "sound/direct_sound_samples/cry_ampharos.bin"
+
+ .align 2
+Cry_Bellossom:: @ 85CCB00
+ .incbin "sound/direct_sound_samples/cry_bellossom.bin"
+
+ .align 2
+Cry_Marill:: @ 85CD918
+ .incbin "sound/direct_sound_samples/cry_marill.bin"
+
+ .align 2
+Cry_Azumarill:: @ 85CE62C
+ .incbin "sound/direct_sound_samples/cry_azumarill.bin"
+
+ .align 2
+Cry_Sudowoodo:: @ 85CF718
+ .incbin "sound/direct_sound_samples/cry_sudowoodo.bin"
+
+ .align 2
+Cry_Politoed:: @ 85D0748
+ .incbin "sound/direct_sound_samples/cry_politoed.bin"
+
+ .align 2
+Cry_Hoppip:: @ 85D198C
+ .incbin "sound/direct_sound_samples/cry_hoppip.bin"
+
+ .align 2
+Cry_Skiploom:: @ 85D21F8
+ .incbin "sound/direct_sound_samples/cry_skiploom.bin"
+
+ .align 2
+Cry_Jumpluff:: @ 85D2F00
+ .incbin "sound/direct_sound_samples/cry_jumpluff.bin"
+
+ .align 2
+Cry_Aipom:: @ 85D3F3C
+ .incbin "sound/direct_sound_samples/cry_aipom.bin"
+
+ .align 2
+Cry_Sunkern:: @ 85D4D5C
+ .incbin "sound/direct_sound_samples/cry_sunkern.bin"
+
+ .align 2
+Cry_Sunflora:: @ 85D5570
+ .incbin "sound/direct_sound_samples/cry_sunflora.bin"
+
+ .align 2
+Cry_Yanma:: @ 85D6550
+ .incbin "sound/direct_sound_samples/cry_yanma.bin"
+
+ .align 2
+Cry_Wooper:: @ 85D7658
+ .incbin "sound/direct_sound_samples/cry_wooper.bin"
+
+ .align 2
+Cry_Quagsire:: @ 85D7DB8
+ .incbin "sound/direct_sound_samples/cry_quagsire.bin"
+
+ .align 2
+Cry_Espeon:: @ 85D8B18
+ .incbin "sound/direct_sound_samples/cry_espeon.bin"
+
+ .align 2
+Cry_Umbreon:: @ 85D9ECC
+ .incbin "sound/direct_sound_samples/cry_umbreon.bin"
+
+ .align 2
+Cry_Murkrow:: @ 85DAE4C
+ .incbin "sound/direct_sound_samples/cry_murkrow.bin"
+
+ .align 2
+Cry_Slowking:: @ 85DBF10
+ .incbin "sound/direct_sound_samples/cry_slowking.bin"
+
+ .align 2
+Cry_Misdreavus:: @ 85DD6F4
+ .incbin "sound/direct_sound_samples/cry_misdreavus.bin"
+
+ .align 2
+Cry_Unown:: @ 85DE294
+ .incbin "sound/direct_sound_samples/cry_unown.bin"
+
+ .align 2
+Cry_Wobbuffet:: @ 85DEFBC
+ .incbin "sound/direct_sound_samples/cry_wobbuffet.bin"
+
+ .align 2
+Cry_Girafarig:: @ 85E0458
+ .incbin "sound/direct_sound_samples/cry_girafarig.bin"
+
+ .align 2
+Cry_Pineco:: @ 85E130C
+ .incbin "sound/direct_sound_samples/cry_pineco.bin"
+
+ .align 2
+Cry_Forretress:: @ 85E206C
+ .incbin "sound/direct_sound_samples/cry_forretress.bin"
+
+ .align 2
+Cry_Dunsparce:: @ 85E3474
+ .incbin "sound/direct_sound_samples/cry_dunsparce.bin"
+
+ .align 2
+Cry_Gligar:: @ 85E4454
+ .incbin "sound/direct_sound_samples/cry_gligar.bin"
+
+ .align 2
+Cry_Steelix:: @ 85E5074
+ .incbin "sound/direct_sound_samples/cry_steelix.bin"
+
+ .align 2
+Cry_Snubbull:: @ 85E769C
+ .incbin "sound/direct_sound_samples/cry_snubbull.bin"
+
+ .align 2
+Cry_Granbull:: @ 85E8510
+ .incbin "sound/direct_sound_samples/cry_granbull.bin"
+
+ .align 2
+Cry_Qwilfish:: @ 85E9CB4
+ .incbin "sound/direct_sound_samples/cry_qwilfish.bin"
+
+ .align 2
+Cry_Scizor:: @ 85EA850
+ .incbin "sound/direct_sound_samples/cry_scizor.bin"
+
+ .align 2
+Cry_Shuckle:: @ 85EBF4C
+ .incbin "sound/direct_sound_samples/cry_shuckle.bin"
+
+ .align 2
+Cry_Heracross:: @ 85EC980
+ .incbin "sound/direct_sound_samples/cry_heracross.bin"
+
+ .align 2
+Cry_Sneasel:: @ 85EDBD4
+ .incbin "sound/direct_sound_samples/cry_sneasel.bin"
+
+ .align 2
+Cry_Teddiursa:: @ 85EE4F8
+ .incbin "sound/direct_sound_samples/cry_teddiursa.bin"
+
+ .align 2
+Cry_Ursaring:: @ 85EF584
+ .incbin "sound/direct_sound_samples/cry_ursaring.bin"
+
+ .align 2
+Cry_Slugma:: @ 85F135C
+ .incbin "sound/direct_sound_samples/cry_slugma.bin"
+
+ .align 2
+Cry_Magcargo:: @ 85F2474
+ .incbin "sound/direct_sound_samples/cry_magcargo.bin"
+
+ .align 2
+Cry_Swinub:: @ 85F397C
+ .incbin "sound/direct_sound_samples/cry_swinub.bin"
+
+ .align 2
+Cry_Piloswine:: @ 85F4624
+ .incbin "sound/direct_sound_samples/cry_piloswine.bin"
+
+ .align 2
+Cry_Corsola:: @ 85F5318
+ .incbin "sound/direct_sound_samples/cry_corsola.bin"
+
+ .align 2
+Cry_Remoraid:: @ 85F5FF8
+ .incbin "sound/direct_sound_samples/cry_remoraid.bin"
+
+ .align 2
+Cry_Octillery:: @ 85F6A88
+ .incbin "sound/direct_sound_samples/cry_octillery.bin"
+
+ .align 2
+Cry_Delibird:: @ 85F84CC
+ .incbin "sound/direct_sound_samples/cry_delibird.bin"
+
+ .align 2
+Cry_Mantine:: @ 85F9500
+ .incbin "sound/direct_sound_samples/cry_mantine.bin"
+
+ .align 2
+Cry_Skarmory:: @ 85FA4C8
+ .incbin "sound/direct_sound_samples/cry_skarmory.bin"
+
+ .align 2
+Cry_Houndour:: @ 85FBCD0
+ .incbin "sound/direct_sound_samples/cry_houndour.bin"
+
+ .align 2
+Cry_Houndoom:: @ 85FC978
+ .incbin "sound/direct_sound_samples/cry_houndoom.bin"
+
+ .align 2
+Cry_Kingdra:: @ 85FDD28
+ .incbin "sound/direct_sound_samples/cry_kingdra.bin"
+
+ .align 2
+Cry_Phanpy:: @ 85FEB00
+ .incbin "sound/direct_sound_samples/cry_phanpy.bin"
+
+ .align 2
+Cry_Donphan:: @ 85FF650
+ .incbin "sound/direct_sound_samples/cry_donphan.bin"
+
+ .align 2
+Cry_Porygon2:: @ 8600774
+ .incbin "sound/direct_sound_samples/cry_porygon2.bin"
+
+ .align 2
+Cry_Stantler:: @ 860172C
+ .incbin "sound/direct_sound_samples/cry_stantler.bin"
+
+ .align 2
+Cry_Smeargle:: @ 8602DA8
+ .incbin "sound/direct_sound_samples/cry_smeargle.bin"
+
+ .align 2
+Cry_Tyrogue:: @ 86037DC
+ .incbin "sound/direct_sound_samples/cry_tyrogue.bin"
+
+ .align 2
+Cry_Hitmontop:: @ 8604804
+ .incbin "sound/direct_sound_samples/cry_hitmontop.bin"
+
+ .align 2
+Cry_Smoochum:: @ 86055E4
+ .incbin "sound/direct_sound_samples/cry_smoochum.bin"
+
+ .align 2
+Cry_Elekid:: @ 8606198
+ .incbin "sound/direct_sound_samples/cry_elekid.bin"
+
+ .align 2
+Cry_Magby:: @ 8606C24
+ .incbin "sound/direct_sound_samples/cry_magby.bin"
+
+ .align 2
+Cry_Miltank:: @ 8607A94
+ .incbin "sound/direct_sound_samples/cry_miltank.bin"
+
+ .align 2
+Cry_Blissey:: @ 8608970
+ .incbin "sound/direct_sound_samples/cry_blissey.bin"
+
+ .align 2
+Cry_Raikou:: @ 8609A04
+ .incbin "sound/direct_sound_samples/cry_raikou.bin"
+
+ .align 2
+Cry_Entei:: @ 860AB74
+ .incbin "sound/direct_sound_samples/cry_entei.bin"
+
+ .align 2
+Cry_Suicune:: @ 860BFE8
+ .incbin "sound/direct_sound_samples/cry_suicune.bin"
+
+ .align 2
+Cry_Larvitar:: @ 860D230
+ .incbin "sound/direct_sound_samples/cry_larvitar.bin"
+
+ .align 2
+Cry_Pupitar:: @ 860DEE0
+ .incbin "sound/direct_sound_samples/cry_pupitar.bin"
+
+ .align 2
+Cry_Tyranitar:: @ 860E750
+ .incbin "sound/direct_sound_samples/cry_tyranitar.bin"
+
+ .align 2
+Cry_Lugia:: @ 860FEB0
+ .incbin "sound/direct_sound_samples/cry_lugia.bin"
+
+ .align 2
+Cry_HoOh:: @ 86124A8
+ .incbin "sound/direct_sound_samples/cry_ho_oh.bin"
+
+ .align 2
+Cry_Celebi:: @ 8613B3C
+ .incbin "sound/direct_sound_samples/cry_celebi.bin"
+
+ .align 2
+Cry_Kecleon:: @ 86149B4
+ .incbin "sound/direct_sound_samples/cry_kecleon.bin"
+
+ .align 2
+Cry_Roselia:: @ 8615214
+ .incbin "sound/direct_sound_samples/cry_roselia.bin"
+
+ .align 2
+Cry_Torkoal:: @ 8615CD4
+ .incbin "sound/direct_sound_samples/cry_torkoal.bin"
+
+ .align 2
+Cry_Electrike:: @ 8616620
+ .incbin "sound/direct_sound_samples/cry_electrike.bin"
+
+ .align 2
+Cry_Manectric:: @ 861727C
+ .incbin "sound/direct_sound_samples/cry_manectric.bin"
+
+ .align 2
+Cry_Duskull:: @ 8618784
+ .incbin "sound/direct_sound_samples/cry_duskull.bin"
+
+ .align 2
+Cry_Latias:: @ 861921C
+ .incbin "sound/direct_sound_samples/cry_latias.bin"
+
+ .align 2
+Cry_Wynaut:: @ 8619E4C
+ .incbin "sound/direct_sound_samples/cry_wynaut.bin"
+
+ .align 2
+Cry_Seviper:: @ 861AC2C
+ .incbin "sound/direct_sound_samples/cry_seviper.bin"
+
+ .align 2
+Cry_Sharpedo:: @ 861B7CC
+ .incbin "sound/direct_sound_samples/cry_sharpedo.bin"
+
+ .align 2
+Cry_Zangoose:: @ 861CED8
+ .incbin "sound/direct_sound_samples/cry_zangoose.bin"
+
+ .align 2
+Cry_Azurill:: @ 861D868
+ .incbin "sound/direct_sound_samples/cry_azurill.bin"
+
+ .align 2
+Cry_Swablu:: @ 861E2D0
+ .incbin "sound/direct_sound_samples/cry_swablu.bin"
+
+ .align 2
+Cry_Altaria:: @ 861E868
+ .incbin "sound/direct_sound_samples/cry_altaria.bin"
+
+ .align 2
+Cry_Unused265:: @ 861F384
+ .incbin "sound/direct_sound_samples/cry_unused_265.bin"
+
+ .align 2
+Cry_Taillow:: @ 861FCD8
+ .incbin "sound/direct_sound_samples/cry_taillow.bin"
+
+ .align 2
+Cry_Swellow:: @ 86202D8
+ .incbin "sound/direct_sound_samples/cry_swellow.bin"
+
+ .align 2
+Cry_Unused268:: @ 8620BDC
+ .incbin "sound/direct_sound_samples/cry_unused_268.bin"
+
+ .align 2
+Cry_Spinda:: @ 8621D8C
+ .incbin "sound/direct_sound_samples/cry_spinda.bin"
+
+ .align 2
+Cry_Torchic:: @ 86229F8
+ .incbin "sound/direct_sound_samples/cry_torchic.bin"
+
+ .align 2
+Cry_Combusken:: @ 86233A0
+ .incbin "sound/direct_sound_samples/cry_combusken.bin"
+
+ .align 2
+Cry_Blaziken:: @ 8625074
+ .incbin "sound/direct_sound_samples/cry_blaziken.bin"
+
+ .align 2
+Cry_Treecko:: @ 8626FF4
+ .incbin "sound/direct_sound_samples/cry_treecko.bin"
+
+ .align 2
+Cry_Grovyle:: @ 8627B9C
+ .incbin "sound/direct_sound_samples/cry_grovyle.bin"
+
+ .align 2
+Cry_Sceptile:: @ 8629010
+ .incbin "sound/direct_sound_samples/cry_sceptile.bin"
+
+ .align 2
+Cry_Mudkip:: @ 862AA2C
+ .incbin "sound/direct_sound_samples/cry_mudkip.bin"
+
+ .align 2
+Cry_Marshtomp:: @ 862B1B0
+ .incbin "sound/direct_sound_samples/cry_marshtomp.bin"
+
+ .align 2
+Cry_Swampert:: @ 862C2B4
+ .incbin "sound/direct_sound_samples/cry_swampert.bin"
+
+ .align 2
+Cry_Pelipper:: @ 862D934
+ .incbin "sound/direct_sound_samples/cry_pelipper.bin"
+
+ .align 2
+Cry_Wingull:: @ 862E4FC
+ .incbin "sound/direct_sound_samples/cry_wingull.bin"
+
+ .align 2
+Cry_Banette:: @ 862F13C
+ .incbin "sound/direct_sound_samples/cry_banette.bin"
+
+ .align 2
+Cry_Shuppet:: @ 862FDE4
+ .incbin "sound/direct_sound_samples/cry_shuppet.bin"
+
+ .align 2
+Cry_Lotad:: @ 8630624
+ .incbin "sound/direct_sound_samples/cry_lotad.bin"
+
+ .align 2
+Cry_Lombre:: @ 8630A8C
+ .incbin "sound/direct_sound_samples/cry_lombre.bin"
+
+ .align 2
+Cry_Ludicolo:: @ 8631920
+ .incbin "sound/direct_sound_samples/cry_ludicolo.bin"
+
+ .align 2
+Cry_Seedot:: @ 86329F0
+ .incbin "sound/direct_sound_samples/cry_seedot.bin"
+
+ .align 2
+Cry_Nuzleaf:: @ 863321C
+ .incbin "sound/direct_sound_samples/cry_nuzleaf.bin"
+
+ .align 2
+Cry_Shiftry:: @ 8633D84
+ .incbin "sound/direct_sound_samples/cry_shiftry.bin"
+
+ .align 2
+Cry_Carvanha:: @ 8635148
+ .incbin "sound/direct_sound_samples/cry_carvanha.bin"
+
+ .align 2
+Cry_Wurmple:: @ 8635B5C
+ .incbin "sound/direct_sound_samples/cry_wurmple.bin"
+
+ .align 2
+Cry_Silcoon:: @ 8636428
+ .incbin "sound/direct_sound_samples/cry_silcoon.bin"
+
+ .align 2
+Cry_Beautifly:: @ 8637454
+ .incbin "sound/direct_sound_samples/cry_beautifly.bin"
+
+ .align 2
+Cry_Cascoon:: @ 8637C8C
+ .incbin "sound/direct_sound_samples/cry_cascoon.bin"
+
+ .align 2
+Cry_Dustox:: @ 8638CD0
+ .incbin "sound/direct_sound_samples/cry_dustox.bin"
+
+ .align 2
+Cry_Ralts:: @ 863997C
+ .incbin "sound/direct_sound_samples/cry_ralts.bin"
+
+ .align 2
+Cry_Kirlia:: @ 863A398
+ .incbin "sound/direct_sound_samples/cry_kirlia.bin"
+
+ .align 2
+Cry_Gardevoir:: @ 863AFC8
+ .incbin "sound/direct_sound_samples/cry_gardevoir.bin"
+
+ .align 2
+Cry_Slakoth:: @ 863C82C
+ .incbin "sound/direct_sound_samples/cry_slakoth.bin"
+
+ .align 2
+Cry_Vigoroth:: @ 863D0B0
+ .incbin "sound/direct_sound_samples/cry_vigoroth.bin"
+
+ .align 2
+Cry_Slaking:: @ 863DF08
+ .incbin "sound/direct_sound_samples/cry_slaking.bin"
+
+ .align 2
+Cry_Nincada:: @ 863E8F4
+ .incbin "sound/direct_sound_samples/cry_nincada.bin"
+
+ .align 2
+Cry_Ninjask:: @ 863EF64
+ .incbin "sound/direct_sound_samples/cry_ninjask.bin"
+
+ .align 2
+Cry_Shedinja:: @ 863FB8C
+ .incbin "sound/direct_sound_samples/cry_shedinja.bin"
+
+ .align 2
+Cry_Makuhita:: @ 8640344
+ .incbin "sound/direct_sound_samples/cry_makuhita.bin"
+
+ .align 2
+Cry_Hariyama:: @ 8640AA0
+ .incbin "sound/direct_sound_samples/cry_hariyama.bin"
+
+ .align 2
+Cry_Nosepass:: @ 8641B58
+ .incbin "sound/direct_sound_samples/cry_nosepass.bin"
+
+ .align 2
+Cry_Glalie:: @ 86428BC
+ .incbin "sound/direct_sound_samples/cry_glalie.bin"
+
+ .align 2
+Cry_Plusle:: @ 8643DA0
+ .incbin "sound/direct_sound_samples/cry_plusle.bin"
+
+ .align 2
+Cry_Minun:: @ 864469C
+ .incbin "sound/direct_sound_samples/cry_minun.bin"
+
+ .align 2
+Cry_Surskit:: @ 86456A4
+ .incbin "sound/direct_sound_samples/cry_surskit.bin"
+
+ .align 2
+Cry_Masquerain:: @ 8646124
+ .incbin "sound/direct_sound_samples/cry_masquerain.bin"
+
+ .align 2
+Cry_Skitty:: @ 86474D8
+ .incbin "sound/direct_sound_samples/cry_skitty.bin"
+
+ .align 2
+Cry_Delcatty:: @ 8647BEC
+ .incbin "sound/direct_sound_samples/cry_delcatty.bin"
+
+ .align 2
+Cry_Gulpin:: @ 8649104
+ .incbin "sound/direct_sound_samples/cry_gulpin.bin"
+
+ .align 2
+Cry_Swalot:: @ 8649908
+ .incbin "sound/direct_sound_samples/cry_swalot.bin"
+
+ .align 2
+Cry_Numel:: @ 864AA68
+ .incbin "sound/direct_sound_samples/cry_numel.bin"
+
+ .align 2
+Cry_Camerupt:: @ 864B3B4
+ .incbin "sound/direct_sound_samples/cry_camerupt.bin"
+
+ .align 2
+Cry_Barboach:: @ 864CAD4
+ .incbin "sound/direct_sound_samples/cry_barboach.bin"
+
+ .align 2
+Cry_Whiscash:: @ 864D410
+ .incbin "sound/direct_sound_samples/cry_whiscash.bin"
+
+ .align 2
+Cry_Corphish:: @ 864E50C
+ .incbin "sound/direct_sound_samples/cry_corphish.bin"
+
+ .align 2
+Cry_Crawdaunt:: @ 864F110
+ .incbin "sound/direct_sound_samples/cry_crawdaunt.bin"
+
+ .align 2
+Cry_Spoink:: @ 86509C8
+ .incbin "sound/direct_sound_samples/cry_spoink.bin"
+
+ .align 2
+Cry_Grumpig:: @ 8651108
+ .incbin "sound/direct_sound_samples/cry_grumpig.bin"
+
+ .align 2
+Cry_Trapinch:: @ 8651DA8
+ .incbin "sound/direct_sound_samples/cry_trapinch.bin"
+
+ .align 2
+Cry_Vibrava:: @ 86527CC
+ .incbin "sound/direct_sound_samples/cry_vibrava.bin"
+
+ .align 2
+Cry_Flygon:: @ 86535D0
+ .incbin "sound/direct_sound_samples/cry_flygon.bin"
+
+ .align 2
+Cry_Cacnea:: @ 8654FD8
+ .incbin "sound/direct_sound_samples/cry_cacnea.bin"
+
+ .align 2
+Cry_Cacturne:: @ 86558C8
+ .incbin "sound/direct_sound_samples/cry_cacturne.bin"
+
+ .align 2
+Cry_Baltoy:: @ 8656F78
+ .incbin "sound/direct_sound_samples/cry_baltoy.bin"
+
+ .align 2
+Cry_Claydol:: @ 8657BFC
+ .incbin "sound/direct_sound_samples/cry_claydol.bin"
+
+ .align 2
+Cry_Lunatone:: @ 8658F5C
+ .incbin "sound/direct_sound_samples/cry_lunatone.bin"
+
+ .align 2
+Cry_Solrock:: @ 865A758
+ .incbin "sound/direct_sound_samples/cry_solrock.bin"
+
+ .align 2
+Cry_Feebas:: @ 865B784
+ .incbin "sound/direct_sound_samples/cry_feebas.bin"
+
+ .align 2
+Cry_Milotic:: @ 865BF58
+ .incbin "sound/direct_sound_samples/cry_milotic.bin"
+
+ .align 2
+Cry_Absol:: @ 865E69C
+ .incbin "sound/direct_sound_samples/cry_absol.bin"
+
+ .align 2
+Cry_Meditite:: @ 865F118
+ .incbin "sound/direct_sound_samples/cry_meditite.bin"
+
+ .align 2
+Cry_Medicham:: @ 865F938
+ .incbin "sound/direct_sound_samples/cry_medicham.bin"
+
+ .align 2
+Cry_Spheal:: @ 86609BC
+ .incbin "sound/direct_sound_samples/cry_spheal.bin"
+
+ .align 2
+Cry_Sealeo:: @ 8660F70
+ .incbin "sound/direct_sound_samples/cry_sealeo.bin"
+
+ .align 2
+Cry_Walrein:: @ 8661B48
+ .incbin "sound/direct_sound_samples/cry_walrein.bin"
+
+ .align 2
+Cry_Clamperl:: @ 8663F94
+ .incbin "sound/direct_sound_samples/cry_clamperl.bin"
+
+ .align 2
+Cry_Huntail:: @ 86651E4
+ .incbin "sound/direct_sound_samples/cry_huntail.bin"
+
+ .align 2
+Cry_Gorebyss:: @ 86661CC
+ .incbin "sound/direct_sound_samples/cry_gorebyss.bin"
+
+ .align 2
+Cry_Lileep:: @ 8667838
+ .incbin "sound/direct_sound_samples/cry_lileep.bin"
+
+ .align 2
+Cry_Cradily:: @ 86681E0
+ .incbin "sound/direct_sound_samples/cry_cradily.bin"
+
+ .align 2
+Cry_Anorith:: @ 8669F10
+ .incbin "sound/direct_sound_samples/cry_anorith.bin"
+
+ .align 2
+Cry_Armaldo:: @ 866AAC8
+ .incbin "sound/direct_sound_samples/cry_armaldo.bin"
+
+ .align 2
+Cry_Beldum:: @ 866C19C
+ .incbin "sound/direct_sound_samples/cry_beldum.bin"
+
+ .align 2
+Cry_Metang:: @ 866CB3C
+ .incbin "sound/direct_sound_samples/cry_metang.bin"
+
+ .align 2
+Cry_Metagross:: @ 866DE10
+ .incbin "sound/direct_sound_samples/cry_metagross.bin"
+
+ .align 2
+Cry_Bagon:: @ 8670588
+ .incbin "sound/direct_sound_samples/cry_bagon.bin"
+
+ .align 2
+Cry_Shelgon:: @ 8670D5C
+ .incbin "sound/direct_sound_samples/cry_shelgon.bin"
+
+ .align 2
+Cry_Regirock:: @ 8672164
+ .incbin "sound/direct_sound_samples/cry_regirock.bin"
+
+ .align 2
+Cry_Regice:: @ 8674140
+ .incbin "sound/direct_sound_samples/cry_regice.bin"
+
+ .align 2
+Cry_Registeel:: @ 8676140
+ .incbin "sound/direct_sound_samples/cry_registeel.bin"
+
+ .align 2
+Cry_Castform:: @ 8677844
+ .incbin "sound/direct_sound_samples/cry_castform.bin"
+
+ .align 2
+Cry_Volbeat:: @ 86784DC
+ .incbin "sound/direct_sound_samples/cry_volbeat.bin"
+
+ .align 2
+Cry_Illumise:: @ 8679064
+ .incbin "sound/direct_sound_samples/cry_illumise.bin"
+
+ .align 2
+Cry_Poochyena:: @ 867A17C
+ .incbin "sound/direct_sound_samples/cry_poochyena.bin"
+
+ .align 2
+Cry_Mightyena:: @ 867AAC4
+ .incbin "sound/direct_sound_samples/cry_mightyena.bin"
+
+ .align 2
+Cry_Dusclops:: @ 867BE50
+ .incbin "sound/direct_sound_samples/cry_dusclops.bin"
+
+ .align 2
+Cry_Sableye:: @ 867CC08
+ .incbin "sound/direct_sound_samples/cry_sableye.bin"
+
+ .align 2
+Cry_Mawile:: @ 867D7AC
+ .incbin "sound/direct_sound_samples/cry_mawile.bin"
+
+ .align 2
+Cry_Aron:: @ 867E32C
+ .incbin "sound/direct_sound_samples/cry_aron.bin"
+
+ .align 2
+Cry_Lairon:: @ 867EC58
+ .incbin "sound/direct_sound_samples/cry_lairon.bin"
+
+ .align 2
+Cry_Aggron:: @ 8680130
+ .incbin "sound/direct_sound_samples/cry_aggron.bin"
+
+ .align 2
+Cry_Relicanth:: @ 8681AD4
+ .incbin "sound/direct_sound_samples/cry_relicanth.bin"
+
+ .align 2
+Cry_Luvdisc:: @ 8682F04
+ .incbin "sound/direct_sound_samples/cry_luvdisc.bin"
+
+ .align 2
+Cry_Groudon:: @ 86833E0
+ .incbin "sound/direct_sound_samples/cry_groudon.bin"
+
+ .align 2
+Cry_Kyogre:: @ 86858EC
+ .incbin "sound/direct_sound_samples/cry_kyogre.bin"
+
+ .align 2
+Cry_Rayquaza:: @ 8687CA4
+ .incbin "sound/direct_sound_samples/cry_rayquaza.bin"
+
+ .align 2
+Cry_Salamence:: @ 86899D0
+ .incbin "sound/direct_sound_samples/cry_salamence.bin"
+
+ .align 2
+Cry_Breloom:: @ 868B2EC
+ .incbin "sound/direct_sound_samples/cry_breloom.bin"
+
+ .align 2
+Cry_Shroomish:: @ 868BFAC
+ .incbin "sound/direct_sound_samples/cry_shroomish.bin"
+
+ .align 2
+Cry_Linoone:: @ 868C884
+ .incbin "sound/direct_sound_samples/cry_linoone.bin"
+
+ .align 2
+Cry_Tropius:: @ 868E720
+ .incbin "sound/direct_sound_samples/cry_tropius.bin"
+
+ .align 2
+Cry_Wailmer:: @ 86907E4
+ .incbin "sound/direct_sound_samples/cry_wailmer.bin"
+
+ .align 2
+Cry_Zigzagoon:: @ 8692444
+ .incbin "sound/direct_sound_samples/cry_zigzagoon.bin"
+
+ .align 2
+Cry_Exploud:: @ 8692FD4
+ .incbin "sound/direct_sound_samples/cry_exploud.bin"
+
+ .align 2
+Cry_Loudred:: @ 8694C1C
+ .incbin "sound/direct_sound_samples/cry_loudred.bin"
+
+ .align 2
+Cry_Wailord:: @ 8695944
+ .incbin "sound/direct_sound_samples/cry_wailord.bin"
+
+ .align 2
+Cry_Whismur:: @ 8698354
+ .incbin "sound/direct_sound_samples/cry_whismur.bin"
+
+ .align 2
+Cry_Snorunt:: @ 8698B78
+ .incbin "sound/direct_sound_samples/cry_snorunt.bin"
+
+ .align 2
+Cry_Latios:: @ 8699C80
+ .incbin "sound/direct_sound_samples/cry_latios.bin"
+
+ .align 2
+Cry_Jirachi:: @ 869B278
+ .incbin "sound/direct_sound_samples/cry_jirachi.bin"
+
+ .align 2
+Cry_Deoxys:: @ 869BFFC
+ .incbin "sound/direct_sound_samples/cry_deoxys.bin"
+
+ .align 2
+Cry_Chimecho:: @ 869D4D0
+ .incbin "sound/direct_sound_samples/cry_chimecho.bin"
+
+ .align 2
+ .incbin "baserom.gba", 0x69DEE0, 0x17760
+
+gSong_86B5640:: @ 0x86B5640
+ .incbin "baserom.gba", 0x6B5640, 0x20
+
+gSong_86B5660:: @ 0x86B5660
+ .incbin "baserom.gba", 0x6B5660, 0x2C
+
+gSong_86B568C:: @ 0x86B568C
+ .incbin "baserom.gba", 0x6B568C, 0x24
+
+gSong_86B56B0:: @ 0x86B56B0
+ .incbin "baserom.gba", 0x6B56B0, 0x44
+
+gSong_86B56F4:: @ 0x86B56F4
+ .incbin "baserom.gba", 0x6B56F4, 0x2C
+
+gSong_86B5720:: @ 0x86B5720
+ .incbin "baserom.gba", 0x6B5720, 0x1C
+
+gSong_86B573C:: @ 0x86B573C
+ .incbin "baserom.gba", 0x6B573C, 0x1C
+
+gSong_86B5758:: @ 0x86B5758
+ .incbin "baserom.gba", 0x6B5758, 0x1C
+
+gSong_86B5774:: @ 0x86B5774
+ .incbin "baserom.gba", 0x6B5774, 0x34
+
+gSong_86B57A8:: @ 0x86B57A8
+ .incbin "baserom.gba", 0x6B57A8, 0x24
+
+gSong_86B57CC:: @ 0x86B57CC
+ .incbin "baserom.gba", 0x6B57CC, 0x1C
+
+gSong_86B57E8:: @ 0x86B57E8
+ .incbin "baserom.gba", 0x6B57E8, 0x2C
+
+gSong_86B5814:: @ 0x86B5814
+ .incbin "baserom.gba", 0x6B5814, 0x4C
+
+gSong_86B5860:: @ 0x86B5860
+ .incbin "baserom.gba", 0x6B5860, 0x7C
+
+gSong_86B58DC:: @ 0x86B58DC
+ .incbin "baserom.gba", 0x6B58DC, 0x54
+
+gSong_86B5930:: @ 0x86B5930
+ .incbin "baserom.gba", 0x6B5930, 0x54
+
+gSong_86B5984:: @ 0x86B5984
+ .incbin "baserom.gba", 0x6B5984, 0x50
+
+gSong_86B59D4:: @ 0x86B59D4
+ .incbin "baserom.gba", 0x6B59D4, 0x1C
+
+gSong_86B59F0:: @ 0x86B59F0
+ .incbin "baserom.gba", 0x6B59F0, 0x54
+
+gSong_86B5A44:: @ 0x86B5A44
+ .incbin "baserom.gba", 0x6B5A44, 0x48
+
+gSong_86B5A8C:: @ 0x86B5A8C
+ .incbin "baserom.gba", 0x6B5A8C, 0x2C
+
+gSong_86B5AB8:: @ 0x86B5AB8
+ .incbin "baserom.gba", 0x6B5AB8, 0x24
+
+gSong_86B5ADC:: @ 0x86B5ADC
+ .incbin "baserom.gba", 0x6B5ADC, 0x24
+
+gSong_86B5B00:: @ 0x86B5B00
+ .incbin "baserom.gba", 0x6B5B00, 0x84
+
+gSong_86B5B84:: @ 0x86B5B84
+ .incbin "baserom.gba", 0x6B5B84, 0x2C
+
+gSong_86B5BB0:: @ 0x86B5BB0
+ .incbin "baserom.gba", 0x6B5BB0, 0x30
+
+gSong_86B5BE0:: @ 0x86B5BE0
+ .incbin "baserom.gba", 0x6B5BE0, 0x180
+
+gSong_86B5D60:: @ 0x86B5D60
+ .incbin "baserom.gba", 0x6B5D60, 0x24
+
+gSong_86B5D84:: @ 0x86B5D84
+ .incbin "baserom.gba", 0x6B5D84, 0x24
+
+gSong_86B5DA8:: @ 0x86B5DA8
+ .incbin "baserom.gba", 0x6B5DA8, 0x24
+
+gSong_86B5DCC:: @ 0x86B5DCC
+ .incbin "baserom.gba", 0x6B5DCC, 0x30
+
+gSong_86B5DFC:: @ 0x86B5DFC
+ .incbin "baserom.gba", 0x6B5DFC, 0x24
+
+gSong_86B5E20:: @ 0x86B5E20
+ .incbin "baserom.gba", 0x6B5E20, 0x4C
+
+gSong_86B5E6C:: @ 0x86B5E6C
+ .incbin "baserom.gba", 0x6B5E6C, 0x38
+
+gSong_86B5EA4:: @ 0x86B5EA4
+ .incbin "baserom.gba", 0x6B5EA4, 0x54
+
+gSong_86B5EF8:: @ 0x86B5EF8
+ .incbin "baserom.gba", 0x6B5EF8, 0x3C
+
+gSong_86B5F34:: @ 0x86B5F34
+ .incbin "baserom.gba", 0x6B5F34, 0x58
+
+gSong_86B5F8C:: @ 0x86B5F8C
+ .incbin "baserom.gba", 0x6B5F8C, 0x44
+
+gSong_86B5FD0:: @ 0x86B5FD0
+ .incbin "baserom.gba", 0x6B5FD0, 0x3C
+
+gSong_86B600C:: @ 0x86B600C
+ .incbin "baserom.gba", 0x6B600C, 0x40
+
+gSong_86B604C:: @ 0x86B604C
+ .incbin "baserom.gba", 0x6B604C, 0x2C
+
+gSong_86B6078:: @ 0x86B6078
+ .incbin "baserom.gba", 0x6B6078, 0x3C
+
+gSong_86B60B4:: @ 0x86B60B4
+ .incbin "baserom.gba", 0x6B60B4, 0xAC
+
+gSong_86B6160:: @ 0x86B6160
+ .incbin "baserom.gba", 0x6B6160, 0x78
+
+gSong_86B61D8:: @ 0x86B61D8
+ .incbin "baserom.gba", 0x6B61D8, 0x2C
+
+gSong_86B6204:: @ 0x86B6204
+ .incbin "baserom.gba", 0x6B6204, 0x34
+
+gSong_86B6238:: @ 0x86B6238
+ .incbin "baserom.gba", 0x6B6238, 0x2C
+
+gSong_86B6264:: @ 0x86B6264
+ .incbin "baserom.gba", 0x6B6264, 0x44
+
+gSong_86B62A8:: @ 0x86B62A8
+ .incbin "baserom.gba", 0x6B62A8, 0x2C
+
+gSong_86B62D4:: @ 0x86B62D4
+ .incbin "baserom.gba", 0x6B62D4, 0x2C
+
+gSong_86B6300:: @ 0x86B6300
+ .incbin "baserom.gba", 0x6B6300, 0x2C
+
+gSong_86B632C:: @ 0x86B632C
+ .incbin "baserom.gba", 0x6B632C, 0x2C
+
+gSong_86B6358:: @ 0x86B6358
+ .incbin "baserom.gba", 0x6B6358, 0x54
+
+gSong_86B63AC:: @ 0x86B63AC
+ .incbin "baserom.gba", 0x6B63AC, 0x44
+
+gSong_86B63F0:: @ 0x86B63F0
+ .incbin "baserom.gba", 0x6B63F0, 0x34
+
+gSong_86B6424:: @ 0x86B6424
+ .incbin "baserom.gba", 0x6B6424, 0x38
+
+gSong_86B645C:: @ 0x86B645C
+ .incbin "baserom.gba", 0x6B645C, 0x38
+
+gSong_86B6494:: @ 0x86B6494
+ .incbin "baserom.gba", 0x6B6494, 0x38
+
+gSong_86B64CC:: @ 0x86B64CC
+ .incbin "baserom.gba", 0x6B64CC, 0x38
+
+gSong_86B6504:: @ 0x86B6504
+ .incbin "baserom.gba", 0x6B6504, 0x38
+
+gSong_86B653C:: @ 0x86B653C
+ .incbin "baserom.gba", 0x6B653C, 0x38
+
+gSong_86B6574:: @ 0x86B6574
+ .incbin "baserom.gba", 0x6B6574, 0x38
+
+gSong_86B65AC:: @ 0x86B65AC
+ .incbin "baserom.gba", 0x6B65AC, 0x34
+
+gSong_86B65E0:: @ 0x86B65E0
+ .incbin "baserom.gba", 0x6B65E0, 0x24
+
+gSong_86B6604:: @ 0x86B6604
+ .incbin "baserom.gba", 0x6B6604, 0x4C
+
+gSong_86B6650:: @ 0x86B6650
+ .incbin "baserom.gba", 0x6B6650, 0x60
+
+gSong_86B66B0:: @ 0x86B66B0
+ .incbin "baserom.gba", 0x6B66B0, 0x34
+
+gSong_86B66E4:: @ 0x86B66E4
+ .incbin "baserom.gba", 0x6B66E4, 0x30
+
+gSong_86B6714:: @ 0x86B6714
+ .incbin "baserom.gba", 0x6B6714, 0x38
+
+gSong_86B674C:: @ 0x86B674C
+ .incbin "baserom.gba", 0x6B674C, 0x44
+
+gSong_86B6790:: @ 0x86B6790
+ .incbin "baserom.gba", 0x6B6790, 0x30
+
+gSong_86B67C0:: @ 0x86B67C0
+ .incbin "baserom.gba", 0x6B67C0, 0x28
+
+gSong_86B67E8:: @ 0x86B67E8
+ .incbin "baserom.gba", 0x6B67E8, 0x68
+
+gSong_86B6850:: @ 0x86B6850
+ .incbin "baserom.gba", 0x6B6850, 0x3C
+
+gSong_86B688C:: @ 0x86B688C
+ .incbin "baserom.gba", 0x6B688C, 0x40
+
+gSong_86B68CC:: @ 0x86B68CC
+ .incbin "baserom.gba", 0x6B68CC, 0x3C
+
+gSong_86B6908:: @ 0x86B6908
+ .incbin "baserom.gba", 0x6B6908, 0x40
+
+gSong_86B6948:: @ 0x86B6948
+ .incbin "baserom.gba", 0x6B6948, 0x3C
+
+gSong_86B6984:: @ 0x86B6984
+ .incbin "baserom.gba", 0x6B6984, 0x40
+
+gSong_86B69C4:: @ 0x86B69C4
+ .incbin "baserom.gba", 0x6B69C4, 0x68
+
+gSong_86B6A2C:: @ 0x86B6A2C
+ .incbin "baserom.gba", 0x6B6A2C, 0x50
+
+gSong_86B6A7C:: @ 0x86B6A7C
+ .incbin "baserom.gba", 0x6B6A7C, 0x3C
+
+gSong_86B6AB8:: @ 0x86B6AB8
+ .incbin "baserom.gba", 0x6B6AB8, 0x30
+
+gSong_86B6AE8:: @ 0x86B6AE8
+ .incbin "baserom.gba", 0x6B6AE8, 0x4C
+
+gSong_86B6B34:: @ 0x86B6B34
+ .incbin "baserom.gba", 0x6B6B34, 0x24
+
+gSong_86B6B58:: @ 0x86B6B58
+ .incbin "baserom.gba", 0x6B6B58, 0x54
+
+gSong_86B6BAC:: @ 0x86B6BAC
+ .incbin "baserom.gba", 0x6B6BAC, 0x94
+
+gSong_86B6C40:: @ 0x86B6C40
+ .incbin "baserom.gba", 0x6B6C40, 0x3C
+
+gSong_86B6C7C:: @ 0x86B6C7C
+ .incbin "baserom.gba", 0x6B6C7C, 0x24
+
+gSong_86B6CA0:: @ 0x86B6CA0
+ .incbin "baserom.gba", 0x6B6CA0, 0x64
+
+gSong_86B6D04:: @ 0x86B6D04
+ .incbin "baserom.gba", 0x6B6D04, 0x68
+
+gSong_86B6D6C:: @ 0x86B6D6C
+ .incbin "baserom.gba", 0x6B6D6C, 0x28
+
+gSong_86B6D94:: @ 0x86B6D94
+ .incbin "baserom.gba", 0x6B6D94, 0x34
+
+gSong_86B6DC8:: @ 0x86B6DC8
+ .incbin "baserom.gba", 0x6B6DC8, 0x2C
+
+gSong_86B6DF4:: @ 0x86B6DF4
+ .incbin "baserom.gba", 0x6B6DF4, 0x7C
+
+gSong_86B6E70:: @ 0x86B6E70
+ .incbin "baserom.gba", 0x6B6E70, 0xC0
+
+gSong_86B6F30:: @ 0x86B6F30
+ .incbin "baserom.gba", 0x6B6F30, 0xE8
+
+gSong_86B7018:: @ 0x86B7018
+ .incbin "baserom.gba", 0x6B7018, 0x118
+
+gSong_86B7130:: @ 0x86B7130
+ .incbin "baserom.gba", 0x6B7130, 0x24
+
+gSong_86B7154:: @ 0x86B7154
+ .incbin "baserom.gba", 0x6B7154, 0x114
+
+gSong_86B7268:: @ 0x86B7268
+ .incbin "baserom.gba", 0x6B7268, 0x2C
+
+gSong_86B7294:: @ 0x86B7294
+ .incbin "baserom.gba", 0x6B7294, 0x34
+
+gSong_86B72C8:: @ 0x86B72C8
+ .incbin "baserom.gba", 0x6B72C8, 0x64
+
+gSong_86B732C:: @ 0x86B732C
+ .incbin "baserom.gba", 0x6B732C, 0x68
+
+gSong_86B7394:: @ 0x86B7394
+ .incbin "baserom.gba", 0x6B7394, 0x1FC
+
+gSong_86B7590:: @ 0x86B7590
+ .incbin "baserom.gba", 0x6B7590, 0x8C
+
+gSong_86B761C:: @ 0x86B761C
+ .incbin "baserom.gba", 0x6B761C, 0x50
+
+gSong_86B766C:: @ 0x86B766C
+ .incbin "baserom.gba", 0x6B766C, 0x2C
+
+gSong_86B7698:: @ 0x86B7698
+ .incbin "baserom.gba", 0x6B7698, 0x20
+
+gSong_86B76B8:: @ 0x86B76B8
+ .incbin "baserom.gba", 0x6B76B8, 0x3C
+
+gSong_86B76F4:: @ 0x86B76F4
+ .incbin "baserom.gba", 0x6B76F4, 0x94
+
+gSong_86B7788:: @ 0x86B7788
+ .incbin "baserom.gba", 0x6B7788, 0x6C
+
+gSong_86B77F4:: @ 0x86B77F4
+ .incbin "baserom.gba", 0x6B77F4, 0x48
+
+gSong_86B783C:: @ 0x86B783C
+ .incbin "baserom.gba", 0x6B783C, 0xC4
+
+gSong_86B7900:: @ 0x86B7900
+ .incbin "baserom.gba", 0x6B7900, 0x54
+
+gSong_86B7954:: @ 0x86B7954
+ .incbin "baserom.gba", 0x6B7954, 0x80
+
+gSong_86B79D4:: @ 0x86B79D4
+ .incbin "baserom.gba", 0x6B79D4, 0x38
+
+gSong_86B7A0C:: @ 0x86B7A0C
+ .incbin "baserom.gba", 0x6B7A0C, 0x34
+
+gSong_86B7A40:: @ 0x86B7A40
+ .incbin "baserom.gba", 0x6B7A40, 0x40
+
+gSong_86B7A80:: @ 0x86B7A80
+ .incbin "baserom.gba", 0x6B7A80, 0x78
+
+gSong_86B7AF8:: @ 0x86B7AF8
+ .incbin "baserom.gba", 0x6B7AF8, 0x80
+
+gSong_86B7B78:: @ 0x86B7B78
+ .incbin "baserom.gba", 0x6B7B78, 0x58
+
+gSong_86B7BD0:: @ 0x86B7BD0
+ .incbin "baserom.gba", 0x6B7BD0, 0xA4
+
+gSong_86B7C74:: @ 0x86B7C74
+ .incbin "baserom.gba", 0x6B7C74, 0x4C
+
+gSong_86B7CC0:: @ 0x86B7CC0
+ .incbin "baserom.gba", 0x6B7CC0, 0x7C
+
+gSong_86B7D3C:: @ 0x86B7D3C
+ .incbin "baserom.gba", 0x6B7D3C, 0x4C
+
+gSong_86B7D88:: @ 0x86B7D88
+ .incbin "baserom.gba", 0x6B7D88, 0x34
+
+gSong_86B7DBC:: @ 0x86B7DBC
+ .incbin "baserom.gba", 0x6B7DBC, 0x4C
+
+gSong_86B7E08:: @ 0x86B7E08
+ .incbin "baserom.gba", 0x6B7E08, 0x60
+
+gSong_86B7E68:: @ 0x86B7E68
+ .incbin "baserom.gba", 0x6B7E68, 0x4C
+
+gSong_86B7EB4:: @ 0x86B7EB4
+ .incbin "baserom.gba", 0x6B7EB4, 0x84
+
+gSong_86B7F38:: @ 0x86B7F38
+ .incbin "baserom.gba", 0x6B7F38, 0x54
+
+gSong_86B7F8C:: @ 0x86B7F8C
+ .incbin "baserom.gba", 0x6B7F8C, 0xCC
+
+gSong_86B8058:: @ 0x86B8058
+ .incbin "baserom.gba", 0x6B8058, 0xA0
+
+gSong_86B80F8:: @ 0x86B80F8
+ .incbin "baserom.gba", 0x6B80F8, 0x3C
+
+gSong_86B8134:: @ 0x86B8134
+ .incbin "baserom.gba", 0x6B8134, 0x4C
+
+gSong_86B8180:: @ 0x86B8180
+ .incbin "baserom.gba", 0x6B8180, 0x84
+
+gSong_86B8204:: @ 0x86B8204
+ .incbin "baserom.gba", 0x6B8204, 0x70
+
+gSong_86B8274:: @ 0x86B8274
+ .incbin "baserom.gba", 0x6B8274, 0xD4
+
+gSong_86B8348:: @ 0x86B8348
+ .incbin "baserom.gba", 0x6B8348, 0xA4
+
+gSong_86B83EC:: @ 0x86B83EC
+ .incbin "baserom.gba", 0x6B83EC, 0x70
+
+gSong_86B845C:: @ 0x86B845C
+ .incbin "baserom.gba", 0x6B845C, 0x74
+
+gSong_86B84D0:: @ 0x86B84D0
+ .incbin "baserom.gba", 0x6B84D0, 0xE0
+
+gSong_86B85B0:: @ 0x86B85B0
+ .incbin "baserom.gba", 0x6B85B0, 0x3C
+
+gSong_86B85EC:: @ 0x86B85EC
+ .incbin "baserom.gba", 0x6B85EC, 0x68
+
+gSong_86B8654:: @ 0x86B8654
+ .incbin "baserom.gba", 0x6B8654, 0x7C
+
+gSong_86B86D0:: @ 0x86B86D0
+ .incbin "baserom.gba", 0x6B86D0, 0x4C
+
+gSong_86B871C:: @ 0x86B871C
+ .incbin "baserom.gba", 0x6B871C, 0x48
+
+gSong_86B8764:: @ 0x86B8764
+ .incbin "baserom.gba", 0x6B8764, 0x68
+
+gSong_86B87CC:: @ 0x86B87CC
+ .incbin "baserom.gba", 0x6B87CC, 0x9C
+
+gSong_86B8868:: @ 0x86B8868
+ .incbin "baserom.gba", 0x6B8868, 0x164
+
+gSong_86B89CC:: @ 0x86B89CC
+ .incbin "baserom.gba", 0x6B89CC, 0x68
+
+gSong_86B8A34:: @ 0x86B8A34
+ .incbin "baserom.gba", 0x6B8A34, 0x44
+
+gSong_86B8A78:: @ 0x86B8A78
+ .incbin "baserom.gba", 0x6B8A78, 0x7C
+
+gSong_86B8AF4:: @ 0x86B8AF4
+ .incbin "baserom.gba", 0x6B8AF4, 0x6C
+
+gSong_86B8B60:: @ 0x86B8B60
+ .incbin "baserom.gba", 0x6B8B60, 0x80
+
+gSong_86B8BE0:: @ 0x86B8BE0
+ .incbin "baserom.gba", 0x6B8BE0, 0x80
+
+gSong_86B8C60:: @ 0x86B8C60
+ .incbin "baserom.gba", 0x6B8C60, 0x9C
+
+gSong_86B8CFC:: @ 0x86B8CFC
+ .incbin "baserom.gba", 0x6B8CFC, 0x4C
+
+gSong_86B8D48:: @ 0x86B8D48
+ .incbin "baserom.gba", 0x6B8D48, 0x40
+
+gSong_86B8D88:: @ 0x86B8D88
+ .incbin "baserom.gba", 0x6B8D88, 0x78
+
+gSong_86B8E00:: @ 0x86B8E00
+ .incbin "baserom.gba", 0x6B8E00, 0x3C
+
+gSong_86B8E3C:: @ 0x86B8E3C
+ .incbin "baserom.gba", 0x6B8E3C, 0x58
+
+gSong_86B8E94:: @ 0x86B8E94
+ .incbin "baserom.gba", 0x6B8E94, 0xC8
+
+gSong_86B8F5C:: @ 0x86B8F5C
+ .incbin "baserom.gba", 0x6B8F5C, 0xF4
+
+gSong_86B9050:: @ 0x86B9050
+ .incbin "baserom.gba", 0x6B9050, 0x110
+
+gSong_86B9160:: @ 0x86B9160
+ .incbin "baserom.gba", 0x6B9160, 0x88
+
+gSong_86B91E8:: @ 0x86B91E8
+ .incbin "baserom.gba", 0x6B91E8, 0x48
+
+gSong_86B9230:: @ 0x86B9230
+ .incbin "baserom.gba", 0x6B9230, 0x60
+
+gSong_86B9290:: @ 0x86B9290
+ .incbin "baserom.gba", 0x6B9290, 0x4C
+
+gSong_86B92DC:: @ 0x86B92DC
+ .incbin "baserom.gba", 0x6B92DC, 0x88
+
+gSong_86B9364:: @ 0x86B9364
+ .incbin "baserom.gba", 0x6B9364, 0xBC
+
+gSong_86B9420:: @ 0x86B9420
+ .incbin "baserom.gba", 0x6B9420, 0x58
+
+gSong_86B9478:: @ 0x86B9478
+ .incbin "baserom.gba", 0x6B9478, 0x7C
+
+gSong_86B94F4:: @ 0x86B94F4
+ .incbin "baserom.gba", 0x6B94F4, 0xC8
+
+gSong_86B95BC:: @ 0x86B95BC
+ .incbin "baserom.gba", 0x6B95BC, 0xBC
+
+gSong_86B9678:: @ 0x86B9678
+ .incbin "baserom.gba", 0x6B9678, 0xEC
+
+gSong_86B9764:: @ 0x86B9764
+ .incbin "baserom.gba", 0x6B9764, 0x40
+
+gSong_86B97A4:: @ 0x86B97A4
+ .incbin "baserom.gba", 0x6B97A4, 0x5C
+
+gSong_86B9800:: @ 0x86B9800
+ .incbin "baserom.gba", 0x6B9800, 0x38
+
+gSong_86B9838:: @ 0x86B9838
+ .incbin "baserom.gba", 0x6B9838, 0xB4
+
+gSong_86B98EC:: @ 0x86B98EC
+ .incbin "baserom.gba", 0x6B98EC, 0xA0
+
+gSong_86B998C:: @ 0x86B998C
+ .incbin "baserom.gba", 0x6B998C, 0x68
+
+gSong_86B99F4:: @ 0x86B99F4
+ .incbin "baserom.gba", 0x6B99F4, 0x124
+
+gSong_86B9B18:: @ 0x86B9B18
+ .incbin "baserom.gba", 0x6B9B18, 0x7C
+
+gSong_86B9B94:: @ 0x86B9B94
+ .incbin "baserom.gba", 0x6B9B94, 0x5C
+
+gSong_86B9BF0:: @ 0x86B9BF0
+ .incbin "baserom.gba", 0x6B9BF0, 0x38
+
+gSong_86B9C28:: @ 0x86B9C28
+ .incbin "baserom.gba", 0x6B9C28, 0x50
+
+gSong_86B9C78:: @ 0x86B9C78
+ .incbin "baserom.gba", 0x6B9C78, 0x8C
+
+gSong_86B9D04:: @ 0x86B9D04
+ .incbin "baserom.gba", 0x6B9D04, 0x64
+
+gSong_86B9D68:: @ 0x86B9D68
+ .incbin "baserom.gba", 0x6B9D68, 0x78
+
+gSong_86B9DE0:: @ 0x86B9DE0
+ .incbin "baserom.gba", 0x6B9DE0, 0x68
+
+gSong_86B9E48:: @ 0x86B9E48
+ .incbin "baserom.gba", 0x6B9E48, 0x154
+
+gSong_86B9F9C:: @ 0x86B9F9C
+ .incbin "baserom.gba", 0x6B9F9C, 0xD4
+
+gSong_86BA070:: @ 0x86BA070
+ .incbin "baserom.gba", 0x6BA070, 0x110
+
+gSong_86BA180:: @ 0x86BA180
+ .incbin "baserom.gba", 0x6BA180, 0xE4
+
+gSong_86BA264:: @ 0x86BA264
+ .incbin "baserom.gba", 0x6BA264, 0xE0
+
+gSong_86BA344:: @ 0x86BA344
+ .incbin "baserom.gba", 0x6BA344, 0x4C
+
+gSong_86BA390:: @ 0x86BA390
+ .incbin "baserom.gba", 0x6BA390, 0x8C
+
+gSong_86BA41C:: @ 0x86BA41C
+ .incbin "baserom.gba", 0x6BA41C, 0x190
+
+gSong_86BA5AC:: @ 0x86BA5AC
+ .incbin "baserom.gba", 0x6BA5AC, 0x1A0
+
+gSong_86BA74C:: @ 0x86BA74C
+ .incbin "baserom.gba", 0x6BA74C, 0x70
+
+gSong_86BA7BC:: @ 0x86BA7BC
+ .incbin "baserom.gba", 0x6BA7BC, 0x50
+
+gSong_86BA80C:: @ 0x86BA80C
+ .incbin "baserom.gba", 0x6BA80C, 0x124
+
+gSong_86BA930:: @ 0x86BA930
+ .incbin "baserom.gba", 0x6BA930, 0x80
+
+gSong_86BA9B0:: @ 0x86BA9B0
+ .incbin "baserom.gba", 0x6BA9B0, 0xF0
+
+gSong_86BAAA0:: @ 0x86BAAA0
+ .incbin "baserom.gba", 0x6BAAA0, 0x64
+
+gSong_86BAB04:: @ 0x86BAB04
+ .incbin "baserom.gba", 0x6BAB04, 0x5C
+
+gSong_86BAB60:: @ 0x86BAB60
+ .incbin "baserom.gba", 0x6BAB60, 0xB4
+
+gSong_86BAC14:: @ 0x86BAC14
+ .incbin "baserom.gba", 0x6BAC14, 0x1FC
+
+gSong_86BAE10:: @ 0x86BAE10
+ .incbin "baserom.gba", 0x6BAE10, 0x120
+
+gSong_86BAF30:: @ 0x86BAF30
+ .incbin "baserom.gba", 0x6BAF30, 0x170
+
+gSong_86BB0A0:: @ 0x86BB0A0
+ .incbin "baserom.gba", 0x6BB0A0, 0x70
+
+gSong_86BB110:: @ 0x86BB110
+ .incbin "baserom.gba", 0x6BB110, 0x98
+
+gSong_86BB1A8:: @ 0x86BB1A8
+ .incbin "baserom.gba", 0x6BB1A8, 0x38
+
+gSong_86BB1E0:: @ 0x86BB1E0
+ .incbin "baserom.gba", 0x6BB1E0, 0xD8
+
+gSong_86BB2B8:: @ 0x86BB2B8
+ .incbin "baserom.gba", 0x6BB2B8, 0xD8
+
+gSong_86BB390:: @ 0x86BB390
+ .incbin "baserom.gba", 0x6BB390, 0xAC
+
+gSong_86BB43C:: @ 0x86BB43C
+ .incbin "baserom.gba", 0x6BB43C, 0x98
+
+gSong_86BB4D4:: @ 0x86BB4D4
+ .incbin "baserom.gba", 0x6BB4D4, 0x98
+
+gSong_86BB56C:: @ 0x86BB56C
+ .incbin "baserom.gba", 0x6BB56C, 0xA8
+
+gSong_86BB614:: @ 0x86BB614
+ .incbin "baserom.gba", 0x6BB614, 0x4C
+
+gSong_86BB660:: @ 0x86BB660
+ .incbin "baserom.gba", 0x6BB660, 0xFC
+
+gSong_86BB75C:: @ 0x86BB75C
+ .incbin "baserom.gba", 0x6BB75C, 0x94
+
+gSong_86BB7F0:: @ 0x86BB7F0
+ .incbin "baserom.gba", 0x6BB7F0, 0x64
+
+gSong_86BB854:: @ 0x86BB854
+ .incbin "baserom.gba", 0x6BB854, 0x9C
+
+gSong_86BB8F0:: @ 0x86BB8F0
+ .incbin "baserom.gba", 0x6BB8F0, 0x208
+
+gSong_86BBAF8:: @ 0x86BBAF8
+ .incbin "baserom.gba", 0x6BBAF8, 0xFC
+
+gSong_86BBBF4:: @ 0x86BBBF4
+ .incbin "baserom.gba", 0x6BBBF4, 0xF0
+
+gSong_86BBCE4:: @ 0x86BBCE4
+ .incbin "baserom.gba", 0x6BBCE4, 0x84
+
+gSong_86BBD68:: @ 0x86BBD68
+ .incbin "baserom.gba", 0x6BBD68, 0x74
+
+gSong_86BBDDC:: @ 0x86BBDDC
+ .incbin "baserom.gba", 0x6BBDDC, 0x180
+
+gSong_86BBF5C:: @ 0x86BBF5C
+ .incbin "baserom.gba", 0x6BBF5C, 0x104
+
+gSong_86BC060:: @ 0x86BC060
+ .incbin "baserom.gba", 0x6BC060, 0x60
+
+gSong_86BC0C0:: @ 0x86BC0C0
+ .incbin "baserom.gba", 0x6BC0C0, 0x70
+
+gSong_86BC130:: @ 0x86BC130
+ .incbin "baserom.gba", 0x6BC130, 0x11C
+
+gSong_86BC24C:: @ 0x86BC24C
+ .incbin "baserom.gba", 0x6BC24C, 0xA4
+
+gSong_86BC2F0:: @ 0x86BC2F0
+ .incbin "baserom.gba", 0x6BC2F0, 0x170
+
+gSong_86BC460:: @ 0x86BC460
+ .incbin "baserom.gba", 0x6BC460, 0x134
+
+gSong_86BC594:: @ 0x86BC594
+ .incbin "baserom.gba", 0x6BC594, 0x84
+
+gSong_86BC618:: @ 0x86BC618
+ .incbin "baserom.gba", 0x6BC618, 0x58
+
+gSong_86BC670:: @ 0x86BC670
+ .incbin "baserom.gba", 0x6BC670, 0x30
+
+gSong_86BC6A0:: @ 0x86BC6A0
+ .incbin "baserom.gba", 0x6BC6A0, 0x38
+
+gSong_86BC6D8:: @ 0x86BC6D8
+ .incbin "baserom.gba", 0x6BC6D8, 0x8C
+
+gSong_86BC764:: @ 0x86BC764
+ .incbin "baserom.gba", 0x6BC764, 0x38
+
+gSong_86BC79C:: @ 0x86BC79C
+ .incbin "baserom.gba", 0x6BC79C, 0x44
+
+gSong_86BC7E0:: @ 0x86BC7E0
+ .incbin "baserom.gba", 0x6BC7E0, 0x40
+
+gSong_86BC820:: @ 0x86BC820
+ .incbin "baserom.gba", 0x6BC820, 0x28
+
+gSong_86BC848:: @ 0x86BC848
+ .incbin "baserom.gba", 0x6BC848, 0xB8
+
+gSong_86BC900:: @ 0x86BC900
+ .incbin "baserom.gba", 0x6BC900, 0x74
+
+gSong_86BC974:: @ 0x86BC974
+ .incbin "baserom.gba", 0x6BC974, 0x6C
+
+gSong_86BC9E0:: @ 0x86BC9E0
+ .incbin "baserom.gba", 0x6BC9E0, 0x48
+
+gSong_86BCA28:: @ 0x86BCA28
+ .incbin "baserom.gba", 0x6BCA28, 0xE0
+
+gSong_86BCB08:: @ 0x86BCB08
+ .incbin "baserom.gba", 0x6BCB08, 0xC0
+
+gSong_86BCBC8:: @ 0x86BCBC8
+ .incbin "baserom.gba", 0x6BCBC8, 0x34
+
+gSong_86BCBFC:: @ 0x86BCBFC
+ .incbin "baserom.gba", 0x6BCBFC, 0xBC
+
+gSong_86BCCB8:: @ 0x86BCCB8
+ .incbin "baserom.gba", 0x6BCCB8, 0xE0
+
+gSong_86BCD98:: @ 0x86BCD98
+ .incbin "baserom.gba", 0x6BCD98, 0x14C
+
+gSong_86BCEE4:: @ 0x86BCEE4
+ .incbin "baserom.gba", 0x6BCEE4, 0x19C
+
+gSong_86BD080:: @ 0x86BD080
+ .incbin "baserom.gba", 0x6BD080, 0x2D8
+
+gSong_86BD358:: @ 0x86BD358
+ .incbin "baserom.gba", 0x6BD358, 0x18C
+
+gSong_86BD4E4:: @ 0x86BD4E4
+ .incbin "baserom.gba", 0x6BD4E4, 0xD8
+
+gSong_86BD5BC:: @ 0x86BD5BC
+ .incbin "baserom.gba", 0x6BD5BC, 0x6C
+
+gSong_86BD628:: @ 0x86BD628
+ .incbin "baserom.gba", 0x6BD628, 0x570
+
+gSong_86BDB98:: @ 0x86BDB98
+ .incbin "baserom.gba", 0x6BDB98, 0xE2C
+
+gSong_86BE9C4:: @ 0x86BE9C4
+ .incbin "baserom.gba", 0x6BE9C4, 0x10A4
+
+gSong_86BFA68:: @ 0x86BFA68
+ .incbin "baserom.gba", 0x6BFA68, 0x358
+
+gSong_86BFDC0:: @ 0x86BFDC0
+ .incbin "baserom.gba", 0x6BFDC0, 0x220
+
+gSong_86BFFE0:: @ 0x86BFFE0
+ .incbin "baserom.gba", 0x6BFFE0, 0x140
+
+gSong_86C0120:: @ 0x86C0120
+ .incbin "baserom.gba", 0x6C0120, 0xE4
+
+gSong_86C0204:: @ 0x86C0204
+ .incbin "baserom.gba", 0x6C0204, 0xF8
+
+gSong_86C02FC:: @ 0x86C02FC
+ .incbin "baserom.gba", 0x6C02FC, 0x4E8
+
+gSong_86C07E4:: @ 0x86C07E4
+ .incbin "baserom.gba", 0x6C07E4, 0xF3C
+
+gSong_86C1720:: @ 0x86C1720
+ .incbin "baserom.gba", 0x6C1720, 0x1C24
+
+gSong_86C3344:: @ 0x86C3344
+ .incbin "baserom.gba", 0x6C3344, 0xA0C
+
+gSong_86C3D50:: @ 0x86C3D50
+ .incbin "baserom.gba", 0x6C3D50, 0x298
+
+gSong_86C3FE8:: @ 0x86C3FE8
+ .incbin "baserom.gba", 0x6C3FE8, 0xB00
+
+gSong_86C4AE8:: @ 0x86C4AE8
+ .incbin "baserom.gba", 0x6C4AE8, 0x1074
+
+gSong_86C5B5C:: @ 0x86C5B5C
+ .incbin "baserom.gba", 0x6C5B5C, 0xED4
+
+gSong_86C6A30:: @ 0x86C6A30
+ .incbin "baserom.gba", 0x6C6A30, 0xD2C
+
+gSong_86C775C:: @ 0x86C775C
+ .incbin "baserom.gba", 0x6C775C, 0x54
+
+gSong_86C77B0:: @ 0x86C77B0
+ .incbin "baserom.gba", 0x6C77B0, 0xC14
+
+gSong_86C83C4:: @ 0x86C83C4
+ .incbin "baserom.gba", 0x6C83C4, 0x3C0
+
+gSong_86C8784:: @ 0x86C8784
+ .incbin "baserom.gba", 0x6C8784, 0x3B8
+
+gSong_86C8B3C:: @ 0x86C8B3C
+ .incbin "baserom.gba", 0x6C8B3C, 0x4A8
+
+gSong_86C8FE4:: @ 0x86C8FE4
+ .incbin "baserom.gba", 0x6C8FE4, 0xABC
+
+gSong_86C9AA0:: @ 0x86C9AA0
+ .incbin "baserom.gba", 0x6C9AA0, 0x1218
+
+gSong_86CACB8:: @ 0x86CACB8
+ .incbin "baserom.gba", 0x6CACB8, 0x1450
+
+gSong_86CC108:: @ 0x86CC108
+ .incbin "baserom.gba", 0x6CC108, 0x123C
+
+gSong_86CD344:: @ 0x86CD344
+ .incbin "baserom.gba", 0x6CD344, 0x4010
+
+gSong_86D1354:: @ 0x86D1354
+ .incbin "baserom.gba", 0x6D1354, 0xA88
+
+gSong_86D1DDC:: @ 0x86D1DDC
+ .incbin "baserom.gba", 0x6D1DDC, 0x870
+
+gSong_86D264C:: @ 0x86D264C
+ .incbin "baserom.gba", 0x6D264C, 0xF3C
+
+gSong_86D3588:: @ 0x86D3588
+ .incbin "baserom.gba", 0x6D3588, 0xD74
+
+gSong_86D42FC:: @ 0x86D42FC
+ .incbin "baserom.gba", 0x6D42FC, 0xD40
+
+gSong_86D503C:: @ 0x86D503C
+ .incbin "baserom.gba", 0x6D503C, 0x1AE4
+
+gSong_86D6B20:: @ 0x86D6B20
+ .incbin "baserom.gba", 0x6D6B20, 0x2B74
+
+gSong_86D9694:: @ 0x86D9694
+ .incbin "baserom.gba", 0x6D9694, 0x117C
+
+gSong_86DA810:: @ 0x86DA810
+ .incbin "baserom.gba", 0x6DA810, 0x27D0
+
+gSong_86DCFE0:: @ 0x86DCFE0
+ .incbin "baserom.gba", 0x6DCFE0, 0x864
+
+gSong_86DD844:: @ 0x86DD844
+ .incbin "baserom.gba", 0x6DD844, 0x79C
+
+gSong_86DDFE0:: @ 0x86DDFE0
+ .incbin "baserom.gba", 0x6DDFE0, 0x98C
+
+gSong_86DE96C:: @ 0x86DE96C
+ .incbin "baserom.gba", 0x6DE96C, 0xA60
+
+gSong_86DF3CC:: @ 0x86DF3CC
+ .incbin "baserom.gba", 0x6DF3CC, 0x12A4
+
+gSong_86E0670:: @ 0x86E0670
+ .incbin "baserom.gba", 0x6E0670, 0x978
+
+gSong_86E0FE8:: @ 0x86E0FE8
+ .incbin "baserom.gba", 0x6E0FE8, 0x8CC
+
+gSong_86E18B4:: @ 0x86E18B4
+ .incbin "baserom.gba", 0x6E18B4, 0x16F4
+
+gSong_86E2FA8:: @ 0x86E2FA8
+ .incbin "baserom.gba", 0x6E2FA8, 0xA3C
+
+gSong_86E39E4:: @ 0x86E39E4
+ .incbin "baserom.gba", 0x6E39E4, 0xB80
+
+gSong_86E4564:: @ 0x86E4564
+ .incbin "baserom.gba", 0x6E4564, 0x1180
+
+gSong_86E56E4:: @ 0x86E56E4
+ .incbin "baserom.gba", 0x6E56E4, 0x538
+
+gSong_86E5C1C:: @ 0x86E5C1C
+ .incbin "baserom.gba", 0x6E5C1C, 0xEF0
+
+gSong_86E6B0C:: @ 0x86E6B0C
+ .incbin "baserom.gba", 0x6E6B0C, 0xE14
+
+gSong_86E7920:: @ 0x86E7920
+ .incbin "baserom.gba", 0x6E7920, 0xEF0
+
+gSong_86E8810:: @ 0x86E8810
+ .incbin "baserom.gba", 0x6E8810, 0x83C
+
+gSong_86E904C:: @ 0x86E904C
+ .incbin "baserom.gba", 0x6E904C, 0x7D4
+
+gSong_86E9820:: @ 0x86E9820
+ .incbin "baserom.gba", 0x6E9820, 0x200
+
+gSong_86E9A20:: @ 0x86E9A20
+ .incbin "baserom.gba", 0x6E9A20, 0x200
+
+gSong_86E9C20:: @ 0x86E9C20
+ .incbin "baserom.gba", 0x6E9C20, 0x370
+
+gSong_86E9F90:: @ 0x86E9F90
+ .incbin "baserom.gba", 0x6E9F90, 0x170
+
+gSong_86EA100:: @ 0x86EA100
+ .incbin "baserom.gba", 0x6EA100, 0x904
+
+gSong_86EAA04:: @ 0x86EAA04
+ .incbin "baserom.gba", 0x6EAA04, 0x438
+
+gSong_86EAE3C:: @ 0x86EAE3C
+ .incbin "baserom.gba", 0x6EAE3C, 0x8C
+
+gSong_86EAEC8:: @ 0x86EAEC8
+ .incbin "baserom.gba", 0x6EAEC8, 0x1D0
+
+gSong_86EB098:: @ 0x86EB098
+ .incbin "baserom.gba", 0x6EB098, 0xBC
+
+gSong_86EB154:: @ 0x86EB154
+ .incbin "baserom.gba", 0x6EB154, 0xF74
+
+gSong_86EC0C8:: @ 0x86EC0C8
+ .incbin "baserom.gba", 0x6EC0C8, 0xF7C
+
+gSong_86ED044:: @ 0x86ED044
+ .incbin "baserom.gba", 0x6ED044, 0xA5C
+
+gSong_86EDAA0:: @ 0x86EDAA0
+ .incbin "baserom.gba", 0x6EDAA0, 0x480
+
+gSong_86EDF20:: @ 0x86EDF20
+ .incbin "baserom.gba", 0x6EDF20, 0xF2C
+
+gSong_86EEE4C:: @ 0x86EEE4C
+ .incbin "baserom.gba", 0x6EEE4C, 0x1404
+
+gSong_86F0250:: @ 0x86F0250
+ .incbin "baserom.gba", 0x6F0250, 0x4F0
+
+gSong_86F0740:: @ 0x86F0740
+ .incbin "baserom.gba", 0x6F0740, 0xEC0
+
+gSong_86F1600:: @ 0x86F1600
+ .incbin "baserom.gba", 0x6F1600, 0x121C
+
+gSong_86F281C:: @ 0x86F281C
+ .incbin "baserom.gba", 0x6F281C, 0xEF4
+
+gSong_86F3710:: @ 0x86F3710
+ .incbin "baserom.gba", 0x6F3710, 0x1028
+
+gSong_86F4738:: @ 0x86F4738
+ .incbin "baserom.gba", 0x6F4738, 0xF30
+
+gSong_86F5668:: @ 0x86F5668
+ .incbin "baserom.gba", 0x6F5668, 0x1C4
+
+gSong_86F582C:: @ 0x86F582C
+ .incbin "baserom.gba", 0x6F582C, 0x2188
+
+gSong_86F79B4:: @ 0x86F79B4
+ .incbin "baserom.gba", 0x6F79B4, 0x1178
+
+gSong_86F8B2C:: @ 0x86F8B2C
+ .incbin "baserom.gba", 0x6F8B2C, 0x12B8
-gUnknown_848E144:: @ 848E144
- .incbin "baserom.gba", 0x48E144, 0x600
+gSong_86F9DE4:: @ 0x86F9DE4
+ .incbin "baserom.gba", 0x6F9DE4, 0x444
-gUnknown_848E744:: @ 848E744
- .incbin "baserom.gba", 0x48E744, 0x600
+gSong_86FA228:: @ 0x86FA228
+ .incbin "baserom.gba", 0x6FA228, 0x948
-gUnknown_848ED44:: @ 848ED44
- .incbin "baserom.gba", 0x48ED44, 0x14558
+gSong_86FAB70:: @ 0x86FAB70
+ .incbin "baserom.gba", 0x6FAB70, 0xA00
-gMPlayTable:: @ 84A329C
- .incbin "baserom.gba", 0x4A329C, 0x30
+gSong_86FB570:: @ 0x86FB570
+ .incbin "baserom.gba", 0x6FB570, 0x840
-gSongTable:: @ 84A32CC
- .incbin "baserom.gba", 0x4A32CC, 0x243840
+gSong_86FBDB0:: @ 0x86FBDB0
+ .incbin "baserom.gba", 0x6FBDB0, 0xDC
-gUnknown_86E6B0C:: @ 86E6B0C
- .incbin "baserom.gba", 0x6E6B0C, 0x15398
+gSong_86FBE8C:: @ 0x86FBE8C
+ .incbin "baserom.gba", 0x6FBE8C, 0x18
diff --git a/data/specials.inc b/data/specials.inc
index 33cc5736b..a610fcd6f 100644
--- a/data/specials.inc
+++ b/data/specials.inc
@@ -40,7 +40,7 @@ gSpecials:: @ 815FD60
def_special sub_8081064
def_special sub_80810CC
def_special sub_80810F4
- def_special sub_80098B8
+ def_special CloseLink
def_special sub_80819C8
def_special sub_8081978
def_special sub_80819B8
@@ -388,12 +388,12 @@ gSpecials:: @ 815FD60
def_special sub_8046B94
def_special sub_8046BBC
def_special sub_8046BDC
- def_special sub_8146E78
+ def_special ScrSpecial_SeaGallopFerry
def_special sub_80CC48C
def_special sub_812B220
def_special sub_812B234
def_special sub_812B248
- def_special sub_8143FC8
+ def_special ValidateReceivedWonderCard
def_special sub_810B810
def_special sub_811999C
def_special sp182_move_string
diff --git a/graphics/interface/unk_textbox_border.png b/graphics/interface/unk_textbox_border.png
new file mode 100644
index 000000000..6cc6a64ac
--- /dev/null
+++ b/graphics/interface/unk_textbox_border.png
Binary files differ
diff --git a/graphics_file_rules.mk b/graphics_file_rules.mk
index 549527050..bdb4eda05 100644
--- a/graphics_file_rules.mk
+++ b/graphics_file_rules.mk
@@ -662,3 +662,6 @@ $(FAMECHECKERGFXDIR)/img_845cf00.4bpp: %.4bpp: %.png
$(GLOBALGFXDIR)/fame_checker_bg.4bpp: %.4bpp: %.png
$(GFX) $< $@ -num_tiles 165
+
+data/seagallop/water.4bpp: %.4bpp: %.png
+ $(GFX) $< $@ -num_tiles 41
diff --git a/include/blit.h b/include/blit.h
new file mode 100644
index 000000000..78f67766e
--- /dev/null
+++ b/include/blit.h
@@ -0,0 +1,17 @@
+#ifndef GUARD_BLIT_H
+#define GUARD_BLIT_H
+
+struct Bitmap
+{
+ u8 *pixels;
+ u32 width:16;
+ u32 height:16;
+};
+
+void BlitBitmapRect4BitWithoutColorKey(const struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height);
+void BlitBitmapRect4Bit(const struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height, u8 colorKey);
+void FillBitmapRect4Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue);
+void BlitBitmapRect4BitTo8Bit(const struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height, u8 colorKey, u8 paletteOffset);
+void FillBitmapRect8Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue);
+
+#endif // GUARD_BLIT_H
diff --git a/include/constants/maps.h b/include/constants/maps.h
index 8a8a023a8..5fb5f88fa 100644
--- a/include/constants/maps.h
+++ b/include/constants/maps.h
@@ -9,4 +9,6 @@
#define MAP_GROUP(map) (MAP_##map >> 8)
#define MAP_NUM(map) (MAP_##map & 0xFF)
+#define MAP(map) MAP_GROUP(map), MAP_NUM(map)
+
#endif // GUARD_CONSTANTS_MAPS_H
diff --git a/include/field_fadetransition.h b/include/field_fadetransition.h
index a2a4d3eac..228ff3bfb 100644
--- a/include/field_fadetransition.h
+++ b/include/field_fadetransition.h
@@ -12,5 +12,6 @@ void DoFallWarp(void);
void sub_807E59C(void);
void sub_807E500(void);
void sub_807DF64(void);
+void sub_807DC18(void);
#endif // GUARD_FIELD_FADETRANSITION_H
diff --git a/include/field_weather.h b/include/field_weather.h
index eb80c455a..eeda3b5b5 100644
--- a/include/field_weather.h
+++ b/include/field_weather.h
@@ -12,5 +12,6 @@ void sub_80AEDBC(void);
void DoCurrentWeather(void);
void SetSav1WeatherFromCurrMapHeader(void);
void sub_807B0C4(u16 *, u16 *, u32);
+void play_some_sound(void);
#endif // GUARD_WEATHER_H
diff --git a/include/gba/m4a_internal.h b/include/gba/m4a_internal.h
index 89d5c1f5a..6f05a176a 100644
--- a/include/gba/m4a_internal.h
+++ b/include/gba/m4a_internal.h
@@ -100,7 +100,7 @@ struct CgbChannel
u8 le;
u8 sw;
u32 fr;
- u32 wp;
+ u32 * wp;
u32 cp;
u32 tp;
u32 pp;
diff --git a/include/global.h b/include/global.h
index 8e85b3123..de2221f8c 100644
--- a/include/global.h
+++ b/include/global.h
@@ -760,13 +760,6 @@ struct SaveBlock1
extern struct SaveBlock1* gSaveBlock1Ptr;
-struct Bitmap // TODO: Find a better spot for this
-{
- u8* pixels;
- u32 width:16;
- u32 height:16;
-};
-
extern u8 gReservedSpritePaletteCount;
#endif // GUARD_GLOBAL_H
diff --git a/include/help_system.h b/include/help_system.h
index 3ef5f53e4..6398d306b 100644
--- a/include/help_system.h
+++ b/include/help_system.h
@@ -7,5 +7,6 @@ extern bool8 gUnknown_3005ECC;
void sub_812B484(void);
void HelpSystem_SetSomeVariable2(u8);
+void sub_812B478(void);
#endif //GUARD_HELP_SYSTEM_H
diff --git a/include/link.h b/include/link.h
index 93ad9dfe1..a875149aa 100644
--- a/include/link.h
+++ b/include/link.h
@@ -204,7 +204,7 @@ bool8 sub_800AA48(void);
void sub_800A5BC(void);
void sub_800AA80(u8);
void sub_80098D8(void);
-void sub_80098B8(void);
+void CloseLink(void);
bool8 sub_800A4BC(void);
#endif // GUARD_LINK_H
diff --git a/include/link_rfu.h b/include/link_rfu.h
index 6e54fcc6c..d076efae6 100644
--- a/include/link_rfu.h
+++ b/include/link_rfu.h
@@ -1,9 +1,15 @@
#ifndef GUARD_LINK_RFU_H
#define GUARD_LINK_RFU_H
-void sub_8142504(const u8 *str);
-bool32 mevent_0814257C(u8 * cmdPtr, const u8 * src);
+void AddTextPrinterToWindow1(const u8 *str);
+bool32 MG_PrintTextOnWindow1AndWaitButton(u8 * cmdPtr, const u8 * src);
void sub_80FA190(void);
-void sub_8142420(void);
+void MG_DrawCheckerboardPattern(void);
+void task_add_05_task_del_08FA224_when_no_RfuFunc(void);
+bool8 IsNoOneConnected(void);
+void DestroyWirelessStatusIndicatorSprite(void);
+void MEvent_CreateTask_CardOrNewsWithFriend(u8);
+void MEvent_CreateTask_CardOrNewsOverWireless(u8);
+void MEvent_CreateTask_Leader(u8);
#endif //GUARD_LINK_RFU_H
diff --git a/include/list_menu.h b/include/list_menu.h
index 3fd54d0d1..8ff65da0b 100644
--- a/include/list_menu.h
+++ b/include/list_menu.h
@@ -59,5 +59,7 @@ void sub_81AE6C8(u8 a0, u16 *a1, u16 *a2);
void DestroyListMenu(u8, u16 *, u16 *);
u16 ListMenuGetYCoordForPrintingArrowCursor(u8);
void sub_8107D38(u8, u8);
+s32 DoMysteryGiftListMenu(const struct WindowTemplate *windowTemplate, const struct ListMenuTemplate *listMenuTemplate, u8 arg2, u16 tileNum, u16 palNum);
+void ListMenuDefaultCursorMoveFunc(s32, u8, struct ListMenu *);
#endif //GUARD_LIST_MENU_H
diff --git a/include/menews_jisan.h b/include/menews_jisan.h
index 4db5a7be2..ca09d4347 100644
--- a/include/menews_jisan.h
+++ b/include/menews_jisan.h
@@ -3,7 +3,7 @@
#include "global.h"
-void sub_8146C30(u32 a0);
+void GenerateRandomNews(u32 a0);
void sub_8146C88(void);
void sub_8146CA4(void);
diff --git a/include/mevent.h b/include/mevent.h
index d940b212c..b9b17d8c0 100644
--- a/include/mevent.h
+++ b/include/mevent.h
@@ -33,12 +33,13 @@ struct MEvent_Str_2
u8 fill_00[0x40];
};
-struct MEventBuffer_3120_Sub * sub_8143D58(void);
-struct MEventBuffer_32E0_Sub * sav1_get_mevent_buffer_1(void);
+struct MEventBuffer_3120_Sub * GetSavedWonderNews(void);
+struct MEventBuffer_32E0_Sub * GetSavedWonderCard(void);
struct MEventBuffer_3430_Sub * sav1_get_mevent_buffer_2(void);
struct MysteryEventStruct * sub_8143D94(void);
bool32 sub_8143DC8(const struct MEventBuffer_3120_Sub * src);
-bool32 sub_8143E1C(void);
+bool32 ValidateReceivedWonderNews(void);
+bool32 ValidateReceivedWonderCard(void);
bool32 sub_8143EF4(const u8 * src);
bool32 sub_8143F68(const struct MEventBuffer_32E0_Sub * data);
void sub_814410C(struct MEventBuffer_32E0_Sub * buffer);
@@ -49,5 +50,21 @@ u32 sub_8144418(const u16 * a0, const struct MEventStruct_Unk1442CC * a1, void *
u32 sub_8144434(const u16 * a0, const struct MEventStruct_Unk1442CC * a1, void * unused);
bool32 sub_8144474(const struct MEventStruct_Unk1442CC * a0, const u16 * a1);
u16 sub_81444B0(const struct MEventStruct_Unk1442CC * a0, u32 command);
+bool32 InitWonderCardResources(struct MEventBuffer_32E0_Sub * r5, struct MEventBuffer_3430_Sub * r6);
+bool32 InitWonderNewsResources(const struct MEventBuffer_3120_Sub * a0);
+s32 FadeToWonderCardMenu(void);
+s32 FadeToWonderNewsMenu(void);
+void DestroyWonderCard(void);
+void DestroyWonderNews(void);
+void DestroyWonderCardResources(void);
+void DestroyWonderNewsResources(void);
+s32 FadeOutFromWonderCard(bool32 flag);
+s32 FadeOutFromWonderNews(bool32 flag);
+bool32 CheckReceivedGiftFromWonderCard(void);
+void MENews_AddScrollIndicatorArrowPair(void);
+void MENews_RemoveScrollIndicatorArrowPair(void);
+bool32 WonderNews_Test_Unk_02(void);
+bool32 WonderCard_Test_Unk_08_6(void);
+u32 MENews_GetInput(u16 input);
#endif //GUARD_MEVENT_H
diff --git a/include/mevent_server.h b/include/mevent_server.h
index e593b5dbd..10ee96401 100644
--- a/include/mevent_server.h
+++ b/include/mevent_server.h
@@ -37,7 +37,7 @@ struct mevent_cmd_ish
u32 parameter;
};
-struct mevent_srv_ish
+struct mevent_client
{
u32 unk_00;
u32 param;
@@ -83,13 +83,13 @@ void mevent_srv_sub_init(struct mevent_srv_sub * svr, u32 sendPlayerNo, u32 recv
void mevent_srv_sub_init_send(struct mevent_srv_sub * svr, u32 ident, const void * src, u32 size);
void mevent_srv_sub_init_recv(struct mevent_srv_sub * svr, u32 ident, void * dest);
-void mevent_srv_ish_do_init(void);
-u32 mevent_srv_ish_do_exec(u16 * a0);
-void mevent_srv_ish_inc_flag(void);
-void * mevent_srv_ish_get_buffer(void);
-void mevent_srv_ish_set_param(u32 a0);
-void mevent_srv_common_do_init_1(void);
-void mevent_srv_common_do_init_2(void);
-u32 mevent_srv_init_do_exec(u16 * a0);
+void mevent_client_do_init(void);
+u32 mevent_client_do_exec(u16 * a0);
+void mevent_client_inc_flag(void);
+void * mevent_client_get_buffer(void);
+void mevent_client_set_param(u32 a0);
+void mevent_srv_init_wnews(void);
+void mevent_srv_new_wcard(void);
+u32 mevent_srv_common_do_exec(u16 * a0);
#endif //GUARD_MEVENT_SERVER_H
diff --git a/include/mystery_event_msg.h b/include/mystery_event_msg.h
index e96c3069b..ac228576d 100644
--- a/include/mystery_event_msg.h
+++ b/include/mystery_event_msg.h
@@ -1,7 +1,7 @@
#ifndef GUARD_MYSTERY_EVENT_MSG_H
#define GUARD_MYSTERY_EVENT_MSG_H
-#include <gba/gba.h>
+#include "gba/gba.h"
extern const u8 gText_MysteryGiftBerry[];
extern const u8 gText_MysteryGiftBerryTransform[];
diff --git a/include/mystery_gift_menu.h b/include/mystery_gift_menu.h
index 24bf85a13..c7b047f56 100644
--- a/include/mystery_gift_menu.h
+++ b/include/mystery_gift_menu.h
@@ -1,9 +1,9 @@
#ifndef GUARD_MYSTERY_GIFT_MENU_H
#define GUARD_MYSTERY_GIFT_MENU_H
-extern bool8 gUnknown_203F3B8;
+extern bool8 gGiftIsFromEReader;
-void sub_81422FC(void);
-void sub_8142344(bool8, bool32);
+void MainCB_FreeAllBuffersAndReturnToInitTitleScreen(void);
+void PrintMysteryGiftOrEReaderTopMenu(bool8, bool32);
#endif //GUARD_MYSTERY_GIFT_MENU_H
diff --git a/include/new_menu_helpers.h b/include/new_menu_helpers.h
index b17326667..fc9c1b9dc 100644
--- a/include/new_menu_helpers.h
+++ b/include/new_menu_helpers.h
@@ -30,5 +30,6 @@ void Menu_LoadStdPalAt(u16);
void * malloc_and_decompress(const void * src, u32 * size);
u16 sub_80F796C(void);
void sub_80F6B08(u8 bgId, u8 left, u8 top, u8 width, u8 height, u8 palette);
+void sub_80F696C(u8 bgId, const void * gfx, u32 size, u16 a3, u8 a4);
#endif // GUARD_NEW_MENU_HELPERS_H
diff --git a/include/overworld.h b/include/overworld.h
index 234fb7c01..ac3d5283f 100644
--- a/include/overworld.h
+++ b/include/overworld.h
@@ -96,11 +96,17 @@ void sub_80563F0(void);
extern u8 gUnknown_2031DD8;
extern u8 gUnknown_2036E28;
+extern void (*gUnknown_3005020)(void);
extern bool8 (* gFieldCallback2)(void);
+
void SetLastHealLocationWarp(u8 healLocaionId);
void sub_8055864(u8 mapGroup, u8 mapNum);
void CB2_NewGame(void);
bool8 Overworld_MapTypeAllowsTeleportAndFly(u8 mapType);
void Overworld_ResetStateAfterTeleport(void);
+void Overworld_FadeOutMapMusic(void);
+void sub_805671C(void);
+bool8 sub_8055FC4(void);
+
#endif //GUARD_ROM4_H
diff --git a/include/seagallop.h b/include/seagallop.h
new file mode 100644
index 000000000..cce6da8ff
--- /dev/null
+++ b/include/seagallop.h
@@ -0,0 +1,21 @@
+#ifndef GUARD_SEAGALLOP_H
+#define GUARD_SEAGALLOP_H
+
+enum SeaGallopDestinations
+{
+ SEAGALLOP_VERMILION_CITY,
+ SEAGALLOP_ONE_ISLAND,
+ SEAGALLOP_TWO_ISLAND,
+ SEAGALLOP_THREE_ISLAND,
+ SEAGALLOP_FOUR_ISLAND,
+ SEAGALLOP_FIVE_ISLAND,
+ SEAGALLOP_SIX_ISLAND,
+ SEAGALLOP_SEVEN_ISLAND,
+ SEAGALLOP_CINNABAR_ISLAND,
+ SEAGALLOP_NAVEL_ROCK,
+ SEAGALLOP_BIRTH_ISLAND
+};
+
+void ScrSpecial_SeaGallopFerry(void);
+
+#endif //GUARD_SEAGALLOP_H
diff --git a/include/text_window.h b/include/text_window.h
index 8a4113c62..9fbc90799 100644
--- a/include/text_window.h
+++ b/include/text_window.h
@@ -23,5 +23,8 @@ void sub_8098C6C(u8 bg, u16 destOffset, u8 palOffset);
void sub_814FEAC(u8 windowId, u16 tileStart, u8 palette);
void sub_814FF2C(u8 windowId, u16 tileStart, u8 palette);
void sub_815001C(u8 windowId, u16 tileStart, u8 palette);
+void sub_814FE40(u8 windowId, u16 tileStart, u8 palette);
+void sub_814FDA0(u8 windowId, u16 tileStart, u8 palette);
+void DrawTextBorderOuter(u8 windowId, u16 tileStart, u8 palette);
#endif // GUARD_TEXT_WINDOW_H
diff --git a/include/title_screen.h b/include/title_screen.h
new file mode 100644
index 000000000..8e7a6a275
--- /dev/null
+++ b/include/title_screen.h
@@ -0,0 +1,6 @@
+#ifndef GUARD_TITLE_SCREEN_H
+#define GUARD_TITLE_SCREEN_H
+
+void CB2_InitTitleScreen(void);
+
+#endif //GUARD_TITLE_SCREEN_H
diff --git a/ld_script.txt b/ld_script.txt
index 86464ee98..5c6b562a1 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -30,7 +30,7 @@ SECTIONS {
<BSS>
/* .bss.code starts at 0x30028E0 */
- src/m4a_2.o(.bss.code);
+ src/m4a.o(.bss.code);
/* COMMON starts at 0x30030E0 */
<COMMON>
@@ -55,7 +55,7 @@ SECTIONS {
src/text_printer.o(.text);
asm/text_printer.o(.text);
src/window.o(.text);
- asm/blit.o(.text);
+ src/blit.o(.text);
src/window_8bpp.o(.text);
src/text.o(.text);
src/sprite.o(.text);
@@ -241,14 +241,13 @@ SECTIONS {
asm/buy_menu_helpers.o(.text);
asm/slot_machine.o(.text);
src/roamer.o(.text);
- asm/mystery_gift_menu.o(.text);
- asm/link_rfu_4.o(.text);
+ src/mystery_gift_menu.o(.text);
src/mevent.o(.text);
src/mevent_server_helpers.o(.text);
src/mevent_server.o(.text);
src/mevent_8145654.o(.text);
src/menews_jisan.o(.text);
- asm/seagallop.o(.text);
+ src/seagallop.o(.text);
asm/unk_8147500.o(.text);
asm/unk_8147AA8.o(.text);
asm/unk_814B6F0.o(.text);
@@ -289,9 +288,7 @@ SECTIONS {
{
asm/libgcnmultiboot.o(.text);
asm/m4a_1.o(.text);
- src/m4a_2.o(.text);
- asm/m4a_3.o(.text);
- src/m4a_4.o(.text);
+ src/m4a.o(.text);
src/agb_flash.o(.text);
src/agb_flash_1m.o(.text);
src/agb_flash_mx.o(.text);
@@ -411,8 +408,7 @@ SECTIONS {
data/buy_menu_helpers.o(.rodata);
data/slot_machine.o(.rodata);
src/roamer.o(.rodata);
- data/mystery_gift_menu.o(.rodata);
- data/link_rfu_4.o(.rodata);
+ src/mystery_gift_menu.o(.rodata);
src/mevent.o(.rodata);
src/mevent_server_helpers.o(.rodata);
src/mevent_server.o(.rodata);
@@ -420,6 +416,8 @@ SECTIONS {
data/data_8466FB8.o(.rodata);
src/menews_jisan.o(.rodata);
src/menews_jisan.o(.rodata.str1.4);
+ . = ALIGN(4);
+ src/seagallop.o(.rodata);
data/data_8468C98.o(.rodata);
src/quest_log_8150454.o(.rodata);
data/data_8471F00.o(.rodata);
diff --git a/sound/direct_sound_samples/cry_abra.aif b/sound/direct_sound_samples/cry_abra.aif
new file mode 100644
index 000000000..7df4446db
--- /dev/null
+++ b/sound/direct_sound_samples/cry_abra.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_absol.aif b/sound/direct_sound_samples/cry_absol.aif
new file mode 100644
index 000000000..884ab22b3
--- /dev/null
+++ b/sound/direct_sound_samples/cry_absol.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_aerodactyl.aif b/sound/direct_sound_samples/cry_aerodactyl.aif
new file mode 100644
index 000000000..c0e40f6d1
--- /dev/null
+++ b/sound/direct_sound_samples/cry_aerodactyl.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_aggron.aif b/sound/direct_sound_samples/cry_aggron.aif
new file mode 100644
index 000000000..b89ea1222
--- /dev/null
+++ b/sound/direct_sound_samples/cry_aggron.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_aipom.aif b/sound/direct_sound_samples/cry_aipom.aif
new file mode 100644
index 000000000..5ca276de2
--- /dev/null
+++ b/sound/direct_sound_samples/cry_aipom.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_alakazam.aif b/sound/direct_sound_samples/cry_alakazam.aif
new file mode 100644
index 000000000..920e2ff94
--- /dev/null
+++ b/sound/direct_sound_samples/cry_alakazam.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_altaria.aif b/sound/direct_sound_samples/cry_altaria.aif
new file mode 100644
index 000000000..3e8e35e8e
--- /dev/null
+++ b/sound/direct_sound_samples/cry_altaria.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_ampharos.aif b/sound/direct_sound_samples/cry_ampharos.aif
new file mode 100644
index 000000000..4f6e255a0
--- /dev/null
+++ b/sound/direct_sound_samples/cry_ampharos.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_anorith.aif b/sound/direct_sound_samples/cry_anorith.aif
new file mode 100644
index 000000000..96e87e919
--- /dev/null
+++ b/sound/direct_sound_samples/cry_anorith.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_arbok.aif b/sound/direct_sound_samples/cry_arbok.aif
new file mode 100644
index 000000000..6ccace9f9
--- /dev/null
+++ b/sound/direct_sound_samples/cry_arbok.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_arcanine.aif b/sound/direct_sound_samples/cry_arcanine.aif
new file mode 100644
index 000000000..61d802153
--- /dev/null
+++ b/sound/direct_sound_samples/cry_arcanine.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_ariados.aif b/sound/direct_sound_samples/cry_ariados.aif
new file mode 100644
index 000000000..1748624fb
--- /dev/null
+++ b/sound/direct_sound_samples/cry_ariados.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_armaldo.aif b/sound/direct_sound_samples/cry_armaldo.aif
new file mode 100644
index 000000000..756bf0842
--- /dev/null
+++ b/sound/direct_sound_samples/cry_armaldo.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_aron.aif b/sound/direct_sound_samples/cry_aron.aif
new file mode 100644
index 000000000..cce70b73b
--- /dev/null
+++ b/sound/direct_sound_samples/cry_aron.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_articuno.aif b/sound/direct_sound_samples/cry_articuno.aif
new file mode 100644
index 000000000..4f237dd0f
--- /dev/null
+++ b/sound/direct_sound_samples/cry_articuno.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_azumarill.aif b/sound/direct_sound_samples/cry_azumarill.aif
new file mode 100644
index 000000000..18411f93c
--- /dev/null
+++ b/sound/direct_sound_samples/cry_azumarill.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_azurill.aif b/sound/direct_sound_samples/cry_azurill.aif
new file mode 100644
index 000000000..7f651c3d3
--- /dev/null
+++ b/sound/direct_sound_samples/cry_azurill.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_bagon.aif b/sound/direct_sound_samples/cry_bagon.aif
new file mode 100644
index 000000000..3843fb9f4
--- /dev/null
+++ b/sound/direct_sound_samples/cry_bagon.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_baltoy.aif b/sound/direct_sound_samples/cry_baltoy.aif
new file mode 100644
index 000000000..25e1a708a
--- /dev/null
+++ b/sound/direct_sound_samples/cry_baltoy.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_banette.aif b/sound/direct_sound_samples/cry_banette.aif
new file mode 100644
index 000000000..23713f1b5
--- /dev/null
+++ b/sound/direct_sound_samples/cry_banette.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_barboach.aif b/sound/direct_sound_samples/cry_barboach.aif
new file mode 100644
index 000000000..4b9228259
--- /dev/null
+++ b/sound/direct_sound_samples/cry_barboach.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_bayleef.aif b/sound/direct_sound_samples/cry_bayleef.aif
new file mode 100644
index 000000000..8cef22df3
--- /dev/null
+++ b/sound/direct_sound_samples/cry_bayleef.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_beautifly.aif b/sound/direct_sound_samples/cry_beautifly.aif
new file mode 100644
index 000000000..0924b6c55
--- /dev/null
+++ b/sound/direct_sound_samples/cry_beautifly.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_beedrill.aif b/sound/direct_sound_samples/cry_beedrill.aif
new file mode 100644
index 000000000..00d0bc96c
--- /dev/null
+++ b/sound/direct_sound_samples/cry_beedrill.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_beldum.aif b/sound/direct_sound_samples/cry_beldum.aif
new file mode 100644
index 000000000..76435a6a8
--- /dev/null
+++ b/sound/direct_sound_samples/cry_beldum.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_bellossom.aif b/sound/direct_sound_samples/cry_bellossom.aif
new file mode 100644
index 000000000..86580df65
--- /dev/null
+++ b/sound/direct_sound_samples/cry_bellossom.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_bellsprout.aif b/sound/direct_sound_samples/cry_bellsprout.aif
new file mode 100644
index 000000000..cfdd7aed2
--- /dev/null
+++ b/sound/direct_sound_samples/cry_bellsprout.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_blastoise.aif b/sound/direct_sound_samples/cry_blastoise.aif
new file mode 100644
index 000000000..76dac2bcc
--- /dev/null
+++ b/sound/direct_sound_samples/cry_blastoise.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_blaziken.aif b/sound/direct_sound_samples/cry_blaziken.aif
new file mode 100644
index 000000000..83e5ccf23
--- /dev/null
+++ b/sound/direct_sound_samples/cry_blaziken.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_blissey.aif b/sound/direct_sound_samples/cry_blissey.aif
new file mode 100644
index 000000000..897eb3d69
--- /dev/null
+++ b/sound/direct_sound_samples/cry_blissey.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_breloom.aif b/sound/direct_sound_samples/cry_breloom.aif
new file mode 100644
index 000000000..ea3f1bb66
--- /dev/null
+++ b/sound/direct_sound_samples/cry_breloom.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_bulbasaur.aif b/sound/direct_sound_samples/cry_bulbasaur.aif
new file mode 100644
index 000000000..040fb1df7
--- /dev/null
+++ b/sound/direct_sound_samples/cry_bulbasaur.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_butterfree.aif b/sound/direct_sound_samples/cry_butterfree.aif
new file mode 100644
index 000000000..f27616395
--- /dev/null
+++ b/sound/direct_sound_samples/cry_butterfree.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_cacnea.aif b/sound/direct_sound_samples/cry_cacnea.aif
new file mode 100644
index 000000000..4fd5acd36
--- /dev/null
+++ b/sound/direct_sound_samples/cry_cacnea.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_cacturne.aif b/sound/direct_sound_samples/cry_cacturne.aif
new file mode 100644
index 000000000..d9fb8fda8
--- /dev/null
+++ b/sound/direct_sound_samples/cry_cacturne.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_camerupt.aif b/sound/direct_sound_samples/cry_camerupt.aif
new file mode 100644
index 000000000..325df1220
--- /dev/null
+++ b/sound/direct_sound_samples/cry_camerupt.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_carvanha.aif b/sound/direct_sound_samples/cry_carvanha.aif
new file mode 100644
index 000000000..c7cdedf91
--- /dev/null
+++ b/sound/direct_sound_samples/cry_carvanha.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_cascoon.aif b/sound/direct_sound_samples/cry_cascoon.aif
new file mode 100644
index 000000000..17eef0ee9
--- /dev/null
+++ b/sound/direct_sound_samples/cry_cascoon.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_castform.aif b/sound/direct_sound_samples/cry_castform.aif
new file mode 100644
index 000000000..c10745640
--- /dev/null
+++ b/sound/direct_sound_samples/cry_castform.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_caterpie.aif b/sound/direct_sound_samples/cry_caterpie.aif
new file mode 100644
index 000000000..b0b246b4f
--- /dev/null
+++ b/sound/direct_sound_samples/cry_caterpie.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_celebi.aif b/sound/direct_sound_samples/cry_celebi.aif
new file mode 100644
index 000000000..9f9f3ea39
--- /dev/null
+++ b/sound/direct_sound_samples/cry_celebi.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_chansey.aif b/sound/direct_sound_samples/cry_chansey.aif
new file mode 100644
index 000000000..d764c86ce
--- /dev/null
+++ b/sound/direct_sound_samples/cry_chansey.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_charizard.aif b/sound/direct_sound_samples/cry_charizard.aif
new file mode 100644
index 000000000..48321b792
--- /dev/null
+++ b/sound/direct_sound_samples/cry_charizard.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_charmander.aif b/sound/direct_sound_samples/cry_charmander.aif
new file mode 100644
index 000000000..d72c0f9e0
--- /dev/null
+++ b/sound/direct_sound_samples/cry_charmander.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_charmeleon.aif b/sound/direct_sound_samples/cry_charmeleon.aif
new file mode 100644
index 000000000..8e84af0d8
--- /dev/null
+++ b/sound/direct_sound_samples/cry_charmeleon.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_chikorita.aif b/sound/direct_sound_samples/cry_chikorita.aif
new file mode 100644
index 000000000..67ceafdc3
--- /dev/null
+++ b/sound/direct_sound_samples/cry_chikorita.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_chimecho.aif b/sound/direct_sound_samples/cry_chimecho.aif
new file mode 100644
index 000000000..87ee2faee
--- /dev/null
+++ b/sound/direct_sound_samples/cry_chimecho.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_chinchou.aif b/sound/direct_sound_samples/cry_chinchou.aif
new file mode 100644
index 000000000..356475678
--- /dev/null
+++ b/sound/direct_sound_samples/cry_chinchou.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_clamperl.aif b/sound/direct_sound_samples/cry_clamperl.aif
new file mode 100644
index 000000000..7250bd703
--- /dev/null
+++ b/sound/direct_sound_samples/cry_clamperl.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_claydol.aif b/sound/direct_sound_samples/cry_claydol.aif
new file mode 100644
index 000000000..b89772021
--- /dev/null
+++ b/sound/direct_sound_samples/cry_claydol.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_clefable.aif b/sound/direct_sound_samples/cry_clefable.aif
new file mode 100644
index 000000000..9c2d8c664
--- /dev/null
+++ b/sound/direct_sound_samples/cry_clefable.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_clefairy.aif b/sound/direct_sound_samples/cry_clefairy.aif
new file mode 100644
index 000000000..c370c4a9b
--- /dev/null
+++ b/sound/direct_sound_samples/cry_clefairy.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_cleffa.aif b/sound/direct_sound_samples/cry_cleffa.aif
new file mode 100644
index 000000000..b27cdeca9
--- /dev/null
+++ b/sound/direct_sound_samples/cry_cleffa.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_cloyster.aif b/sound/direct_sound_samples/cry_cloyster.aif
new file mode 100644
index 000000000..b406deab0
--- /dev/null
+++ b/sound/direct_sound_samples/cry_cloyster.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_combusken.aif b/sound/direct_sound_samples/cry_combusken.aif
new file mode 100644
index 000000000..7d4b0d4cc
--- /dev/null
+++ b/sound/direct_sound_samples/cry_combusken.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_corphish.aif b/sound/direct_sound_samples/cry_corphish.aif
new file mode 100644
index 000000000..f0f5ca01e
--- /dev/null
+++ b/sound/direct_sound_samples/cry_corphish.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_corsola.aif b/sound/direct_sound_samples/cry_corsola.aif
new file mode 100644
index 000000000..68e743bfd
--- /dev/null
+++ b/sound/direct_sound_samples/cry_corsola.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_cradily.aif b/sound/direct_sound_samples/cry_cradily.aif
new file mode 100644
index 000000000..197dc8d92
--- /dev/null
+++ b/sound/direct_sound_samples/cry_cradily.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_crawdaunt.aif b/sound/direct_sound_samples/cry_crawdaunt.aif
new file mode 100644
index 000000000..a203ce2fb
--- /dev/null
+++ b/sound/direct_sound_samples/cry_crawdaunt.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_crobat.aif b/sound/direct_sound_samples/cry_crobat.aif
new file mode 100644
index 000000000..75d039bd8
--- /dev/null
+++ b/sound/direct_sound_samples/cry_crobat.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_croconaw.aif b/sound/direct_sound_samples/cry_croconaw.aif
new file mode 100644
index 000000000..afb7f3fdc
--- /dev/null
+++ b/sound/direct_sound_samples/cry_croconaw.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_cubone.aif b/sound/direct_sound_samples/cry_cubone.aif
new file mode 100644
index 000000000..170745da1
--- /dev/null
+++ b/sound/direct_sound_samples/cry_cubone.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_cyndaquil.aif b/sound/direct_sound_samples/cry_cyndaquil.aif
new file mode 100644
index 000000000..4aa580199
--- /dev/null
+++ b/sound/direct_sound_samples/cry_cyndaquil.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_delcatty.aif b/sound/direct_sound_samples/cry_delcatty.aif
new file mode 100644
index 000000000..dd665b110
--- /dev/null
+++ b/sound/direct_sound_samples/cry_delcatty.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_delibird.aif b/sound/direct_sound_samples/cry_delibird.aif
new file mode 100644
index 000000000..dbedc42d4
--- /dev/null
+++ b/sound/direct_sound_samples/cry_delibird.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_deoxys.aif b/sound/direct_sound_samples/cry_deoxys.aif
new file mode 100644
index 000000000..b9623b337
--- /dev/null
+++ b/sound/direct_sound_samples/cry_deoxys.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_dewgong.aif b/sound/direct_sound_samples/cry_dewgong.aif
new file mode 100644
index 000000000..72d69b773
--- /dev/null
+++ b/sound/direct_sound_samples/cry_dewgong.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_diglett.aif b/sound/direct_sound_samples/cry_diglett.aif
new file mode 100644
index 000000000..b116af7f2
--- /dev/null
+++ b/sound/direct_sound_samples/cry_diglett.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_ditto.aif b/sound/direct_sound_samples/cry_ditto.aif
new file mode 100644
index 000000000..2c797f4c4
--- /dev/null
+++ b/sound/direct_sound_samples/cry_ditto.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_dodrio.aif b/sound/direct_sound_samples/cry_dodrio.aif
new file mode 100644
index 000000000..111d8bf3e
--- /dev/null
+++ b/sound/direct_sound_samples/cry_dodrio.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_doduo.aif b/sound/direct_sound_samples/cry_doduo.aif
new file mode 100644
index 000000000..5700b91d9
--- /dev/null
+++ b/sound/direct_sound_samples/cry_doduo.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_donphan.aif b/sound/direct_sound_samples/cry_donphan.aif
new file mode 100644
index 000000000..a41c124b1
--- /dev/null
+++ b/sound/direct_sound_samples/cry_donphan.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_dragonair.aif b/sound/direct_sound_samples/cry_dragonair.aif
new file mode 100644
index 000000000..38c3955ef
--- /dev/null
+++ b/sound/direct_sound_samples/cry_dragonair.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_dragonite.aif b/sound/direct_sound_samples/cry_dragonite.aif
new file mode 100644
index 000000000..d1e7b11cf
--- /dev/null
+++ b/sound/direct_sound_samples/cry_dragonite.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_dratini.aif b/sound/direct_sound_samples/cry_dratini.aif
new file mode 100644
index 000000000..298497480
--- /dev/null
+++ b/sound/direct_sound_samples/cry_dratini.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_drowzee.aif b/sound/direct_sound_samples/cry_drowzee.aif
new file mode 100644
index 000000000..0d53eb2ff
--- /dev/null
+++ b/sound/direct_sound_samples/cry_drowzee.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_dugtrio.aif b/sound/direct_sound_samples/cry_dugtrio.aif
new file mode 100644
index 000000000..dff573dfe
--- /dev/null
+++ b/sound/direct_sound_samples/cry_dugtrio.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_dunsparce.aif b/sound/direct_sound_samples/cry_dunsparce.aif
new file mode 100644
index 000000000..454617c05
--- /dev/null
+++ b/sound/direct_sound_samples/cry_dunsparce.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_dusclops.aif b/sound/direct_sound_samples/cry_dusclops.aif
new file mode 100644
index 000000000..de9657e4f
--- /dev/null
+++ b/sound/direct_sound_samples/cry_dusclops.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_duskull.aif b/sound/direct_sound_samples/cry_duskull.aif
new file mode 100644
index 000000000..d84ea274e
--- /dev/null
+++ b/sound/direct_sound_samples/cry_duskull.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_dustox.aif b/sound/direct_sound_samples/cry_dustox.aif
new file mode 100644
index 000000000..56d8eb336
--- /dev/null
+++ b/sound/direct_sound_samples/cry_dustox.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_eevee.aif b/sound/direct_sound_samples/cry_eevee.aif
new file mode 100644
index 000000000..8711a1470
--- /dev/null
+++ b/sound/direct_sound_samples/cry_eevee.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_ekans.aif b/sound/direct_sound_samples/cry_ekans.aif
new file mode 100644
index 000000000..9eb396735
--- /dev/null
+++ b/sound/direct_sound_samples/cry_ekans.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_electabuzz.aif b/sound/direct_sound_samples/cry_electabuzz.aif
new file mode 100644
index 000000000..5abdb49b7
--- /dev/null
+++ b/sound/direct_sound_samples/cry_electabuzz.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_electrike.aif b/sound/direct_sound_samples/cry_electrike.aif
new file mode 100644
index 000000000..56c9666df
--- /dev/null
+++ b/sound/direct_sound_samples/cry_electrike.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_electrode.aif b/sound/direct_sound_samples/cry_electrode.aif
new file mode 100644
index 000000000..cbd7f0971
--- /dev/null
+++ b/sound/direct_sound_samples/cry_electrode.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_elekid.aif b/sound/direct_sound_samples/cry_elekid.aif
new file mode 100644
index 000000000..839bdee17
--- /dev/null
+++ b/sound/direct_sound_samples/cry_elekid.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_entei.aif b/sound/direct_sound_samples/cry_entei.aif
new file mode 100644
index 000000000..56a740207
--- /dev/null
+++ b/sound/direct_sound_samples/cry_entei.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_espeon.aif b/sound/direct_sound_samples/cry_espeon.aif
new file mode 100644
index 000000000..53dc62f4d
--- /dev/null
+++ b/sound/direct_sound_samples/cry_espeon.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_exeggcute.aif b/sound/direct_sound_samples/cry_exeggcute.aif
new file mode 100644
index 000000000..147912c2f
--- /dev/null
+++ b/sound/direct_sound_samples/cry_exeggcute.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_exeggutor.aif b/sound/direct_sound_samples/cry_exeggutor.aif
new file mode 100644
index 000000000..c0b9177bf
--- /dev/null
+++ b/sound/direct_sound_samples/cry_exeggutor.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_exploud.aif b/sound/direct_sound_samples/cry_exploud.aif
new file mode 100644
index 000000000..5b80870cc
--- /dev/null
+++ b/sound/direct_sound_samples/cry_exploud.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_farfetchd.aif b/sound/direct_sound_samples/cry_farfetchd.aif
new file mode 100644
index 000000000..f1db556dc
--- /dev/null
+++ b/sound/direct_sound_samples/cry_farfetchd.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_fearow.aif b/sound/direct_sound_samples/cry_fearow.aif
new file mode 100644
index 000000000..74a76f6d4
--- /dev/null
+++ b/sound/direct_sound_samples/cry_fearow.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_feebas.aif b/sound/direct_sound_samples/cry_feebas.aif
new file mode 100644
index 000000000..c386522f1
--- /dev/null
+++ b/sound/direct_sound_samples/cry_feebas.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_feraligatr.aif b/sound/direct_sound_samples/cry_feraligatr.aif
new file mode 100644
index 000000000..9fcd93cff
--- /dev/null
+++ b/sound/direct_sound_samples/cry_feraligatr.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_flaaffy.aif b/sound/direct_sound_samples/cry_flaaffy.aif
new file mode 100644
index 000000000..93dfacfaf
--- /dev/null
+++ b/sound/direct_sound_samples/cry_flaaffy.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_flareon.aif b/sound/direct_sound_samples/cry_flareon.aif
new file mode 100644
index 000000000..58d28e60a
--- /dev/null
+++ b/sound/direct_sound_samples/cry_flareon.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_flygon.aif b/sound/direct_sound_samples/cry_flygon.aif
new file mode 100644
index 000000000..c8c377016
--- /dev/null
+++ b/sound/direct_sound_samples/cry_flygon.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_forretress.aif b/sound/direct_sound_samples/cry_forretress.aif
new file mode 100644
index 000000000..288dacbea
--- /dev/null
+++ b/sound/direct_sound_samples/cry_forretress.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_furret.aif b/sound/direct_sound_samples/cry_furret.aif
new file mode 100644
index 000000000..6b4e9ce11
--- /dev/null
+++ b/sound/direct_sound_samples/cry_furret.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_gardevoir.aif b/sound/direct_sound_samples/cry_gardevoir.aif
new file mode 100644
index 000000000..a14780990
--- /dev/null
+++ b/sound/direct_sound_samples/cry_gardevoir.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_gastly.aif b/sound/direct_sound_samples/cry_gastly.aif
new file mode 100644
index 000000000..93cef851d
--- /dev/null
+++ b/sound/direct_sound_samples/cry_gastly.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_gengar.aif b/sound/direct_sound_samples/cry_gengar.aif
new file mode 100644
index 000000000..379b5d37e
--- /dev/null
+++ b/sound/direct_sound_samples/cry_gengar.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_geodude.aif b/sound/direct_sound_samples/cry_geodude.aif
new file mode 100644
index 000000000..143b9031c
--- /dev/null
+++ b/sound/direct_sound_samples/cry_geodude.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_girafarig.aif b/sound/direct_sound_samples/cry_girafarig.aif
new file mode 100644
index 000000000..1dd5f93e2
--- /dev/null
+++ b/sound/direct_sound_samples/cry_girafarig.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_glalie.aif b/sound/direct_sound_samples/cry_glalie.aif
new file mode 100644
index 000000000..e4e896547
--- /dev/null
+++ b/sound/direct_sound_samples/cry_glalie.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_gligar.aif b/sound/direct_sound_samples/cry_gligar.aif
new file mode 100644
index 000000000..4050f08b0
--- /dev/null
+++ b/sound/direct_sound_samples/cry_gligar.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_gloom.aif b/sound/direct_sound_samples/cry_gloom.aif
new file mode 100644
index 000000000..e930328ac
--- /dev/null
+++ b/sound/direct_sound_samples/cry_gloom.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_golbat.aif b/sound/direct_sound_samples/cry_golbat.aif
new file mode 100644
index 000000000..11413df3a
--- /dev/null
+++ b/sound/direct_sound_samples/cry_golbat.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_goldeen.aif b/sound/direct_sound_samples/cry_goldeen.aif
new file mode 100644
index 000000000..81fd1ecdf
--- /dev/null
+++ b/sound/direct_sound_samples/cry_goldeen.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_golduck.aif b/sound/direct_sound_samples/cry_golduck.aif
new file mode 100644
index 000000000..b6b71a7a4
--- /dev/null
+++ b/sound/direct_sound_samples/cry_golduck.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_golem.aif b/sound/direct_sound_samples/cry_golem.aif
new file mode 100644
index 000000000..0d2c4515e
--- /dev/null
+++ b/sound/direct_sound_samples/cry_golem.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_gorebyss.aif b/sound/direct_sound_samples/cry_gorebyss.aif
new file mode 100644
index 000000000..b7605062c
--- /dev/null
+++ b/sound/direct_sound_samples/cry_gorebyss.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_granbull.aif b/sound/direct_sound_samples/cry_granbull.aif
new file mode 100644
index 000000000..146b3bd0c
--- /dev/null
+++ b/sound/direct_sound_samples/cry_granbull.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_graveler.aif b/sound/direct_sound_samples/cry_graveler.aif
new file mode 100644
index 000000000..773994228
--- /dev/null
+++ b/sound/direct_sound_samples/cry_graveler.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_grimer.aif b/sound/direct_sound_samples/cry_grimer.aif
new file mode 100644
index 000000000..95eed1061
--- /dev/null
+++ b/sound/direct_sound_samples/cry_grimer.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_groudon.aif b/sound/direct_sound_samples/cry_groudon.aif
new file mode 100644
index 000000000..62452b4d9
--- /dev/null
+++ b/sound/direct_sound_samples/cry_groudon.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_grovyle.aif b/sound/direct_sound_samples/cry_grovyle.aif
new file mode 100644
index 000000000..983bcfff3
--- /dev/null
+++ b/sound/direct_sound_samples/cry_grovyle.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_growlithe.aif b/sound/direct_sound_samples/cry_growlithe.aif
new file mode 100644
index 000000000..134e29834
--- /dev/null
+++ b/sound/direct_sound_samples/cry_growlithe.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_grumpig.aif b/sound/direct_sound_samples/cry_grumpig.aif
new file mode 100644
index 000000000..97c372076
--- /dev/null
+++ b/sound/direct_sound_samples/cry_grumpig.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_gulpin.aif b/sound/direct_sound_samples/cry_gulpin.aif
new file mode 100644
index 000000000..f3043b422
--- /dev/null
+++ b/sound/direct_sound_samples/cry_gulpin.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_gyarados.aif b/sound/direct_sound_samples/cry_gyarados.aif
new file mode 100644
index 000000000..238b6d721
--- /dev/null
+++ b/sound/direct_sound_samples/cry_gyarados.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_hariyama.aif b/sound/direct_sound_samples/cry_hariyama.aif
new file mode 100644
index 000000000..1ac1f3f7e
--- /dev/null
+++ b/sound/direct_sound_samples/cry_hariyama.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_haunter.aif b/sound/direct_sound_samples/cry_haunter.aif
new file mode 100644
index 000000000..60ec72171
--- /dev/null
+++ b/sound/direct_sound_samples/cry_haunter.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_heracross.aif b/sound/direct_sound_samples/cry_heracross.aif
new file mode 100644
index 000000000..a0734748f
--- /dev/null
+++ b/sound/direct_sound_samples/cry_heracross.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_hitmonchan.aif b/sound/direct_sound_samples/cry_hitmonchan.aif
new file mode 100644
index 000000000..40479452c
--- /dev/null
+++ b/sound/direct_sound_samples/cry_hitmonchan.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_hitmonlee.aif b/sound/direct_sound_samples/cry_hitmonlee.aif
new file mode 100644
index 000000000..3a4bcddca
--- /dev/null
+++ b/sound/direct_sound_samples/cry_hitmonlee.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_hitmontop.aif b/sound/direct_sound_samples/cry_hitmontop.aif
new file mode 100644
index 000000000..3fbee8041
--- /dev/null
+++ b/sound/direct_sound_samples/cry_hitmontop.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_ho_oh.aif b/sound/direct_sound_samples/cry_ho_oh.aif
new file mode 100644
index 000000000..52f8dd307
--- /dev/null
+++ b/sound/direct_sound_samples/cry_ho_oh.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_hoothoot.aif b/sound/direct_sound_samples/cry_hoothoot.aif
new file mode 100644
index 000000000..59e685dcc
--- /dev/null
+++ b/sound/direct_sound_samples/cry_hoothoot.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_hoppip.aif b/sound/direct_sound_samples/cry_hoppip.aif
new file mode 100644
index 000000000..ea47877d0
--- /dev/null
+++ b/sound/direct_sound_samples/cry_hoppip.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_horsea.aif b/sound/direct_sound_samples/cry_horsea.aif
new file mode 100644
index 000000000..e41eff4b1
--- /dev/null
+++ b/sound/direct_sound_samples/cry_horsea.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_houndoom.aif b/sound/direct_sound_samples/cry_houndoom.aif
new file mode 100644
index 000000000..6fec16d39
--- /dev/null
+++ b/sound/direct_sound_samples/cry_houndoom.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_houndour.aif b/sound/direct_sound_samples/cry_houndour.aif
new file mode 100644
index 000000000..7431bbf29
--- /dev/null
+++ b/sound/direct_sound_samples/cry_houndour.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_huntail.aif b/sound/direct_sound_samples/cry_huntail.aif
new file mode 100644
index 000000000..f1d3b29d9
--- /dev/null
+++ b/sound/direct_sound_samples/cry_huntail.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_hypno.aif b/sound/direct_sound_samples/cry_hypno.aif
new file mode 100644
index 000000000..32672a3c3
--- /dev/null
+++ b/sound/direct_sound_samples/cry_hypno.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_igglybuff.aif b/sound/direct_sound_samples/cry_igglybuff.aif
new file mode 100644
index 000000000..8de8394d5
--- /dev/null
+++ b/sound/direct_sound_samples/cry_igglybuff.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_illumise.aif b/sound/direct_sound_samples/cry_illumise.aif
new file mode 100644
index 000000000..75e03efc8
--- /dev/null
+++ b/sound/direct_sound_samples/cry_illumise.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_ivysaur.aif b/sound/direct_sound_samples/cry_ivysaur.aif
new file mode 100644
index 000000000..ea474ff88
--- /dev/null
+++ b/sound/direct_sound_samples/cry_ivysaur.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_jigglypuff.aif b/sound/direct_sound_samples/cry_jigglypuff.aif
new file mode 100644
index 000000000..780424b4f
--- /dev/null
+++ b/sound/direct_sound_samples/cry_jigglypuff.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_jirachi.aif b/sound/direct_sound_samples/cry_jirachi.aif
new file mode 100644
index 000000000..ea8a5c8ad
--- /dev/null
+++ b/sound/direct_sound_samples/cry_jirachi.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_jolteon.aif b/sound/direct_sound_samples/cry_jolteon.aif
new file mode 100644
index 000000000..013369158
--- /dev/null
+++ b/sound/direct_sound_samples/cry_jolteon.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_jumpluff.aif b/sound/direct_sound_samples/cry_jumpluff.aif
new file mode 100644
index 000000000..13b0fd315
--- /dev/null
+++ b/sound/direct_sound_samples/cry_jumpluff.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_jynx.aif b/sound/direct_sound_samples/cry_jynx.aif
new file mode 100644
index 000000000..7394a48a2
--- /dev/null
+++ b/sound/direct_sound_samples/cry_jynx.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_kabuto.aif b/sound/direct_sound_samples/cry_kabuto.aif
new file mode 100644
index 000000000..6ae9801b5
--- /dev/null
+++ b/sound/direct_sound_samples/cry_kabuto.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_kabutops.aif b/sound/direct_sound_samples/cry_kabutops.aif
new file mode 100644
index 000000000..f23778e57
--- /dev/null
+++ b/sound/direct_sound_samples/cry_kabutops.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_kadabra.aif b/sound/direct_sound_samples/cry_kadabra.aif
new file mode 100644
index 000000000..bfcc18031
--- /dev/null
+++ b/sound/direct_sound_samples/cry_kadabra.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_kakuna.aif b/sound/direct_sound_samples/cry_kakuna.aif
new file mode 100644
index 000000000..7c4e9d7a8
--- /dev/null
+++ b/sound/direct_sound_samples/cry_kakuna.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_kangaskhan.aif b/sound/direct_sound_samples/cry_kangaskhan.aif
new file mode 100644
index 000000000..643e81eb7
--- /dev/null
+++ b/sound/direct_sound_samples/cry_kangaskhan.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_kecleon.aif b/sound/direct_sound_samples/cry_kecleon.aif
new file mode 100644
index 000000000..f27ae1832
--- /dev/null
+++ b/sound/direct_sound_samples/cry_kecleon.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_kingdra.aif b/sound/direct_sound_samples/cry_kingdra.aif
new file mode 100644
index 000000000..ade230c82
--- /dev/null
+++ b/sound/direct_sound_samples/cry_kingdra.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_kingler.aif b/sound/direct_sound_samples/cry_kingler.aif
new file mode 100644
index 000000000..a1d845f45
--- /dev/null
+++ b/sound/direct_sound_samples/cry_kingler.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_kirlia.aif b/sound/direct_sound_samples/cry_kirlia.aif
new file mode 100644
index 000000000..692e03e5f
--- /dev/null
+++ b/sound/direct_sound_samples/cry_kirlia.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_koffing.aif b/sound/direct_sound_samples/cry_koffing.aif
new file mode 100644
index 000000000..7ca9de088
--- /dev/null
+++ b/sound/direct_sound_samples/cry_koffing.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_krabby.aif b/sound/direct_sound_samples/cry_krabby.aif
new file mode 100644
index 000000000..6b7692f21
--- /dev/null
+++ b/sound/direct_sound_samples/cry_krabby.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_kyogre.aif b/sound/direct_sound_samples/cry_kyogre.aif
new file mode 100644
index 000000000..290948319
--- /dev/null
+++ b/sound/direct_sound_samples/cry_kyogre.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_lairon.aif b/sound/direct_sound_samples/cry_lairon.aif
new file mode 100644
index 000000000..b487165bf
--- /dev/null
+++ b/sound/direct_sound_samples/cry_lairon.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_lanturn.aif b/sound/direct_sound_samples/cry_lanturn.aif
new file mode 100644
index 000000000..dfeac1fbd
--- /dev/null
+++ b/sound/direct_sound_samples/cry_lanturn.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_lapras.aif b/sound/direct_sound_samples/cry_lapras.aif
new file mode 100644
index 000000000..61de32408
--- /dev/null
+++ b/sound/direct_sound_samples/cry_lapras.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_larvitar.aif b/sound/direct_sound_samples/cry_larvitar.aif
new file mode 100644
index 000000000..1ab0e1d5f
--- /dev/null
+++ b/sound/direct_sound_samples/cry_larvitar.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_latias.aif b/sound/direct_sound_samples/cry_latias.aif
new file mode 100644
index 000000000..46f7235f3
--- /dev/null
+++ b/sound/direct_sound_samples/cry_latias.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_latios.aif b/sound/direct_sound_samples/cry_latios.aif
new file mode 100644
index 000000000..b8ace2a30
--- /dev/null
+++ b/sound/direct_sound_samples/cry_latios.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_ledian.aif b/sound/direct_sound_samples/cry_ledian.aif
new file mode 100644
index 000000000..baefb5fa3
--- /dev/null
+++ b/sound/direct_sound_samples/cry_ledian.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_ledyba.aif b/sound/direct_sound_samples/cry_ledyba.aif
new file mode 100644
index 000000000..4f26859a7
--- /dev/null
+++ b/sound/direct_sound_samples/cry_ledyba.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_lickitung.aif b/sound/direct_sound_samples/cry_lickitung.aif
new file mode 100644
index 000000000..ef889a275
--- /dev/null
+++ b/sound/direct_sound_samples/cry_lickitung.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_lileep.aif b/sound/direct_sound_samples/cry_lileep.aif
new file mode 100644
index 000000000..ed8258eb7
--- /dev/null
+++ b/sound/direct_sound_samples/cry_lileep.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_linoone.aif b/sound/direct_sound_samples/cry_linoone.aif
new file mode 100644
index 000000000..4e5e7d3b5
--- /dev/null
+++ b/sound/direct_sound_samples/cry_linoone.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_lombre.aif b/sound/direct_sound_samples/cry_lombre.aif
new file mode 100644
index 000000000..abafe4321
--- /dev/null
+++ b/sound/direct_sound_samples/cry_lombre.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_lotad.aif b/sound/direct_sound_samples/cry_lotad.aif
new file mode 100644
index 000000000..2596f4390
--- /dev/null
+++ b/sound/direct_sound_samples/cry_lotad.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_loudred.aif b/sound/direct_sound_samples/cry_loudred.aif
new file mode 100644
index 000000000..fed7ebec8
--- /dev/null
+++ b/sound/direct_sound_samples/cry_loudred.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_ludicolo.aif b/sound/direct_sound_samples/cry_ludicolo.aif
new file mode 100644
index 000000000..7cf670f38
--- /dev/null
+++ b/sound/direct_sound_samples/cry_ludicolo.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_lugia.aif b/sound/direct_sound_samples/cry_lugia.aif
new file mode 100644
index 000000000..45890a2fc
--- /dev/null
+++ b/sound/direct_sound_samples/cry_lugia.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_lunatone.aif b/sound/direct_sound_samples/cry_lunatone.aif
new file mode 100644
index 000000000..42cbc5e3c
--- /dev/null
+++ b/sound/direct_sound_samples/cry_lunatone.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_luvdisc.aif b/sound/direct_sound_samples/cry_luvdisc.aif
new file mode 100644
index 000000000..3cc0cc744
--- /dev/null
+++ b/sound/direct_sound_samples/cry_luvdisc.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_machamp.aif b/sound/direct_sound_samples/cry_machamp.aif
new file mode 100644
index 000000000..ddeaf22c8
--- /dev/null
+++ b/sound/direct_sound_samples/cry_machamp.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_machoke.aif b/sound/direct_sound_samples/cry_machoke.aif
new file mode 100644
index 000000000..97065ee09
--- /dev/null
+++ b/sound/direct_sound_samples/cry_machoke.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_machop.aif b/sound/direct_sound_samples/cry_machop.aif
new file mode 100644
index 000000000..d92419e84
--- /dev/null
+++ b/sound/direct_sound_samples/cry_machop.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_magby.aif b/sound/direct_sound_samples/cry_magby.aif
new file mode 100644
index 000000000..12f3dc889
--- /dev/null
+++ b/sound/direct_sound_samples/cry_magby.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_magcargo.aif b/sound/direct_sound_samples/cry_magcargo.aif
new file mode 100644
index 000000000..bef0351c0
--- /dev/null
+++ b/sound/direct_sound_samples/cry_magcargo.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_magikarp.aif b/sound/direct_sound_samples/cry_magikarp.aif
new file mode 100644
index 000000000..f4f9219c5
--- /dev/null
+++ b/sound/direct_sound_samples/cry_magikarp.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_magmar.aif b/sound/direct_sound_samples/cry_magmar.aif
new file mode 100644
index 000000000..b79c8b9a1
--- /dev/null
+++ b/sound/direct_sound_samples/cry_magmar.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_magnemite.aif b/sound/direct_sound_samples/cry_magnemite.aif
new file mode 100644
index 000000000..ebb9103d9
--- /dev/null
+++ b/sound/direct_sound_samples/cry_magnemite.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_magneton.aif b/sound/direct_sound_samples/cry_magneton.aif
new file mode 100644
index 000000000..53083ac62
--- /dev/null
+++ b/sound/direct_sound_samples/cry_magneton.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_makuhita.aif b/sound/direct_sound_samples/cry_makuhita.aif
new file mode 100644
index 000000000..38d7f4b44
--- /dev/null
+++ b/sound/direct_sound_samples/cry_makuhita.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_manectric.aif b/sound/direct_sound_samples/cry_manectric.aif
new file mode 100644
index 000000000..18a8f4666
--- /dev/null
+++ b/sound/direct_sound_samples/cry_manectric.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_mankey.aif b/sound/direct_sound_samples/cry_mankey.aif
new file mode 100644
index 000000000..dda929d4c
--- /dev/null
+++ b/sound/direct_sound_samples/cry_mankey.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_mantine.aif b/sound/direct_sound_samples/cry_mantine.aif
new file mode 100644
index 000000000..d1840aafa
--- /dev/null
+++ b/sound/direct_sound_samples/cry_mantine.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_mareep.aif b/sound/direct_sound_samples/cry_mareep.aif
new file mode 100644
index 000000000..2615b9def
--- /dev/null
+++ b/sound/direct_sound_samples/cry_mareep.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_marill.aif b/sound/direct_sound_samples/cry_marill.aif
new file mode 100644
index 000000000..48d936e7d
--- /dev/null
+++ b/sound/direct_sound_samples/cry_marill.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_marowak.aif b/sound/direct_sound_samples/cry_marowak.aif
new file mode 100644
index 000000000..279381bb5
--- /dev/null
+++ b/sound/direct_sound_samples/cry_marowak.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_marshtomp.aif b/sound/direct_sound_samples/cry_marshtomp.aif
new file mode 100644
index 000000000..c0106ff6c
--- /dev/null
+++ b/sound/direct_sound_samples/cry_marshtomp.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_masquerain.aif b/sound/direct_sound_samples/cry_masquerain.aif
new file mode 100644
index 000000000..107bed2f7
--- /dev/null
+++ b/sound/direct_sound_samples/cry_masquerain.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_mawile.aif b/sound/direct_sound_samples/cry_mawile.aif
new file mode 100644
index 000000000..81b252b57
--- /dev/null
+++ b/sound/direct_sound_samples/cry_mawile.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_medicham.aif b/sound/direct_sound_samples/cry_medicham.aif
new file mode 100644
index 000000000..dc85dd3b5
--- /dev/null
+++ b/sound/direct_sound_samples/cry_medicham.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_meditite.aif b/sound/direct_sound_samples/cry_meditite.aif
new file mode 100644
index 000000000..8ac680f79
--- /dev/null
+++ b/sound/direct_sound_samples/cry_meditite.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_meganium.aif b/sound/direct_sound_samples/cry_meganium.aif
new file mode 100644
index 000000000..ea1e1aa51
--- /dev/null
+++ b/sound/direct_sound_samples/cry_meganium.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_meowth.aif b/sound/direct_sound_samples/cry_meowth.aif
new file mode 100644
index 000000000..aaf3825d5
--- /dev/null
+++ b/sound/direct_sound_samples/cry_meowth.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_metagross.aif b/sound/direct_sound_samples/cry_metagross.aif
new file mode 100644
index 000000000..b96e6647c
--- /dev/null
+++ b/sound/direct_sound_samples/cry_metagross.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_metang.aif b/sound/direct_sound_samples/cry_metang.aif
new file mode 100644
index 000000000..da544ce4d
--- /dev/null
+++ b/sound/direct_sound_samples/cry_metang.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_metapod.aif b/sound/direct_sound_samples/cry_metapod.aif
new file mode 100644
index 000000000..ddba3ed44
--- /dev/null
+++ b/sound/direct_sound_samples/cry_metapod.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_mew.aif b/sound/direct_sound_samples/cry_mew.aif
new file mode 100644
index 000000000..2651b96ca
--- /dev/null
+++ b/sound/direct_sound_samples/cry_mew.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_mewtwo.aif b/sound/direct_sound_samples/cry_mewtwo.aif
new file mode 100644
index 000000000..8e1e6c7f1
--- /dev/null
+++ b/sound/direct_sound_samples/cry_mewtwo.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_mightyena.aif b/sound/direct_sound_samples/cry_mightyena.aif
new file mode 100644
index 000000000..53a645edc
--- /dev/null
+++ b/sound/direct_sound_samples/cry_mightyena.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_milotic.aif b/sound/direct_sound_samples/cry_milotic.aif
new file mode 100644
index 000000000..93a14161b
--- /dev/null
+++ b/sound/direct_sound_samples/cry_milotic.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_miltank.aif b/sound/direct_sound_samples/cry_miltank.aif
new file mode 100644
index 000000000..ad8a41a45
--- /dev/null
+++ b/sound/direct_sound_samples/cry_miltank.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_minun.aif b/sound/direct_sound_samples/cry_minun.aif
new file mode 100644
index 000000000..a55aa5631
--- /dev/null
+++ b/sound/direct_sound_samples/cry_minun.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_misdreavus.aif b/sound/direct_sound_samples/cry_misdreavus.aif
new file mode 100644
index 000000000..39a09f4d0
--- /dev/null
+++ b/sound/direct_sound_samples/cry_misdreavus.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_moltres.aif b/sound/direct_sound_samples/cry_moltres.aif
new file mode 100644
index 000000000..2e038a3d7
--- /dev/null
+++ b/sound/direct_sound_samples/cry_moltres.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_mr_mime.aif b/sound/direct_sound_samples/cry_mr_mime.aif
new file mode 100644
index 000000000..ff870dbc4
--- /dev/null
+++ b/sound/direct_sound_samples/cry_mr_mime.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_mudkip.aif b/sound/direct_sound_samples/cry_mudkip.aif
new file mode 100644
index 000000000..e8fa5c212
--- /dev/null
+++ b/sound/direct_sound_samples/cry_mudkip.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_muk.aif b/sound/direct_sound_samples/cry_muk.aif
new file mode 100644
index 000000000..f61ff4075
--- /dev/null
+++ b/sound/direct_sound_samples/cry_muk.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_murkrow.aif b/sound/direct_sound_samples/cry_murkrow.aif
new file mode 100644
index 000000000..4beddff1e
--- /dev/null
+++ b/sound/direct_sound_samples/cry_murkrow.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_natu.aif b/sound/direct_sound_samples/cry_natu.aif
new file mode 100644
index 000000000..e6e38d5cc
--- /dev/null
+++ b/sound/direct_sound_samples/cry_natu.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_nidoking.aif b/sound/direct_sound_samples/cry_nidoking.aif
new file mode 100644
index 000000000..a0c86f9ab
--- /dev/null
+++ b/sound/direct_sound_samples/cry_nidoking.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_nidoqueen.aif b/sound/direct_sound_samples/cry_nidoqueen.aif
new file mode 100644
index 000000000..6c8f5254b
--- /dev/null
+++ b/sound/direct_sound_samples/cry_nidoqueen.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_nidoran_f.aif b/sound/direct_sound_samples/cry_nidoran_f.aif
new file mode 100644
index 000000000..b7c8a5317
--- /dev/null
+++ b/sound/direct_sound_samples/cry_nidoran_f.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_nidoran_m.aif b/sound/direct_sound_samples/cry_nidoran_m.aif
new file mode 100644
index 000000000..08fc81c8b
--- /dev/null
+++ b/sound/direct_sound_samples/cry_nidoran_m.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_nidorina.aif b/sound/direct_sound_samples/cry_nidorina.aif
new file mode 100644
index 000000000..91e293a50
--- /dev/null
+++ b/sound/direct_sound_samples/cry_nidorina.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_nidorino.aif b/sound/direct_sound_samples/cry_nidorino.aif
new file mode 100644
index 000000000..959351363
--- /dev/null
+++ b/sound/direct_sound_samples/cry_nidorino.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_nincada.aif b/sound/direct_sound_samples/cry_nincada.aif
new file mode 100644
index 000000000..5f96bda50
--- /dev/null
+++ b/sound/direct_sound_samples/cry_nincada.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_ninetales.aif b/sound/direct_sound_samples/cry_ninetales.aif
new file mode 100644
index 000000000..70c8cf528
--- /dev/null
+++ b/sound/direct_sound_samples/cry_ninetales.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_ninjask.aif b/sound/direct_sound_samples/cry_ninjask.aif
new file mode 100644
index 000000000..a6f07e8d3
--- /dev/null
+++ b/sound/direct_sound_samples/cry_ninjask.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_noctowl.aif b/sound/direct_sound_samples/cry_noctowl.aif
new file mode 100644
index 000000000..fe2e63d45
--- /dev/null
+++ b/sound/direct_sound_samples/cry_noctowl.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_none.aif b/sound/direct_sound_samples/cry_none.aif
new file mode 100644
index 000000000..44bb79c3c
--- /dev/null
+++ b/sound/direct_sound_samples/cry_none.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_nosepass.aif b/sound/direct_sound_samples/cry_nosepass.aif
new file mode 100644
index 000000000..be65ba082
--- /dev/null
+++ b/sound/direct_sound_samples/cry_nosepass.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_numel.aif b/sound/direct_sound_samples/cry_numel.aif
new file mode 100644
index 000000000..55cce5f2c
--- /dev/null
+++ b/sound/direct_sound_samples/cry_numel.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_nuzleaf.aif b/sound/direct_sound_samples/cry_nuzleaf.aif
new file mode 100644
index 000000000..d668f3fd3
--- /dev/null
+++ b/sound/direct_sound_samples/cry_nuzleaf.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_octillery.aif b/sound/direct_sound_samples/cry_octillery.aif
new file mode 100644
index 000000000..75ee28ceb
--- /dev/null
+++ b/sound/direct_sound_samples/cry_octillery.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_oddish.aif b/sound/direct_sound_samples/cry_oddish.aif
new file mode 100644
index 000000000..6909a8dad
--- /dev/null
+++ b/sound/direct_sound_samples/cry_oddish.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_omanyte.aif b/sound/direct_sound_samples/cry_omanyte.aif
new file mode 100644
index 000000000..15ec2d1ef
--- /dev/null
+++ b/sound/direct_sound_samples/cry_omanyte.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_omastar.aif b/sound/direct_sound_samples/cry_omastar.aif
new file mode 100644
index 000000000..e67d5d7fc
--- /dev/null
+++ b/sound/direct_sound_samples/cry_omastar.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_onix.aif b/sound/direct_sound_samples/cry_onix.aif
new file mode 100644
index 000000000..aa8a16505
--- /dev/null
+++ b/sound/direct_sound_samples/cry_onix.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_paras.aif b/sound/direct_sound_samples/cry_paras.aif
new file mode 100644
index 000000000..f9d69c21c
--- /dev/null
+++ b/sound/direct_sound_samples/cry_paras.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_parasect.aif b/sound/direct_sound_samples/cry_parasect.aif
new file mode 100644
index 000000000..d6d9433e9
--- /dev/null
+++ b/sound/direct_sound_samples/cry_parasect.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_pelipper.aif b/sound/direct_sound_samples/cry_pelipper.aif
new file mode 100644
index 000000000..26718f848
--- /dev/null
+++ b/sound/direct_sound_samples/cry_pelipper.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_persian.aif b/sound/direct_sound_samples/cry_persian.aif
new file mode 100644
index 000000000..40b3a2c56
--- /dev/null
+++ b/sound/direct_sound_samples/cry_persian.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_phanpy.aif b/sound/direct_sound_samples/cry_phanpy.aif
new file mode 100644
index 000000000..2fcab3c82
--- /dev/null
+++ b/sound/direct_sound_samples/cry_phanpy.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_pichu.aif b/sound/direct_sound_samples/cry_pichu.aif
new file mode 100644
index 000000000..de47bbab8
--- /dev/null
+++ b/sound/direct_sound_samples/cry_pichu.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_pidgeot.aif b/sound/direct_sound_samples/cry_pidgeot.aif
new file mode 100644
index 000000000..af400cdc6
--- /dev/null
+++ b/sound/direct_sound_samples/cry_pidgeot.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_pidgeotto.aif b/sound/direct_sound_samples/cry_pidgeotto.aif
new file mode 100644
index 000000000..7c71c8f3e
--- /dev/null
+++ b/sound/direct_sound_samples/cry_pidgeotto.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_pidgey.aif b/sound/direct_sound_samples/cry_pidgey.aif
new file mode 100644
index 000000000..b9c3a5d2a
--- /dev/null
+++ b/sound/direct_sound_samples/cry_pidgey.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_pikachu.aif b/sound/direct_sound_samples/cry_pikachu.aif
new file mode 100644
index 000000000..690bf5e1d
--- /dev/null
+++ b/sound/direct_sound_samples/cry_pikachu.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_piloswine.aif b/sound/direct_sound_samples/cry_piloswine.aif
new file mode 100644
index 000000000..b1f34d3b5
--- /dev/null
+++ b/sound/direct_sound_samples/cry_piloswine.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_pineco.aif b/sound/direct_sound_samples/cry_pineco.aif
new file mode 100644
index 000000000..80292bda0
--- /dev/null
+++ b/sound/direct_sound_samples/cry_pineco.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_pinsir.aif b/sound/direct_sound_samples/cry_pinsir.aif
new file mode 100644
index 000000000..cf27a11de
--- /dev/null
+++ b/sound/direct_sound_samples/cry_pinsir.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_plusle.aif b/sound/direct_sound_samples/cry_plusle.aif
new file mode 100644
index 000000000..d68984263
--- /dev/null
+++ b/sound/direct_sound_samples/cry_plusle.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_politoed.aif b/sound/direct_sound_samples/cry_politoed.aif
new file mode 100644
index 000000000..38b1883b4
--- /dev/null
+++ b/sound/direct_sound_samples/cry_politoed.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_poliwag.aif b/sound/direct_sound_samples/cry_poliwag.aif
new file mode 100644
index 000000000..8467f0540
--- /dev/null
+++ b/sound/direct_sound_samples/cry_poliwag.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_poliwhirl.aif b/sound/direct_sound_samples/cry_poliwhirl.aif
new file mode 100644
index 000000000..f0851c693
--- /dev/null
+++ b/sound/direct_sound_samples/cry_poliwhirl.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_poliwrath.aif b/sound/direct_sound_samples/cry_poliwrath.aif
new file mode 100644
index 000000000..8d19f1d86
--- /dev/null
+++ b/sound/direct_sound_samples/cry_poliwrath.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_ponyta.aif b/sound/direct_sound_samples/cry_ponyta.aif
new file mode 100644
index 000000000..46feb123d
--- /dev/null
+++ b/sound/direct_sound_samples/cry_ponyta.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_poochyena.aif b/sound/direct_sound_samples/cry_poochyena.aif
new file mode 100644
index 000000000..3b464ce13
--- /dev/null
+++ b/sound/direct_sound_samples/cry_poochyena.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_porygon.aif b/sound/direct_sound_samples/cry_porygon.aif
new file mode 100644
index 000000000..ced70b379
--- /dev/null
+++ b/sound/direct_sound_samples/cry_porygon.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_porygon2.aif b/sound/direct_sound_samples/cry_porygon2.aif
new file mode 100644
index 000000000..c08a3caaf
--- /dev/null
+++ b/sound/direct_sound_samples/cry_porygon2.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_primeape.aif b/sound/direct_sound_samples/cry_primeape.aif
new file mode 100644
index 000000000..a868b3120
--- /dev/null
+++ b/sound/direct_sound_samples/cry_primeape.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_psyduck.aif b/sound/direct_sound_samples/cry_psyduck.aif
new file mode 100644
index 000000000..d2d0612f2
--- /dev/null
+++ b/sound/direct_sound_samples/cry_psyduck.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_pupitar.aif b/sound/direct_sound_samples/cry_pupitar.aif
new file mode 100644
index 000000000..7386636ce
--- /dev/null
+++ b/sound/direct_sound_samples/cry_pupitar.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_quagsire.aif b/sound/direct_sound_samples/cry_quagsire.aif
new file mode 100644
index 000000000..1953d0e42
--- /dev/null
+++ b/sound/direct_sound_samples/cry_quagsire.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_quilava.aif b/sound/direct_sound_samples/cry_quilava.aif
new file mode 100644
index 000000000..efe873229
--- /dev/null
+++ b/sound/direct_sound_samples/cry_quilava.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_qwilfish.aif b/sound/direct_sound_samples/cry_qwilfish.aif
new file mode 100644
index 000000000..268c5c89d
--- /dev/null
+++ b/sound/direct_sound_samples/cry_qwilfish.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_raichu.aif b/sound/direct_sound_samples/cry_raichu.aif
new file mode 100644
index 000000000..e59ffbad4
--- /dev/null
+++ b/sound/direct_sound_samples/cry_raichu.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_raikou.aif b/sound/direct_sound_samples/cry_raikou.aif
new file mode 100644
index 000000000..a57a2365c
--- /dev/null
+++ b/sound/direct_sound_samples/cry_raikou.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_ralts.aif b/sound/direct_sound_samples/cry_ralts.aif
new file mode 100644
index 000000000..0baef5760
--- /dev/null
+++ b/sound/direct_sound_samples/cry_ralts.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_rapidash.aif b/sound/direct_sound_samples/cry_rapidash.aif
new file mode 100644
index 000000000..920f510e4
--- /dev/null
+++ b/sound/direct_sound_samples/cry_rapidash.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_raticate.aif b/sound/direct_sound_samples/cry_raticate.aif
new file mode 100644
index 000000000..01601cab5
--- /dev/null
+++ b/sound/direct_sound_samples/cry_raticate.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_rattata.aif b/sound/direct_sound_samples/cry_rattata.aif
new file mode 100644
index 000000000..cb0e1f422
--- /dev/null
+++ b/sound/direct_sound_samples/cry_rattata.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_rayquaza.aif b/sound/direct_sound_samples/cry_rayquaza.aif
new file mode 100644
index 000000000..6115e11d8
--- /dev/null
+++ b/sound/direct_sound_samples/cry_rayquaza.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_regice.aif b/sound/direct_sound_samples/cry_regice.aif
new file mode 100644
index 000000000..6fa23dd73
--- /dev/null
+++ b/sound/direct_sound_samples/cry_regice.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_regirock.aif b/sound/direct_sound_samples/cry_regirock.aif
new file mode 100644
index 000000000..ab2a47eb8
--- /dev/null
+++ b/sound/direct_sound_samples/cry_regirock.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_registeel.aif b/sound/direct_sound_samples/cry_registeel.aif
new file mode 100644
index 000000000..f5374e5f0
--- /dev/null
+++ b/sound/direct_sound_samples/cry_registeel.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_relicanth.aif b/sound/direct_sound_samples/cry_relicanth.aif
new file mode 100644
index 000000000..60af9cf4e
--- /dev/null
+++ b/sound/direct_sound_samples/cry_relicanth.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_remoraid.aif b/sound/direct_sound_samples/cry_remoraid.aif
new file mode 100644
index 000000000..16d3f1d65
--- /dev/null
+++ b/sound/direct_sound_samples/cry_remoraid.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_rhydon.aif b/sound/direct_sound_samples/cry_rhydon.aif
new file mode 100644
index 000000000..cfa709ee9
--- /dev/null
+++ b/sound/direct_sound_samples/cry_rhydon.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_rhyhorn.aif b/sound/direct_sound_samples/cry_rhyhorn.aif
new file mode 100644
index 000000000..47f344ba2
--- /dev/null
+++ b/sound/direct_sound_samples/cry_rhyhorn.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_roselia.aif b/sound/direct_sound_samples/cry_roselia.aif
new file mode 100644
index 000000000..50b60b77b
--- /dev/null
+++ b/sound/direct_sound_samples/cry_roselia.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_sableye.aif b/sound/direct_sound_samples/cry_sableye.aif
new file mode 100644
index 000000000..1b3a9be30
--- /dev/null
+++ b/sound/direct_sound_samples/cry_sableye.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_salamence.aif b/sound/direct_sound_samples/cry_salamence.aif
new file mode 100644
index 000000000..d2957809c
--- /dev/null
+++ b/sound/direct_sound_samples/cry_salamence.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_sandshrew.aif b/sound/direct_sound_samples/cry_sandshrew.aif
new file mode 100644
index 000000000..6879be11d
--- /dev/null
+++ b/sound/direct_sound_samples/cry_sandshrew.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_sandslash.aif b/sound/direct_sound_samples/cry_sandslash.aif
new file mode 100644
index 000000000..ee4a458ed
--- /dev/null
+++ b/sound/direct_sound_samples/cry_sandslash.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_sceptile.aif b/sound/direct_sound_samples/cry_sceptile.aif
new file mode 100644
index 000000000..7252cb85f
--- /dev/null
+++ b/sound/direct_sound_samples/cry_sceptile.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_scizor.aif b/sound/direct_sound_samples/cry_scizor.aif
new file mode 100644
index 000000000..f1f7832ce
--- /dev/null
+++ b/sound/direct_sound_samples/cry_scizor.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_scyther.aif b/sound/direct_sound_samples/cry_scyther.aif
new file mode 100644
index 000000000..2b8cbc104
--- /dev/null
+++ b/sound/direct_sound_samples/cry_scyther.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_seadra.aif b/sound/direct_sound_samples/cry_seadra.aif
new file mode 100644
index 000000000..2f60cce4a
--- /dev/null
+++ b/sound/direct_sound_samples/cry_seadra.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_seaking.aif b/sound/direct_sound_samples/cry_seaking.aif
new file mode 100644
index 000000000..e4fc7e70d
--- /dev/null
+++ b/sound/direct_sound_samples/cry_seaking.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_sealeo.aif b/sound/direct_sound_samples/cry_sealeo.aif
new file mode 100644
index 000000000..d9ea50026
--- /dev/null
+++ b/sound/direct_sound_samples/cry_sealeo.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_seedot.aif b/sound/direct_sound_samples/cry_seedot.aif
new file mode 100644
index 000000000..c37b769f8
--- /dev/null
+++ b/sound/direct_sound_samples/cry_seedot.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_seel.aif b/sound/direct_sound_samples/cry_seel.aif
new file mode 100644
index 000000000..84c4a0a94
--- /dev/null
+++ b/sound/direct_sound_samples/cry_seel.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_sentret.aif b/sound/direct_sound_samples/cry_sentret.aif
new file mode 100644
index 000000000..4aed7cd70
--- /dev/null
+++ b/sound/direct_sound_samples/cry_sentret.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_seviper.aif b/sound/direct_sound_samples/cry_seviper.aif
new file mode 100644
index 000000000..6a15dd6e2
--- /dev/null
+++ b/sound/direct_sound_samples/cry_seviper.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_sharpedo.aif b/sound/direct_sound_samples/cry_sharpedo.aif
new file mode 100644
index 000000000..1b02b56ce
--- /dev/null
+++ b/sound/direct_sound_samples/cry_sharpedo.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_shedinja.aif b/sound/direct_sound_samples/cry_shedinja.aif
new file mode 100644
index 000000000..6d1d565f3
--- /dev/null
+++ b/sound/direct_sound_samples/cry_shedinja.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_shelgon.aif b/sound/direct_sound_samples/cry_shelgon.aif
new file mode 100644
index 000000000..24f234ffe
--- /dev/null
+++ b/sound/direct_sound_samples/cry_shelgon.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_shellder.aif b/sound/direct_sound_samples/cry_shellder.aif
new file mode 100644
index 000000000..b2ea85228
--- /dev/null
+++ b/sound/direct_sound_samples/cry_shellder.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_shiftry.aif b/sound/direct_sound_samples/cry_shiftry.aif
new file mode 100644
index 000000000..c91ece114
--- /dev/null
+++ b/sound/direct_sound_samples/cry_shiftry.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_shroomish.aif b/sound/direct_sound_samples/cry_shroomish.aif
new file mode 100644
index 000000000..9e944ca20
--- /dev/null
+++ b/sound/direct_sound_samples/cry_shroomish.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_shuckle.aif b/sound/direct_sound_samples/cry_shuckle.aif
new file mode 100644
index 000000000..d835d2de6
--- /dev/null
+++ b/sound/direct_sound_samples/cry_shuckle.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_shuppet.aif b/sound/direct_sound_samples/cry_shuppet.aif
new file mode 100644
index 000000000..1cd9a2f14
--- /dev/null
+++ b/sound/direct_sound_samples/cry_shuppet.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_silcoon.aif b/sound/direct_sound_samples/cry_silcoon.aif
new file mode 100644
index 000000000..ff48950ad
--- /dev/null
+++ b/sound/direct_sound_samples/cry_silcoon.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_skarmory.aif b/sound/direct_sound_samples/cry_skarmory.aif
new file mode 100644
index 000000000..88d3985a3
--- /dev/null
+++ b/sound/direct_sound_samples/cry_skarmory.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_skiploom.aif b/sound/direct_sound_samples/cry_skiploom.aif
new file mode 100644
index 000000000..201744d12
--- /dev/null
+++ b/sound/direct_sound_samples/cry_skiploom.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_skitty.aif b/sound/direct_sound_samples/cry_skitty.aif
new file mode 100644
index 000000000..7dc4578f4
--- /dev/null
+++ b/sound/direct_sound_samples/cry_skitty.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_slaking.aif b/sound/direct_sound_samples/cry_slaking.aif
new file mode 100644
index 000000000..b6a4160f3
--- /dev/null
+++ b/sound/direct_sound_samples/cry_slaking.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_slakoth.aif b/sound/direct_sound_samples/cry_slakoth.aif
new file mode 100644
index 000000000..0e4bbc3c3
--- /dev/null
+++ b/sound/direct_sound_samples/cry_slakoth.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_slowbro.aif b/sound/direct_sound_samples/cry_slowbro.aif
new file mode 100644
index 000000000..f74b753d2
--- /dev/null
+++ b/sound/direct_sound_samples/cry_slowbro.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_slowking.aif b/sound/direct_sound_samples/cry_slowking.aif
new file mode 100644
index 000000000..245a42023
--- /dev/null
+++ b/sound/direct_sound_samples/cry_slowking.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_slowpoke.aif b/sound/direct_sound_samples/cry_slowpoke.aif
new file mode 100644
index 000000000..82b05a9a7
--- /dev/null
+++ b/sound/direct_sound_samples/cry_slowpoke.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_slugma.aif b/sound/direct_sound_samples/cry_slugma.aif
new file mode 100644
index 000000000..fed42817c
--- /dev/null
+++ b/sound/direct_sound_samples/cry_slugma.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_smeargle.aif b/sound/direct_sound_samples/cry_smeargle.aif
new file mode 100644
index 000000000..00dbedead
--- /dev/null
+++ b/sound/direct_sound_samples/cry_smeargle.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_smoochum.aif b/sound/direct_sound_samples/cry_smoochum.aif
new file mode 100644
index 000000000..4005b4ad4
--- /dev/null
+++ b/sound/direct_sound_samples/cry_smoochum.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_sneasel.aif b/sound/direct_sound_samples/cry_sneasel.aif
new file mode 100644
index 000000000..54242a23f
--- /dev/null
+++ b/sound/direct_sound_samples/cry_sneasel.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_snorlax.aif b/sound/direct_sound_samples/cry_snorlax.aif
new file mode 100644
index 000000000..f95128e3a
--- /dev/null
+++ b/sound/direct_sound_samples/cry_snorlax.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_snorunt.aif b/sound/direct_sound_samples/cry_snorunt.aif
new file mode 100644
index 000000000..53b05b229
--- /dev/null
+++ b/sound/direct_sound_samples/cry_snorunt.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_snubbull.aif b/sound/direct_sound_samples/cry_snubbull.aif
new file mode 100644
index 000000000..bbba023fd
--- /dev/null
+++ b/sound/direct_sound_samples/cry_snubbull.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_solrock.aif b/sound/direct_sound_samples/cry_solrock.aif
new file mode 100644
index 000000000..64c71f289
--- /dev/null
+++ b/sound/direct_sound_samples/cry_solrock.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_spearow.aif b/sound/direct_sound_samples/cry_spearow.aif
new file mode 100644
index 000000000..7ce86ae29
--- /dev/null
+++ b/sound/direct_sound_samples/cry_spearow.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_spheal.aif b/sound/direct_sound_samples/cry_spheal.aif
new file mode 100644
index 000000000..fb6470210
--- /dev/null
+++ b/sound/direct_sound_samples/cry_spheal.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_spinarak.aif b/sound/direct_sound_samples/cry_spinarak.aif
new file mode 100644
index 000000000..3c4c1eff1
--- /dev/null
+++ b/sound/direct_sound_samples/cry_spinarak.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_spinda.aif b/sound/direct_sound_samples/cry_spinda.aif
new file mode 100644
index 000000000..0217573c7
--- /dev/null
+++ b/sound/direct_sound_samples/cry_spinda.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_spoink.aif b/sound/direct_sound_samples/cry_spoink.aif
new file mode 100644
index 000000000..6cc9bf546
--- /dev/null
+++ b/sound/direct_sound_samples/cry_spoink.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_squirtle.aif b/sound/direct_sound_samples/cry_squirtle.aif
new file mode 100644
index 000000000..43a98a53d
--- /dev/null
+++ b/sound/direct_sound_samples/cry_squirtle.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_stantler.aif b/sound/direct_sound_samples/cry_stantler.aif
new file mode 100644
index 000000000..36ba54658
--- /dev/null
+++ b/sound/direct_sound_samples/cry_stantler.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_starmie.aif b/sound/direct_sound_samples/cry_starmie.aif
new file mode 100644
index 000000000..7452a78f9
--- /dev/null
+++ b/sound/direct_sound_samples/cry_starmie.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_staryu.aif b/sound/direct_sound_samples/cry_staryu.aif
new file mode 100644
index 000000000..6ab5584bf
--- /dev/null
+++ b/sound/direct_sound_samples/cry_staryu.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_steelix.aif b/sound/direct_sound_samples/cry_steelix.aif
new file mode 100644
index 000000000..aa05e2d4c
--- /dev/null
+++ b/sound/direct_sound_samples/cry_steelix.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_sudowoodo.aif b/sound/direct_sound_samples/cry_sudowoodo.aif
new file mode 100644
index 000000000..1af7e18eb
--- /dev/null
+++ b/sound/direct_sound_samples/cry_sudowoodo.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_suicune.aif b/sound/direct_sound_samples/cry_suicune.aif
new file mode 100644
index 000000000..697732d68
--- /dev/null
+++ b/sound/direct_sound_samples/cry_suicune.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_sunflora.aif b/sound/direct_sound_samples/cry_sunflora.aif
new file mode 100644
index 000000000..126931adc
--- /dev/null
+++ b/sound/direct_sound_samples/cry_sunflora.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_sunkern.aif b/sound/direct_sound_samples/cry_sunkern.aif
new file mode 100644
index 000000000..bede3bf95
--- /dev/null
+++ b/sound/direct_sound_samples/cry_sunkern.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_surskit.aif b/sound/direct_sound_samples/cry_surskit.aif
new file mode 100644
index 000000000..438b5b67a
--- /dev/null
+++ b/sound/direct_sound_samples/cry_surskit.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_swablu.aif b/sound/direct_sound_samples/cry_swablu.aif
new file mode 100644
index 000000000..066095f55
--- /dev/null
+++ b/sound/direct_sound_samples/cry_swablu.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_swalot.aif b/sound/direct_sound_samples/cry_swalot.aif
new file mode 100644
index 000000000..518a9bf5a
--- /dev/null
+++ b/sound/direct_sound_samples/cry_swalot.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_swampert.aif b/sound/direct_sound_samples/cry_swampert.aif
new file mode 100644
index 000000000..56bd26405
--- /dev/null
+++ b/sound/direct_sound_samples/cry_swampert.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_swellow.aif b/sound/direct_sound_samples/cry_swellow.aif
new file mode 100644
index 000000000..2b94eb432
--- /dev/null
+++ b/sound/direct_sound_samples/cry_swellow.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_swinub.aif b/sound/direct_sound_samples/cry_swinub.aif
new file mode 100644
index 000000000..dc68d62d8
--- /dev/null
+++ b/sound/direct_sound_samples/cry_swinub.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_taillow.aif b/sound/direct_sound_samples/cry_taillow.aif
new file mode 100644
index 000000000..8322a3224
--- /dev/null
+++ b/sound/direct_sound_samples/cry_taillow.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_tangela.aif b/sound/direct_sound_samples/cry_tangela.aif
new file mode 100644
index 000000000..c900b426d
--- /dev/null
+++ b/sound/direct_sound_samples/cry_tangela.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_tauros.aif b/sound/direct_sound_samples/cry_tauros.aif
new file mode 100644
index 000000000..84fa9b317
--- /dev/null
+++ b/sound/direct_sound_samples/cry_tauros.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_teddiursa.aif b/sound/direct_sound_samples/cry_teddiursa.aif
new file mode 100644
index 000000000..ba5cb5bc3
--- /dev/null
+++ b/sound/direct_sound_samples/cry_teddiursa.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_tentacool.aif b/sound/direct_sound_samples/cry_tentacool.aif
new file mode 100644
index 000000000..332bec4b2
--- /dev/null
+++ b/sound/direct_sound_samples/cry_tentacool.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_tentacruel.aif b/sound/direct_sound_samples/cry_tentacruel.aif
new file mode 100644
index 000000000..e8ec1b14c
--- /dev/null
+++ b/sound/direct_sound_samples/cry_tentacruel.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_togepi.aif b/sound/direct_sound_samples/cry_togepi.aif
new file mode 100644
index 000000000..87ef6ef2d
--- /dev/null
+++ b/sound/direct_sound_samples/cry_togepi.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_togetic.aif b/sound/direct_sound_samples/cry_togetic.aif
new file mode 100644
index 000000000..8aa18ac41
--- /dev/null
+++ b/sound/direct_sound_samples/cry_togetic.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_torchic.aif b/sound/direct_sound_samples/cry_torchic.aif
new file mode 100644
index 000000000..185a79499
--- /dev/null
+++ b/sound/direct_sound_samples/cry_torchic.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_torkoal.aif b/sound/direct_sound_samples/cry_torkoal.aif
new file mode 100644
index 000000000..9e56d3810
--- /dev/null
+++ b/sound/direct_sound_samples/cry_torkoal.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_totodile.aif b/sound/direct_sound_samples/cry_totodile.aif
new file mode 100644
index 000000000..dbf2179a7
--- /dev/null
+++ b/sound/direct_sound_samples/cry_totodile.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_trapinch.aif b/sound/direct_sound_samples/cry_trapinch.aif
new file mode 100644
index 000000000..01664b72e
--- /dev/null
+++ b/sound/direct_sound_samples/cry_trapinch.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_treecko.aif b/sound/direct_sound_samples/cry_treecko.aif
new file mode 100644
index 000000000..a7416e8da
--- /dev/null
+++ b/sound/direct_sound_samples/cry_treecko.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_tropius.aif b/sound/direct_sound_samples/cry_tropius.aif
new file mode 100644
index 000000000..bbb52787b
--- /dev/null
+++ b/sound/direct_sound_samples/cry_tropius.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_typhlosion.aif b/sound/direct_sound_samples/cry_typhlosion.aif
new file mode 100644
index 000000000..f0238d066
--- /dev/null
+++ b/sound/direct_sound_samples/cry_typhlosion.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_tyranitar.aif b/sound/direct_sound_samples/cry_tyranitar.aif
new file mode 100644
index 000000000..557f61769
--- /dev/null
+++ b/sound/direct_sound_samples/cry_tyranitar.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_tyrogue.aif b/sound/direct_sound_samples/cry_tyrogue.aif
new file mode 100644
index 000000000..e5065f58b
--- /dev/null
+++ b/sound/direct_sound_samples/cry_tyrogue.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_umbreon.aif b/sound/direct_sound_samples/cry_umbreon.aif
new file mode 100644
index 000000000..38129b1a7
--- /dev/null
+++ b/sound/direct_sound_samples/cry_umbreon.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_unown.aif b/sound/direct_sound_samples/cry_unown.aif
new file mode 100644
index 000000000..8339ccb6b
--- /dev/null
+++ b/sound/direct_sound_samples/cry_unown.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_unused_265.aif b/sound/direct_sound_samples/cry_unused_265.aif
new file mode 100644
index 000000000..7f5965f06
--- /dev/null
+++ b/sound/direct_sound_samples/cry_unused_265.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_unused_268.aif b/sound/direct_sound_samples/cry_unused_268.aif
new file mode 100644
index 000000000..5cae364c3
--- /dev/null
+++ b/sound/direct_sound_samples/cry_unused_268.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_ursaring.aif b/sound/direct_sound_samples/cry_ursaring.aif
new file mode 100644
index 000000000..fcc748bd1
--- /dev/null
+++ b/sound/direct_sound_samples/cry_ursaring.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_vaporeon.aif b/sound/direct_sound_samples/cry_vaporeon.aif
new file mode 100644
index 000000000..4967cfdeb
--- /dev/null
+++ b/sound/direct_sound_samples/cry_vaporeon.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_venomoth.aif b/sound/direct_sound_samples/cry_venomoth.aif
new file mode 100644
index 000000000..bc291ec33
--- /dev/null
+++ b/sound/direct_sound_samples/cry_venomoth.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_venonat.aif b/sound/direct_sound_samples/cry_venonat.aif
new file mode 100644
index 000000000..e89d87fa8
--- /dev/null
+++ b/sound/direct_sound_samples/cry_venonat.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_venusaur.aif b/sound/direct_sound_samples/cry_venusaur.aif
new file mode 100644
index 000000000..8a1f69e6e
--- /dev/null
+++ b/sound/direct_sound_samples/cry_venusaur.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_vibrava.aif b/sound/direct_sound_samples/cry_vibrava.aif
new file mode 100644
index 000000000..3e3180219
--- /dev/null
+++ b/sound/direct_sound_samples/cry_vibrava.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_victreebel.aif b/sound/direct_sound_samples/cry_victreebel.aif
new file mode 100644
index 000000000..d6e6a4fe9
--- /dev/null
+++ b/sound/direct_sound_samples/cry_victreebel.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_vigoroth.aif b/sound/direct_sound_samples/cry_vigoroth.aif
new file mode 100644
index 000000000..fc414f33d
--- /dev/null
+++ b/sound/direct_sound_samples/cry_vigoroth.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_vileplume.aif b/sound/direct_sound_samples/cry_vileplume.aif
new file mode 100644
index 000000000..723eec697
--- /dev/null
+++ b/sound/direct_sound_samples/cry_vileplume.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_volbeat.aif b/sound/direct_sound_samples/cry_volbeat.aif
new file mode 100644
index 000000000..6f765081e
--- /dev/null
+++ b/sound/direct_sound_samples/cry_volbeat.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_voltorb.aif b/sound/direct_sound_samples/cry_voltorb.aif
new file mode 100644
index 000000000..96e3bff31
--- /dev/null
+++ b/sound/direct_sound_samples/cry_voltorb.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_vulpix.aif b/sound/direct_sound_samples/cry_vulpix.aif
new file mode 100644
index 000000000..20da23fb4
--- /dev/null
+++ b/sound/direct_sound_samples/cry_vulpix.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_wailmer.aif b/sound/direct_sound_samples/cry_wailmer.aif
new file mode 100644
index 000000000..e8de91333
--- /dev/null
+++ b/sound/direct_sound_samples/cry_wailmer.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_wailord.aif b/sound/direct_sound_samples/cry_wailord.aif
new file mode 100644
index 000000000..2c0468010
--- /dev/null
+++ b/sound/direct_sound_samples/cry_wailord.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_walrein.aif b/sound/direct_sound_samples/cry_walrein.aif
new file mode 100644
index 000000000..24c00a596
--- /dev/null
+++ b/sound/direct_sound_samples/cry_walrein.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_wartortle.aif b/sound/direct_sound_samples/cry_wartortle.aif
new file mode 100644
index 000000000..5dab7fd93
--- /dev/null
+++ b/sound/direct_sound_samples/cry_wartortle.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_weedle.aif b/sound/direct_sound_samples/cry_weedle.aif
new file mode 100644
index 000000000..773c2c8ae
--- /dev/null
+++ b/sound/direct_sound_samples/cry_weedle.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_weepinbell.aif b/sound/direct_sound_samples/cry_weepinbell.aif
new file mode 100644
index 000000000..cdd61380a
--- /dev/null
+++ b/sound/direct_sound_samples/cry_weepinbell.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_weezing.aif b/sound/direct_sound_samples/cry_weezing.aif
new file mode 100644
index 000000000..2e4a7fe13
--- /dev/null
+++ b/sound/direct_sound_samples/cry_weezing.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_whiscash.aif b/sound/direct_sound_samples/cry_whiscash.aif
new file mode 100644
index 000000000..219737f32
--- /dev/null
+++ b/sound/direct_sound_samples/cry_whiscash.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_whismur.aif b/sound/direct_sound_samples/cry_whismur.aif
new file mode 100644
index 000000000..4da92ca6a
--- /dev/null
+++ b/sound/direct_sound_samples/cry_whismur.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_wigglytuff.aif b/sound/direct_sound_samples/cry_wigglytuff.aif
new file mode 100644
index 000000000..90aa90a23
--- /dev/null
+++ b/sound/direct_sound_samples/cry_wigglytuff.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_wingull.aif b/sound/direct_sound_samples/cry_wingull.aif
new file mode 100644
index 000000000..182ef18e6
--- /dev/null
+++ b/sound/direct_sound_samples/cry_wingull.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_wobbuffet.aif b/sound/direct_sound_samples/cry_wobbuffet.aif
new file mode 100644
index 000000000..70ee1f704
--- /dev/null
+++ b/sound/direct_sound_samples/cry_wobbuffet.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_wooper.aif b/sound/direct_sound_samples/cry_wooper.aif
new file mode 100644
index 000000000..51a6b627e
--- /dev/null
+++ b/sound/direct_sound_samples/cry_wooper.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_wurmple.aif b/sound/direct_sound_samples/cry_wurmple.aif
new file mode 100644
index 000000000..6442a4063
--- /dev/null
+++ b/sound/direct_sound_samples/cry_wurmple.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_wynaut.aif b/sound/direct_sound_samples/cry_wynaut.aif
new file mode 100644
index 000000000..798732c74
--- /dev/null
+++ b/sound/direct_sound_samples/cry_wynaut.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_xatu.aif b/sound/direct_sound_samples/cry_xatu.aif
new file mode 100644
index 000000000..ac758fdbf
--- /dev/null
+++ b/sound/direct_sound_samples/cry_xatu.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_yanma.aif b/sound/direct_sound_samples/cry_yanma.aif
new file mode 100644
index 000000000..df76534c5
--- /dev/null
+++ b/sound/direct_sound_samples/cry_yanma.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_zangoose.aif b/sound/direct_sound_samples/cry_zangoose.aif
new file mode 100644
index 000000000..ce1622043
--- /dev/null
+++ b/sound/direct_sound_samples/cry_zangoose.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_zapdos.aif b/sound/direct_sound_samples/cry_zapdos.aif
new file mode 100644
index 000000000..a8d914d14
--- /dev/null
+++ b/sound/direct_sound_samples/cry_zapdos.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_zigzagoon.aif b/sound/direct_sound_samples/cry_zigzagoon.aif
new file mode 100644
index 000000000..52b9bb4f4
--- /dev/null
+++ b/sound/direct_sound_samples/cry_zigzagoon.aif
Binary files differ
diff --git a/sound/direct_sound_samples/cry_zubat.aif b/sound/direct_sound_samples/cry_zubat.aif
new file mode 100644
index 000000000..45036d072
--- /dev/null
+++ b/sound/direct_sound_samples/cry_zubat.aif
Binary files differ
diff --git a/sound/music_player_table.inc b/sound/music_player_table.inc
new file mode 100644
index 000000000..a82eef72b
--- /dev/null
+++ b/sound/music_player_table.inc
@@ -0,0 +1,6 @@
+ .align 2
+gMPlayTable:: @ 84A329C
+ music_player gMPlayInfo_BGM, gMPlayTrack_BGM, 10, 0
+ music_player gMPlayInfo_SE1, gMPlayTrack_SE1, 3, 1
+ music_player gMPlayInfo_SE2, gMPlayTrack_SE2, 9, 1
+ music_player gMPlayInfo_SE3, gMPlayTrack_SE3, 1, 0
diff --git a/sound/song_table.inc b/sound/song_table.inc
new file mode 100644
index 000000000..39f1a795e
--- /dev/null
+++ b/sound/song_table.inc
@@ -0,0 +1,351 @@
+gSongTable:: @ 84A32CC
+ song gSong_86B5640, 0, 0
+ song gSong_86B5660, 1, 1
+ song gSong_86B568C, 1, 1
+ song gSong_86B56B0, 1, 1
+ song gSong_86B56F4, 1, 1
+ song gSong_86B5720, 2, 2
+ song gSong_86B573C, 1, 1
+ song gSong_86B5758, 2, 2
+ song gSong_86B5774, 1, 1
+ song gSong_86B57A8, 1, 1
+ song gSong_86B57CC, 1, 1
+ song gSong_86B57E8, 1, 1
+ song gSong_86B5814, 1, 1
+ song gSong_86B5860, 1, 1
+ song gSong_86B58DC, 1, 1
+ song gSong_86B5930, 1, 1
+ song gSong_86B5984, 1, 1
+ song gSong_86B59D4, 1, 1
+ song gSong_86B59F0, 1, 1
+ song gSong_86B5A44, 1, 1
+ song gSong_86B5A8C, 1, 1
+ song gSong_86B5AB8, 1, 1
+ song gSong_86B5ADC, 1, 1
+ song gSong_86B5B00, 1, 1
+ song gSong_86B5B84, 2, 2
+ song gSong_86B5BB0, 1, 1
+ song gSong_86B5BE0, 1, 1
+ song gSong_86B5D60, 1, 1
+ song gSong_86B5D84, 1, 1
+ song gSong_86B5DA8, 1, 1
+ song gSong_86B5DCC, 1, 1
+ song gSong_86B5DFC, 1, 1
+ song gSong_86B5E20, 1, 1
+ song gSong_86B5E6C, 1, 1
+ song gSong_86B5EA4, 1, 1
+ song gSong_86B5EF8, 1, 1
+ song gSong_86B5F34, 1, 1
+ song gSong_86B5F8C, 1, 1
+ song gSong_86B5FD0, 2, 2
+ song gSong_86B600C, 1, 1
+ song gSong_86B604C, 1, 1
+ song gSong_86B6078, 1, 1
+ song gSong_86B60B4, 1, 1
+ song gSong_86B6160, 1, 1
+ song gSong_86B61D8, 1, 1
+ song gSong_86B6204, 2, 2
+ song gSong_86B6238, 1, 1
+ song gSong_86B6264, 2, 2
+ song gSong_86B62A8, 1, 1
+ song gSong_86B62D4, 1, 1
+ song gSong_86B6300, 1, 1
+ song gSong_86B632C, 1, 1
+ song gSong_86B6358, 1, 1
+ song gSong_86B63AC, 2, 2
+ song gSong_86B63F0, 1, 1
+ song gSong_86B6424, 2, 2
+ song gSong_86B645C, 2, 2
+ song gSong_86B6494, 2, 2
+ song gSong_86B64CC, 2, 2
+ song gSong_86B6504, 2, 2
+ song gSong_86B653C, 2, 2
+ song gSong_86B6574, 2, 2
+ song gSong_86B65AC, 2, 2
+ song gSong_86B65E0, 2, 2
+ song gSong_86B6604, 2, 2
+ song gSong_86B6650, 1, 1
+ song gSong_86B66B0, 1, 1
+ song gSong_86B66E4, 2, 2
+ song gSong_86B6714, 2, 2
+ song gSong_86B674C, 2, 2
+ song gSong_86B6790, 2, 2
+ song gSong_86B67C0, 2, 2
+ song gSong_86B67E8, 1, 1
+ song gSong_86B6850, 1, 1
+ song gSong_86B688C, 3, 3
+ song gSong_86B68CC, 3, 3
+ song gSong_86B6908, 3, 3
+ song gSong_86B6948, 3, 3
+ song gSong_86B6984, 3, 3
+ song gSong_86B69C4, 3, 3
+ song gSong_86B6A2C, 1, 1
+ song gSong_86B6A7C, 1, 1
+ song gSong_86B6AB8, 1, 1
+ song gSong_86B6AE8, 3, 3
+ song gSong_86B6B34, 1, 1
+ song gSong_86B6B58, 2, 2
+ song gSong_86B6BAC, 2, 2
+ song gSong_86B6C40, 1, 1
+ song gSong_86B6C7C, 1, 1
+ song gSong_86B6CA0, 1, 1
+ song gSong_86B6D04, 1, 1
+ song gSong_86B6D6C, 1, 1
+ song gSong_86B6D94, 1, 1
+ song gSong_86B6DC8, 1, 1
+ song gSong_86B6DF4, 1, 1
+ song gSong_86B6E70, 1, 1
+ song gSong_86B6F30, 1, 1
+ song gSong_86B7018, 1, 1
+ song gSong_86B7130, 1, 1
+ song gSong_86B7154, 1, 1
+ song gSong_86B7268, 1, 1
+ song gSong_86B7294, 1, 1
+ song gSong_86B72C8, 1, 1
+ song gSong_86B732C, 1, 1
+ song gSong_86B7394, 1, 1
+ song gSong_86B7590, 1, 1
+ song gSong_86B761C, 1, 1
+ song gSong_86B766C, 1, 1
+ song gSong_86B7698, 1, 1
+ song gSong_86B76B8, 2, 2
+ song gSong_86B76F4, 1, 1
+ song gSong_86B7788, 2, 2
+ song gSong_86B77F4, 1, 1
+ song gSong_86B783C, 1, 1
+ song gSong_86B7900, 1, 1
+ song gSong_86B7954, 1, 1
+ song gSong_86B79D4, 1, 1
+ song gSong_86B7A0C, 1, 1
+ song gSong_86B7A40, 1, 1
+ song gSong_86B7A80, 1, 1
+ song gSong_86B7AF8, 1, 1
+ song gSong_86B7B78, 1, 1
+ song gSong_86B7BD0, 1, 1
+ song gSong_86B7C74, 1, 1
+ song gSong_86B7CC0, 1, 1
+ song gSong_86B7D3C, 2, 2
+ song gSong_86B7D88, 2, 2
+ song gSong_86B7DBC, 1, 1
+ song gSong_86B7E08, 1, 1
+ song gSong_86B7E68, 1, 1
+ song gSong_86B7EB4, 1, 1
+ song gSong_86B7F38, 1, 1
+ song gSong_86B7F8C, 1, 1
+ song gSong_86B8058, 1, 1
+ song gSong_86B80F8, 1, 1
+ song gSong_86B8134, 1, 1
+ song gSong_86B8180, 1, 1
+ song gSong_86B8204, 1, 1
+ song gSong_86B8274, 1, 1
+ song gSong_86B8348, 1, 1
+ song gSong_86B83EC, 1, 1
+ song gSong_86B845C, 1, 1
+ song gSong_86B84D0, 1, 1
+ song gSong_86B85B0, 2, 2
+ song gSong_86B85EC, 1, 1
+ song gSong_86B8654, 2, 2
+ song gSong_86B86D0, 1, 1
+ song gSong_86B871C, 1, 1
+ song gSong_86B8764, 1, 1
+ song gSong_86B87CC, 1, 1
+ song gSong_86B8868, 1, 1
+ song gSong_86B89CC, 1, 1
+ song gSong_86B8A34, 1, 1
+ song gSong_86B8A78, 1, 1
+ song gSong_86B8AF4, 1, 1
+ song gSong_86B8B60, 1, 1
+ song gSong_86B8BE0, 1, 1
+ song gSong_86B8C60, 1, 1
+ song gSong_86B8CFC, 1, 1
+ song gSong_86B8D48, 1, 1
+ song gSong_86B8D88, 2, 2
+ song gSong_86B8E00, 1, 1
+ song gSong_86B8E3C, 1, 1
+ song gSong_86B8E94, 2, 2
+ song gSong_86B8F5C, 1, 1
+ song gSong_86B9050, 1, 1
+ song gSong_86B9160, 1, 1
+ song gSong_86B91E8, 1, 1
+ song gSong_86B9230, 1, 1
+ song gSong_86B9290, 1, 1
+ song gSong_86B92DC, 1, 1
+ song gSong_86B9364, 1, 1
+ song gSong_86B9420, 1, 1
+ song gSong_86B9478, 1, 1
+ song gSong_86B94F4, 1, 1
+ song gSong_86B95BC, 1, 1
+ song gSong_86B9678, 1, 1
+ song gSong_86B9764, 1, 1
+ song gSong_86B97A4, 1, 1
+ song gSong_86B9800, 1, 1
+ song gSong_86B9838, 1, 1
+ song gSong_86B98EC, 1, 1
+ song gSong_86B998C, 1, 1
+ song gSong_86B99F4, 1, 1
+ song gSong_86B9B18, 1, 1
+ song gSong_86B9B94, 1, 1
+ song gSong_86B9BF0, 1, 1
+ song gSong_86B9C28, 1, 1
+ song gSong_86B9C78, 1, 1
+ song gSong_86B9D04, 1, 1
+ song gSong_86B9D68, 1, 1
+ song gSong_86B9DE0, 1, 1
+ song gSong_86B9E48, 1, 1
+ song gSong_86B9F9C, 1, 1
+ song gSong_86BA070, 2, 2
+ song gSong_86BA180, 1, 1
+ song gSong_86BA264, 1, 1
+ song gSong_86BA344, 1, 1
+ song gSong_86BA390, 1, 1
+ song gSong_86BA41C, 1, 1
+ song gSong_86BA5AC, 1, 1
+ song gSong_86BA74C, 1, 1
+ song gSong_86BA7BC, 2, 2
+ song gSong_86BA80C, 1, 1
+ song gSong_86BA930, 1, 1
+ song gSong_86BA9B0, 1, 1
+ song gSong_86BAAA0, 1, 1
+ song gSong_86BAB04, 1, 1
+ song gSong_86BAB60, 1, 1
+ song gSong_86BAC14, 1, 1
+ song gSong_86BAE10, 1, 1
+ song gSong_86BAF30, 1, 1
+ song gSong_86BB0A0, 1, 1
+ song gSong_86BB110, 1, 1
+ song gSong_86BB1A8, 1, 1
+ song gSong_86BB1E0, 1, 1
+ song gSong_86BB2B8, 2, 2
+ song gSong_86BB390, 1, 1
+ song gSong_86BB43C, 1, 1
+ song gSong_86BB4D4, 1, 1
+ song gSong_86BB56C, 1, 1
+ song gSong_86BB614, 1, 1
+ song gSong_86BB660, 1, 1
+ song gSong_86BB75C, 1, 1
+ song gSong_86BB7F0, 1, 1
+ song gSong_86BB854, 1, 1
+ song gSong_86BB8F0, 1, 1
+ song gSong_86BBAF8, 2, 2
+ song gSong_86BBBF4, 2, 2
+ song gSong_86BBCE4, 1, 1
+ song gSong_86BBD68, 1, 1
+ song gSong_86BBDDC, 2, 2
+ song gSong_86BBF5C, 1, 1
+ song gSong_86BC060, 1, 1
+ song gSong_86BC0C0, 1, 1
+ song gSong_86BC130, 1, 1
+ song gSong_86BC24C, 2, 2
+ song gSong_86BC2F0, 1, 1
+ song gSong_86BC460, 1, 1
+ song gSong_86BC594, 1, 1
+ song gSong_86BC618, 1, 1
+ song gSong_86BC670, 1, 1
+ song gSong_86BC6A0, 1, 1
+ song gSong_86BC6D8, 1, 1
+ song gSong_86BC764, 1, 1
+ song gSong_86BC79C, 1, 1
+ song gSong_86BC7E0, 1, 1
+ song gSong_86BC820, 1, 1
+ song gSong_86BC848, 1, 1
+ song gSong_86BC900, 1, 1
+ song gSong_86BC974, 1, 1
+ song gSong_86BC9E0, 1, 1
+ song gSong_86BCA28, 1, 1
+ song gSong_86BCB08, 1, 1
+ song gSong_86BCBC8, 1, 1
+ song gSong_86BCBFC, 1, 1
+ song gSong_86BCCB8, 2, 2
+ song gSong_86BCD98, 2, 2
+ song gSong_86BCEE4, 2, 2
+ song gSong_86BD080, 2, 2
+ song gSong_86BD358, 2, 2
+ song gSong_86BD4E4, 2, 2
+ song gSong_86BD5BC, 2, 2
+ song gSong_86BD628, 2, 2
+ song gSong_86BDB98, 0, 0
+ song gSong_86BE9C4, 0, 0
+ song gSong_86BFA68, 0, 0
+ song gSong_86BFDC0, 0, 0
+ song gSong_86BFFE0, 2, 2
+ song gSong_86C0120, 2, 2
+ song gSong_86C0204, 2, 2
+ song gSong_86C02FC, 2, 2
+ song gSong_86C07E4, 0, 0
+ song gSong_86C1720, 0, 0
+ song gSong_86C3344, 0, 0
+ song gSong_86C3D50, 0, 0
+ song gSong_86C3FE8, 2, 2
+ song gSong_86C4AE8, 0, 0
+ song gSong_86C5B5C, 0, 0
+ song gSong_86C6A30, 0, 0
+ song gSong_86C775C, 0, 0
+ song gSong_86C77B0, 0, 0
+ song gSong_86C83C4, 0, 0
+ song gSong_86C8784, 0, 0
+ song gSong_86C8B3C, 0, 0
+ song gSong_86C8FE4, 0, 0
+ song gSong_86C9AA0, 0, 0
+ song gSong_86CACB8, 0, 0
+ song gSong_86CC108, 0, 0
+ song gSong_86CD344, 0, 0
+ song gSong_86D1354, 0, 0
+ song gSong_86D1DDC, 0, 0
+ song gSong_86D264C, 0, 0
+ song gSong_86D3588, 0, 0
+ song gSong_86D42FC, 0, 0
+ song gSong_86D503C, 0, 0
+ song gSong_86D6B20, 0, 0
+ song gSong_86D9694, 0, 0
+ song gSong_86DA810, 0, 0
+ song gSong_86DCFE0, 0, 0
+ song gSong_86DD844, 0, 0
+ song gSong_86DDFE0, 0, 0
+ song gSong_86DE96C, 0, 0
+ song gSong_86DF3CC, 0, 0
+ song gSong_86E0670, 0, 0
+ song gSong_86E0FE8, 0, 0
+ song gSong_86E18B4, 0, 0
+ song gSong_86E2FA8, 0, 0
+ song gSong_86E39E4, 0, 0
+ song gSong_86E4564, 0, 0
+ song gSong_86E56E4, 0, 0
+ song gSong_86E5C1C, 0, 0
+ song gSong_86E6B0C, 0, 0
+ song gSong_86E7920, 0, 0
+ song gSong_86E8810, 0, 0
+ song gSong_86E904C, 0, 0
+ song gSong_86E9820, 0, 0
+ song gSong_86E9A20, 2, 2
+ song gSong_86E9C20, 2, 2
+ song gSong_86E9F90, 2, 2
+ song gSong_86EA100, 2, 2
+ song gSong_86EAA04, 0, 0
+ song gSong_86EAE3C, 0, 0
+ song gSong_86EAEC8, 0, 0
+ song gSong_86EB098, 0, 0
+ song gSong_86EB154, 0, 0
+ song gSong_86EC0C8, 0, 0
+ song gSong_86ED044, 0, 0
+ song gSong_86EDAA0, 0, 0
+ song gSong_86EDF20, 0, 0
+ song gSong_86EEE4C, 0, 0
+ song gSong_86F0250, 0, 0
+ song gSong_86F0740, 0, 0
+ song gSong_86F1600, 0, 0
+ song gSong_86F281C, 0, 0
+ song gSong_86F3710, 0, 0
+ song gSong_86F4738, 0, 0
+ song gSong_86F5668, 0, 0
+ song gSong_86F582C, 2, 2
+ song gSong_86F79B4, 0, 0
+ song gSong_86F8B2C, 0, 0
+ song gSong_86F9DE4, 0, 0
+ song gSong_86FA228, 0, 0
+ song gSong_86FAB70, 0, 0
+ song gSong_86FB570, 0, 0
+ song gSong_86FBDB0, 0, 0
+ song gSong_86FBE8C, 0, 0
+
+dummy_song_header: @ 84A3DA4
+ .byte 0, 0, 0, 0
diff --git a/src/blit.c b/src/blit.c
new file mode 100644
index 000000000..969f89900
--- /dev/null
+++ b/src/blit.c
@@ -0,0 +1,212 @@
+#include "global.h"
+#include "blit.h"
+
+void BlitBitmapRect4BitWithoutColorKey(const struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height)
+{
+ BlitBitmapRect4Bit(src, dst, srcX, srcY, dstX, dstY, width, height, 0xFF);
+}
+
+void BlitBitmapRect4Bit(const struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height, u8 colorKey)
+{
+ s32 xEnd;
+ s32 yEnd;
+ s32 multiplierSrcY;
+ s32 multiplierDstY;
+ s32 loopSrcY, loopDstY;
+ s32 loopSrcX, loopDstX;
+ const u8 *pixelsSrc;
+ u8 *pixelsDst;
+ s32 toOrr;
+ s32 toAnd;
+ s32 toShift;
+
+ if (dst->width - dstX < width)
+ xEnd = (dst->width - dstX) + srcX;
+ else
+ xEnd = srcX + width;
+
+ if (dst->height - dstY < height)
+ yEnd = (dst->height - dstY) + srcY;
+ else
+ yEnd = height + srcY;
+
+ multiplierSrcY = (src->width + (src->width & 7)) >> 3;
+ multiplierDstY = (dst->width + (dst->width & 7)) >> 3;
+
+ if (colorKey == 0xFF)
+ {
+ for (loopSrcY = srcY, loopDstY = dstY; loopSrcY < yEnd; loopSrcY++, loopDstY++)
+ {
+ for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++)
+ {
+ pixelsSrc = src->pixels + ((loopSrcX >> 1) & 3) + ((loopSrcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1B);
+ pixelsDst = dst->pixels + ((loopDstX >> 1) & 3) + ((loopDstX >> 3) << 5) + (((loopDstY >> 3) * multiplierDstY) << 5) + ((u32)(loopDstY << 0x1d) >> 0x1B);
+ toOrr = ((*pixelsSrc >> ((loopSrcX & 1) << 2)) & 0xF);
+ toShift = ((loopDstX & 1) << 2);
+ toOrr <<= toShift;
+ toAnd = 0xF0 >> (toShift);
+ *pixelsDst = toOrr | (*pixelsDst & toAnd);
+ }
+ }
+ }
+ else
+ {
+ for (loopSrcY = srcY, loopDstY = dstY; loopSrcY < yEnd; loopSrcY++, loopDstY++)
+ {
+ for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++)
+ {
+ pixelsSrc = src->pixels + ((loopSrcX >> 1) & 3) + ((loopSrcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1B);
+ pixelsDst = dst->pixels + ((loopDstX >> 1) & 3) + ((loopDstX >> 3) << 5) + (((loopDstY >> 3) * multiplierDstY) << 5) + ((u32)(loopDstY << 0x1d) >> 0x1B);
+ toOrr = ((*pixelsSrc >> ((loopSrcX & 1) << 2)) & 0xF);
+ if (toOrr != colorKey)
+ {
+ toShift = ((loopDstX & 1) << 2);
+ toOrr <<= toShift;
+ toAnd = 0xF0 >> (toShift);
+ *pixelsDst = toOrr | (*pixelsDst & toAnd);
+ }
+ }
+ }
+ }
+}
+
+void FillBitmapRect4Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue)
+{
+ s32 xEnd;
+ s32 yEnd;
+ s32 multiplierY;
+ s32 loopX, loopY;
+
+ xEnd = x + width;
+ if (xEnd > surface->width)
+ xEnd = surface->width;
+
+ yEnd = y + height;
+ if (yEnd > surface->height)
+ yEnd = surface->height;
+
+ multiplierY = (surface->width + (surface->width & 7)) >> 3;
+
+ for (loopY = y; loopY < yEnd; loopY++)
+ {
+ for (loopX = x; loopX < xEnd; loopX++)
+ {
+ u8 *pixels = surface->pixels + ((loopX >> 1) & 3) + ((loopX >> 3) << 5) + (((loopY >> 3) * multiplierY) << 5) + ((u32)(loopY << 0x1d) >> 0x1B);
+ if ((loopX & 1) != 0)
+ {
+ *pixels &= 0xF;
+ *pixels |= fillValue << 4;
+ }
+ else
+ {
+ *pixels &= 0xF0;
+ *pixels |= fillValue;
+ }
+ }
+ }
+}
+
+void BlitBitmapRect4BitTo8Bit(const struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height, u8 colorKey, u8 paletteOffset)
+{
+ s32 palOffsetBits;
+ s32 xEnd;
+ s32 yEnd;
+ s32 multiplierSrcY;
+ s32 multiplierDstY;
+ s32 loopSrcY, loopDstY;
+ s32 loopSrcX, loopDstX;
+ const u8 *pixelsSrc;
+ u8 *pixelsDst;
+ s32 colorKeyBits;
+
+ palOffsetBits = (u32)(paletteOffset << 0x1C) >> 0x18;
+ colorKeyBits = (u32)(colorKey << 0x1C) >> 0x18;
+
+ if (dst->width - dstX < width)
+ xEnd = (dst->width - dstX) + srcX;
+ else
+ xEnd = width + srcX;
+
+ if (dst->height - dstY < height)
+ yEnd = (srcY + dst->height) - dstY;
+ else
+ yEnd = srcY + height;
+
+ multiplierSrcY = (src->width + (src->width & 7)) >> 3;
+ multiplierDstY = (dst->width + (dst->width & 7)) >> 3;
+
+ if (colorKey == 0xFF)
+ {
+ for (loopSrcY = srcY, loopDstY = dstY; loopSrcY < yEnd; loopSrcY++, loopDstY++)
+ {
+ pixelsSrc = src->pixels + ((srcX >> 1) & 3) + ((srcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1b);
+ for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++)
+ {
+ pixelsDst = dst->pixels + (loopDstX & 7) + ((loopDstX >> 3) << 6) + (((loopDstY >> 3) * multiplierDstY) << 6) + ((u32)(loopDstY << 0x1d) >> 0x1a);
+ if (loopSrcX & 1)
+ {
+ *pixelsDst = palOffsetBits + (*pixelsSrc >> 4);
+ }
+ else
+ {
+ pixelsSrc = src->pixels + ((loopSrcX >> 1) & 3) + ((loopSrcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1b);
+ *pixelsDst = palOffsetBits + (*pixelsSrc & 0xF);
+ }
+ }
+ }
+ }
+ else
+ {
+ for (loopSrcY = srcY, loopDstY = dstY; loopSrcY < yEnd; loopSrcY++, loopDstY++)
+ {
+ pixelsSrc = src->pixels + ((srcX >> 1) & 3) + ((srcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1b);
+ for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++)
+ {
+ if (loopSrcX & 1)
+ {
+ if ((*pixelsSrc & 0xF0) != colorKeyBits)
+ {
+ pixelsDst = dst->pixels + (loopDstX & 7) + ((loopDstX >> 3) << 6) + (((loopDstY >> 3) * multiplierDstY) << 6) + ((u32)(loopDstY << 0x1d) >> 0x1a);
+ *pixelsDst = palOffsetBits + (*pixelsSrc >> 4);
+ }
+ }
+ else
+ {
+ pixelsSrc = src->pixels + ((loopSrcX >> 1) & 3) + ((loopSrcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1b);
+ if ((*pixelsSrc & 0xF) != colorKey)
+ {
+ pixelsDst = dst->pixels + (loopDstX & 7) + ((loopDstX >> 3) << 6) + (((loopDstY >> 3) * multiplierDstY) << 6) + ((u32)(loopDstY << 0x1d) >> 0x1a);
+ *pixelsDst = palOffsetBits + (*pixelsSrc & 0xF);
+ }
+ }
+ }
+ }
+ }
+}
+
+void FillBitmapRect8Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue)
+{
+ s32 xEnd;
+ s32 yEnd;
+ s32 multiplierY;
+ s32 loopX, loopY;
+
+ xEnd = x + width;
+ if (xEnd > surface->width)
+ xEnd = surface->width;
+
+ yEnd = y + height;
+ if (yEnd > surface->height)
+ yEnd = surface->height;
+
+ multiplierY = (surface->width + (surface->width & 7)) >> 3;
+
+ for (loopY = y; loopY < yEnd; loopY++)
+ {
+ for (loopX = x; loopX < xEnd; loopX++)
+ {
+ u8 *pixels = surface->pixels + (loopX & 7) + ((loopX >> 3) << 6) + (((loopY >> 3) * multiplierY) << 6) + ((u32)(loopY << 0x1d) >> 0x1a);
+ *pixels = fillValue;
+ }
+ }
+}
diff --git a/src/m4a.c b/src/m4a.c
new file mode 100644
index 000000000..7b4441ca4
--- /dev/null
+++ b/src/m4a.c
@@ -0,0 +1,1779 @@
+#include "gba/m4a_internal.h"
+
+extern const u8 gCgb3Vol[];
+
+#define BSS_CODE __attribute__((section(".bss.code")))
+
+BSS_CODE ALIGNED(4) char SoundMainRAM_Buffer[0x800] = {0};
+
+struct SoundInfo gSoundInfo;
+struct PokemonCrySong gPokemonCrySongs[MAX_POKEMON_CRIES];
+struct MusicPlayerInfo gPokemonCryMusicPlayers[MAX_POKEMON_CRIES];
+void *gMPlayJumpTable[36];
+struct CgbChannel gCgbChans[4];
+struct MusicPlayerTrack gPokemonCryTracks[MAX_POKEMON_CRIES * 2];
+struct PokemonCrySong gPokemonCrySong;
+struct MusicPlayerInfo gMPlayInfo_BGM;
+struct MusicPlayerInfo gMPlayInfo_SE1;
+struct MusicPlayerInfo gMPlayInfo_SE2;
+struct MusicPlayerInfo gMPlayInfo_SE3;
+u8 gMPlayMemAccArea[0x10];
+
+u32 MidiKeyToFreq(struct WaveData *wav, u8 key, u8 fineAdjust)
+{
+ u32 val1;
+ u32 val2;
+ u32 fineAdjustShifted = fineAdjust << 24;
+
+ if (key > 178)
+ {
+ key = 178;
+ fineAdjustShifted = 255 << 24;
+ }
+
+ val1 = gScaleTable[key];
+ val1 = gFreqTable[val1 & 0xF] >> (val1 >> 4);
+
+ val2 = gScaleTable[key + 1];
+ val2 = gFreqTable[val2 & 0xF] >> (val2 >> 4);
+
+ return umul3232H32(wav->freq, val1 + umul3232H32(val2 - val1, fineAdjustShifted));
+}
+
+void UnusedDummyFunc(void)
+{
+}
+
+void MPlayContinue(struct MusicPlayerInfo *mplayInfo)
+{
+ if (mplayInfo->ident == ID_NUMBER)
+ {
+ mplayInfo->ident++;
+ mplayInfo->status &= ~MUSICPLAYER_STATUS_PAUSE;
+ mplayInfo->ident = ID_NUMBER;
+ }
+}
+
+void MPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed)
+{
+ if (mplayInfo->ident == ID_NUMBER)
+ {
+ mplayInfo->ident++;
+ mplayInfo->fadeOC = speed;
+ mplayInfo->fadeOI = speed;
+ mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT);
+ mplayInfo->ident = ID_NUMBER;
+ }
+}
+
+void m4aSoundInit(void)
+{
+ s32 i;
+
+ CpuCopy32((void *)((s32)SoundMainRAM & ~1), SoundMainRAM_Buffer, sizeof(SoundMainRAM_Buffer));
+
+ SoundInit(&gSoundInfo);
+ MPlayExtender(gCgbChans);
+ m4aSoundMode(SOUND_MODE_DA_BIT_8
+ | SOUND_MODE_FREQ_13379
+ | (12 << SOUND_MODE_MASVOL_SHIFT)
+ | (5 << SOUND_MODE_MAXCHN_SHIFT));
+
+ for (i = 0; i < NUM_MUSIC_PLAYERS; i++)
+ {
+ struct MusicPlayerInfo *mplayInfo = gMPlayTable[i].info;
+ MPlayOpen(mplayInfo, gMPlayTable[i].track, gMPlayTable[i].unk_8);
+ mplayInfo->unk_B = gMPlayTable[i].unk_A;
+ mplayInfo->memAccArea = gMPlayMemAccArea;
+ }
+
+ memcpy(&gPokemonCrySong, &gPokemonCrySongTemplate, sizeof(struct PokemonCrySong));
+
+ for (i = 0; i < MAX_POKEMON_CRIES; i++)
+ {
+ struct MusicPlayerInfo *mplayInfo = &gPokemonCryMusicPlayers[i];
+ struct MusicPlayerTrack *track = &gPokemonCryTracks[i * 2];
+ MPlayOpen(mplayInfo, track, 2);
+ track->chan = 0;
+ }
+}
+
+void m4aSoundMain(void)
+{
+ SoundMain();
+}
+
+void m4aSongNumStart(u16 n)
+{
+ const struct MusicPlayer *mplayTable = gMPlayTable;
+ const struct Song *songTable = gSongTable;
+ const struct Song *song = &songTable[n];
+ const struct MusicPlayer *mplay = &mplayTable[song->ms];
+
+ MPlayStart(mplay->info, song->header);
+}
+
+void m4aSongNumStartOrChange(u16 n)
+{
+ const struct MusicPlayer *mplayTable = gMPlayTable;
+ const struct Song *songTable = gSongTable;
+ const struct Song *song = &songTable[n];
+ const struct MusicPlayer *mplay = &mplayTable[song->ms];
+
+ if (mplay->info->songHeader != song->header)
+ {
+ MPlayStart(mplay->info, song->header);
+ }
+ else
+ {
+ if ((mplay->info->status & MUSICPLAYER_STATUS_TRACK) == 0
+ || (mplay->info->status & MUSICPLAYER_STATUS_PAUSE))
+ {
+ MPlayStart(mplay->info, song->header);
+ }
+ }
+}
+
+void m4aSongNumStartOrContinue(u16 n)
+{
+ const struct MusicPlayer *mplayTable = gMPlayTable;
+ const struct Song *songTable = gSongTable;
+ const struct Song *song = &songTable[n];
+ const struct MusicPlayer *mplay = &mplayTable[song->ms];
+
+ if (mplay->info->songHeader != song->header)
+ MPlayStart(mplay->info, song->header);
+ else if ((mplay->info->status & MUSICPLAYER_STATUS_TRACK) == 0)
+ MPlayStart(mplay->info, song->header);
+ else if (mplay->info->status & MUSICPLAYER_STATUS_PAUSE)
+ MPlayContinue(mplay->info);
+}
+
+void m4aSongNumStop(u16 n)
+{
+ const struct MusicPlayer *mplayTable = gMPlayTable;
+ const struct Song *songTable = gSongTable;
+ const struct Song *song = &songTable[n];
+ const struct MusicPlayer *mplay = &mplayTable[song->ms];
+
+ if (mplay->info->songHeader == song->header)
+ m4aMPlayStop(mplay->info);
+}
+
+void m4aSongNumContinue(u16 n)
+{
+ const struct MusicPlayer *mplayTable = gMPlayTable;
+ const struct Song *songTable = gSongTable;
+ const struct Song *song = &songTable[n];
+ const struct MusicPlayer *mplay = &mplayTable[song->ms];
+
+ if (mplay->info->songHeader == song->header)
+ MPlayContinue(mplay->info);
+}
+
+void m4aMPlayAllStop(void)
+{
+ s32 i;
+
+ for (i = 0; i < NUM_MUSIC_PLAYERS; i++)
+ m4aMPlayStop(gMPlayTable[i].info);
+
+ for (i = 0; i < MAX_POKEMON_CRIES; i++)
+ m4aMPlayStop(&gPokemonCryMusicPlayers[i]);
+}
+
+void m4aMPlayContinue(struct MusicPlayerInfo *mplayInfo)
+{
+ MPlayContinue(mplayInfo);
+}
+
+void m4aMPlayAllContinue(void)
+{
+ s32 i;
+
+ for (i = 0; i < NUM_MUSIC_PLAYERS; i++)
+ MPlayContinue(gMPlayTable[i].info);
+
+ for (i = 0; i < MAX_POKEMON_CRIES; i++)
+ MPlayContinue(&gPokemonCryMusicPlayers[i]);
+}
+
+void m4aMPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed)
+{
+ MPlayFadeOut(mplayInfo, speed);
+}
+
+void m4aMPlayFadeOutTemporarily(struct MusicPlayerInfo *mplayInfo, u16 speed)
+{
+ if (mplayInfo->ident == ID_NUMBER)
+ {
+ mplayInfo->ident++;
+ mplayInfo->fadeOC = speed;
+ mplayInfo->fadeOI = speed;
+ mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT) | TEMPORARY_FADE;
+ mplayInfo->ident = ID_NUMBER;
+ }
+}
+
+void m4aMPlayFadeIn(struct MusicPlayerInfo *mplayInfo, u16 speed)
+{
+ if (mplayInfo->ident == ID_NUMBER)
+ {
+ mplayInfo->ident++;
+ mplayInfo->fadeOC = speed;
+ mplayInfo->fadeOI = speed;
+ mplayInfo->fadeOV = (0 << FADE_VOL_SHIFT) | FADE_IN;
+ mplayInfo->status &= ~MUSICPLAYER_STATUS_PAUSE;
+ mplayInfo->ident = ID_NUMBER;
+ }
+}
+
+void m4aMPlayImmInit(struct MusicPlayerInfo *mplayInfo)
+{
+ s32 trackCount = mplayInfo->trackCount;
+ struct MusicPlayerTrack *track = mplayInfo->tracks;
+
+ while (trackCount > 0)
+ {
+ if (track->flags & MPT_FLG_EXIST)
+ {
+ if (track->flags & MPT_FLG_START)
+ {
+ Clear64byte(track);
+ track->flags = MPT_FLG_EXIST;
+ track->bendRange = 2;
+ track->volX = 64;
+ track->lfoSpeed = 22;
+ track->tone.type = 1;
+ }
+ }
+
+ trackCount--;
+ track++;
+ }
+}
+
+void MPlayExtender(struct CgbChannel *cgbChans)
+{
+ struct SoundInfo *soundInfo;
+ u32 ident;
+
+ REG_SOUNDCNT_X = SOUND_MASTER_ENABLE
+ | SOUND_4_ON
+ | SOUND_3_ON
+ | SOUND_2_ON
+ | SOUND_1_ON;
+ REG_SOUNDCNT_L = 0; // set master volume to zero
+ REG_NR12 = 0x8;
+ REG_NR22 = 0x8;
+ REG_NR42 = 0x8;
+ REG_NR14 = 0x80;
+ REG_NR24 = 0x80;
+ REG_NR44 = 0x80;
+ REG_NR30 = 0;
+ REG_NR50 = 0x77;
+
+ soundInfo = SOUND_INFO_PTR;
+
+ ident = soundInfo->ident;
+
+ if (ident != ID_NUMBER)
+ return;
+
+ soundInfo->ident++;
+
+ gMPlayJumpTable[8] = ply_memacc;
+ gMPlayJumpTable[17] = ply_lfos;
+ gMPlayJumpTable[19] = ply_mod;
+ gMPlayJumpTable[28] = ply_xcmd;
+ gMPlayJumpTable[29] = ply_endtie;
+ gMPlayJumpTable[30] = SampleFreqSet;
+ gMPlayJumpTable[31] = TrackStop;
+ gMPlayJumpTable[32] = FadeOutBody;
+ gMPlayJumpTable[33] = TrkVolPitSet;
+
+ soundInfo->cgbChans = (struct CgbChannel *)cgbChans;
+ soundInfo->CgbSound = CgbSound;
+ soundInfo->CgbOscOff = CgbOscOff;
+ soundInfo->MidiKeyToCgbFreq = MidiKeyToCgbFreq;
+ soundInfo->maxLines = MAX_LINES;
+
+ CpuFill32(0, cgbChans, sizeof(struct CgbChannel) * 4);
+
+ cgbChans[0].ty = 1;
+ cgbChans[0].panMask = 0x11;
+ cgbChans[1].ty = 2;
+ cgbChans[1].panMask = 0x22;
+ cgbChans[2].ty = 3;
+ cgbChans[2].panMask = 0x44;
+ cgbChans[3].ty = 4;
+ cgbChans[3].panMask = 0x88;
+
+ soundInfo->ident = ident;
+}
+
+void MusicPlayerJumpTableCopy(void)
+{
+ asm("swi 0x2A");
+}
+
+void ClearChain(void *x)
+{
+ void (*func)(void *) = *(&gMPlayJumpTable[34]);
+ func(x);
+}
+
+void Clear64byte(void *x)
+{
+ void (*func)(void *) = *(&gMPlayJumpTable[35]);
+ func(x);
+}
+
+void SoundInit(struct SoundInfo *soundInfo)
+{
+ soundInfo->ident = 0;
+
+ if (REG_DMA1CNT & (DMA_REPEAT << 16))
+ REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4;
+
+ if (REG_DMA2CNT & (DMA_REPEAT << 16))
+ REG_DMA2CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4;
+
+ REG_DMA1CNT_H = DMA_32BIT;
+ REG_DMA2CNT_H = DMA_32BIT;
+ REG_SOUNDCNT_X = SOUND_MASTER_ENABLE
+ | SOUND_4_ON
+ | SOUND_3_ON
+ | SOUND_2_ON
+ | SOUND_1_ON;
+ REG_SOUNDCNT_H = SOUND_B_FIFO_RESET | SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT
+ | SOUND_A_FIFO_RESET | SOUND_A_TIMER_0 | SOUND_A_RIGHT_OUTPUT
+ | SOUND_ALL_MIX_FULL;
+ REG_SOUNDBIAS_H = (REG_SOUNDBIAS_H & 0x3F) | 0x40;
+
+ REG_DMA1SAD = (s32)soundInfo->pcmBuffer;
+ REG_DMA1DAD = (s32)&REG_FIFO_A;
+ REG_DMA2SAD = (s32)soundInfo->pcmBuffer + PCM_DMA_BUF_SIZE;
+ REG_DMA2DAD = (s32)&REG_FIFO_B;
+
+ SOUND_INFO_PTR = soundInfo;
+ CpuFill32(0, soundInfo, sizeof(struct SoundInfo));
+
+ soundInfo->maxChans = 8;
+ soundInfo->masterVolume = 15;
+ soundInfo->plynote = (u32)ply_note;
+ soundInfo->CgbSound = DummyFunc;
+ soundInfo->CgbOscOff = (void (*)(u8))DummyFunc;
+ soundInfo->MidiKeyToCgbFreq = (u32 (*)(u8, u8, u8))DummyFunc;
+ soundInfo->ExtVolPit = (u32)DummyFunc;
+
+ MPlayJumpTableCopy(gMPlayJumpTable);
+
+ soundInfo->MPlayJumpTable = (u32)gMPlayJumpTable;
+
+ SampleFreqSet(SOUND_MODE_FREQ_13379);
+
+ soundInfo->ident = ID_NUMBER;
+}
+
+void SampleFreqSet(u32 freq)
+{
+ struct SoundInfo *soundInfo = SOUND_INFO_PTR;
+
+ freq = (freq & 0xF0000) >> 16;
+ soundInfo->freq = freq;
+ soundInfo->pcmSamplesPerVBlank = gPcmSamplesPerVBlankTable[freq - 1];
+ soundInfo->pcmDmaPeriod = PCM_DMA_BUF_SIZE / soundInfo->pcmSamplesPerVBlank;
+
+ // LCD refresh rate 59.7275Hz
+ soundInfo->pcmFreq = (597275 * soundInfo->pcmSamplesPerVBlank + 5000) / 10000;
+
+ // CPU frequency 16.78Mhz
+ soundInfo->divFreq = (16777216 / soundInfo->pcmFreq + 1) >> 1;
+
+ // Turn off timer 0.
+ REG_TM0CNT_H = 0;
+
+ // cycles per LCD fresh 280896
+ REG_TM0CNT_L = -(280896 / soundInfo->pcmSamplesPerVBlank);
+
+ m4aSoundVSyncOn();
+
+ while (*(vu8 *)REG_ADDR_VCOUNT == 159)
+ ;
+
+ while (*(vu8 *)REG_ADDR_VCOUNT != 159)
+ ;
+
+ REG_TM0CNT_H = TIMER_ENABLE | TIMER_1CLK;
+}
+
+void m4aSoundMode(u32 mode)
+{
+ struct SoundInfo *soundInfo = SOUND_INFO_PTR;
+ u32 temp;
+
+ if (soundInfo->ident != ID_NUMBER)
+ return;
+
+ soundInfo->ident++;
+
+ temp = mode & (SOUND_MODE_REVERB_SET | SOUND_MODE_REVERB_VAL);
+
+ if (temp)
+ soundInfo->reverb = temp & SOUND_MODE_REVERB_VAL;
+
+ temp = mode & SOUND_MODE_MAXCHN;
+
+ if (temp)
+ {
+ struct SoundChannel *chan;
+
+ soundInfo->maxChans = temp >> SOUND_MODE_MAXCHN_SHIFT;
+
+ temp = MAX_DIRECTSOUND_CHANNELS;
+ chan = &soundInfo->chans[0];
+
+ while (temp != 0)
+ {
+ chan->status = 0;
+ temp--;
+ chan++;
+ }
+ }
+
+ temp = mode & SOUND_MODE_MASVOL;
+
+ if (temp)
+ soundInfo->masterVolume = temp >> SOUND_MODE_MASVOL_SHIFT;
+
+ temp = mode & SOUND_MODE_DA_BIT;
+
+ if (temp)
+ {
+ temp = (temp & 0x300000) >> 14;
+ REG_SOUNDBIAS_H = (REG_SOUNDBIAS_H & 0x3F) | temp;
+ }
+
+ temp = mode & SOUND_MODE_FREQ;
+
+ if (temp)
+ {
+ m4aSoundVSyncOff();
+ SampleFreqSet(temp);
+ }
+
+ soundInfo->ident = ID_NUMBER;
+}
+
+void SoundClear(void)
+{
+ struct SoundInfo *soundInfo = SOUND_INFO_PTR;
+ s32 i;
+ void *chan;
+
+ if (soundInfo->ident != ID_NUMBER)
+ return;
+
+ soundInfo->ident++;
+
+ i = MAX_DIRECTSOUND_CHANNELS;
+ chan = &soundInfo->chans[0];
+
+ while (i > 0)
+ {
+ ((struct SoundChannel *)chan)->status = 0;
+ i--;
+ chan = (void *)((s32)chan + sizeof(struct SoundChannel));
+ }
+
+ chan = soundInfo->cgbChans;
+
+ if (chan)
+ {
+ i = 1;
+
+ while (i <= 4)
+ {
+ soundInfo->CgbOscOff(i);
+ ((struct CgbChannel *)chan)->sf = 0;
+ i++;
+ chan = (void *)((s32)chan + sizeof(struct CgbChannel));
+ }
+ }
+
+ soundInfo->ident = ID_NUMBER;
+}
+
+void m4aSoundVSyncOff(void)
+{
+ struct SoundInfo *soundInfo = SOUND_INFO_PTR;
+
+ if (soundInfo->ident >= ID_NUMBER && soundInfo->ident <= ID_NUMBER + 1)
+ {
+ soundInfo->ident += 10;
+
+ if (REG_DMA1CNT & (DMA_REPEAT << 16))
+ REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4;
+
+ if (REG_DMA2CNT & (DMA_REPEAT << 16))
+ REG_DMA2CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4;
+
+ REG_DMA1CNT_H = DMA_32BIT;
+ REG_DMA2CNT_H = DMA_32BIT;
+
+ CpuFill32(0, soundInfo->pcmBuffer, sizeof(soundInfo->pcmBuffer));
+ }
+}
+
+void m4aSoundVSyncOn(void)
+{
+ struct SoundInfo *soundInfo = SOUND_INFO_PTR;
+ u32 ident = soundInfo->ident;
+
+ if (ident == ID_NUMBER)
+ return;
+
+ REG_DMA1CNT_H = DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT;
+ REG_DMA2CNT_H = DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT;
+
+ soundInfo->pcmDmaCounter = 0;
+ soundInfo->ident = ident - 10;
+}
+
+void MPlayOpen(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *tracks, u8 trackCount)
+{
+ struct SoundInfo *soundInfo;
+
+ if (trackCount == 0)
+ return;
+
+ if (trackCount > MAX_MUSICPLAYER_TRACKS)
+ trackCount = MAX_MUSICPLAYER_TRACKS;
+
+ soundInfo = SOUND_INFO_PTR;
+
+ if (soundInfo->ident != ID_NUMBER)
+ return;
+
+ soundInfo->ident++;
+
+ Clear64byte(mplayInfo);
+
+ mplayInfo->tracks = tracks;
+ mplayInfo->trackCount = trackCount;
+ mplayInfo->status = MUSICPLAYER_STATUS_PAUSE;
+
+ while (trackCount != 0)
+ {
+ tracks->flags = 0;
+ trackCount--;
+ tracks++;
+ }
+
+ if (soundInfo->func != 0)
+ {
+ mplayInfo->func = soundInfo->func;
+ mplayInfo->intp = soundInfo->intp;
+ soundInfo->func = 0;
+ }
+
+ soundInfo->intp = (u32)mplayInfo;
+ soundInfo->func = (u32)MPlayMain;
+ soundInfo->ident = ID_NUMBER;
+ mplayInfo->ident = ID_NUMBER;
+}
+
+void MPlayStart(struct MusicPlayerInfo *mplayInfo, struct SongHeader *songHeader)
+{
+ s32 i;
+ u8 unk_B;
+ struct MusicPlayerTrack *track;
+
+ if (mplayInfo->ident != ID_NUMBER)
+ return;
+
+ unk_B = mplayInfo->unk_B;
+
+ if (!unk_B
+ || ((!mplayInfo->songHeader || !(mplayInfo->tracks[0].flags & MPT_FLG_START))
+ && ((mplayInfo->status & MUSICPLAYER_STATUS_TRACK) == 0
+ || (mplayInfo->status & MUSICPLAYER_STATUS_PAUSE)))
+ || (mplayInfo->priority <= songHeader->priority))
+ {
+ mplayInfo->ident++;
+ mplayInfo->status = 0;
+ mplayInfo->songHeader = songHeader;
+ mplayInfo->tone = songHeader->tone;
+ mplayInfo->priority = songHeader->priority;
+ mplayInfo->clock = 0;
+ mplayInfo->tempoD = 150;
+ mplayInfo->tempoI = 150;
+ mplayInfo->tempoU = 0x100;
+ mplayInfo->tempoC = 0;
+ mplayInfo->fadeOI = 0;
+
+ i = 0;
+ track = mplayInfo->tracks;
+
+ while (i < songHeader->trackCount && i < mplayInfo->trackCount)
+ {
+ TrackStop(mplayInfo, track);
+ track->flags = MPT_FLG_EXIST | MPT_FLG_START;
+ track->chan = 0;
+ track->cmdPtr = songHeader->part[i];
+ i++;
+ track++;
+ }
+
+ while (i < mplayInfo->trackCount)
+ {
+ TrackStop(mplayInfo, track);
+ track->flags = 0;
+ i++;
+ track++;
+ }
+
+ if (songHeader->reverb & 0x80)
+ m4aSoundMode(songHeader->reverb);
+
+ mplayInfo->ident = ID_NUMBER;
+ }
+}
+
+void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo)
+{
+ s32 i;
+ struct MusicPlayerTrack *track;
+
+ if (mplayInfo->ident != ID_NUMBER)
+ return;
+
+ mplayInfo->ident++;
+ mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE;
+
+ i = mplayInfo->trackCount;
+ track = mplayInfo->tracks;
+
+ while (i > 0)
+ {
+ TrackStop(mplayInfo, track);
+ i--;
+ track++;
+ }
+
+ mplayInfo->ident = ID_NUMBER;
+}
+
+void FadeOutBody(struct MusicPlayerInfo *mplayInfo)
+{
+ s32 i;
+ struct MusicPlayerTrack *track;
+ u16 fadeOV;
+#ifdef NONMATCHING
+ u16 mask;
+#else
+ register u16 mask asm("r2");
+#endif // NONMATCHING
+
+ if (mplayInfo->fadeOI == 0)
+ return;
+
+ mplayInfo->fadeOC--;
+ mask = 0xFFFF;
+
+ if (mplayInfo->fadeOC != 0)
+ return;
+
+ mplayInfo->fadeOC = mplayInfo->fadeOI;
+
+ if (mplayInfo->fadeOV & FADE_IN)
+ {
+ mplayInfo->fadeOV += (4 << FADE_VOL_SHIFT);
+
+ if ((u16)(mplayInfo->fadeOV & mask) >= (64 << FADE_VOL_SHIFT))
+ {
+ mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT);
+ mplayInfo->fadeOI = 0;
+ }
+ }
+ else
+ {
+ mplayInfo->fadeOV -= (4 << FADE_VOL_SHIFT);
+
+ if ((s16)(mplayInfo->fadeOV & mask) <= 0)
+ {
+ i = mplayInfo->trackCount;
+ track = mplayInfo->tracks;
+
+ while (i > 0)
+ {
+ u32 val;
+
+ TrackStop(mplayInfo, track);
+
+ val = TEMPORARY_FADE;
+ fadeOV = mplayInfo->fadeOV;
+ val &= fadeOV;
+
+ if (!val)
+ track->flags = 0;
+
+ i--;
+ track++;
+ }
+
+ if (mplayInfo->fadeOV & TEMPORARY_FADE)
+ mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE;
+ else
+ mplayInfo->status = MUSICPLAYER_STATUS_PAUSE;
+
+ mplayInfo->fadeOI = 0;
+ return;
+ }
+ }
+
+ i = mplayInfo->trackCount;
+ track = mplayInfo->tracks;
+
+ while (i > 0)
+ {
+ if (track->flags & MPT_FLG_EXIST)
+ {
+ fadeOV = mplayInfo->fadeOV;
+
+ track->volX = (fadeOV >> FADE_VOL_SHIFT);
+ track->flags |= MPT_FLG_VOLCHG;
+ }
+
+ i--;
+ track++;
+ }
+}
+
+void TrkVolPitSet(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
+{
+ if (track->flags & MPT_FLG_VOLSET)
+ {
+ s32 x;
+ s32 y;
+
+ x = (u32)(track->vol * track->volX) >> 5;
+
+ if (track->modT == 1)
+ x = (u32)(x * (track->modM + 128)) >> 7;
+
+ y = 2 * track->pan + track->panX;
+
+ if (track->modT == 2)
+ y += track->modM;
+
+ if (y < -128)
+ y = -128;
+ else if (y > 127)
+ y = 127;
+
+ track->volMR = (u32)((y + 128) * x) >> 8;
+ track->volML = (u32)((127 - y) * x) >> 8;
+ }
+
+ if (track->flags & MPT_FLG_PITSET)
+ {
+ s32 bend = track->bend * track->bendRange;
+ s32 x = (track->tune + bend)
+ * 4
+ + (track->keyShift << 8)
+ + (track->keyShiftX << 8)
+ + track->pitX;
+
+ if (track->modT == 0)
+ x += 16 * track->modM;
+
+ track->keyM = x >> 8;
+ track->pitM = x;
+ }
+
+ track->flags &= ~(MPT_FLG_PITSET | MPT_FLG_VOLSET);
+}
+
+u32 MidiKeyToCgbFreq(u8 chanNum, u8 key, u8 fineAdjust)
+{
+ if (chanNum == 4)
+ {
+ if (key <= 20)
+ {
+ key = 0;
+ }
+ else
+ {
+ key -= 21;
+ if (key > 59)
+ key = 59;
+ }
+
+ return gNoiseTable[key];
+ }
+ else
+ {
+ s32 val1;
+ s32 val2;
+
+ if (key <= 35)
+ {
+ fineAdjust = 0;
+ key = 0;
+ }
+ else
+ {
+ key -= 36;
+ if (key > 130)
+ {
+ key = 130;
+ fineAdjust = 255;
+ }
+ }
+
+ val1 = gCgbScaleTable[key];
+ val1 = gCgbFreqTable[val1 & 0xF] >> (val1 >> 4);
+
+ val2 = gCgbScaleTable[key + 1];
+ val2 = gCgbFreqTable[val2 & 0xF] >> (val2 >> 4);
+
+ return val1 + ((fineAdjust * (val2 - val1)) >> 8) + 2048;
+ }
+}
+
+void CgbOscOff(u8 chanNum)
+{
+ switch (chanNum)
+ {
+ case 1:
+ REG_NR12 = 8;
+ REG_NR14 = 0x80;
+ break;
+ case 2:
+ REG_NR22 = 8;
+ REG_NR24 = 0x80;
+ break;
+ case 3:
+ REG_NR30 = 0;
+ break;
+ default:
+ REG_NR42 = 8;
+ REG_NR44 = 0x80;
+ }
+}
+
+static inline int CgbPan(struct CgbChannel *chan)
+{
+ u32 rightVolume = chan->rightVolume;
+ u32 leftVolume = chan->leftVolume;
+
+ if ((rightVolume = (u8)rightVolume) >= (leftVolume = (u8)leftVolume))
+ {
+ if (rightVolume / 2 >= leftVolume)
+ {
+ chan->pan = 0x0F;
+ return 1;
+ }
+ }
+ else
+ {
+ if (leftVolume / 2 >= rightVolume)
+ {
+ chan->pan = 0xF0;
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+void CgbModVol(struct CgbChannel *chan)
+{
+ struct SoundInfo *soundInfo = SOUND_INFO_PTR;
+
+ if ((soundInfo->mode & 1) || !CgbPan(chan))
+ {
+ chan->pan = 0xFF;
+ chan->eg = (u32)(chan->rightVolume + chan->leftVolume) >> 4;
+ }
+ else
+ {
+ // Force chan->rightVolume and chan->leftVolume to be read from memory again,
+ // even though there is no reason to do so.
+ // The command line option "-fno-gcse" achieves the same result as this.
+ asm("" : : : "memory");
+
+ chan->eg = (u32)(chan->rightVolume + chan->leftVolume) >> 4;
+ if (chan->eg > 15)
+ chan->eg = 15;
+ }
+
+ chan->sg = (chan->eg * chan->su + 15) >> 4;
+ chan->pan &= chan->panMask;
+}
+
+void CgbSound(void)
+{
+ s32 ch;
+ struct CgbChannel *channels;
+ s32 evAdd;
+ s32 prevC15;
+ struct SoundInfo *soundInfo = SOUND_INFO_PTR;
+ vu8 *nrx0ptr;
+ vu8 *nrx1ptr;
+ vu8 *nrx2ptr;
+ vu8 *nrx3ptr;
+ vu8 *nrx4ptr;
+
+ // Most comparision operations that cast to s8 perform 'and' by 0xFF.
+ int mask = 0xff;
+
+ if (soundInfo->c15)
+ soundInfo->c15--;
+ else
+ soundInfo->c15 = 14;
+
+ for (ch = 1, channels = soundInfo->cgbChans; ch <= 4; ch++, channels++)
+ {
+ if (!(channels->sf & 0xc7))
+ continue;
+
+ switch (ch)
+ {
+ case 1:
+ nrx0ptr = (vu8 *)(REG_ADDR_NR10);
+ nrx1ptr = (vu8 *)(REG_ADDR_NR11);
+ nrx2ptr = (vu8 *)(REG_ADDR_NR12);
+ nrx3ptr = (vu8 *)(REG_ADDR_NR13);
+ nrx4ptr = (vu8 *)(REG_ADDR_NR14);
+ break;
+ case 2:
+ nrx0ptr = (vu8 *)(REG_ADDR_NR10+1);
+ nrx1ptr = (vu8 *)(REG_ADDR_NR21);
+ nrx2ptr = (vu8 *)(REG_ADDR_NR22);
+ nrx3ptr = (vu8 *)(REG_ADDR_NR23);
+ nrx4ptr = (vu8 *)(REG_ADDR_NR24);
+ break;
+ case 3:
+ nrx0ptr = (vu8 *)(REG_ADDR_NR30);
+ nrx1ptr = (vu8 *)(REG_ADDR_NR31);
+ nrx2ptr = (vu8 *)(REG_ADDR_NR32);
+ nrx3ptr = (vu8 *)(REG_ADDR_NR33);
+ nrx4ptr = (vu8 *)(REG_ADDR_NR34);
+ break;
+ default:
+ nrx0ptr = (vu8 *)(REG_ADDR_NR30+1);
+ nrx1ptr = (vu8 *)(REG_ADDR_NR41);
+ nrx2ptr = (vu8 *)(REG_ADDR_NR42);
+ nrx3ptr = (vu8 *)(REG_ADDR_NR43);
+ nrx4ptr = (vu8 *)(REG_ADDR_NR44);
+ break;
+ }
+
+ prevC15 = soundInfo->c15;
+ evAdd = *nrx2ptr;
+
+ if (channels->sf & 0x80)
+ {
+ if (!(channels->sf & 0x40))
+ {
+ channels->sf = 3;
+ channels->mo = 3;
+ CgbModVol(channels);
+ switch (ch)
+ {
+ case 1:
+ *nrx0ptr = channels->sw;
+ // fallthrough
+ case 2:
+ *nrx1ptr = ((u32)channels->wp << 6) + channels->le;
+ goto loc_82E0E30;
+ case 3:
+ if ((u32)channels->wp != channels->cp)
+ {
+ *nrx0ptr = 0x40;
+ REG_WAVE_RAM0 = channels->wp[0];
+ REG_WAVE_RAM1 = channels->wp[1];
+ REG_WAVE_RAM2 = channels->wp[2];
+ REG_WAVE_RAM3 = channels->wp[3];
+ channels->cp = (u32)channels->wp;
+ }
+ *nrx0ptr = 0;
+ *nrx1ptr = channels->le;
+ if (channels->le)
+ channels->n4 = -64;
+ else
+ channels->n4 = -128;
+ break;
+ default:
+ *nrx1ptr = channels->le;
+ *nrx3ptr = (u32)channels->wp << 3;
+ loc_82E0E30:
+ evAdd = channels->at + 8;
+ if (channels->le)
+ channels->n4 = 64;
+ else
+ channels->n4 = 0;
+ break;
+ }
+ channels->ec = channels->at;
+ if ((s8)(channels->at & mask))
+ {
+ channels->ev = 0;
+ goto EC_MINUS;
+ }
+ else
+ {
+ goto loc_82E0F96;
+ }
+ }
+ else
+ {
+ goto loc_82E0E82;
+ }
+ }
+ else if (channels->sf & 0x04)
+ {
+ channels->echoLength--;
+ if ((s8)(channels->echoLength & mask) <= 0)
+ {
+ loc_82E0E82:
+ CgbOscOff(ch);
+ channels->sf = 0;
+ goto LAST_LABEL;
+ }
+ goto loc_82E0FD6;
+ }
+ else if ((channels->sf & 0x40) && (channels->sf & 0x03))
+ {
+ channels->sf &= 0xfc;
+ channels->ec = channels->re;
+ if ((s8)(channels->re & mask))
+ {
+ channels->mo |= 1;
+ if (ch != 3)
+ {
+ evAdd = channels->re;
+ }
+ goto EC_MINUS;
+ }
+ else
+ {
+ goto loc_82E0F02;
+ }
+ }
+ else
+ {
+ loc_82E0ED0:
+ if (channels->ec == 0)
+ {
+ if (ch == 3)
+ {
+ channels->mo |= 1;
+ }
+ CgbModVol(channels);
+ if ((channels->sf & 0x3) == 0)
+ {
+ channels->ev--;
+ if ((s8)(channels->ev & mask) <= 0)
+ {
+ loc_82E0F02:
+ channels->ev = ((channels->eg * channels->echoVolume) + 0xFF) >> 8;
+ if (channels->ev)
+ {
+ channels->sf |= 0x4;
+ channels->mo |= 1;
+ if (ch != 3)
+ {
+ evAdd = 8;
+ }
+ goto loc_82E0FD6;
+ }
+ else
+ {
+ goto loc_82E0E82;
+ }
+ }
+ else
+ {
+ channels->ec = channels->re;
+ }
+ }
+ else if ((channels->sf & 0x3) == 1)
+ {
+ loc_82E0F3A:
+ channels->ev = channels->sg;
+ channels->ec = 7;
+ }
+ else if ((channels->sf & 0x3) == 2)
+ {
+ int ev, sg;
+
+ channels->ev--;
+ ev = (s8)(channels->ev & mask);
+ sg = (s8)(channels->sg);
+ if (ev <= sg)
+ {
+ loc_82E0F5A:
+ if (channels->su == 0)
+ {
+ channels->sf &= 0xfc;
+ goto loc_82E0F02;
+ }
+ else
+ {
+ channels->sf--;
+ channels->mo |= 1;
+ if (ch != 3)
+ {
+ evAdd = 8;
+ }
+ goto loc_82E0F3A;
+ }
+ }
+ else
+ {
+ channels->ec = channels->de;
+ }
+ }
+ else
+ {
+ channels->ev++;
+ if ((u8)(channels->ev & mask) >= channels->eg)
+ {
+ loc_82E0F96:
+ channels->sf--;
+ channels->ec = channels->de;
+ if ((u8)(channels->ec & mask))
+ {
+ channels->mo |= 1;
+ channels->ev = channels->eg;
+ if (ch != 3)
+ {
+ evAdd = channels->de;
+ }
+ }
+ else
+ {
+ goto loc_82E0F5A;
+ }
+ }
+ else
+ {
+ channels->ec = channels->at;
+ }
+ }
+ }
+ }
+
+ EC_MINUS:
+ channels->ec--;
+ if (prevC15 == 0)
+ {
+ prevC15--;
+ goto loc_82E0ED0;
+ }
+
+ loc_82E0FD6:
+ if (channels->mo & 0x2)
+ {
+ if (ch < 4 && (channels->ty & 0x08))
+ {
+ int biasH = REG_SOUNDBIAS_H;
+
+ if (biasH < 64)
+ {
+ channels->fr = (channels->fr + 2) & 0x7fc;
+ }
+ else if (biasH < 128)
+ {
+ channels->fr = (channels->fr + 1) & 0x7fe;
+ }
+ }
+ if (ch != 4)
+ {
+ *nrx3ptr = channels->fr;
+ }
+ else
+ {
+ *nrx3ptr = (*nrx3ptr & 0x08) | channels->fr;
+ }
+ channels->n4 = (channels->n4 & 0xC0) + (*((u8*)(&channels->fr) + 1));
+ *nrx4ptr = (s8)(channels->n4 & mask);
+ }
+
+ if (channels->mo & 1)
+ {
+ REG_NR51 = (REG_NR51 & ~channels->panMask) | channels->pan;
+ if (ch == 3)
+ {
+ *nrx2ptr = gCgb3Vol[channels->ev];
+ if (channels->n4 & 0x80)
+ {
+ *nrx0ptr = 0x80;
+ *nrx4ptr = channels->n4;
+ channels->n4 &= 0x7f;
+ }
+ }
+ else
+ {
+ evAdd &= 0xf;
+ *nrx2ptr = (channels->ev << 4) + evAdd;
+ *nrx4ptr = channels->n4 | 0x80;
+ if (ch == 1 && !(*nrx0ptr & 0x08))
+ {
+ *nrx4ptr = channels->n4 | 0x80;
+ }
+ }
+ }
+
+ LAST_LABEL:
+ channels->mo = 0;
+ }
+}
+
+void m4aMPlayTempoControl(struct MusicPlayerInfo *mplayInfo, u16 tempo)
+{
+ if (mplayInfo->ident == ID_NUMBER)
+ {
+ mplayInfo->ident++;
+ mplayInfo->tempoU = tempo;
+ mplayInfo->tempoI = (mplayInfo->tempoD * mplayInfo->tempoU) >> 8;
+ mplayInfo->ident = ID_NUMBER;
+ }
+}
+
+void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 volume)
+{
+ s32 i;
+ u32 bit;
+ struct MusicPlayerTrack *track;
+
+ if (mplayInfo->ident != ID_NUMBER)
+ return;
+
+ mplayInfo->ident++;
+
+ i = mplayInfo->trackCount;
+ track = mplayInfo->tracks;
+ bit = 1;
+
+ while (i > 0)
+ {
+ if (trackBits & bit)
+ {
+ if (track->flags & MPT_FLG_EXIST)
+ {
+ track->volX = volume / 4;
+ track->flags |= MPT_FLG_VOLCHG;
+ }
+ }
+
+ i--;
+ track++;
+ bit <<= 1;
+ }
+
+ mplayInfo->ident = ID_NUMBER;
+}
+
+void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s16 pitch)
+{
+ s32 i;
+ u32 bit;
+ struct MusicPlayerTrack *track;
+
+ if (mplayInfo->ident != ID_NUMBER)
+ return;
+
+ mplayInfo->ident++;
+
+ i = mplayInfo->trackCount;
+ track = mplayInfo->tracks;
+ bit = 1;
+
+ while (i > 0)
+ {
+ if (trackBits & bit)
+ {
+ if (track->flags & MPT_FLG_EXIST)
+ {
+ track->keyShiftX = pitch >> 8;
+ track->pitX = pitch;
+ track->flags |= MPT_FLG_PITCHG;
+ }
+ }
+
+ i--;
+ track++;
+ bit <<= 1;
+ }
+
+ mplayInfo->ident = ID_NUMBER;
+}
+
+void m4aMPlayPanpotControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s8 pan)
+{
+ s32 i;
+ u32 bit;
+ struct MusicPlayerTrack *track;
+
+ if (mplayInfo->ident != ID_NUMBER)
+ return;
+
+ mplayInfo->ident++;
+
+ i = mplayInfo->trackCount;
+ track = mplayInfo->tracks;
+ bit = 1;
+
+ while (i > 0)
+ {
+ if (trackBits & bit)
+ {
+ if (track->flags & MPT_FLG_EXIST)
+ {
+ track->panX = pan;
+ track->flags |= MPT_FLG_VOLCHG;
+ }
+ }
+
+ i--;
+ track++;
+ bit <<= 1;
+ }
+
+ mplayInfo->ident = ID_NUMBER;
+}
+
+void ClearModM(struct MusicPlayerTrack *track)
+{
+ track->lfoSpeedC = 0;
+ track->modM = 0;
+
+ if (track->modT == 0)
+ track->flags |= MPT_FLG_PITCHG;
+ else
+ track->flags |= MPT_FLG_VOLCHG;
+}
+
+void m4aMPlayModDepthSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 modDepth)
+{
+ s32 i;
+ u32 bit;
+ struct MusicPlayerTrack *track;
+
+ if (mplayInfo->ident != ID_NUMBER)
+ return;
+
+ mplayInfo->ident++;
+
+ i = mplayInfo->trackCount;
+ track = mplayInfo->tracks;
+ bit = 1;
+
+ while (i > 0)
+ {
+ if (trackBits & bit)
+ {
+ if (track->flags & MPT_FLG_EXIST)
+ {
+ track->mod = modDepth;
+
+ if (!track->mod)
+ ClearModM(track);
+ }
+ }
+
+ i--;
+ track++;
+ bit <<= 1;
+ }
+
+ mplayInfo->ident = ID_NUMBER;
+}
+
+void m4aMPlayLFOSpeedSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 lfoSpeed)
+{
+ s32 i;
+ u32 bit;
+ struct MusicPlayerTrack *track;
+
+ if (mplayInfo->ident != ID_NUMBER)
+ return;
+
+ mplayInfo->ident++;
+
+ i = mplayInfo->trackCount;
+ track = mplayInfo->tracks;
+ bit = 1;
+
+ while (i > 0)
+ {
+ if (trackBits & bit)
+ {
+ if (track->flags & MPT_FLG_EXIST)
+ {
+ track->lfoSpeed = lfoSpeed;
+
+ if (!track->lfoSpeed)
+ ClearModM(track);
+ }
+ }
+
+ i--;
+ track++;
+ bit <<= 1;
+ }
+
+ mplayInfo->ident = ID_NUMBER;
+}
+
+#define MEMACC_COND_JUMP(cond) \
+if (cond) \
+ goto cond_true; \
+else \
+ goto cond_false; \
+
+void ply_memacc(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
+{
+ u32 op;
+ u8 *addr;
+ u8 data;
+
+ op = *track->cmdPtr;
+ track->cmdPtr++;
+
+ addr = mplayInfo->memAccArea + *track->cmdPtr;
+ track->cmdPtr++;
+
+ data = *track->cmdPtr;
+ track->cmdPtr++;
+
+ switch (op)
+ {
+ case 0:
+ *addr = data;
+ return;
+ case 1:
+ *addr += data;
+ return;
+ case 2:
+ *addr -= data;
+ return;
+ case 3:
+ *addr = mplayInfo->memAccArea[data];
+ return;
+ case 4:
+ *addr += mplayInfo->memAccArea[data];
+ return;
+ case 5:
+ *addr -= mplayInfo->memAccArea[data];
+ return;
+ case 6:
+ MEMACC_COND_JUMP(*addr == data)
+ return;
+ case 7:
+ MEMACC_COND_JUMP(*addr != data)
+ return;
+ case 8:
+ MEMACC_COND_JUMP(*addr > data)
+ return;
+ case 9:
+ MEMACC_COND_JUMP(*addr >= data)
+ return;
+ case 10:
+ MEMACC_COND_JUMP(*addr <= data)
+ return;
+ case 11:
+ MEMACC_COND_JUMP(*addr < data)
+ return;
+ case 12:
+ MEMACC_COND_JUMP(*addr == mplayInfo->memAccArea[data])
+ return;
+ case 13:
+ MEMACC_COND_JUMP(*addr != mplayInfo->memAccArea[data])
+ return;
+ case 14:
+ MEMACC_COND_JUMP(*addr > mplayInfo->memAccArea[data])
+ return;
+ case 15:
+ MEMACC_COND_JUMP(*addr >= mplayInfo->memAccArea[data])
+ return;
+ case 16:
+ MEMACC_COND_JUMP(*addr <= mplayInfo->memAccArea[data])
+ return;
+ case 17:
+ MEMACC_COND_JUMP(*addr < mplayInfo->memAccArea[data])
+ return;
+ default:
+ return;
+ }
+
+cond_true:
+ {
+ void (*func)(struct MusicPlayerInfo *, struct MusicPlayerTrack *) = *(&gMPlayJumpTable[1]);
+ func(mplayInfo, track);
+ return;
+ }
+
+cond_false:
+ track->cmdPtr += 4;
+}
+
+void ply_xcmd(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
+{
+ u32 n = *track->cmdPtr;
+ track->cmdPtr++;
+
+ gXcmdTable[n](mplayInfo, track);
+}
+
+void ply_xxx(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
+{
+ void (*func)(struct MusicPlayerInfo *, struct MusicPlayerTrack *) = *(&gMPlayJumpTable[0]);
+ func(mplayInfo, track);
+}
+
+#define READ_XCMD_BYTE(var, n) \
+{ \
+ u32 byte = track->cmdPtr[(n)]; \
+ byte <<= n * 8; \
+ (var) &= ~(0xFF << (n * 8)); \
+ (var) |= byte; \
+}
+
+void ply_xwave(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
+{
+ u32 wav;
+
+ READ_XCMD_BYTE(wav, 0) // UB: uninitialized variable
+ READ_XCMD_BYTE(wav, 1)
+ READ_XCMD_BYTE(wav, 2)
+ READ_XCMD_BYTE(wav, 3)
+
+ track->tone.wav = (struct WaveData *)wav;
+ track->cmdPtr += 4;
+}
+
+void ply_xtype(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
+{
+ track->tone.type = *track->cmdPtr;
+ track->cmdPtr++;
+}
+
+void ply_xatta(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
+{
+ track->tone.attack = *track->cmdPtr;
+ track->cmdPtr++;
+}
+
+void ply_xdeca(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
+{
+ track->tone.decay = *track->cmdPtr;
+ track->cmdPtr++;
+}
+
+void ply_xsust(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
+{
+ track->tone.sustain = *track->cmdPtr;
+ track->cmdPtr++;
+}
+
+void ply_xrele(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
+{
+ track->tone.release = *track->cmdPtr;
+ track->cmdPtr++;
+}
+
+void ply_xiecv(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
+{
+ track->echoVolume = *track->cmdPtr;
+ track->cmdPtr++;
+}
+
+void ply_xiecl(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
+{
+ track->echoLength = *track->cmdPtr;
+ track->cmdPtr++;
+}
+
+void ply_xleng(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
+{
+ track->tone.length = *track->cmdPtr;
+ track->cmdPtr++;
+}
+
+void ply_xswee(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
+{
+ track->tone.pan_sweep = *track->cmdPtr;
+ track->cmdPtr++;
+}
+
+void ply_xcmd_0C(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
+{
+ u32 unk;
+
+ READ_XCMD_BYTE(unk, 0) // UB: uninitialized variable
+ READ_XCMD_BYTE(unk, 1)
+
+ if (track->unk_3A < (u16)unk)
+ {
+ track->unk_3A++;
+ track->cmdPtr -= 2;
+ track->wait = 1;
+ }
+ else
+ {
+ track->unk_3A = 0;
+ track->cmdPtr += 2;
+ }
+}
+
+void ply_xcmd_0D(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
+{
+ u32 unk;
+
+ READ_XCMD_BYTE(unk, 0) // UB: uninitialized variable
+ READ_XCMD_BYTE(unk, 1)
+ READ_XCMD_BYTE(unk, 2)
+ READ_XCMD_BYTE(unk, 3)
+
+ track->unk_3C = unk;
+ track->cmdPtr += 4;
+}
+
+void DummyFunc(void)
+{
+}
+
+struct MusicPlayerInfo *SetPokemonCryTone(struct ToneData *tone)
+{
+ u32 maxClock = 0;
+ s32 maxClockIndex = 0;
+ s32 i;
+ struct MusicPlayerInfo *mplayInfo;
+
+ for (i = 0; i < MAX_POKEMON_CRIES; i++)
+ {
+ struct MusicPlayerTrack *track = &gPokemonCryTracks[i * 2];
+
+ if (!track->flags && (!track->chan || track->chan->track != track))
+ goto start_song;
+
+ if (maxClock < gPokemonCryMusicPlayers[i].clock)
+ {
+ maxClock = gPokemonCryMusicPlayers[i].clock;
+ maxClockIndex = i;
+ }
+ }
+
+ i = maxClockIndex;
+
+start_song:
+ mplayInfo = &gPokemonCryMusicPlayers[i];
+ mplayInfo->ident++;
+
+#define CRY ((s32)&gPokemonCrySongs + i * sizeof(struct PokemonCrySong))
+#define CRY_OFS(field) offsetof(struct PokemonCrySong, field)
+
+ memcpy((void *)CRY, &gPokemonCrySong, sizeof(struct PokemonCrySong));
+
+ *(u32 *)(CRY + CRY_OFS(tone)) = (u32)tone;
+ *(u32 *)(CRY + CRY_OFS(part)) = CRY + CRY_OFS(part0);
+ *(u32 *)(CRY + CRY_OFS(part) + 4) = CRY + CRY_OFS(part1);
+ *(u32 *)(CRY + CRY_OFS(gotoTarget)) = CRY + CRY_OFS(cont);
+
+#undef CRY_OFS
+#undef CRY
+
+ mplayInfo->ident = ID_NUMBER;
+
+ MPlayStart(mplayInfo, (struct SongHeader *)(&gPokemonCrySongs[i]));
+
+ return mplayInfo;
+}
+
+void SetPokemonCryVolume(u8 val)
+{
+ gPokemonCrySong.volumeValue = val & 0x7F;
+}
+
+void SetPokemonCryPanpot(s8 val)
+{
+ gPokemonCrySong.panValue = (val + C_V) & 0x7F;
+}
+
+void SetPokemonCryPitch(s16 val)
+{
+ s16 b = val + 0x80;
+ u8 a = gPokemonCrySong.tuneValue2 - gPokemonCrySong.tuneValue;
+ gPokemonCrySong.tieKeyValue = (b >> 8) & 0x7F;
+ gPokemonCrySong.tuneValue = (b >> 1) & 0x7F;
+ gPokemonCrySong.tuneValue2 = (a + ((b >> 1) & 0x7F)) & 0x7F;
+}
+
+void SetPokemonCryLength(u16 val)
+{
+ gPokemonCrySong.unkCmd0CParam = val;
+}
+
+void SetPokemonCryRelease(u8 val)
+{
+ gPokemonCrySong.releaseValue = val;
+}
+
+void SetPokemonCryProgress(u32 val)
+{
+ gPokemonCrySong.unkCmd0DParam = val;
+}
+
+int IsPokemonCryPlaying(struct MusicPlayerInfo *mplayInfo)
+{
+ struct MusicPlayerTrack *track = mplayInfo->tracks;
+
+ if (track->chan && track->chan->track == track)
+ return 1;
+ else
+ return 0;
+}
+
+void SetPokemonCryChorus(s8 val)
+{
+ if (val)
+ {
+ gPokemonCrySong.trackCount = 2;
+ gPokemonCrySong.tuneValue2 = (val + gPokemonCrySong.tuneValue) & 0x7F;
+ }
+ else
+ {
+ gPokemonCrySong.trackCount = 1;
+ }
+}
+
+void SetPokemonCryStereo(u32 val)
+{
+ struct SoundInfo *soundInfo = SOUND_INFO_PTR;
+
+ if (val)
+ {
+ REG_SOUNDCNT_H = SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT
+ | SOUND_A_TIMER_0 | SOUND_A_RIGHT_OUTPUT
+ | SOUND_ALL_MIX_FULL;
+ soundInfo->mode &= ~1;
+ }
+ else
+ {
+ REG_SOUNDCNT_H = SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT | SOUND_B_RIGHT_OUTPUT
+ | SOUND_A_TIMER_0 | SOUND_A_LEFT_OUTPUT | SOUND_A_RIGHT_OUTPUT
+ | SOUND_B_MIX_HALF | SOUND_A_MIX_HALF | SOUND_CGB_MIX_FULL;
+ soundInfo->mode |= 1;
+ }
+}
+
+void SetPokemonCryPriority(u8 val)
+{
+ gPokemonCrySong.priority = val;
+}
diff --git a/src/m4a_2.c b/src/m4a_2.c
deleted file mode 100644
index 0625f05d1..000000000
--- a/src/m4a_2.c
+++ /dev/null
@@ -1,912 +0,0 @@
-#include "gba/m4a_internal.h"
-
-#define BSS_CODE __attribute__((section(".bss.code")))
-
-BSS_CODE ALIGNED(4) char SoundMainRAM_Buffer[0x800] = {0};
-
-struct SoundInfo gSoundInfo;
-struct PokemonCrySong gPokemonCrySongs[MAX_POKEMON_CRIES];
-struct MusicPlayerInfo gPokemonCryMusicPlayers[MAX_POKEMON_CRIES];
-void *gMPlayJumpTable[36];
-struct CgbChannel gCgbChans[4];
-struct MusicPlayerTrack gPokemonCryTracks[MAX_POKEMON_CRIES * 2];
-struct PokemonCrySong gPokemonCrySong;
-struct MusicPlayerInfo gMPlayInfo_BGM;
-struct MusicPlayerInfo gMPlayInfo_SE1;
-struct MusicPlayerInfo gMPlayInfo_SE2;
-struct MusicPlayerInfo gMPlayInfo_SE3;
-u8 gMPlayMemAccArea[0x10];
-
-u32 MidiKeyToFreq(struct WaveData *wav, u8 key, u8 fineAdjust)
-{
- u32 val1;
- u32 val2;
- u32 fineAdjustShifted = fineAdjust << 24;
-
- if (key > 178)
- {
- key = 178;
- fineAdjustShifted = 255 << 24;
- }
-
- val1 = gScaleTable[key];
- val1 = gFreqTable[val1 & 0xF] >> (val1 >> 4);
-
- val2 = gScaleTable[key + 1];
- val2 = gFreqTable[val2 & 0xF] >> (val2 >> 4);
-
- return umul3232H32(wav->freq, val1 + umul3232H32(val2 - val1, fineAdjustShifted));
-}
-
-void UnusedDummyFunc()
-{
-}
-
-void MPlayContinue(struct MusicPlayerInfo *mplayInfo)
-{
- if (mplayInfo->ident == ID_NUMBER)
- {
- mplayInfo->ident++;
- mplayInfo->status &= ~MUSICPLAYER_STATUS_PAUSE;
- mplayInfo->ident = ID_NUMBER;
- }
-}
-
-void MPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed)
-{
- if (mplayInfo->ident == ID_NUMBER)
- {
- mplayInfo->ident++;
- mplayInfo->fadeOC = speed;
- mplayInfo->fadeOI = speed;
- mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT);
- mplayInfo->ident = ID_NUMBER;
- }
-}
-
-void m4aSoundInit(void)
-{
- s32 i;
-
- CpuCopy32((void *)((s32)SoundMainRAM & ~1), SoundMainRAM_Buffer, sizeof(SoundMainRAM_Buffer));
-
- SoundInit(&gSoundInfo);
- MPlayExtender(gCgbChans);
- m4aSoundMode(SOUND_MODE_DA_BIT_8
- | SOUND_MODE_FREQ_13379
- | (12 << SOUND_MODE_MASVOL_SHIFT)
- | (5 << SOUND_MODE_MAXCHN_SHIFT));
-
- for (i = 0; i < NUM_MUSIC_PLAYERS; i++)
- {
- struct MusicPlayerInfo *mplayInfo = gMPlayTable[i].info;
- MPlayOpen(mplayInfo, gMPlayTable[i].track, gMPlayTable[i].unk_8);
- mplayInfo->unk_B = gMPlayTable[i].unk_A;
- mplayInfo->memAccArea = gMPlayMemAccArea;
- }
-
- memcpy(&gPokemonCrySong, &gPokemonCrySongTemplate, sizeof(struct PokemonCrySong));
-
- for (i = 0; i < MAX_POKEMON_CRIES; i++)
- {
- struct MusicPlayerInfo *mplayInfo = &gPokemonCryMusicPlayers[i];
- struct MusicPlayerTrack *track = &gPokemonCryTracks[i * 2];
- MPlayOpen(mplayInfo, track, 2);
- track->chan = 0;
- }
-}
-
-void m4aSoundMain(void)
-{
- SoundMain();
-}
-
-void m4aSongNumStart(u16 n)
-{
- const struct MusicPlayer *mplayTable = gMPlayTable;
- const struct Song *songTable = gSongTable;
- const struct Song *song = &songTable[n];
- const struct MusicPlayer *mplay = &mplayTable[song->ms];
-
- MPlayStart(mplay->info, song->header);
-}
-
-void m4aSongNumStartOrChange(u16 n)
-{
- const struct MusicPlayer *mplayTable = gMPlayTable;
- const struct Song *songTable = gSongTable;
- const struct Song *song = &songTable[n];
- const struct MusicPlayer *mplay = &mplayTable[song->ms];
-
- if (mplay->info->songHeader != song->header)
- {
- MPlayStart(mplay->info, song->header);
- }
- else
- {
- if ((mplay->info->status & MUSICPLAYER_STATUS_TRACK) == 0
- || (mplay->info->status & MUSICPLAYER_STATUS_PAUSE))
- {
- MPlayStart(mplay->info, song->header);
- }
- }
-}
-
-void m4aSongNumStartOrContinue(u16 n)
-{
- const struct MusicPlayer *mplayTable = gMPlayTable;
- const struct Song *songTable = gSongTable;
- const struct Song *song = &songTable[n];
- const struct MusicPlayer *mplay = &mplayTable[song->ms];
-
- if (mplay->info->songHeader != song->header)
- MPlayStart(mplay->info, song->header);
- else if ((mplay->info->status & MUSICPLAYER_STATUS_TRACK) == 0)
- MPlayStart(mplay->info, song->header);
- else if (mplay->info->status & MUSICPLAYER_STATUS_PAUSE)
- MPlayContinue(mplay->info);
-}
-
-void m4aSongNumStop(u16 n)
-{
- const struct MusicPlayer *mplayTable = gMPlayTable;
- const struct Song *songTable = gSongTable;
- const struct Song *song = &songTable[n];
- const struct MusicPlayer *mplay = &mplayTable[song->ms];
-
- if (mplay->info->songHeader == song->header)
- m4aMPlayStop(mplay->info);
-}
-
-void m4aSongNumContinue(u16 n)
-{
- const struct MusicPlayer *mplayTable = gMPlayTable;
- const struct Song *songTable = gSongTable;
- const struct Song *song = &songTable[n];
- const struct MusicPlayer *mplay = &mplayTable[song->ms];
-
- if (mplay->info->songHeader == song->header)
- MPlayContinue(mplay->info);
-}
-
-void m4aMPlayAllStop(void)
-{
- s32 i;
-
- for (i = 0; i < NUM_MUSIC_PLAYERS; i++)
- m4aMPlayStop(gMPlayTable[i].info);
-
- for (i = 0; i < MAX_POKEMON_CRIES; i++)
- m4aMPlayStop(&gPokemonCryMusicPlayers[i]);
-}
-
-void m4aMPlayContinue(struct MusicPlayerInfo *mplayInfo)
-{
- MPlayContinue(mplayInfo);
-}
-
-void m4aMPlayAllContinue(void)
-{
- s32 i;
-
- for (i = 0; i < NUM_MUSIC_PLAYERS; i++)
- MPlayContinue(gMPlayTable[i].info);
-
- for (i = 0; i < MAX_POKEMON_CRIES; i++)
- MPlayContinue(&gPokemonCryMusicPlayers[i]);
-}
-
-void m4aMPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed)
-{
- MPlayFadeOut(mplayInfo, speed);
-}
-
-void m4aMPlayFadeOutTemporarily(struct MusicPlayerInfo *mplayInfo, u16 speed)
-{
- if (mplayInfo->ident == ID_NUMBER)
- {
- mplayInfo->ident++;
- mplayInfo->fadeOC = speed;
- mplayInfo->fadeOI = speed;
- mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT) | TEMPORARY_FADE;
- mplayInfo->ident = ID_NUMBER;
- }
-}
-
-void m4aMPlayFadeIn(struct MusicPlayerInfo *mplayInfo, u16 speed)
-{
- if (mplayInfo->ident == ID_NUMBER)
- {
- mplayInfo->ident++;
- mplayInfo->fadeOC = speed;
- mplayInfo->fadeOI = speed;
- mplayInfo->fadeOV = (0 << FADE_VOL_SHIFT) | FADE_IN;
- mplayInfo->status &= ~MUSICPLAYER_STATUS_PAUSE;
- mplayInfo->ident = ID_NUMBER;
- }
-}
-
-void m4aMPlayImmInit(struct MusicPlayerInfo *mplayInfo)
-{
- s32 trackCount = mplayInfo->trackCount;
- struct MusicPlayerTrack *track = mplayInfo->tracks;
-
- while (trackCount > 0)
- {
- if (track->flags & MPT_FLG_EXIST)
- {
- if (track->flags & MPT_FLG_START)
- {
- Clear64byte(track);
- track->flags = MPT_FLG_EXIST;
- track->bendRange = 2;
- track->volX = 64;
- track->lfoSpeed = 22;
- track->tone.type = 1;
- }
- }
-
- trackCount--;
- track++;
- }
-}
-
-void MPlayExtender(struct CgbChannel *cgbChans)
-{
- struct SoundInfo *soundInfo;
- u32 ident;
-
- REG_SOUNDCNT_X = SOUND_MASTER_ENABLE
- | SOUND_4_ON
- | SOUND_3_ON
- | SOUND_2_ON
- | SOUND_1_ON;
- REG_SOUNDCNT_L = 0; // set master volume to zero
- REG_NR12 = 0x8;
- REG_NR22 = 0x8;
- REG_NR42 = 0x8;
- REG_NR14 = 0x80;
- REG_NR24 = 0x80;
- REG_NR44 = 0x80;
- REG_NR30 = 0;
- REG_NR50 = 0x77;
-
- soundInfo = SOUND_INFO_PTR;
-
- ident = soundInfo->ident;
-
- if (ident != ID_NUMBER)
- return;
-
- soundInfo->ident++;
-
- gMPlayJumpTable[8] = ply_memacc;
- gMPlayJumpTable[17] = ply_lfos;
- gMPlayJumpTable[19] = ply_mod;
- gMPlayJumpTable[28] = ply_xcmd;
- gMPlayJumpTable[29] = ply_endtie;
- gMPlayJumpTable[30] = SampleFreqSet;
- gMPlayJumpTable[31] = TrackStop;
- gMPlayJumpTable[32] = FadeOutBody;
- gMPlayJumpTable[33] = TrkVolPitSet;
-
- soundInfo->cgbChans = (struct CgbChannel *)cgbChans;
- soundInfo->CgbSound = CgbSound;
- soundInfo->CgbOscOff = CgbOscOff;
- soundInfo->MidiKeyToCgbFreq = MidiKeyToCgbFreq;
- soundInfo->maxLines = MAX_LINES;
-
- CpuFill32(0, cgbChans, sizeof(struct CgbChannel) * 4);
-
- cgbChans[0].ty = 1;
- cgbChans[0].panMask = 0x11;
- cgbChans[1].ty = 2;
- cgbChans[1].panMask = 0x22;
- cgbChans[2].ty = 3;
- cgbChans[2].panMask = 0x44;
- cgbChans[3].ty = 4;
- cgbChans[3].panMask = 0x88;
-
- soundInfo->ident = ident;
-}
-
-void MusicPlayerJumpTableCopy(void)
-{
- asm("swi 0x2A");
-}
-
-void ClearChain(void *x)
-{
- void (*func)(void *) = *(&gMPlayJumpTable[34]);
- func(x);
-}
-
-void Clear64byte(void *x)
-{
- void (*func)(void *) = *(&gMPlayJumpTable[35]);
- func(x);
-}
-
-void SoundInit(struct SoundInfo *soundInfo)
-{
- soundInfo->ident = 0;
-
- if (REG_DMA1CNT & (DMA_REPEAT << 16))
- REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4;
-
- if (REG_DMA2CNT & (DMA_REPEAT << 16))
- REG_DMA2CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4;
-
- REG_DMA1CNT_H = DMA_32BIT;
- REG_DMA2CNT_H = DMA_32BIT;
- REG_SOUNDCNT_X = SOUND_MASTER_ENABLE
- | SOUND_4_ON
- | SOUND_3_ON
- | SOUND_2_ON
- | SOUND_1_ON;
- REG_SOUNDCNT_H = SOUND_B_FIFO_RESET | SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT
- | SOUND_A_FIFO_RESET | SOUND_A_TIMER_0 | SOUND_A_RIGHT_OUTPUT
- | SOUND_ALL_MIX_FULL;
- REG_SOUNDBIAS_H = (REG_SOUNDBIAS_H & 0x3F) | 0x40;
-
- REG_DMA1SAD = (s32)soundInfo->pcmBuffer;
- REG_DMA1DAD = (s32)&REG_FIFO_A;
- REG_DMA2SAD = (s32)soundInfo->pcmBuffer + PCM_DMA_BUF_SIZE;
- REG_DMA2DAD = (s32)&REG_FIFO_B;
-
- SOUND_INFO_PTR = soundInfo;
- CpuFill32(0, soundInfo, sizeof(struct SoundInfo));
-
- soundInfo->maxChans = 8;
- soundInfo->masterVolume = 15;
- soundInfo->plynote = (u32)ply_note;
- soundInfo->CgbSound = DummyFunc;
- soundInfo->CgbOscOff = (void (*)(u8))DummyFunc;
- soundInfo->MidiKeyToCgbFreq = (u32 (*)(u8, u8, u8))DummyFunc;
- soundInfo->ExtVolPit = (u32)DummyFunc;
-
- MPlayJumpTableCopy(gMPlayJumpTable);
-
- soundInfo->MPlayJumpTable = (u32)gMPlayJumpTable;
-
- SampleFreqSet(SOUND_MODE_FREQ_13379);
-
- soundInfo->ident = ID_NUMBER;
-}
-
-void SampleFreqSet(u32 freq)
-{
- struct SoundInfo *soundInfo = SOUND_INFO_PTR;
-
- freq = (freq & 0xF0000) >> 16;
- soundInfo->freq = freq;
- soundInfo->pcmSamplesPerVBlank = gPcmSamplesPerVBlankTable[freq - 1];
- soundInfo->pcmDmaPeriod = PCM_DMA_BUF_SIZE / soundInfo->pcmSamplesPerVBlank;
-
- // LCD refresh rate 59.7275Hz
- soundInfo->pcmFreq = (597275 * soundInfo->pcmSamplesPerVBlank + 5000) / 10000;
-
- // CPU frequency 16.78Mhz
- soundInfo->divFreq = (16777216 / soundInfo->pcmFreq + 1) >> 1;
-
- // Turn off timer 0.
- REG_TM0CNT_H = 0;
-
- // cycles per LCD fresh 280896
- REG_TM0CNT_L = -(280896 / soundInfo->pcmSamplesPerVBlank);
-
- m4aSoundVSyncOn();
-
- while (*(vu8 *)REG_ADDR_VCOUNT == 159)
- ;
-
- while (*(vu8 *)REG_ADDR_VCOUNT != 159)
- ;
-
- REG_TM0CNT_H = TIMER_ENABLE | TIMER_1CLK;
-}
-
-void m4aSoundMode(u32 mode)
-{
- struct SoundInfo *soundInfo = SOUND_INFO_PTR;
- u32 temp;
-
- if (soundInfo->ident != ID_NUMBER)
- return;
-
- soundInfo->ident++;
-
- temp = mode & (SOUND_MODE_REVERB_SET | SOUND_MODE_REVERB_VAL);
-
- if (temp)
- soundInfo->reverb = temp & SOUND_MODE_REVERB_VAL;
-
- temp = mode & SOUND_MODE_MAXCHN;
-
- if (temp)
- {
- struct SoundChannel *chan;
-
- soundInfo->maxChans = temp >> SOUND_MODE_MAXCHN_SHIFT;
-
- temp = MAX_DIRECTSOUND_CHANNELS;
- chan = &soundInfo->chans[0];
-
- while (temp != 0)
- {
- chan->status = 0;
- temp--;
- chan++;
- }
- }
-
- temp = mode & SOUND_MODE_MASVOL;
-
- if (temp)
- soundInfo->masterVolume = temp >> SOUND_MODE_MASVOL_SHIFT;
-
- temp = mode & SOUND_MODE_DA_BIT;
-
- if (temp)
- {
- temp = (temp & 0x300000) >> 14;
- REG_SOUNDBIAS_H = (REG_SOUNDBIAS_H & 0x3F) | temp;
- }
-
- temp = mode & SOUND_MODE_FREQ;
-
- if (temp)
- {
- m4aSoundVSyncOff();
- SampleFreqSet(temp);
- }
-
- soundInfo->ident = ID_NUMBER;
-}
-
-void SoundClear(void)
-{
- struct SoundInfo *soundInfo = SOUND_INFO_PTR;
- s32 i;
- void *chan;
-
- if (soundInfo->ident != ID_NUMBER)
- return;
-
- soundInfo->ident++;
-
- i = MAX_DIRECTSOUND_CHANNELS;
- chan = &soundInfo->chans[0];
-
- while (i > 0)
- {
- ((struct SoundChannel *)chan)->status = 0;
- i--;
- chan = (void *)((s32)chan + sizeof(struct SoundChannel));
- }
-
- chan = soundInfo->cgbChans;
-
- if (chan)
- {
- i = 1;
-
- while (i <= 4)
- {
- soundInfo->CgbOscOff(i);
- ((struct CgbChannel *)chan)->sf = 0;
- i++;
- chan = (void *)((s32)chan + sizeof(struct CgbChannel));
- }
- }
-
- soundInfo->ident = ID_NUMBER;
-}
-
-void m4aSoundVSyncOff(void)
-{
- struct SoundInfo *soundInfo = SOUND_INFO_PTR;
-
- if (soundInfo->ident >= ID_NUMBER && soundInfo->ident <= ID_NUMBER + 1)
- {
- soundInfo->ident += 10;
-
- if (REG_DMA1CNT & (DMA_REPEAT << 16))
- REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4;
-
- if (REG_DMA2CNT & (DMA_REPEAT << 16))
- REG_DMA2CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4;
-
- REG_DMA1CNT_H = DMA_32BIT;
- REG_DMA2CNT_H = DMA_32BIT;
-
- CpuFill32(0, soundInfo->pcmBuffer, sizeof(soundInfo->pcmBuffer));
- }
-}
-
-void m4aSoundVSyncOn(void)
-{
- struct SoundInfo *soundInfo = SOUND_INFO_PTR;
- u32 ident = soundInfo->ident;
-
- if (ident == ID_NUMBER)
- return;
-
- REG_DMA1CNT_H = DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT;
- REG_DMA2CNT_H = DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT;
-
- soundInfo->pcmDmaCounter = 0;
- soundInfo->ident = ident - 10;
-}
-
-void MPlayOpen(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *tracks, u8 trackCount)
-{
- struct SoundInfo *soundInfo;
-
- if (trackCount == 0)
- return;
-
- if (trackCount > MAX_MUSICPLAYER_TRACKS)
- trackCount = MAX_MUSICPLAYER_TRACKS;
-
- soundInfo = SOUND_INFO_PTR;
-
- if (soundInfo->ident != ID_NUMBER)
- return;
-
- soundInfo->ident++;
-
- Clear64byte(mplayInfo);
-
- mplayInfo->tracks = tracks;
- mplayInfo->trackCount = trackCount;
- mplayInfo->status = MUSICPLAYER_STATUS_PAUSE;
-
- while (trackCount != 0)
- {
- tracks->flags = 0;
- trackCount--;
- tracks++;
- }
-
- if (soundInfo->func != 0)
- {
- mplayInfo->func = soundInfo->func;
- mplayInfo->intp = soundInfo->intp;
- soundInfo->func = 0;
- }
-
- soundInfo->intp = (u32)mplayInfo;
- soundInfo->func = (u32)MPlayMain;
- soundInfo->ident = ID_NUMBER;
- mplayInfo->ident = ID_NUMBER;
-}
-
-void MPlayStart(struct MusicPlayerInfo *mplayInfo, struct SongHeader *songHeader)
-{
- s32 i;
- u8 unk_B;
- struct MusicPlayerTrack *track;
-
- if (mplayInfo->ident != ID_NUMBER)
- return;
-
- unk_B = mplayInfo->unk_B;
-
- if (!unk_B
- || ((!mplayInfo->songHeader || !(mplayInfo->tracks[0].flags & MPT_FLG_START))
- && ((mplayInfo->status & MUSICPLAYER_STATUS_TRACK) == 0
- || (mplayInfo->status & MUSICPLAYER_STATUS_PAUSE)))
- || (mplayInfo->priority <= songHeader->priority))
- {
- mplayInfo->ident++;
- mplayInfo->status = 0;
- mplayInfo->songHeader = songHeader;
- mplayInfo->tone = songHeader->tone;
- mplayInfo->priority = songHeader->priority;
- mplayInfo->clock = 0;
- mplayInfo->tempoD = 150;
- mplayInfo->tempoI = 150;
- mplayInfo->tempoU = 0x100;
- mplayInfo->tempoC = 0;
- mplayInfo->fadeOI = 0;
-
- i = 0;
- track = mplayInfo->tracks;
-
- while (i < songHeader->trackCount && i < mplayInfo->trackCount)
- {
- TrackStop(mplayInfo, track);
- track->flags = MPT_FLG_EXIST | MPT_FLG_START;
- track->chan = 0;
- track->cmdPtr = songHeader->part[i];
- i++;
- track++;
- }
-
- while (i < mplayInfo->trackCount)
- {
- TrackStop(mplayInfo, track);
- track->flags = 0;
- i++;
- track++;
- }
-
- if (songHeader->reverb & 0x80)
- m4aSoundMode(songHeader->reverb);
-
- mplayInfo->ident = ID_NUMBER;
- }
-}
-
-void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo)
-{
- s32 i;
- struct MusicPlayerTrack *track;
-
- if (mplayInfo->ident != ID_NUMBER)
- return;
-
- mplayInfo->ident++;
- mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE;
-
- i = mplayInfo->trackCount;
- track = mplayInfo->tracks;
-
- while (i > 0)
- {
- TrackStop(mplayInfo, track);
- i--;
- track++;
- }
-
- mplayInfo->ident = ID_NUMBER;
-}
-
-void FadeOutBody(struct MusicPlayerInfo *mplayInfo)
-{
- s32 i;
- struct MusicPlayerTrack *track;
- u16 fadeOI = mplayInfo->fadeOI;
- register u32 temp asm("r3");
- register u16 mask asm("r2");
-
- if (fadeOI == 0)
- return;
-
- mplayInfo->fadeOC--;
-
- temp = 0xFFFF;
- mask = temp;
-
- if (mplayInfo->fadeOC != 0)
- return;
-
- mplayInfo->fadeOC = fadeOI;
-
- if (mplayInfo->fadeOV & FADE_IN)
- {
- mplayInfo->fadeOV += (4 << FADE_VOL_SHIFT);
-
- if ((u16)(mplayInfo->fadeOV & mask) >= (64 << FADE_VOL_SHIFT))
- {
- mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT);
- mplayInfo->fadeOI = 0;
- }
- }
- else
- {
- mplayInfo->fadeOV -= (4 << FADE_VOL_SHIFT);
-
- if ((s16)(mplayInfo->fadeOV & mask) <= 0)
- {
- i = mplayInfo->trackCount;
- track = mplayInfo->tracks;
-
- while (i > 0)
- {
- register u32 fadeOV asm("r7");
- u32 val;
-
- TrackStop(mplayInfo, track);
-
- val = TEMPORARY_FADE;
- fadeOV = mplayInfo->fadeOV;
- val &= fadeOV;
-
- if (!val)
- track->flags = 0;
-
- i--;
- track++;
- }
-
- if (mplayInfo->fadeOV & TEMPORARY_FADE)
- mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE;
- else
- mplayInfo->status = MUSICPLAYER_STATUS_PAUSE;
-
- mplayInfo->fadeOI = 0;
- return;
- }
- }
-
- i = mplayInfo->trackCount;
- track = mplayInfo->tracks;
-
- while (i > 0)
- {
- if (track->flags & MPT_FLG_EXIST)
- {
- track->volX = (mplayInfo->fadeOV >> FADE_VOL_SHIFT);
- track->flags |= MPT_FLG_VOLCHG;
- }
-
- i--;
- track++;
- }
-}
-
-void TrkVolPitSet(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
-{
- if (track->flags & MPT_FLG_VOLSET)
- {
- s32 x;
- s32 y;
-
- x = (u32)(track->vol * track->volX) >> 5;
-
- if (track->modT == 1)
- x = (u32)(x * (track->modM + 128)) >> 7;
-
- y = 2 * track->pan + track->panX;
-
- if (track->modT == 2)
- y += track->modM;
-
- if (y < -128)
- y = -128;
- else if (y > 127)
- y = 127;
-
- track->volMR = (u32)((y + 128) * x) >> 8;
- track->volML = (u32)((127 - y) * x) >> 8;
- }
-
- if (track->flags & MPT_FLG_PITSET)
- {
- s32 bend = track->bend * track->bendRange;
- register s32 x asm("r1") = track->tune;
- x += bend;
- x *= 4;
- x += (track->keyShift << 8);
- x += (track->keyShiftX << 8);
- x += track->pitX;
-
- if (track->modT == 0)
- x += 16 * track->modM;
-
- track->keyM = x >> 8;
- track->pitM = x;
- }
-
- track->flags &= ~(MPT_FLG_PITSET | MPT_FLG_VOLSET);
-}
-
-u32 MidiKeyToCgbFreq(u8 chanNum, u8 key, u8 fineAdjust)
-{
- if (chanNum == 4)
- {
- if (key <= 20)
- {
- key = 0;
- }
- else
- {
- key -= 21;
- if (key > 59)
- key = 59;
- }
-
- return gNoiseTable[key];
- }
- else
- {
- s32 val1;
- s32 val2;
-
- if (key <= 35)
- {
- fineAdjust = 0;
- key = 0;
- }
- else
- {
- key -= 36;
- if (key > 130)
- {
- key = 130;
- fineAdjust = 255;
- }
- }
-
- val1 = gCgbScaleTable[key];
- val1 = gCgbFreqTable[val1 & 0xF] >> (val1 >> 4);
-
- val2 = gCgbScaleTable[key + 1];
- val2 = gCgbFreqTable[val2 & 0xF] >> (val2 >> 4);
-
- return val1 + ((fineAdjust * (val2 - val1)) >> 8) + 2048;
- }
-}
-
-void CgbOscOff(u8 chanNum)
-{
- switch (chanNum)
- {
- case 1:
- REG_NR12 = 8;
- REG_NR14 = 0x80;
- break;
- case 2:
- REG_NR22 = 8;
- REG_NR24 = 0x80;
- break;
- case 3:
- REG_NR30 = 0;
- break;
- default:
- REG_NR42 = 8;
- REG_NR44 = 0x80;
- }
-}
-
-static inline int CgbPan(struct CgbChannel *chan)
-{
- u32 rightVolume = chan->rightVolume;
- u32 leftVolume = chan->leftVolume;
-
- if ((rightVolume = (u8)rightVolume) >= (leftVolume = (u8)leftVolume))
- {
- if (rightVolume / 2 >= leftVolume)
- {
- chan->pan = 0x0F;
- return 1;
- }
- }
- else
- {
- if (leftVolume / 2 >= rightVolume)
- {
- chan->pan = 0xF0;
- return 1;
- }
- }
-
- return 0;
-}
-
-void CgbModVol(struct CgbChannel *chan)
-{
- struct SoundInfo *soundInfo = SOUND_INFO_PTR;
-
- if ((soundInfo->mode & 1) || !CgbPan(chan))
- {
- chan->pan = 0xFF;
- chan->eg = (u32)(chan->rightVolume + chan->leftVolume) >> 4;
- }
- else
- {
- // Force chan->rightVolume and chan->leftVolume to be read from memory again,
- // even though there is no reason to do so.
- // The command line option "-fno-gcse" achieves the same result as this.
- asm("" : : : "memory");
-
- chan->eg = (u32)(chan->rightVolume + chan->leftVolume) >> 4;
- if (chan->eg > 15)
- chan->eg = 15;
- }
-
- chan->sg = (chan->eg * chan->su + 15) >> 4;
- chan->pan &= chan->panMask;
-}
diff --git a/src/m4a_4.c b/src/m4a_4.c
deleted file mode 100644
index 2e1d140b4..000000000
--- a/src/m4a_4.c
+++ /dev/null
@@ -1,545 +0,0 @@
-#include "gba/m4a_internal.h"
-
-void m4aMPlayTempoControl(struct MusicPlayerInfo *mplayInfo, u16 tempo)
-{
- if (mplayInfo->ident == ID_NUMBER)
- {
- mplayInfo->ident++;
- mplayInfo->tempoU = tempo;
- mplayInfo->tempoI = (mplayInfo->tempoD * mplayInfo->tempoU) >> 8;
- mplayInfo->ident = ID_NUMBER;
- }
-}
-
-void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 volume)
-{
- s32 i;
- u32 bit;
- struct MusicPlayerTrack *track;
-
- if (mplayInfo->ident != ID_NUMBER)
- return;
-
- mplayInfo->ident++;
-
- i = mplayInfo->trackCount;
- track = mplayInfo->tracks;
- bit = 1;
-
- while (i > 0)
- {
- if (trackBits & bit)
- {
- if (track->flags & MPT_FLG_EXIST)
- {
- track->volX = volume / 4;
- track->flags |= MPT_FLG_VOLCHG;
- }
- }
-
- i--;
- track++;
- bit <<= 1;
- }
-
- mplayInfo->ident = ID_NUMBER;
-}
-
-void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s16 pitch)
-{
- s32 i;
- u32 bit;
- struct MusicPlayerTrack *track;
-
- if (mplayInfo->ident != ID_NUMBER)
- return;
-
- mplayInfo->ident++;
-
- i = mplayInfo->trackCount;
- track = mplayInfo->tracks;
- bit = 1;
-
- while (i > 0)
- {
- if (trackBits & bit)
- {
- if (track->flags & MPT_FLG_EXIST)
- {
- track->keyShiftX = (s16)pitch >> 8;
- track->pitX = pitch;
- track->flags |= MPT_FLG_PITCHG;
- }
- }
-
- i--;
- track++;
- bit <<= 1;
- }
-
- mplayInfo->ident = ID_NUMBER;
-}
-
-void m4aMPlayPanpotControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s8 pan)
-{
- s32 i;
- u32 bit;
- struct MusicPlayerTrack *track;
-
- if (mplayInfo->ident != ID_NUMBER)
- return;
-
- mplayInfo->ident++;
-
- i = mplayInfo->trackCount;
- track = mplayInfo->tracks;
- bit = 1;
-
- while (i > 0)
- {
- if (trackBits & bit)
- {
- if (track->flags & MPT_FLG_EXIST)
- {
- track->panX = pan;
- track->flags |= MPT_FLG_VOLCHG;
- }
- }
-
- i--;
- track++;
- bit <<= 1;
- }
-
- mplayInfo->ident = ID_NUMBER;
-}
-
-void ClearModM(struct MusicPlayerTrack *track)
-{
- track->lfoSpeedC = 0;
- track->modM = 0;
-
- if (track->modT == 0)
- track->flags |= MPT_FLG_PITCHG;
- else
- track->flags |= MPT_FLG_VOLCHG;
-}
-
-void m4aMPlayModDepthSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 modDepth)
-{
- s32 i;
- u32 bit;
- struct MusicPlayerTrack *track;
-
- if (mplayInfo->ident != ID_NUMBER)
- return;
-
- mplayInfo->ident++;
-
- i = mplayInfo->trackCount;
- track = mplayInfo->tracks;
- bit = 1;
-
- while (i > 0)
- {
- if (trackBits & bit)
- {
- if (track->flags & MPT_FLG_EXIST)
- {
- track->mod = modDepth;
-
- if (!track->mod)
- ClearModM(track);
- }
- }
-
- i--;
- track++;
- bit <<= 1;
- }
-
- mplayInfo->ident = ID_NUMBER;
-}
-
-void m4aMPlayLFOSpeedSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 lfoSpeed)
-{
- s32 i;
- u32 bit;
- struct MusicPlayerTrack *track;
-
- if (mplayInfo->ident != ID_NUMBER)
- return;
-
- mplayInfo->ident++;
-
- i = mplayInfo->trackCount;
- track = mplayInfo->tracks;
- bit = 1;
-
- while (i > 0)
- {
- if (trackBits & bit)
- {
- if (track->flags & MPT_FLG_EXIST)
- {
- track->lfoSpeed = lfoSpeed;
-
- if (!track->lfoSpeed)
- ClearModM(track);
- }
- }
-
- i--;
- track++;
- bit <<= 1;
- }
-
- mplayInfo->ident = ID_NUMBER;
-}
-
-#define MEMACC_COND_JUMP(cond) \
-if (cond) \
- goto cond_true; \
-else \
- goto cond_false; \
-
-void ply_memacc(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
-{
- u32 op;
- u8 *addr;
- u8 data;
-
- op = *track->cmdPtr;
- track->cmdPtr++;
-
- addr = mplayInfo->memAccArea + *track->cmdPtr;
- track->cmdPtr++;
-
- data = *track->cmdPtr;
- track->cmdPtr++;
-
- switch (op)
- {
- case 0:
- *addr = data;
- return;
- case 1:
- *addr += data;
- return;
- case 2:
- *addr -= data;
- return;
- case 3:
- *addr = mplayInfo->memAccArea[data];
- return;
- case 4:
- *addr += mplayInfo->memAccArea[data];
- return;
- case 5:
- *addr -= mplayInfo->memAccArea[data];
- return;
- case 6:
- MEMACC_COND_JUMP(*addr == data)
- return;
- case 7:
- MEMACC_COND_JUMP(*addr != data)
- return;
- case 8:
- MEMACC_COND_JUMP(*addr > data)
- return;
- case 9:
- MEMACC_COND_JUMP(*addr >= data)
- return;
- case 10:
- MEMACC_COND_JUMP(*addr <= data)
- return;
- case 11:
- MEMACC_COND_JUMP(*addr < data)
- return;
- case 12:
- MEMACC_COND_JUMP(*addr == mplayInfo->memAccArea[data])
- return;
- case 13:
- MEMACC_COND_JUMP(*addr != mplayInfo->memAccArea[data])
- return;
- case 14:
- MEMACC_COND_JUMP(*addr > mplayInfo->memAccArea[data])
- return;
- case 15:
- MEMACC_COND_JUMP(*addr >= mplayInfo->memAccArea[data])
- return;
- case 16:
- MEMACC_COND_JUMP(*addr <= mplayInfo->memAccArea[data])
- return;
- case 17:
- MEMACC_COND_JUMP(*addr < mplayInfo->memAccArea[data])
- return;
- default:
- return;
- }
-
-cond_true:
- {
- void (*func)(struct MusicPlayerInfo *, struct MusicPlayerTrack *) = *(&gMPlayJumpTable[1]);
- func(mplayInfo, track);
- return;
- }
-
-cond_false:
- track->cmdPtr += 4;
-}
-
-void ply_xcmd(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
-{
- u32 n = *track->cmdPtr;
- track->cmdPtr++;
-
- gXcmdTable[n](mplayInfo, track);
-}
-
-void ply_xxx(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
-{
- void (*func)(struct MusicPlayerInfo *, struct MusicPlayerTrack *) = *(&gMPlayJumpTable[0]);
- func(mplayInfo, track);
-}
-
-#define READ_XCMD_BYTE(var, n) \
-{ \
- u32 byte = track->cmdPtr[(n)]; \
- byte <<= n * 8; \
- (var) &= ~(0xFF << (n * 8)); \
- (var) |= byte; \
-}
-
-void ply_xwave(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
-{
- u32 wav;
-
- READ_XCMD_BYTE(wav, 0) // UB: uninitialized variable
- READ_XCMD_BYTE(wav, 1)
- READ_XCMD_BYTE(wav, 2)
- READ_XCMD_BYTE(wav, 3)
-
- track->tone.wav = (struct WaveData *)wav;
- track->cmdPtr += 4;
-}
-
-void ply_xtype(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
-{
- track->tone.type = *track->cmdPtr;
- track->cmdPtr++;
-}
-
-void ply_xatta(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
-{
- track->tone.attack = *track->cmdPtr;
- track->cmdPtr++;
-}
-
-void ply_xdeca(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
-{
- track->tone.decay = *track->cmdPtr;
- track->cmdPtr++;
-}
-
-void ply_xsust(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
-{
- track->tone.sustain = *track->cmdPtr;
- track->cmdPtr++;
-}
-
-void ply_xrele(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
-{
- track->tone.release = *track->cmdPtr;
- track->cmdPtr++;
-}
-
-void ply_xiecv(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
-{
- track->echoVolume = *track->cmdPtr;
- track->cmdPtr++;
-}
-
-void ply_xiecl(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
-{
- track->echoLength = *track->cmdPtr;
- track->cmdPtr++;
-}
-
-void ply_xleng(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
-{
- track->tone.length = *track->cmdPtr;
- track->cmdPtr++;
-}
-
-void ply_xswee(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
-{
- track->tone.pan_sweep = *track->cmdPtr;
- track->cmdPtr++;
-}
-
-void ply_xcmd_0C(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
-{
- u32 unk;
-
- READ_XCMD_BYTE(unk, 0) // UB: uninitialized variable
- READ_XCMD_BYTE(unk, 1)
-
- if (track->unk_3A < (u16)unk)
- {
- track->unk_3A++;
- track->cmdPtr -= 2;
- track->wait = 1;
- }
- else
- {
- track->unk_3A = 0;
- track->cmdPtr += 2;
- }
-}
-
-void ply_xcmd_0D(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
-{
- u32 unk;
-
- READ_XCMD_BYTE(unk, 0) // UB: uninitialized variable
- READ_XCMD_BYTE(unk, 1)
- READ_XCMD_BYTE(unk, 2)
- READ_XCMD_BYTE(unk, 3)
-
- track->unk_3C = unk;
- track->cmdPtr += 4;
-}
-
-void DummyFunc(void)
-{
-}
-
-struct MusicPlayerInfo *SetPokemonCryTone(struct ToneData *tone)
-{
- u32 maxClock = 0;
- s32 maxClockIndex = 0;
- s32 i;
- struct MusicPlayerInfo *mplayInfo;
-
- for (i = 0; i < MAX_POKEMON_CRIES; i++)
- {
- struct MusicPlayerTrack *track = &gPokemonCryTracks[i * 2];
-
- if (!track->flags && (!track->chan || track->chan->track != track))
- goto start_song;
-
- if (maxClock < gPokemonCryMusicPlayers[i].clock)
- {
- maxClock = gPokemonCryMusicPlayers[i].clock;
- maxClockIndex = i;
- }
- }
-
- i = maxClockIndex;
-
-start_song:
- mplayInfo = &gPokemonCryMusicPlayers[i];
- mplayInfo->ident++;
-
-#define CRY ((s32)&gPokemonCrySongs + i * sizeof(struct PokemonCrySong))
-#define CRY_OFS(field) offsetof(struct PokemonCrySong, field)
-
- memcpy((void *)CRY, &gPokemonCrySong, sizeof(struct PokemonCrySong));
-
- *(u32 *)(CRY + CRY_OFS(tone)) = (u32)tone;
- *(u32 *)(CRY + CRY_OFS(part)) = CRY + CRY_OFS(part0);
- *(u32 *)(CRY + CRY_OFS(part) + 4) = CRY + CRY_OFS(part1);
- *(u32 *)(CRY + CRY_OFS(gotoTarget)) = CRY + CRY_OFS(cont);
-
-#undef CRY_OFS
-#undef CRY
-
- mplayInfo->ident = ID_NUMBER;
-
- MPlayStart(mplayInfo, (struct SongHeader *)(&gPokemonCrySongs[i]));
-
- return mplayInfo;
-}
-
-void SetPokemonCryVolume(u8 val)
-{
- gPokemonCrySong.volumeValue = val & 0x7F;
-}
-
-void SetPokemonCryPanpot(s8 val)
-{
- gPokemonCrySong.panValue = (val + C_V) & 0x7F;
-}
-
-void SetPokemonCryPitch(s16 val)
-{
- s16 b = val + 0x80;
- u8 a = gPokemonCrySong.tuneValue2 - gPokemonCrySong.tuneValue;
- gPokemonCrySong.tieKeyValue = (b >> 8) & 0x7F;
- gPokemonCrySong.tuneValue = (b >> 1) & 0x7F;
- gPokemonCrySong.tuneValue2 = (a + ((b >> 1) & 0x7F)) & 0x7F;
-}
-
-void SetPokemonCryLength(u16 val)
-{
- gPokemonCrySong.unkCmd0CParam = val;
-}
-
-void SetPokemonCryRelease(u8 val)
-{
- gPokemonCrySong.releaseValue = val;
-}
-
-void SetPokemonCryProgress(u32 val)
-{
- gPokemonCrySong.unkCmd0DParam = val;
-}
-
-int IsPokemonCryPlaying(struct MusicPlayerInfo *mplayInfo)
-{
- struct MusicPlayerTrack *track = mplayInfo->tracks;
-
- if (track->chan && track->chan->track == track)
- return 1;
- else
- return 0;
-}
-
-void SetPokemonCryChorus(s8 val)
-{
- if (val)
- {
- gPokemonCrySong.trackCount = 2;
- gPokemonCrySong.tuneValue2 = (val + gPokemonCrySong.tuneValue) & 0x7F;
- }
- else
- {
- gPokemonCrySong.trackCount = 1;
- }
-}
-
-void SetPokemonCryStereo(u32 val)
-{
- struct SoundInfo *soundInfo = SOUND_INFO_PTR;
-
- if (val)
- {
- REG_SOUNDCNT_H = SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT
- | SOUND_A_TIMER_0 | SOUND_A_RIGHT_OUTPUT
- | SOUND_ALL_MIX_FULL;
- soundInfo->mode &= ~1;
- }
- else
- {
- REG_SOUNDCNT_H = SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT | SOUND_B_RIGHT_OUTPUT
- | SOUND_A_TIMER_0 | SOUND_A_LEFT_OUTPUT | SOUND_A_RIGHT_OUTPUT
- | SOUND_B_MIX_HALF | SOUND_A_MIX_HALF | SOUND_CGB_MIX_FULL;
- soundInfo->mode |= 1;
- }
-}
-
-void SetPokemonCryPriority(u8 val)
-{
- gPokemonCrySong.priority = val;
-}
diff --git a/src/menews_jisan.c b/src/menews_jisan.c
index 530762990..0d406e66a 100644
--- a/src/menews_jisan.c
+++ b/src/menews_jisan.c
@@ -10,7 +10,7 @@ static u32 sub_8146E0C(struct MysteryEventStruct *);
static void sub_8146DA0(struct MysteryEventStruct *);
static void sub_8146D94(struct MysteryEventStruct *);
-void sub_8146C30(u32 a0)
+void GenerateRandomNews(u32 a0)
{
struct MysteryEventStruct *r5 = sub_8143D94();
@@ -59,7 +59,7 @@ u16 sub_8146CE8(void)
struct MysteryEventStruct *r4 = sub_8143D94();
u16 r5;
- if (!sub_806E2BC() || !sub_8143E1C())
+ if (!sub_806E2BC() || !ValidateReceivedWonderNews())
return 0;
r5 = sub_8146E0C(r4);
diff --git a/src/mevent.c b/src/mevent.c
index a62286f21..4d625987e 100644
--- a/src/mevent.c
+++ b/src/mevent.c
@@ -240,7 +240,7 @@ u32 sub_8143770(u8 * r4, u16 * r5)
return 0;
}
-void sub_81438A0(void)
+void task_add_00_ereader(void)
{
u8 taskId = CreateTask(sub_8143910, 0);
struct MEventTaskData1 *data = (struct MEventTaskData1 *)gTasks[taskId].data;
@@ -279,7 +279,7 @@ void sub_8143910(u8 taskId)
switch (data->t08)
{
case 0:
- if (mevent_0814257C(&data->t09, gUnknown_841DE52))
+ if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE52))
data->t08 = 1;
break;
case 1:
@@ -294,16 +294,16 @@ void sub_8143910(u8 taskId)
case 3:
if (!sub_814374C())
{
- sub_80098B8();
+ CloseLink();
data->t08 = 4;
}
else
data->t08 = 13;
break;
case 4:
- if (mevent_0814257C(&data->t09, gUnknown_841DE53))
+ if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE53))
{
- sub_8142504(gUnknown_841DE54);
+ AddTextPrinterToWindow1(gUnknown_841DE54);
sub_81438E8(&data->t00);
data->t08 = 5;
}
@@ -325,36 +325,36 @@ void sub_8143910(u8 taskId)
if (JOY_NEW(B_BUTTON))
{
PlaySE(SE_SELECT);
- sub_80098B8();
+ CloseLink();
sub_81438E8(&data->t00);
data->t08 = 23;
}
else if (GetLinkPlayerCount_2() > 1)
{
sub_81438E8(&data->t00);
- sub_80098B8();
+ CloseLink();
data->t08 = 7;
}
else if (sub_81436EC())
{
PlaySE(SE_SELECT);
- sub_80098B8();
+ CloseLink();
sub_81438E8(&data->t00);
data->t08 = 8;
}
else if (sub_81438F0(&data->t00, 10))
{
- sub_80098B8();
+ CloseLink();
sub_81436BC();
sub_81438E8(&data->t00);
}
break;
case 7:
- if (mevent_0814257C(&data->t09, gUnknown_841DE7C))
+ if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE7C))
data->t08 = 4;
break;
case 8:
- sub_8142504(gUnknown_841DE95);
+ AddTextPrinterToWindow1(gUnknown_841DE95);
sub_81435DC(&gUnknown_3005ED0, gUnknownSerialData_End - gUnknownSerialData_Start, gUnknownSerialData_Start);
data->t08 = 9;
break;
@@ -370,7 +370,7 @@ void sub_8143910(u8 taskId)
else if (data->t0E == 1)
{
sub_81438E8(&data->t00);
- sub_8142504(gUnknown_841DE9B);
+ AddTextPrinterToWindow1(gUnknown_841DE9B);
data->t08 = 11;
}
else
@@ -382,7 +382,7 @@ void sub_8143910(u8 taskId)
break;
case 12:
sub_81436BC();
- sub_8142504(gUnknown_841DE98);
+ AddTextPrinterToWindow1(gUnknown_841DE98);
data->t08 = 13;
break;
case 13:
@@ -391,21 +391,21 @@ void sub_8143910(u8 taskId)
case 0:
break;
case 2:
- sub_8142504(gUnknown_841DE95);
+ AddTextPrinterToWindow1(gUnknown_841DE95);
data->t08 = 14;
break;
case 1:
PlaySE(SE_SELECT);
- sub_80098B8();
+ CloseLink();
data->t08 = 23;
break;
case 5:
- sub_80098B8();
+ CloseLink();
data->t08 = 21;
break;
case 3:
case 4:
- sub_80098B8();
+ CloseLink();
data->t08 = 20;
break;
}
@@ -413,7 +413,7 @@ void sub_8143910(u8 taskId)
case 14:
if (HasLinkErrorOccurred())
{
- sub_80098B8();
+ CloseLink();
data->t08 = 20;
}
else if (GetBlockReceivedStatus())
@@ -439,7 +439,7 @@ void sub_8143910(u8 taskId)
case 17:
if (sub_815D794(gDecompressionBuffer))
{
- sub_8142504(gUnknown_841DE99);
+ AddTextPrinterToWindow1(gUnknown_841DE99);
sub_81438E8(&data->t00);
data->t08 = 18;
}
@@ -449,7 +449,7 @@ void sub_8143910(u8 taskId)
case 18:
if (sub_81438F0(&data->t00, 120))
{
- sub_8142504(gUnknown_841DE9A);
+ AddTextPrinterToWindow1(gUnknown_841DE9A);
PlayFanfare(258);
data->t08 = 19;
}
@@ -459,26 +459,26 @@ void sub_8143910(u8 taskId)
data->t08 = 26;
break;
case 23:
- if (mevent_0814257C(&data->t09, gUnknown_841DE7D))
+ if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE7D))
data->t08 = 26;
break;
case 20:
- if (mevent_0814257C(&data->t09, gUnknown_841DE96))
+ if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE96))
data->t08 = 0;
break;
case 21:
- if (mevent_0814257C(&data->t09, gUnknown_841DE97))
+ if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE97))
data->t08 = 0;
break;
case 22:
- if (mevent_0814257C(&data->t09, gUnknown_841DE9C))
+ if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE9C))
data->t08 = 0;
break;
case 26:
sub_812B484();
Free(data->t10);
DestroyTask(taskId);
- SetMainCallback2(sub_81422FC);
+ SetMainCallback2(MainCB_FreeAllBuffersAndReturnToInitTitleScreen);
break;
}
}
@@ -490,12 +490,12 @@ void sub_8143D24(void)
sub_80BDE28();
}
-struct MEventBuffer_3120_Sub * sub_8143D58(void)
+struct MEventBuffer_3120_Sub * GetSavedWonderNews(void)
{
return &gSaveBlock1Ptr->unk_3120.buffer_000.data;
}
-struct MEventBuffer_32E0_Sub * sav1_get_mevent_buffer_1(void)
+struct MEventBuffer_32E0_Sub * GetSavedWonderCard(void)
{
return &gSaveBlock1Ptr->unk_3120.buffer_1c0.data;
}
@@ -515,7 +515,7 @@ u16 * sub_8143DA8(void)
return gSaveBlock1Ptr->unk_3120.unk_338;
}
-void sub_8143DBC(void)
+void DestroyWonderNews(void)
{
sub_8143E9C();
}
@@ -530,7 +530,7 @@ bool32 sub_8143DC8(const struct MEventBuffer_3120_Sub * src)
return TRUE;
}
-bool32 sub_8143E1C(void)
+bool32 ValidateReceivedWonderNews(void)
{
if (CalcCRC16WithTable((void *)&gSaveBlock1Ptr->unk_3120.buffer_000.data, sizeof(struct MEventBuffer_3120_Sub)) != gSaveBlock1Ptr->unk_3120.buffer_000.crc)
return FALSE;
@@ -546,7 +546,7 @@ bool32 sub_8143E64(const struct MEventBuffer_3120_Sub * data)
return TRUE;
}
-bool32 sub_8143E78(void)
+bool32 WonderNews_Test_Unk_02(void)
{
const struct MEventBuffer_3120_Sub * data = &gSaveBlock1Ptr->unk_3120.buffer_000.data;
if (data->unk_02 == 0)
@@ -556,7 +556,7 @@ bool32 sub_8143E78(void)
void sub_8143E9C(void)
{
- CpuFill32(0, sub_8143D58(), sizeof(gSaveBlock1Ptr->unk_3120.buffer_000.data));
+ CpuFill32(0, GetSavedWonderNews(), sizeof(gSaveBlock1Ptr->unk_3120.buffer_000.data));
gSaveBlock1Ptr->unk_3120.buffer_000.crc = 0;
}
@@ -570,7 +570,7 @@ bool32 sub_8143EF4(const u8 * src)
{
const u8 * r5 = (const u8 *)&gSaveBlock1Ptr->unk_3120.buffer_000.data;
u32 i;
- if (!sub_8143E1C())
+ if (!ValidateReceivedWonderNews())
return FALSE;
for (i = 0; i < sizeof(struct MEventBuffer_3120_Sub); i++)
{
@@ -580,7 +580,7 @@ bool32 sub_8143EF4(const u8 * src)
return TRUE;
}
-void sub_8143F38(void)
+void DestroyWonderCard(void)
{
sub_814407C();
sub_81440B4();
@@ -597,7 +597,7 @@ bool32 sub_8143F68(const struct MEventBuffer_32E0_Sub * data)
struct MEventBuffer_32E0_Sub * r1;
if (!sub_8144018(data))
return FALSE;
- sub_8143F38();
+ DestroyWonderCard();
memcpy(&gSaveBlock1Ptr->unk_3120.buffer_1c0.data, data, sizeof(struct MEventBuffer_32E0_Sub));
gSaveBlock1Ptr->unk_3120.buffer_1c0.crc = CalcCRC16WithTable((void *)&gSaveBlock1Ptr->unk_3120.buffer_1c0.data, sizeof(struct MEventBuffer_32E0_Sub));
r2 = &gSaveBlock1Ptr->unk_3120.buffer_310.data;
@@ -606,7 +606,7 @@ bool32 sub_8143F68(const struct MEventBuffer_32E0_Sub * data)
return TRUE;
}
-bool32 sub_8143FC8(void)
+bool32 ValidateReceivedWonderCard(void)
{
if (gSaveBlock1Ptr->unk_3120.buffer_1c0.crc != CalcCRC16WithTable((void *)&gSaveBlock1Ptr->unk_3120.buffer_1c0.data, sizeof(struct MEventBuffer_32E0_Sub)))
return FALSE;
@@ -632,7 +632,7 @@ bool32 sub_8144018(const struct MEventBuffer_32E0_Sub * data)
return TRUE;
}
-bool32 sub_8144054(void)
+bool32 WonderCard_Test_Unk_08_6(void)
{
const struct MEventBuffer_32E0_Sub * data = &gSaveBlock1Ptr->unk_3120.buffer_1c0.data;
if (data->unk_08_6 == 0)
@@ -654,7 +654,7 @@ void sub_81440B4(void)
u16 sub_81440E8(void)
{
- if (sub_8143FC8())
+ if (ValidateReceivedWonderCard())
return gSaveBlock1Ptr->unk_3120.buffer_1c0.data.unk_00;
return 0;
}
@@ -672,7 +672,7 @@ bool32 sub_8144124(u16 a0)
return FALSE;
}
-bool32 sub_8144144(void)
+bool32 CheckReceivedGiftFromWonderCard(void)
{
u16 value = sub_81440E8();
if (!sub_8144124(value))
@@ -721,7 +721,7 @@ bool32 sub_81441F0(const u16 * data)
s32 sub_8144218(void)
{
struct MEventBuffer_32E0_Sub * data;
- if (!sub_8143FC8())
+ if (!ValidateReceivedWonderCard())
return 0;
data = &gSaveBlock1Ptr->unk_3120.buffer_1c0.data;
if (data->unk_08_0 != 1)
@@ -759,11 +759,11 @@ void sub_81442CC(struct MEventStruct_Unk1442CC * data)
data->unk_08 = 1;
data->unk_0C = 1;
data->unk_10 = 1;
- if (sub_8143FC8())
+ if (ValidateReceivedWonderCard())
{
- data->unk_14 = sav1_get_mevent_buffer_1()->unk_00;
+ data->unk_14 = GetSavedWonderCard()->unk_00;
data->unk_20 = *sav1_get_mevent_buffer_2();
- data->unk_44 = sav1_get_mevent_buffer_1()->unk_09;
+ data->unk_44 = GetSavedWonderCard()->unk_09;
}
else
data->unk_14 = 0;
@@ -945,7 +945,7 @@ bool32 sub_81446D0(u16 a0)
gUnknown_203F3BC = FALSE;
if (a0 == 0)
return FALSE;
- if (!sub_8143FC8())
+ if (!ValidateReceivedWonderCard())
return FALSE;
if (gSaveBlock1Ptr->unk_3120.buffer_1c0.data.unk_00 != a0)
return FALSE;
diff --git a/src/mevent_8145654.c b/src/mevent_8145654.c
index 65f515d1b..af3024bff 100644
--- a/src/mevent_8145654.c
+++ b/src/mevent_8145654.c
@@ -126,7 +126,7 @@ const struct UnkStruct_8467FB8 gUnknown_8467FB8[8] = {
{1, 0, 0, 7, gUnknown_8467A7C, gUnknown_8467CAC, gUnknown_846716C}
};
-bool32 sub_8145654(struct MEventBuffer_32E0_Sub * r5, struct MEventBuffer_3430_Sub * r6)
+bool32 InitWonderCardResources(struct MEventBuffer_32E0_Sub * r5, struct MEventBuffer_3430_Sub * r6)
{
if (r5 == NULL || r6 == NULL)
return FALSE;
@@ -145,7 +145,7 @@ bool32 sub_8145654(struct MEventBuffer_32E0_Sub * r5, struct MEventBuffer_3430_S
return TRUE;
}
-void sub_81456F0(void)
+void DestroyWonderCardResources(void)
{
if (gUnknown_203F3C8 != NULL)
{
@@ -155,7 +155,7 @@ void sub_81456F0(void)
}
}
-s32 sub_814571C(void)
+s32 FadeToWonderCardMenu(void)
{
if (gUnknown_203F3C8 == NULL)
return -1;
@@ -219,7 +219,7 @@ s32 sub_814571C(void)
return 0;
}
-s32 sub_814593C(bool32 flag)
+s32 FadeOutFromWonderCard(bool32 flag)
{
if (gUnknown_203F3C8 == NULL)
return -1;
@@ -252,7 +252,7 @@ s32 sub_814593C(bool32 flag)
FreeMonIconPalettes();
break;
case 5:
- sub_8142344(gUnknown_203F3B8, flag);
+ PrintMysteryGiftOrEReaderTopMenu(gGiftIsFromEReader, flag);
break;
case 6:
CopyBgTilemapBufferToVram(0);
@@ -508,7 +508,7 @@ const struct UnkStruct_8467FB8 gUnknown_8468720[] = {
{1, 0, 0, 0, gUnknown_84685B4, gUnknown_8468644, gUnknown_84680A0}
};
-bool32 sub_8146288(const struct MEventBuffer_3120_Sub * a0)
+bool32 InitWonderNewsResources(const struct MEventBuffer_3120_Sub * a0)
{
if (a0 == NULL)
return FALSE;
@@ -523,7 +523,7 @@ bool32 sub_8146288(const struct MEventBuffer_3120_Sub * a0)
return TRUE;
}
-void sub_81462EC(void)
+void DestroyWonderNewsResources(void)
{
if (gUnknown_203F3CC != NULL)
{
@@ -533,7 +533,7 @@ void sub_81462EC(void)
}
}
-s32 sub_8146318(void)
+s32 FadeToWonderNewsMenu(void)
{
if (gUnknown_203F3CC == NULL)
return -1;
@@ -608,7 +608,7 @@ s32 sub_8146318(void)
return 0;
}
-s32 sub_8146604(bool32 flag)
+s32 FadeOutFromWonderNews(bool32 flag)
{
if (gUnknown_203F3CC == NULL)
return -1;
@@ -653,10 +653,10 @@ s32 sub_8146604(bool32 flag)
}
break;
case 5:
- sub_8142344(gUnknown_203F3B8, flag);
+ PrintMysteryGiftOrEReaderTopMenu(gGiftIsFromEReader, flag);
break;
case 6:
- sub_8142420();
+ MG_DrawCheckerboardPattern();
CopyBgTilemapBufferToVram(0);
CopyBgTilemapBufferToVram(3);
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
@@ -671,7 +671,7 @@ s32 sub_8146604(bool32 flag)
return 0;
}
-void sub_81467EC(void)
+void MENews_RemoveScrollIndicatorArrowPair(void)
{
if (!gUnknown_203F3CC->unk_01C0_0 && gUnknown_203F3CC->unk_01C1 != 0xFF)
{
@@ -682,7 +682,7 @@ void sub_81467EC(void)
}
-void sub_8146834(void)
+void MENews_AddScrollIndicatorArrowPair(void)
{
if (gUnknown_203F3CC->unk_01C0_0)
{
@@ -691,7 +691,7 @@ void sub_8146834(void)
}
}
-u8 sub_8146884(u16 input)
+u32 MENews_GetInput(u16 input)
{
if (gUnknown_203F3CC->unk_01C2_0)
{
diff --git a/src/mevent_server.c b/src/mevent_server.c
index 5e384ae0b..1c2dc4ced 100644
--- a/src/mevent_server.c
+++ b/src/mevent_server.c
@@ -11,12 +11,12 @@
#include "mevent.h"
#include "mevent_server.h"
-EWRAM_DATA struct mevent_srv_ish * s_mevent_srv_ish_ptr = NULL;
+EWRAM_DATA struct mevent_client * s_mevent_client_ptr = NULL;
EWRAM_DATA struct mevent_srv_common * s_mevent_srv_common_ptr = NULL;
-static void mevent_srv_ish_init(struct mevent_srv_ish *, u32, u32);
-static u32 mevent_srv_ish_exec(struct mevent_srv_ish *);
-static void mevent_srv_ish_free_resources(struct mevent_srv_ish *);
+static void mevent_client_init(struct mevent_client *, u32, u32);
+static u32 mevent_client_exec(struct mevent_client *);
+static void mevent_client_free_resources(struct mevent_client *);
static void mevent_srv_init_common(struct mevent_srv_common *, const void *, u32, u32);
static void mevent_srv_free_resources(struct mevent_srv_common *);
static u32 mevent_srv_exec_common(struct mevent_srv_common *);
@@ -25,44 +25,44 @@ extern const u8 gUnknown_84687E0[];
extern const struct mevent_cmd gUnknown_8468B6C[];
extern const struct mevent_cmd gUnknown_8468BCC[];
-void mevent_srv_ish_do_init(void)
+void mevent_client_do_init(void)
{
- s_mevent_srv_ish_ptr = AllocZeroed(sizeof(struct mevent_srv_ish));
- mevent_srv_ish_init(s_mevent_srv_ish_ptr, 1, 0);
+ s_mevent_client_ptr = AllocZeroed(sizeof(struct mevent_client));
+ mevent_client_init(s_mevent_client_ptr, 1, 0);
}
-u32 mevent_srv_ish_do_exec(u16 * a0)
+u32 mevent_client_do_exec(u16 * a0)
{
u32 result;
- if (s_mevent_srv_ish_ptr == NULL)
+ if (s_mevent_client_ptr == NULL)
return 6;
- result = mevent_srv_ish_exec(s_mevent_srv_ish_ptr);
+ result = mevent_client_exec(s_mevent_client_ptr);
if (result == 6)
{
- *a0 = s_mevent_srv_ish_ptr->param;
- mevent_srv_ish_free_resources(s_mevent_srv_ish_ptr);
- Free(s_mevent_srv_ish_ptr);
- s_mevent_srv_ish_ptr = NULL;
+ *a0 = s_mevent_client_ptr->param;
+ mevent_client_free_resources(s_mevent_client_ptr);
+ Free(s_mevent_client_ptr);
+ s_mevent_client_ptr = NULL;
}
return result;
}
-void mevent_srv_ish_inc_flag(void)
+void mevent_client_inc_flag(void)
{
- s_mevent_srv_ish_ptr->flag++;
+ s_mevent_client_ptr->flag++;
}
-void * mevent_srv_ish_get_buffer(void)
+void * mevent_client_get_buffer(void)
{
- return s_mevent_srv_ish_ptr->buffer;
+ return s_mevent_client_ptr->buffer;
}
-void mevent_srv_ish_set_param(u32 a0)
+void mevent_client_set_param(u32 a0)
{
- s_mevent_srv_ish_ptr->param = a0;
+ s_mevent_client_ptr->param = a0;
}
-static void mevent_srv_ish_init(struct mevent_srv_ish * svr, u32 sendPlayerNo, u32 recvPlayerNo)
+static void mevent_client_init(struct mevent_client * svr, u32 sendPlayerNo, u32 recvPlayerNo)
{
svr->unk_00 = 0;
svr->mainseqno = 0;
@@ -74,7 +74,7 @@ static void mevent_srv_ish_init(struct mevent_srv_ish * svr, u32 sendPlayerNo, u
mevent_srv_sub_init(&svr->manager, sendPlayerNo, recvPlayerNo);
}
-static void mevent_srv_ish_free_resources(struct mevent_srv_ish * svr)
+static void mevent_client_free_resources(struct mevent_client * svr)
{
Free(svr->sendBuffer);
Free(svr->recvBuffer);
@@ -82,20 +82,20 @@ static void mevent_srv_ish_free_resources(struct mevent_srv_ish * svr)
Free(svr->buffer);
}
-static void mevent_srv_ish_jmp_buffer(struct mevent_srv_ish * svr)
+static void mevent_client_jmp_buffer(struct mevent_client * svr)
{
memcpy(svr->cmdBuffer, svr->recvBuffer, ME_SEND_BUF_SIZE);
svr->cmdidx = 0;
}
-static void mevent_srv_ish_send_word(struct mevent_srv_ish * svr, u32 ident, u32 word)
+static void mevent_client_send_word(struct mevent_client * svr, u32 ident, u32 word)
{
CpuFill32(0, svr->sendBuffer, ME_SEND_BUF_SIZE);
*(u32 *)svr->sendBuffer = word;
mevent_srv_sub_init_send(&svr->manager, ident, svr->sendBuffer, sizeof(u32));
}
-static u32 ish_mainseq_0(struct mevent_srv_ish * svr)
+static u32 ish_mainseq_0(struct mevent_client * svr)
{
// init
memcpy(svr->cmdBuffer, gUnknown_84687E0, ME_SEND_BUF_SIZE);
@@ -105,13 +105,13 @@ static u32 ish_mainseq_0(struct mevent_srv_ish * svr)
return 0;
}
-static u32 ish_mainseq_1(struct mevent_srv_ish * svr)
+static u32 ish_mainseq_1(struct mevent_client * svr)
{
// done
return 6;
}
-static u32 ish_mainseq_2(struct mevent_srv_ish * svr)
+static u32 ish_mainseq_2(struct mevent_client * svr)
{
// do recv
if (mevent_srv_sub_recv(&svr->manager))
@@ -122,7 +122,7 @@ static u32 ish_mainseq_2(struct mevent_srv_ish * svr)
return 1;
}
-static u32 ish_mainseq_3(struct mevent_srv_ish * svr)
+static u32 ish_mainseq_3(struct mevent_client * svr)
{
// do send
if (mevent_srv_sub_send(&svr->manager))
@@ -133,7 +133,7 @@ static u32 ish_mainseq_3(struct mevent_srv_ish * svr)
return 1;
}
-static u32 ish_mainseq_4(struct mevent_srv_ish * svr)
+static u32 ish_mainseq_4(struct mevent_client * svr)
{
// process command
struct mevent_cmd_ish * cmd = &svr->cmdBuffer[svr->cmdidx];
@@ -162,20 +162,20 @@ static u32 ish_mainseq_4(struct mevent_srv_ish * svr)
svr->flag = 0;
break;
case 19:
- mevent_srv_ish_send_word(svr, 0x12, GetGameStat(cmd->parameter));
+ mevent_client_send_word(svr, 0x12, GetGameStat(cmd->parameter));
svr->mainseqno = 3;
svr->flag = 0;
break;
case 6:
if (svr->param == 0)
- mevent_srv_ish_jmp_buffer(svr);
+ mevent_client_jmp_buffer(svr);
break;
case 7:
if (svr->param == 1)
- mevent_srv_ish_jmp_buffer(svr);
+ mevent_client_jmp_buffer(svr);
break;
case 4:
- mevent_srv_ish_jmp_buffer(svr);
+ mevent_client_jmp_buffer(svr);
break;
case 5:
memcpy(svr->buffer, svr->recvBuffer, 0x40);
@@ -201,7 +201,7 @@ static u32 ish_mainseq_4(struct mevent_srv_ish * svr)
mevent_srv_sub_init_send(&svr->manager, 0x11, svr->sendBuffer, sizeof(struct MEventStruct_Unk1442CC));
break;
case 14:
- mevent_srv_ish_send_word(svr, 0x13, svr->param);
+ mevent_client_send_word(svr, 0x13, svr->param);
break;
case 10:
sub_8143F68(svr->recvBuffer);
@@ -210,10 +210,10 @@ static u32 ish_mainseq_4(struct mevent_srv_ish * svr)
if (!sub_8143EF4(svr->recvBuffer))
{
sub_8143DC8(svr->recvBuffer);
- mevent_srv_ish_send_word(svr, 0x13, 0);
+ mevent_client_send_word(svr, 0x13, 0);
}
else
- mevent_srv_ish_send_word(svr, 0x13, 1);
+ mevent_client_send_word(svr, 0x13, 1);
break;
case 15:
svr->mainseqno = 6;
@@ -239,7 +239,7 @@ static u32 ish_mainseq_4(struct mevent_srv_ish * svr)
return 1;
}
-static u32 ish_mainseq_5(struct mevent_srv_ish * svr)
+static u32 ish_mainseq_5(struct mevent_client * svr)
{
// wait flag
if (svr->flag)
@@ -250,7 +250,7 @@ static u32 ish_mainseq_5(struct mevent_srv_ish * svr)
return 1;
}
-static u32 ish_mainseq_6(struct mevent_srv_ish * svr)
+static u32 ish_mainseq_6(struct mevent_client * svr)
{
// ???
switch (svr->flag)
@@ -270,7 +270,7 @@ static u32 ish_mainseq_6(struct mevent_srv_ish * svr)
return 1;
}
-static u32 ish_mainseq_7(struct mevent_srv_ish * svr)
+static u32 ish_mainseq_7(struct mevent_client * svr)
{
// exec arbitrary code
u32 (*func)(u32 *, struct SaveBlock2 *, struct SaveBlock1 *) = (void *)gDecompressionBuffer;
@@ -282,9 +282,9 @@ static u32 ish_mainseq_7(struct mevent_srv_ish * svr)
return 1;
}
-static u32 mevent_srv_ish_exec(struct mevent_srv_ish * svr)
+static u32 mevent_client_exec(struct mevent_client * svr)
{
- u32 (*funcs[])(struct mevent_srv_ish *) = {
+ u32 (*funcs[])(struct mevent_client *) = {
ish_mainseq_0,
ish_mainseq_1,
ish_mainseq_2,
@@ -297,19 +297,19 @@ static u32 mevent_srv_ish_exec(struct mevent_srv_ish * svr)
return funcs[svr->mainseqno](svr);
}
-void mevent_srv_common_do_init_1(void)
+void mevent_srv_init_wnews(void)
{
s_mevent_srv_common_ptr = AllocZeroed(sizeof(struct mevent_srv_common));
mevent_srv_init_common(s_mevent_srv_common_ptr, gUnknown_8468B6C, 0, 1);
}
-void mevent_srv_common_do_init_2(void)
+void mevent_srv_new_wcard(void)
{
s_mevent_srv_common_ptr = AllocZeroed(sizeof(struct mevent_srv_common));
mevent_srv_init_common(s_mevent_srv_common_ptr, gUnknown_8468BCC, 0, 1);
}
-u32 mevent_srv_init_do_exec(u16 * a0)
+u32 mevent_srv_common_do_exec(u16 * a0)
{
u32 result;
if (s_mevent_srv_common_ptr == NULL)
@@ -526,12 +526,12 @@ static u32 common_mainseq_4(struct mevent_srv_common * svr)
break;
case 26:
AGB_ASSERT_EX(cmd->flag == FALSE && cmd->parameter == NULL, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 506);
- memcpy(svr->mevent_32e0, sav1_get_mevent_buffer_1(), 332);
+ memcpy(svr->mevent_32e0, GetSavedWonderCard(), 332);
sub_814410C(svr->mevent_32e0);
break;
case 27:
AGB_ASSERT_EX(cmd->flag == FALSE && cmd->parameter == NULL, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 512);
- memcpy(svr->mevent_3120, sub_8143D58(), 444);
+ memcpy(svr->mevent_3120, GetSavedWonderNews(), 444);
break;
case 28:
AGB_ASSERT_EX(cmd->flag == FALSE && cmd->parameter == NULL, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 517);
diff --git a/src/mystery_gift_menu.c b/src/mystery_gift_menu.c
new file mode 100644
index 000000000..0cbfb4be5
--- /dev/null
+++ b/src/mystery_gift_menu.c
@@ -0,0 +1,1756 @@
+#include "global.h"
+#include "palette.h"
+#include "dma3.h"
+#include "gpu_regs.h"
+#include "bg.h"
+#include "task.h"
+#include "scanline_effect.h"
+#include "malloc.h"
+#include "text.h"
+#include "window.h"
+#include "text_window.h"
+#include "menu.h"
+#include "new_menu_helpers.h"
+#include "sound.h"
+#include "mystery_gift_menu.h"
+#include "title_screen.h"
+#include "list_menu.h"
+#include "link_rfu.h"
+#include "string_util.h"
+#include "mevent.h"
+#include "save.h"
+#include "link.h"
+#include "event_data.h"
+#include "mevent_server.h"
+#include "menews_jisan.h"
+#include "help_system.h"
+#include "constants/songs.h"
+
+EWRAM_DATA u8 sDownArrowCounterAndYCoordIdx[8] = {};
+EWRAM_DATA bool8 gGiftIsFromEReader = FALSE;
+
+void task_add_00_mystery_gift(void);
+void task00_mystery_gift(u8 taskId);
+void task_add_00_ereader(void);
+
+extern const u8 gText_PickOKExit[];
+extern const u8 gText_PickOKCancel[];
+extern const u8 gText_MysteryGift[];
+extern const u8 gJPText_MysteryGift[];
+extern const u8 gJPText_DecideStop[];
+extern const u8 gText_WhatToDoWithCards[];
+extern const u8 gText_WhatToDoWithNews[];
+extern const u8 gText_OkayToDiscardNews[];
+extern const u8 gText_IfThrowAwayCardEventWontHappen[];
+extern const u8 gText_WonderCardThrownAway[];
+extern const u8 gText_WonderNewsThrownAway[];
+extern const u8 gText_DataWillBeSaved[];
+extern const u8 gText_SaveCompletedPressA[];
+extern const u8 gText_WonderCards[];
+extern const u8 gText_WonderNews[];
+extern const u8 gText_Exit3[];
+extern const u8 gText_WirelessCommunication[];
+extern const u8 gText_Friend2[];
+extern const u8 gFameCheckerText_Cancel[];
+extern const u8 gText_Receive[];
+extern const u8 gText_Send[];
+extern const u8 gText_Toss[];
+extern const u8 gText_VarietyOfEventsImportedWireless[];
+extern const u8 gText_WonderCardsInPossession[];
+extern const u8 gText_ReadNewsThatArrived[];
+extern const u8 gText_ReturnToTitle[];
+extern const u8 gText_NothingSentOver[];
+extern const u8 gText_RecordUploadedViaWireless[];
+extern const u8 gText_WonderCardReceived[];
+extern const u8 gText_WonderCardReceivedFrom[];
+extern const u8 gText_WonderNewsReceived[];
+extern const u8 gText_WonderNewsReceivedFrom[];
+extern const u8 gText_NewStampReceived[];
+extern const u8 gText_AlreadyHadCard[];
+extern const u8 gText_AlreadyHadStamp[];
+extern const u8 gText_AlreadyHadNews[];
+extern const u8 gText_NoMoreRoomForStamps[];
+extern const u8 gText_CommunicationCanceled[];
+extern const u8 gText_CantAcceptCardFromTrainer[];
+extern const u8 gText_CantAcceptNewsFromTrainer[];
+extern const u8 gText_CommunicationError[];
+extern const u8 gText_NewTrainerReceived[];
+extern const u8 gText_WonderCardSentTo[];
+extern const u8 gText_WonderNewsSentTo[];
+extern const u8 gText_StampSentTo[];
+extern const u8 gText_OtherTrainerHasCard[];
+extern const u8 gText_OtherTrainerHasStamp[];
+extern const u8 gText_OtherTrainerHasNews[];
+extern const u8 gText_OtherTrainerCanceled[];
+extern const u8 gText_GiftSentTo[];
+extern const u8 gText_CantSendGiftToTrainer[];
+extern const u8 gText_DontHaveCardNewOneInput[];
+extern const u8 gText_DontHaveNewsNewOneInput[];
+extern const u8 gText_WhereShouldCardBeAccessed[];
+extern const u8 gText_WhereShouldNewsBeAccessed[];
+extern const u8 gText_Communicating[];
+extern const u8 gText_ThrowAwayWonderCard[];
+extern const u8 gText_HaventReceivedCardsGift[];
+extern const u8 gText_CommunicationCompleted[];
+extern const u8 gText_HaventReceivedGiftOkayToDiscard[];
+extern const u8 gText_SendingWonderCard[];
+extern const u8 gText_SendingWonderNews[];
+
+const u16 gUnkTextboxBorderPal[] = INCBIN_U16("graphics/interface/unk_textbox_border.gbapal");
+const u32 gUnkTextboxBorderGfx[] = INCBIN_U32("graphics/interface/unk_textbox_border.4bpp.lz");
+
+struct MysteryGiftTaskData
+{
+ u16 curPromptWindowId;
+ u16 unk2;
+ u16 unk4;
+ u16 unk6;
+ u8 state;
+ u8 textState;
+ u8 unkA;
+ u8 unkB;
+ u8 IsCardOrNews;
+ u8 source;
+ u8 prevPromptWindowId;
+ u8 * buffer;
+};
+
+const struct BgTemplate sBGTemplates[] = {
+ {
+ .bg = 0,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 15,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0x000
+ }, {
+ .bg = 1,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 14,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0x000
+ }, {
+ .bg = 2,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 13,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0x000
+ }, {
+ .bg = 3,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 12,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0x000
+ }
+};
+
+const struct WindowTemplate sMainWindows[] = {
+ {
+ .priority = 0x00,
+ .tilemapLeft = 0x00,
+ .tilemapTop = 0x00,
+ .width = 0x1e,
+ .height = 0x02,
+ .paletteNum = 0x0f,
+ .baseBlock = 0x0013
+ }, {
+ .priority = 0x00,
+ .tilemapLeft = 0x01,
+ .tilemapTop = 0x0f,
+ .width = 0x1c,
+ .height = 0x04,
+ .paletteNum = 0x0f,
+ .baseBlock = 0x004f
+ }, {
+ .priority = 0x00,
+ .tilemapLeft = 0x00,
+ .tilemapTop = 0x0f,
+ .width = 0x1e,
+ .height = 0x05,
+ .paletteNum = 0x0d,
+ .baseBlock = 0x004f
+ }, {
+ 0xFF
+ }
+};
+
+const struct WindowTemplate sWindowTemplate_PromptYesOrNo_Width28 = {
+ .priority = 0x00,
+ .tilemapLeft = 0x01,
+ .tilemapTop = 0x0f,
+ .width = 0x1c,
+ .height = 0x04,
+ .paletteNum = 0x0f,
+ .baseBlock = 0x00e5
+};
+
+const struct WindowTemplate sWindowTemplate_PromptYesOrNo_Width20 = {
+ .priority = 0x00,
+ .tilemapLeft = 0x01,
+ .tilemapTop = 0x0f,
+ .width = 0x14,
+ .height = 0x04,
+ .paletteNum = 0x0f,
+ .baseBlock = 0x00e5
+};
+
+const struct WindowTemplate sMysteryGiftMenuWindowTemplate = {
+ .priority = 0x00,
+ .tilemapLeft = 0x01,
+ .tilemapTop = 0x0f,
+ .width = 0x13,
+ .height = 0x04,
+ .paletteNum = 0x0f,
+ .baseBlock = 0x00e5
+};
+
+const struct WindowTemplate sWindowTemplate_ThreeOptions = {
+ .priority = 0x00,
+ .tilemapLeft = 0x08,
+ .tilemapTop = 0x05,
+ .width = 0x0e,
+ .height = 0x05,
+ .paletteNum = 0x0e,
+ .baseBlock = 0x0155
+};
+
+const struct WindowTemplate sWindowTemplate_YesNoBox = {
+ .priority = 0x00,
+ .tilemapLeft = 0x17,
+ .tilemapTop = 0x0f,
+ .width = 0x06,
+ .height = 0x04,
+ .paletteNum = 0x0e,
+ .baseBlock = 0x0155
+};
+
+const struct WindowTemplate sWindowTemplate_7by8 = {
+ .priority = 0x00,
+ .tilemapLeft = 0x16,
+ .tilemapTop = 0x0c,
+ .width = 0x07,
+ .height = 0x07,
+ .paletteNum = 0x0e,
+ .baseBlock = 0x0155
+};
+
+const struct WindowTemplate sWindowTemplate_7by6 = {
+ .priority = 0x00,
+ .tilemapLeft = 0x16,
+ .tilemapTop = 0x0e,
+ .width = 0x07,
+ .height = 0x05,
+ .paletteNum = 0x0e,
+ .baseBlock = 0x0155
+};
+
+const struct WindowTemplate sWindowTemplate_7by4 = {
+ .priority = 0x00,
+ .tilemapLeft = 0x16,
+ .tilemapTop = 0x0f,
+ .width = 0x07,
+ .height = 0x04,
+ .paletteNum = 0x0e,
+ .baseBlock = 0x0155
+};
+
+const struct ListMenuItem sListMenuItems_CardsOrNews[] = {
+ { gText_WonderCards, 0 },
+ { gText_WonderNews, 1 },
+ { gText_Exit3, -2 }
+};
+
+const struct ListMenuItem sListMenuItems_WirelessOrFriend[] = {
+ { gText_WirelessCommunication, 0 },
+ { gText_Friend2, 1 },
+ { gFameCheckerText_Cancel, -2 }
+};
+
+const struct ListMenuTemplate sListMenuTemplate_ThreeOptions = {
+ .items = NULL,
+ .moveCursorFunc = ListMenuDefaultCursorMoveFunc,
+ .itemPrintFunc = NULL,
+ .totalItems = 3,
+ .maxShowed = 3,
+ .windowId = 0,
+ .header_X = 0,
+ .item_X = 8,
+ .cursor_X = 0,
+ .upText_Y = 0,
+ .cursorPal = 2,
+ .fillValue = 1,
+ .cursorShadowPal = 3,
+ .lettersSpacing = 0,
+ .itemVerticalPadding = 0,
+ .scrollMultiple = 0,
+ .fontId = 2,
+ .cursorKind = 0
+};
+
+const struct ListMenuItem sListMenuItems_ReceiveSendToss[] = {
+ { gText_Receive, 0 },
+ { gText_Send, 1 },
+ { gText_Toss, 2 },
+ { gFameCheckerText_Cancel, -2 }
+};
+
+const struct ListMenuItem sListMenuItems_ReceiveToss[] = {
+ { gText_Receive, 0 },
+ { gText_Toss, 2 },
+ { gFameCheckerText_Cancel, -2 }
+};
+
+const struct ListMenuItem sListMenuItems_ReceiveSend[] = {
+ { gText_Receive, 0 },
+ { gText_Send, 1 },
+ { gFameCheckerText_Cancel, -2 }
+};
+
+const struct ListMenuItem sListMenuItems_Receive[] = {
+ { gText_Receive, 0 },
+ { gFameCheckerText_Cancel, -2 }
+};
+
+const struct ListMenuTemplate sListMenu_ReceiveSendToss = {
+ .items = sListMenuItems_ReceiveSendToss,
+ .moveCursorFunc = ListMenuDefaultCursorMoveFunc,
+ .itemPrintFunc = NULL,
+ .totalItems = 4,
+ .maxShowed = 4,
+ .windowId = 0,
+ .header_X = 0,
+ .item_X = 8,
+ .cursor_X = 0,
+ .upText_Y = 2,
+ .cursorPal = 2,
+ .fillValue = 1,
+ .cursorShadowPal = 3,
+ .lettersSpacing = 0,
+ .itemVerticalPadding = 0,
+ .scrollMultiple = 0,
+ .fontId = 2,
+ .cursorKind = 0
+};
+
+const struct ListMenuTemplate sListMenu_ReceiveToss = {
+ .items = sListMenuItems_ReceiveToss,
+ .moveCursorFunc = ListMenuDefaultCursorMoveFunc,
+ .itemPrintFunc = NULL,
+ .totalItems = 3,
+ .maxShowed = 3,
+ .windowId = 0,
+ .header_X = 0,
+ .item_X = 8,
+ .cursor_X = 0,
+ .upText_Y = 0,
+ .cursorPal = 2,
+ .fillValue = 1,
+ .cursorShadowPal = 3,
+ .lettersSpacing = 0,
+ .itemVerticalPadding = 0,
+ .scrollMultiple = 0,
+ .fontId = 2,
+ .cursorKind = 0
+};
+
+const struct ListMenuTemplate sListMenu_ReceiveSend = {
+ .items = sListMenuItems_ReceiveSend,
+ .moveCursorFunc = ListMenuDefaultCursorMoveFunc,
+ .itemPrintFunc = NULL,
+ .totalItems = 3,
+ .maxShowed = 3,
+ .windowId = 0,
+ .header_X = 0,
+ .item_X = 8,
+ .cursor_X = 0,
+ .upText_Y = 0,
+ .cursorPal = 2,
+ .fillValue = 1,
+ .cursorShadowPal = 3,
+ .lettersSpacing = 0,
+ .itemVerticalPadding = 0,
+ .scrollMultiple = 0,
+ .fontId = 2,
+ .cursorKind = 0
+};
+
+const struct ListMenuTemplate sListMenu_Receive = {
+ .items = sListMenuItems_Receive,
+ .moveCursorFunc = ListMenuDefaultCursorMoveFunc,
+ .itemPrintFunc = NULL,
+ .totalItems = 2,
+ .maxShowed = 2,
+ .windowId = 0,
+ .header_X = 0,
+ .item_X = 8,
+ .cursor_X = 0,
+ .upText_Y = 0,
+ .cursorPal = 2,
+ .fillValue = 1,
+ .cursorShadowPal = 3,
+ .lettersSpacing = 0,
+ .itemVerticalPadding = 2,
+ .scrollMultiple = 0,
+ .fontId = 2,
+ .cursorKind = 0
+};
+
+const u8 *const Unref_08366ED8[] = {
+ gText_VarietyOfEventsImportedWireless,
+ gText_WonderCardsInPossession,
+ gText_ReadNewsThatArrived,
+ gText_ReturnToTitle
+};
+
+ALIGNED(4) const struct TextColor sMG_Ereader_TextColor_1 = { 0, 1, 2 };
+ALIGNED(4) const struct TextColor sMG_Ereader_TextColor_1_Copy = { 0, 1, 2 };
+ALIGNED(4) const struct TextColor sMG_Ereader_TextColor_2 = { 1, 2, 3 };
+
+const u8 gUnknown_8466EF3[] = _("テスト");
+const u8 gUnknown_8466EF7[] = _("むげんのチケット");
+
+void vblankcb_mystery_gift_e_reader_run(void)
+{
+ ProcessSpriteCopyRequests();
+ LoadOam();
+ TransferPlttBuffer();
+}
+
+void c2_mystery_gift_e_reader_run(void)
+{
+ RunTasks();
+ RunTextPrinters();
+ AnimateSprites();
+ BuildOamBuffer();
+}
+
+bool32 HandleMysteryGiftOrEReaderSetup(s32 mg_or_ereader)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ ResetPaletteFade();
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ ResetTasks();
+ ScanlineEffect_Stop();
+ ResetBgsAndClearDma3BusyFlags(1);
+
+ InitBgsFromTemplates(0, sBGTemplates, ARRAY_COUNT(sBGTemplates));
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ ChangeBgX(2, 0, 0);
+ ChangeBgY(2, 0, 0);
+ ChangeBgX(3, 0, 0);
+ ChangeBgY(3, 0, 0);
+
+ SetBgTilemapBuffer(3, Alloc(0x800));
+ SetBgTilemapBuffer(2, Alloc(0x800));
+ SetBgTilemapBuffer(1, Alloc(0x800));
+ SetBgTilemapBuffer(0, Alloc(0x800));
+
+ sub_814FE40(0, 10, 0xE0);
+ sub_814FDA0(0, 1, 0xF0);
+ sub_80F696C(3, gUnkTextboxBorderGfx, 0x100, 0, 0);
+ InitWindows(sMainWindows);
+ DeactivateAllTextPrinters();
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ gMain.state++;
+ break;
+ case 1:
+ LoadPalette(gUnkTextboxBorderPal, 0, 0x20);
+ LoadPalette(stdpal_get(2), 0xd0, 0x20);
+ FillBgTilemapBufferRect(0, 0x000, 0, 0, 32, 32, 0x11);
+ FillBgTilemapBufferRect(1, 0x000, 0, 0, 32, 32, 0x11);
+ FillBgTilemapBufferRect(2, 0x000, 0, 0, 32, 32, 0x11);
+ MG_DrawCheckerboardPattern();
+ PrintMysteryGiftOrEReaderTopMenu(mg_or_ereader, 0);
+ gMain.state++;
+ break;
+ case 2:
+ CopyBgTilemapBufferToVram(3);
+ CopyBgTilemapBufferToVram(2);
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(0);
+ gMain.state++;
+ break;
+ case 3:
+ ShowBg(0);
+ ShowBg(3);
+ PlayBGM(BGM_FRLG_MYSTERY_GIFT);
+ SetVBlankCallback(vblankcb_mystery_gift_e_reader_run);
+ EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_VCOUNT | INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void c2_mystery_gift(void)
+{
+ if (HandleMysteryGiftOrEReaderSetup(0))
+ {
+ SetMainCallback2(c2_mystery_gift_e_reader_run);
+ gGiftIsFromEReader = FALSE;
+ task_add_00_mystery_gift();
+ }
+}
+
+void c2_ereader(void)
+{
+ if (HandleMysteryGiftOrEReaderSetup(1))
+ {
+ SetMainCallback2(c2_mystery_gift_e_reader_run);
+ gGiftIsFromEReader = TRUE;
+ task_add_00_ereader();
+ }
+}
+
+void MainCB_FreeAllBuffersAndReturnToInitTitleScreen(void)
+{
+ gGiftIsFromEReader = FALSE;
+ FreeAllWindowBuffers();
+ Free(GetBgTilemapBuffer(0));
+ Free(GetBgTilemapBuffer(1));
+ Free(GetBgTilemapBuffer(2));
+ Free(GetBgTilemapBuffer(3));
+ SetMainCallback2(CB2_InitTitleScreen);
+}
+
+void PrintMysteryGiftOrEReaderTopMenu(bool8 mg_or_ereader, bool32 usePickOkCancel)
+{
+ const u8 * src;
+ s32 width;
+ FillWindowPixelBuffer(0, 0x00);
+ if (!mg_or_ereader)
+ {
+ src = usePickOkCancel == TRUE ? gText_PickOKExit : gText_PickOKCancel;
+ AddTextPrinterParametrized2(0, 2, 2, 2, 0, 0, &sMG_Ereader_TextColor_1, 0, gText_MysteryGift);
+ width = 222 - GetStringWidth(0, src, 0);
+ AddTextPrinterParametrized2(0, 0, width, 2, 0, 0, &sMG_Ereader_TextColor_1, 0, src);
+ }
+ else
+ {
+ AddTextPrinterParametrized2(0, 2, 2, 2, 0, 0, &sMG_Ereader_TextColor_1, 0, gJPText_MysteryGift);
+ AddTextPrinterParametrized2(0, 0, 0x78, 2, 0, 0, &sMG_Ereader_TextColor_1, 0, gJPText_DecideStop);
+ }
+ CopyWindowToVram(0, 2);
+ PutWindowTilemap(0);
+}
+
+void MG_DrawTextBorder(u8 windowId)
+{
+ DrawTextBorderOuter(windowId, 0x01, 0xF);
+}
+
+void MG_DrawCheckerboardPattern(void)
+{
+ s32 i = 0, j;
+
+ FillBgTilemapBufferRect(3, 0x003, 0, 0, 32, 2, 0x11);
+
+ for (i = 0; i < 18; i++)
+ {
+ for (j = 0; j < 32; j++)
+ {
+ if ((i & 1) != (j & 1))
+ {
+ FillBgTilemapBufferRect(3, 1, j, i + 2, 1, 1, 0x11);
+ }
+ else
+ {
+ FillBgTilemapBufferRect(3, 2, j, i + 2, 1, 1, 0x11);
+ }
+ }
+ }
+}
+
+void ClearScreenInBg0(bool32 ignoreTopTwoRows)
+{
+ switch (ignoreTopTwoRows)
+ {
+ case 0:
+ FillBgTilemapBufferRect(0, 0, 0, 0, 32, 32, 0x11);
+ break;
+ case 1:
+ FillBgTilemapBufferRect(0, 0, 0, 2, 32, 30, 0x11);
+ break;
+ }
+ CopyBgTilemapBufferToVram(0);
+}
+
+void AddTextPrinterToWindow1(const u8 *str)
+{
+ StringExpandPlaceholders(gStringVar4, str);
+ FillWindowPixelBuffer(1, 0x11);
+ AddTextPrinterParametrized2(1, 2, 0, 2, 0, 2, &sMG_Ereader_TextColor_2, 0, gStringVar4);
+ DrawTextBorderOuter(1, 0x001, 0xF);
+ PutWindowTilemap(1);
+ CopyWindowToVram(1, 3);
+}
+
+void ClearTextWindow(void)
+{
+ rbox_fill_rectangle(1);
+ ClearWindowTilemap(1);
+ CopyWindowToVram(1, 1);
+}
+
+bool32 MG_PrintTextOnWindow1AndWaitButton(u8 *textState, const u8 *str)
+{
+ switch (*textState)
+ {
+ case 0:
+ AddTextPrinterToWindow1(str);
+ goto inc;
+ case 1:
+ DrawDownArrow(1, 0xD0, 0x14, 1, FALSE, &sDownArrowCounterAndYCoordIdx[0], &sDownArrowCounterAndYCoordIdx[1]);
+ if (JOY_NEW(A_BUTTON | B_BUTTON))
+ {
+ inc:
+ (*textState)++;
+ }
+ break;
+ case 2:
+ DrawDownArrow(1, 0xD0, 0x14, 1, TRUE, &sDownArrowCounterAndYCoordIdx[0], &sDownArrowCounterAndYCoordIdx[1]);
+ *textState = 0;
+ ClearTextWindow();
+ return TRUE;
+ case 0xFF:
+ *textState = 2;
+ break;
+ }
+ return FALSE;
+}
+
+void HideDownArrow(void)
+{
+ DrawDownArrow(1, 0xD0, 0x14, 1, FALSE, &sDownArrowCounterAndYCoordIdx[0], &sDownArrowCounterAndYCoordIdx[1]);
+}
+
+void ShowDownArrow(void)
+{
+ DrawDownArrow(1, 0xD0, 0x14, 1, TRUE, &sDownArrowCounterAndYCoordIdx[0], &sDownArrowCounterAndYCoordIdx[1]);
+}
+
+bool32 unref_HideDownArrowAndWaitButton(u8 * textState)
+{
+ switch (*textState)
+ {
+ case 0:
+ HideDownArrow();
+ if (JOY_NEW(A_BUTTON | B_BUTTON))
+ {
+ (*textState)++;
+ }
+ break;
+ case 1:
+ ShowDownArrow();
+ *textState = 0;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool32 PrintStringAndWait2Seconds(u8 * counter, const u8 * str)
+{
+ if (*counter == 0)
+ {
+ AddTextPrinterToWindow1(str);
+ }
+ if (++(*counter) > 120)
+ {
+ *counter = 0;
+ ClearTextWindow();
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+u32 MysteryGift_HandleThreeOptionMenu(u8 * unused0, u16 * unused1, u8 whichMenu)
+{
+ struct ListMenuTemplate listMenuTemplate = sListMenuTemplate_ThreeOptions;
+ struct WindowTemplate windowTemplate = sWindowTemplate_ThreeOptions;
+ u32 width;
+ s32 finalWidth;
+ s32 response;
+ u32 i;
+
+ if (whichMenu == 0)
+ {
+ listMenuTemplate.items = sListMenuItems_CardsOrNews;
+ }
+ else
+ {
+ listMenuTemplate.items = sListMenuItems_WirelessOrFriend;
+ }
+ width = 0;
+ for (i = 0; i < listMenuTemplate.totalItems; i++)
+ {
+ u32 curWidth = GetStringWidth(2, listMenuTemplate.items[i].unk_00, listMenuTemplate.lettersSpacing);
+ if (curWidth > width)
+ width = curWidth;
+ }
+ finalWidth = (((width + 9) / 8) + 2) & ~1;
+ windowTemplate.width = finalWidth;
+ windowTemplate.tilemapLeft = (30 - finalWidth) / 2;
+ response = DoMysteryGiftListMenu(&windowTemplate, &listMenuTemplate, 1, 0x00A, 0xE0);
+ if (response != -1)
+ {
+ ClearWindowTilemap(2);
+ CopyWindowToVram(2, 1);
+ }
+ return response;
+}
+
+s8 mevent_message_print_and_prompt_yes_no(u8 * textState, u16 * windowId, bool8 yesNoBoxPlacement, const u8 * str)
+{
+ struct WindowTemplate windowTemplate;
+ s8 input;
+
+ switch (*textState)
+ {
+ case 0:
+ StringExpandPlaceholders(gStringVar4, str);
+ if (yesNoBoxPlacement == 0)
+ {
+ *windowId = AddWindow(&sWindowTemplate_PromptYesOrNo_Width28);
+ }
+ else
+ {
+ *windowId = AddWindow(&sWindowTemplate_PromptYesOrNo_Width20);
+ }
+ FillWindowPixelBuffer(*windowId, 0x11);
+ AddTextPrinterParametrized2(*windowId, 2, 0, 2, 0, 2, &sMG_Ereader_TextColor_2, 0, gStringVar4);
+ DrawTextBorderOuter(*windowId, 0x001, 0x0F);
+ CopyWindowToVram(*windowId, 2);
+ PutWindowTilemap(*windowId);
+ (*textState)++;
+ break;
+ case 1:
+ windowTemplate = sWindowTemplate_YesNoBox;
+ if (yesNoBoxPlacement == 0)
+ {
+ windowTemplate.tilemapTop = 9;
+ }
+ else
+ {
+ windowTemplate.tilemapTop = 15;
+ }
+ sub_810FF60(&windowTemplate, 2, 0, 2, 10, 14, 0);
+ (*textState)++;
+ break;
+ case 2:
+ input = ProcessMenuInputNoWrap_();
+ if (input == -1 || input == 0 || input == 1)
+ {
+ *textState = 0;
+ rbox_fill_rectangle(*windowId);
+ ClearWindowTilemap(*windowId);
+ CopyWindowToVram(*windowId, 1);
+ RemoveWindow(*windowId);
+ return input;
+ }
+ break;
+ case 0xFF:
+ *textState = 0;
+ rbox_fill_rectangle(*windowId);
+ ClearWindowTilemap(*windowId);
+ CopyWindowToVram(*windowId, 1);
+ RemoveWindow(*windowId);
+ return -1;
+ }
+
+ return -2;
+}
+
+s32 HandleMysteryGiftListMenu(u8 * textState, u16 * windowId, bool32 cannotToss, bool32 cannotSend)
+{
+ struct WindowTemplate windowTemplate;
+ s32 input;
+
+ switch (*textState)
+ {
+ case 0:
+ if (cannotToss == 0)
+ {
+ StringExpandPlaceholders(gStringVar4, gText_WhatToDoWithCards);
+ }
+ else
+ {
+ StringExpandPlaceholders(gStringVar4, gText_WhatToDoWithNews);
+ }
+ *windowId = AddWindow(&sMysteryGiftMenuWindowTemplate);
+ FillWindowPixelBuffer(*windowId, 0x11);
+ AddTextPrinterParametrized2(*windowId, 2, 0, 2, 0, 2, &sMG_Ereader_TextColor_2, 0, gStringVar4);
+ DrawTextBorderOuter(*windowId, 0x001, 0x0F);
+ CopyWindowToVram(*windowId, 2);
+ PutWindowTilemap(*windowId);
+ (*textState)++;
+ break;
+ case 1:
+ windowTemplate = sWindowTemplate_YesNoBox;
+ if (cannotSend)
+ {
+ if (cannotToss == 0)
+ {
+ input = DoMysteryGiftListMenu(&sWindowTemplate_7by6, &sListMenu_ReceiveToss, 1, 0x00A, 0xE0);
+ }
+ else
+ {
+ input = DoMysteryGiftListMenu(&sWindowTemplate_7by4, &sListMenu_Receive, 1, 0x00A, 0xE0);
+ }
+ }
+ else
+ {
+ if (cannotToss == 0)
+ {
+ input = DoMysteryGiftListMenu(&sWindowTemplate_7by8, &sListMenu_ReceiveSendToss, 1, 0x00A, 0xE0);
+ }
+ else
+ {
+ input = DoMysteryGiftListMenu(&sWindowTemplate_7by6, &sListMenu_ReceiveSend, 1, 0x00A, 0xE0);
+ }
+ }
+ if (input != -1)
+ {
+ *textState = 0;
+ rbox_fill_rectangle(*windowId);
+ ClearWindowTilemap(*windowId);
+ CopyWindowToVram(*windowId, 1);
+ RemoveWindow(*windowId);
+ return input;
+ }
+ break;
+ case 0xFF:
+ *textState = 0;
+ rbox_fill_rectangle(*windowId);
+ ClearWindowTilemap(*windowId);
+ CopyWindowToVram(*windowId, 1);
+ RemoveWindow(*windowId);
+ return -2;
+ }
+
+ return -1;
+}
+
+bool32 ValidateCardOrNews(bool32 cardOrNews)
+{
+ if (cardOrNews == 0)
+ {
+ return ValidateReceivedWonderCard();
+ }
+ else
+ {
+ return ValidateReceivedWonderNews();
+ }
+}
+
+bool32 HandleLoadWonderCardOrNews(u8 * state, bool32 cardOrNews)
+{
+ s32 v0;
+
+ switch (*state)
+ {
+ case 0:
+ if (cardOrNews == 0)
+ {
+ InitWonderCardResources(GetSavedWonderCard(), sav1_get_mevent_buffer_2());
+ }
+ else
+ {
+ InitWonderNewsResources(GetSavedWonderNews());
+ }
+ (*state)++;
+ break;
+ case 1:
+ if (cardOrNews == 0)
+ {
+ v0 = FadeToWonderCardMenu();
+ check:
+ if (v0 != 0)
+ {
+ goto done;
+ }
+ break;
+ }
+ else
+ {
+ v0 = FadeToWonderNewsMenu();
+ goto check;
+ }
+ done:
+ *state = 0;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+bool32 DestroyNewsOrCard(bool32 cardOrNews)
+{
+ if (cardOrNews == 0)
+ {
+ DestroyWonderCard();
+ }
+ else
+ {
+ DestroyWonderNews();
+ }
+ return TRUE;
+}
+
+bool32 TearDownCardOrNews_ReturnToTopMenu(bool32 cardOrNews, bool32 arg1)
+{
+ if (cardOrNews == 0)
+ {
+ if (FadeOutFromWonderCard(arg1) != 0)
+ {
+ DestroyWonderCardResources();
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (FadeOutFromWonderNews(arg1) != 0)
+ {
+ DestroyWonderNewsResources();
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+ }
+}
+
+s32 mevent_message_prompt_discard(u8 * textState, u16 * windowId, bool32 cardOrNews)
+{
+ if (cardOrNews == 0)
+ {
+ return mevent_message_print_and_prompt_yes_no(textState, windowId, TRUE, gText_IfThrowAwayCardEventWontHappen);
+ }
+ else
+ {
+ return mevent_message_print_and_prompt_yes_no(textState, windowId, TRUE, gText_OkayToDiscardNews);
+ }
+}
+
+bool32 mevent_message_was_thrown_away(u8 * textState, bool32 cardOrNews)
+{
+ if (cardOrNews == 0)
+ {
+ return MG_PrintTextOnWindow1AndWaitButton(textState, gText_WonderCardThrownAway);
+ }
+ else
+ {
+ return MG_PrintTextOnWindow1AndWaitButton(textState, gText_WonderNewsThrownAway);
+ }
+}
+
+bool32 mevent_save_game(u8 * state)
+{
+ switch (*state)
+ {
+ case 0:
+ AddTextPrinterToWindow1(gText_DataWillBeSaved);
+ (*state)++;
+ break;
+ case 1:
+ TrySavingData(0);
+ (*state)++;
+ break;
+ case 2:
+ AddTextPrinterToWindow1(gText_SaveCompletedPressA);
+ (*state)++;
+ break;
+ case 3:
+ if (JOY_NEW(A_BUTTON | B_BUTTON))
+ {
+ (*state)++;
+ }
+ break;
+ case 4:
+ *state = 0;
+ ClearTextWindow();
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+const u8 * mevent_message(u32 * flag_p, u8 cardOrNews, u8 cardOrNewsSource, u32 msgId)
+{
+ const u8 * msg = NULL;
+ *flag_p = 0;
+
+ switch (msgId)
+ {
+ case 0:
+ *flag_p = 0;
+ msg = gText_NothingSentOver;
+ break;
+ case 1:
+ *flag_p = 0;
+ msg = gText_RecordUploadedViaWireless;
+ break;
+ case 2:
+ *flag_p = 1;
+ msg = cardOrNewsSource == 0 ? gText_WonderCardReceived : gText_WonderCardReceivedFrom;
+ break;
+ case 3:
+ *flag_p = 1;
+ msg = cardOrNewsSource == 0 ? gText_WonderNewsReceived : gText_WonderNewsReceivedFrom;
+ break;
+ case 4:
+ *flag_p = 1;
+ msg = gText_NewStampReceived;
+ break;
+ case 5:
+ *flag_p = 0;
+ msg = gText_AlreadyHadCard;
+ break;
+ case 6:
+ *flag_p = 0;
+ msg = gText_AlreadyHadStamp;
+ break;
+ case 7:
+ *flag_p = 0;
+ msg = gText_AlreadyHadNews;
+ break;
+ case 8:
+ *flag_p = 0;
+ msg = gText_NoMoreRoomForStamps;
+ break;
+ case 9:
+ *flag_p = 0;
+ msg = gText_CommunicationCanceled;
+ break;
+ case 10:
+ *flag_p = 0;
+ msg = cardOrNews == 0 ? gText_CantAcceptCardFromTrainer : gText_CantAcceptNewsFromTrainer;
+ break;
+ case 11:
+ *flag_p = 0;
+ msg = gText_CommunicationError;
+ break;
+ case 12:
+ *flag_p = 1;
+ msg = gText_NewTrainerReceived;
+ break;
+ case 13:
+ *flag_p = 1;
+ break;
+ case 14:
+ *flag_p = 0;
+ break;
+ }
+
+ return msg;
+}
+
+bool32 PrintMGSuccessMessage(u8 * state, const u8 * arg1, u16 * arg2)
+{
+ switch (*state)
+ {
+ case 0:
+ if (arg1 != NULL)
+ {
+ AddTextPrinterToWindow1(arg1);
+ }
+ PlayFanfare(MUS_FANFA4);
+ *arg2 = 0;
+ (*state)++;
+ break;
+ case 1:
+ if (++(*arg2) > 0xF0)
+ {
+ (*state)++;
+ }
+ break;
+ case 2:
+ if (IsFanfareTaskInactive())
+ {
+ *state = 0;
+ ClearTextWindow();
+ return TRUE;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+const u8 * mevent_message_stamp_card_etc_send_status(u32 * a0, u8 unused, u32 msgId)
+{
+ const u8 * result = gText_CommunicationError;
+ *a0 = 0;
+ switch (msgId)
+ {
+ case 0:
+ result = gText_NothingSentOver;
+ break;
+ case 1:
+ result = gText_RecordUploadedViaWireless;
+ break;
+ case 2:
+ result = gText_WonderCardSentTo;
+ *a0 = 1;
+ break;
+ case 3:
+ result = gText_WonderNewsSentTo;
+ *a0 = 1;
+ break;
+ case 4:
+ result = gText_StampSentTo;
+ break;
+ case 5:
+ result = gText_OtherTrainerHasCard;
+ break;
+ case 6:
+ result = gText_OtherTrainerHasStamp;
+ break;
+ case 7:
+ result = gText_OtherTrainerHasNews;
+ break;
+ case 8:
+ result = gText_NoMoreRoomForStamps;
+ break;
+ case 9:
+ result = gText_OtherTrainerCanceled;
+ break;
+ case 10:
+ result = gText_CantSendGiftToTrainer;
+ break;
+ case 11:
+ result = gText_CommunicationError;
+ break;
+ case 12:
+ result = gText_GiftSentTo;
+ break;
+ case 13:
+ result = gText_GiftSentTo;
+ break;
+ case 14:
+ result = gText_CantSendGiftToTrainer;
+ break;
+ }
+ return result;
+}
+
+bool32 PrintMGSendStatus(u8 * state, u16 * arg1, u8 arg2, u32 msgId)
+{
+ u32 flag;
+ const u8 * str = mevent_message_stamp_card_etc_send_status(&flag, arg2, msgId);
+ if (flag)
+ {
+ return PrintMGSuccessMessage(state, str, arg1);
+ }
+ else
+ {
+ return MG_PrintTextOnWindow1AndWaitButton(state, str);
+ }
+}
+
+void task_add_00_mystery_gift(void)
+{
+ u8 taskId = CreateTask(task00_mystery_gift, 0);
+ struct MysteryGiftTaskData * data = (void *)gTasks[taskId].data;
+ data->state = 0;
+ data->textState = 0;
+ data->unkA = 0;
+ data->unkB = 0;
+ data->IsCardOrNews = 0;
+ data->source = 0;
+ data->curPromptWindowId = 0;
+ data->unk2 = 0;
+ data->unk4 = 0;
+ data->unk6 = 0;
+ data->prevPromptWindowId = 0;
+ data->buffer = AllocZeroed(0x40);
+}
+
+void task00_mystery_gift(u8 taskId)
+{
+ struct MysteryGiftTaskData * data = (void *)gTasks[taskId].data;
+ u32 sp0;
+ const u8 * r1;
+
+ switch (data->state)
+ {
+ case 0:
+ data->state = 1;
+ break;
+ case 1:
+ switch (MysteryGift_HandleThreeOptionMenu(&data->textState, &data->curPromptWindowId, FALSE))
+ {
+ case 0:
+ data->IsCardOrNews = 0;
+ if (ValidateReceivedWonderCard() == TRUE)
+ {
+ data->state = 18;
+ }
+ else
+ {
+ data->state = 2;
+ }
+ break;
+ case 1:
+ data->IsCardOrNews = 1;
+ if (ValidateReceivedWonderNews() == TRUE)
+ {
+ data->state = 18;
+ }
+ else
+ {
+ data->state = 2;
+ }
+ break;
+ case -2u:
+ data->state = 37;
+ break;
+ }
+ break;
+ case 2:
+ {
+ if (data->IsCardOrNews == 0)
+ {
+ if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, gText_DontHaveCardNewOneInput))
+ {
+ data->state = 3;
+ PrintMysteryGiftOrEReaderTopMenu(0, 1);
+ }
+ }
+ else
+ {
+ if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, gText_DontHaveNewsNewOneInput))
+ {
+ data->state = 3;
+ PrintMysteryGiftOrEReaderTopMenu(0, 1);
+ }
+ }
+ break;
+ }
+ case 3:
+ if (data->IsCardOrNews == 0)
+ {
+ AddTextPrinterToWindow1(gText_WhereShouldCardBeAccessed);
+ }
+ else
+ {
+ AddTextPrinterToWindow1(gText_WhereShouldNewsBeAccessed);
+ }
+ data->state = 4;
+ break;
+ case 4:
+ switch (MysteryGift_HandleThreeOptionMenu(&data->textState, &data->curPromptWindowId, TRUE))
+ {
+ case 0:
+ ClearTextWindow();
+ data->state = 5;
+ data->source = 0;
+ break;
+ case 1:
+ ClearTextWindow();
+ data->state = 5;
+ data->source = 1;
+ break;
+ case -2u:
+ ClearTextWindow();
+ if (ValidateCardOrNews(data->IsCardOrNews))
+ {
+ data->state = 18;
+ }
+ else
+ {
+ data->state = 0;
+ PrintMysteryGiftOrEReaderTopMenu(0, 0);
+ }
+ break;
+ }
+ break;
+ case 5:
+ {
+ register u8 eos asm("r1");
+ gStringVar1[0] = (eos = EOS);
+ gStringVar2[0] = eos;
+ gStringVar3[0] = eos;
+ }
+ switch (data->IsCardOrNews)
+ {
+ case 0:
+ if (data->source == 1)
+ {
+ MEvent_CreateTask_CardOrNewsWithFriend(0x15);
+ }
+ else if (data->source == 0)
+ {
+ MEvent_CreateTask_CardOrNewsOverWireless(0x15);
+ }
+ break;
+ case 1:
+ if (data->source == 1)
+ {
+ MEvent_CreateTask_CardOrNewsWithFriend(0x16);
+ }
+ else if (data->source == 0)
+ {
+ MEvent_CreateTask_CardOrNewsOverWireless(0x16);
+ }
+ break;
+ }
+ data->state = 6;
+ break;
+ case 6:
+ if (gReceivedRemoteLinkPlayers != 0)
+ {
+ ClearScreenInBg0(TRUE);
+ data->state = 7;
+ mevent_client_do_init();
+ }
+ else if (gSpecialVar_Result == 5)
+ {
+ ClearScreenInBg0(TRUE);
+ data->state = 3;
+ }
+ break;
+ case 7:
+ AddTextPrinterToWindow1(gText_Communicating);
+ data->state = 8;
+ break;
+ case 8:
+ switch (mevent_client_do_exec(&data->curPromptWindowId))
+ {
+ case 6:
+ task_add_05_task_del_08FA224_when_no_RfuFunc();
+ data->prevPromptWindowId = data->curPromptWindowId;
+ data->state = 13;
+ break;
+ case 5:
+ memcpy(data->buffer, mevent_client_get_buffer(), 0x40);
+ mevent_client_inc_flag();
+ break;
+ case 3:
+ data->state = 10;
+ break;
+ case 2:
+ data->state = 9;
+ break;
+ case 4:
+ data->state = 11;
+ StringCopy(gStringVar1, gLinkPlayers[0].name);
+ break;
+ }
+ break;
+ case 9:
+ switch ((u32)mevent_message_print_and_prompt_yes_no(&data->textState, &data->curPromptWindowId, FALSE, mevent_client_get_buffer()))
+ {
+ case 0:
+ mevent_client_set_param(0);
+ mevent_client_inc_flag();
+ data->state = 7;
+ break;
+ case 1:
+ mevent_client_set_param(1);
+ mevent_client_inc_flag();
+ data->state = 7;
+ break;
+ case -1u:
+ mevent_client_set_param(1);
+ mevent_client_inc_flag();
+ data->state = 7;
+ break;
+ }
+ break;
+ case 10:
+ if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, mevent_client_get_buffer()))
+ {
+ mevent_client_inc_flag();
+ data->state = 7;
+ }
+ break;
+ case 11:
+ switch ((u32)mevent_message_print_and_prompt_yes_no(&data->textState, &data->curPromptWindowId, FALSE, gText_ThrowAwayWonderCard))
+ {
+ case 0:
+ if (CheckReceivedGiftFromWonderCard() == TRUE)
+ {
+ data->state = 12;
+ }
+ else
+ {
+ mevent_client_set_param(0);
+ mevent_client_inc_flag();
+ data->state = 7;
+ }
+ break;
+ case 1:
+ mevent_client_set_param(1);
+ mevent_client_inc_flag();
+ data->state = 7;
+ break;
+ case -1u:
+ mevent_client_set_param(1);
+ mevent_client_inc_flag();
+ data->state = 7;
+ break;
+ }
+ break;
+ case 12:
+ switch ((u32)mevent_message_print_and_prompt_yes_no(&data->textState, &data->curPromptWindowId, FALSE, gText_HaventReceivedCardsGift))
+ {
+ case 0:
+ mevent_client_set_param(0);
+ mevent_client_inc_flag();
+ data->state = 7;
+ break;
+ case 1:
+ mevent_client_set_param(1);
+ mevent_client_inc_flag();
+ data->state = 7;
+ break;
+ case -1u:
+ mevent_client_set_param(1);
+ mevent_client_inc_flag();
+ data->state = 7;
+ break;
+ }
+ break;
+ case 13:
+ if (IsNoOneConnected())
+ {
+ DestroyWirelessStatusIndicatorSprite();
+ data->state = 14;
+ }
+ break;
+ case 14:
+ if (PrintStringAndWait2Seconds(&data->textState, gText_CommunicationCompleted))
+ {
+ if (data->source == 1)
+ {
+ StringCopy(gStringVar1, gLinkPlayers[0].name);
+ }
+ data->state = 15;
+ }
+ break;
+ case 15:
+ {
+ register bool32 flag asm("r1");
+ r1 = mevent_message(&sp0, data->IsCardOrNews, data->source, data->prevPromptWindowId);
+ if (r1 == NULL)
+ {
+ r1 = data->buffer;
+ }
+ if (sp0)
+ {
+ flag = PrintMGSuccessMessage(&data->textState, r1, &data->curPromptWindowId);
+ }
+ else
+ {
+ flag = MG_PrintTextOnWindow1AndWaitButton(&data->textState, r1);
+ }
+ if (flag)
+ {
+ if (data->prevPromptWindowId == 3)
+ {
+ if (data->source == 1)
+ {
+ GenerateRandomNews(1);
+ }
+ else
+ {
+ GenerateRandomNews(2);
+ }
+ }
+ if (sp0 == 0)
+ {
+ data->state = 0;
+ PrintMysteryGiftOrEReaderTopMenu(0, 0);
+ }
+ else
+ {
+ data->state = 17;
+ }
+ }
+ break;
+ }
+ case 16:
+ if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, gText_CommunicationError))
+ {
+ data->state = 0;
+ PrintMysteryGiftOrEReaderTopMenu(0, 0);
+ }
+ break;
+ case 17:
+ if (mevent_save_game(&data->textState))
+ {
+ data->state = 0;
+ PrintMysteryGiftOrEReaderTopMenu(0, 0);
+ }
+ break;
+ case 18:
+ if (HandleLoadWonderCardOrNews(&data->textState, data->IsCardOrNews))
+ {
+ data->state = 20;
+ }
+ break;
+ case 20:
+ if (data->IsCardOrNews == 0)
+ {
+ if (JOY_NEW(A_BUTTON))
+ {
+ data->state = 21;
+ }
+ if (JOY_NEW(B_BUTTON))
+ {
+ data->state = 27;
+ }
+ }
+ else
+ {
+ switch (MENews_GetInput(gMain.newKeys))
+ {
+ case 0:
+ MENews_RemoveScrollIndicatorArrowPair();
+ data->state = 21;
+ break;
+ case 1:
+ data->state = 27;
+ break;
+ }
+ }
+ break;
+ case 21:
+ {
+ u32 result;
+ if (data->IsCardOrNews == 0)
+ {
+ if (WonderCard_Test_Unk_08_6())
+ {
+ result = HandleMysteryGiftListMenu(&data->textState, &data->curPromptWindowId, data->IsCardOrNews, FALSE);
+ }
+ else
+ {
+ result = HandleMysteryGiftListMenu(&data->textState, &data->curPromptWindowId, data->IsCardOrNews, TRUE);
+ }
+ }
+ else
+ {
+ if (WonderNews_Test_Unk_02())
+ {
+ result = HandleMysteryGiftListMenu(&data->textState, &data->curPromptWindowId, data->IsCardOrNews, FALSE);
+ }
+ else
+ {
+ result = HandleMysteryGiftListMenu(&data->textState, &data->curPromptWindowId, data->IsCardOrNews, TRUE);
+ }
+ }
+ switch (result)
+ {
+ case 0:
+ data->state = 28;
+ break;
+ case 1:
+ data->state = 29;
+ break;
+ case 2:
+ data->state = 22;
+ break;
+ case -2u:
+ if (data->IsCardOrNews == 1)
+ {
+ MENews_AddScrollIndicatorArrowPair();
+ }
+ data->state = 20;
+ break;
+ }
+ break;
+ }
+ case 22:
+ switch (mevent_message_prompt_discard(&data->textState, &data->curPromptWindowId, data->IsCardOrNews))
+ {
+ case 0:
+ if (data->IsCardOrNews == 0 && CheckReceivedGiftFromWonderCard() == TRUE)
+ {
+ data->state = 23;
+ }
+ else
+ {
+ data->state = 24;
+ }
+ break;
+ case 1:
+ data->state = 21;
+ break;
+ case -1:
+ data->state = 21;
+ break;
+ }
+ break;
+ case 23:
+ switch ((u32)mevent_message_print_and_prompt_yes_no(&data->textState, &data->curPromptWindowId, TRUE, gText_HaventReceivedGiftOkayToDiscard))
+ {
+ case 0:
+ data->state = 24;
+ break;
+ case 1:
+ data->state = 21;
+ break;
+ case -1u:
+ data->state = 21;
+ break;
+ }
+ break;
+ case 24:
+ if (TearDownCardOrNews_ReturnToTopMenu(data->IsCardOrNews, 1))
+ {
+ DestroyNewsOrCard(data->IsCardOrNews);
+ data->state = 25;
+ }
+ break;
+ case 25:
+ if (mevent_save_game(&data->textState))
+ {
+ data->state = 26;
+ }
+ break;
+ case 26:
+ if (mevent_message_was_thrown_away(&data->textState, data->IsCardOrNews))
+ {
+ data->state = 0;
+ PrintMysteryGiftOrEReaderTopMenu(0, 0);
+ }
+ break;
+ case 27:
+ if (TearDownCardOrNews_ReturnToTopMenu(data->IsCardOrNews, 0))
+ {
+ data->state = 0;
+ }
+ break;
+ case 28:
+ if (TearDownCardOrNews_ReturnToTopMenu(data->IsCardOrNews, 1))
+ {
+ data->state = 3;
+ }
+ break;
+ case 29:
+ if (TearDownCardOrNews_ReturnToTopMenu(data->IsCardOrNews, 1))
+ {
+ switch (data->IsCardOrNews)
+ {
+ case 0:
+ MEvent_CreateTask_Leader(21);
+ break;
+ case 1:
+ MEvent_CreateTask_Leader(22);
+ break;
+ }
+ data->source = 1;
+ data->state = 30;
+ }
+ break;
+ case 30:
+ if (gReceivedRemoteLinkPlayers != 0)
+ {
+ ClearScreenInBg0(1);
+ data->state = 31;
+ }
+ else if (gSpecialVar_Result == 5)
+ {
+ ClearScreenInBg0(1);
+ data->state = 18;
+ }
+ break;
+ case 31:
+ {
+ register u8 eos asm("r1");
+ gStringVar1[0] = (eos = EOS);
+ gStringVar2[0] = eos;
+ gStringVar3[0] = eos;
+ }
+ if (data->IsCardOrNews == 0)
+ {
+ AddTextPrinterToWindow1(gText_SendingWonderCard);
+ mevent_srv_new_wcard();
+ }
+ else
+ {
+ AddTextPrinterToWindow1(gText_SendingWonderNews);
+ mevent_srv_init_wnews();
+ }
+ data->state = 32;
+ break;
+ case 32:
+ if (mevent_srv_common_do_exec(&data->curPromptWindowId) == 3)
+ {
+ data->prevPromptWindowId = data->curPromptWindowId;
+ data->state = 33;
+ }
+ break;
+ case 33:
+ task_add_05_task_del_08FA224_when_no_RfuFunc();
+ StringCopy(gStringVar1, gLinkPlayers[1].name);
+ data->state = 34;
+ break;
+ case 34:
+ if (IsNoOneConnected())
+ {
+ DestroyWirelessStatusIndicatorSprite();
+ data->state = 35;
+ }
+ break;
+ case 35:
+ if (PrintMGSendStatus(&data->textState, &data->curPromptWindowId, data->source, data->prevPromptWindowId))
+ {
+ if (data->source == 1 && data->prevPromptWindowId == 3)
+ {
+ GenerateRandomNews(3);
+ data->state = 17;
+ }
+ else
+ {
+ data->state = 0;
+ PrintMysteryGiftOrEReaderTopMenu(0, 0);
+ }
+ }
+ break;
+ case 36:
+ if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, gText_CommunicationError))
+ {
+ data->state = 0;
+ PrintMysteryGiftOrEReaderTopMenu(0, 0);
+ }
+ break;
+ case 37:
+ CloseLink();
+ sub_812B484();
+ Free(data->buffer);
+ DestroyTask(taskId);
+ SetMainCallback2(MainCB_FreeAllBuffersAndReturnToInitTitleScreen);
+ break;
+ }
+}
+
+u16 GetMysteryGiftBaseBlock(void)
+{
+ return 0x19B;
+}
diff --git a/src/script.c b/src/script.c
index d7246752c..608dc6ba0 100644
--- a/src/script.c
+++ b/src/script.c
@@ -9,7 +9,7 @@ extern u8 gUnknown_203ADFA;
extern void sub_80CBDE8(void); // field_specials
extern u16 CalcCRC16WithTable(u8 *data, int length); // util
-extern bool32 sub_8143FC8(void); // mevent
+extern bool32 ValidateReceivedWonderCard(void); // mevent
enum
{
@@ -525,7 +525,7 @@ bool32 sub_8069DFC(void)
u8 *sub_8069E48(void)
{
struct RamScriptData *scriptData = &gSaveBlock1Ptr->ramScript.data;
- if (!sub_8143FC8())
+ if (!ValidateReceivedWonderCard())
return NULL;
if (scriptData->magic != RAM_SCRIPT_MAGIC)
return NULL;
diff --git a/src/seagallop.c b/src/seagallop.c
new file mode 100644
index 000000000..585838607
--- /dev/null
+++ b/src/seagallop.c
@@ -0,0 +1,460 @@
+#include "global.h"
+#include "gpu_regs.h"
+#include "bg.h"
+#include "palette.h"
+#include "malloc.h"
+#include "scanline_effect.h"
+#include "battle_dome_cards.h"
+#include "window.h"
+#include "text_window.h"
+#include "sound.h"
+#include "task.h"
+#include "help_system.h"
+#include "overworld.h"
+#include "event_data.h"
+#include "field_fadetransition.h"
+#include "field_weather.h"
+#include "constants/songs.h"
+#include "constants/maps.h"
+#include "seagallop.h"
+
+#define TILESTAG_FERRY 3000
+#define TILESTAG_WAKE 4000
+
+#define PALTAG_FERRY_WAKE 3000
+
+static EWRAM_DATA void * sBg3TilemapBuffer = NULL;
+
+static void CB2_SetUpSeaGallopScene(void);
+static void VBlankCB_SeaGallop(void);
+static void MainCB2_SeaGallop(void);
+static void Task_SeaGallop_0(u8 taskId);
+static void Task_SeaGallop_1(u8 taskId);
+static void Task_SeaGallop_2(u8 taskId);
+static void Task_SeaGallop_3(void);
+static void ResetGPU(void);
+static void ResetAllAssets(void);
+static void SetDispcnt(void);
+static void ResetBGPos(void);
+static void LoadFerrySpriteResources(void);
+static void FreeFerrySpriteResources(void);
+static void CreateFerrySprite(void);
+static void SpriteCB_Ferry(struct Sprite * sprite);
+static void CreateWakeSprite(s16 x);
+static void SpriteCB_Wake(struct Sprite * sprite);
+static bool8 GetDirectionOfTravel(void);
+
+static const u16 sWaterTiles[] = INCBIN_U16("data/seagallop/water.4bpp");
+static const u16 sWaterPal[] = INCBIN_U16("data/seagallop/water.gbapal");
+static const u16 sWaterTilemap_WB[] = INCBIN_U16("data/seagallop/wb_tilemap.bin");
+static const u16 sWaterTilemap_EB[] = INCBIN_U16("data/seagallop/eb_tilemap.bin");
+static const u16 sFerrySpriteTiles[] = INCBIN_U16("data/seagallop/ferry_sprite.4bpp");
+static const u16 sFerryAndWakePal[] = INCBIN_U16("data/seagallop/ferry_and_wake.gbapal");
+static const u16 sWakeSpriteTiles[] = INCBIN_U16("data/seagallop/wake.4bpp");
+
+static const struct BgTemplate sBGTemplates[] = {
+ {
+ .bg = 3,
+ .charBaseIndex = 3,
+ .mapBaseIndex = 30,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0x000
+ }
+};
+
+static const s8 sSeaGallopSpawnTable[][4] = {
+ // Map X Y
+ [SEAGALLOP_VERMILION_CITY] = {MAP(VERMILIONCITY), 0x17, 0x20},
+ [SEAGALLOP_ONE_ISLAND] = {MAP(ONEISLAND_HARBOR), 0x08, 0x05},
+ [SEAGALLOP_TWO_ISLAND] = {MAP(TWOISLAND_HARBOR), 0x08, 0x05},
+ [SEAGALLOP_THREE_ISLAND] = {MAP(THREEISLAND_HARBOR), 0x08, 0x05},
+ [SEAGALLOP_FOUR_ISLAND] = {MAP(FOURISLAND_HARBOR), 0x08, 0x05},
+ [SEAGALLOP_FIVE_ISLAND] = {MAP(FIVEISLAND_HARBOR), 0x08, 0x05},
+ [SEAGALLOP_SIX_ISLAND] = {MAP(SIXISLAND_HARBOR), 0x08, 0x05},
+ [SEAGALLOP_SEVEN_ISLAND] = {MAP(SEVENISLAND_HARBOR), 0x08, 0x05},
+ [SEAGALLOP_CINNABAR_ISLAND] = {MAP(CINNABARISLAND), 0x15, 0x07},
+ [SEAGALLOP_NAVEL_ROCK] = {MAP(NAVELROCK_HARBOR), 0x08, 0x05},
+ [SEAGALLOP_BIRTH_ISLAND] = {MAP(BIRTHISLAND_HARBOR), 0x08, 0x05}
+};
+
+// Bitpacked array. In the commented section, right-most bit is the
+// flag for traveling from (row port) to Vermilion City, and so on.
+// Flags follow these enums:
+
+enum TravelDirections
+{
+ DIRN_WESTBOUND = 0,
+ DIRN_EASTBOUND = 1
+};
+
+static const u16 sTravelDirectionMatrix[] = {
+ [SEAGALLOP_VERMILION_CITY] = 0x6fe, // 11011111110
+ [SEAGALLOP_ONE_ISLAND] = 0x6fc, // 11011111100
+ [SEAGALLOP_TWO_ISLAND] = 0x6f8, // 11011111000
+ [SEAGALLOP_THREE_ISLAND] = 0x6f0, // 11011110000
+ [SEAGALLOP_FOUR_ISLAND] = 0x6e0, // 11011100000
+ [SEAGALLOP_FIVE_ISLAND] = 0x4c0, // 10011000000
+ [SEAGALLOP_SIX_ISLAND] = 0x400, // 10000000000
+ [SEAGALLOP_SEVEN_ISLAND] = 0x440, // 10001000000
+ [SEAGALLOP_CINNABAR_ISLAND] = 0x7ff, // 11111111111
+ [SEAGALLOP_NAVEL_ROCK] = 0x6e0, // 11011100000
+ [SEAGALLOP_BIRTH_ISLAND] = 0x000 // 00000000000
+};
+
+static const union AnimCmd sSpriteAnims_Ferry_WB[] = {
+ ANIMCMD_FRAME(0, 10),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnims_Ferry_EB[] = {
+ ANIMCMD_FRAME(0, 10, .hFlip = TRUE),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_Ferry[] = {
+ sSpriteAnims_Ferry_WB,
+ sSpriteAnims_Ferry_EB
+};
+
+static const struct OamData sOamData_Ferry = {
+ .size = 3
+};
+
+static const struct SpriteTemplate sFerrySpriteTemplate = {
+ TILESTAG_FERRY,
+ PALTAG_FERRY_WAKE,
+ &sOamData_Ferry,
+ sSpriteAnimTable_Ferry,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ SpriteCB_Ferry
+};
+
+static const struct SpriteSheet sFerryAndWakeSpriteSheets[] = {
+ {(const void *)sWakeSpriteTiles, sizeof(sWakeSpriteTiles), TILESTAG_WAKE},
+ {(const void *)sFerrySpriteTiles, sizeof(sFerrySpriteTiles), TILESTAG_FERRY},
+ {}
+};
+
+static const struct SpritePalette sFerryAndWakeSpritePalettes[] = {
+ {sFerryAndWakePal, PALTAG_FERRY_WAKE},
+ {}
+};
+
+static const union AnimCmd sSpriteAnims_Wake_WB[] = {
+ ANIMCMD_FRAME(0x00, 0x14),
+ ANIMCMD_FRAME(0x10, 0x14),
+ ANIMCMD_FRAME(0x20, 0x0f),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnims_Wake_EB[] = {
+ ANIMCMD_FRAME(0x00, 0x14, .hFlip = TRUE),
+ ANIMCMD_FRAME(0x10, 0x14, .hFlip = TRUE),
+ ANIMCMD_FRAME(0x20, 0x0f, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sSpriteAnimTable_Wake[] = {
+ sSpriteAnims_Wake_WB,
+ sSpriteAnims_Wake_EB
+};
+
+static const struct OamData sOamData_Wake = {
+ .size = 2
+};
+
+static const struct SpriteTemplate sWakeSpriteTemplate = {
+ TILESTAG_WAKE,
+ PALTAG_FERRY_WAKE,
+ &sOamData_Wake,
+ sSpriteAnimTable_Wake,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ SpriteCB_Wake
+};
+
+void ScrSpecial_SeaGallopFerry(void)
+{
+ SetVBlankCallback(NULL);
+ sub_812B478();
+ SetMainCallback2(CB2_SetUpSeaGallopScene);
+}
+
+static void CB2_SetUpSeaGallopScene(void)
+{
+ void ** ptr;
+ switch (gMain.state)
+ {
+ case 0:
+ SetVBlankCallback(NULL); // redundant since the setup routine already did this
+ ResetGPU();
+ gMain.state++;
+ break;
+ case 1:
+ ResetAllAssets();
+ gMain.state++;
+ break;
+ case 2:
+ ptr = &sBg3TilemapBuffer;
+ *ptr = AllocZeroed(0x800);
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, sBGTemplates, NELEMS(sBGTemplates));
+ SetBgTilemapBuffer(3, *ptr);
+ ResetBGPos();
+ gMain.state++;
+ break;
+ case 3:
+ LoadBgTiles(3, sWaterTiles, sizeof(sWaterTiles), 0);
+ if (GetDirectionOfTravel() == DIRN_EASTBOUND)
+ {
+ CopyToBgTilemapBufferRect(3, sWaterTilemap_EB, 0, 0, 32, 32);
+ }
+ else
+ {
+ CopyToBgTilemapBufferRect(3, sWaterTilemap_WB, 0, 0, 32, 32);
+ }
+ LoadPalette(sWaterPal, 0x40, 0x20);
+ LoadPalette(stdpal_get(2), 0xF0, 0x20);
+ gMain.state++;
+ break;
+ case 4:
+ if (IsDma3ManagerBusyWithBgCopy() != DIRN_EASTBOUND)
+ {
+ ShowBg(0);
+ ShowBg(3);
+ CopyBgTilemapBufferToVram(3);
+ gMain.state++;
+ }
+ break;
+ case 5:
+ LoadFerrySpriteResources();
+ BlendPalettes(0xFFFFFFFF, 16, RGB_BLACK);
+ gMain.state++;
+ break;
+ case 6:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ gMain.state++;
+ break;
+ case 7:
+ SetDispcnt();
+ SetVBlankCallback(VBlankCB_SeaGallop);
+ PlaySE(SE_NAMINORI);
+ CreateFerrySprite();
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ SetGpuReg(REG_OFFSET_WININ, 0x3F);
+ SetGpuReg(REG_OFFSET_WINOUT, 0x00);
+ SetGpuReg(REG_OFFSET_WIN0H, 0x00F0);
+ SetGpuReg(REG_OFFSET_WIN0V, 0x1888);
+ CreateTask(Task_SeaGallop_0, 8);
+ SetMainCallback2(MainCB2_SeaGallop);
+ gMain.state = 0;
+ break;
+ }
+}
+
+static void VBlankCB_SeaGallop(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+static void MainCB2_SeaGallop(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void Task_SeaGallop_0(u8 taskId)
+{
+ gTasks[taskId].func = Task_SeaGallop_1;
+}
+
+static void ScrollBG(void)
+{
+ if (GetDirectionOfTravel() == DIRN_EASTBOUND)
+ {
+ ChangeBgX(3, 0x600, 1);
+ }
+ else
+ {
+ ChangeBgX(3, 0x600, 2);
+ }
+}
+
+static void Task_SeaGallop_1(u8 taskId)
+{
+ struct Task * task = &gTasks[taskId];
+
+ ScrollBG();
+ if (++task->data[1] == 140)
+ {
+ Overworld_FadeOutMapMusic();
+ sub_807DC18();
+ task->func = Task_SeaGallop_2;
+ }
+}
+
+static void Task_SeaGallop_2(u8 taskId)
+{
+ ScrollBG();
+ if (sub_8055FC4() && !gPaletteFade.active)
+ {
+ Task_SeaGallop_3();
+ sub_812B484();
+ DestroyTask(taskId);
+ }
+}
+
+static void Task_SeaGallop_3(void)
+{
+ const s8 * warpInfo;
+
+ if (gSpecialVar_0x8006 >= NELEMS(sSeaGallopSpawnTable))
+ gSpecialVar_0x8006 = 0;
+
+ warpInfo = sSeaGallopSpawnTable[gSpecialVar_0x8006];
+ Overworld_SetWarpDestination(warpInfo[0], warpInfo[1], -1, warpInfo[2], warpInfo[3]);
+ play_some_sound();
+ PlaySE(SE_KAIDAN);
+ gUnknown_3005020 = sub_807DF64;
+ warp_in();
+ SetMainCallback2(sub_805671C);
+ ResetInitialPlayerAvatarState();
+ FreeFerrySpriteResources();
+ Free(sBg3TilemapBuffer);
+ FreeAllWindowBuffers();
+}
+
+static void ResetGPU(void)
+{
+ void * dest = (void *) VRAM;
+ DmaClearLarge16(3, dest, VRAM_SIZE, 0x1000);
+
+ DmaClear32(3, (void *)OAM, OAM_SIZE);
+ DmaClear16(3, (void *)PLTT, PLTT_SIZE);
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ SetGpuReg(REG_OFFSET_BG0CNT, 0);
+ SetGpuReg(REG_OFFSET_BG0HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1CNT, 0);
+ SetGpuReg(REG_OFFSET_BG1HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2CNT, 0);
+ SetGpuReg(REG_OFFSET_BG2HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG3CNT, 0);
+ SetGpuReg(REG_OFFSET_BG3HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG3VOFS, 0);
+ SetGpuReg(REG_OFFSET_WIN0H, 0);
+ SetGpuReg(REG_OFFSET_WIN0V, 0);
+ SetGpuReg(REG_OFFSET_WININ, 0);
+ SetGpuReg(REG_OFFSET_WINOUT, 0);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+}
+
+static void ResetAllAssets(void)
+{
+ ScanlineEffect_Stop();
+ ResetTasks();
+ ResetSpriteData();
+ dp13_810BB8C();
+ ResetPaletteFade();
+ FreeAllSpritePalettes();
+}
+
+static void SetDispcnt(void)
+{
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON);
+}
+
+static void ResetBGPos(void)
+{
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ ChangeBgX(2, 0, 0);
+ ChangeBgY(2, 0, 0);
+ ChangeBgX(3, 0, 0);
+ ChangeBgY(3, 0, 0);
+}
+
+static void LoadFerrySpriteResources(void)
+{
+ LoadSpriteSheets(sFerryAndWakeSpriteSheets);
+ LoadSpritePalettes(sFerryAndWakeSpritePalettes);
+}
+
+static void FreeFerrySpriteResources(void)
+{
+ FreeSpriteTilesByTag(TILESTAG_FERRY);
+ FreeSpriteTilesByTag(TILESTAG_WAKE);
+ FreeSpritePaletteByTag(PALTAG_FERRY_WAKE);
+}
+
+static void CreateFerrySprite(void)
+{
+ u8 spriteId = CreateSprite(&sFerrySpriteTemplate, 0, 92, 0);
+ gSprites[spriteId].data[0] = 48;
+ if (GetDirectionOfTravel() == DIRN_EASTBOUND)
+ {
+ StartSpriteAnim(&gSprites[spriteId], 1);
+ }
+ else
+ {
+ gSprites[spriteId].pos1.x = 240;
+ gSprites[spriteId].data[0] *= -1;
+ }
+}
+
+static void SpriteCB_Ferry(struct Sprite * sprite)
+{
+ sprite->data[1] += sprite->data[0];
+ sprite->pos2.x = sprite->data[1] >> 4;
+ if (sprite->data[2] % 5 == 0)
+ {
+ CreateWakeSprite(sprite->pos1.x + sprite->pos2.x);
+ }
+ sprite->data[2]++;
+ if ((u16)(300 + sprite->pos2.x) > 600)
+ {
+ DestroySprite(sprite);
+ }
+}
+
+static void CreateWakeSprite(s16 x)
+{
+ u8 spriteId = CreateSprite(&sWakeSpriteTemplate, x, 92, 8);
+ if (spriteId != MAX_SPRITES)
+ {
+ if (GetDirectionOfTravel() == DIRN_EASTBOUND)
+ {
+ StartSpriteAnim(&gSprites[spriteId], 1);
+ }
+ }
+}
+
+static void SpriteCB_Wake(struct Sprite * sprite)
+{
+ if (sprite->animEnded)
+ {
+ DestroySprite(sprite);
+ }
+}
+
+static bool8 GetDirectionOfTravel(void)
+{
+ if (gSpecialVar_0x8004 >= NELEMS(sTravelDirectionMatrix))
+ {
+ return DIRN_EASTBOUND;
+ }
+ return (sTravelDirectionMatrix[gSpecialVar_0x8004] >> gSpecialVar_0x8006) & 1;
+}
diff --git a/src/text.c b/src/text.c
index d74d77e2f..34ceb92d4 100644
--- a/src/text.c
+++ b/src/text.c
@@ -5,13 +5,13 @@
#include "window.h"
#include "text.h"
#include "sprite.h"
+#include "blit.h"
extern u8 gGlyphInfo[0x90];
extern u8 gUnknown_203ADFA;
extern u16 gTMCaseMainWindowPalette[];
extern const struct OamData gOamData_83AC9D0;
-extern void FillBitmapRect4Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue);
extern void FillWindowPixelRect(u8 windowId, u8 fillValue, u16 x, u16 y, u16 width, u16 height);
extern void BlitBitmapRectToWindow(u8 windowId, const u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight);
extern u8 GetKeypadIconWidth(u8 keypadIconId);
diff --git a/src/window.c b/src/window.c
index 71cfa6898..c4ea49956 100644
--- a/src/window.c
+++ b/src/window.c
@@ -2,17 +2,13 @@
#include "window.h"
#include "malloc.h"
#include "bg.h"
+#include "blit.h"
u8 gWindowClearTile;
void *gWindowBgTilemapBuffers[4];
EWRAM_DATA struct Window gWindows[WINDOWS_MAX] = {0};
-extern void BlitBitmapRect4Bit(struct Bitmap *src, struct Bitmap *dest, u16 srcX, u16 srcY, u16 destX, u16 destY, u16 width, u16 height, u8 colorKey);
-extern void BlitBitmapRect4BitTo8Bit(struct Bitmap *src, struct Bitmap *dest, u16 srcX, u16 srcY, u16 destX, u16 destY, u16 width, u16 height, u8 colorKey, u8 paletteNum);
-extern void FillBitmapRect4Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue);
-extern void FillBitmapRect8Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue);
-
static u8 GetNumActiveWindowsOnBg(u8 bgId);
static const struct WindowTemplate sDummyWindowTemplate = {0xFF, 0, 0, 0, 0, 0, 0};
diff --git a/src/window_8bpp.c b/src/window_8bpp.c
index 5eac3c558..8e5d19565 100644
--- a/src/window_8bpp.c
+++ b/src/window_8bpp.c
@@ -2,13 +2,11 @@
#include "window.h"
#include "malloc.h"
#include "bg.h"
+#include "blit.h"
EWRAM_DATA static struct Window* sWindowPtr = NULL;
EWRAM_DATA static u16 sWindowSize = 0;
-extern void BlitBitmapRect4BitTo8Bit(struct Bitmap *src, struct Bitmap *dest, u16 srcX, u16 srcY, u16 destX, u16 destY, u16 width, u16 height, u8 colorKey, u8 paletteNum);
-extern void FillBitmapRect8Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue);
-
static u8 GetNumActiveWindowsOnBg8Bit(u8 bgId);
static void nullsub_9(void)
diff --git a/sym_common.txt b/sym_common.txt
index 1e4d50314..7424575e8 100644
--- a/sym_common.txt
+++ b/sym_common.txt
@@ -347,7 +347,7 @@ gUnknown_3005EF8: @ 3005EF8
gUnknown_3005F00: @ 3005F00
.space 0x50
- .include "m4a_2.o"
+ .include "m4a.o"
.include "agb_flash.o"
gRfuState: @ 3007438
diff --git a/sym_ewram.txt b/sym_ewram.txt
index 56b7300e1..b2e83dd69 100644
--- a/sym_ewram.txt
+++ b/sym_ewram.txt
@@ -1615,19 +1615,12 @@ sLocationHistory: @ 203F3A8
sRoamerLocation: @ 203F3AE
.space 0x2
-gUnknown_203F3B0: @ 203F3B0
- .space 0x8
-
-gUnknown_203F3B8: @ 203F3B8
- .space 0x4
-
+ .include "src/mystery_gift_menu.o"
.include "src/mevent.o"
.include "src/mevent_server_helpers.o"
.include "src/mevent_server.o"
.include "src/mevent_8145654.o"
-
-gUnknown_203F3D0: @ 203F3D0
- .space 0x4
+ .include "src/seagallop.o"
gUnknown_203F3D4: @ 203F3D4
.space 0x4