summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarcus Huderle <huderlem@gmail.com>2018-10-19 17:04:03 -0500
committerMarcus Huderle <huderlem@gmail.com>2018-10-19 17:04:03 -0500
commit684eb41feb95329d131b7480f0a34cc0ce7b259a (patch)
treea79f97fa5522fd4764d519d5d4140f96254fda1b /src
parent10c39b199b625b12b9aae21be793c82253c7ac58 (diff)
Decompile more functions in main.s
Diffstat (limited to 'src')
-rwxr-xr-xsrc/main.c241
1 files changed, 241 insertions, 0 deletions
diff --git a/src/main.c b/src/main.c
index 6d6f4f4..e3571a1 100755
--- a/src/main.c
+++ b/src/main.c
@@ -1,6 +1,12 @@
#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;
@@ -58,3 +64,238 @@ void sub_2B4(void)
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;
+ }
+
+ 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;
+}
+
+// struct OamMatrix
+// {
+// s16 a;
+// s16 b;
+// s16 c;
+// s16 d;
+// };
+//
+// void sub_7C0(s16 arg0, s16 arg1, s16 matrixNum)
+// {
+// u16 a = 0x10000 / arg0;
+// u16 d = 0x10000 / arg1;
+// volatile s16 a2 = a;
+// volatile s16 b2 = 0;
+// volatile s16 c2 = 0;
+// volatile s16 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;
+// }