summaryrefslogtreecommitdiff
path: root/src/music_pre.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/music_pre.c')
-rw-r--r--src/music_pre.c195
1 files changed, 195 insertions, 0 deletions
diff --git a/src/music_pre.c b/src/music_pre.c
index edb00cd..53c5688 100644
--- a/src/music_pre.c
+++ b/src/music_pre.c
@@ -19,6 +19,15 @@ extern void sub_800C298(u16 r0);
typedef void (*IntrCallback)(void);
extern IntrCallback gUnknown_202D5F0[];
+struct unkStruct_202D648
+{
+ s16 unk0;
+ s16 unk2; // Vcount??
+ IntrCallback unk4; // some function... just making it IntrCallback for now
+};
+extern struct unkStruct_202D648 gUnknown_202D648[8];
+extern struct unkStruct_202D648 gUnknown_202D608[8];
+
extern struct MusicPlayerInfo gUnknown_20008F0; // BGM??
extern u32 gUnknown_203B0A0;
extern u32 gUnknown_203B0A4;
@@ -34,6 +43,13 @@ extern u8 gUnknown_203B09B;
extern u32 gUnknown_203B09C;
extern u8 gUnknown_203B09A;
+extern u32 gUnknown_203B0A0;
+extern s16 gUnknown_203B0AA;
+extern s16 gUnknown_203B0AC;
+extern s16 gUnknown_203B0AE;
+extern s16 gUnknown_203B0B0;
+extern s16 gUnknown_203B0B2;
+
struct unkStruct_3000FD8
{
u16 unk0;
@@ -51,9 +67,188 @@ extern struct BGControlStruct gBG1Control;
extern struct BGControlStruct gBG2Control;
extern struct BGControlStruct gBG3Control;
+extern void SoundVSync();
+extern void BlinkSavingIcon();
+
void sub_800BF80(void);
void xxx_update_bg_sound_input(void);
+void UnusedIntrFunc(void)
+{
+}
+
+void VBlankIntr(void)
+{
+ int index;
+
+ gUnknown_203B0A0++;
+ SoundVSync();
+ BlinkSavingIcon();
+ if (gUnknown_202D5F0[1] != NULL) {
+ gUnknown_202D5F0[1]();
+ }
+ index = 0;
+ while (index < gUnknown_203B0AA) {
+ gUnknown_202D648[index] = gUnknown_202D608[index];
+ index++;
+ }
+ gUnknown_203B0AC = gUnknown_203B0AA;
+ gUnknown_203B0AE = -1;
+ gUnknown_203B0B0 = -1;
+ gUnknown_203B0B2 = -1;
+ REG_DISPSTAT = DISPSTAT_VBLANK_INTR | DISPSTAT_VCOUNT_INTR;
+ if (gUnknown_203B099 == 0) {
+ UpdateSound();
+ }
+ SetInterruptFlag(INTR_FLAG_VBLANK);
+}
+
+// Registers are a little off.. seems to be around the while loop
+#ifdef NONMATCHING
+void VCountIntr(void)
+{
+ s32 sVar1;
+ s32 sVar2;
+
+ // Hack to get the lsr/asr shifts
+ sVar2 = REG_VCOUNT << 16;
+ sVar2 = sVar2 >> 16;
+
+ if (gUnknown_203B0AE < 0) {
+ if (gUnknown_202D5F0[2] != 0) {
+ gUnknown_202D5F0[2]();
+ }
+ gUnknown_203B0AE = 0;
+ }
+ if (gUnknown_203B0AE < gUnknown_203B0AC) {
+ sVar1 = gUnknown_202D648[gUnknown_203B0AE].unk2;
+ while (sVar1 <= sVar2) {
+ if ( gUnknown_202D648[gUnknown_203B0AE].unk4 != NULL) {
+ gUnknown_202D648[gUnknown_203B0AE].unk4();
+ }
+ gUnknown_203B0AE++;
+ if (gUnknown_203B0AC >= gUnknown_203B0AE) break;
+ sVar1 = gUnknown_202D648[gUnknown_203B0AE].unk2;
+ }
+ if (gUnknown_203B0AE < gUnknown_203B0AC) {
+ REG_DISPSTAT = gUnknown_202D648[gUnknown_203B0AE].unk2 << 8 | DISPSTAT_VBLANK_INTR | DISPSTAT_VCOUNT_INTR;
+ }
+ }
+ SetInterruptFlag(INTR_FLAG_VCOUNT);
+}
+#else
+NAKED
+void VCountIntr(void)
+{
+ asm_unified(
+ "\tpush {r4-r7,lr}\n"
+ "\tmov r7, r8\n"
+ "\tpush {r7}\n"
+ "\tldr r0, _0800BA44\n"
+ "\tldrh r0, [r0]\n"
+ "\tlsls r0, 16\n"
+ "\tasrs r6, r0, 16\n"
+ "\tldr r0, _0800BA48\n"
+ "\tmovs r2, 0\n"
+ "\tldrsh r1, [r0, r2]\n"
+ "\tadds r7, r0, 0\n"
+ "\tcmp r1, 0\n"
+ "\tbge _0800B9B2\n"
+ "\tldr r0, _0800BA4C\n"
+ "\tldr r0, [r0, 0x8]\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0800B9AE\n"
+ "\tbl _call_via_r0\n"
+"_0800B9AE:\n"
+ "\tmovs r0, 0\n"
+ "\tstrh r0, [r7]\n"
+"_0800B9B2:\n"
+ "\tldr r0, _0800BA50\n"
+ "\tmovs r3, 0\n"
+ "\tldrsh r2, [r7, r3]\n"
+ "\tmovs r3, 0\n"
+ "\tldrsh r1, [r0, r3]\n"
+ "\tmov r8, r0\n"
+ "\tcmp r2, r1\n"
+ "\tbge _0800BA34\n"
+ "\tldr r1, _0800BA54\n"
+ "\tadds r0, r2, 0\n"
+ "\tlsls r0, 3\n"
+ "\tadds r0, r1\n"
+ "\tmovs r3, 0x2\n"
+ "\tldrsh r0, [r0, r3]\n"
+ "\tcmp r0, r6\n"
+ "\tbgt _0800BA10\n"
+ "\tadds r5, r1, 0\n"
+ "\tadds r4, r7, 0\n"
+"_0800B9D6:\n"
+ "\tmovs r1, 0\n"
+ "\tldrsh r0, [r4, r1]\n"
+ "\tlsls r0, 3\n"
+ "\tadds r1, r5, 0x4\n"
+ "\tadds r0, r1\n"
+ "\tldr r0, [r0]\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0800B9EA\n"
+ "\tbl _call_via_r0\n"
+"_0800B9EA:\n"
+ "\tldrh r0, [r4]\n"
+ "\tadds r0, 0x1\n"
+ "\tstrh r0, [r4]\n"
+ "\tldr r1, _0800BA50\n"
+ "\tlsls r0, 16\n"
+ "\tasrs r0, 16\n"
+ "\tmovs r2, 0\n"
+ "\tldrsh r1, [r1, r2]\n"
+ "\tcmp r0, r1\n"
+ "\tbge _0800BA34\n"
+ "\tmovs r3, 0\n"
+ "\tldrsh r0, [r4, r3]\n"
+ "\tlsls r0, 3\n"
+ "\tadds r0, r5\n"
+ "\tmovs r1, 0x2\n"
+ "\tldrsh r0, [r0, r1]\n"
+ "\tldr r7, _0800BA48\n"
+ "\tcmp r0, r6\n"
+ "\tble _0800B9D6\n"
+"_0800BA10:\n"
+ "\tmovs r2, 0\n"
+ "\tldrsh r1, [r7, r2]\n"
+ "\tmov r3, r8\n"
+ "\tmovs r2, 0\n"
+ "\tldrsh r0, [r3, r2]\n"
+ "\tcmp r1, r0\n"
+ "\tbge _0800BA34\n"
+ "\tldr r2, _0800BA58\n"
+ "\tldr r1, _0800BA54\n"
+ "\tmovs r3, 0\n"
+ "\tldrsh r0, [r7, r3]\n"
+ "\tlsls r0, 3\n"
+ "\tadds r0, r1\n"
+ "\tldrh r0, [r0, 0x2]\n"
+ "\tlsls r0, 8\n"
+ "\tmovs r1, 0x28\n"
+ "\torrs r0, r1\n"
+ "\tstrh r0, [r2]\n"
+"_0800BA34:\n"
+ "\tmovs r0, 0x4\n"
+ "\tbl SetInterruptFlag\n"
+ "\tpop {r3}\n"
+ "\tmov r8, r3\n"
+ "\tpop {r4-r7}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.align 2, 0\n"
+"_0800BA44: .4byte 0x04000006\n"
+"_0800BA48: .4byte gUnknown_203B0AE\n"
+"_0800BA4C: .4byte gUnknown_202D5F0\n"
+"_0800BA50: .4byte gUnknown_203B0AC\n"
+"_0800BA54: .4byte gUnknown_202D648\n"
+"_0800BA58: .4byte 0x04000004"
+ );
+}
+#endif
+
void sub_800BA5C(void)
{
if(gUnknown_203B09A != 0)