summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Huderle <huderlem@gmail.com>2018-10-21 17:03:33 -0500
committerMarcus Huderle <huderlem@gmail.com>2018-10-21 17:03:33 -0500
commitd943da35b4907748b89e281571dda91fd8dedb8f (patch)
tree4aaded84005c3a7d71cf80952c963f64f9fece81
parentba5df32ca23fe022a0e5db530e0f4d87d15508bf (diff)
Decompile some more functions up to AgbMain
-rwxr-xr-xMakefile3
-rwxr-xr-xasm/rom_9BC.s (renamed from asm/rom_24C.s)180
-rwxr-xr-xinclude/main.h9
-rwxr-xr-xld_script.txt4
-rwxr-xr-xsrc/main.c311
-rwxr-xr-xsrc/rom_850.c67
-rwxr-xr-xsrc/titlescreen.c38
-rwxr-xr-xsrc/util.c299
-rwxr-xr-xsym_bss.txt5
-rwxr-xr-xsym_ewram.txt31
10 files changed, 467 insertions, 480 deletions
diff --git a/Makefile b/Makefile
index c8ff4c8..a871d2f 100755
--- a/Makefile
+++ b/Makefile
@@ -101,6 +101,9 @@ include graphics_rules.mk
%.lz: % ; $(GFX) $< $@
%.rl: % ; $(GFX) $< $@
+
+$(C_BUILDDIR)/rom_850.o: CC1 := tools/agbcc/bin/old_agbcc
+
$(C_BUILDDIR)/libc.o: CC1 := tools/agbcc/bin/old_agbcc
$(C_BUILDDIR)/libc.o: CFLAGS := -O2
diff --git a/asm/rom_24C.s b/asm/rom_9BC.s
index 258919a..0249356 100755
--- a/asm/rom_24C.s
+++ b/asm/rom_9BC.s
@@ -4,186 +4,6 @@
.text
- thumb_func_start sub_850
-sub_850: @ 0x08000850
- ldr r0, _08000888 @ =0x04000208
- ldrh r1, [r0]
- movs r2, #1
- adds r0, r2, #0
- ands r0, r1
- cmp r0, #0
- beq _08000894
- ldr r0, _0800088C @ =0x04000004
- ldrh r1, [r0]
- movs r0, #8
- ands r0, r1
- cmp r0, #0
- beq _08000894
- ldr r0, _08000890 @ =0x04000200
- ldrh r1, [r0]
- adds r0, r2, #0
- ands r0, r1
- cmp r0, #0
- beq _08000894
- movs r0, #0x80
- lsls r0, r0, #0x13
- ldrh r1, [r0]
- movs r0, #0x80
- ands r0, r1
- cmp r0, #0
- bne _08000894
- movs r0, #1
- b _08000896
- .align 2, 0
-_08000888: .4byte 0x04000208
-_0800088C: .4byte 0x04000004
-_08000890: .4byte 0x04000200
-_08000894:
- movs r0, #0
-_08000896:
- bx lr
-
- thumb_func_start sub_898
-sub_898: @ 0x08000898
- push {r4, lr}
- adds r4, r0, #0
- ldr r0, _080008B4 @ =0x02017BD4
- str r4, [r0]
- bl sub_850
- lsls r0, r0, #0x10
- cmp r0, #0
- bne _080008AE
- ldr r0, _080008B8 @ =0x0200FB9C
- str r4, [r0]
-_080008AE:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080008B4: .4byte 0x02017BD4
-_080008B8: .4byte 0x0200FB9C
-
- thumb_func_start sub_8BC
-sub_8BC: @ 0x080008BC
- ldr r0, _080008C8 @ =0x0200FB9C
- ldr r1, _080008CC @ =sub_DC4 + 1
- str r1, [r0]
- ldr r0, _080008D0 @ =0x02017BD4
- str r1, [r0]
- bx lr
- .align 2, 0
-_080008C8: .4byte 0x0200FB9C
-_080008CC: .4byte sub_DC4 + 1
-_080008D0: .4byte 0x02017BD4
-
- thumb_func_start sub_8D4
-sub_8D4: @ 0x080008D4
- push {r4, lr}
- adds r4, r0, #0
- ldr r0, _080008F4 @ =0x02017BD0
- str r4, [r0]
- bl sub_850
- lsls r0, r0, #0x10
- cmp r0, #0
- bne _080008EC
- ldr r0, _080008F8 @ =0x0200FB98
- ldr r0, [r0]
- str r4, [r0]
-_080008EC:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080008F4: .4byte 0x02017BD0
-_080008F8: .4byte 0x0200FB98
-
- thumb_func_start sub_8FC
-sub_8FC: @ 0x080008FC
- ldr r0, _0800090C @ =0x0200FB98
- ldr r0, [r0]
- ldr r1, _08000910 @ =sub_A08 + 1
- str r1, [r0]
- ldr r0, _08000914 @ =0x02017BD0
- str r1, [r0]
- bx lr
- .align 2, 0
-_0800090C: .4byte 0x0200FB98
-_08000910: .4byte sub_A08 + 1
-_08000914: .4byte 0x02017BD0
-
- thumb_func_start sub_918
-sub_918: @ 0x08000918
- push {r4, lr}
- adds r4, r0, #0
- ldr r0, _08000938 @ =0x0200FBA0
- str r4, [r0]
- bl sub_850
- lsls r0, r0, #0x10
- cmp r0, #0
- bne _08000930
- ldr r0, _0800093C @ =0x02019BE0
- ldr r0, [r0]
- str r4, [r0]
-_08000930:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08000938: .4byte 0x0200FBA0
-_0800093C: .4byte 0x02019BE0
-
- thumb_func_start sub_940
-sub_940: @ 0x08000940
- ldr r0, _08000950 @ =0x02019BE0
- ldr r0, [r0]
- ldr r1, _08000954 @ =sub_A20 + 1
- str r1, [r0]
- ldr r0, _08000958 @ =0x0200FBA0
- str r1, [r0]
- bx lr
- .align 2, 0
-_08000950: .4byte 0x02019BE0
-_08000954: .4byte sub_A20 + 1
-_08000958: .4byte 0x0200FBA0
-
- thumb_func_start AgbMain
-AgbMain: @ 0x0800095C
- push {r4, r5, lr}
- movs r0, #0xff
- bl RegisterRamReset
- bl sub_BBC
- ldr r1, _080009A0 @ =0x040000D4
- ldr r0, _080009A4 @ =IntrMain
- str r0, [r1]
- ldr r2, _080009A8 @ =0x03005400
- str r2, [r1, #4]
- ldr r0, _080009AC @ =0x84000200
- str r0, [r1, #8]
- ldr r0, [r1, #8]
- ldr r0, _080009B0 @ =0x03007FFC
- str r2, [r0]
- bl sub_B54
- bl sub_FE8
- ldr r5, _080009B4 @ =gMainFuncs
- ldr r4, _080009B8 @ =gMain
-_08000988:
- bl ReadKeys
- ldrb r0, [r4, #2]
- lsls r0, r0, #2
- adds r0, r0, r5
- ldr r0, [r0]
- bl _call_via_r0
- bl sub_D74
- b _08000988
- .align 2, 0
-_080009A0: .4byte 0x040000D4
-_080009A4: .4byte IntrMain
-_080009A8: .4byte 0x03005400
-_080009AC: .4byte 0x84000200
-_080009B0: .4byte 0x03007FFC
-_080009B4: .4byte gMainFuncs
-_080009B8: .4byte gMain
-
thumb_func_start sub_9BC_Main
sub_9BC_Main: @ 0x080009BC
push {r4, lr}
diff --git a/include/main.h b/include/main.h
index 1e47a6a..403641a 100755
--- a/include/main.h
+++ b/include/main.h
@@ -23,15 +23,15 @@ struct SpriteSet
struct OamDataSimple
{
u16 oamId;
- u16 xOffset;
- u16 yOffset;
+ s16 xOffset;
+ s16 yOffset;
};
struct SpriteGroup
{
u16 available;
- u16 baseX;
- u16 baseY;
+ s16 baseX;
+ s16 baseY;
struct OamDataSimple oam[MAX_SPRITES_IN_GROUP];
};
// size: 0xB8
@@ -84,5 +84,6 @@ void sub_490(void);
void sub_518(void);
void sub_578(void);
void sub_D74(void);
+s16 LoadSpriteSets(const struct SpriteSet* const*, u16, struct SpriteGroup*);
#endif // GUARD_MAIN_H
diff --git a/ld_script.txt b/ld_script.txt
index 0d13add..1f1d401 100755
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -27,8 +27,10 @@ SECTIONS
.text :
{
asm/start.o(.text);
+ src/util.o(.text);
+ src/rom_850.o(.text);
src/main.o(.text);
- asm/rom_24C.o(.text);
+ asm/rom_9BC.o(.text);
asm/rom_25A4.o(.text);
asm/rom_2C58.o(.text);
asm/pokedex.o(.text);
diff --git a/src/main.c b/src/main.c
index e311b6f..230f9ff 100755
--- a/src/main.c
+++ b/src/main.c
@@ -1,299 +1,26 @@
#include "global.h"
#include "main.h"
-extern const struct OamData gEmptyOamData[128];
-extern int sub_55A24(u8*); // Rumble Pak?
-
-static u8 *sub_734(u32, u8*, u32);
-static int sub_780(int, int);
-
-void SetMainGameState(u16 mainState)
-{
- gMain.mainState = mainState;
- gMain.subState = 0;
-}
-
-void sub_24C(void)
-{
- u16 i;
-
- REG_BLDCNT = 0;
- REG_BLDY = 0x10;
- REG_BLDCNT = ((REG_DISPCNT & (DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON)) >> 8)
- | BLDCNT_EFFECT_LIGHTEN
- | BLDCNT_TGT1_BD;
- REG_DISPCNT &= ~DISPCNT_FORCED_BLANK;
- gMain.unk16 = REG_DISPCNT;
-
- for (i = 0; i < 32; i++)
- {
- REG_BLDY = 15 - i / 2;
- sub_D74();
- }
-
- REG_BLDCNT = 0;
-}
-
-void sub_2B4(void)
-{
- u16 i;
-
- REG_BLDCNT = 0;
- REG_BLDY = 0;
- REG_BLDCNT = ((REG_DISPCNT & (DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON)) >> 8)
- | BLDCNT_EFFECT_LIGHTEN
- | BLDCNT_TGT1_BD;
-
- for (i = 0; i < 16; i++)
- {
- REG_BLDY = i + 1;
- sub_D74();
- }
-
- gMain.unk16 |= DISPCNT_FORCED_BLANK;
- REG_DISPCNT |= DISPCNT_FORCED_BLANK;
- DmaFill16(3, 0, (void *)BG_VRAM, 0x18000);
- REG_BG0HOFS = 0;
- REG_BG0VOFS = 0;
- REG_BG1HOFS = 0;
- REG_BG1VOFS = 0;
- REG_BG2HOFS = 0;
- REG_BG2VOFS = 0;
- REG_BG3HOFS = 0;
- REG_BG3VOFS = 0;
- REG_BLDCNT = 0;
- REG_BLDY = 0;
-}
-
-s16 LoadSpriteSets(const struct SpriteSet **spriteSets, u16 numSpriteSets, struct SpriteGroup *spriteGroups)
-{
- u16 i, j;
- struct SpriteGroup *spriteGroup;
- struct OamDataSimple *oamSimple;
- u16 *oamData = (u16 *)(&gOamBuffer[0]);
- u16 loadedCount = 0;
-
- DmaCopy16(3, gEmptyOamData, oamData, sizeof(gEmptyOamData));
- for (i = 0; i < numSpriteSets; i++)
- {
- spriteGroup = &spriteGroups[i];
- if (spriteGroup->available)
- {
- u16 curSpriteSetCount = spriteSets[i]->count;
- DmaCopy16(3, spriteSets[i]->oamData, &gOamBuffer[loadedCount], curSpriteSetCount * sizeof(struct OamData));
- for (j = 0; j < curSpriteSetCount; j++)
- {
- oamData = (u16 *)(&gOamBuffer[loadedCount]);
- oamSimple = &spriteGroup->oam[j];
- oamSimple->oamId = loadedCount++;
- oamSimple->xOffset = oamData[1] & 0x1FF;
- oamSimple->yOffset = oamData[0] & 0xFF;
- }
- }
- }
-
- return loadedCount;
-}
-
-void sub_438(void)
-{
- gMain.unk16 |= DISPCNT_FORCED_BLANK;
- REG_DISPCNT |= DISPCNT_FORCED_BLANK;
- sub_490();
- sub_518();
- sub_578();
- gMain.unkF = 0;
- gMain.unk10 = 0;
- gMain.unk50 = 0;
- gMain.unk11 = 0;
- gMain.unk12 = 0;
- gMain.unk14 = 0;
- gMain.unk26 = 0x90;
- gMain.unk28 = 0;
- gMain.unk2A = 0;
- gMain.unk36 = 0;
- gMain.unk38 = 0;
- gMain.unk3A = 0;
- gMain.unk3C = 0;
- gMain.unk2C = 0;
-}
-
-void sub_490(void)
-{
- DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE);
- DmaFill32(3, 0, (void *)OAM, OAM_SIZE);
- DmaFill16(3, 0, (void *)PLTT, BG_PLTT_SIZE + OBJ_PLTT_SIZE);
- REG_BG0HOFS = 0;
- REG_BG0VOFS = 0;
- REG_BG1HOFS = 0;
- REG_BG1VOFS = 0;
- REG_BG2HOFS = 0;
- REG_BG2VOFS = 0;
- REG_BG3HOFS = 0;
- REG_BG3VOFS = 0;
- REG_BLDCNT = 0;
- REG_BLDY = 0;
- REG_DISPSTAT = 0;
- REG_BLDALPHA = 0;
-}
-
-void sub_518(void)
-{
- s16 i;
-
- DmaFill16(3, 0, gUnknown_03005C00, sizeof(gUnknown_03005C00));
- for (i = 0; i < 4; i++)
- {
- gMain.unk2E8[i].unk0 = 0;
- gMain.unk2E8[i].unk2 = 0;
- }
-}
-
-void sub_578(void)
-{
- u16 i, j;
-
- for (i = 0; i < NUM_SPRITE_GROUPS; i++)
- {
- gMain.spriteGroups[i].available = 0;
- gMain.spriteGroups[i].baseX = 0;
- gMain.spriteGroups[i].baseY = 0;
- for (j = 0; j < MAX_SPRITES_IN_GROUP; j++)
- {
- gMain.spriteGroups[i].oam[j].oamId = 0;
- gMain.spriteGroups[i].oam[j].xOffset = 0;
- gMain.spriteGroups[i].oam[j].yOffset = 0;
- }
- }
-
- for (i = 0; i < 128; i++)
- {
- gOamBuffer[i].y = 244;
- gOamBuffer[i].affineMode = 0;
- gOamBuffer[i].objMode = 0;
- gOamBuffer[i].mosaic = 0;
- gOamBuffer[i].bpp = 0;
- gOamBuffer[i].shape = 0;
- gOamBuffer[i].x = 500;
- gOamBuffer[i].matrixNum = 0;
- gOamBuffer[i].hFlip = 0;
- gOamBuffer[i].vFlip = 0;
- gOamBuffer[i].size = 0;
- gOamBuffer[i].tileNum = 0;
- gOamBuffer[i].priority = 0;
- gOamBuffer[i].paletteNum = 0;
- gOamBuffer[i].affineParam = 0;
- }
-}
-
-void sub_678(u8 *arg0, s16 arg1, s16 arg2)
-{
- // Rumble Pak related?
- s16 var0 = sub_55A24(arg0) - 1;
- u16 *dest = &gUnknown_03005C00[arg1 * 32 + arg2];
- do
- {
- *dest = (*arg0) - 32;
- arg0++;
- dest++;
- } while (var0-- > 0);
-}
-
-u8 *sub_6CC(int arg0, u8 *arg1, int arg2, s16 arg3)
-{
- if (arg0 < 0)
- {
- *arg1 = 0x2D;
- arg1++;
- arg0 = -arg0;
- }
-
+extern void sub_B54(void);
+extern void sub_BBC(void);
+extern void sub_D74(void);
+extern void sub_FE8(void);
+extern void ReadKeys(void);
+extern u32 IntrMain_Buffer[0x200];
+extern u32 IntrMain[];
+
+void AgbMain(void)
+{
+ RegisterRamReset(0xFF);
+ sub_BBC();
+ DmaCopy32(3, IntrMain, IntrMain_Buffer, sizeof(IntrMain_Buffer));
+ INTR_VECTOR = IntrMain_Buffer;
+ sub_B54();
+ sub_FE8();
while (1)
{
- if (arg2 < 2)
- break;
-
- arg2--;
- if (arg0 < sub_780(10, arg2))
- {
- *arg1 = 0x30;
- arg1++;
- }
- else
- {
- break;
- }
- }
-
- if (arg3)
- {
- sub_734(arg0, arg1, 10);
- }
- else
- {
- u8 *ptr = sub_734(arg0, arg1, 10);
- *ptr = 0;
- }
-
- return arg1;
-}
-
-static u8 *sub_734(u32 arg0, u8 *arg1, u32 arg2)
-{
- u8 mod = arg0 % arg2;
- int div = arg0 / arg2;
- if (div != 0)
- arg1 = sub_734(div, arg1, arg2);
-
- if (mod < 10)
- *arg1 = mod + 48;
- else
- *arg1 = mod + 87;
-
- return arg1 + 1;
-}
-
-static int sub_780(int arg0, int arg1)
-{
- int var0;
- int var1 = arg1;
-
- if (arg1 < 0)
- var1 = -var1;
-
- var0 = 1;
- while (var1)
- {
- if (var1 & 1)
- var0 *= arg0;
-
- arg0 *= arg0;
- var1 >>= 1;
+ ReadKeys();
+ gMainFuncs[gMain.mainState]();
+ sub_D74();
}
-
- if (arg1 >= 0)
- return var0;
- else
- return 1 / var0;
-}
-
-void SetMatrixScale(s16 xScale, s16 yScale, s16 matrixNum)
-{
- vu16 a2, b2, c2, d2;
- u16 a = 0x10000 / xScale;
- u32 d = 0x10000 / yScale;
- a2 = a;
- b2 = 0;
- c2 = 0;
- // There is a delayed u16 shift here that is tricky to produce.
-#ifndef NONMATCHING
- asm_unified("lsls r0, r0, #0x10\n\
- lsrs r0, r0, #0x10");
-#endif
- d2 = d;
-
- gOamBuffer[matrixNum * 4 ].affineParam = a2;
- gOamBuffer[matrixNum * 4 + 1].affineParam = b2;
- gOamBuffer[matrixNum * 4 + 2].affineParam = c2;
- gOamBuffer[matrixNum * 4 + 3].affineParam = d;
}
diff --git a/src/rom_850.c b/src/rom_850.c
new file mode 100755
index 0000000..8d49a60
--- /dev/null
+++ b/src/rom_850.c
@@ -0,0 +1,67 @@
+#include "global.h"
+#include "main.h"
+
+extern void (**gUnknown_0200FB98)(void);
+extern void (**gUnknown_02019BE0)(void);
+extern void (*gUnknown_0200FB9C)(void);
+extern void (*gUnknown_0200FBA0)(void);
+extern void (*gUnknown_02017BD0)(void);
+extern void (*gUnknown_02017BD4)(void);
+extern void sub_A08(void);
+extern void sub_A20(void);
+extern void sub_DC4(void);
+
+u16 sub_850(void)
+{
+ if (REG_IME & INTR_FLAG_VBLANK
+ && REG_DISPSTAT & DISPSTAT_VBLANK_INTR
+ && REG_IE & INTR_FLAG_VBLANK
+ && !(REG_DISPCNT & DISPCNT_FORCED_BLANK))
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+void sub_898(void (*func)(void))
+{
+ gUnknown_02017BD4 = func;
+ if (!sub_850())
+ gUnknown_0200FB9C = func;
+}
+
+void sub_8BC(void)
+{
+ gUnknown_0200FB9C = sub_DC4;
+ gUnknown_02017BD4 = sub_DC4;
+}
+
+void sub_8D4(void (*func)(void))
+{
+ gUnknown_02017BD0 = func;
+ if (!sub_850())
+ *gUnknown_0200FB98 = func;
+}
+
+void sub_8FC(void)
+{
+ *gUnknown_0200FB98 = sub_A08;
+ gUnknown_02017BD0 = sub_A08;
+}
+
+void sub_918(void (*func)(void))
+{
+ gUnknown_0200FBA0 = func;
+ if (!sub_850())
+ *gUnknown_02019BE0 = func;
+}
+
+void sub_940(void)
+{
+ *gUnknown_02019BE0 = sub_A20;
+ gUnknown_0200FBA0 = sub_A20;
+}
+
diff --git a/src/titlescreen.c b/src/titlescreen.c
index 0527bbe..315c3e6 100755
--- a/src/titlescreen.c
+++ b/src/titlescreen.c
@@ -27,7 +27,7 @@ extern const s8 gUnknown_086A9672[9][2];
extern const u16 gUnknown_086A96A4[];
extern const u16 gUnknown_086A96D4[];
extern const s16 gEReaderAccessButtonSequence[];
-extern const u8 *const gUnknown_086A96E4[];
+extern const struct SpriteSet *const gUnknown_086A96E4[];
extern void sub_438(void);
extern void sub_CBC(void);
@@ -694,3 +694,39 @@ static void sub_1157C(void)
}
}
}
+
+// static void sub_11640(void)
+// {
+// int i;
+// const struct SpriteSet *spriteSet;
+// struct SpriteGroup *group1 = &gTitlescreen.unk8[gUnknown_0200B3B8];
+// struct SpriteGroup *group2 = &gTitlescreen.unk10[gUnknown_0200B3B8];
+// group1->available = gTitlescreen.unk9;
+// group2->available = gTitlescreen.unk11;
+// LoadSpriteSets(gUnknown_086A96E4, 5, gUnknown_0200B3B8);
+// if (group1->available == 1)
+// {
+// group1->baseX = 120;
+// group1->baseY = 102;
+// spriteSet = gUnknown_086A96E4[gTitlescreen.unk8];
+// for (i = 0; i < spriteSet->count; i++)
+// {
+// gOamBuffer[group1->oam[i].oamId].x = group1->oam[i].xOffset + group1->baseX;
+// gOamBuffer[group1->oam[i].oamId].y = group1->oam[i].yOffset + group1->baseY;
+// }
+// }
+
+// if (group2->available == 1)
+// {
+// group2->baseX = 120;
+// group2->baseY = 80;
+// for (i = 0; i < 2; i++)
+// {
+// gOamBuffer[group2->oam[i].oamId].x = group2->oam[i].xOffset + group2->baseX;
+// gOamBuffer[group2->oam[i].oamId].y = group2->oam[i].yOffset + group2->baseY;
+// }
+// }
+
+// group1->available = 0;
+// group2->available = 0;
+// }
diff --git a/src/util.c b/src/util.c
new file mode 100755
index 0000000..e426a43
--- /dev/null
+++ b/src/util.c
@@ -0,0 +1,299 @@
+#include "global.h"
+#include "main.h"
+
+extern const struct OamData gEmptyOamData[128];
+extern int sub_55A24(u8*); // Rumble Pak?
+
+static u8 *sub_734(u32, u8*, u32);
+static int sub_780(int, int);
+
+void SetMainGameState(u16 mainState)
+{
+ gMain.mainState = mainState;
+ gMain.subState = 0;
+}
+
+void sub_24C(void)
+{
+ u16 i;
+
+ REG_BLDCNT = 0;
+ REG_BLDY = 0x10;
+ REG_BLDCNT = ((REG_DISPCNT & (DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON)) >> 8)
+ | BLDCNT_EFFECT_LIGHTEN
+ | BLDCNT_TGT1_BD;
+ REG_DISPCNT &= ~DISPCNT_FORCED_BLANK;
+ gMain.unk16 = REG_DISPCNT;
+
+ for (i = 0; i < 32; i++)
+ {
+ REG_BLDY = 15 - i / 2;
+ sub_D74();
+ }
+
+ REG_BLDCNT = 0;
+}
+
+void sub_2B4(void)
+{
+ u16 i;
+
+ REG_BLDCNT = 0;
+ REG_BLDY = 0;
+ REG_BLDCNT = ((REG_DISPCNT & (DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON)) >> 8)
+ | BLDCNT_EFFECT_LIGHTEN
+ | BLDCNT_TGT1_BD;
+
+ for (i = 0; i < 16; i++)
+ {
+ REG_BLDY = i + 1;
+ sub_D74();
+ }
+
+ gMain.unk16 |= DISPCNT_FORCED_BLANK;
+ REG_DISPCNT |= DISPCNT_FORCED_BLANK;
+ DmaFill16(3, 0, (void *)BG_VRAM, 0x18000);
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ REG_BG2HOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG3HOFS = 0;
+ REG_BG3VOFS = 0;
+ REG_BLDCNT = 0;
+ REG_BLDY = 0;
+}
+
+s16 LoadSpriteSets(const struct SpriteSet *const *spriteSets, u16 numSpriteSets, struct SpriteGroup *spriteGroups)
+{
+ u16 i, j;
+ struct SpriteGroup *spriteGroup;
+ struct OamDataSimple *oamSimple;
+ u16 *oamData = (u16 *)(&gOamBuffer[0]);
+ u16 loadedCount = 0;
+
+ DmaCopy16(3, gEmptyOamData, oamData, sizeof(gEmptyOamData));
+ for (i = 0; i < numSpriteSets; i++)
+ {
+ spriteGroup = &spriteGroups[i];
+ if (spriteGroup->available)
+ {
+ u16 curSpriteSetCount = spriteSets[i]->count;
+ DmaCopy16(3, spriteSets[i]->oamData, &gOamBuffer[loadedCount], curSpriteSetCount * sizeof(struct OamData));
+ for (j = 0; j < curSpriteSetCount; j++)
+ {
+ oamData = (u16 *)(&gOamBuffer[loadedCount]);
+ oamSimple = &spriteGroup->oam[j];
+ oamSimple->oamId = loadedCount++;
+ oamSimple->xOffset = oamData[1] & 0x1FF;
+ oamSimple->yOffset = oamData[0] & 0xFF;
+ }
+ }
+ }
+
+ return loadedCount;
+}
+
+void sub_438(void)
+{
+ gMain.unk16 |= DISPCNT_FORCED_BLANK;
+ REG_DISPCNT |= DISPCNT_FORCED_BLANK;
+ sub_490();
+ sub_518();
+ sub_578();
+ gMain.unkF = 0;
+ gMain.unk10 = 0;
+ gMain.unk50 = 0;
+ gMain.unk11 = 0;
+ gMain.unk12 = 0;
+ gMain.unk14 = 0;
+ gMain.unk26 = 0x90;
+ gMain.unk28 = 0;
+ gMain.unk2A = 0;
+ gMain.unk36 = 0;
+ gMain.unk38 = 0;
+ gMain.unk3A = 0;
+ gMain.unk3C = 0;
+ gMain.unk2C = 0;
+}
+
+void sub_490(void)
+{
+ DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE);
+ DmaFill32(3, 0, (void *)OAM, OAM_SIZE);
+ DmaFill16(3, 0, (void *)PLTT, BG_PLTT_SIZE + OBJ_PLTT_SIZE);
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ REG_BG2HOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG3HOFS = 0;
+ REG_BG3VOFS = 0;
+ REG_BLDCNT = 0;
+ REG_BLDY = 0;
+ REG_DISPSTAT = 0;
+ REG_BLDALPHA = 0;
+}
+
+void sub_518(void)
+{
+ s16 i;
+
+ DmaFill16(3, 0, gUnknown_03005C00, sizeof(gUnknown_03005C00));
+ for (i = 0; i < 4; i++)
+ {
+ gMain.unk2E8[i].unk0 = 0;
+ gMain.unk2E8[i].unk2 = 0;
+ }
+}
+
+void sub_578(void)
+{
+ u16 i, j;
+
+ for (i = 0; i < NUM_SPRITE_GROUPS; i++)
+ {
+ gMain.spriteGroups[i].available = 0;
+ gMain.spriteGroups[i].baseX = 0;
+ gMain.spriteGroups[i].baseY = 0;
+ for (j = 0; j < MAX_SPRITES_IN_GROUP; j++)
+ {
+ gMain.spriteGroups[i].oam[j].oamId = 0;
+ gMain.spriteGroups[i].oam[j].xOffset = 0;
+ gMain.spriteGroups[i].oam[j].yOffset = 0;
+ }
+ }
+
+ for (i = 0; i < 128; i++)
+ {
+ gOamBuffer[i].y = 244;
+ gOamBuffer[i].affineMode = 0;
+ gOamBuffer[i].objMode = 0;
+ gOamBuffer[i].mosaic = 0;
+ gOamBuffer[i].bpp = 0;
+ gOamBuffer[i].shape = 0;
+ gOamBuffer[i].x = 500;
+ gOamBuffer[i].matrixNum = 0;
+ gOamBuffer[i].hFlip = 0;
+ gOamBuffer[i].vFlip = 0;
+ gOamBuffer[i].size = 0;
+ gOamBuffer[i].tileNum = 0;
+ gOamBuffer[i].priority = 0;
+ gOamBuffer[i].paletteNum = 0;
+ gOamBuffer[i].affineParam = 0;
+ }
+}
+
+void sub_678(u8 *arg0, s16 arg1, s16 arg2)
+{
+ // Rumble Pak related?
+ s16 var0 = sub_55A24(arg0) - 1;
+ u16 *dest = &gUnknown_03005C00[arg1 * 32 + arg2];
+ do
+ {
+ *dest = (*arg0) - 32;
+ arg0++;
+ dest++;
+ } while (var0-- > 0);
+}
+
+u8 *sub_6CC(int arg0, u8 *arg1, int arg2, s16 arg3)
+{
+ if (arg0 < 0)
+ {
+ *arg1 = 0x2D;
+ arg1++;
+ arg0 = -arg0;
+ }
+
+ while (1)
+ {
+ if (arg2 < 2)
+ break;
+
+ arg2--;
+ if (arg0 < sub_780(10, arg2))
+ {
+ *arg1 = 0x30;
+ arg1++;
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ if (arg3)
+ {
+ sub_734(arg0, arg1, 10);
+ }
+ else
+ {
+ u8 *ptr = sub_734(arg0, arg1, 10);
+ *ptr = 0;
+ }
+
+ return arg1;
+}
+
+static u8 *sub_734(u32 arg0, u8 *arg1, u32 arg2)
+{
+ u8 mod = arg0 % arg2;
+ int div = arg0 / arg2;
+ if (div != 0)
+ arg1 = sub_734(div, arg1, arg2);
+
+ if (mod < 10)
+ *arg1 = mod + 48;
+ else
+ *arg1 = mod + 87;
+
+ return arg1 + 1;
+}
+
+static int sub_780(int arg0, int arg1)
+{
+ int var0;
+ int var1 = arg1;
+
+ if (arg1 < 0)
+ var1 = -var1;
+
+ var0 = 1;
+ while (var1)
+ {
+ if (var1 & 1)
+ var0 *= arg0;
+
+ arg0 *= arg0;
+ var1 >>= 1;
+ }
+
+ if (arg1 >= 0)
+ return var0;
+ else
+ return 1 / var0;
+}
+
+void SetMatrixScale(s16 xScale, s16 yScale, s16 matrixNum)
+{
+ vu16 a2, b2, c2, d2;
+ u16 a = 0x10000 / xScale;
+ u32 d = 0x10000 / yScale;
+ a2 = a;
+ b2 = 0;
+ c2 = 0;
+ // There is a delayed u16 shift here that is tricky to produce.
+#ifndef NONMATCHING
+ asm_unified("lsls r0, r0, #0x10\n\
+ lsrs r0, r0, #0x10");
+#endif
+ d2 = d;
+
+ gOamBuffer[matrixNum * 4 ].affineParam = a2;
+ gOamBuffer[matrixNum * 4 + 1].affineParam = b2;
+ gOamBuffer[matrixNum * 4 + 2].affineParam = c2;
+ gOamBuffer[matrixNum * 4 + 3].affineParam = d;
+}
diff --git a/sym_bss.txt b/sym_bss.txt
index fe78a61..f282d64 100755
--- a/sym_bss.txt
+++ b/sym_bss.txt
@@ -3,7 +3,10 @@ gUnknown_03000000: @ 0x3000000
.space 0x5000
gOamBuffer: @ 0x3005000
- .space 0xC00
+ .space 0x400
+
+IntrMain_Buffer: @ 0x3005400
+ .space 0x800
gUnknown_03005C00: @ 0x3005C00
.space 0xC00
diff --git a/sym_ewram.txt b/sym_ewram.txt
index acf810f..a185175 100755
--- a/sym_ewram.txt
+++ b/sym_ewram.txt
@@ -37,7 +37,36 @@ gMain: @ 0x200B0C0
gUnknown_0200B3B8: @ 0x200B3B8
- .space 0xF0FC
+ .space 0x47E0
+
+gUnknown_0200FB98: @ 0x200FB98
+ .space 0x4
+
+gUnknown_0200FB9C: @ 0x200FB9C
+ .space 0x4
+
+gUnknown_0200FBA0: @ 0x200FBA0
+ .space 0x4
+
+ .space 0x802C
+
+gUnknown_02017BD0: @ 0x2017BD0
+ .space 0x4
+
+gUnknown_02017BD4: @ 0x2017BD4
+ .space 0x4
+
+ .space 0x8
+
+gUnknown_02017BE0: @ 0x2017BE0
+ .space 0x4
+
+ .space 0x1FFC
+
+gUnknown_02019BE0: @ 0x2019BE0
+ .space 0x4
+
+ .space 0x8D0
gAutoDisplayTitlescreenMenu: @ 0x201A4B4
.space 4