diff options
Diffstat (limited to 'src/music_pre.c')
-rw-r--r-- | src/music_pre.c | 195 |
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) |