diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/agb_flash.c | 2 | ||||
-rw-r--r-- | src/crt0.s | 2 | ||||
-rwxr-xr-x | src/data/field_event_obj/event_object_graphics.h | 362 | ||||
-rw-r--r-- | src/decoration.c | 2 | ||||
-rw-r--r-- | src/event_object_movement.c | 12 | ||||
-rw-r--r-- | src/librfu.c | 9 | ||||
-rw-r--r-- | src/librfu_rfu.c | 2237 | ||||
-rw-r--r-- | src/librfu_sio32id.c | 164 | ||||
-rw-r--r-- | src/librfu_stwi.c | 530 | ||||
-rw-r--r-- | src/link_rfu.c | 238 | ||||
-rw-r--r-- | src/trade.c | 2 | ||||
-rw-r--r-- | src/union_room.c | 2 |
12 files changed, 2725 insertions, 837 deletions
diff --git a/src/agb_flash.c b/src/agb_flash.c index 34fb4e84a..a9cf13d5f 100644 --- a/src/agb_flash.c +++ b/src/agb_flash.c @@ -74,7 +74,7 @@ u16 SetFlashTimerIntr(u8 timerNum, void (**intrFunc)(void)) return 1; sTimerNum = timerNum; - sTimerReg = ®_TMCNT(sTimerNum); + sTimerReg = ®_TMCNT_L(sTimerNum); *intrFunc = FlashTimerIntr; return 0; } diff --git a/src/crt0.s b/src/crt0.s index 9ed678968..3ab711713 100644 --- a/src/crt0.s +++ b/src/crt0.s @@ -163,7 +163,7 @@ IntrMain: @ 8000248 IntrMain_FoundIntr: strh r0, [r3, OFFSET_REG_IF - 0x200] bic r2, r2, r0 - ldr r0, =gRfuState + ldr r0, =gSTWIStatus ldr r0, [r0] ldrb r0, [r0, 0xA] mov r1, 0x8 diff --git a/src/data/field_event_obj/event_object_graphics.h b/src/data/field_event_obj/event_object_graphics.h deleted file mode 100755 index 1702392ca..000000000 --- a/src/data/field_event_obj/event_object_graphics.h +++ /dev/null @@ -1,362 +0,0 @@ -const u32 gEventObjectPic_BrendanNormal[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/walking.4bpp"); -const u32 gEventObjectPic_BrendanRunning[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/running.4bpp"); -const u16 gEventObjectPalette8[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_08.gbapal"); -const u32 gEventObjectPic_RubySapphireBrendanNormal[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/walking.4bpp"); -const u32 gEventObjectPic_RubySapphireBrendanRunning[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/running.4bpp"); -const u16 gEventObjectPalette33[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_33.gbapal"); -const u16 NullPalette_8499A38[16] = {}; -const u16 NullPalette_8499A58[16] = {}; -const u16 NullPalette_8499A78[16] = {}; -const u16 NullPalette_8499A98[16] = {}; -const u16 NullPalette_8499AB8[16] = {}; -const u16 NullPalette_8499AD8[16] = {}; -const u16 NullPalette_8499AF8[16] = {}; -const u16 NullPalette_8499B18[16] = {}; -const u16 NullPalette_8499B38[16] = {}; -const u16 NullPalette_8499B58[16] = {}; -const u16 NullPalette_8499B78[16] = {}; -const u16 NullPalette_8499B98[16] = {}; -const u16 NullPalette_8499BB8[16] = {}; -const u16 NullPalette_8499BD8[16] = {}; -const u16 NullPalette_8499BF8[16] = {}; -const u16 gEventObjectPalette9[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_09.gbapal"); -const u16 gEventObjectPalette10[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_10.gbapal"); -const u32 gEventObjectPic_BrendanFieldMove[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/field_move.4bpp"); -const u32 gEventObjectPic_BrendanSurfing[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/surfing.4bpp"); -const u32 gEventObjectPic_BrendanMachBike[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/mach_bike.4bpp"); -const u32 gEventObjectPic_BrendanAcroBike[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike.4bpp"); -const u32 gEventObjectPic_BrendanFishing[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/fishing.4bpp"); -const u32 gEventObjectPic_BrendanWatering[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/watering.4bpp"); -const u32 gEventObjectPic_BrendanDecorating[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/decorating.4bpp"); -const u32 gEventObjectPic_MayDecorating[] = INCBIN_U32("graphics/event_objects/pics/people/may/decorating.4bpp"); -const u32 gEventObjectPic_BrendanUnderwater[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/underwater.4bpp"); -const u32 gEventObjectPic_MayUnderwater[] = INCBIN_U32("graphics/event_objects/pics/people/may/underwater.4bpp"); -const u16 gEventObjectPalette11[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_11.gbapal"); -const u32 gEventObjectPic_MayNormal[] = INCBIN_U32("graphics/event_objects/pics/people/may/walking.4bpp"); -const u32 gEventObjectPic_MayRunning[] = INCBIN_U32("graphics/event_objects/pics/people/may/running.4bpp"); -const u16 gEventObjectPalette17[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_17.gbapal"); -const u16 gEventObjectPalette18[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_18.gbapal"); -const u32 gEventObjectPic_RubySapphireMayNormal[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/walking.4bpp"); -const u32 gEventObjectPic_RubySapphireMayRunning[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/running.4bpp"); -const u16 gEventObjectPalette34[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_34.gbapal"); -const u16 gUnusedEventObjectPalette[] = INCBIN_U16("graphics/event_objects/palettes/unused_palette.gbapal"); -const u16 NullPalette_84A54F8[16] = {}; -const u16 NullPalette_84A5518[16] = {}; -const u16 NullPalette_84A5538[16] = {}; -const u16 NullPalette_84A5558[16] = {}; -const u16 NullPalette_84A5578[16] = {}; -const u16 NullPalette_84A5598[16] = {}; -const u16 NullPalette_84A55B8[16] = {}; -const u16 NullPalette_84A55D8[16] = {}; -const u16 NullPalette_84A55F8[16] = {}; -const u16 NullPalette_84A5618[16] = {}; -const u16 NullPalette_84A5638[16] = {}; -const u16 NullPalette_84A5658[16] = {}; -const u16 NullPalette_84A5678[16] = {}; -const u16 NullPalette_84A5698[16] = {}; -const u32 gEventObjectPic_MayMachBike[] = INCBIN_U32("graphics/event_objects/pics/people/may/mach_bike.4bpp"); -const u32 gEventObjectPic_MayAcroBike[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike.4bpp"); -const u32 gEventObjectPic_MaySurfing[] = INCBIN_U32("graphics/event_objects/pics/people/may/surfing.4bpp"); -const u32 gEventObjectPic_MayFieldMove[] = INCBIN_U32("graphics/event_objects/pics/people/may/field_move.4bpp"); -const u32 gEventObjectPic_MayFishing[] = INCBIN_U32("graphics/event_objects/pics/people/may/fishing.4bpp"); -const u32 gEventObjectPic_MayWatering[] = INCBIN_U32("graphics/event_objects/pics/people/may/watering.4bpp"); -const u16 gEventObjectPalette0[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_00.gbapal"); -const u16 gEventObjectPalette1[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_01.gbapal"); -const u16 gEventObjectPalette2[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_02.gbapal"); -const u16 gEventObjectPalette3[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_03.gbapal"); -const u16 gEventObjectPalette4[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_04.gbapal"); -const u16 gEventObjectPalette5[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_05.gbapal"); -const u16 gEventObjectPalette6[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_06.gbapal"); -const u16 gEventObjectPalette7[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_07.gbapal"); -const u32 gEventObjectPic_NinjaBoy[] = INCBIN_U32("graphics/event_objects/pics/people/ninja_boy.4bpp"); -const u32 gEventObjectPic_Twin[] = INCBIN_U32("graphics/event_objects/pics/people/twin.4bpp"); -const u32 gEventObjectPic_Boy1[] = INCBIN_U32("graphics/event_objects/pics/people/boy_1.4bpp"); -const u32 gEventObjectPic_Girl1[] = INCBIN_U32("graphics/event_objects/pics/people/girl_1.4bpp"); -const u32 gEventObjectPic_Boy2[] = INCBIN_U32("graphics/event_objects/pics/people/boy_2.4bpp"); -const u32 gEventObjectPic_Girl2[] = INCBIN_U32("graphics/event_objects/pics/people/girl_2.4bpp"); -const u32 gEventObjectPic_LittleBoy[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy.4bpp"); -const u32 gEventObjectPic_LittleGirl[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl.4bpp"); -const u32 gEventObjectPic_Boy3[] = INCBIN_U32("graphics/event_objects/pics/people/boy_3.4bpp"); -const u32 gEventObjectPic_Girl3[] = INCBIN_U32("graphics/event_objects/pics/people/girl_3.4bpp"); -const u32 gEventObjectPic_RichBoy[] = INCBIN_U32("graphics/event_objects/pics/people/rich_boy.4bpp"); -const u32 gEventObjectPic_Woman1[] = INCBIN_U32("graphics/event_objects/pics/people/woman_1.4bpp"); -const u32 gEventObjectPic_FatMan[] = INCBIN_U32("graphics/event_objects/pics/people/fat_man.4bpp"); -const u32 gEventObjectPic_PokefanF[] = INCBIN_U32("graphics/event_objects/pics/people/pokefan_f.4bpp"); -const u32 gEventObjectPic_Man1[] = INCBIN_U32("graphics/event_objects/pics/people/man_1.4bpp"); -const u32 gEventObjectPic_Woman2[] = INCBIN_U32("graphics/event_objects/pics/people/woman_2.4bpp"); -const u32 gEventObjectPic_ExpertM[] = INCBIN_U32("graphics/event_objects/pics/people/expert_m.4bpp"); -const u32 gEventObjectPic_ExpertF[] = INCBIN_U32("graphics/event_objects/pics/people/expert_f.4bpp"); -const u32 gEventObjectPic_Man2[] = INCBIN_U32("graphics/event_objects/pics/people/man_2.4bpp"); -const u32 gEventObjectPic_Woman3[] = INCBIN_U32("graphics/event_objects/pics/people/woman_3.4bpp"); -const u32 gEventObjectPic_PokefanM[] = INCBIN_U32("graphics/event_objects/pics/people/pokefan_m.4bpp"); -const u32 gEventObjectPic_Woman4[] = INCBIN_U32("graphics/event_objects/pics/people/woman_4.4bpp"); -const u32 gEventObjectPic_Cook[] = INCBIN_U32("graphics/event_objects/pics/people/cook.4bpp"); -const u32 gEventObjectPic_LinkReceptionist[] = INCBIN_U32("graphics/event_objects/pics/people/link_receptionist.4bpp"); -const u32 gEventObjectPic_OldMan[] = INCBIN_U32("graphics/event_objects/pics/people/old_man.4bpp"); -const u32 gEventObjectPic_OldWoman[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman.4bpp"); -const u32 gEventObjectPic_Camper[] = INCBIN_U32("graphics/event_objects/pics/people/camper.4bpp"); -const u32 gEventObjectPic_Picnicker[] = INCBIN_U32("graphics/event_objects/pics/people/picnicker.4bpp"); -const u32 gEventObjectPic_Man3[] = INCBIN_U32("graphics/event_objects/pics/people/man_3.4bpp"); -const u32 gEventObjectPic_Woman5[] = INCBIN_U32("graphics/event_objects/pics/people/woman_5.4bpp"); -const u32 gEventObjectPic_Youngster[] = INCBIN_U32("graphics/event_objects/pics/people/youngster.4bpp"); -const u32 gEventObjectPic_BugCatcher[] = INCBIN_U32("graphics/event_objects/pics/people/bug_catcher.4bpp"); -const u32 gEventObjectPic_PsychicM[] = INCBIN_U32("graphics/event_objects/pics/people/psychic_m.4bpp"); -const u32 gEventObjectPic_SchoolKidM[] = INCBIN_U32("graphics/event_objects/pics/people/school_kid_m.4bpp"); -const u32 gEventObjectPic_Maniac[] = INCBIN_U32("graphics/event_objects/pics/people/maniac.4bpp"); -const u32 gEventObjectPic_HexManiac[] = INCBIN_U32("graphics/event_objects/pics/people/hex_maniac.4bpp"); -const u32 gEventObjectPic_UnusedWoman[] = INCBIN_U32("graphics/event_objects/pics/people/unused_woman.4bpp"); -const u32 gEventObjectPic_SwimmerM[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_m.4bpp"); -const u32 gEventObjectPic_SwimmerF[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_f.4bpp"); -const u32 gEventObjectPic_BlackBelt[] = INCBIN_U32("graphics/event_objects/pics/people/black_belt.4bpp"); -const u32 gEventObjectPic_Beauty[] = INCBIN_U32("graphics/event_objects/pics/people/beauty.4bpp"); -const u32 gEventObjectPic_Scientist1[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_1.4bpp"); -const u32 gEventObjectPic_Lass[] = INCBIN_U32("graphics/event_objects/pics/people/lass.4bpp"); -const u32 gEventObjectPic_Gentleman[] = INCBIN_U32("graphics/event_objects/pics/people/gentleman.4bpp"); -const u32 gEventObjectPic_Sailor[] = INCBIN_U32("graphics/event_objects/pics/people/sailor.4bpp"); -const u32 gEventObjectPic_Fisherman[] = INCBIN_U32("graphics/event_objects/pics/people/fisherman.4bpp"); -const u32 gEventObjectPic_RunningTriathleteM[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_m.4bpp"); -const u32 gEventObjectPic_RunningTriathleteF[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_f.4bpp"); -const u32 gEventObjectPic_TuberF[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_f.4bpp"); -const u32 gEventObjectPic_TuberM[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m.4bpp"); -const u32 gEventObjectPic_Hiker[] = INCBIN_U32("graphics/event_objects/pics/people/hiker.4bpp"); -const u32 gEventObjectPic_CyclingTriathleteM[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_m.4bpp"); -const u32 gEventObjectPic_CyclingTriathleteF[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_f.4bpp"); -const u32 gEventObjectPic_Man4[] = INCBIN_U32("graphics/event_objects/pics/people/man_4.4bpp"); -const u32 gEventObjectPic_Man5[] = INCBIN_U32("graphics/event_objects/pics/people/man_5.4bpp"); -const u32 gEventObjectPic_Nurse[] = INCBIN_U32("graphics/event_objects/pics/people/nurse.4bpp"); -const u32 gEventObjectPic_ItemBall[] = INCBIN_U32("graphics/event_objects/pics/misc/item_ball.4bpp"); -const u32 gEventObjectPic_ProfBirch[] = INCBIN_U32("graphics/event_objects/pics/people/prof_birch.4bpp"); -const u32 gEventObjectPic_ReporterM[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_m.4bpp"); -const u32 gEventObjectPic_ReporterF[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_f.4bpp"); -const u32 gEventObjectPic_MauvilleOldMan1[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_1.4bpp"); -const u32 gEventObjectPic_MauvilleOldMan2[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_2.4bpp"); -const u32 gEventObjectPic_MartEmployee[] = INCBIN_U32("graphics/event_objects/pics/people/mart_employee.4bpp"); -const u32 gEventObjectPic_RooftopSaleWoman[] = INCBIN_U32("graphics/event_objects/pics/people/rooftop_sale_woman.4bpp"); -const u32 gEventObjectPic_Teala[] = INCBIN_U32("graphics/event_objects/pics/people/teala.4bpp"); -const u32 gEventObjectPic_Artist[] = INCBIN_U32("graphics/event_objects/pics/people/artist.4bpp"); -const u32 gEventObjectPic_Cameraman[] = INCBIN_U32("graphics/event_objects/pics/people/cameraman.4bpp"); -const u32 gEventObjectPic_Scientist2[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_2.4bpp"); -const u32 gEventObjectPic_DevonEmployee[] = INCBIN_U32("graphics/event_objects/pics/people/devon_employee.4bpp"); -const u32 gEventObjectPic_AquaMemberM[] = INCBIN_U32("graphics/event_objects/pics/people/team_aqua/aqua_member_m.4bpp"); -const u32 gEventObjectPic_AquaMemberF[] = INCBIN_U32("graphics/event_objects/pics/people/team_aqua/aqua_member_f.4bpp"); -const u32 gEventObjectPic_MagmaMemberM[] = INCBIN_U32("graphics/event_objects/pics/people/team_magma/magma_member_m.4bpp"); -const u32 gEventObjectPic_MagmaMemberF[] = INCBIN_U32("graphics/event_objects/pics/people/team_magma/magma_member_f.4bpp"); -const u32 gEventObjectPic_Sidney[] = INCBIN_U32("graphics/event_objects/pics/people/elite_four/sidney.4bpp"); -const u32 gEventObjectPic_Phoebe[] = INCBIN_U32("graphics/event_objects/pics/people/elite_four/phoebe.4bpp"); -const u32 gEventObjectPic_Glacia[] = INCBIN_U32("graphics/event_objects/pics/people/elite_four/glacia.4bpp"); -const u32 gEventObjectPic_Drake[] = INCBIN_U32("graphics/event_objects/pics/people/elite_four/drake.4bpp"); -const u32 gEventObjectPic_Roxanne[] = INCBIN_U32("graphics/event_objects/pics/people/gym_leaders/roxanne.4bpp"); -const u32 gEventObjectPic_Brawly[] = INCBIN_U32("graphics/event_objects/pics/people/gym_leaders/brawly.4bpp"); -const u32 gEventObjectPic_Wattson[] = INCBIN_U32("graphics/event_objects/pics/people/gym_leaders/wattson.4bpp"); -const u32 gEventObjectPic_Flannery[] = INCBIN_U32("graphics/event_objects/pics/people/gym_leaders/flannery.4bpp"); -const u32 gEventObjectPic_Norman[] = INCBIN_U32("graphics/event_objects/pics/people/gym_leaders/norman.4bpp"); -const u32 gEventObjectPic_Winona[] = INCBIN_U32("graphics/event_objects/pics/people/gym_leaders/winona.4bpp"); -const u32 gEventObjectPic_Liza[] = INCBIN_U32("graphics/event_objects/pics/people/gym_leaders/liza.4bpp"); -const u32 gEventObjectPic_Tate[] = INCBIN_U32("graphics/event_objects/pics/people/gym_leaders/tate.4bpp"); -const u32 gEventObjectPic_Wallace[] = INCBIN_U32("graphics/event_objects/pics/people/wallace.4bpp"); -const u32 gEventObjectPic_Steven[] = INCBIN_U32("graphics/event_objects/pics/people/steven.4bpp"); -const u32 gEventObjectPic_Wally[] = INCBIN_U32("graphics/event_objects/pics/people/wally.4bpp"); -const u32 gEventObjectPic_RubySapphireLittleBoy[] = INCBIN_U32("graphics/event_objects/pics/people/rs_little_boy.4bpp"); -const u32 gEventObjectPic_HotSpringsOldWoman[] = INCBIN_U32("graphics/event_objects/pics/people/hot_springs_old_woman.4bpp"); -const u32 gEventObjectPic_LatiasLatios[] = INCBIN_U32("graphics/event_objects/pics/pokemon/latias_latios.4bpp"); -const u32 gEventObjectPic_GameboyKid[] = INCBIN_U32("graphics/event_objects/pics/people/gameboy_kid.4bpp"); -const u32 gEventObjectPic_ContestJudge[] = INCBIN_U32("graphics/event_objects/pics/people/contest_judge.4bpp"); -const u32 gEventObjectPic_Archie[] = INCBIN_U32("graphics/event_objects/pics/people/team_aqua/archie.4bpp"); -const u32 gEventObjectPic_Maxie[] = INCBIN_U32("graphics/event_objects/pics/people/team_magma/maxie.4bpp"); -const u32 gEventObjectPic_Kyogre[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kyogre.4bpp"); -const u32 gEventObjectPic_Groudon[] = INCBIN_U32("graphics/event_objects/pics/pokemon/groudon.4bpp"); -const u32 gEventObjectPic_Regi[] = INCBIN_U32("graphics/event_objects/pics/pokemon/regi.4bpp"); -const u32 gEventObjectPic_Skitty[] = INCBIN_U32("graphics/event_objects/pics/pokemon/skitty.4bpp"); -const u32 gEventObjectPic_Kecleon[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kecleon.4bpp"); -const u32 gEventObjectPic_Rayquaza[] = INCBIN_U32("graphics/event_objects/pics/pokemon/rayquaza.4bpp"); -const u32 gEventObjectPic_RayquazaStill[] = INCBIN_U32("graphics/event_objects/pics/pokemon/rayquaza_still.4bpp"); -const u32 gEventObjectPic_Zigzagoon[] = INCBIN_U32("graphics/event_objects/pics/pokemon/zigzagoon.4bpp"); -const u32 gEventObjectPic_Pikachu[] = INCBIN_U32("graphics/event_objects/pics/pokemon/pikachu.4bpp"); -const u32 gEventObjectPic_Azumarill[] = INCBIN_U32("graphics/event_objects/pics/pokemon/azumarill.4bpp"); -const u32 gEventObjectPic_Wingull[] = INCBIN_U32("graphics/event_objects/pics/pokemon/wingull.4bpp"); -const u32 gEventObjectPic_TuberMSwimming[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m_swimming.4bpp"); -const u32 gEventObjectPic_Azurill[] = INCBIN_U32("graphics/event_objects/pics/pokemon/azurill.4bpp"); -const u32 gEventObjectPic_Mom[] = INCBIN_U32("graphics/event_objects/pics/people/mom.4bpp"); -const u16 gEventObjectPalette22[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_22.gbapal"); -const u16 gEventObjectPalette23[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_23.gbapal"); -const u16 gEventObjectPalette24[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_24.gbapal"); -const u16 gEventObjectPalette25[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_25.gbapal"); -const u32 gEventObjectPic_UnusedNatuDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/unused_natu_doll.4bpp"); -const u32 gEventObjectPic_UnusedMagnemiteDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/unused_magnemite_doll.4bpp"); -const u32 gEventObjectPic_UnusedSquirtleDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/unused_squirtle_doll.4bpp"); -const u32 gEventObjectPic_UnusedWooperDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/unused_wooper_doll.4bpp"); -const u32 gEventObjectPic_UnusedPikachuDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/unused_pikachu_doll.4bpp"); -const u32 gEventObjectPic_UnusedPorygon2Doll[] = INCBIN_U32("graphics/event_objects/pics/dolls/unused_porygon2_doll.4bpp"); -const u32 gEventObjectPic_PichuDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/pichu_doll.4bpp"); -const u32 gEventObjectPic_PikachuDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/pikachu_doll.4bpp"); -const u32 gEventObjectPic_MarillDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/marill_doll.4bpp"); -const u32 gEventObjectPic_TogepiDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/togepi_doll.4bpp"); -const u32 gEventObjectPic_CyndaquilDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/cyndaquil_doll.4bpp"); -const u32 gEventObjectPic_ChikoritaDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/chikorita_doll.4bpp"); -const u32 gEventObjectPic_TotodileDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/totodile_doll.4bpp"); -const u32 gEventObjectPic_JigglypuffDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/jigglypuff_doll.4bpp"); -const u32 gEventObjectPic_MeowthDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/meowth_doll.4bpp"); -const u32 gEventObjectPic_ClefairyDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/clefairy_doll.4bpp"); -const u32 gEventObjectPic_DittoDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/ditto_doll.4bpp"); -const u32 gEventObjectPic_SmoochumDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/smoochum_doll.4bpp"); -const u32 gEventObjectPic_TreeckoDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/treecko_doll.4bpp"); -const u32 gEventObjectPic_TorchicDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/torchic_doll.4bpp"); -const u32 gEventObjectPic_MudkipDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/mudkip_doll.4bpp"); -const u32 gEventObjectPic_DuskullDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/duskull_doll.4bpp"); -const u32 gEventObjectPic_WynautDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/wynaut_doll.4bpp"); -const u32 gEventObjectPic_BaltoyDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/baltoy_doll.4bpp"); -const u32 gEventObjectPic_KecleonDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/kecleon_doll.4bpp"); -const u32 gEventObjectPic_AzurillDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/azurill_doll.4bpp"); -const u32 gEventObjectPic_SkittyDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/skitty_doll.4bpp"); -const u32 gEventObjectPic_SwabluDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/swablu_doll.4bpp"); -const u32 gEventObjectPic_GulpinDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/gulpin_doll.4bpp"); -const u32 gEventObjectPic_LotadDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/lotad_doll.4bpp"); -const u32 gEventObjectPic_SeedotDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/seedot_doll.4bpp"); -const u32 gEventObjectPic_PikaCushion[] = INCBIN_U32("graphics/event_objects/pics/cushions/pika_cushion.4bpp"); -const u32 gEventObjectPic_RoundCushion[] = INCBIN_U32("graphics/event_objects/pics/cushions/round_cushion.4bpp"); -const u32 gEventObjectPic_KissCushion[] = INCBIN_U32("graphics/event_objects/pics/cushions/kiss_cushion.4bpp"); -const u32 gEventObjectPic_ZigzagCushion[] = INCBIN_U32("graphics/event_objects/pics/cushions/zigzag_cushion.4bpp"); -const u32 gEventObjectPic_SpinCushion[] = INCBIN_U32("graphics/event_objects/pics/cushions/spin_cushion.4bpp"); -const u32 gEventObjectPic_DiamondCushion[] = INCBIN_U32("graphics/event_objects/pics/cushions/diamond_cushion.4bpp"); -const u32 gEventObjectPic_BallCushion[] = INCBIN_U32("graphics/event_objects/pics/cushions/ball_cushion.4bpp"); -const u32 gEventObjectPic_GrassCushion[] = INCBIN_U32("graphics/event_objects/pics/cushions/grass_cushion.4bpp"); -const u32 gEventObjectPic_FireCushion[] = INCBIN_U32("graphics/event_objects/pics/cushions/fire_cushion.4bpp"); -const u32 gEventObjectPic_WaterCushion[] = INCBIN_U32("graphics/event_objects/pics/cushions/water_cushion.4bpp"); -const u32 gEventObjectPic_BigSnorlaxDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/big_snorlax_doll.4bpp"); -const u32 gEventObjectPic_BigRhydonDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/big_rhydon_doll.4bpp"); -const u32 gEventObjectPic_BigLaprasDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/big_lapras_doll.4bpp"); -const u32 gEventObjectPic_BigVenusaurDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/big_venusaur_doll.4bpp"); -const u32 gEventObjectPic_BigCharizardDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/big_charizard_doll.4bpp"); -const u32 gEventObjectPic_BigBlastoiseDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/big_blastoise_doll.4bpp"); -const u32 gEventObjectPic_BigWailmerDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/big_wailmer_doll.4bpp"); -const u32 gEventObjectPic_BigRegirockDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/big_regirock_doll.4bpp"); -const u32 gEventObjectPic_BigRegiceDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/big_regice_doll.4bpp"); -const u32 gEventObjectPic_BigRegisteelDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/big_registeel_doll.4bpp"); -const u32 gEventObjectPic_CuttableTree[] = INCBIN_U32("graphics/event_objects/pics/misc/cuttable_tree.4bpp"); -const u32 gEventObjectPic_BreakableRock[] = INCBIN_U32("graphics/event_objects/pics/misc/breakable_rock.4bpp"); -const u32 gEventObjectPic_PushableBoulder[] = INCBIN_U32("graphics/event_objects/pics/misc/pushable_boulder.4bpp"); -const u32 gEventObjectPic_MrBrineysBoat[] = INCBIN_U32("graphics/event_objects/pics/misc/mr_brineys_boat.4bpp"); -const u32 gEventObjectPic_Fossil[] = INCBIN_U32("graphics/event_objects/pics/misc/fossil.4bpp"); -const u32 gEventObjectPic_SubmarineShadow[] = INCBIN_U32("graphics/event_objects/pics/misc/submarine_shadow.4bpp"); -const u16 gEventObjectPalette26[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_26.gbapal"); -const u32 gEventObjectPic_Truck[] = INCBIN_U32("graphics/event_objects/pics/misc/truck.4bpp"); -const u16 gEventObjectPalette14[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_14.gbapal"); -const u32 gEventObjectPic_Vigoroth[] = INCBIN_U32("graphics/event_objects/pics/pokemon/vigoroth.4bpp"); -const u16 gEventObjectPalette15[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_15.gbapal"); -const u32 gEventObjectPic_BirchsBag[] = INCBIN_U32("graphics/event_objects/pics/misc/birchs_bag.4bpp"); -const u32 gEventObjectPic_EnemyZigzagoon[] = INCBIN_U32("graphics/event_objects/pics/pokemon/enemy_zigzagoon.4bpp"); -const u16 gEventObjectPalette16[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_16.gbapal"); -const u32 gEventObjectPic_Poochyena[] = INCBIN_U32("graphics/event_objects/pics/pokemon/poochyena.4bpp"); -const u16 gEventObjectPalette27[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_27.gbapal"); -const u32 gEventObjectPic_CableCar[] = INCBIN_U32("graphics/event_objects/pics/misc/cable_car.4bpp"); -const u16 gEventObjectPalette20[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_20.gbapal"); -const u32 gEventObjectPic_SSTidal[] = INCBIN_U32("graphics/event_objects/pics/misc/ss_tidal.4bpp"); -const u16 gEventObjectPalette21[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_21.gbapal"); -const u32 gFieldEffectObjectPic_BerryTreeGrowthSparkle[] = INCBIN_U32("graphics/event_objects/pics/effects/berry_tree_growth_sparkle.4bpp"); -const u32 gEventObjectPic_BerryTreeDirtPile[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/dirt_pile.4bpp"); -const u32 gEventObjectPic_BerryTreeSprout[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/sprout.4bpp"); -const u32 gEventObjectPic_PechaBerryTree[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pecha.4bpp"); -const u32 gEventObjectPic_KelpsyBerryTree[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/kelpsy.4bpp"); -const u32 gEventObjectPic_WepearBerryTree[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/wepear.4bpp"); -const u32 gEventObjectPic_IapapaBerryTree[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/iapapa.4bpp"); -const u32 gEventObjectPic_CheriBerryTree[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/cheri.4bpp"); -const u32 gEventObjectPic_FigyBerryTree[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/figy.4bpp"); -const u32 gEventObjectPic_MagoBerryTree[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/mago.4bpp"); -const u32 gEventObjectPic_LumBerryTree[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/lum.4bpp"); -const u32 gEventObjectPic_RazzBerryTree[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/razz.4bpp"); -const u32 gEventObjectPic_GrepaBerryTree[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/grepa.4bpp"); -const u32 gEventObjectPic_RabutaBerryTree[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/rabuta.4bpp"); -const u32 gEventObjectPic_NomelBerryTree[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/nomel.4bpp"); -const u32 gEventObjectPic_LeppaBerryTree[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/leppa.4bpp"); -const u32 gEventObjectPic_LiechiBerryTree[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/liechi.4bpp"); -const u32 gEventObjectPic_HondewBerryTree[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/hondew.4bpp"); -const u32 gEventObjectPic_AguavBerryTree[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/aguav.4bpp"); -const u32 gEventObjectPic_WikiBerryTree[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/wiki.4bpp"); -const u32 gEventObjectPic_PomegBerryTree[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pomeg.4bpp"); -const u32 gEventObjectPic_RawstBerryTree[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/rawst.4bpp"); -const u32 gEventObjectPic_SpelonBerryTree[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/spelon.4bpp"); -const u32 gEventObjectPic_ChestoBerryTree[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/chesto.4bpp"); -const u32 gEventObjectPic_OranBerryTree[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/oran.4bpp"); -const u32 gEventObjectPic_PersimBerryTree[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/persim.4bpp"); -const u32 gEventObjectPic_SitrusBerryTree[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/sitrus.4bpp"); -const u32 gEventObjectPic_AspearBerryTree[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/aspear.4bpp"); -const u32 gEventObjectPic_PamtreBerryTree[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pamtre.4bpp"); -const u32 gEventObjectPic_CornnBerryTree[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/cornn.4bpp"); -const u32 gEventObjectPic_LansatBerryTree[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/lansat.4bpp"); -const u32 gEventObjectPic_DurinBerryTree[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/durin.4bpp"); -const u32 gEventObjectPic_TamatoBerryTree[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/tamato.4bpp"); -const u32 gFieldEffectObjectPic_SurfBlob[] = INCBIN_U32("graphics/event_objects/pics/effects/surf_blob.4bpp"); -const u32 gEventObjectPic_QuintyPlump[] = INCBIN_U32("graphics/event_objects/pics/people/quinty_plump.4bpp"); -const u16 gEventObjectPalette12[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_12.gbapal"); -const u16 gEventObjectPalette13[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_13.gbapal"); -const u32 gFieldEffectObjectPic_ShadowSmall[] = INCBIN_U32("graphics/event_objects/pics/effects/shadow_small.4bpp"); -const u32 gFieldEffectObjectPic_ShadowMedium[] = INCBIN_U32("graphics/event_objects/pics/effects/shadow_medium.4bpp"); -const u32 gFieldEffectObjectPic_ShadowLarge[] = INCBIN_U32("graphics/event_objects/pics/effects/shadow_large.4bpp"); -const u32 gFieldEffectObjectPic_ShadowExtraLarge[] = INCBIN_U32("graphics/event_objects/pics/effects/shadow_extra_large.4bpp"); -const u32 filler_8368A08[0x48] = {}; -const u8 gFieldEffectPic_CutGrass[] = INCBIN_U8("graphics/event_objects/pics/effects/cut_grass.4bpp"); -const u32 gFieldEffectPic_CutGrass_Copy[] = INCBIN_U32("graphics/event_objects/pics/effects/cut_grass.4bpp"); -const u16 gFieldEffectObjectPalette6[] = INCBIN_U16("graphics/event_objects/palettes/field_effect_object_palette_06.gbapal"); -const u32 gFieldEffectObjectPic_Ripple[] = INCBIN_U32("graphics/event_objects/pics/effects/ripple.4bpp"); -const u32 gFieldEffectObjectPic_Ash[] = INCBIN_U32("graphics/event_objects/pics/effects/ash.4bpp"); -const u32 gFieldEffectObjectPic_Arrow[] = INCBIN_U32("graphics/event_objects/pics/effects/arrow.4bpp"); -const u16 gFieldEffectObjectPalette0[] = INCBIN_U16("graphics/event_objects/palettes/field_effect_object_palette_00.gbapal"); -const u16 gFieldEffectObjectPalette1[] = INCBIN_U16("graphics/event_objects/palettes/field_effect_object_palette_01.gbapal"); -const u32 gFieldEffectObjectPic_GroundImpactDust[] = INCBIN_U32("graphics/event_objects/pics/effects/ground_impact_dust.4bpp"); -const u32 gFieldEffectObjectPic_BikeHopTallGrass[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_hop_tall_grass.4bpp"); -const u32 gUnusedGrass[] = INCBIN_U32("graphics/event_objects/pics/effects/unused_grass.4bpp"); -const u32 gFieldEffectObjectPic_Unknown16[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_16.4bpp"); -const u32 gFieldEffectObjectPic_Unknown17[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_17.4bpp"); -const u32 gFieldEffectObjectPic_Unknown18[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_18.4bpp"); -const u32 gFieldEffectObjectPic_LongGrass[] = INCBIN_U32("graphics/event_objects/pics/effects/long_grass.4bpp"); -const u32 gFieldEffectObjectPic_TallGrass[] = INCBIN_U32("graphics/event_objects/pics/effects/tall_grass.4bpp"); -const u32 gFieldEffectObjectPic_ShortGrass[] = INCBIN_U32("graphics/event_objects/pics/effects/short_grass.4bpp"); -const u32 gFieldEffectObjectPic_SandFootprints[] = INCBIN_U32("graphics/event_objects/pics/effects/sand_footprints.4bpp"); -const u32 gFieldEffectObjectPic_DeepSandFootprints[] = INCBIN_U32("graphics/event_objects/pics/effects/deep_sand_footprints.4bpp"); -const u32 gFieldEffectObjectPic_BikeTireTracks[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_tire_tracks.4bpp"); -const u32 gFieldEffectObjectPic_Unknown19[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_19.4bpp"); -const u32 gFieldEffectObjectPic_Unknown29[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_29.4bpp"); -const u32 gFieldEffectObjectPic_BikeHopBigSplash[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_hop_big_splash.4bpp"); -const u32 gFieldEffectObjectPic_Splash[] = INCBIN_U32("graphics/event_objects/pics/effects/splash.4bpp"); -const u32 gFieldEffectObjectPic_BikeHopSmallSplash[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_hop_small_splash.4bpp"); -const u32 gFieldEffectObjectPic_Unknown20[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_20.4bpp"); -const u32 gFieldEffectObjectPic_TreeDisguise[] = INCBIN_U32("graphics/event_objects/pics/effects/tree_disguise.4bpp"); -const u32 gFieldEffectObjectPic_MountainDisguise[] = INCBIN_U32("graphics/event_objects/pics/effects/mountain_disguise.4bpp"); -const u32 gFieldEffectObjectPic_SandDisguisePlaceholder[] = INCBIN_U32("graphics/event_objects/pics/effects/sand_disguise_placeholder.4bpp"); -const u32 gFieldEffectObjectPic_HotSpringsWater[] = INCBIN_U32("graphics/event_objects/pics/effects/hot_springs_water.4bpp"); -const u16 gFieldEffectObjectPalette2[] = INCBIN_U16("graphics/event_objects/palettes/field_effect_object_palette_02.gbapal"); -const u32 gFieldEffectObjectPic_JumpOutOfAsh[] = INCBIN_U32("graphics/event_objects/pics/effects/jump_out_of_ash.4bpp"); -const u32 gFieldEffectObjectPic_LavaridgeGymWarp[] = INCBIN_U32("graphics/event_objects/pics/effects/lavaridge_gym_warp.4bpp"); -const u32 gFieldEffectObjectPic_Bubbles[] = INCBIN_U32("graphics/event_objects/pics/effects/bubbles.4bpp"); -const u32 gFieldEffectObjectPic_Unknown35[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_35.4bpp"); -const u16 gFieldEffectObjectPalette3[] = INCBIN_U16("graphics/event_objects/palettes/field_effect_object_palette_03.gbapal"); -const u32 gFieldEffectObjectPic_Bird[] = INCBIN_U32("graphics/event_objects/pics/effects/bird.4bpp"); -const u32 gEventObjectPic_Juan[] = INCBIN_U32("graphics/event_objects/pics/people/gym_leaders/juan.4bpp"); -const u32 gEventObjectPic_Scott[] = INCBIN_U32("graphics/event_objects/pics/people/scott.4bpp"); -const u32 gEventObjectPic_Statue[] = INCBIN_U32("graphics/event_objects/pics/misc/statue.4bpp"); -const u32 gEventObjectPic_Kirlia[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kirlia.4bpp"); -const u32 gEventObjectPic_Dusclops[] = INCBIN_U32("graphics/event_objects/pics/pokemon/dusclops.4bpp"); -const u32 gEventObjectPic_MysteryEventDeliveryman[] = INCBIN_U32("graphics/event_objects/pics/people/mystery_event_deliveryman.4bpp"); -const u32 gEventObjectPic_UnionRoomAttendant[] = INCBIN_U32("graphics/event_objects/pics/people/union_room_attendant.4bpp"); -const u32 gEventObjectPic_MovingBox[] = INCBIN_U32("graphics/event_objects/pics/misc/moving_box.4bpp"); -const u16 gEventObjectPalette19[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_19.gbapal"); -const u32 gEventObjectPic_Sudowoodo[] = INCBIN_U32("graphics/event_objects/pics/pokemon/sudowoodo.4bpp"); -const u32 gEventObjectPic_Mew[] = INCBIN_U32("graphics/event_objects/pics/pokemon/mew.4bpp"); -const u16 gEventObjectPalette28[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_28.gbapal"); -const u32 gEventObjectPic_Red[] = INCBIN_U32("graphics/event_objects/pics/people/red.4bpp"); -const u32 gEventObjectPic_Leaf[] = INCBIN_U32("graphics/event_objects/pics/people/leaf.4bpp"); -const u16 gEventObjectPalette30[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_30.gbapal"); -const u32 gEventObjectPic_BirthIslandStone[] = INCBIN_U32("graphics/event_objects/pics/misc/birth_island_stone.4bpp"); -const u16 gEventObjectPalette29[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_29.gbapal"); -const u32 gEventObjectPic_Deoxys[] = INCBIN_U32("graphics/event_objects/pics/pokemon/deoxys.4bpp"); -const u32 gEventObjectPic_Anabel[] = INCBIN_U32("graphics/event_objects/pics/people/frontier_brains/anabel.4bpp"); -const u32 gEventObjectPic_Tucker[] = INCBIN_U32("graphics/event_objects/pics/people/frontier_brains/tucker.4bpp"); -const u32 gEventObjectPic_Spenser[] = INCBIN_U32("graphics/event_objects/pics/people/frontier_brains/spenser.4bpp"); -const u32 gEventObjectPic_Greta[] = INCBIN_U32("graphics/event_objects/pics/people/frontier_brains/greta.4bpp"); -const u32 gEventObjectPic_Noland[] = INCBIN_U32("graphics/event_objects/pics/people/frontier_brains/noland.4bpp"); -const u32 gEventObjectPic_Lucy[] = INCBIN_U32("graphics/event_objects/pics/people/frontier_brains/lucy.4bpp"); -const u32 gEventObjectPic_Brandon[] = INCBIN_U32("graphics/event_objects/pics/people/frontier_brains/brandon.4bpp"); -const u32 gEventObjectPic_Lugia[] = INCBIN_U32("graphics/event_objects/pics/pokemon/lugia.4bpp"); -const u16 gEventObjectPalette32[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_32.gbapal"); -const u32 gEventObjectPic_HoOh[] = INCBIN_U32("graphics/event_objects/pics/pokemon/ho_oh.4bpp"); -const u16 gEventObjectPalette31[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_31.gbapal"); diff --git a/src/decoration.c b/src/decoration.c index e141e43b3..fd41beb6f 100644 --- a/src/decoration.c +++ b/src/decoration.c @@ -2155,7 +2155,7 @@ void sub_8129708(void) } // Unused -void GetEventObjectLocalIdByFlag(void) +void GetObjectEventLocalIdByFlag(void) { u8 i; diff --git a/src/event_object_movement.c b/src/event_object_movement.c index a3cd676b1..572db3352 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -1861,27 +1861,29 @@ const struct ObjectEventGraphicsInfo *GetObjectEventGraphicsInfo(u8 graphicsId) { u8 bard; - if (graphicsId >= SPRITE_VAR) + if (graphicsId >= OBJ_EVENT_GFX_VARS) { - graphicsId = VarGetObjectEventGraphicsId(graphicsId - SPRITE_VAR); + graphicsId = VarGetObjectEventGraphicsId(graphicsId - OBJ_EVENT_GFX_VARS); } if (graphicsId == OBJ_EVENT_GFX_BARD) { bard = GetCurrentMauvilleOldMan(); return gMauvilleOldManGraphicsInfoPointers[bard]; } - if (graphicsId >= NUM_OBJECT_GRAPHICS_INFO) + + if (graphicsId >= NUM_OBJ_EVENT_GFX) { graphicsId = OBJ_EVENT_GFX_NINJA_BOY; } + return gObjectEventGraphicsInfoPointers[graphicsId]; } static void SetObjectEventDynamicGraphicsId(struct ObjectEvent *objectEvent) { - if (objectEvent->graphicsId >= SPRITE_VAR) + if (objectEvent->graphicsId >= OBJ_EVENT_GFX_VARS) { - objectEvent->graphicsId = VarGetObjectEventGraphicsId(objectEvent->graphicsId - SPRITE_VAR); + objectEvent->graphicsId = VarGetObjectEventGraphicsId(objectEvent->graphicsId - OBJ_EVENT_GFX_VARS); } } diff --git a/src/librfu.c b/src/librfu.c deleted file mode 100644 index cdf14b693..000000000 --- a/src/librfu.c +++ /dev/null @@ -1,9 +0,0 @@ -#include "global.h" -#include "librfu.h" - -struct RfuUnk1* gUnknown_03007870[4]; -struct RfuUnk2* gUnknown_03007880[4]; -struct RfuUnk5 *gUnknown_03007890; -u32 *gUnknown_03007894; -struct RfuUnk3* gUnknown_03007898; -u8 gUnknown_030078A0[12]; diff --git a/src/librfu_rfu.c b/src/librfu_rfu.c index c5aa25c10..732cc532d 100644 --- a/src/librfu_rfu.c +++ b/src/librfu_rfu.c @@ -1,77 +1,2212 @@ -#include "global.h" -#include "main.h" - #include "librfu.h" -// Nonmatching, only register differences -/*u16 rfu_initializeAPI(u32 *unk0, u16 unk1, IntrFunc *interrupt, bool8 copyInterruptToRam) +struct LLSFStruct +{ + u8 unk00; + u8 unk01; + u8 unk02; + u8 unk03; + u8 unk04; + u8 unk05; + u8 unk06; + u8 unk07; + u8 unk08; + u8 unk09; + u8 unk0A; + u8 unk0B; + u8 unk0C; + u16 unk0E; +}; + +struct RfuLocalStruct +{ + u8 unk00; + u8 unk01; + u8 unk02; + u8 unk03; + u8 unk04; + u8 unk05; + u16 unk06; +}; + +static void rfu_CB_defaultCallback(u8, u16); +static void rfu_CB_reset(u8, u16); +static void rfu_CB_configGameData(u8, u16); +static void rfu_CB_stopMode(u8, u16); +static void rfu_CB_startSearchChild(u8, u16); +static void rfu_CB_pollAndEndSearchChild(u8, u16); +static void rfu_CB_startSearchParent(u8, u16); +static void rfu_CB_pollSearchParent(u8, u16); +static void rfu_CB_pollConnectParent(u8, u16); +static void rfu_CB_pollConnectParent(u8, u16); +static void rfu_CB_disconnect(u8, u16); +static void rfu_CB_CHILD_pollConnectRecovery(u8, u16); +static void rfu_CB_sendData(__attribute__((unused)) u8, u16); +static void rfu_CB_sendData2(__attribute__((unused)) u8, u16); +static void rfu_CB_sendData3(u8, u16); +static void rfu_CB_recvData(u8, u16); +static void rfu_enableREQCallback(bool8); +static void rfu_STC_clearAPIVariables(void); +static void rfu_STC_readChildList(void); +static void rfu_STC_readParentCandidateList(void); +static void rfu_STC_REQ_callback(u8, u16); +static void rfu_STC_removeLinkData(u8, u8); +static void rfu_STC_fastCopy(const u8 **, u8 **, s32); +static void rfu_STC_clearLinkStatus(u8); +static void rfu_NI_checkCommFailCounter(void); +static u16 rfu_STC_setSendData_org(u8, u8, u8, const void *, u32); +static void rfu_constructSendLLFrame(void); +static u16 rfu_STC_NI_constructLLSF(u8, u8 **, struct NIComm *); +static u16 rfu_STC_UNI_constructLLSF(u8, u8 **); +static void rfu_STC_PARENT_analyzeRecvPacket(void); +static void rfu_STC_CHILD_analyzeRecvPacket(void); +static u16 rfu_STC_analyzeLLSF(u8, const u8 *, u16); +static void rfu_STC_UNI_receive(u8, const struct RfuLocalStruct *, const u8 *); +static void rfu_STC_NI_receive_Receiver(u8, const struct RfuLocalStruct *, const u8 *); +static void rfu_STC_NI_receive_Sender(u8, u8, const struct RfuLocalStruct *, __attribute__((unused)) const u8 *); +static void rfu_STC_NI_initSlot_asRecvDataEntity(u8, struct NIComm *); +static void rfu_STC_NI_initSlot_asRecvControllData(u8, struct NIComm *); + +struct RfuSlotStatusUNI *gRfuSlotStatusUNI[RFU_CHILD_MAX]; +struct RfuSlotStatusNI *gRfuSlotStatusNI[RFU_CHILD_MAX]; +struct RfuLinkStatus *gRfuLinkStatus; +struct RfuStatic *gRfuStatic; +struct RfuFixed *gRfuFixed; + +static const struct LLSFStruct llsf_struct[2] = { + { + 2, 14, 0, 10, 9, 5, 7, 2, + 0, 15, 1, 3, 3, 0x1f + }, { + 3, 22, 18, 14, 13, 9, 11, 3, + 15, 15, 1, 3, 3, 0x7f + } +}; + +static const char lib_ver[] = "RFU_V1026"; + +static const char str_checkMbootLL[] = "RFU-MBOOT"; + +u16 rfu_initializeAPI(struct RfuAPIBuffer *APIBuffer, u16 buffByteSize, IntrFunc *sioIntrTable_p, bool8 copyInterruptToRam) { u16 i; - u16 *v13; - u16 *v12; - u16 num; + u16 *dst; + const u16 *src; + u16 r3; - if (((u32)unk0 & 0xF000000) == 0x2000000 && copyInterruptToRam) - { - return 2; - } - - if ((u32)unk0 & 3) - return 2; - - // Nintendo pls, just use a ternary for once + // is in EWRAM? + if (((u32)APIBuffer & 0xF000000) == 0x2000000 && copyInterruptToRam) + return ERR_RFU_API_BUFF_ADR; + // is not 4-byte aligned? + if ((u32)APIBuffer & 3) + return ERR_RFU_API_BUFF_ADR; if (copyInterruptToRam) { // An assert/debug print may have existed before, ie - // printf("%s %u < %u", "somefile.c:12345", unk1, num) + // printf("%s %u < %u", "somefile.c:12345", buffByteSize, num) // to push this into r3? - num = 0xe64; - if (unk1 < num) - return 1; + r3 = sizeof(struct RfuAPIBuffer); + if (buffByteSize < r3) + return ERR_RFU_API_BUFF_SIZE; + } + if (!copyInterruptToRam) + { + r3 = 0x504; // same issue as above + if (buffByteSize < r3) + return ERR_RFU_API_BUFF_SIZE; } + gRfuLinkStatus = &APIBuffer->linkStatus; + gRfuStatic = &APIBuffer->static_; + gRfuFixed = &APIBuffer->fixed; + gRfuSlotStatusNI[0] = &APIBuffer->NI[0]; + gRfuSlotStatusUNI[0] = &APIBuffer->UNI[0]; + for (i = 1; i < RFU_CHILD_MAX; ++i) + { + gRfuSlotStatusNI[i] = &gRfuSlotStatusNI[i - 1][1]; + gRfuSlotStatusUNI[i] = &gRfuSlotStatusUNI[i - 1][1]; + } + // TODO: Is it possible to fix the following 2 statements? + // It's equivalent to: + // gRfuFixed->STWIBuffer = &APIBuffer->intr; + // STWI_init_all(&APIBuffer->intr, sioIntrTable_p, copyInterruptToRam); + gRfuFixed->STWIBuffer = (struct RfuIntrStruct *)&gRfuSlotStatusUNI[3][1]; + STWI_init_all((struct RfuIntrStruct *)&gRfuSlotStatusUNI[3][1], sioIntrTable_p, copyInterruptToRam); + rfu_STC_clearAPIVariables(); + for (i = 0; i < RFU_CHILD_MAX; ++i) + { + gRfuSlotStatusNI[i]->recvBuffer = NULL; + gRfuSlotStatusNI[i]->recvBufferSize = 0; + gRfuSlotStatusUNI[i]->recvBuffer = NULL; + gRfuSlotStatusUNI[i]->recvBufferSize = 0; + } + // looks like a macro copying data + do + { + src = (const u16 *)((u32)&rfu_STC_fastCopy & 0xFFFFFFFE); + dst = gRfuFixed->fastCopyBuffer; + for (r3 = 0x2F; r3 != 0xFFFF; --r3) // copy rfu_STC_fastCopy function body to buffer + *dst++ = *src++; + gRfuFixed->fastCopyPtr = (void *)gRfuFixed->fastCopyBuffer + 1; + } while (0); + return 0; +} + +static void rfu_STC_clearAPIVariables(void) +{ + u16 IMEBackup = REG_IME; + u8 i, r4; + + REG_IME = 0; + r4 = gRfuStatic->flags; + CpuFill16(0, gRfuStatic, sizeof(struct RfuStatic)); + gRfuStatic->flags = r4 & 8; + CpuFill16(0, gRfuLinkStatus, sizeof(struct RfuLinkStatus)); + gRfuLinkStatus->watchInterval = 4; + gRfuStatic->nowWatchInterval = 0; + gRfuLinkStatus->parentChild = MODE_NEUTRAL; + rfu_clearAllSlot(); + gRfuStatic->SCStartFlag = 0; + for (i = 0; i < NELEMS(gRfuStatic->cidBak); ++i) + gRfuStatic->cidBak[i] = 0; + REG_IME = IMEBackup; +} - if (copyInterruptToRam == FALSE) +void rfu_REQ_PARENT_resumeRetransmitAndChange(void) +{ + STWI_set_Callback_M(rfu_STC_REQ_callback); + STWI_send_ResumeRetransmitAndChangeREQ(); +} + +u16 rfu_UNI_PARENT_getDRAC_ACK(u8 *ackFlag) +{ + struct RfuIntrStruct *buf; + + *ackFlag = 0; + if (gRfuLinkStatus->parentChild != MODE_PARENT) + return ERR_MODE_NOT_PARENT; + buf = rfu_getSTWIRecvBuffer(); + switch (buf->rxPacketAlloc.rfuPacket8.data[0]) + { + case 40: + case 54: + if (buf->rxPacketAlloc.rfuPacket8.data[1] == 0) + *ackFlag = gRfuLinkStatus->connSlotFlag; + else + *ackFlag = buf->rxPacketAlloc.rfuPacket8.data[4]; + return 0; + default: + return ERR_REQ_CMD_ID; + } +} + +void rfu_setTimerInterrupt(u8 timerNo, IntrFunc *timerIntrTable_p) +{ + STWI_init_timer(timerIntrTable_p, timerNo); +} + +struct RfuIntrStruct *rfu_getSTWIRecvBuffer(void) +{ + return gRfuFixed->STWIBuffer; +} + +void rfu_setMSCCallback(void (*callback)(u16 reqCommandId)) +{ + STWI_set_Callback_S(callback); +} + +void rfu_setREQCallback(void (*callback)(u16 reqCommandId, u16 reqResult)) +{ + gRfuFixed->reqCallback = callback; + rfu_enableREQCallback(callback != NULL); +} + +static void rfu_enableREQCallback(bool8 enable) +{ + if (enable) + gRfuStatic->flags |= 8; + else + gRfuStatic->flags &= 0xF7; +} + +static void rfu_STC_REQ_callback(u8 r5, u16 reqResult) +{ + STWI_set_Callback_M(rfu_CB_defaultCallback); + gRfuStatic->reqResult = reqResult; + if (gRfuStatic->flags & 8) + gRfuFixed->reqCallback(r5, reqResult); +} + +static void rfu_CB_defaultCallback(u8 r0, u16 reqResult) +{ + s32 r5; + u8 i; + + if (r0 == 0xFF) { - num = 0x504; // same as above, this should be r3 not r0 - if (unk1 < num) + if (gRfuStatic->flags & 8) + gRfuFixed->reqCallback(r0, reqResult); + r5 = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag; + for (i = 0; i < RFU_CHILD_MAX; ++i) + if ((r5 >> i) & 1) + rfu_STC_removeLinkData(i, 1); + gRfuLinkStatus->parentChild = MODE_NEUTRAL; + } +} + +u16 rfu_waitREQComplete(void) +{ + STWI_poll_CommandEnd(); + return gRfuStatic->reqResult; +} + +void rfu_REQ_RFUStatus(void) +{ + STWI_set_Callback_M(rfu_STC_REQ_callback); + STWI_send_SystemStatusREQ(); +} + +u16 rfu_getRFUStatus(u8 *rfuState) +{ + if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0] != 0x93) + return ERR_REQ_CMD_ID; + if (STWI_poll_CommandEnd() == 0) + *rfuState = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7]; + else + *rfuState = 0xFF; + return 0; +} + +u16 rfu_MBOOT_CHILD_inheritanceLinkStatus(void) +{ + const char *s1 = str_checkMbootLL; + char *s2 = (char *)0x30000F0; + u16 checksum; + u16 *r2; + u8 i; + + while (*s1 != '\0') + if (*s1++ != *s2++) return 1; + r2 = (u16 *)0x3000000; + checksum = 0; + for (i = 0; i < 90; ++i) + checksum += *r2++; + if (checksum != *(u16 *)0x30000FA) + return 1; + CpuCopy16((u16 *)0x3000000, gRfuLinkStatus, sizeof(struct RfuLinkStatus)); + gRfuStatic->flags |= 0x80; + return 0; +} + +void rfu_REQ_stopMode(void) +{ + vu32 *timerReg; + + if (REG_IME == 0) + { + rfu_STC_REQ_callback(61, 6); + gSTWIStatus->error = ERR_REQ_CMD_IME_DISABLE; } - gUnknown_03007890 = unk0; - gUnknown_03007894 = unk0 + (0xB4 / sizeof(u32)); - gUnknown_03007898 = (struct RfuUnk3*)(unk0 + (0xDC / sizeof(u32))); - gUnknown_03007880[0] = (struct RfuUnk2*)(unk0 + (0x1BC / sizeof(u32))); - gUnknown_03007870[0] = (struct RfuUnk1*)(unk0 + (0x37C / sizeof(u32))); + else + { + AgbRFU_SoftReset(); + rfu_STC_clearAPIVariables(); + if (AgbRFU_checkID(8) == 0x8001) + { + timerReg = ®_TMCNT(gSTWIStatus->timerSelect); + *timerReg = 0; + *timerReg = (TIMER_ENABLE | TIMER_1024CLK) << 16; + while (*timerReg << 16 < 262 << 16) + ; + *timerReg = 0; + STWI_set_Callback_M(rfu_CB_stopMode); + STWI_send_StopModeREQ(); + } + else + { + REG_SIOCNT = SIO_MULTI_MODE; + rfu_STC_REQ_callback(61, 0); + } + } +} - for (i = 1; i < 4; i++, num) +static void rfu_CB_stopMode(u8 a1, u16 reqResult) +{ + if (reqResult == 0) + REG_SIOCNT = SIO_MULTI_MODE; + rfu_STC_REQ_callback(a1, reqResult); +} + +u32 rfu_REQBN_softReset_and_checkID(void) +{ + u32 r2; + + if (REG_IME == 0) + return ERR_ID_CHECK_IME_DISABLE; + AgbRFU_SoftReset(); + rfu_STC_clearAPIVariables(); + if ((r2 = AgbRFU_checkID(30)) == 0) + REG_SIOCNT = SIO_MULTI_MODE; + return r2; +} + +void rfu_REQ_reset(void) +{ + STWI_set_Callback_M(rfu_CB_reset); + STWI_send_ResetREQ(); +} + +static void rfu_CB_reset(u8 a1, u16 reqResult) +{ + if (reqResult == 0) + rfu_STC_clearAPIVariables(); + rfu_STC_REQ_callback(a1, reqResult); +} + +void rfu_REQ_configSystem(u16 availSlotFlag, u8 maxMFrame, u8 mcTimer) +{ + STWI_set_Callback_M(rfu_STC_REQ_callback); + STWI_send_SystemConfigREQ((availSlotFlag & AVAIL_SLOT1) | 0x3C, maxMFrame, mcTimer); + if (mcTimer == 0) { - gUnknown_03007880[i] = (struct RfuUnk2*)&gUnknown_03007880[i-1]->unk_70; - gUnknown_03007870[i] = (struct RfuUnk1*)&gUnknown_03007870[i-1]->unk_1c; + gRfuStatic->unk_1a = 1; + } + else + { + u16 IMEBackup = REG_IME; + + REG_IME = 0; + gRfuStatic->unk_1a = Div(600, mcTimer); + REG_IME = IMEBackup; } +} + +void rfu_REQ_configGameData(u8 mbootFlag, u16 serialNo, const u8 *gname, const u8 *uname) +{ + u8 sp[16]; + u8 i; + u8 r3; + const u8 *gnameBackup = gname; + const u8 *unameBackup; + + sp[0] = serialNo; + sp[1] = serialNo >> 8; + if (mbootFlag != 0) + sp[1] = (serialNo >> 8) | 0x80; + for (i = 2; i < 15; ++i) + sp[i] = *gname++; + r3 = 0; + unameBackup = uname; + for (i = 0; i < 8; ++i) + { + r3 += *unameBackup++; + r3 += *gnameBackup++; + } + sp[15] = ~r3; + if (mbootFlag != 0) + sp[14] = 0; + STWI_set_Callback_M(rfu_CB_configGameData); + STWI_send_GameConfigREQ(sp, uname); +} + +static void rfu_CB_configGameData(u8 ip, u16 r7) +{ + s32 r2, r3; + u8 *r4; + u8 i; + u8 *r1; + + if (r7 == 0) + { + r1 = gSTWIStatus->txPacket->rfuPacket8.data; + r2 = gRfuLinkStatus->my.serialNo = r1[4]; + gRfuLinkStatus->my.serialNo = (r1[5] << 8) | r2; + r4 = &r1[6]; + if (gRfuLinkStatus->my.serialNo & 0x8000) + { + gRfuLinkStatus->my.serialNo = gRfuLinkStatus->my.serialNo ^ 0x8000; + gRfuLinkStatus->my.mbootFlag = 1; + } + else + { + gRfuLinkStatus->my.mbootFlag = 0; + } + for (i = 0; i < RFU_GAME_NAME_LENGTH; ++i) + gRfuLinkStatus->my.gname[i] = *r4++; + ++r4; + for (i = 0; i < RFU_USER_NAME_LENGTH; ++i) + gRfuLinkStatus->my.uname[i] = *r4++; + } + rfu_STC_REQ_callback(ip, r7); +} + +void rfu_REQ_startSearchChild(void) +{ + u16 r1; + + for (r1 = 0; r1 < 4; ++r1) + gRfuStatic->lsFixedCount[r1] = 0; + STWI_set_Callback_M(rfu_CB_defaultCallback); + STWI_send_SystemStatusREQ(); + r1 = STWI_poll_CommandEnd(); + if (r1 == 0) + { + if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0) + rfu_STC_clearLinkStatus(1); + } + else + { + rfu_STC_REQ_callback(25, r1); + } + STWI_set_Callback_M(rfu_CB_startSearchChild); + STWI_send_SC_StartREQ(); +} + +static void rfu_CB_startSearchChild(u8 r3, u16 reqResult) +{ + if (reqResult == 0) + gRfuStatic->SCStartFlag = 1; + rfu_STC_REQ_callback(r3, reqResult); +} + +static void rfu_STC_clearLinkStatus(u8 r4) +{ + u8 i; - gUnknown_03007898->unk_dc = (u32)&gUnknown_03007870[3]->unk_1c; - STWI_init_all(&gUnknown_03007870[3]->unk_1c, interrupt, copyInterruptToRam); - rfu_STC_clearAPIVariables(); + rfu_clearAllSlot(); + if (r4 != 0) + { + CpuFill16(0, gRfuLinkStatus->partner, sizeof(gRfuLinkStatus->partner)); + gRfuLinkStatus->findParentCount = 0; + } + for (i = 0; i < RFU_CHILD_MAX; ++i) + gRfuLinkStatus->strength[i] = 0; + gRfuLinkStatus->connCount = 0; + gRfuLinkStatus->connSlotFlag = 0; + gRfuLinkStatus->linkLossSlotFlag = 0; + gRfuLinkStatus->getNameFlag = 0; +} + +void rfu_REQ_pollSearchChild(void) +{ + STWI_set_Callback_M(rfu_CB_pollAndEndSearchChild); + STWI_send_SC_PollingREQ(); +} - for (i = 0; i < 4; i++) +void rfu_REQ_endSearchChild(void) +{ + STWI_set_Callback_M(rfu_CB_pollAndEndSearchChild); + STWI_send_SC_EndREQ(); +} + +static void rfu_CB_pollAndEndSearchChild(u8 r4, u16 reqResult) +{ + if (reqResult == 0) + rfu_STC_readChildList(); + if (r4 == 26) { - gUnknown_03007880[i]->unk_68 = 0; - gUnknown_03007880[i]->unk_6c = 0; - gUnknown_03007870[i]->unk_14 = 0; - gUnknown_03007870[i]->unk_18 = 0; + if (gRfuLinkStatus->my.id == 0) + { + STWI_set_Callback_M(rfu_CB_defaultCallback); + STWI_send_SystemStatusREQ(); + if (STWI_poll_CommandEnd() == 0) + gRfuLinkStatus->my.id = *(u16 *)&gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0]; + } } + else if (r4 == 27) + { + if (gRfuLinkStatus->parentChild == MODE_NEUTRAL) + gRfuLinkStatus->my.id = 0; + gRfuStatic->SCStartFlag = 0; + } + rfu_STC_REQ_callback(r4, reqResult); +} - // Not matching, register differences - v12 = (u16*)((u32)&sub_82E53F4 & ~1); - v13 = (u16*)gUnknown_03007898->unk_8; - - for (i = 47; i != 0xFFFF; i--) +static void rfu_STC_readChildList(void) +{ + u32 r5; + u8 r8 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[1]; + u8 *r4; + u8 i; + u8 r2; + + for (r4 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4]; + r8 != 0; + r4 += 4) { - *v13 = *v12; - ++v12; - ++v13; + r2 = r4[2]; + if (r2 < RFU_CHILD_MAX && !((gRfuLinkStatus->connSlotFlag >> r2) & 1) && !((gRfuLinkStatus->linkLossSlotFlag >> r2) & 1)) + { + gRfuStatic->lsFixedCount[r2] = 0xF0; + gRfuLinkStatus->strength[r2] = 0x10; + gRfuLinkStatus->connSlotFlag |= 1 << r2; + ++gRfuLinkStatus->connCount; + gRfuLinkStatus->partner[r2].id = *(u16 *)r4; + gRfuLinkStatus->partner[r2].slot = r2; + gRfuLinkStatus->parentChild = MODE_PARENT; + gRfuStatic->flags &= 0x7F; + gRfuStatic->cidBak[r2] = gRfuLinkStatus->partner[r2].id; + } + --r8; } +} + +void rfu_REQ_startSearchParent(void) +{ + STWI_set_Callback_M(rfu_CB_startSearchParent); + STWI_send_SP_StartREQ(); +} + +static void rfu_CB_startSearchParent(u8 r5, u16 reqResult) +{ + if (reqResult == 0) + rfu_STC_clearLinkStatus(0); + rfu_STC_REQ_callback(r5, reqResult); +} + +void rfu_REQ_pollSearchParent(void) +{ + STWI_set_Callback_M(rfu_CB_pollSearchParent); + STWI_send_SP_PollingREQ(); +} + +static void rfu_CB_pollSearchParent(u8 r5, u16 reqResult) +{ + if (reqResult == 0) + rfu_STC_readParentCandidateList(); + rfu_STC_REQ_callback(r5, reqResult); +} + +void rfu_REQ_endSearchParent(void) +{ + STWI_set_Callback_M(rfu_STC_REQ_callback); + STWI_send_SP_EndREQ(); +} + +static void rfu_STC_readParentCandidateList(void) +{ + u8 r7, r6, r5, r4, r3; + u8 *r1, *r2; + struct RfuTgtData *r4_; + + CpuFill16(0, gRfuLinkStatus->partner, sizeof(gRfuLinkStatus->partner)); + r2 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0]; + r7 = r2[1]; + r2 += 4; + gRfuLinkStatus->findParentCount = 0; + for (r6 = 0; r6 < 4 && r7 != 0; ++r6) + { + r7 -= 7; + r1 = r2 + 6; + r2 += 19; + r5 = ~*r2; + ++r2; + r4 = 0; + for (r3 = 0; r3 < 8; ++r3) + { + r4 += *r2++; + r4 += *r1++; + } + if (r4 == r5) + { + r2 -= 28; + r4_ = &gRfuLinkStatus->partner[gRfuLinkStatus->findParentCount]; + r4_->id = *(u16 *)r2; + r2 += 2; + r4_->slot = *r2; + r2 += 2; + r4_->serialNo = *(u16 *)r2 & 0x7FFF; + if (*(u16 *)r2 & 0x8000) + r4_->mbootFlag = 1; + else + r4_->mbootFlag = 0; + r2 += 2; + for (r3 = 0; r3 < RFU_GAME_NAME_LENGTH; ++r3) + r4_->gname[r3] = *r2++; + ++r2; + for (r3 = 0; r3 < RFU_USER_NAME_LENGTH; ++r3) + r4_->uname[r3] = *r2++; + ++gRfuLinkStatus->findParentCount; + } + } +} + +void rfu_REQ_startConnectParent(u16 pid) +{ + u16 r3 = 0; + u8 i; + for (i = 0; i < RFU_CHILD_MAX && gRfuLinkStatus->partner[i].id != pid; ++i) + ; + if (i == 4) + r3 = 256; + if (r3 == 0) + { + gRfuStatic->tryPid = pid; + STWI_set_Callback_M(rfu_STC_REQ_callback); + STWI_send_CP_StartREQ(pid); + } + else + { + rfu_STC_REQ_callback(31, r3); + } +} + +void rfu_REQ_pollConnectParent(void) +{ + STWI_set_Callback_M(rfu_CB_pollConnectParent); + STWI_send_CP_PollingREQ(); +} + +static void rfu_CB_pollConnectParent(u8 sp24, u16 sp28) +{ + u16 id; + u8 slot; + u8 r2, r5; + struct RfuTgtData *r9; + struct RfuTgtData sp; + + if (sp28 == 0) + { + id = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0]; + slot = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[6]; + if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0) + { + r2 = 1 << slot; + if (!(r2 & gRfuLinkStatus->connSlotFlag)) + { + gRfuLinkStatus->connSlotFlag |= r2; + gRfuLinkStatus->linkLossSlotFlag &= ~r2; + gRfuLinkStatus->my.id = id; + ++gRfuLinkStatus->connCount; + gRfuLinkStatus->parentChild = MODE_CHILD; + gRfuStatic->flags |= 0x80; + for (r5 = 0; r5 < RFU_CHILD_MAX; ++r5) + { + if (gRfuLinkStatus->partner[r5].id == gRfuStatic->tryPid) + { + if (gRfuLinkStatus->findParentCount != 0) + { + r9 = &sp; + CpuCopy16(&gRfuLinkStatus->partner[r5], &sp, sizeof(struct RfuTgtData)); + CpuFill16(0, gRfuLinkStatus->partner, sizeof(gRfuLinkStatus->partner)); + gRfuLinkStatus->findParentCount = 0; + } + else + { + r9 = &gRfuLinkStatus->partner[r5]; + } + break; + } + } + if (r5 < RFU_CHILD_MAX) + { + CpuCopy16(r9, &gRfuLinkStatus->partner[slot], sizeof(struct RfuTgtData)); + gRfuLinkStatus->partner[slot].slot = slot; + } + } + } + } + rfu_STC_REQ_callback(sp24, sp28); +} + +u16 rfu_getConnectParentStatus(u8 *status, u8 *connectSlotNo) +{ + u8 r0, *r2; + + *status = 0xFF; + r2 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data; + r0 = r2[0] + 96; + if (r0 <= 1) + { + r2 += 6; + *connectSlotNo = r2[0]; + *status = r2[1]; + return 0; + } + return ERR_REQ_CMD_ID; +} + +void rfu_REQ_endConnectParent(void) +{ + STWI_set_Callback_M(rfu_CB_pollConnectParent); + STWI_send_CP_EndREQ(); + if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[6] < 4) + gRfuStatic->linkEmergencyFlag[gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[6]] = 0; +} + +u16 rfu_syncVBlank(void) +{ + u8 r3, r4; + s32 r5; + + rfu_NI_checkCommFailCounter(); + if (gRfuLinkStatus->parentChild == MODE_NEUTRAL) + return 0; + if (gRfuStatic->nowWatchInterval != 0) + --gRfuStatic->nowWatchInterval; + r3 = rfu_getMasterSlave(); + if (!(gRfuStatic->flags & 2)) + { + if (r3 == 0) + { + gRfuStatic->flags |= 4; + gRfuStatic->watchdogTimer = 360; + } + } + else if (r3 != 0) + { + gRfuStatic->flags &= 0xFB; + } + if (r3 != 0) + gRfuStatic->flags &= 0xFD; + else + gRfuStatic->flags |= 2; + if (!(gRfuStatic->flags & 4)) + return 0; + if (gRfuStatic->watchdogTimer == 0) + { + gRfuStatic->flags &= 0xFB; + r5 = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag; + for (r4 = 0; r4 < RFU_CHILD_MAX; ++r4) + if ((r5 >> r4) & 1) + rfu_STC_removeLinkData(r4, 1); + gRfuLinkStatus->parentChild = MODE_NEUTRAL; + return 1; + } + --gRfuStatic->watchdogTimer; + return 0; +} + +u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason, u8 *parentBmLinkRecoverySlot) +{ + u8 sp08 = 0; + u8 sp0C = 0; + u8 i; + s32 sp10, sp14; + u8 *r2; + u8 r9, r6, r3, connSlotFlag, r0; + + *bmLinkLossSlot = 0; + *linkLossReason = REASON_DISCONNECTED; + *parentBmLinkRecoverySlot = 0; + if (gRfuLinkStatus->parentChild == MODE_NEUTRAL || gSTWIStatus->msMode == 0) + return 0; + if (gRfuStatic->flags & 4) + gRfuStatic->watchdogTimer = 360; + if (gRfuStatic->nowWatchInterval == 0) + { + gRfuStatic->nowWatchInterval = 4; + sp08 = 1; + } + if ((u8)reqCommandId == 41) + { + u8 *r1 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data; - gUnknown_03007898->unk_4 = (u32)(&gUnknown_03007898->unk_8[1]); - + *bmLinkLossSlot = r1[4]; + *linkLossReason = r1[5]; + if (*linkLossReason == REASON_LINK_LOSS) + *bmLinkLossSlot = gRfuLinkStatus->connSlotFlag; + sp08 = 2; + } + else + { + if (reqCommandId == 310) + { + r6 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[5]; + r6 ^= gRfuLinkStatus->connSlotFlag; + *bmLinkLossSlot = r6 & gRfuLinkStatus->connSlotFlag; + *linkLossReason = REASON_LINK_LOSS; + for (i = 0; i < RFU_CHILD_MAX; ++i) + { + if ((*bmLinkLossSlot >> i) & 1) + { + gRfuLinkStatus->strength[i] = 0; + rfu_STC_removeLinkData(i, 0); + } + } + } + if (sp08 == 0) + return 0; + } + sp10 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.command; + sp14 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0]; + STWI_set_Callback_M(rfu_CB_defaultCallback); + STWI_send_LinkStatusREQ(); + sp0C = STWI_poll_CommandEnd(); + if (sp0C == 0) + { + r2 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4]; + for (i = 0; i < RFU_CHILD_MAX; ++i) + gRfuLinkStatus->strength[i] = *r2++; + r9 = 0; + i = 0; + } + else + { + rfu_STC_REQ_callback(17, sp0C); + return sp0C; + } + for (; i < RFU_CHILD_MAX; ++i) + { + if (gRfuStatic->lsFixedCount[i] != 0) + { + gRfuStatic->lsFixedCount[i] -= 4; + if (gRfuLinkStatus->strength[i] <= 15) + gRfuLinkStatus->strength[i] = 16; + } + r6 = 1 << i; + if (sp0C == 0) + { + if (sp08 == 1 && (gRfuLinkStatus->connSlotFlag & r6)) + { + if (gRfuLinkStatus->strength[i] == 0) + { + if (gRfuLinkStatus->parentChild == MODE_PARENT) + { + ++gRfuStatic->linkEmergencyFlag[i]; + if (gRfuStatic->linkEmergencyFlag[i] > 3) + { + *bmLinkLossSlot |= r6; + *linkLossReason = sp08; // why not directly use REASON_LINK_LOSS? + } + } + else + { + STWI_send_SystemStatusREQ(); + if (STWI_poll_CommandEnd() == 0) + { + if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0) + { + *bmLinkLossSlot |= r6; + *linkLossReason = sp08; // why not directly use REASON_LINK_LOSS? + } + else + { + if (++gRfuStatic->linkEmergencyFlag[i] > gRfuStatic->unk_1a) + { + gRfuStatic->linkEmergencyFlag[i] = 0; + STWI_send_DisconnectREQ(gRfuLinkStatus->connSlotFlag); + STWI_poll_CommandEnd(); + *bmLinkLossSlot |= r6; + *linkLossReason = sp08; // why not directly use REASON_LINK_LOSS? + } + } + } + } + } + else + { + gRfuStatic->linkEmergencyFlag[i] = sp0C; // why not directly use 0? + } + } + if (gRfuLinkStatus->parentChild == MODE_PARENT && gRfuLinkStatus->strength[i] != 0) + { + if (r6 & gRfuLinkStatus->linkLossSlotFlag) + { + if (gRfuLinkStatus->strength[i] > 10) + { + *parentBmLinkRecoverySlot |= r6; + gRfuLinkStatus->connSlotFlag |= r6; + gRfuLinkStatus->linkLossSlotFlag &= ~r6; + ++gRfuLinkStatus->connCount; + gRfuStatic->linkEmergencyFlag[i] = 0; + } + else + { + gRfuLinkStatus->strength[i] = 0; + } + } + else + { + if (!((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) & r6)) + { + STWI_send_SlotStatusREQ(); + STWI_poll_CommandEnd(); + r2 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data; + r3 = r2[1] - 1; + for (r2 += 8; r3 != 0; r2 += 4, --r3) + { + u16 r4 = *(u16 *)r2; + + if (r2[2] == i && r4 == gRfuStatic->cidBak[i]) + { + r9 |= 1 << i; + break; + } + } + } + } + } + } + connSlotFlag = gRfuLinkStatus->connSlotFlag; + r0 = *bmLinkLossSlot; + r0 &= connSlotFlag; + if (r6 & r0) + rfu_STC_removeLinkData(i, 0); + } + if (r9 != 0) + { + STWI_send_DisconnectREQ(r9); + STWI_poll_CommandEnd(); + } + // equivalent to: + // gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.command = sp10; + *(u32 *)gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data = sp10; + gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0] = sp14; + return 0; +} + +static void rfu_STC_removeLinkData(u8 r7, u8 r12) +{ + u8 r5 = 1 << r7; + s32 r6; + + gRfuStatic->lsFixedCount[r7] = 0; + if ((gRfuLinkStatus->connSlotFlag & r5) && gRfuLinkStatus->connCount != 0) + --gRfuLinkStatus->connCount; + gRfuLinkStatus->connSlotFlag &= r6 = ~r5; + gRfuLinkStatus->linkLossSlotFlag |= r5; + if ((*(u32 *)gRfuLinkStatus & 0xFF00FF) == 0) + gRfuLinkStatus->parentChild = MODE_NEUTRAL; + if (r12 != 0) + { + CpuFill16(0, &gRfuLinkStatus->partner[r7], sizeof(struct RfuTgtData)); + gRfuLinkStatus->linkLossSlotFlag &= r6; + gRfuLinkStatus->getNameFlag &= r6; + gRfuLinkStatus->strength[r7] = 0; + } +} + +void rfu_REQ_disconnect(u8 bmDisconnectSlot) +{ + u16 r1; + + if ((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) & bmDisconnectSlot) + { + gRfuStatic->recoveryBmSlot = bmDisconnectSlot; + if (gRfuLinkStatus->parentChild == MODE_NEUTRAL && gRfuStatic->flags & 0x80) + { + if (gRfuLinkStatus->linkLossSlotFlag & bmDisconnectSlot) + rfu_CB_disconnect(48, 0); + } + else if (gRfuStatic->SCStartFlag + && (STWI_set_Callback_M(rfu_CB_defaultCallback), + STWI_send_SC_EndREQ(), + (r1 = STWI_poll_CommandEnd()) != 0)) + { + rfu_STC_REQ_callback(27, r1); + } + else + { + STWI_set_Callback_M(rfu_CB_disconnect); + STWI_send_DisconnectREQ(bmDisconnectSlot); + } + } +} + +static void rfu_CB_disconnect(u8 r6, u16 r5) +{ + u8 r4, r0; + + if (r5 == 3 && gRfuLinkStatus->parentChild == MODE_CHILD) + { + STWI_set_Callback_M(rfu_CB_defaultCallback); + STWI_send_SystemStatusREQ(); + if (STWI_poll_CommandEnd() == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0) + r5 = 0; + } + gRfuStatic->recoveryBmSlot &= gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag; + gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[8] = gRfuStatic->recoveryBmSlot; + if (r5 == 0) + { + for (r4 = 0; r4 < RFU_CHILD_MAX; ++r4) + { + r0 = 1 << r4; + if (r0 & gRfuStatic->recoveryBmSlot) + rfu_STC_removeLinkData(r4, 1); + } + } + if ((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) == 0) + gRfuLinkStatus->parentChild = MODE_NEUTRAL; + rfu_STC_REQ_callback(r6, r5); + if (gRfuStatic->SCStartFlag) + { + STWI_set_Callback_M(rfu_CB_defaultCallback); + STWI_send_SC_StartREQ(); + r5 = STWI_poll_CommandEnd(); + if (r5 != 0) + rfu_STC_REQ_callback(25, r5); + } +} + +void rfu_REQ_CHILD_startConnectRecovery(u8 bmRecoverySlot) +{ + u8 i; + + gRfuStatic->recoveryBmSlot = bmRecoverySlot; + for (i = 0; i < RFU_CHILD_MAX && !((bmRecoverySlot >> i) & 1); ++i) + ; + STWI_set_Callback_M(rfu_STC_REQ_callback); + // if i == 4, gRfuLinkStatus->partner[i].id becomes gRfuLinkStatus->my.id + STWI_send_CPR_StartREQ(gRfuLinkStatus->partner[i].id, gRfuLinkStatus->my.id, bmRecoverySlot); +} + +void rfu_REQ_CHILD_pollConnectRecovery(void) +{ + STWI_set_Callback_M(rfu_CB_CHILD_pollConnectRecovery); + STWI_send_CPR_PollingREQ(); +} + +static void rfu_CB_CHILD_pollConnectRecovery(u8 r8, u16 r7) +{ + u8 r3, r4; + struct RfuLinkStatus *r2; + + if (r7 == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4] == 0 && gRfuStatic->recoveryBmSlot) + { + gRfuLinkStatus->parentChild = MODE_CHILD; + for (r4 = 0; r4 < NELEMS(gRfuStatic->linkEmergencyFlag); ++r4) + { + r3 = 1 << r4; + r2 = gRfuLinkStatus; // ??? + if (gRfuStatic->recoveryBmSlot & r3 & r2->linkLossSlotFlag) + { + gRfuLinkStatus->connSlotFlag |= r3; + gRfuLinkStatus->linkLossSlotFlag &= ~r3; + ++gRfuLinkStatus->connCount; + gRfuStatic->linkEmergencyFlag[r4] = 0; + } + } + gRfuStatic->recoveryBmSlot = 0; + } + rfu_STC_REQ_callback(r8, r7); +} + +u16 rfu_CHILD_getConnectRecoveryStatus(u8 *status) +{ + u8 r0; + + *status = 0xFF; + r0 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0] + 77; + if (r0 <= 1) + { + *status = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4]; + return 0; + } + return ERR_REQ_CMD_ID; +} + +void rfu_REQ_CHILD_endConnectRecovery(void) +{ + STWI_set_Callback_M(rfu_CB_CHILD_pollConnectRecovery); + STWI_send_CPR_EndREQ(); +} + +static void rfu_STC_fastCopy(const u8 **src_p, u8 **dst_p, s32 size) +{ + const u8 *src = *src_p; + u8 *dst = *dst_p; + s32 i; + + for (i = size - 1; i != -1; --i) + *dst++ = *src++; + *src_p = src; + *dst_p = dst; +} + +void rfu_REQ_changeMasterSlave(void) +{ + if (STWI_read_status(1) == 1) + { + STWI_set_Callback_M(rfu_STC_REQ_callback); + STWI_send_MS_ChangeREQ(); + } + else + { + rfu_STC_REQ_callback(39, 0); + } +} + +bool8 rfu_getMasterSlave(void) +{ + bool8 masterSlave = STWI_read_status(1); + + if (masterSlave == AGB_CLK_MASTER) + { + if (gSTWIStatus->unk_2c) + { + if (gSTWIStatus->reqActiveCommand == 39 + || gSTWIStatus->reqActiveCommand == 37 + || gSTWIStatus->reqActiveCommand == 55) + masterSlave = AGB_CLK_SLAVE; + } + } + return masterSlave; +} + +void rfu_clearAllSlot(void) +{ + u16 i; + u16 IMEBackup = REG_IME; + + REG_IME = 0; + for (i = 0; i < RFU_CHILD_MAX; ++i) + { + CpuFill16(0, gRfuSlotStatusNI[i], 2 * sizeof(struct NIComm)); + CpuFill16(0, gRfuSlotStatusUNI[i], sizeof(struct UNISend) + sizeof(struct UNIRecv)); + gRfuLinkStatus->remainLLFrameSizeChild[i] = 16; + } + gRfuLinkStatus->remainLLFrameSizeParent = LLF_P_SIZE; + gRfuLinkStatus->sendSlotNIFlag = 0; + gRfuLinkStatus->recvSlotNIFlag = 0; + gRfuLinkStatus->sendSlotUNIFlag = 0; + gRfuStatic->recvRenewalFlag = 0; + REG_IME = IMEBackup; +} + +static void rfu_STC_releaseFrame(u8 r5, u8 r3, struct NIComm *r4) +{ + + if (!(gRfuStatic->flags & 0x80)) + { + if (r3 == 0) + gRfuLinkStatus->remainLLFrameSizeParent += r4->payloadSize; + gRfuLinkStatus->remainLLFrameSizeParent += 3; + } + else + { + if (r3 == 0) + gRfuLinkStatus->remainLLFrameSizeChild[r5] += r4->payloadSize; + gRfuLinkStatus->remainLLFrameSizeChild[r5] += 2; + } +} + +u16 rfu_clearSlot(u8 connTypeFlag, u8 slotStatusIndex) +{ + u16 r10, r3, r1; + struct NIComm *r4; + + if (slotStatusIndex >= RFU_CHILD_MAX) + return ERR_SLOT_NO; + if (!(connTypeFlag & (TYPE_UNI_SEND | TYPE_UNI_RECV | TYPE_NI_SEND | TYPE_NI_RECV))) + return ERR_COMM_TYPE; + r10 = REG_IME; + REG_IME = 0; + if (connTypeFlag & (TYPE_NI_SEND | TYPE_NI_RECV)) + { + for (r3 = 0; r3 < 2; ++r3) + { + r4 = NULL; + if (r3 == 0) + { + if (connTypeFlag & TYPE_NI_SEND) + { + r4 = &gRfuSlotStatusNI[slotStatusIndex]->send; + gRfuLinkStatus->sendSlotNIFlag &= ~r4->bmSlotOrg; + } + } + else + { + if (connTypeFlag & TYPE_NI_RECV) + { + r4 = &gRfuSlotStatusNI[slotStatusIndex]->recv; + gRfuLinkStatus->recvSlotNIFlag &= ~(1 << slotStatusIndex); + } + } + if (r4 != NULL) + { + if (r4->state & SLOT_BUSY_FLAG) + { + rfu_STC_releaseFrame(slotStatusIndex, r3, r4); + for (r1 = 0; r1 < RFU_CHILD_MAX; ++r1) + if ((r4->bmSlotOrg >> r1) & 1) + r4->failCounter = 0; + } + CpuFill16(0, r4, sizeof(struct NIComm)); + } + } + } + if (connTypeFlag & TYPE_UNI_SEND) + { + struct RfuSlotStatusUNI *r3 = gRfuSlotStatusUNI[slotStatusIndex]; + + if (r3->send.state & SLOT_BUSY_FLAG) + { + if (!(gRfuStatic->flags & 0x80)) + gRfuLinkStatus->remainLLFrameSizeParent += 3 + (u8)r3->send.payloadSize; + else + gRfuLinkStatus->remainLLFrameSizeChild[slotStatusIndex] += 2 + (u8)r3->send.payloadSize; + gRfuLinkStatus->sendSlotUNIFlag &= ~r3->send.bmSlot; + } + CpuFill16(0, &r3->send, sizeof(struct UNISend)); + } + if (connTypeFlag & TYPE_UNI_RECV) + { + CpuFill16(0, &gRfuSlotStatusUNI[slotStatusIndex]->recv, sizeof(struct UNIRecv)); + } + REG_IME = r10; + return 0; +} + +u16 rfu_setRecvBuffer(u8 connType, u8 slotNo, void *buffer, u32 buffSize) +{ + if (slotNo >= RFU_CHILD_MAX) + return ERR_SLOT_NO; + if (connType & TYPE_NI) + { + gRfuSlotStatusNI[slotNo]->recvBuffer = buffer; + gRfuSlotStatusNI[slotNo]->recvBufferSize = buffSize; + } + else if (!(connType & TYPE_UNI)) + { + return ERR_COMM_TYPE; + } + else + { + gRfuSlotStatusUNI[slotNo]->recvBuffer = buffer; + gRfuSlotStatusUNI[slotNo]->recvBufferSize = buffSize; + } + return 0; +} + +u16 rfu_NI_setSendData(u8 bmSendSlot, u8 subFrameSize, const void *src, u32 size) +{ + return rfu_STC_setSendData_org(32, bmSendSlot, subFrameSize, src, size); +} + +u16 rfu_UNI_setSendData(u8 bmSendSlot, const void *src, u8 size) +{ + u8 subFrameSize; + + if (gRfuLinkStatus->parentChild == MODE_PARENT) + subFrameSize = size + 3; + else + subFrameSize = size + 2; + return rfu_STC_setSendData_org(16, bmSendSlot, subFrameSize, src, 0); +} + +u16 rfu_NI_CHILD_setSendGameName(u8 slotNo, u8 subFrameSize) +{ + return rfu_STC_setSendData_org(64, 1 << slotNo, subFrameSize, &gRfuLinkStatus->my.serialNo, 26); +} + +static u16 rfu_STC_setSendData_org(u8 r6, u8 bmSendSlot, u8 subFrameSize, const void *src, u32 sp28) +{ + u8 r2, r0; + u8 r4; + u8 *r9; + u8 r5; + u8 i; + u16 sp04; + struct RfuSlotStatusUNI *r1; + struct RfuSlotStatusNI *r12; + + if (gRfuLinkStatus->parentChild == MODE_NEUTRAL) + return ERR_MODE_NOT_CONNECTED; + if (!(bmSendSlot & 0xF)) + return ERR_SLOT_NO; + if (((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) & bmSendSlot) != bmSendSlot) + return ERR_SLOT_NOT_CONNECTED; + if (r6 & 0x10) + r0 = gRfuLinkStatus->sendSlotUNIFlag; + else + r0 = gRfuLinkStatus->sendSlotNIFlag; + if (r0 & bmSendSlot) + return ERR_SLOT_BUSY; + for (r2 = 0; r2 < RFU_CHILD_MAX && !((bmSendSlot >> r2) & 1); ++r2) + ; + if (gRfuLinkStatus->parentChild == MODE_PARENT) + r9 = &gRfuLinkStatus->remainLLFrameSizeParent; + else if (gRfuLinkStatus->parentChild == MODE_CHILD) + r9 = &gRfuLinkStatus->remainLLFrameSizeChild[r2]; + r4 = llsf_struct[gRfuLinkStatus->parentChild].unk00; + if (subFrameSize > *r9 || subFrameSize <= r4) + return ERR_SUBFRAME_SIZE; + sp04 = REG_IME; + REG_IME = 0; + r5 = r6 & 0x20; + if (r5 || r6 == 0x40) + { + u8 *r1; // a hack to swap instructions + + r12 = gRfuSlotStatusNI[r2]; + r1 = NULL; + r12->send.errorCode = 0; + *r12->send.now_p = r1 = &r12->send.dataType; + r12->send.remainSize = 7; + r12->send.bmSlotOrg = bmSendSlot; + r12->send.bmSlot = bmSendSlot; + r12->send.payloadSize = subFrameSize - r4; + if (r5 != 0) + *r1 = 0; + else + *r1 = 1; + r12->send.dataSize = sp28; + r12->send.src = src; + r12->send.ack = 0; + r12->send.phase = 0; + #ifndef NONMATCHING // to fix r2, r3, r4, r5 register roulette + asm("":::"r2"); + #endif + for (i = 0; i < WINDOW_COUNT; ++i) + { + r12->send.recvAckFlag[i] = 0; + r12->send.n[i] = 1; + } + for (r2 = 0; r2 < RFU_CHILD_MAX; ++r2) + if ((bmSendSlot >> r2) & 1) + gRfuSlotStatusNI[r2]->send.failCounter = 0; + gRfuLinkStatus->sendSlotNIFlag |= bmSendSlot; + *r9 -= subFrameSize; + r12->send.state = SLOT_STATE_SEND_START; + } + else if (r6 & 0x10) + { + r1 = gRfuSlotStatusUNI[r2]; + r1->send.bmSlot = bmSendSlot; + r1->send.src = src; + r1->send.payloadSize = subFrameSize - r4; + *r9 -= subFrameSize; + r1->send.state = SLOT_STATE_SEND_UNI; + gRfuLinkStatus->sendSlotUNIFlag |= bmSendSlot; + } + REG_IME = sp04; + return 0; +} + +u16 rfu_changeSendTarget(u8 connType, u8 slotStatusIndex, u8 bmNewTgtSlot) +{ + struct RfuSlotStatusNI *r5; + u16 r8; + u8 r2; + + if (slotStatusIndex >= RFU_CHILD_MAX) + return ERR_SLOT_NO; + if (connType == 0x20) + { + r5 = gRfuSlotStatusNI[slotStatusIndex]; + if ((r5->send.state & SLOT_BUSY_FLAG) + && (r5->send.state & SLOT_SEND_FLAG)) + { + connType = bmNewTgtSlot ^ r5->send.bmSlot; + + if (!(connType & bmNewTgtSlot)) + { + if (connType) + { + r8 = REG_IME; + REG_IME = 0; + for (r2 = 0; r2 < RFU_CHILD_MAX; ++r2) + { + if ((connType >> r2) & 1) + gRfuSlotStatusNI[r2]->send.failCounter = 0; + } + gRfuLinkStatus->sendSlotNIFlag &= ~connType; + r5->send.bmSlot = bmNewTgtSlot; + if (r5->send.bmSlot == 0) + { + rfu_STC_releaseFrame(slotStatusIndex, 0, &r5->send); + r5->send.state = SLOT_STATE_SEND_FAILED; + } + REG_IME = r8; + } + } + else + { + return ERR_SLOT_TARGET; + } + } + else + { + return ERR_SLOT_NOT_SENDING; + } + } + else + { + if (connType == 16) + { + s32 r3; + + if (gRfuSlotStatusUNI[slotStatusIndex]->send.state != SLOT_STATE_SEND_UNI) + return ERR_SLOT_NOT_SENDING; + for (r3 = 0, r2 = 0; r2 < RFU_CHILD_MAX; ++r2) + if (r2 != slotStatusIndex) + r3 |= gRfuSlotStatusUNI[r2]->send.bmSlot; + if (bmNewTgtSlot & r3) + return ERR_SLOT_TARGET; + r8 = REG_IME; + REG_IME = 0; + gRfuLinkStatus->sendSlotUNIFlag &= ~gRfuSlotStatusUNI[slotStatusIndex]->send.bmSlot; + gRfuLinkStatus->sendSlotUNIFlag |= bmNewTgtSlot; + gRfuSlotStatusUNI[slotStatusIndex]->send.bmSlot = bmNewTgtSlot; + REG_IME = r8; + } + else + { + return ERR_COMM_TYPE; + } + } + return 0; +} + +u16 rfu_NI_stopReceivingData(u8 slotStatusIndex) +{ + struct NIComm *r5; + u16 r4, r1; + + if (slotStatusIndex >= RFU_CHILD_MAX) + return ERR_SLOT_NO; + r5 = &gRfuSlotStatusNI[slotStatusIndex]->recv; + r4 = REG_IME; + ++r4; --r4; // fix r4, r5 register swap + REG_IME = 0; + if (gRfuSlotStatusNI[slotStatusIndex]->recv.state & SLOT_BUSY_FLAG) + { + if (gRfuSlotStatusNI[slotStatusIndex]->recv.state == SLOT_STATE_RECV_LAST) + gRfuSlotStatusNI[slotStatusIndex]->recv.state = SLOT_STATE_RECV_SUCCESS_AND_SENDSIDE_UNKNOWN; + else + gRfuSlotStatusNI[slotStatusIndex]->recv.state = SLOT_STATE_RECV_FAILED; + gRfuLinkStatus->recvSlotNIFlag &= ~(1 << slotStatusIndex); + rfu_STC_releaseFrame(slotStatusIndex, 1, r5); + } + REG_IME = r4; return 0; -}*/ +} + +u16 rfu_UNI_changeAndReadySendData(u8 slotStatusIndex, const void *src, u8 size) +{ + struct UNISend *r4; + u8 *r6; + u16 r1; + u8 r3_; + + if (slotStatusIndex >= RFU_CHILD_MAX) + return ERR_SLOT_NO; + r4 = &gRfuSlotStatusUNI[slotStatusIndex]->send; + if (r4->state != SLOT_STATE_SEND_UNI) + return ERR_SLOT_NOT_SENDING; + if (gRfuLinkStatus->parentChild == MODE_PARENT) + { + r6 = &gRfuLinkStatus->remainLLFrameSizeParent; + r3_ = gRfuLinkStatus->remainLLFrameSizeParent + (u8)r4->payloadSize; + } + else + { + r6 = &gRfuLinkStatus->remainLLFrameSizeChild[slotStatusIndex]; + r3_ = gRfuLinkStatus->remainLLFrameSizeChild[slotStatusIndex] + (u8)r4->payloadSize; + } + if (r3_ < size) + return ERR_SUBFRAME_SIZE; + r1 = REG_IME; + REG_IME = 0; + r4->src = src; + *r6 = r3_ - size; + r4->payloadSize = size; + r4->dataReadyFlag = 1; + REG_IME = r1; + return 0; +} + +void rfu_UNI_readySendData(u8 slotStatusIndex) +{ + if (slotStatusIndex < RFU_CHILD_MAX) + { + if (gRfuSlotStatusUNI[slotStatusIndex]->send.state == SLOT_STATE_SEND_UNI) + gRfuSlotStatusUNI[slotStatusIndex]->send.dataReadyFlag = 1; + } +} + +void rfu_UNI_clearRecvNewDataFlag(u8 slotStatusIndex) +{ + if (slotStatusIndex < RFU_CHILD_MAX) + gRfuSlotStatusUNI[slotStatusIndex]->recv.newDataFlag = 0; +} + +void rfu_REQ_sendData(bool8 clockChangeFlag) +{ + if (gRfuLinkStatus->parentChild != MODE_NEUTRAL) + { + if (gRfuLinkStatus->parentChild == MODE_PARENT + && !(gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag | gRfuLinkStatus->sendSlotUNIFlag)) + { + if (gRfuStatic->commExistFlag) + { + gRfuStatic->emberCount = 16; + gRfuStatic->nullFrameCount = 0; + } + if (gRfuStatic->emberCount) + --gRfuStatic->emberCount; + else + ++gRfuStatic->nullFrameCount; + if (gRfuStatic->emberCount + || !(gRfuStatic->nullFrameCount & 0xF)) + { + gRfuFixed->LLFBuffer[0] = 1; + gRfuFixed->LLFBuffer[4] = 0xFF; + STWI_set_Callback_M(rfu_CB_sendData3); + if (!clockChangeFlag) + STWI_send_DataTxREQ(gRfuFixed->LLFBuffer, 1); + else + STWI_send_DataTxAndChangeREQ(gRfuFixed->LLFBuffer, 1); + return; + } + } + else + { + if (!gRfuLinkStatus->LLFReadyFlag) + rfu_constructSendLLFrame(); + if (gRfuLinkStatus->LLFReadyFlag) + { + STWI_set_Callback_M(rfu_CB_sendData); + if (clockChangeFlag) + { + STWI_send_DataTxAndChangeREQ(gRfuFixed->LLFBuffer, gRfuStatic->totalPacketSize + 4); + return; + } + STWI_send_DataTxREQ(gRfuFixed->LLFBuffer, gRfuStatic->totalPacketSize + 4); + } + } + if (clockChangeFlag) + { + if (gRfuLinkStatus->parentChild == MODE_PARENT) + { + if (gSTWIStatus->callbackS != NULL) + gSTWIStatus->callbackS(39); + } + else + { + STWI_set_Callback_M(rfu_CB_sendData2); + STWI_send_MS_ChangeREQ(); + } + } + } +} + +static void rfu_CB_sendData(__attribute__((unused)) u8 r0, u16 r7) +{ + u8 r6; + struct NIComm *r4; + + if (r7 == 0) + { + for (r6 = 0; r6 < RFU_CHILD_MAX; ++r6) + { + if (gRfuSlotStatusUNI[r6]->send.dataReadyFlag) + gRfuSlotStatusUNI[r6]->send.dataReadyFlag = 0; + r4 = &gRfuSlotStatusNI[r6]->send; + if (r4->state == SLOT_STATE_SEND_NULL) + { + rfu_STC_releaseFrame(r6, 0, r4); + gRfuLinkStatus->sendSlotNIFlag &= ~r4->bmSlot; + if (r4->dataType == 1) + gRfuLinkStatus->getNameFlag |= 1 << r6; + r4->state = SLOT_STATE_SEND_SUCCESS; + } + } + } + gRfuLinkStatus->LLFReadyFlag = 0; + rfu_STC_REQ_callback(36, r7); +} + +static void rfu_CB_sendData2(__attribute__((unused)) u8 r0, u16 r1) +{ + rfu_STC_REQ_callback(36, r1); +} + +static void rfu_CB_sendData3(u8 r0, u16 r1) +{ + if (r1 != 0) + rfu_STC_REQ_callback(36, r1); + else if (r0 == 0xFF) + rfu_STC_REQ_callback(0xFF, 0); +} + +static void rfu_constructSendLLFrame(void) +{ + u32 r8, r5; + u8 r6; + u8 *sp00; + struct RfuSlotStatusNI *r2; + + if (gRfuLinkStatus->parentChild != MODE_NEUTRAL + && gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag | gRfuLinkStatus->sendSlotUNIFlag) + { + gRfuLinkStatus->LLFReadyFlag = 0; + r8 = 0; + sp00 = (u8 *)&gRfuFixed->LLFBuffer[1]; + for (r6 = 0; r6 < RFU_CHILD_MAX; ++r6) + { + r5 = 0; + if (gRfuSlotStatusNI[r6]->send.state & SLOT_BUSY_FLAG) + r5 = rfu_STC_NI_constructLLSF(r6, &sp00, &gRfuSlotStatusNI[r6]->send); + if (gRfuSlotStatusNI[r6]->recv.state & SLOT_BUSY_FLAG) + r5 += rfu_STC_NI_constructLLSF(r6, &sp00, &gRfuSlotStatusNI[r6]->recv); + if (gRfuSlotStatusUNI[r6]->send.state == SLOT_STATE_SEND_UNI) + r5 += rfu_STC_UNI_constructLLSF(r6, &sp00); + if (r5 != 0) + { + if (gRfuLinkStatus->parentChild == MODE_PARENT) + r8 += r5; + else + r8 |= r5 << (5 * r6 + 8); + } + } + if (r8 != 0) + { + while ((u32)sp00 & 3) + *sp00++ = 0; + gRfuFixed->LLFBuffer[0] = r8; + if (gRfuLinkStatus->parentChild == MODE_CHILD) + { + u8 *r0 = sp00 - offsetof(struct RfuFixed, LLFBuffer[1]); + + // Does the volatile qualifier make sense? + // It's the same as: + // asm("":::"memory"); + r8 = r0 - *(u8 *volatile *)&gRfuFixed; + } + } + gRfuStatic->totalPacketSize = r8; + } +} + +static u16 rfu_STC_NI_constructLLSF(u8 r10, u8 **r12, struct NIComm *r4) +{ + u16 r5; + u32 sp00; + u8 i; + u8 *r2; + const struct LLSFStruct *r8 = &llsf_struct[gRfuLinkStatus->parentChild]; + + if (r4->state == SLOT_STATE_SENDING) + { + while (r4->now_p[r4->phase] >= (const u8 *)r4->src + r4->dataSize) + { + ++r4->phase; + if (r4->phase == 4) + r4->phase = 0; + } + } + if (r4->state & SLOT_RECV_FLAG) + { + r5 = 0; + } + else if (r4->state == SLOT_STATE_SENDING) + { + if (r4->now_p[r4->phase] + r4->payloadSize > (const u8 *)r4->src + r4->dataSize) + r5 = (const u8 *)r4->src + r4->dataSize - r4->now_p[r4->phase]; + else + r5 = r4->payloadSize; + } + else + { + if ((u32)r4->remainSize >= r4->payloadSize) + r5 = r4->payloadSize; + else + r5 = r4->remainSize; + } + sp00 = (r4->state & 0xF) << r8->unk03 + | r4->ack << r8->unk04 + | r4->phase << r8->unk05 + | r4->n[r4->phase] << r8->unk06 + | r5; + if (gRfuLinkStatus->parentChild == MODE_PARENT) + sp00 |= r4->bmSlot << 18; + r2 = (u8 *)&sp00; + for (i = 0; i < r8->unk00; ++i) + *(*r12)++ = *r2++; + if (r5 != 0) + { + const u8 *sp04 = r4->now_p[r4->phase]; + + gRfuFixed->fastCopyPtr(&sp04, r12, r5); + } + if (r4->state == SLOT_STATE_SENDING) + { + ++r4->phase; + if (r4->phase == 4) + r4->phase = 0; + } + if (gRfuLinkStatus->parentChild == MODE_PARENT) + gRfuLinkStatus->LLFReadyFlag = 1; + else + gRfuLinkStatus->LLFReadyFlag |= 1 << r10; + return r5 + r8->unk00; +} + +static u16 rfu_STC_UNI_constructLLSF(u8 r8, u8 **r6) +{ + const struct LLSFStruct *r5; + const u8 *sp04; + u32 sp00; + u8 *r2; + u8 i; + struct UNISend *r4 = &gRfuSlotStatusUNI[r8]->send; + + if (!r4->dataReadyFlag || !r4->bmSlot) + return 0; + r5 = &llsf_struct[gRfuLinkStatus->parentChild]; + sp00 = (r4->state & 0xF) << r5->unk03 + | r4->payloadSize; + if (gRfuLinkStatus->parentChild == MODE_PARENT) + sp00 |= r4->bmSlot << 18; + r2 = (u8 *)&sp00; + for (i = 0; i < r5->unk00; ++i) + *(*r6)++ = *r2++; + sp04 = r4->src; + gRfuFixed->fastCopyPtr(&sp04, r6, r4->payloadSize); + if (gRfuLinkStatus->parentChild == MODE_PARENT) + gRfuLinkStatus->LLFReadyFlag = 16; + else + gRfuLinkStatus->LLFReadyFlag |= 16 << r8; + return r5->unk00 + r4->payloadSize; +} + +void rfu_REQ_recvData(void) +{ + if (gRfuLinkStatus->parentChild != MODE_NEUTRAL) + { + gRfuStatic->commExistFlag = gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag | gRfuLinkStatus->sendSlotUNIFlag; + gRfuStatic->recvErrorFlag = 0; + STWI_set_Callback_M(rfu_CB_recvData); + STWI_send_DataRxREQ(); + } +} + +static void rfu_CB_recvData(u8 r9, u16 r7) +{ + u8 r6; + struct RfuSlotStatusNI *r4; + struct NIComm *r5; + + if (r7 == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[1]) + { + gRfuStatic->NIEndRecvFlag = 0; + if (gRfuLinkStatus->parentChild == MODE_PARENT) + rfu_STC_PARENT_analyzeRecvPacket(); + else + rfu_STC_CHILD_analyzeRecvPacket(); + for (r6 = 0; r6 < RFU_CHILD_MAX; ++r6) + { + r4 = gRfuSlotStatusNI[r6]; + if (r4->recv.state == SLOT_STATE_RECV_LAST && !((gRfuStatic->NIEndRecvFlag >> r6) & 1)) + { + r5 = &r4->recv; + if (r5->dataType == 1) + gRfuLinkStatus->getNameFlag |= 1 << r6; + rfu_STC_releaseFrame(r6, 1, r5); + gRfuLinkStatus->recvSlotNIFlag &= ~r5->bmSlot; + r4->recv.state = SLOT_STATE_RECV_SUCCESS; + } + } + if (gRfuStatic->recvErrorFlag) + r7 = gRfuStatic->recvErrorFlag | ERR_DATA_RECV; + } + rfu_STC_REQ_callback(r9, r7); +} + +static void rfu_STC_PARENT_analyzeRecvPacket(void) +{ + u32 r3; + u8 r5; + u8 sp[4]; + u8 *r6; + + r3 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0] >> 8; + for (r5 = 0; r5 < NELEMS(sp); ++r5) + { + sp[r5] = r3 & 0x1F; + r3 >>= 5; + if (sp[r5] == 0) + gRfuStatic->NIEndRecvFlag |= 1 << r5; + } + r6 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[8]; + for (r5 = 0; r5 < NELEMS(sp); ++r5) + { + if (sp[r5]) + { + u8 *r4 = &sp[r5]; + + do + { + u8 r0 = rfu_STC_analyzeLLSF(r5, r6, *r4); + + r6 += r0; + *r4 -= r0; + } while (!(*r4 & 0x80) && (*r4)); + } + } +} + +static void rfu_STC_CHILD_analyzeRecvPacket(void) +{ + u16 r4; + u8 *r5; + u16 r0; + + r4 = *(u16 *)&gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4] & 0x7F; + r5 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[8]; + if (r4 == 0) + gRfuStatic->NIEndRecvFlag = 15; + do + { + if (r4 == 0) + break; + r0 = rfu_STC_analyzeLLSF(0, r5, r4); + r5 += r0; + r4 -= r0; + } while (!(r4 & 0x8000)); +} + +static u16 rfu_STC_analyzeLLSF(u8 r12, const u8 *r7, u16 r3) +{ + struct RfuLocalStruct sp00; + const struct LLSFStruct *r6; + u32 r5; + u8 r4; + u32 r0; + u16 r10; + + r6 = &llsf_struct[~gRfuLinkStatus->parentChild & (MODE_NEUTRAL & MODE_PARENT)]; + if (r3 < r6->unk00) + return r3; + r5 = 0; + for (r4 = 0; r4 < r6->unk00; ++r4) + r5 |= *r7++ << 8 * r4; + sp00.unk00 = (r5 >> r6->unk01) & r6->unk07; + sp00.unk01 = (r5 >> r6->unk02) & r6->unk08; + sp00.unk02 = (r5 >> r6->unk03) & r6->unk09; + sp00.unk03 = (r5 >> r6->unk04) & r6->unk0A; + sp00.unk04 = (r5 >> r6->unk05) & r6->unk0B; + sp00.unk05 = (r5 >> r6->unk06) & r6->unk0C; + sp00.unk06 = (r5 & r6->unk0E) & r5; + r10 = sp00.unk06 + r6->unk00; + if (sp00.unk00 == 0) + { + if (gRfuLinkStatus->parentChild == MODE_PARENT) + { + if ((gRfuLinkStatus->connSlotFlag >> r12) & 1) + { + if (sp00.unk02 == 4) + { + rfu_STC_UNI_receive(r12, &sp00, r7); + } + else if (sp00.unk03 == 0) + { + rfu_STC_NI_receive_Receiver(r12, &sp00, r7); + } + else + { + for (r4 = 0; r4 < RFU_CHILD_MAX; ++r4) + if (((gRfuSlotStatusNI[r4]->send.bmSlot >> r12) & 1) + && ((gRfuLinkStatus->sendSlotNIFlag >> r12) & 1)) + break; + if (r4 <= 3) + rfu_STC_NI_receive_Sender(r4, r12, &sp00, r7); + } + } + } + else + { + s32 r5 = gRfuLinkStatus->connSlotFlag & sp00.unk01; + + if (r5) + { + for (r4 = 0; r4 < RFU_CHILD_MAX; ++r4) + { + if ((r5 >> r4) & 1) + { + if (sp00.unk02 == 4) + rfu_STC_UNI_receive(r4, &sp00, r7); + else if (sp00.unk03 == 0) + rfu_STC_NI_receive_Receiver(r4, &sp00, r7); + else if ((gRfuLinkStatus->sendSlotNIFlag >> r4) & 1) + rfu_STC_NI_receive_Sender(r4, r4, &sp00, r7); + } + } + } + } + } + return r10; +} + +static void rfu_STC_UNI_receive(u8 r7, const struct RfuLocalStruct *r6, const u8 *sp00) +{ + u8 *sp04; + u32 r2; + struct RfuSlotStatusUNI *r3 = gRfuSlotStatusUNI[r7]; + struct UNIRecv *r5 = &r3->recv; + + r5->errorCode = 0; + if (gRfuSlotStatusUNI[r7]->recvBufferSize < r6->unk06) + { + r3->recv.state = SLOT_STATE_RECV_IGNORE; + r5->errorCode = ERR_RECV_BUFF_OVER; + } + else + { + if (r5->dataBlockFlag) + { + if (r5->newDataFlag) + { + r5->errorCode = ERR_RECV_UNK; + goto _081E2F0E; + } + } + else + { + if (r5->newDataFlag) + r5->errorCode = ERR_RECV_DATA_OVERWRITED; + } + r5->state = SLOT_STATE_RECEIVING; + r2 = r5->dataSize = r6->unk06; + sp04 = gRfuSlotStatusUNI[r7]->recvBuffer; + gRfuFixed->fastCopyPtr(&sp00, &sp04, r2); + r5->newDataFlag = 1; + r5->state = 0; + } +_081E2F0E: + if (r5->errorCode) + gRfuStatic->recvErrorFlag |= 16 << r7; +} + +static void rfu_STC_NI_receive_Sender(u8 r0, u8 r10, const struct RfuLocalStruct *r6, const u8 *r3) +{ + struct NIComm *r12 = &gRfuSlotStatusNI[r0]->send; + u16 r9 = r12->state; + u8 sp00 = r12->n[r6->unk04]; + u8 *r8; + u8 r4; + u16 r2; + + if ((r6->unk02 == 2 && r9 == SLOT_STATE_SENDING) + || (r6->unk02 == 1 && r9 == SLOT_STATE_SEND_START) + || (r6->unk02 == 3 && r9 == SLOT_STATE_SEND_LAST)) + { + if (r12->n[r6->unk04] == r6->unk05) + r12->recvAckFlag[r6->unk04] |= 1 << r10; + } + if ((r12->recvAckFlag[r6->unk04] & r12->bmSlot) == r12->bmSlot) + { + r12->n[r6->unk04] = (r12->n[r6->unk04] + 1) & 3; + r12->recvAckFlag[r6->unk04] = 0; + if ((u16)(r12->state + ~SLOT_STATE_SEND_NULL) <= 1) + { + if (r12->state == SLOT_STATE_SEND_START) + r12->now_p[r6->unk04] += r12->payloadSize; + else + r12->now_p[r6->unk04] += r12->payloadSize << 2; + r12->remainSize -= r12->payloadSize; + if (r12->remainSize != 0) + if (r12->remainSize >= 0) + goto _081E30AE; + // Above is a hack to avoid optimization over comparison. + // rfu_STC_NI_constructLLSF uses this field as u32. + // It's equivalent to the following condition: + // if (r12->remainSize == 0 || r12->remainSize < 0) + { + r12->phase = 0; + if (r12->state == SLOT_STATE_SEND_START) + { + for (r4 = 0; r4 < WINDOW_COUNT; ++r4) + { + r12->n[r4] = 1; + r12->now_p[r4] = r12->src + r12->payloadSize * r4; + } + r12->remainSize = r12->dataSize; + r12->state = SLOT_STATE_SENDING; + } + else + { + r12->n[0] = 0; + r12->remainSize = 0; + r12->state = SLOT_STATE_SEND_LAST; + } + } + _081E30AE: + ; + } + else if (r12->state == SLOT_STATE_SEND_LAST) + { + r12->state = SLOT_STATE_SEND_NULL; + } + } + if (r12->state != r9 + || r12->n[r6->unk04] != sp00 + || (r12->recvAckFlag[r6->unk04] >> r10) & 1) + { + r2 = REG_IME; + REG_IME = 0; + gRfuStatic->recvRenewalFlag |= 16 << r10; + gRfuSlotStatusNI[r10]->send.failCounter = 0; + REG_IME = r2; + } +} + +static void rfu_STC_NI_receive_Receiver(u8 r8, const struct RfuLocalStruct *r6, const u8 *sp00) +{ + u16 r2; + u32 r7 = 0; + struct RfuSlotStatusNI *r4 = gRfuSlotStatusNI[r8]; + struct NIComm *r5 = &r4->recv; + u16 r9 = r4->recv.state; + u8 r10 = r4->recv.n[r6->unk04]; + + if (r6->unk02 == 3) + { + gRfuStatic->NIEndRecvFlag |= 1 << r8; + if (r4->recv.state == SLOT_STATE_RECEIVING) + { + r4->recv.phase = 0; + r4->recv.n[0] = 0; + r4->recv.state = SLOT_STATE_RECV_LAST; + } + } + else if (r6->unk02 == 2) + { + if (r9 == SLOT_STATE_RECV_START && !r5->remainSize) + rfu_STC_NI_initSlot_asRecvDataEntity(r8, r5); + if (r5->state == SLOT_STATE_RECEIVING) + r7 = 1; + } + else if (r6->unk02 == 1) + { + if (r9 == SLOT_STATE_RECV_START) + { + r7 = 1; + } + else + { + rfu_STC_NI_initSlot_asRecvControllData(r8, r5); + if (r4->recv.state != SLOT_STATE_RECV_START) + return; + r7 = 1; + } + } + if (r7 != 0) + { + if (r6->unk05 == ((r5->n[r6->unk04] + 1) & 3)) + { + gRfuFixed->fastCopyPtr(&sp00, (u8 **)&r5->now_p[r6->unk04], r6->unk06); + if (r5->state == SLOT_STATE_RECEIVING) + r5->now_p[r6->unk04] += 3 * r5->payloadSize; + r5->remainSize -= r6->unk06; + r5->n[r6->unk04] = r6->unk05; + } + } + if (r5->errorCode == 0) + { + r5->phase = r6->unk04; + if (r5->state != r9 || r5->n[r6->unk04] != r10 || r5->n[r6->unk04] == r6->unk05) + { + r2 = REG_IME; + REG_IME = 0; + gRfuStatic->recvRenewalFlag |= 1 << r8; + r5->failCounter = 0; + REG_IME = r2; + } + } +} + +static void rfu_STC_NI_initSlot_asRecvControllData(u8 r4, struct NIComm *r2) +{ + u8 *r1; + u32 r5; + u8 r6; + + if (gRfuLinkStatus->parentChild == MODE_PARENT) + { + r5 = 3; + r1 = &gRfuLinkStatus->remainLLFrameSizeParent; + } + else + { + r5 = 2; + r1 = &gRfuLinkStatus->remainLLFrameSizeChild[r4]; + } + r6 = 1 << r4; + if (r2->state == 0) + { + if (*r1 < r5) + { + r2->state = SLOT_STATE_RECV_IGNORE; + r2->errorCode = ERR_RECV_REPLY_SUBFRAME_SIZE; + gRfuStatic->recvErrorFlag |= r6; + } + else + { + r2->errorCode = 0; + *r1 -= r5; + r2->now_p[0] = &r2->dataType; + r2->remainSize = 7; + r2->ack = 1; + r2->payloadSize = 0; + r2->bmSlot = r6; + r2->state = SLOT_STATE_RECV_START; + gRfuLinkStatus->recvSlotNIFlag |= r6; + } + } +} + +static void rfu_STC_NI_initSlot_asRecvDataEntity(u8 r5, struct NIComm *r4) +{ + u8 r1, r3; + + if (r4->dataType == 1) + { + r4->now_p[0] = (void *)&gRfuLinkStatus->partner[r5].serialNo; + } + else + { + if (r4->dataSize > gRfuSlotStatusNI[r5]->recvBufferSize) + { + r1 = 1 << r5; + gRfuStatic->recvErrorFlag |= r1; + gRfuLinkStatus->recvSlotNIFlag &= ~r1; + r4->errorCode = ERR_RECV_BUFF_OVER; + r4->state = SLOT_STATE_RECV_FAILED; + rfu_STC_releaseFrame(r5, 1, r4); + return; + } + r4->now_p[0] = gRfuSlotStatusNI[r5]->recvBuffer; + } + for (r3 = 0; r3 < WINDOW_COUNT; ++r3) + { + r4->n[r3] = 0; + r4->now_p[r3] = &r4->now_p[0][r4->payloadSize * r3]; + } + r4->remainSize = r4->dataSize; + r4->state = SLOT_STATE_RECEIVING; +} + +static void rfu_NI_checkCommFailCounter(void) +{ + u16 r12; + u32 r7; + u8 r2, r3; + + if (gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag) + { + r12 = REG_IME; + REG_IME = 0; + r7 = gRfuStatic->recvRenewalFlag >> 4; + for (r3 = 0; r3 < RFU_CHILD_MAX; ++r3) + { + r2 = 1 << r3; + if (gRfuLinkStatus->sendSlotNIFlag & r2 + && !(gRfuStatic->recvRenewalFlag & r2)) + ++gRfuSlotStatusNI[r3]->send.failCounter; + if (gRfuLinkStatus->recvSlotNIFlag & r2 + && !(r7 & r2)) + ++gRfuSlotStatusNI[r3]->recv.failCounter; + } + gRfuStatic->recvRenewalFlag = 0; + REG_IME = r12; + } +} + +void rfu_REQ_noise(void) +{ + STWI_set_Callback_M(rfu_STC_REQ_callback); + STWI_send_TestModeREQ(1, 0); +} diff --git a/src/librfu_sio32id.c b/src/librfu_sio32id.c new file mode 100644 index 000000000..fc5701986 --- /dev/null +++ b/src/librfu_sio32id.c @@ -0,0 +1,164 @@ +#include "librfu.h" + +static void Sio32IDIntr(void); +static void Sio32IDInit(void); +static s32 Sio32IDMain(void); + +struct RfuSIO32Id gRfuSIO32Id; + +static const u16 Sio32ConnectionData[] = { 0x494e, 0x544e, 0x4e45, 0x4f44 }; // NINTENDO +static const char Sio32IDLib_Var[] = "Sio32ID_030820"; + +s32 AgbRFU_checkID(u8 r5) +{ + u16 r8; + vu16 *r4; + s32 r6; + + if (REG_IME == 0) + return -1; + r8 = REG_IE; + gSTWIStatus->state = 10; + STWI_set_Callback_ID(Sio32IDIntr); + Sio32IDInit(); + r4 = ®_TMCNT_L(gSTWIStatus->timerSelect); + r5 *= 8; + while (--r5 != 0xFF) + { + r6 = Sio32IDMain(); + if (r6 != 0) + break; + r4[1] = 0; + r4[0] = 0; + r4[1] = TIMER_1024CLK | TIMER_ENABLE; + while (r4[0] < 32) + ; + r4[1] = 0; + r4[0] = 0; + } + REG_IME = 0; + REG_IE = r8; + REG_IME = 1; + gSTWIStatus->state = 0; + STWI_set_Callback_ID(NULL); + return r6; +} + +static void Sio32IDInit(void) +{ + REG_IME = 0; + REG_IE &= ~((8 << gSTWIStatus->timerSelect) | INTR_FLAG_SERIAL); + REG_IME = 1; + REG_RCNT = 0; + REG_SIOCNT = SIO_32BIT_MODE; + REG_SIOCNT |= SIO_INTR_ENABLE | SIO_ENABLE; + CpuFill32(0, &gRfuSIO32Id, sizeof(struct RfuSIO32Id)); + REG_IF = INTR_FLAG_SERIAL; +} + +static s32 Sio32IDMain(void) +{ + u8 r12; + + switch (r12 = gRfuSIO32Id.unk1) + { + case 0: + gRfuSIO32Id.unk0 = 1; + REG_SIOCNT |= SIO_38400_BPS; + REG_IME = r12; + REG_IE |= INTR_FLAG_SERIAL; + REG_IME = 1; + gRfuSIO32Id.unk1 = 1; + *(vu8 *)®_SIOCNT |= SIO_ENABLE; + break; + case 1: + if (gRfuSIO32Id.unkA == 0) + { + if (gRfuSIO32Id.unk0 == 1) + { + if (gRfuSIO32Id.unk2 == 0) + { + REG_IME = gRfuSIO32Id.unk2; + REG_SIOCNT |= SIO_ENABLE; + REG_IME = r12; + } + } + else if (gRfuSIO32Id.unk4 != 0x8001 && !gRfuSIO32Id.unk2) + { + REG_IME = gRfuSIO32Id.unk2; + REG_IE &= ~INTR_FLAG_SERIAL; + REG_IME = r12; + REG_SIOCNT = gRfuSIO32Id.unk2; + REG_SIOCNT = SIO_32BIT_MODE; + REG_IF = INTR_FLAG_SERIAL; + REG_SIOCNT |= SIO_INTR_ENABLE | SIO_ENABLE; + REG_IME = gRfuSIO32Id.unk2; + REG_IE |= INTR_FLAG_SERIAL; + REG_IME = r12; + } + break; + } + else + { + gRfuSIO32Id.unk1 = 2; + // fallthrough + } + default: + return gRfuSIO32Id.unkA; + } + return 0; +} + +static void Sio32IDIntr(void) +{ + u32 r5; + u16 r0; +#ifndef NONMATCHING + register u32 r1 asm("r1"); + register u16 r0_ asm("r0"); +#else + u32 r1; + u16 r0_; +#endif + + r5 = REG_SIODATA32; + if (gRfuSIO32Id.unk0 != 1) + REG_SIOCNT |= SIO_ENABLE; + r1 = 16 * gRfuSIO32Id.unk0; // to handle side effect of inline asm + r1 = (r5 << r1) >> 16; + r5 = (r5 << 16 * (1 - gRfuSIO32Id.unk0)) >> 16; + if (gRfuSIO32Id.unkA == 0) + { + if (r1 == gRfuSIO32Id.unk6) + { + if (gRfuSIO32Id.unk2 > 3) + { + gRfuSIO32Id.unkA = r5; + } + else if (r1 == (u16)~gRfuSIO32Id.unk4) + { + r0_ = ~gRfuSIO32Id.unk6; + if (r5 == r0_) + ++gRfuSIO32Id.unk2; + } + } + else + { + gRfuSIO32Id.unk2 = gRfuSIO32Id.unkA; + } + } + if (gRfuSIO32Id.unk2 < 4) + gRfuSIO32Id.unk4 = *(gRfuSIO32Id.unk2 + Sio32ConnectionData); + else + gRfuSIO32Id.unk4 = 0x8001; + gRfuSIO32Id.unk6 = ~r5; + REG_SIODATA32 = (gRfuSIO32Id.unk4 << 16 * (1 - gRfuSIO32Id.unk0)) + + (gRfuSIO32Id.unk6 << 16 * gRfuSIO32Id.unk0); + if (gRfuSIO32Id.unk0 == 1 && (gRfuSIO32Id.unk2 || r5 == 0x494E)) + { + for (r0 = 0; r0 < 600; ++r0) + ; + if (gRfuSIO32Id.unkA == 0) + REG_SIOCNT |= SIO_ENABLE; + } +} diff --git a/src/librfu_stwi.c b/src/librfu_stwi.c index 670692118..b88f21737 100644 --- a/src/librfu_stwi.c +++ b/src/librfu_stwi.c @@ -1,70 +1,57 @@ -#include "global.h" #include "librfu.h" -struct RfuStruct *gRfuState; +static void STWI_intr_timer(void); +static u16 STWI_init(u8 request); +static s32 STWI_start_Command(void); +static void STWI_set_timer(u8 unk); +static void STWI_stop_timer(void); +static s32 STWI_restart_Command(void); +static s32 STWI_reset_ClockCounter(void); -extern IntrFunc IntrSIO32(void); - -extern void STWI_stop_timer(void); - -void STWI_init_Callback_M(void); -void STWI_init_Callback_S(void); -void STWI_set_Callback_M(void * callback); -void STWI_set_Callback_S(void * callback); -u16 STWI_init(u8 request); -int STWI_start_Command(void); -void STWI_intr_timer(void); -void STWI_set_timer(u8 unk); - -int STWI_restart_Command(void); -int STWI_reset_ClockCounter(void); +struct STWIStatus *gSTWIStatus; void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam) { // If we're copying our interrupt into RAM, DMA it to block1 and use - // block2 for our RfuStruct, otherwise block1 holds the RfuStruct. + // block2 for our STWIStatus, otherwise block1 holds the STWIStatus. // interrupt usually is a pointer to gIntrTable[1] if (copyInterruptToRam == TRUE) { *interrupt = (IntrFunc)interruptStruct->block1; - DmaCopy16(3, &IntrSIO32, interruptStruct->block1, 0x960); - gRfuState = (struct RfuStruct*)interruptStruct->block2; + DmaCopy16(3, &IntrSIO32, interruptStruct->block1, sizeof(interruptStruct->block1)); + gSTWIStatus = &interruptStruct->block2; } else { - *interrupt = (IntrFunc)IntrSIO32; - gRfuState = (struct RfuStruct*)interruptStruct->block1; - } - - gRfuState->rxPacket = (union RfuPacket*)interruptStruct->rxPacketAlloc; - gRfuState->txPacket = (union RfuPacket*)interruptStruct->txPacketAlloc; - gRfuState->msMode = 1; - gRfuState->unk_0 = 0; - gRfuState->txParams = 0; - gRfuState->unk_5 = 0; - gRfuState->unk_7 = 0; - gRfuState->unk_8 = 0; - gRfuState->unk_9 = 0; - gRfuState->timerState = 0; - gRfuState->timerActive = 0; - gRfuState->unk_12 = 0; - gRfuState->unk_15 = 0; - gRfuState->unk_2c = 0; - - REG_RCNT = 0x100; //TODO: mystery bit? + *interrupt = IntrSIO32; + gSTWIStatus = (struct STWIStatus *)interruptStruct->block1; + } + gSTWIStatus->rxPacket = &interruptStruct->rxPacketAlloc; + gSTWIStatus->txPacket = &interruptStruct->txPacketAlloc; + gSTWIStatus->msMode = 1; + gSTWIStatus->state = 0; + gSTWIStatus->reqLength = 0; + gSTWIStatus->reqNext = 0; + gSTWIStatus->ackLength = 0; + gSTWIStatus->ackNext = 0; + gSTWIStatus->ackActiveCommand = 0; + gSTWIStatus->timerState = 0; + gSTWIStatus->timerActive = 0; + gSTWIStatus->error = 0; + gSTWIStatus->recoveryCount = 0; + gSTWIStatus->unk_2c = 0; + REG_RCNT = 0x100; // TODO: mystery bit? REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; STWI_init_Callback_M(); STWI_init_Callback_S(); - IntrEnable(INTR_FLAG_SERIAL); } -void STWI_init_timer(IntrFunc *interrupt, int timerSelect) +void STWI_init_timer(IntrFunc *interrupt, s32 timerSelect) { *interrupt = STWI_intr_timer; - gRfuState->timerSelect = timerSelect; - - IntrEnable(INTR_FLAG_TIMER0 << gRfuState->timerSelect); + gSTWIStatus->timerSelect = timerSelect; + IntrEnable(INTR_FLAG_TIMER0 << gSTWIStatus->timerSelect); } void AgbRFU_SoftReset(void) @@ -74,35 +61,34 @@ void AgbRFU_SoftReset(void) REG_RCNT = 0x8000; REG_RCNT = 0x80A0; // all these bits are undocumented - timerL = ®_TMCNT_L(gRfuState->timerSelect); - timerH = ®_TMCNT_H(gRfuState->timerSelect); + timerL = ®_TMCNT_L(gSTWIStatus->timerSelect); + timerH = ®_TMCNT_H(gSTWIStatus->timerSelect); *timerH = 0; *timerL = 0; - *timerH = 0x83; + *timerH = TIMER_ENABLE | TIMER_1024CLK; while (*timerL <= 0x11) REG_RCNT = 0x80A2; *timerH = 3; REG_RCNT = 0x80A0; REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; - - gRfuState->unk_0 = 0; - gRfuState->txParams = 0; - gRfuState->unk_5 = 0; - gRfuState->activeCommand = 0; - gRfuState->unk_7 = 0; - gRfuState->unk_8 = 0; - gRfuState->unk_9 = 0; - gRfuState->timerState = 0; - gRfuState->timerActive = 0; - gRfuState->unk_12 = 0; - gRfuState->msMode = 1; - gRfuState->unk_15 = 0; - gRfuState->unk_2c = 0; + gSTWIStatus->state = 0; + gSTWIStatus->reqLength = 0; + gSTWIStatus->reqNext = 0; + gSTWIStatus->reqActiveCommand = 0; + gSTWIStatus->ackLength = 0; + gSTWIStatus->ackNext = 0; + gSTWIStatus->ackActiveCommand = 0; + gSTWIStatus->timerState = 0; + gSTWIStatus->timerActive = 0; + gSTWIStatus->error = 0; + gSTWIStatus->msMode = 1; + gSTWIStatus->recoveryCount = 0; + gSTWIStatus->unk_2c = 0; } void STWI_set_MS_mode(u8 mode) { - gRfuState->msMode = mode; + gSTWIStatus->msMode = mode; } u16 STWI_read_status(u8 index) @@ -110,13 +96,13 @@ u16 STWI_read_status(u8 index) switch (index) { case 0: - return gRfuState->unk_12; + return gSTWIStatus->error; case 1: - return gRfuState->msMode; + return gSTWIStatus->msMode; case 2: - return gRfuState->unk_0; + return gSTWIStatus->state; case 3: - return gRfuState->activeCommand; + return gSTWIStatus->reqActiveCommand; default: return 0xFFFF; } @@ -124,136 +110,130 @@ u16 STWI_read_status(u8 index) void STWI_init_Callback_M(void) { - STWI_set_Callback_M(0); + STWI_set_Callback_M(NULL); } void STWI_init_Callback_S(void) { - STWI_set_Callback_S(0); + STWI_set_Callback_S(NULL); } -void STWI_set_Callback_M(void *callback) +// The callback can take 2 or 3 arguments. +void STWI_set_Callback_M(void *callbackM) { - gRfuState->callbackM = callback; + gSTWIStatus->callbackM = callbackM; } -void STWI_set_Callback_S(void *callback) +void STWI_set_Callback_S(void (*callbackS)(u16)) { - gRfuState->callbackS = callback; + gSTWIStatus->callbackS = callbackS; } -void STWI_set_Callback_ID(u32 id) +void STWI_set_Callback_ID(void (*func)(void)) // name in SDK, but is actually setting a function pointer { - gRfuState->callbackID = id; + gSTWIStatus->unk_20 = func; } u16 STWI_poll_CommandEnd(void) { - while (gRfuState->unk_2c == TRUE) + while (gSTWIStatus->unk_2c == TRUE) ; - return gRfuState->unk_12; + return gSTWIStatus->error; } void STWI_send_ResetREQ(void) { - if (!STWI_init(RFU_RESET)) + if (!STWI_init(ID_RESET_REQ)) { - gRfuState->txParams = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_LinkStatusREQ(void) { - if (!STWI_init(RFU_LINK_STATUS)) + if (!STWI_init(ID_LINK_STATUS_REQ)) { - gRfuState->txParams = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_VersionStatusREQ(void) { - if (!STWI_init(RFU_VERSION_STATUS)) + if (!STWI_init(ID_VERSION_STATUS_REQ)) { - gRfuState->txParams = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_SystemStatusREQ(void) { - if (!STWI_init(RFU_SYSTEM_STATUS)) + if (!STWI_init(ID_SYSTEM_STATUS_REQ)) { - gRfuState->txParams = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_SlotStatusREQ(void) { - if (!STWI_init(RFU_SLOT_STATUS)) + if (!STWI_init(ID_SLOT_STATUS_REQ)) { - gRfuState->txParams = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_ConfigStatusREQ(void) { - if (!STWI_init(RFU_CONFIG_STATUS)) + if (!STWI_init(ID_CONFIG_STATUS_REQ)) { - gRfuState->txParams = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } -void STWI_send_GameConfigREQ(u8 * unk1, u8 *data) +void STWI_send_GameConfigREQ(const u8 *unk1, const u8 *data) { u8 *packetBytes; - int i; + s32 i; - if (!STWI_init(RFU_GAME_CONFIG)) + if (!STWI_init(ID_GAME_CONFIG_REQ)) { - gRfuState->txParams = 6; - - //TODO: what is unk1 - packetBytes = gRfuState->txPacket->rfuPacket8.data; + gSTWIStatus->reqLength = 6; + // TODO: what is unk1 + packetBytes = gSTWIStatus->txPacket->rfuPacket8.data; packetBytes += sizeof(u32); - *(u16*)packetBytes = *(u16*)unk1; - + *(u16 *)packetBytes = *(u16 *)unk1; packetBytes += sizeof(u16); unk1 += sizeof(u16); - - for (i = 0; i < 14; i++) + for (i = 0; i < 14; ++i) { *packetBytes = *unk1; - packetBytes++; - unk1++; + ++packetBytes; + ++unk1; } - - for (i = 0; i < 8; i++) + for (i = 0; i < 8; ++i) { *packetBytes = *data; - packetBytes++; - data++; + ++packetBytes; + ++data; } - STWI_start_Command(); } } void STWI_send_SystemConfigREQ(u16 unk1, u8 unk2, u8 unk3) { - if (!STWI_init(RFU_SYSTEM_CONFIG)) + if (!STWI_init(ID_SYSTEM_CONFIG_REQ)) { u8 *packetBytes; - gRfuState->txParams = 1; - - packetBytes = gRfuState->txPacket->rfuPacket8.data; + gSTWIStatus->reqLength = 1; + packetBytes = gSTWIStatus->txPacket->rfuPacket8.data; packetBytes += sizeof(u32); - *packetBytes++ = unk3; *packetBytes++ = unk2; *(u16*)packetBytes = unk1; @@ -263,206 +243,196 @@ void STWI_send_SystemConfigREQ(u16 unk1, u8 unk2, u8 unk3) void STWI_send_SC_StartREQ(void) { - if (!STWI_init(RFU_SC_START)) + if (!STWI_init(ID_SC_START_REQ)) { - gRfuState->txParams = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_SC_PollingREQ(void) { - if (!STWI_init(RFU_SC_POLLING)) + if (!STWI_init(ID_SC_POLL_REQ)) { - gRfuState->txParams = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_SC_EndREQ(void) { - if (!STWI_init(RFU_SC_END)) + if (!STWI_init(ID_SC_END_REQ)) { - gRfuState->txParams = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_SP_StartREQ(void) { - if (!STWI_init(RFU_SP_START)) + if (!STWI_init(ID_SP_START_REQ)) { - gRfuState->txParams = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_SP_PollingREQ(void) { - if (!STWI_init(RFU_SP_POLLING)) + if (!STWI_init(ID_SP_POLL_REQ)) { - gRfuState->txParams = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_SP_EndREQ(void) { - if (!STWI_init(RFU_SP_END)) + if (!STWI_init(ID_SP_END_REQ)) { - gRfuState->txParams = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_CP_StartREQ(u16 unk1) { - if (!STWI_init(RFU_CP_START)) + if (!STWI_init(ID_CP_START_REQ)) { - gRfuState->txParams = 1; - gRfuState->txPacket->rfuPacket32.data[0] = unk1; + gSTWIStatus->reqLength = 1; + gSTWIStatus->txPacket->rfuPacket32.data[0] = unk1; STWI_start_Command(); } } void STWI_send_CP_PollingREQ(void) { - if (!STWI_init(RFU_CP_POLLING)) + if (!STWI_init(ID_CP_POLL_REQ)) { - gRfuState->txParams = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_CP_EndREQ(void) { - if (!STWI_init(RFU_CP_END)) + if (!STWI_init(ID_CP_END_REQ)) { - gRfuState->txParams = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } -void STWI_send_DataTxREQ(void *in, u8 size) +void STWI_send_DataTxREQ(const void *in, u8 size) { - if (!STWI_init(RFU_DATA_TX)) + if (!STWI_init(ID_DATA_TX_REQ)) { - u8 txParams = (size / sizeof(u32)); + u8 reqLength = (size / sizeof(u32)); if (size & (sizeof(u32) - 1)) - txParams += 1; - - gRfuState->txParams = txParams; - CpuCopy32(in, gRfuState->txPacket->rfuPacket32.data, gRfuState->txParams * sizeof(u32)); + reqLength += 1; + gSTWIStatus->reqLength = reqLength; + CpuCopy32(in, gSTWIStatus->txPacket->rfuPacket32.data, gSTWIStatus->reqLength * sizeof(u32)); STWI_start_Command(); } } -void STWI_send_DataTxAndChangeREQ(void *in, u8 size) +void STWI_send_DataTxAndChangeREQ(const void *in, u8 size) { - if (!STWI_init(RFU_DATA_TX_AND_CHANGE)) + if (!STWI_init(ID_DATA_TX_AND_CHANGE_REQ)) { - u8 txParams = (size / sizeof(u32)); + u8 reqLength = (size / sizeof(u32)); if (size & (sizeof(u32) - 1)) - txParams += 1; - - gRfuState->txParams = txParams; - CpuCopy32(in, gRfuState->txPacket->rfuPacket32.data, gRfuState->txParams * sizeof(u32)); + reqLength += 1; + gSTWIStatus->reqLength = reqLength; + CpuCopy32(in, gSTWIStatus->txPacket->rfuPacket32.data, gSTWIStatus->reqLength * sizeof(u32)); STWI_start_Command(); } } void STWI_send_DataRxREQ(void) { - if (!STWI_init(RFU_DATA_RX)) + if (!STWI_init(ID_DATA_RX_REQ)) { - gRfuState->txParams = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_MS_ChangeREQ(void) { - if (!STWI_init(RFU_MS_CHANGE)) + if (!STWI_init(ID_MS_CHANGE_REQ)) { - gRfuState->txParams = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_DataReadyAndChangeREQ(u8 unk) { - if (!STWI_init(RFU_DATA_READY_AND_CHANGE)) + if (!STWI_init(ID_DATA_READY_AND_CHANGE_REQ)) { if (!unk) { - gRfuState->txParams = 0; + gSTWIStatus->reqLength = 0; } else { u8 *packetBytes; - gRfuState->txParams = 1; - - packetBytes = gRfuState->txPacket->rfuPacket8.data; + gSTWIStatus->reqLength = 1; + packetBytes = gSTWIStatus->txPacket->rfuPacket8.data; packetBytes += sizeof(u32); - *packetBytes++ = unk; *packetBytes++ = 0; *packetBytes++ = 0; *packetBytes = 0; } - STWI_start_Command(); } } void STWI_send_DisconnectedAndChangeREQ(u8 unk0, u8 unk1) { - if (!STWI_init(RFU_DISCONNECTED_AND_CHANGE)) + if (!STWI_init(ID_DISCONNECTED_AND_CHANGE_REQ)) { u8 *packetBytes; - gRfuState->txParams = 1; - - packetBytes = gRfuState->txPacket->rfuPacket8.data; + gSTWIStatus->reqLength = 1; + packetBytes = gSTWIStatus->txPacket->rfuPacket8.data; packetBytes += sizeof(u32); - *packetBytes++ = unk0; *packetBytes++ = unk1; *packetBytes++ = 0; *packetBytes = 0; - STWI_start_Command(); } } void STWI_send_ResumeRetransmitAndChangeREQ(void) { - if (!STWI_init(RFU_RESUME_RETRANSMIT_AND_CHANGE)) + if (!STWI_init(ID_RESUME_RETRANSMIT_AND_CHANGE_REQ)) { - gRfuState->txParams = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_DisconnectREQ(u8 unk) { - if (!STWI_init(RFU_DISCONNECT)) + if (!STWI_init(ID_DISCONNECT_REQ)) { - gRfuState->txParams = 1; - gRfuState->txPacket->rfuPacket32.data[0] = unk; - + gSTWIStatus->reqLength = 1; + gSTWIStatus->txPacket->rfuPacket32.data[0] = unk; STWI_start_Command(); } } void STWI_send_TestModeREQ(u8 unk0, u8 unk1) { - if (!STWI_init(RFU_TEST_MODE)) + if (!STWI_init(ID_TEST_MODE_REQ)) { - gRfuState->txParams = 1; - gRfuState->txPacket->rfuPacket32.data[0] = unk0 | (unk1 << 8); - + gSTWIStatus->reqLength = 1; + gSTWIStatus->txPacket->rfuPacket32.data[0] = unk0 | (unk1 << 8); STWI_start_Command(); } } @@ -472,218 +442,206 @@ void STWI_send_CPR_StartREQ(u16 unk0, u16 unk1, u8 unk2) u32 *packetData; u32 arg1; - if (!STWI_init(RFU_CPR_START)) + if (!STWI_init(ID_CPR_START_REQ)) { - gRfuState->txParams = 2; - + gSTWIStatus->reqLength = 2; arg1 = unk1 | (unk0 << 16); - packetData = gRfuState->txPacket->rfuPacket32.data; + packetData = gSTWIStatus->txPacket->rfuPacket32.data; packetData[0] = arg1; packetData[1] = unk2; - STWI_start_Command(); } } void STWI_send_CPR_PollingREQ(void) { - if (!STWI_init(RFU_CPR_POLLING)) + if (!STWI_init(ID_CPR_POLL_REQ)) { - gRfuState->txParams = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_CPR_EndREQ(void) { - if (!STWI_init(RFU_CPR_END)) + if (!STWI_init(ID_CPR_END_REQ)) { - gRfuState->txParams = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } void STWI_send_StopModeREQ(void) { - if (!STWI_init(RFU_STOP_MODE)) + if (!STWI_init(ID_STOP_MODE_REQ)) { - gRfuState->txParams = 0; + gSTWIStatus->reqLength = 0; STWI_start_Command(); } } -void STWI_intr_timer(void) +static void STWI_intr_timer(void) { - switch (gRfuState->timerState) + switch (gSTWIStatus->timerState) { - //TODO: Make an enum for these - case 2: - gRfuState->timerActive = 1; - STWI_set_timer(50); - break; - case 1: - case 4: - STWI_stop_timer(); - STWI_restart_Command(); - break; - case 3: - gRfuState->timerActive = 1; - STWI_stop_timer(); - STWI_reset_ClockCounter(); - if (gRfuState->callbackM) - gRfuState->callbackM(255, 0); - break; + // TODO: Make an enum for these + case 2: + gSTWIStatus->timerActive = 1; + STWI_set_timer(50); + break; + case 1: + case 4: + STWI_stop_timer(); + STWI_restart_Command(); + break; + case 3: + gSTWIStatus->timerActive = 1; + STWI_stop_timer(); + STWI_reset_ClockCounter(); + if (gSTWIStatus->callbackM != NULL) + gSTWIStatus->callbackM(255, 0); + break; } } -void STWI_set_timer(u8 unk) +static void STWI_set_timer(u8 unk) { vu16 *timerL; vu16 *timerH; - timerL = ®_TMCNT_L(gRfuState->timerSelect); - timerH = ®_TMCNT_H(gRfuState->timerSelect); + timerL = ®_TMCNT_L(gSTWIStatus->timerSelect); + timerH = ®_TMCNT_H(gSTWIStatus->timerSelect); REG_IME = 0; switch (unk) { - case 50: - *timerL = 0xFCCB; - gRfuState->timerState = 1; - break; - case 80: - *timerL = 0xFAE0; - gRfuState->timerState = 2; - break; - case 100: - *timerL = 0xF996; - gRfuState->timerState = 3; - break; - case 130: - *timerL = 0xF7AD; - gRfuState->timerState = 4; - break; + case 50: + *timerL = 0xFCCB; + gSTWIStatus->timerState = 1; + break; + case 80: + *timerL = 0xFAE0; + gSTWIStatus->timerState = 2; + break; + case 100: + *timerL = 0xF996; + gSTWIStatus->timerState = 3; + break; + case 130: + *timerL = 0xF7AD; + gSTWIStatus->timerState = 4; + break; } *timerH = TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_1024CLK; - REG_IF = INTR_FLAG_TIMER0 << gRfuState->timerSelect; + REG_IF = INTR_FLAG_TIMER0 << gSTWIStatus->timerSelect; REG_IME = 1; } -void STWI_stop_timer(void) +static void STWI_stop_timer(void) { - gRfuState->timerState = 0; - - REG_TMCNT_L(gRfuState->timerSelect) = 0; - REG_TMCNT_H(gRfuState->timerSelect) = 0; + gSTWIStatus->timerState = 0; + REG_TMCNT_L(gSTWIStatus->timerSelect) = 0; + REG_TMCNT_H(gSTWIStatus->timerSelect) = 0; } -u16 STWI_init(u8 request) +static u16 STWI_init(u8 request) { if (!REG_IME) { - gRfuState->unk_12 = 6; - if (gRfuState->callbackM) - gRfuState->callbackM(request, gRfuState->unk_12); + gSTWIStatus->error = ERR_REQ_CMD_IME_DISABLE; + if (gSTWIStatus->callbackM != NULL) + gSTWIStatus->callbackM(request, gSTWIStatus->error); return TRUE; } - else if (gRfuState->unk_2c == TRUE) + else if (gSTWIStatus->unk_2c == TRUE) { - gRfuState->unk_12 = 2; - gRfuState->unk_2c = FALSE; - if (gRfuState->callbackM) - gRfuState->callbackM(request, gRfuState->unk_12); + gSTWIStatus->error = ERR_REQ_CMD_SENDING; + gSTWIStatus->unk_2c = FALSE; + if (gSTWIStatus->callbackM != NULL) + gSTWIStatus->callbackM(request, gSTWIStatus->error); return TRUE; } - else if(!gRfuState->msMode) + else if(!gSTWIStatus->msMode) { - gRfuState->unk_12 = 4; - if (gRfuState->callbackM) - gRfuState->callbackM(request, gRfuState->unk_12, gRfuState); + gSTWIStatus->error = ERR_REQ_CMD_CLOCK_SLAVE; + if (gSTWIStatus->callbackM != NULL) + gSTWIStatus->callbackM(request, gSTWIStatus->error, gSTWIStatus); return TRUE; } else { - gRfuState->unk_2c = TRUE; - gRfuState->activeCommand = request; - gRfuState->unk_0 = 0; - gRfuState->txParams = 0; - gRfuState->unk_5 = 0; - gRfuState->unk_7 = 0; - gRfuState->unk_8 = 0; - gRfuState->unk_9 = 0; - gRfuState->timerState = 0; - gRfuState->timerActive = 0; - gRfuState->unk_12 = 0; - gRfuState->unk_15 = 0; - + gSTWIStatus->unk_2c = TRUE; + gSTWIStatus->reqActiveCommand = request; + gSTWIStatus->state = 0; + gSTWIStatus->reqLength = 0; + gSTWIStatus->reqNext = 0; + gSTWIStatus->ackLength = 0; + gSTWIStatus->ackNext = 0; + gSTWIStatus->ackActiveCommand = 0; + gSTWIStatus->timerState = 0; + gSTWIStatus->timerActive = 0; + gSTWIStatus->error = 0; + gSTWIStatus->recoveryCount = 0; REG_RCNT = 0x100; REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; return FALSE; } } -int STWI_start_Command() +static s32 STWI_start_Command(void) { u16 imeTemp; - // Yes, it matters that it's casted to a u32... - *(u32*)gRfuState->txPacket->rfuPacket8.data = 0x99660000 | (gRfuState->txParams << 8) | gRfuState->activeCommand; - REG_SIODATA32 = gRfuState->txPacket->rfuPacket32.command; - - gRfuState->unk_0 = 0; - gRfuState->unk_5 = 1; - + // equivalent to gSTWIStatus->txPacket->rfuPacket32.command, + // but the cast here is required to avoid register issue + *(u32 *)gSTWIStatus->txPacket->rfuPacket8.data = 0x99660000 | (gSTWIStatus->reqLength << 8) | gSTWIStatus->reqActiveCommand; + REG_SIODATA32 = gSTWIStatus->txPacket->rfuPacket32.command; + gSTWIStatus->state = 0; + gSTWIStatus->reqNext = 1; imeTemp = REG_IME; REG_IME = 0; - REG_IE |= (INTR_FLAG_TIMER0 << gRfuState->timerSelect); + REG_IE |= (INTR_FLAG_TIMER0 << gSTWIStatus->timerSelect); REG_IE |= INTR_FLAG_SERIAL; REG_IME = imeTemp; - REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_MULTI_BUSY | SIO_115200_BPS; - return 0; } -int STWI_restart_Command(void) +static s32 STWI_restart_Command(void) { - if (gRfuState->unk_15 <= 1) + if (gSTWIStatus->recoveryCount <= 1) { - gRfuState->unk_15++; + ++gSTWIStatus->recoveryCount; STWI_start_Command(); } else { - if (gRfuState->activeCommand == RFU_MS_CHANGE || gRfuState->activeCommand == RFU_DATA_TX_AND_CHANGE || gRfuState->activeCommand == RFU_UNK35 || gRfuState->activeCommand == RFU_RESUME_RETRANSMIT_AND_CHANGE) + if (gSTWIStatus->reqActiveCommand == ID_MS_CHANGE_REQ || gSTWIStatus->reqActiveCommand == ID_DATA_TX_AND_CHANGE_REQ || gSTWIStatus->reqActiveCommand == ID_UNK35_REQ || gSTWIStatus->reqActiveCommand == ID_RESUME_RETRANSMIT_AND_CHANGE_REQ) { - gRfuState->unk_12 = 1; - gRfuState->unk_2c = 0; - - if (gRfuState->callbackM) - gRfuState->callbackM(gRfuState->activeCommand, gRfuState->unk_12); + gSTWIStatus->error = ERR_REQ_CMD_CLOCK_DRIFT; + gSTWIStatus->unk_2c = 0; + if (gSTWIStatus->callbackM != NULL) + gSTWIStatus->callbackM(gSTWIStatus->reqActiveCommand, gSTWIStatus->error); } else { - gRfuState->unk_12 = 1; - gRfuState->unk_2c = 0; - - if (gRfuState->callbackM) - gRfuState->callbackM(gRfuState->activeCommand, gRfuState->unk_12); - - gRfuState->unk_0 = 4; //TODO: what's 4 + gSTWIStatus->error = ERR_REQ_CMD_CLOCK_DRIFT; + gSTWIStatus->unk_2c = 0; + if (gSTWIStatus->callbackM != NULL) + gSTWIStatus->callbackM(gSTWIStatus->reqActiveCommand, gSTWIStatus->error); + gSTWIStatus->state = 4; // TODO: what's 4 } } - return 0; } -int STWI_reset_ClockCounter(void) +static s32 STWI_reset_ClockCounter(void) { - gRfuState->unk_0 = 5; //TODO: what is 5 - gRfuState->txParams = 0; - gRfuState->unk_5 = 0; + gSTWIStatus->state = 5; // TODO: what is 5 + gSTWIStatus->reqLength = 0; + gSTWIStatus->reqNext = 0; REG_SIODATA32 = (1 << 31); REG_SIOCNT = 0; REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; REG_SIOCNT = (SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS) + 0x7F; - return 0; } diff --git a/src/link_rfu.c b/src/link_rfu.c index cedc6b2fb..9291f574e 100644 --- a/src/link_rfu.c +++ b/src/link_rfu.c @@ -364,7 +364,7 @@ u32 sub_800BEC0(void) void rfu_REQ_sendData_wrapper(u8 r2) { u8 val; - if (!gUnknown_03007890->unk_00) + if (!gRfuLinkStatus->parentChild) { val = gUnknown_03004140.unk_02; r2 = 0; @@ -515,14 +515,14 @@ u8 sub_800C12C(u16 r6, u16 r8) sub_800D30C(0xF3, 0x01); return 2; } - for (i = 0; i < gUnknown_03007890->unk_08; i++) + for (i = 0; i < gRfuLinkStatus->findParentCount; i++) { - if (gUnknown_03007890->unk_14[i].unk_00 == r6) + if (gRfuLinkStatus->partner[i].id == r6) { break; } } - if (gUnknown_03007890->unk_08 == 0 || i == gUnknown_03007890->unk_08) + if (gRfuLinkStatus->findParentCount == 0 || i == gRfuLinkStatus->findParentCount) { gUnknown_03004140.unk_14 = 3; sub_800D30C(0xF3, 0x01); @@ -561,7 +561,7 @@ void sub_800C210(u8 a0) gUnknown_03004140.unk_34[i] = 0; } } - i = gUnknown_03007890->unk_03 & a0; + i = gRfuLinkStatus->linkLossSlotFlag & a0; if (i) { sub_800D334(i); @@ -630,8 +630,8 @@ void sub_800C27C(bool8 a0) case 16: gUnknown_03004140.unk_04 = gUnknown_03004140.unk_11; gUnknown_03004140.unk_05 = gUnknown_03004140.unk_12; - sub_800D334(gUnknown_03007890->unk_03); - gUnknown_03004140.unk_14 = gUnknown_03007890->unk_03; + sub_800D334(gRfuLinkStatus->linkLossSlotFlag); + gUnknown_03004140.unk_14 = gRfuLinkStatus->linkLossSlotFlag; sub_800D30C(0x33, 0x01); return; case 17: @@ -703,7 +703,7 @@ bool8 sub_800C36C(u16 a0) } sub_800D610(); } - if (gUnknown_03007890->unk_00 == 1) + if (gRfuLinkStatus->parentChild == 1) { if (sp2) { @@ -800,7 +800,7 @@ void sub_800C54C(u32 a0) rfu_REQ_configSystem(gUnknown_03004140.unk_3c->unk_02, gUnknown_03004140.unk_3c->unk_00, gUnknown_03004140.unk_3c->unk_01); break; case 4: - rfu_REQ_configGameData(gUnknown_03004140.unk_3c->unk_04, gUnknown_03004140.unk_3c->unk_06, gUnknown_03004140.unk_3c->unk_08, gUnknown_03004140.unk_3c->unk_0c); + rfu_REQ_configGameData(gUnknown_03004140.unk_3c->unk_04, gUnknown_03004140.unk_3c->unk_06, (const u8 *)gUnknown_03004140.unk_3c->unk_08, gUnknown_03004140.unk_3c->unk_0c); break; case 5: rfu_REQ_startSearchChild(); @@ -834,7 +834,7 @@ void sub_800C54C(u32 a0) case 15: break; case 16: - rfu_REQ_CHILD_startConnectRecovery(gUnknown_03007890->unk_03); + rfu_REQ_CHILD_startConnectRecovery(gRfuLinkStatus->linkLossSlotFlag); break; case 17: rfu_REQ_CHILD_pollConnectRecovery(); @@ -857,7 +857,7 @@ void sub_800C54C(u32 a0) gUnknown_03004140.unk_0e = 0; } } while (gUnknown_03004140.unk_04 == 18 || gUnknown_03004140.unk_04 == 19); - if (gUnknown_03007890->unk_00 != 1 || !sub_800C36C(0)) + if (gRfuLinkStatus->parentChild != 1 || !sub_800C36C(0)) { sub_800CF34(); sub_800D158(); @@ -910,7 +910,7 @@ static void sub_800C744(u32 a0) static void sub_800C7B4(u16 r8, u16 r6) { u8 sp0; - register u8 *stwiRecvBuffer asm("r0"); + register struct RfuIntrStruct *stwiRecvBuffer asm("r0"); u8 *tmp; u8 i; @@ -983,7 +983,7 @@ static void sub_800C7B4(u16 r8, u16 r6) { sub_800D30C(0x20, 0x01); } - if (gUnknown_03004140.unk_0b && gUnknown_03004140.unk_1a != 1 && gUnknown_03007890->unk_08 == 4) + if (gUnknown_03004140.unk_0b && gUnknown_03004140.unk_1a != 1 && gRfuLinkStatus->findParentCount == 4) { rfu_REQ_endSearchParent(); rfu_waitREQComplete(); @@ -1059,11 +1059,11 @@ static void sub_800C7B4(u16 r8, u16 r6) case 50: if (r6 == 0) { - gUnknown_03004140.unk_14 = gUnknown_03007890->unk_03; + gUnknown_03004140.unk_14 = gRfuLinkStatus->linkLossSlotFlag; gUnknown_03004140.unk_04 = gUnknown_03004140.unk_05 = 17; for (gUnknown_03004140.unk_10 = 0; gUnknown_03004140.unk_10 < 4; gUnknown_03004140.unk_10 ++) { - if ((gUnknown_03007890->unk_03 >> gUnknown_03004140.unk_10) & 1) + if ((gRfuLinkStatus->linkLossSlotFlag >> gUnknown_03004140.unk_10) & 1) { break; } @@ -1092,7 +1092,7 @@ static void sub_800C7B4(u16 r8, u16 r6) else { gUnknown_03004140.unk_04 = gUnknown_03004140.unk_05 = 0; - sub_800D334(gUnknown_03007890->unk_03); + sub_800D334(gRfuLinkStatus->linkLossSlotFlag); gUnknown_03004140.unk_1e = 0x33; } gUnknown_03004140.unk_34[gUnknown_03004140.unk_10] = 0; @@ -1126,7 +1126,7 @@ static void sub_800C7B4(u16 r8, u16 r6) { gUnknown_03004140.unk_04 = gUnknown_03004140.unk_05 = 0; sub_800D610(); - sub_800D334(gUnknown_03007890->unk_02 | gUnknown_03007890->unk_03); + sub_800D334(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag); gUnknown_03004140.unk_14 = sp0; sub_800D30C(0x25, 0x01); } @@ -1148,11 +1148,11 @@ static void sub_800C7B4(u16 r8, u16 r6) rfu_REQ_RFUStatus(); rfu_waitREQComplete(); rfu_getRFUStatus(&sp0); - if (sp0 == 0 && gUnknown_03007890->unk_00 == 0) + if (sp0 == 0 && gRfuLinkStatus->parentChild == 0) { stwiRecvBuffer = rfu_getSTWIRecvBuffer(); - stwiRecvBuffer[4] = gUnknown_03007890->unk_02; - stwiRecvBuffer[5] = 1; + stwiRecvBuffer->rxPacketAlloc.rfuPacket8.data[4] = gRfuLinkStatus->connSlotFlag; + stwiRecvBuffer->rxPacketAlloc.rfuPacket8.data[5] = 1; sub_800C36C(0x29); r6 = 0; } @@ -1163,7 +1163,7 @@ static void sub_800C7B4(u16 r8, u16 r6) if (r6 == 0) { stwiRecvBuffer = rfu_getSTWIRecvBuffer(); - gUnknown_03004140.unk_14 = stwiRecvBuffer[8]; + gUnknown_03004140.unk_14 = stwiRecvBuffer->rxPacketAlloc.rfuPacket8.data[8]; sub_800D358(gUnknown_03004140.unk_14); if (gUnknown_03004140.unk_30) { @@ -1191,7 +1191,7 @@ static void sub_800C7B4(u16 r8, u16 r6) gUnknown_03004140.unk_00 &= ~gUnknown_03004140.unk_14; if (gUnknown_03004140.unk_07) { - if (gUnknown_03007890->unk_00 == 0xFF) + if (gRfuLinkStatus->parentChild == 0xFF) { if (gUnknown_03004140.unk_07 == 8) { @@ -1206,7 +1206,7 @@ static void sub_800C7B4(u16 r8, u16 r6) } } } - if (gUnknown_03007890->unk_00 == 0xFF) + if (gRfuLinkStatus->parentChild == 0xFF) { if (gUnknown_03004140.unk_04 == 0) { @@ -1221,7 +1221,7 @@ static void sub_800C7B4(u16 r8, u16 r6) break; case 38: sub_800D20C(); - if (gUnknown_03007890->unk_00 != 0xFF) + if (gRfuLinkStatus->parentChild != 0xFF) { sub_800D30C(0x50, 0x00); } @@ -1246,8 +1246,8 @@ static void sub_800C7B4(u16 r8, u16 r6) { if (r8 == 28 && r6 != 0 && gUnknown_03004140.unk_07 == 4) { - gUnknown_03007890->unk_00 = 1; - gUnknown_03007890->unk_02 = 15; + gRfuLinkStatus->parentChild = 1; + gRfuLinkStatus->connSlotFlag = 15; sub_800D334(15); rfu_waitREQComplete(); return; @@ -1279,7 +1279,7 @@ static void sub_800CEB0(u16 r6) r7 = gUnknown_03004140.unk_0e; gUnknown_03004140.unk_0e = 0; gUnknown_03004140.unk_0f = 1; - if (gUnknown_03007890->unk_00 == 0) + if (gRfuLinkStatus->parentChild == 0) { sub_800C36C(r6); if (gUnknown_03004140.unk_02 != 1) @@ -1321,8 +1321,8 @@ static void sub_800CF34(void) if (gUnknown_03004140.unk_04 == 5 || gUnknown_03004140.unk_04 == 6 || gUnknown_03004140.unk_04 == 7 || gUnknown_03004140.unk_04 == 8) { - flags = ((gUnknown_03007890->unk_02 ^ gUnknown_03004140.unk_0c) & gUnknown_03007890->unk_02) & ~gUnknown_03007890->unk_07; - gUnknown_03004140.unk_0c = gUnknown_03007890->unk_02; + flags = ((gRfuLinkStatus->connSlotFlag ^ gUnknown_03004140.unk_0c) & gRfuLinkStatus->connSlotFlag) & ~gRfuLinkStatus->getNameFlag; + gUnknown_03004140.unk_0c = gRfuLinkStatus->connSlotFlag; if (flags) { gUnknown_03004140.unk_14 = flags; @@ -1340,14 +1340,14 @@ static void sub_800CF34(void) } else if (gUnknown_03004140.unk_24 & r4) { - if (gUnknown_03007880[i]->unk_34 == 0x46) + if (gRfuSlotStatusNI[i]->recv.state == 0x46) { - if (gUnknown_03007880[i]->unk_61 == 1) + if (gRfuSlotStatusNI[i]->recv.dataType == 1) { r5 = 0x02; for (ptr = gUnknown_03004140.unk_20; *ptr != 0xFFFF; ptr++) { - if (gUnknown_03007890->unk_14[i].unk_04 == *ptr) + if (gRfuLinkStatus->partner[i].serialNo == *ptr) { gUnknown_03004140.unk_00 |= r4; gUnknown_03004140.unk_01++; @@ -1386,7 +1386,7 @@ static void sub_800CF34(void) if (gUnknown_03004140.unk_0d) { r5 = 0x01; - if (gUnknown_03007890->unk_06 && ((gUnknown_03004140.unk_03 & gUnknown_03004140.unk_00) != gUnknown_03004140.unk_00)) + if (gRfuLinkStatus->sendSlotUNIFlag && ((gUnknown_03004140.unk_03 & gUnknown_03004140.unk_00) != gUnknown_03004140.unk_00)) { r5 = 0x00; } @@ -1434,7 +1434,7 @@ static void sub_800D158(void) REG_IME = 0; if (gUnknown_03004140.unk_04 == 15) { - if (--gUnknown_03004140.unk_28[gUnknown_03004140.unk_10] == 0 || gUnknown_03007880[gUnknown_03004140.unk_10]->unk_0 == 0x27) + if (--gUnknown_03004140.unk_28[gUnknown_03004140.unk_10] == 0 || gRfuSlotStatusNI[gUnknown_03004140.unk_10]->send.state == 0x27) { sub_800D630(); gUnknown_03004140.unk_04 = 24; @@ -1453,7 +1453,7 @@ static void sub_800D158(void) if (gUnknown_03004140.unk_02 == 0) { gUnknown_03004140.unk_04 = gUnknown_03004140.unk_05 = 0; - sub_800D334(gUnknown_03007890->unk_02 | gUnknown_03007890->unk_03); + sub_800D334(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag); gUnknown_03004140.unk_14 = 0; sub_800D30C(0x25, 0x01); } @@ -1462,7 +1462,7 @@ static void sub_800D158(void) static void sub_800D20C(void) { - if (gUnknown_03004140.unk_04 == 15 && gUnknown_03007880[gUnknown_03004140.unk_10]->unk_0 == 0x26) + if (gUnknown_03004140.unk_04 == 15 && gRfuSlotStatusNI[gUnknown_03004140.unk_10]->send.state == 0x26) { gUnknown_03004140.unk_04 = gUnknown_03004140.unk_05 = 0; rfu_clearSlot(4, gUnknown_03004140.unk_10); @@ -1490,11 +1490,11 @@ static u8 sub_800D294(void) const u16 *ptr; u8 flags = 0x00; - for (i = 0; i < gUnknown_03007890->unk_08; i++) + for (i = 0; i < gRfuLinkStatus->findParentCount; i++) { for (ptr = gUnknown_03004140.unk_20; *ptr != 0xFFFF; ptr++) { - if (gUnknown_03007890->unk_14[i].unk_04 == *ptr) + if (gRfuLinkStatus->partner[i].serialNo == *ptr) { flags |= (1 << i); } @@ -1525,34 +1525,34 @@ static void sub_800D358(u8 a0) { u8 i; - if (gUnknown_03007890->unk_04) + if (gRfuLinkStatus->sendSlotNIFlag) { for (i = 0; i < 4; i++) { - if (gUnknown_03007880[i]->unk_0 & 0x8000 && gUnknown_03007880[i]->unk_1a & a0) + if (gRfuSlotStatusNI[i]->send.state & 0x8000 && gRfuSlotStatusNI[i]->send.bmSlot & a0) { - rfu_changeSendTarget(0x20, i, gUnknown_03007880[i]->unk_1a & ~a0); + rfu_changeSendTarget(0x20, i, gRfuSlotStatusNI[i]->send.bmSlot & ~a0); } } } - if (gUnknown_03007890->unk_05) + if (gRfuLinkStatus->recvSlotNIFlag) { for (i = 0; i < 4; i++) { - if (gUnknown_03007880[i]->unk_34 & 0x8000 && gUnknown_03007880[i]->unk_4e & a0) + if (gRfuSlotStatusNI[i]->recv.state & 0x8000 && gRfuSlotStatusNI[i]->recv.bmSlot & a0) { rfu_NI_stopReceivingData(i); } } } - if (gUnknown_03007890->unk_06) + if (gRfuLinkStatus->sendSlotUNIFlag) { - gUnknown_03007890->unk_06 &= ~a0; + gRfuLinkStatus->sendSlotUNIFlag &= ~a0; for (i = 0; i < 4; i++) { - if (gUnknown_03007870[i]->unk_0 == 0x8024 && a0 & gUnknown_03007870[i]->unk_3) + if (gRfuSlotStatusUNI[i]->send.state == 0x8024 && a0 & gRfuSlotStatusUNI[i]->send.bmSlot) { - gUnknown_03007870[i]->unk_3 &= ~a0; + gRfuSlotStatusUNI[i]->send.bmSlot &= ~a0; } } } @@ -1566,32 +1566,32 @@ static void sub_800D434(void) if (gUnknown_03004140.unk_18) { - if (gUnknown_03007890->unk_04) + if (gRfuLinkStatus->sendSlotNIFlag) { for (i = 0; i < 4; i ++) { - if (gUnknown_03007880[i]->unk_0 & 0x8000) + if (gRfuSlotStatusNI[i]->send.state & 0x8000) { flags = 0; for (j = 0; j < 4; j++) { - if ((gUnknown_03007880[i]->unk_1a >> j) & 1 && gUnknown_03007880[j]->unk_2 > gUnknown_03004140.unk_18) + if ((gRfuSlotStatusNI[i]->send.bmSlot >> j) & 1 && gRfuSlotStatusNI[j]->send.failCounter > gUnknown_03004140.unk_18) { flags |= (1 << j); } if (flags) { - rfu_changeSendTarget(0x20, i, flags ^ gUnknown_03007880[i]->unk_1a); + rfu_changeSendTarget(0x20, i, flags ^ gRfuSlotStatusNI[i]->send.bmSlot); } } } } } - if (gUnknown_03007890->unk_05) + if (gRfuLinkStatus->recvSlotNIFlag) { for (i = 0; i < 4; i++) { - if (gUnknown_03007880[i]->unk_34 & 0x8000 && gUnknown_03007880[i]->unk_36 > gUnknown_03004140.unk_18) + if (gRfuSlotStatusNI[i]->recv.state & 0x8000 && gRfuSlotStatusNI[i]->recv.failCounter > gUnknown_03004140.unk_18) { rfu_NI_stopReceivingData(i); } @@ -1628,7 +1628,7 @@ u8 sub_800D550(u8 a0, u16 a1) u8 sub_800D594(u16 a0) { - if (gUnknown_03007890->unk_04 | gUnknown_03007890->unk_05) + if (gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag) { gUnknown_03004140.unk_14 = 6; sub_800D30C(0xf3, 0x01); @@ -2049,17 +2049,17 @@ void ASCIIToPkmnStr(u8 *q1, const u8 *q2) u8 sub_800DD1C(u8 maxFlags) { u8 flagCount = 0; - u32 flags = gUnknown_03007890->unk_02; + u32 flags = gRfuLinkStatus->connSlotFlag; u8 i; - if (gUnknown_03007890->unk_00 == 1) + if (gRfuLinkStatus->parentChild == 1) { for (i = 0; i < 4; flags >>= 1, i++) { if (flags & 1) { if (maxFlags == flagCount + 1) - return gUnknown_03007890->unk_0a[i]; + return gRfuLinkStatus->strength[i]; flagCount++; } } @@ -2069,7 +2069,7 @@ u8 sub_800DD1C(u8 maxFlags) for (i = 0; i < 4; flags >>= 1, i++) { if (flags & 1) - return gUnknown_03007890->unk_0a[i]; + return gRfuLinkStatus->strength[i]; } } return 0; @@ -2081,7 +2081,7 @@ NAKED u8 sub_800DD1C(u8 maxFlags) "\tlsls r0, 24\n" "\tlsrs r5, r0, 24\n" "\tmovs r6, 0\n" - "\tldr r0, =gUnknown_03007890\n" + "\tldr r0, =gRfuLinkStatus\n" "\tldr r4, [r0]\n" "\tldrb r2, [r4, 0x2]\n" "\tldrb r1, [r4]\n" @@ -2177,24 +2177,24 @@ bool8 sub_800DE7C(struct UnkLinkRfuStruct_02022B14 *buff1, u8 *buff2, u8 idx) if (gUnknown_03004140.unk_06 == 1) { retVal = TRUE; - if (sub_8010454(gUnknown_03007890->unk_14[idx].unk_04) && ((gUnknown_03007890->unk_07 >> idx) & 1)) + if (sub_8010454(gRfuLinkStatus->partner[idx].serialNo) && ((gRfuLinkStatus->getNameFlag >> idx) & 1)) { - memcpy(buff1, &gUnknown_03007890->unk_14[idx].unk_06, 0xD); - memcpy(buff2, gUnknown_03007890->unk_14[idx].playerName, PLAYER_NAME_LENGTH + 1); + memcpy(buff1, gRfuLinkStatus->partner[idx].gname, 0xD); + memcpy(buff2, gRfuLinkStatus->partner[idx].uname, PLAYER_NAME_LENGTH + 1); } else { memset(buff1, 0, 0xD); - memset(buff2, 0, sizeof(gUnknown_03007890->unk_14[idx].playerName)); + memset(buff2, 0, PLAYER_NAME_LENGTH + 1); } } else { retVal = FALSE; - if (sub_8010454(gUnknown_03007890->unk_14[idx].unk_04)) + if (sub_8010454(gRfuLinkStatus->partner[idx].serialNo)) { - memcpy(buff1, &gUnknown_03007890->unk_14[idx].unk_06, 0xD); - memcpy(buff2, gUnknown_03007890->unk_14[idx].playerName, PLAYER_NAME_LENGTH + 1); + memcpy(buff1, gRfuLinkStatus->partner[idx].gname, 0xD); + memcpy(buff2, gRfuLinkStatus->partner[idx].uname, PLAYER_NAME_LENGTH + 1); } else { @@ -2208,10 +2208,10 @@ bool8 sub_800DE7C(struct UnkLinkRfuStruct_02022B14 *buff1, u8 *buff2, u8 idx) bool8 sub_800DF34(struct UnkLinkRfuStruct_02022B14 *buff1, u8 *buff2, u8 idx) { bool8 retVal = FALSE; - if (gUnknown_03007890->unk_14[idx].unk_04 == 0x7F7D) + if (gRfuLinkStatus->partner[idx].serialNo == 0x7F7D) { - memcpy(buff1, &gUnknown_03007890->unk_14[idx].unk_06, 0xD); - memcpy(buff2, gUnknown_03007890->unk_14[idx].playerName, 8); + memcpy(buff1, gRfuLinkStatus->partner[idx].gname, 0xD); + memcpy(buff2, gRfuLinkStatus->partner[idx].uname, 8); retVal = TRUE; } else @@ -2237,7 +2237,7 @@ void CreateWirelessStatusIndicatorSprite(u8 x, u8 y) x = 0xE7; y = 0x08; } - if (gUnknown_03007890->unk_00 == 1) + if (gRfuLinkStatus->parentChild == 1) { sprId = CreateSprite(&sWirelessStatusIndicatorSpriteTemplate, x, y, 0); gSprites[sprId].data[7] = 0x1234; @@ -2278,12 +2278,12 @@ void LoadWirelessStatusIndicatorSpriteGfx(void) u8 sub_800E124(void) { u8 i; - u8 flags = gUnknown_03007890->unk_02; + u8 flags = gRfuLinkStatus->connSlotFlag; for (i = 0; i < 4; i++) { if (flags & 1) { - return gUnknown_03007890->unk_0a[i]; + return gRfuLinkStatus->strength[i]; } flags >>= 1; } @@ -2307,7 +2307,7 @@ void sub_800E174(void) struct Sprite *sprite = &gSprites[gWirelessStatusIndicatorSpriteId]; u8 signalStrength = 255; u8 i = 0; - if (gUnknown_03007890->unk_00 == 1) + if (gRfuLinkStatus->parentChild == 1) { for (i = 0; i < GetLinkPlayerCount() - 1; i++) { @@ -2530,7 +2530,7 @@ void sub_800E6D0(void) void sub_800E700(void) { - if (!rfu_initializeAPI(gUnknown_03004140.unk_50, sizeof gUnknown_03004140.unk_50, gIntrTable + 1, TRUE)) + if (!rfu_initializeAPI((void *)gUnknown_03004140.unk_50, sizeof gUnknown_03004140.unk_50, gIntrTable + 1, TRUE)) { gLinkType = 0; sub_800AAF4(); @@ -2787,7 +2787,7 @@ void sub_800ED34(u16 unused) } rfu_REQ_recvData(); rfu_waitREQComplete(); - if (gUnknown_03007870[gUnknown_03005000.unk_c3e]->unk_12) + if (gRfuSlotStatusUNI[gUnknown_03005000.unk_c3e]->recv.newDataFlag) { gUnknown_03005000.unk_cd0++; sub_800D7D8(&gUnknown_03005000.unk_124, gUnknown_03005000.unk_c3f); @@ -2858,7 +2858,7 @@ bool8 sub_800EE94(void) bool32 sub_800EEBC(void) { - if (gUnknown_03005000.unk_04 == 7 && !sub_800C12C(gUnknown_03007890->unk_14[gUnknown_03005000.unk_c3d].unk_00, 240)) + if (gUnknown_03005000.unk_04 == 7 && !sub_800C12C(gRfuLinkStatus->partner[gUnknown_03005000.unk_c3d].id, 240)) { gUnknown_03005000.unk_04 = 9; return TRUE; @@ -2971,7 +2971,7 @@ bool32 IsRfuRecvQueueEmpty(void) s32 i; s32 j; - if (gUnknown_03007890->unk_06 == 0) + if (gRfuLinkStatus->sendSlotUNIFlag == 0) { return FALSE; } @@ -2999,7 +2999,7 @@ bool32 sub_800F0F8(void) else { gUnknown_03005000.unk_cdb = 0; - if ((gUnknown_03005000.unk_ce2 & gUnknown_03007890->unk_02) == gUnknown_03005000.unk_ce2 && (gUnknown_03005000.unk_ce2 & gUnknown_03007890->unk_02)) + if ((gUnknown_03005000.unk_ce2 & gRfuLinkStatus->connSlotFlag) == gUnknown_03005000.unk_ce2 && (gUnknown_03005000.unk_ce2 & gRfuLinkStatus->connSlotFlag)) { if (!gUnknown_03005000.unk_cdc) { @@ -3119,7 +3119,7 @@ bool32 sub_800F1E0(void) gUnknown_03005000.unk_0e = 0; } retval = gUnknown_03005000.unk_cdc; - return gUnknown_03007890->unk_06 ? retval & 1 : FALSE; + return gRfuLinkStatus->sendSlotUNIFlag ? retval & 1 : FALSE; } void sub_800F498(u16 *a0, u8 *a1) @@ -3162,7 +3162,7 @@ bool32 sub_800F4F0(void) sub_800F86C(0); if (gUnknown_03004140.unk_02 == 0 && gUnknown_03005000.unk_ce4) { - rfu_REQ_disconnect(gUnknown_03007890->unk_02 | gUnknown_03007890->unk_03); + rfu_REQ_disconnect(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag); rfu_waitREQComplete(); switchval = sub_8011A74(); if (switchval != 1 && switchval != 6 && switchval != 9) @@ -3305,7 +3305,7 @@ static void sub_800F86C(u8 unused) return; // fallthrough case 0x7700: - if (gUnknown_03007890->unk_00 == 0) + if (gRfuLinkStatus->parentChild == 0) { gUnknown_03005000.playerCount = gRecvCmds[i][1]; gUnknown_03005000.unk_cce = sub_800F74C((u8 *)(gRecvCmds[i] + 2)); @@ -3353,7 +3353,7 @@ static void sub_800F86C(u8 unused) { if (gReceivedRemoteLinkPlayers != 0) { - if (gRecvCmds[i][1] & gUnknown_03007890->unk_02) + if (gRecvCmds[i][1] & gRfuLinkStatus->connSlotFlag) { gReceivedRemoteLinkPlayers = 0; sub_800D630(); @@ -3611,7 +3611,7 @@ void sub_801011C(void) void sub_8010148(void) { - rfu_REQ_disconnect(gUnknown_03007890->unk_02 | gUnknown_03007890->unk_03); + rfu_REQ_disconnect(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag); rfu_waitREQComplete(); sub_801011C(); } @@ -3631,7 +3631,7 @@ void LinkRfu_FatalError(void) { sub_800D630(); gUnknown_03005000.unk_ce4 = 1; - gUnknown_03005000.unk_ce3 = gUnknown_03007890->unk_02 | gUnknown_03007890->unk_03; + gUnknown_03005000.unk_ce3 = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag; } void sub_80101CC(void) @@ -3821,7 +3821,7 @@ bool8 sub_8010540(void) { if (gUnknown_03005000.unk_cd1[i] < 5 || gUnknown_03005000.unk_cd1[i] > 6) { - if (gUnknown_03007880[i]->unk_34 == 0x46 || gUnknown_03007880[i]->unk_34 == 0x48) + if (gRfuSlotStatusNI[i]->recv.state == 0x46 || gRfuSlotStatusNI[i]->recv.state == 0x48) { if (gUnknown_03005000.unk_cd5[i] == 8) { @@ -3833,7 +3833,7 @@ bool8 sub_8010540(void) } } - else if (gUnknown_03007880[gUnknown_03005000.unk_c3e]->unk_34 == 0x47) + else if (gRfuSlotStatusNI[gUnknown_03005000.unk_c3e]->recv.state == 0x47) rfu_clearSlot(8, i); { @@ -3898,7 +3898,7 @@ u32 sub_8010714(u16 a0, const u8 *a1) u8 r0 = sub_8011CE4(a1, a0); if (r0 == 0xFF) return 2; - if (gUnknown_03007880[r0]->unk_0 == 0) + if (gRfuSlotStatusNI[r0]->send.state == 0) return 1; return 0; } @@ -3910,7 +3910,7 @@ void sub_8010750(void) sub_8010540(); for (i = 0; i < 4; i++) { - if (gUnknown_03007880[i]->unk_0 == 0x26 || gUnknown_03007880[i]->unk_0 == 0x27) + if (gRfuSlotStatusNI[i]->send.state == 0x26 || gRfuSlotStatusNI[i]->send.state == 0x27) { if (gUnknown_03005000.unk_cd5[i] == 10) gUnknown_03005000.unk_cd5[i] = 11; @@ -3924,16 +3924,16 @@ s32 sub_80107A0(void) s32 retval = 0; if (gUnknown_03005000.unk_c85 == 8) { - if (gUnknown_03007880[gUnknown_03005000.unk_c3e]->unk_0 == 0x26 || gUnknown_03007880[gUnknown_03005000.unk_c3e]->unk_0 == 0x27) + if (gRfuSlotStatusNI[gUnknown_03005000.unk_c3e]->send.state == 0x26 || gRfuSlotStatusNI[gUnknown_03005000.unk_c3e]->send.state == 0x27) rfu_clearSlot(4, gUnknown_03005000.unk_c3e); } - if (gUnknown_03007880[gUnknown_03005000.unk_c3e]->unk_34 == 0x46 || gUnknown_03007880[gUnknown_03005000.unk_c3e]->unk_34 == 0x48) + if (gRfuSlotStatusNI[gUnknown_03005000.unk_c3e]->recv.state == 0x46 || gRfuSlotStatusNI[gUnknown_03005000.unk_c3e]->recv.state == 0x48) { rfu_clearSlot(8, gUnknown_03005000.unk_c3e); sub_8011A64(gUnknown_03005000.unk_c86, 0); retval = gUnknown_03005000.unk_c86; } - else if (gUnknown_03007880[gUnknown_03005000.unk_c3e]->unk_34 == 0x47) + else if (gRfuSlotStatusNI[gUnknown_03005000.unk_c3e]->recv.state == 0x47) { rfu_clearSlot(8, gUnknown_03005000.unk_c3e); retval = 6; @@ -4282,14 +4282,14 @@ void sub_801103C(void) void sub_8011068(u8 a0) { gUnknown_02022B14.unk_0a_7 = a0; - rfu_REQ_configGameData(0, 2, &gUnknown_02022B14, gUnknown_02022B22); + rfu_REQ_configGameData(0, 2, (const u8 *)&gUnknown_02022B14, gUnknown_02022B22); } void sub_8011090(u8 a0, u32 a1, u32 a2) { if (a0) sub_8010F84(a0, a1, a2); - rfu_REQ_configGameData(0, 2, &gUnknown_02022B14, gUnknown_02022B22); + rfu_REQ_configGameData(0, 2, (const u8 *)&gUnknown_02022B14, gUnknown_02022B22); } void sub_80110B8(u32 a0) @@ -4370,7 +4370,7 @@ void sub_801120C(u8 a0, u8 unused1) { if ((gUnknown_03004140.unk_14 >> i) & 1) { - struct UnkLinkRfuStruct_02022B14 *structPtr = &gUnknown_03007890->unk_14[i].unk_06; + struct UnkLinkRfuStruct_02022B14 *structPtr = (void *)gRfuLinkStatus->partner[i].gname; if (structPtr->unk_0a_0 == sub_800F7DC()->unk_0a_0) { gUnknown_03005000.unk_cd1[i] = 0; @@ -4528,7 +4528,7 @@ u8 sub_8011628(s32 a0) { if ((a0 >> i) & 1) { - struct UnkLinkRfuStruct_02022B14 *structPtr = &gUnknown_03007890->unk_14[i].unk_06; + struct UnkLinkRfuStruct_02022B14 *structPtr = (void *)gRfuLinkStatus->partner[i].gname; if (structPtr->unk_0a_0 == 0x45) ret |= (1 << i); } @@ -4629,7 +4629,7 @@ void sub_8011674(u8 a0, u8 unused1) break; case 0x32: gUnknown_03005000.unk_f0 = 3; - if (gUnknown_03007890->unk_00 == 0) + if (gRfuLinkStatus->parentChild == 0) gUnknown_03005000.unk_c3c = 1; break; case 0x30: @@ -4654,7 +4654,7 @@ void sub_8011674(u8 a0, u8 unused1) sub_800C27C(0); } - if (gUnknown_03007890->unk_00 == 0xFF && gUnknown_03004140.unk_07 == 0 && FuncIsActiveTask(sub_800EB44) == TRUE) + if (gRfuLinkStatus->parentChild == 0xFF && gUnknown_03004140.unk_07 == 0 && FuncIsActiveTask(sub_800EB44) == TRUE) gUnknown_03005000.unk_04 = 0x11; sub_8011A64(2, a0); @@ -4825,13 +4825,13 @@ u8 sub_8011CE4(const u8 *a0, u16 a1) for (i = 0; i < 4; i++) { - u16 trainerId = ReadU16(gUnknown_03007890->unk_14[i].unk_06.unk_00.playerTrainerId); - if (sub_8010454(gUnknown_03007890->unk_14[i].unk_04) - && !StringCompare(a0, gUnknown_03007890->unk_14[i].playerName) + u16 trainerId = ReadU16(gRfuLinkStatus->partner[i].gname + 2); + if (sub_8010454(gRfuLinkStatus->partner[i].serialNo) + && !StringCompare(a0, gRfuLinkStatus->partner[i].uname) && a1 == trainerId) { ret = i; - if (gUnknown_03007890->unk_14[i].unk_02 != 0xFF) + if (gRfuLinkStatus->partner[i].slot != 0xFF) break; } } @@ -4911,7 +4911,7 @@ void sub_8011EF4(u8 taskId) u8 id = sub_8011CE4((u8*)data, ReadU16(&data[8])); if (id != 0xFF) { - if (gUnknown_03007890->unk_14[id].unk_02 != 0xFF) + if (gRfuLinkStatus->partner[id].slot != 0xFF) { gUnknown_03005000.unk_c3d = id; if (sub_800EEBC()) @@ -5006,9 +5006,9 @@ void sub_801209C(u8 taskId) u8 id = sub_8011CE4(gUnknown_03005000.playerName, trainerId); if (id != 0xFF) { - if (!sub_801200C(gTasks[taskId].data[1], &gUnknown_03007890->unk_14[id].unk_06)) + if (!sub_801200C(gTasks[taskId].data[1], (void *)gRfuLinkStatus->partner[id].gname)) { - if (gUnknown_03007890->unk_14[id].unk_02 != 0xFF && !sub_800C12C(gUnknown_03007890->unk_14[id].unk_00, 0x5A)) + if (gRfuLinkStatus->partner[id].slot != 0xFF && !sub_800C12C(gRfuLinkStatus->partner[id].id, 0x5A)) { gUnknown_03005000.unk_04 = 0xA; DestroyTask(taskId); @@ -5081,17 +5081,17 @@ void sub_801229C(void) s32 i, j; nullsub_13(GetBlockReceivedStatus(), 0x1C, 0x13, 2); - nullsub_13(gUnknown_03007890->unk_02, 0x14, 1, 1); - nullsub_13(gUnknown_03007890->unk_03, 0x17, 1, 1); + nullsub_13(gRfuLinkStatus->connSlotFlag, 0x14, 1, 1); + nullsub_13(gRfuLinkStatus->linkLossSlotFlag, 0x17, 1, 1); if (gUnknown_03005000.unk_0c == 1) { for (i = 0; i < 4; i++) { - if ((gUnknown_03007890->unk_07 >> i) & 1) + if ((gRfuLinkStatus->getNameFlag >> i) & 1) { - nullsub_13(gUnknown_03007890->unk_14[i].unk_04, 1, i + 3, 4); - nullsub_5((void*) &gUnknown_03007890->unk_14[i].unk_06, 6, i + 3); - nullsub_5(gUnknown_03007890->unk_14[i].playerName, 0x16, i + 3); + nullsub_13(gRfuLinkStatus->partner[i].serialNo, 1, i + 3, 4); + nullsub_5((void*)gRfuLinkStatus->partner[i].gname, 6, i + 3); + nullsub_5(gRfuLinkStatus->partner[i].uname, 0x16, i + 3); } } for (i = 0; i < 4; i++) @@ -5103,7 +5103,7 @@ void sub_801229C(void) } nullsub_5(gUnknown_082ED868, 1, 0xF); } - else if (gUnknown_03007890->unk_02 != 0 && gUnknown_03007890->unk_07 != 0) + else if (gRfuLinkStatus->connSlotFlag != 0 && gRfuLinkStatus->getNameFlag != 0) { for (i = 0; i < 4; i++) { @@ -5111,19 +5111,19 @@ void sub_801229C(void) nullsub_5(gUnknown_082ED84B, 6, i + 3); nullsub_5(gUnknown_082ED85B, 0x16, i + 3); } - nullsub_13(gUnknown_03007890->unk_14[gUnknown_03005000.unk_c3e].unk_04, 1, 3, 4); - nullsub_5((void*) &gUnknown_03007890->unk_14[gUnknown_03005000.unk_c3e].unk_06, 6, 3); - nullsub_5(gUnknown_03007890->unk_14[gUnknown_03005000.unk_c3e].playerName, 0x16, 3); + nullsub_13(gRfuLinkStatus->partner[gUnknown_03005000.unk_c3e].serialNo, 1, 3, 4); + nullsub_5((void*)gRfuLinkStatus->partner[gUnknown_03005000.unk_c3e].gname, 6, 3); + nullsub_5(gRfuLinkStatus->partner[gUnknown_03005000.unk_c3e].uname, 0x16, 3); } else { - for (i = 0; i < gUnknown_03007890->unk_08; i++) + for (i = 0; i < gRfuLinkStatus->findParentCount; i++) { - if (gUnknown_03007890->unk_14[i].unk_02 != 0xFF) + if (gRfuLinkStatus->partner[i].slot != 0xFF) { - nullsub_13(gUnknown_03007890->unk_14[i].unk_04, 1, i + 3, 4); - nullsub_13(gUnknown_03007890->unk_14[i].unk_00, 6, i + 3, 4); - nullsub_5(gUnknown_03007890->unk_14[i].playerName, 0x16, i + 3); + nullsub_13(gRfuLinkStatus->partner[i].serialNo, 1, i + 3, 4); + nullsub_13(gRfuLinkStatus->partner[i].id, 6, i + 3, 4); + nullsub_5(gRfuLinkStatus->partner[i].uname, 0x16, i + 3); } } for (; i < 4; i++) diff --git a/src/trade.c b/src/trade.c index a9a0b9b2a..bd97471e3 100644 --- a/src/trade.c +++ b/src/trade.c @@ -254,7 +254,7 @@ static bool32 sub_80771BC(void) { if (gUnknown_02022C2C == 29) { - if (gUnknown_03007880[sub_800E87C(gUnknown_03004140.unk_00)]->unk_0 == 0) + if (gRfuSlotStatusNI[sub_800E87C(gUnknown_03004140.unk_00)]->send.state == 0) return TRUE; else return FALSE; diff --git a/src/union_room.c b/src/union_room.c index 08e177bac..733909342 100644 --- a/src/union_room.c +++ b/src/union_room.c @@ -4077,7 +4077,7 @@ s32 sub_8017EA0(u8 *dst, u32 gender, u16 *arg2, struct UnkStruct_URoom *arg3) StringCopy(arg3->field_58 + 0x10, gSpeciesNames[sUnionRoomTrade.playerSpecies]); for (i = 0; i < 4; i++) { - if (gUnknown_03007890->unk_14[i].unk_04 == 2) + if (gRfuLinkStatus->partner[i].serialNo == 2) { ConvertIntToDecimalStringN(arg3->field_58 + 0x20, arg2[2], STR_CONV_MODE_LEFT_ALIGN, 3); StringCopy(arg3->field_58 + 0x30, gSpeciesNames[arg2[1]]); |