diff options
author | Marcus Huderle <huderlem@gmail.com> | 2018-10-21 17:03:33 -0500 |
---|---|---|
committer | Marcus Huderle <huderlem@gmail.com> | 2018-10-21 17:03:33 -0500 |
commit | d943da35b4907748b89e281571dda91fd8dedb8f (patch) | |
tree | 4aaded84005c3a7d71cf80952c963f64f9fece81 | |
parent | ba5df32ca23fe022a0e5db530e0f4d87d15508bf (diff) |
Decompile some more functions up to AgbMain
-rwxr-xr-x | Makefile | 3 | ||||
-rwxr-xr-x | asm/rom_9BC.s (renamed from asm/rom_24C.s) | 180 | ||||
-rwxr-xr-x | include/main.h | 9 | ||||
-rwxr-xr-x | ld_script.txt | 4 | ||||
-rwxr-xr-x | src/main.c | 311 | ||||
-rwxr-xr-x | src/rom_850.c | 67 | ||||
-rwxr-xr-x | src/titlescreen.c | 38 | ||||
-rwxr-xr-x | src/util.c | 299 | ||||
-rwxr-xr-x | sym_bss.txt | 5 | ||||
-rwxr-xr-x | sym_ewram.txt | 31 |
10 files changed, 467 insertions, 480 deletions
@@ -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); @@ -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 |