summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2017-06-10 21:36:41 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2017-06-10 21:36:41 -0400
commit19c16e2f94dda9fe354692f6e449b271e845ad22 (patch)
tree1d655f92d48784d8acbf6f0eaf661ccddea1eaaf
parent40bcba1a64f2377166b419ecbabf8ac4a097b8ef (diff)
Attempt at decompiling field effect for sending out pokemon for field move
-rwxr-xr-xasm/field_effect.s402
-rwxr-xr-xinclude/field_effect.h23
-rwxr-xr-x[-rw-r--r--]include/gba/defines.h3
-rwxr-xr-xsrc/field_effect.c280
4 files changed, 306 insertions, 402 deletions
diff --git a/asm/field_effect.s b/asm/field_effect.s
index d0ea81b82..9f8f50afc 100755
--- a/asm/field_effect.s
+++ b/asm/field_effect.s
@@ -6,408 +6,6 @@
.text
- thumb_func_start sub_8088120
-sub_8088120: @ 8088120
- push {lr}
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- ldr r3, _08088148 @ =gUnknown_0839F3AC
- ldr r2, _0808814C @ =gTasks
- lsls r0, r1, 2
- adds r0, r1
- lsls r0, 3
- adds r0, r2
- movs r2, 0x8
- ldrsh r1, [r0, r2]
- lsls r1, 2
- adds r1, r3
- ldr r1, [r1]
- bl _call_via_r1
- pop {r0}
- bx r0
- .align 2, 0
-_08088148: .4byte gUnknown_0839F3AC
-_0808814C: .4byte gTasks
- thumb_func_end sub_8088120
-
- thumb_func_start sub_8088150
-sub_8088150: @ 8088150
- push {r4-r6,lr}
- adds r4, r0, 0
- ldr r6, _080881A0 @ =REG_WININ
- ldrh r0, [r6]
- strh r0, [r4, 0x1E]
- ldr r5, _080881A4 @ =REG_WINOUT
- ldrh r0, [r5]
- strh r0, [r4, 0x20]
- adds r0, r4, 0
- adds r0, 0x22
- ldr r1, _080881A8 @ =gMain
- ldr r1, [r1, 0xC]
- bl StoreWordInTwoHalfwords
- ldr r1, _080881AC @ =0x0000f0f1
- strh r1, [r4, 0xA]
- ldr r0, _080881B0 @ =0x00005051
- strh r0, [r4, 0xC]
- movs r0, 0x3F
- strh r0, [r4, 0xE]
- movs r0, 0x3E
- strh r0, [r4, 0x10]
- ldr r0, _080881B4 @ =REG_WIN0H
- strh r1, [r0]
- ldr r1, _080881B8 @ =REG_WIN0V
- ldrh r0, [r4, 0xC]
- strh r0, [r1]
- ldrh r0, [r4, 0xE]
- strh r0, [r6]
- ldrh r0, [r4, 0x10]
- strh r0, [r5]
- ldr r0, _080881BC @ =sub_80883DC
- bl SetVBlankCallback
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_080881A0: .4byte REG_WININ
-_080881A4: .4byte REG_WINOUT
-_080881A8: .4byte gMain
-_080881AC: .4byte 0x0000f0f1
-_080881B0: .4byte 0x00005051
-_080881B4: .4byte REG_WIN0H
-_080881B8: .4byte REG_WIN0V
-_080881BC: .4byte sub_80883DC
- thumb_func_end sub_8088150
-
- thumb_func_start sub_80881C0
-sub_80881C0: @ 80881C0
- push {r4-r6,lr}
- sub sp, 0x4
- adds r6, r0, 0
- ldr r0, _08088218 @ =REG_BG0CNT
- ldrh r1, [r0]
- lsrs r1, 2
- lsls r1, 30
- lsrs r1, 16
- ldrh r4, [r0]
- lsrs r4, 8
- lsls r4, 27
- lsrs r4, 16
- ldr r0, _0808821C @ =gFieldMoveStreaksTiles
- movs r5, 0xC0
- lsls r5, 19
- adds r1, r5
- movs r2, 0x80
- lsls r2, 1
- bl CpuSet
- movs r0, 0
- str r0, [sp]
- adds r5, r4, r5
- ldr r2, _08088220 @ =0x05000200
- mov r0, sp
- adds r1, r5, 0
- bl CpuSet
- ldr r0, _08088224 @ =gFieldMoveStreaksPalette
- movs r1, 0xF0
- movs r2, 0x20
- bl LoadPalette
- adds r0, r4, 0
- bl sub_808843C
- ldrh r0, [r6, 0x8]
- adds r0, 0x1
- strh r0, [r6, 0x8]
- add sp, 0x4
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_08088218: .4byte REG_BG0CNT
-_0808821C: .4byte gFieldMoveStreaksTiles
-_08088220: .4byte 0x05000200
-_08088224: .4byte gFieldMoveStreaksPalette
- thumb_func_end sub_80881C0
-
- thumb_func_start sub_8088228
-sub_8088228: @ 8088228
- push {r4-r7,lr}
- adds r3, r0, 0
- ldrh r0, [r3, 0x12]
- subs r0, 0x10
- strh r0, [r3, 0x12]
- ldrh r6, [r3, 0xA]
- ldrh r2, [r3, 0xC]
- movs r7, 0xFF
- lsrs r1, r6, 8
- subs r1, 0x10
- lsls r1, 16
- lsrs r0, r2, 8
- subs r0, 0x2
- lsls r0, 16
- lsrs r4, r0, 16
- adds r0, r7, 0
- ands r0, r2
- adds r5, r0, 0x2
- lsrs r2, r1, 16
- cmp r1, 0
- bge _08088254
- movs r2, 0
-_08088254:
- lsls r0, r4, 16
- asrs r0, 16
- cmp r0, 0x27
- bgt _0808825E
- movs r4, 0x28
-_0808825E:
- cmp r5, 0x78
- ble _08088264
- movs r5, 0x78
-_08088264:
- lsls r2, 16
- asrs r2, 16
- lsls r1, r2, 8
- adds r0, r7, 0
- ands r0, r6
- orrs r1, r0
- strh r1, [r3, 0xA]
- lsls r0, r4, 16
- asrs r4, r0, 16
- lsls r0, r4, 8
- adds r1, r5, 0
- orrs r0, r1
- strh r0, [r3, 0xC]
- cmp r2, 0
- bne _080882A4
- cmp r4, 0x28
- bne _080882A4
- cmp r1, 0x78
- bne _080882A4
- ldr r2, _080882AC @ =gSprites
- movs r0, 0x26
- ldrsh r1, [r3, r0]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r2, 0x1C
- adds r0, r2
- ldr r1, _080882B0 @ =sub_8088890
- str r1, [r0]
- ldrh r0, [r3, 0x8]
- adds r0, 0x1
- strh r0, [r3, 0x8]
-_080882A4:
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_080882AC: .4byte gSprites
-_080882B0: .4byte sub_8088890
- thumb_func_end sub_8088228
-
- thumb_func_start sub_80882B4
-sub_80882B4: @ 80882B4
- push {lr}
- adds r3, r0, 0
- ldrh r0, [r3, 0x12]
- subs r0, 0x10
- strh r0, [r3, 0x12]
- ldr r2, _080882E0 @ =gSprites
- movs r0, 0x26
- ldrsh r1, [r3, r0]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r0, r2
- movs r1, 0x3C
- ldrsh r0, [r0, r1]
- cmp r0, 0
- beq _080882DA
- ldrh r0, [r3, 0x8]
- adds r0, 0x1
- strh r0, [r3, 0x8]
-_080882DA:
- pop {r0}
- bx r0
- .align 2, 0
-_080882E0: .4byte gSprites
- thumb_func_end sub_80882B4
-
- thumb_func_start sub_80882E4
-sub_80882E4: @ 80882E4
- push {r4,lr}
- adds r3, r0, 0
- ldrh r0, [r3, 0x12]
- subs r0, 0x10
- strh r0, [r3, 0x12]
- ldrh r2, [r3, 0xC]
- lsls r1, r2, 16
- movs r0, 0xFF
- asrs r1, 24
- adds r1, 0x6
- lsls r1, 16
- ands r0, r2
- subs r0, 0x6
- lsls r0, 16
- lsrs r2, r0, 16
- lsrs r4, r1, 16
- asrs r1, 16
- cmp r1, 0x50
- ble _0808830C
- movs r4, 0x50
-_0808830C:
- lsls r0, r2, 16
- asrs r0, 16
- cmp r0, 0x50
- bgt _08088316
- movs r2, 0x51
-_08088316:
- lsls r0, r4, 16
- asrs r0, 16
- lsls r1, r0, 8
- lsls r2, 16
- asrs r2, 16
- orrs r1, r2
- strh r1, [r3, 0xC]
- cmp r0, 0x50
- bne _08088332
- cmp r2, 0x51
- bne _08088332
- ldrh r0, [r3, 0x8]
- adds r0, 0x1
- strh r0, [r3, 0x8]
-_08088332:
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_80882E4
-
- thumb_func_start sub_8088338
-sub_8088338: @ 8088338
- push {r4,lr}
- sub sp, 0x4
- adds r4, r0, 0
- ldr r0, _08088378 @ =REG_BG0CNT
- ldrh r1, [r0]
- lsrs r1, 8
- lsls r1, 27
- lsrs r1, 16
- movs r0, 0
- str r0, [sp]
- movs r0, 0xC0
- lsls r0, 19
- adds r1, r0
- ldr r2, _0808837C @ =0x05000200
- mov r0, sp
- bl CpuSet
- movs r0, 0xF1
- strh r0, [r4, 0xA]
- movs r0, 0xA1
- strh r0, [r4, 0xC]
- ldrh r0, [r4, 0x1E]
- strh r0, [r4, 0xE]
- ldrh r0, [r4, 0x20]
- strh r0, [r4, 0x10]
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
- add sp, 0x4
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08088378: .4byte REG_BG0CNT
-_0808837C: .4byte 0x05000200
- thumb_func_end sub_8088338
-
- thumb_func_start sub_8088380
-sub_8088380: @ 8088380
- push {r4,r5,lr}
- sub sp, 0x4
- adds r5, r0, 0
- adds r0, 0x22
- mov r1, sp
- bl LoadWordFromTwoHalfwords
- ldr r0, [sp]
- bl SetVBlankCallback
- ldr r4, _080883D0 @ =gWindowConfig_81E6CE4
- adds r0, r4, 0
- bl SetUpWindowConfig
- adds r0, r4, 0
- bl InitMenuWindow
- movs r0, 0x26
- ldrsh r1, [r5, r0]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- ldr r1, _080883D4 @ =gSprites
- adds r0, r1
- bl FreeResourcesAndDestroySprite
- movs r0, 0x6
- bl FieldEffectActiveListRemove
- ldr r0, _080883D8 @ =sub_8088120
- bl FindTaskIdByFunc
- lsls r0, 24
- lsrs r0, 24
- bl DestroyTask
- add sp, 0x4
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080883D0: .4byte gWindowConfig_81E6CE4
-_080883D4: .4byte gSprites
-_080883D8: .4byte sub_8088120
- thumb_func_end sub_8088380
-
- thumb_func_start sub_80883DC
-sub_80883DC: @ 80883DC
- push {r4,lr}
- sub sp, 0x4
- ldr r0, _08088430 @ =sub_8088120
- bl FindTaskIdByFunc
- lsls r0, 24
- lsrs r0, 24
- lsls r4, r0, 2
- adds r4, r0
- lsls r4, 3
- ldr r0, _08088434 @ =gTasks
- adds r4, r0
- adds r0, r4, 0
- adds r0, 0x22
- mov r1, sp
- bl LoadWordFromTwoHalfwords
- ldr r0, [sp]
- bl _call_via_r0
- ldr r1, _08088438 @ =REG_WIN0H
- ldrh r0, [r4, 0xA]
- strh r0, [r1]
- adds r1, 0x4
- ldrh r0, [r4, 0xC]
- strh r0, [r1]
- adds r1, 0x4
- ldrh r0, [r4, 0xE]
- strh r0, [r1]
- adds r1, 0x2
- ldrh r0, [r4, 0x10]
- strh r0, [r1]
- subs r1, 0x3A
- ldrh r0, [r4, 0x12]
- strh r0, [r1]
- adds r1, 0x2
- ldrh r0, [r4, 0x14]
- strh r0, [r1]
- add sp, 0x4
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08088430: .4byte sub_8088120
-_08088434: .4byte gTasks
-_08088438: .4byte REG_WIN0H
- thumb_func_end sub_80883DC
-
thumb_func_start sub_808843C
sub_808843C: @ 808843C
push {r4,r5,lr}
diff --git a/include/field_effect.h b/include/field_effect.h
index d35ca599b..6306b81ac 100755
--- a/include/field_effect.h
+++ b/include/field_effect.h
@@ -106,4 +106,27 @@ void FieldEffectActiveListRemove(u8 id);
bool8 FieldEffectActiveListContains(u8 id);
void sub_807DE38(u8 index);
+void SpriteCB_PokeballGlow(struct Sprite *);
+void SpriteCB_PokecenterMonitor(struct Sprite *);
+void SpriteCB_HallOfFameMonitor(struct Sprite *);
+
+void PokecenterHealEffect_0(struct Task *);
+void PokecenterHealEffect_1(struct Task *);
+void PokecenterHealEffect_2(struct Task *);
+void PokecenterHealEffect_3(struct Task *);
+
+void HallOfFameRecordEffect_0(struct Task *);
+void HallOfFameRecordEffect_1(struct Task *);
+void HallOfFameRecordEffect_2(struct Task *);
+void HallOfFameRecordEffect_3(struct Task *);
+
+void PokeballGlowEffect_0(struct Sprite *);
+void PokeballGlowEffect_1(struct Sprite *);
+void PokeballGlowEffect_2(struct Sprite *);
+void PokeballGlowEffect_3(struct Sprite *);
+void PokeballGlowEffect_4(struct Sprite *);
+void PokeballGlowEffect_5(struct Sprite *);
+void PokeballGlowEffect_6(struct Sprite *);
+void PokeballGlowEffect_7(struct Sprite *);
+
#endif // GUARD_FIELD_EFFECT_H
diff --git a/include/gba/defines.h b/include/gba/defines.h
index 0f7f06755..e88d2da8b 100644..100755
--- a/include/gba/defines.h
+++ b/include/gba/defines.h
@@ -58,4 +58,7 @@
#define WIN_RANGE(a, b) (((a) << 8) | (b))
+#define min(a, b) (a >= b ? a : b)
+#define max(a, b) (a <= b ? a : b)
+
#endif // GUARD_GBA_DEFINES
diff --git a/src/field_effect.c b/src/field_effect.c
index 3a56dfdcb..5719245e5 100755
--- a/src/field_effect.c
+++ b/src/field_effect.c
@@ -7,6 +7,7 @@
#include "field_weather.h"
#include "decompress.h"
#include "sprite.h"
+#include "menu.h"
#include "palette.h"
#include "text.h"
#include "rom4.h"
@@ -2012,6 +2013,13 @@ void sub_8087FDC(struct Task *task)
void sub_8088120(u8);
void sub_808847C(u8);
u8 sub_8088830(u32, u32, u32);
+extern const void (*gUnknown_0839F3AC[7])(struct Task *);
+extern const void (*gUnknown_0839F3C8[7])(struct Task *);
+extern const u32 gFieldMoveStreaksTiles[];
+extern const u16 gFieldMoveStreaksPalette[16];
+void sub_80883DC(void);
+void sub_808843C(u16);
+void sub_8088890(struct Sprite *);
bool8 FldEff_FieldMoveShowMon(void)
{
@@ -2040,3 +2048,275 @@ bool8 FldEff_FieldMoveShowMonInit(void)
FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
return FALSE;
}
+
+void sub_8088120(u8 taskId)
+{
+ gUnknown_0839F3AC[gTasks[taskId].data[0]](&gTasks[taskId]);
+}
+
+void sub_8088150(struct Task *task)
+{
+ task->data[11] = REG_WININ;
+ task->data[12] = REG_WINOUT;
+ StoreWordInTwoHalfwords(&task->data[13], (u32)gMain.vblankCallback);
+ task->data[1] = 0xf0f1;
+ task->data[2] = 0x5051;
+ task->data[3] = 0x3f;
+ task->data[4] = 0x3e;
+ REG_WIN0H = task->data[1];
+ REG_WIN0V = task->data[2];
+ REG_WININ = task->data[3];
+ REG_WINOUT = task->data[4];
+ SetVBlankCallback(sub_80883DC);
+ task->data[0]++;
+}
+
+void sub_80881C0(struct Task *task)
+{
+ u32 zero;
+ u16 offset;
+ u16 delta;
+ offset = ((REG_BG0CNT >> 2) << 14);
+ delta = ((REG_BG0CNT >> 8) << 11);
+ CpuSet(gFieldMoveStreaksTiles, (void *)(VRAM + offset), 0x100);
+ zero = 0;
+ CpuSet(&zero, (void *)(VRAM + delta), 0x5000200);
+ LoadPalette(gFieldMoveStreaksPalette, 0xf0, 0x20);
+ sub_808843C(delta);
+ task->data[0]++;
+}
+
+#ifdef NONMATCHING
+void sub_8088228(struct Task *task)
+{
+ s16 v0;
+ s16 v2;
+ s16 v3;
+ task->data[5] -= 16;
+ // The order in which registers are loaded is incorrect.
+ v0 = ((u16)task->data[1] >> 8) - 0x10;
+ v2 = ((u16)task->data[2] >> 8) - 2;
+ v3 = ((u16)task->data[2] & 0xff) + 2;
+ if (v0 < 0)
+ {
+ v0 = 0;
+ }
+ if (v2 < 0x28)
+ {
+ v2 = 0x28;
+ }
+ if (v3 > 0x78)
+ {
+ v3 = 0x78;
+ }
+ task->data[1] = (v0 << 8) | (task->data[1] & 0xff);
+ task->data[2] = (v2 << 8) | v3;
+ if (v0 == 0 && v2 == 0x28 && v3 == 0x78)
+ {
+ gSprites[task->data[15]].callback = sub_8088890;
+ task->data[0]++;
+ }
+}
+#else
+__attribute__((naked))
+void sub_8088228(struct Task *task)
+{
+ asm_unified("\tpush {r4-r7,lr}\n"
+ "\tadds r3, r0, 0\n"
+ "\tldrh r0, [r3, 0x12]\n"
+ "\tsubs r0, 0x10\n"
+ "\tstrh r0, [r3, 0x12]\n"
+ "\tldrh r6, [r3, 0xA]\n"
+ "\tldrh r2, [r3, 0xC]\n"
+ "\tmovs r7, 0xFF\n"
+ "\tlsrs r1, r6, 8\n"
+ "\tsubs r1, 0x10\n"
+ "\tlsls r1, 16\n"
+ "\tlsrs r0, r2, 8\n"
+ "\tsubs r0, 0x2\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r4, r0, 16\n"
+ "\tadds r0, r7, 0\n"
+ "\tands r0, r2\n"
+ "\tadds r5, r0, 0x2\n"
+ "\tlsrs r2, r1, 16\n"
+ "\tcmp r1, 0\n"
+ "\tbge _08088254\n"
+ "\tmovs r2, 0\n"
+ "_08088254:\n"
+ "\tlsls r0, r4, 16\n"
+ "\tasrs r0, 16\n"
+ "\tcmp r0, 0x27\n"
+ "\tbgt _0808825E\n"
+ "\tmovs r4, 0x28\n"
+ "_0808825E:\n"
+ "\tcmp r5, 0x78\n"
+ "\tble _08088264\n"
+ "\tmovs r5, 0x78\n"
+ "_08088264:\n"
+ "\tlsls r2, 16\n"
+ "\tasrs r2, 16\n"
+ "\tlsls r1, r2, 8\n"
+ "\tadds r0, r7, 0\n"
+ "\tands r0, r6\n"
+ "\torrs r1, r0\n"
+ "\tstrh r1, [r3, 0xA]\n"
+ "\tlsls r0, r4, 16\n"
+ "\tasrs r4, r0, 16\n"
+ "\tlsls r0, r4, 8\n"
+ "\tadds r1, r5, 0\n"
+ "\torrs r0, r1\n"
+ "\tstrh r0, [r3, 0xC]\n"
+ "\tcmp r2, 0\n"
+ "\tbne _080882A4\n"
+ "\tcmp r4, 0x28\n"
+ "\tbne _080882A4\n"
+ "\tcmp r1, 0x78\n"
+ "\tbne _080882A4\n"
+ "\tldr r2, _080882AC @ =gSprites\n"
+ "\tmovs r0, 0x26\n"
+ "\tldrsh r1, [r3, r0]\n"
+ "\tlsls r0, r1, 4\n"
+ "\tadds r0, r1\n"
+ "\tlsls r0, 2\n"
+ "\tadds r2, 0x1C\n"
+ "\tadds r0, r2\n"
+ "\tldr r1, _080882B0 @ =sub_8088890\n"
+ "\tstr r1, [r0]\n"
+ "\tldrh r0, [r3, 0x8]\n"
+ "\tadds r0, 0x1\n"
+ "\tstrh r0, [r3, 0x8]\n"
+ "_080882A4:\n"
+ "\tpop {r4-r7}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.align 2, 0\n"
+ "_080882AC: .4byte gSprites\n"
+ "_080882B0: .4byte sub_8088890");
+}
+#endif
+
+void sub_80882B4(struct Task *task)
+{
+ task->data[5] -= 0x10;
+ if (gSprites[task->data[15]].data7)
+ {
+ task->data[0]++;
+ }
+}
+
+#ifdef NONMATCHING
+void sub_80882E4(struct Task *task)
+{
+ s16 v2;
+ s16 v3;
+ task->data[5] -= 0x10;
+ // The order in which registers are loaded is incorrect.
+ v2 = (task->data[2] >> 8) + 6;
+ v3 = (task->data[2] & 0xff) - 6;
+ if (v2 > 0x50)
+ {
+ v2 = 0x50;
+ }
+ if (v3 < 0x51)
+ {
+ v3 = 0x51;
+ }
+ task->data[2] = (v2 << 8) | v3;
+ if (v2 == 0x50 && v3 == 0x51)
+ {
+ task->data[0]++;
+ }
+}
+#else
+__attribute__((naked))
+void sub_80882E4(struct Task *task)
+{
+ asm_unified("\tpush {r4,lr}\n"
+ "\tadds r3, r0, 0\n"
+ "\tldrh r0, [r3, 0x12]\n"
+ "\tsubs r0, 0x10\n"
+ "\tstrh r0, [r3, 0x12]\n"
+ "\tldrh r2, [r3, 0xC]\n"
+ "\tlsls r1, r2, 16\n"
+ "\tmovs r0, 0xFF\n"
+ "\tasrs r1, 24\n"
+ "\tadds r1, 0x6\n"
+ "\tlsls r1, 16\n"
+ "\tands r0, r2\n"
+ "\tsubs r0, 0x6\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r2, r0, 16\n"
+ "\tlsrs r4, r1, 16\n"
+ "\tasrs r1, 16\n"
+ "\tcmp r1, 0x50\n"
+ "\tble _0808830C\n"
+ "\tmovs r4, 0x50\n"
+ "_0808830C:\n"
+ "\tlsls r0, r2, 16\n"
+ "\tasrs r0, 16\n"
+ "\tcmp r0, 0x50\n"
+ "\tbgt _08088316\n"
+ "\tmovs r2, 0x51\n"
+ "_08088316:\n"
+ "\tlsls r0, r4, 16\n"
+ "\tasrs r0, 16\n"
+ "\tlsls r1, r0, 8\n"
+ "\tlsls r2, 16\n"
+ "\tasrs r2, 16\n"
+ "\torrs r1, r2\n"
+ "\tstrh r1, [r3, 0xC]\n"
+ "\tcmp r0, 0x50\n"
+ "\tbne _08088332\n"
+ "\tcmp r2, 0x51\n"
+ "\tbne _08088332\n"
+ "\tldrh r0, [r3, 0x8]\n"
+ "\tadds r0, 0x1\n"
+ "\tstrh r0, [r3, 0x8]\n"
+ "_08088332:\n"
+ "\tpop {r4}\n"
+ "\tpop {r0}\n"
+ "\tbx r0");
+}
+#endif
+
+void sub_8088338(struct Task *task)
+{
+ u32 zero;
+ u16 bg0cnt;
+ bg0cnt = (REG_BG0CNT >> 8) << 11;
+ zero = 0;
+ CpuSet(&zero, (void *)VRAM + bg0cnt, 0x5000200);
+ task->data[1] = 0xf1;
+ task->data[2] = 0xa1;
+ task->data[3] = task->data[11];
+ task->data[4] = task->data[12];
+ task->data[0]++;
+}
+
+void sub_8088380(struct Task *task)
+{
+ IntrCallback callback;
+ LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&callback);
+ SetVBlankCallback(callback);
+ SetUpWindowConfig(&gWindowConfig_81E6CE4);
+ InitMenuWindow(&gWindowConfig_81E6CE4);
+ FreeResourcesAndDestroySprite(&gSprites[task->data[15]]);
+ FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON);
+ DestroyTask(FindTaskIdByFunc(sub_8088120));
+}
+
+void sub_80883DC(void)
+{
+ struct Task *task;
+ IntrCallback callback;
+ task = &gTasks[FindTaskIdByFunc(sub_8088120)];
+ LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&callback);
+ callback();
+ REG_WIN0H = task->data[1];
+ REG_WIN0V = task->data[2];
+ REG_WININ = task->data[3];
+ REG_WINOUT = task->data[4];
+ REG_BG0HOFS = task->data[5];
+ REG_BG0VOFS = task->data[6];
+}