diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/librfu_sio32id.c (renamed from src/librfu_s32id.c) | 68 | ||||
-rw-r--r-- | src/main.c | 57 | ||||
-rw-r--r-- | src/party_menu_specials.c | 111 | ||||
-rw-r--r-- | src/pc_screen_effect.c | 156 | ||||
-rw-r--r-- | src/scrcmd.c | 1 | ||||
-rw-r--r-- | src/vs_seeker.c | 352 |
6 files changed, 349 insertions, 396 deletions
diff --git a/src/librfu_s32id.c b/src/librfu_sio32id.c index ed51dcd12..fc5701986 100644 --- a/src/librfu_s32id.c +++ b/src/librfu_sio32id.c @@ -4,7 +4,7 @@ static void Sio32IDIntr(void); static void Sio32IDInit(void); static s32 Sio32IDMain(void); -struct RfuS32Id gRfuS32Id; +struct RfuSIO32Id gRfuSIO32Id; static const u16 Sio32ConnectionData[] = { 0x494e, 0x544e, 0x4e45, 0x4f44 }; // NINTENDO static const char Sio32IDLib_Var[] = "Sio32ID_030820"; @@ -52,7 +52,7 @@ static void Sio32IDInit(void) REG_RCNT = 0; REG_SIOCNT = SIO_32BIT_MODE; REG_SIOCNT |= SIO_INTR_ENABLE | SIO_ENABLE; - CpuFill32(0, &gRfuS32Id, sizeof(struct RfuS32Id)); + CpuFill32(0, &gRfuSIO32Id, sizeof(struct RfuSIO32Id)); REG_IF = INTR_FLAG_SERIAL; } @@ -60,39 +60,39 @@ static s32 Sio32IDMain(void) { u8 r12; - switch (r12 = gRfuS32Id.unk1) + switch (r12 = gRfuSIO32Id.unk1) { case 0: - gRfuS32Id.unk0 = 1; + gRfuSIO32Id.unk0 = 1; REG_SIOCNT |= SIO_38400_BPS; REG_IME = r12; REG_IE |= INTR_FLAG_SERIAL; REG_IME = 1; - gRfuS32Id.unk1 = 1; + gRfuSIO32Id.unk1 = 1; *(vu8 *)®_SIOCNT |= SIO_ENABLE; break; case 1: - if (gRfuS32Id.unkA == 0) + if (gRfuSIO32Id.unkA == 0) { - if (gRfuS32Id.unk0 == 1) + if (gRfuSIO32Id.unk0 == 1) { - if (gRfuS32Id.unk2 == 0) + if (gRfuSIO32Id.unk2 == 0) { - REG_IME = gRfuS32Id.unk2; + REG_IME = gRfuSIO32Id.unk2; REG_SIOCNT |= SIO_ENABLE; REG_IME = r12; } } - else if (gRfuS32Id.unk4 != 0x8001 && !gRfuS32Id.unk2) + else if (gRfuSIO32Id.unk4 != 0x8001 && !gRfuSIO32Id.unk2) { - REG_IME = gRfuS32Id.unk2; + REG_IME = gRfuSIO32Id.unk2; REG_IE &= ~INTR_FLAG_SERIAL; REG_IME = r12; - REG_SIOCNT = gRfuS32Id.unk2; + REG_SIOCNT = gRfuSIO32Id.unk2; REG_SIOCNT = SIO_32BIT_MODE; REG_IF = INTR_FLAG_SERIAL; REG_SIOCNT |= SIO_INTR_ENABLE | SIO_ENABLE; - REG_IME = gRfuS32Id.unk2; + REG_IME = gRfuSIO32Id.unk2; REG_IE |= INTR_FLAG_SERIAL; REG_IME = r12; } @@ -100,11 +100,11 @@ static s32 Sio32IDMain(void) } else { - gRfuS32Id.unk1 = 2; + gRfuSIO32Id.unk1 = 2; // fallthrough } default: - return gRfuS32Id.unkA; + return gRfuSIO32Id.unkA; } return 0; } @@ -122,43 +122,43 @@ static void Sio32IDIntr(void) #endif r5 = REG_SIODATA32; - if (gRfuS32Id.unk0 != 1) + if (gRfuSIO32Id.unk0 != 1) REG_SIOCNT |= SIO_ENABLE; - r1 = 16 * gRfuS32Id.unk0; // to handle side effect of inline asm + r1 = 16 * gRfuSIO32Id.unk0; // to handle side effect of inline asm r1 = (r5 << r1) >> 16; - r5 = (r5 << 16 * (1 - gRfuS32Id.unk0)) >> 16; - if (gRfuS32Id.unkA == 0) + r5 = (r5 << 16 * (1 - gRfuSIO32Id.unk0)) >> 16; + if (gRfuSIO32Id.unkA == 0) { - if (r1 == gRfuS32Id.unk6) + if (r1 == gRfuSIO32Id.unk6) { - if (gRfuS32Id.unk2 > 3) + if (gRfuSIO32Id.unk2 > 3) { - gRfuS32Id.unkA = r5; + gRfuSIO32Id.unkA = r5; } - else if (r1 == (u16)~gRfuS32Id.unk4) + else if (r1 == (u16)~gRfuSIO32Id.unk4) { - r0_ = ~gRfuS32Id.unk6; + r0_ = ~gRfuSIO32Id.unk6; if (r5 == r0_) - ++gRfuS32Id.unk2; + ++gRfuSIO32Id.unk2; } } else { - gRfuS32Id.unk2 = gRfuS32Id.unkA; + gRfuSIO32Id.unk2 = gRfuSIO32Id.unkA; } } - if (gRfuS32Id.unk2 < 4) - gRfuS32Id.unk4 = *(gRfuS32Id.unk2 + Sio32ConnectionData); + if (gRfuSIO32Id.unk2 < 4) + gRfuSIO32Id.unk4 = *(gRfuSIO32Id.unk2 + Sio32ConnectionData); else - gRfuS32Id.unk4 = 0x8001; - gRfuS32Id.unk6 = ~r5; - REG_SIODATA32 = (gRfuS32Id.unk4 << 16 * (1 - gRfuS32Id.unk0)) - + (gRfuS32Id.unk6 << 16 * gRfuS32Id.unk0); - if (gRfuS32Id.unk0 == 1 && (gRfuS32Id.unk2 || r5 == 0x494E)) + 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 (gRfuS32Id.unkA == 0) + if (gRfuSIO32Id.unkA == 0) REG_SIOCNT |= SIO_ENABLE; } } diff --git a/src/main.c b/src/main.c index 60f762a62..5d2db95be 100644 --- a/src/main.c +++ b/src/main.c @@ -1,4 +1,9 @@ #include "global.h" +#include "bg.h" +#include "gpu_regs.h" +#include "link.h" +#include "link_rfu.h" +#include "load_save.h" #include "main.h" #include "m4a.h" #include "random.h" @@ -6,48 +11,20 @@ #include "gba/flash_internal.h" #include "battle.h" #include "help_system.h" +#include "sound.h" +#include "new_menu_helpers.h" +#include "malloc.h" +#include "overworld.h" +#include "sprite.h" +#include "play_time.h" +#include "pokemon.h" +#include "intro.h" +#include "battle_controllers.h" +#include "scanline_effect.h" +#include "save_failed_screen.h" +#include "battle.h" -extern u16 GetGpuReg(u8); -extern void SetGpuReg(u8, u16); -extern void RFUVSync(void); -extern void LinkVSync(void); -extern void sub_80FCF34(void); -extern void LinkVSync(void); -extern void InitGpuRegManager(void); -extern void InitRFU(void); -extern void CheckForFlashMemory(void); -extern void InitMapMusic(void); -extern void ResetBgs(void); -extern void SetDefaultFontsPointer(void); -extern void InitHeap(void *heapStart, u32 heapSize); // malloc.h -extern void rfu_REQ_stopMode(void); -extern void rfu_waitREQComplete(void); -extern bool32 sub_80582E0(void); -extern bool32 sub_8058274(void); -extern void ClearSpriteCopyRequests(void); -extern void PlayTimeCounter_Update(void); -extern void MapMusicMain(void); -extern void EnableInterrupts(u16); -extern void sub_800DD28(void); -extern u16 SetFlashTimerIntr(u8 timerNum, void (**intrFunc)(void)); -extern void ScanlineEffect_Stop(void); -extern void sub_80F50F4(void); -extern bool32 sub_80F5118(void); - -extern struct SoundInfo gSoundInfo; -extern u32 gFlashMemoryPresent; extern u32 intr_main[]; -extern u8 gHeap[]; -extern struct SaveBlock1 gSaveBlock1; -extern struct SaveBlock2 gSaveBlock2; -extern struct PokemonStorage gPokemonStorage; -extern u32 gBattleTypeFlags; -extern u8 gUnknown_03002748; -extern u32 *gUnknown_0203CF5C; - -void Timer3Intr(void); -bool8 HandleLinkConnection(void); -void c2_copyright_1(void); static void VBlankIntr(void); static void HBlankIntr(void); diff --git a/src/party_menu_specials.c b/src/party_menu_specials.c new file mode 100644 index 000000000..751684bd5 --- /dev/null +++ b/src/party_menu_specials.c @@ -0,0 +1,111 @@ +#include "global.h" +#include "data.h" +#include "script.h" +#include "overworld.h" +#include "battle.h" +#include "palette.h" +#include "pokemon.h" +#include "party_menu.h" +#include "field_fadetransition.h" +#include "pokemon_summary_screen.h" +#include "event_data.h" +#include "string_util.h" +#include "constants/moves.h" + +static void sub_80BF97C(u8 taskId); + +void Special_ChooseMonFromParty(void) +{ + u8 taskId; + + ScriptContext2_Enable(); + taskId = CreateTask(sub_80BF97C, 10); + gTasks[taskId].data[0] = PARTY_MENU_TYPE_CHOOSE_MON; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); +} + +void Special_SelectMoveTutorMon(void) +{ + u8 taskId; + + ScriptContext2_Enable(); + taskId = CreateTask(sub_80BF97C, 10); + gTasks[taskId].data[0] = PARTY_MENU_TYPE_MOVE_RELEARNER; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); +} + +static void sub_80BF97C(u8 taskId) +{ + if (!gPaletteFade.active) + { + gPaletteFade.bufferTransferDisabled = TRUE; + ChoosePartyMonByMenuType((u8)gTasks[taskId].data[0]); + DestroyTask(taskId); + } +} + +void Special_SelectMove(void) +{ + ShowSelectMovePokemonSummaryScreen(gPlayerParty, gSpecialVar_0x8004, gPlayerPartyCount - 1, CB2_ReturnToField, 0); + sub_8138B38(3); + gFieldCallback = FieldCallback_ReturnToEventScript2; +} + +void Special_GetNumMovesSelectedMonHas(void) +{ + u8 i; + + gSpecialVar_Result = 0; + for (i = 0; i < MAX_MON_MOVES; ++i) + if (GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_MOVE1 + i) != MOVE_NONE) + ++gSpecialVar_Result; +} + +void Special_BufferMoveDeleterNicknameAndMove(void) +{ + struct Pokemon *mon = &gPlayerParty[gSpecialVar_0x8004]; + u16 move = GetMonData(mon, MON_DATA_MOVE1 + gSpecialVar_0x8005); + + GetMonNickname(mon, gStringVar1); + StringCopy(gStringVar2, gMoveNames[move]); +} + +static void ShiftMoveSlot(struct Pokemon *mon, u8 slotTo, u8 slotFrom) +{ + u16 move1 = GetMonData(mon, MON_DATA_MOVE1 + slotTo); + u16 move0 = GetMonData(mon, MON_DATA_MOVE1 + slotFrom); + u8 pp1 = GetMonData(mon, MON_DATA_PP1 + slotTo); + u8 pp0 = GetMonData(mon, MON_DATA_PP1 + slotFrom); + u8 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES); + u8 ppBonusMask1 = gPPUpGetMask[slotTo]; + u8 ppBonusMove1 = (ppBonuses & ppBonusMask1) >> (slotTo * 2); + u8 ppBonusMask2 = gPPUpGetMask[slotFrom]; + u8 ppBonusMove2 = (ppBonuses & ppBonusMask2) >> (slotFrom * 2); + + ppBonuses &= ~ppBonusMask1; + ppBonuses &= ~ppBonusMask2; + ppBonuses |= (ppBonusMove1 << (slotFrom * 2)) + (ppBonusMove2 << (slotTo * 2)); + SetMonData(mon, MON_DATA_MOVE1 + slotTo, &move0); + SetMonData(mon, MON_DATA_MOVE1 + slotFrom, &move1); + SetMonData(mon, MON_DATA_PP1 + slotTo, &pp0); + SetMonData(mon, MON_DATA_PP1 + slotFrom, &pp1); + SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses); +} + +void Special_MoveDeleterForgetMove(void) +{ + u16 i; + + SetMonMoveSlot(&gPlayerParty[gSpecialVar_0x8004], MOVE_NONE, gSpecialVar_0x8005); + RemoveMonPPBonus(&gPlayerParty[gSpecialVar_0x8004], gSpecialVar_0x8005); + for (i = gSpecialVar_0x8005; i < MAX_MON_MOVES - 1; ++i) + ShiftMoveSlot(&gPlayerParty[gSpecialVar_0x8004], i, i + 1); +} + +void Special_IsSelectedMonEgg(void) +{ + if (GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_IS_EGG)) + gSpecialVar_Result = TRUE; + else + gSpecialVar_Result = FALSE; +} diff --git a/src/pc_screen_effect.c b/src/pc_screen_effect.c new file mode 100644 index 000000000..5cc09df71 --- /dev/null +++ b/src/pc_screen_effect.c @@ -0,0 +1,156 @@ +#include "global.h" +#include "task.h" +#include "gpu_regs.h" +#include "palette.h" + +static void sub_80A0AC0(TaskFunc func, u16 a2, UNUSED u16 a3, u8 priority); +static void sub_80A0B0C(u8 taskId); +static void sub_80A0C78(u8 taskId); + +void sub_80A0A48(u16 a1, u16 a2, u8 a3) +{ + sub_80A0AC0(sub_80A0B0C, a1, a2, a3); +} + +void sub_80A0A70(u16 a1, u16 a2, u8 a3) +{ + sub_80A0AC0(sub_80A0C78, a1, a2, a3); +} + +bool8 sub_80A0A98(void) +{ + return FuncIsActiveTask(sub_80A0B0C); +} + +bool8 sub_80A0AAC(void) +{ + return FuncIsActiveTask(sub_80A0C78); +} + +static void sub_80A0AC0(TaskFunc func, u16 a2, UNUSED u16 a3, u8 priority) +{ + u8 taskId = CreateTask(func, priority); + + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = a2 == 0 ? 16 : a2; + gTasks[taskId].data[2] = a2 == 0 ? 20 : a2; + gTasks[taskId].func(taskId); +} + +static void sub_80A0B0C(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + task->data[3] = 120; + task->data[4] = 120; + task->data[5] = 80; + task->data[6] = 81; + SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[4])); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[6])); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR); + SetGpuReg(REG_OFFSET_WINOUT, 0); + break; + case 1: + task->data[7] = GetGpuReg(REG_OFFSET_BLDCNT); + task->data[8] = GetGpuReg(REG_OFFSET_BLDY); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_LIGHTEN); + SetGpuReg(REG_OFFSET_BLDY, 16); + break; + case 2: + task->data[3] -= task->data[1]; + task->data[4] += task->data[1]; + if (task->data[3] <= 0 || task->data[4] >= DISPLAY_WIDTH) + { + task->data[3] = 0; + task->data[4] = DISPLAY_WIDTH; + SetGpuReg(REG_OFFSET_BLDY, 0); + SetGpuReg(REG_OFFSET_BLDCNT, task->data[7]); + BlendPalettes(0xFFFFFFFF, 0, RGB_BLACK); + gPlttBufferFaded[0] = 0; + } + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[4])); + if (task->data[3]) + return; + break; + case 3: + task->data[5] -= task->data[2]; + task->data[6] += task->data[2]; + if (task->data[5] <= 0 || task->data[6] >= DISPLAY_HEIGHT) + { + task->data[5] = 0; + task->data[6] = DISPLAY_HEIGHT; + ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); + } + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[6])); + if (task->data[5]) + return; + break; + default: + SetGpuReg(REG_OFFSET_BLDCNT, task->data[7]); + DestroyTask(taskId); + return; + } + ++task->data[0]; +} + +static void sub_80A0C78(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + gPlttBufferFaded[0] = 0; + break; + case 1: + task->data[3] = 0; + task->data[4] = DISPLAY_WIDTH; + task->data[5] = 0; + task->data[6] = DISPLAY_HEIGHT; + SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[4])); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[6])); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR); + SetGpuReg(REG_OFFSET_WINOUT, 0); + break; + case 2: + task->data[5] += task->data[2]; + task->data[6] -= task->data[2]; + if (task->data[5] >= 80 || task->data[6] <= 81) + { + task->data[5] = 80; + task->data[6] = 81; + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_LIGHTEN); + SetGpuReg(REG_OFFSET_BLDY, 16); + } + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[6])); + if (task->data[5] != 80) + return; + break; + case 3: + task->data[3] += task->data[1]; + task->data[4] -= task->data[1]; + if (task->data[3] >= 120 || task->data[4] <= 120) + { + task->data[3] = 120; + task->data[4] = 120; + BlendPalettes(0xFFFFFFFF, 0x10, RGB_BLACK); + gPlttBufferFaded[0] = 0; + } + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[4])); + if (task->data[3] != 120) + return; + break; + default: + ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); + SetGpuReg(REG_OFFSET_BLDY, 0); + SetGpuReg(REG_OFFSET_BLDCNT, 0); + DestroyTask(taskId); + return; + } + ++task->data[0]; +} diff --git a/src/scrcmd.c b/src/scrcmd.c index fad30a6a8..6d2b1f430 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -34,7 +34,6 @@ #include "coins.h" #include "battle_setup.h" #include "shop.h" -#include "script_pokemon_80F8.h" #include "slot_machine.h" #include "field_effect.h" #include "fieldmap.h" diff --git a/src/vs_seeker.c b/src/vs_seeker.c index 46a0649d7..87d15488a 100644 --- a/src/vs_seeker.c +++ b/src/vs_seeker.c @@ -637,7 +637,6 @@ void sub_810C444(void) } } -#ifdef NONMATCHING bool8 sub_810C4EC(void) { if (CheckBagHasItem(ITEM_VS_SEEKER, 1) == TRUE) @@ -648,18 +647,18 @@ bool8 sub_810C4EC(void) if (FlagGet(FLAG_SYS_VS_SEEKER_CHARGING) == TRUE) { - u16 x; - do { - x = (gSaveBlock1Ptr->trainerRematchStepCounter >> 8) & 0xFF; - } while (0); + u8 x = (gSaveBlock1Ptr->trainerRematchStepCounter >> 8) & 0xFF; + u32 r4 = 0xFF; + if (x < 100) { x++; - gSaveBlock1Ptr->trainerRematchStepCounter = ((u16)(x << 8)) | (gSaveBlock1Ptr->trainerRematchStepCounter & 0xFF); + #ifndef NONMATCHING // fool the compiler that r4 has been changed + asm("":"=r"(r4)); + #endif + gSaveBlock1Ptr->trainerRematchStepCounter = (gSaveBlock1Ptr->trainerRematchStepCounter & 0xFF) | (x << 8); } - do { - x = (gSaveBlock1Ptr->trainerRematchStepCounter >> 8) & 0xFF; - } while (0); + x = (gSaveBlock1Ptr->trainerRematchStepCounter >> 8) & r4; if (x == 100) { FlagClear(FLAG_SYS_VS_SEEKER_CHARGING); @@ -671,80 +670,6 @@ bool8 sub_810C4EC(void) return FALSE; } -#else -NAKED -bool8 sub_810C4EC(void) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmovs r0, 0xB5\n" - "\tlsls r0, 1\n" - "\tmovs r1, 0x1\n" - "\tbl CheckBagHasItem\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0x1\n" - "\tbne _0810C516\n" - "\tldr r0, _0810C568 @ =gSaveBlock1Ptr\n" - "\tldr r0, [r0]\n" - "\tmovs r2, 0xC7\n" - "\tlsls r2, 3\n" - "\tadds r1, r0, r2\n" - "\tldrh r2, [r1]\n" - "\tldrb r0, [r1]\n" - "\tcmp r0, 0x63\n" - "\tbhi _0810C516\n" - "\tadds r0, r2, 0x1\n" - "\tstrh r0, [r1]\n" - "_0810C516:\n" - "\tldr r7, _0810C56C @ =0x00000801\n" - "\tadds r0, r7, 0\n" - "\tbl FlagGet\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0x1\n" - "\tbne _0810C570\n" - "\tldr r6, _0810C568 @ =gSaveBlock1Ptr\n" - "\tldr r0, [r6]\n" - "\tmovs r5, 0xC7\n" - "\tlsls r5, 3\n" - "\tadds r3, r0, r5\n" - "\tldrh r2, [r3]\n" - "\tlsrs r1, r2, 8\n" - "\tmovs r4, 0xFF\n" - "\tcmp r1, 0x63\n" - "\tbhi _0810C548\n" - "\tadds r1, 0x1\n" - "\tlsls r1, 24\n" - "\tmovs r0, 0xFF\n" - "\tands r0, r2\n" - "\tlsrs r1, 16\n" - "\torrs r0, r1\n" - "\tstrh r0, [r3]\n" - "_0810C548:\n" - "\tldr r0, [r6]\n" - "\tadds r0, r5\n" - "\tldrh r0, [r0]\n" - "\tlsrs r0, 8\n" - "\tands r0, r4\n" - "\tcmp r0, 0x64\n" - "\tbne _0810C570\n" - "\tadds r0, r7, 0\n" - "\tbl FlagClear\n" - "\tbl sub_810C640\n" - "\tbl sub_810D0D0\n" - "\tmovs r0, 0x1\n" - "\tb _0810C572\n" - "\t.align 2, 0\n" - "_0810C568: .4byte gSaveBlock1Ptr\n" - "_0810C56C: .4byte 0x00000801\n" - "_0810C570:\n" - "\tmovs r0, 0\n" - "_0810C572:\n" - "\tpop {r4-r7}\n" - "\tpop {r1}\n" - "\tbx r1"); -} -#endif void sub_810C578(void) { @@ -920,13 +845,17 @@ u8 CanUseVsSeeker(void) } } -// Nonmatching due to register roulette -#ifdef NONMATCHING static u8 GetVsSeekerResponseInArea(const VsSeekerData * a0) { u16 r8 = 0; u8 sp0 = 0; s32 vsSeekerIdx; + u8 *r2; +#ifndef NONMATCHING + register u32 r3 asm("r3"); + register s32 r0_ asm("r0"); + asm("":::"r10", "r8", "r6", "r4"); +#endif for (vsSeekerIdx = 0; sVsSeeker->trainerInfo[vsSeekerIdx].localId != 0xFF; vsSeekerIdx++) { @@ -936,6 +865,7 @@ static u8 GetVsSeekerResponseInArea(const VsSeekerData * a0) if (!HasTrainerBeenFought(r8)) { StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], gUnknown_8453F60); + sVsSeeker->trainerInfo[vsSeekerIdx].trainerIdx += 0; sVsSeeker->trainerHasNotYetBeenFought = 1; } else @@ -944,7 +874,15 @@ static u8 GetVsSeekerResponseInArea(const VsSeekerData * a0) if (r7 == 0) { StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerNoRematch); + #ifdef NONMATCHING sVsSeeker->trainerDoesNotWantRematch = 1; + #else + r2 = (u8 *)sVsSeeker; + r3 = 0x431; + asm("":::"r1"); + r2 = &r2[r3]; + *(r2) |= 2; + #endif } else { @@ -957,7 +895,15 @@ static u8 GetVsSeekerResponseInArea(const VsSeekerData * a0) if (rval < 30) { StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerNoRematch); + #ifdef NONMATCHING sVsSeeker->trainerDoesNotWantRematch = 1; + #else + r2 = (u8 *)sVsSeeker; + r0_ = 0x431; + asm("":::"r1"); + r2 = &r2[r0_]; + *(r2) |= 2; + #endif } else { @@ -985,242 +931,6 @@ static u8 GetVsSeekerResponseInArea(const VsSeekerData * a0) return 1; return 0; } -#else -NAKED -static u8 GetVsSeekerResponseInArea(const VsSeekerData * a0) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0x8\n" - "\tstr r0, [sp, 0x4]\n" - "\tmovs r0, 0\n" - "\tmov r8, r0\n" - "\tmov r0, sp\n" - "\tmov r1, r8\n" - "\tstrb r1, [r0]\n" - "\tmovs r2, 0\n" - "\tmov r9, r2\n" - "\tldr r4, _0810CA14 @ =sVsSeeker\n" - "\tldr r0, [r4]\n" - "\tldrb r0, [r0, 0x6]\n" - "\tcmp r0, 0xFF\n" - "\tbne _0810C9D0\n" - "\tb _0810CB2C\n" - "_0810C9D0:\n" - "\tadds r6, r4, 0\n" - "\tmovs r3, 0x86\n" - "\tlsls r3, 3\n" - "\tmov r10, r3\n" - "\tmovs r5, 0\n" - "_0810C9DA:\n" - "\tldr r0, [r6]\n" - "\tadds r0, r5\n" - "\tbl IsTrainerVisibleOnScreen\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0x1\n" - "\tbeq _0810C9EC\n" - "\tb _0810CB18\n" - "_0810C9EC:\n" - "\tldr r0, [r4]\n" - "\tadds r0, r5\n" - "\tldrh r0, [r0, 0x4]\n" - "\tmov r8, r0\n" - "\tbl HasTrainerBeenFought\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbne _0810CA20\n" - "\tldr r0, [r6]\n" - "\tadds r0, r5\n" - "\tldr r1, _0810CA18 @ =gUnknown_8453F60\n" - "\tbl StartTrainerObjectMovementScript\n" - "\tldr r2, [r6]\n" - "\tldr r0, _0810CA1C @ =0x00000431\n" - "\tadds r2, r0\n" - "\tldrb r0, [r2]\n" - "\tmovs r1, 0x1\n" - "\tb _0810CB14\n" - "\t.align 2, 0\n" - "_0810CA14: .4byte sVsSeeker\n" - "_0810CA18: .4byte gUnknown_8453F60\n" - "_0810CA1C: .4byte 0x00000431\n" - "_0810CA20:\n" - "\tldr r0, [sp, 0x4]\n" - "\tmov r1, r8\n" - "\tmov r2, sp\n" - "\tbl GetNextAvailableRematchTrainer\n" - "\tlsls r0, 24\n" - "\tlsrs r7, r0, 24\n" - "\tcmp r7, 0\n" - "\tbne _0810CA50\n" - "\tldr r0, [r6]\n" - "\tadds r0, r5\n" - "\tldr r1, _0810CA48 @ =sMovementScript_TrainerNoRematch\n" - "\tbl StartTrainerObjectMovementScript\n" - "\tldr r2, [r6]\n" - "\tldr r3, _0810CA4C @ =0x00000431\n" - "\tadds r2, r3\n" - "\tldrb r0, [r2]\n" - "\tmovs r1, 0x2\n" - "\tb _0810CB14\n" - "\t.align 2, 0\n" - "_0810CA48: .4byte sMovementScript_TrainerNoRematch\n" - "_0810CA4C: .4byte 0x00000431\n" - "_0810CA50:\n" - "\tbl Random\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tmovs r1, 0x64\n" - "\tbl __umodsi3\n" - "\tlsls r0, 16\n" - "\tlsrs r4, r0, 16\n" - "\tmov r0, r9\n" - "\tmov r1, r8\n" - "\tbl GetCurVsSeekerResponse\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0x2\n" - "\tbne _0810CA76\n" - "\tmovs r4, 0x64\n" - "\tb _0810CA7C\n" - "_0810CA76:\n" - "\tcmp r0, 0x1\n" - "\tbne _0810CA7C\n" - "\tmovs r4, 0\n" - "_0810CA7C:\n" - "\tcmp r4, 0x1D\n" - "\tbhi _0810CAA0\n" - "\tldr r0, [r6]\n" - "\tadds r0, r5\n" - "\tldr r1, _0810CA98 @ =sMovementScript_TrainerNoRematch\n" - "\tbl StartTrainerObjectMovementScript\n" - "\tldr r2, [r6]\n" - "\tldr r0, _0810CA9C @ =0x00000431\n" - "\tadds r2, r0\n" - "\tldrb r0, [r2]\n" - "\tmovs r1, 0x2\n" - "\tb _0810CB14\n" - "\t.align 2, 0\n" - "_0810CA98: .4byte sMovementScript_TrainerNoRematch\n" - "_0810CA9C: .4byte 0x00000431\n" - "_0810CAA0:\n" - "\tldr r0, _0810CB54 @ =gSaveBlock1Ptr\n" - "\tldr r1, [r0]\n" - "\tldr r0, [r6]\n" - "\tadds r0, r5\n" - "\tldr r2, _0810CB58 @ =0x0000063a\n" - "\tadds r1, r2\n" - "\tldrb r0, [r0, 0x6]\n" - "\tadds r1, r0\n" - "\tstrb r7, [r1]\n" - "\tldr r0, [r6]\n" - "\tadds r0, r5\n" - "\tldrb r1, [r0, 0x7]\n" - "\tlsls r0, r1, 3\n" - "\tadds r0, r1\n" - "\tlsls r0, 2\n" - "\tldr r1, _0810CB5C @ =gObjectEvents\n" - "\tadds r0, r1\n" - "\tbl npc_coords_shift_still\n" - "\tldr r0, [r6]\n" - "\tadds r0, r5\n" - "\tldr r1, _0810CB60 @ =gUnknown_8453F64\n" - "\tbl StartTrainerObjectMovementScript\n" - "\tldr r2, [r6]\n" - "\tmov r3, r10\n" - "\tadds r0, r2, r3\n" - "\tldrb r1, [r0]\n" - "\tlsls r1, 1\n" - "\tmovs r3, 0x80\n" - "\tlsls r3, 3\n" - "\tadds r0, r2, r3\n" - "\tadds r0, r1\n" - "\tmov r1, r8\n" - "\tstrh r1, [r0]\n" - "\tadds r2, r5\n" - "\tldrb r0, [r2, 0xC]\n" - "\tbl GetRunningBehaviorFromGraphicsId\n" - "\tldr r1, [r6]\n" - "\tmov r3, r10\n" - "\tadds r2, r1, r3\n" - "\tmovs r3, 0x84\n" - "\tlsls r3, 3\n" - "\tadds r1, r3\n" - "\tldrb r2, [r2]\n" - "\tadds r1, r2\n" - "\tstrb r0, [r1]\n" - "\tldr r1, [r6]\n" - "\tadd r1, r10\n" - "\tldrb r0, [r1]\n" - "\tadds r0, 0x1\n" - "\tstrb r0, [r1]\n" - "\tldr r2, [r6]\n" - "\tldr r0, _0810CB64 @ =0x00000431\n" - "\tadds r2, r0\n" - "\tldrb r0, [r2]\n" - "\tmovs r1, 0x4\n" - "_0810CB14:\n" - "\torrs r0, r1\n" - "\tstrb r0, [r2]\n" - "_0810CB18:\n" - "\tadds r5, 0x10\n" - "\tmovs r1, 0x1\n" - "\tadd r9, r1\n" - "\tldr r4, _0810CB68 @ =sVsSeeker\n" - "\tldr r0, [r4]\n" - "\tadds r0, r5\n" - "\tldrb r0, [r0, 0x6]\n" - "\tcmp r0, 0xFF\n" - "\tbeq _0810CB2C\n" - "\tb _0810C9DA\n" - "_0810CB2C:\n" - "\tldr r2, _0810CB68 @ =sVsSeeker\n" - "\tldr r0, [r2]\n" - "\tldr r3, _0810CB64 @ =0x00000431\n" - "\tadds r0, r3\n" - "\tldrb r1, [r0]\n" - "\tmovs r0, 0x4\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _0810CB70\n" - "\tmovs r0, 0x15\n" - "\tbl PlaySE\n" - "\tldr r0, _0810CB6C @ =0x00000801\n" - "\tbl FlagSet\n" - "\tbl sub_810C640\n" - "\tmovs r0, 0x2\n" - "\tb _0810CB7E\n" - "\t.align 2, 0\n" - "_0810CB54: .4byte gSaveBlock1Ptr\n" - "_0810CB58: .4byte 0x0000063a\n" - "_0810CB5C: .4byte gObjectEvents\n" - "_0810CB60: .4byte gUnknown_8453F64\n" - "_0810CB64: .4byte 0x00000431\n" - "_0810CB68: .4byte sVsSeeker\n" - "_0810CB6C: .4byte 0x00000801\n" - "_0810CB70:\n" - "\tmovs r0, 0x1\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbne _0810CB7C\n" - "\tmovs r0, 0\n" - "\tb _0810CB7E\n" - "_0810CB7C:\n" - "\tmovs r0, 0x1\n" - "_0810CB7E:\n" - "\tadd sp, 0x8\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r1}\n" - "\tbx r1"); -} -#endif void sub_810CB90(void) { |