diff --git a/asm/non_matching/m4a/m4aMPlayImmInit.inc b/asm/non_matching/m4a/m4aMPlayImmInit.inc deleted file mode 100644 index 56996373..00000000 --- a/asm/non_matching/m4a/m4aMPlayImmInit.inc +++ /dev/null @@ -1,61 +0,0 @@ - - .syntax unified - - .text - - push {r4, r5, r6, r7, lr} - sub sp, #4 - adds r7, r0, #0 - ldr r1, [r7, #0x34] - ldr r0, _080B0228 @ =0x68736D53 - cmp r1, r0 - bne _080B021E - adds r0, r1, #1 - str r0, [r7, #0x34] - ldrb r5, [r7, #8] - ldr r4, [r7, #0x2c] - cmp r5, #0 - ble _080B021A - movs r2, #0x80 -_080B01E0: - ldrb r1, [r4] - adds r0, r2, #0 - ands r0, r1 - cmp r0, #0 - beq _080B0212 - movs r6, #0x40 - adds r0, r6, #0 - ands r0, r1 - cmp r0, #0 - beq _080B0212 - adds r0, r4, #0 - str r2, [sp] - bl Clear64byte - ldr r2, [sp] - strb r2, [r4] - movs r0, #2 - strb r0, [r4, #0xf] - strb r6, [r4, #0x13] - movs r0, #0x16 - strb r0, [r4, #0x19] - adds r1, r4, #0 - adds r1, #0x24 - movs r0, #1 - strb r0, [r1] -_080B0212: - subs r5, #1 - adds r4, #0x50 - cmp r5, #0 - bgt _080B01E0 -_080B021A: - ldr r0, _080B0228 @ =0x68736D53 - str r0, [r7, #0x34] -_080B021E: - add sp, #4 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_080B0228: .4byte 0x68736D53 - - .syntax divided diff --git a/asm/non_matching/m4a/m4aSoundVSync.inc b/asm/non_matching/m4a/m4aSoundVSync.inc deleted file mode 100644 index 52baef8e..00000000 --- a/asm/non_matching/m4a/m4aSoundVSync.inc +++ /dev/null @@ -1,54 +0,0 @@ - - .syntax unified - - .text - - push {lr} - ldr r0, _080B06C4 @ =0x03007FF0 - ldr r2, [r0] - ldr r0, [r2] - ldr r1, _080B06C8 @ =0x978C92AD - adds r0, r0, r1 - cmp r0, #1 - bhi _080B06BE - ldrb r0, [r2, #4] - subs r0, #1 - ldrb r1, [r2, #4] - strb r0, [r2, #4] - ldrb r0, [r2, #4] - lsls r0, r0, #0x18 - cmp r0, #0 - bgt _080B06BE - ldrb r0, [r2, #0xb] - ldrb r1, [r2, #4] - strb r0, [r2, #4] - ldr r2, _080B06CC @ =0x040000C4 - ldr r0, [r2] - movs r1, #0x80 - lsls r1, r1, #0x12 - ands r0, r1 - cmp r0, #0 - beq _080B06AC - ldr r0, _080B06D0 @ =0x84400004 - str r0, [r2] -_080B06AC: - ldr r0, _080B06D4 @ =0x040000C6 - movs r2, #0x80 - lsls r2, r2, #3 - adds r1, r2, #0 - strh r1, [r0] - movs r2, #0xb6 - lsls r2, r2, #8 - adds r1, r2, #0 - strh r1, [r0] -_080B06BE: - pop {r0} - bx r0 - .align 2, 0 -_080B06C4: .4byte 0x03007FF0 -_080B06C8: .4byte 0x978C92AD -_080B06CC: .4byte 0x040000C4 -_080B06D0: .4byte 0x84400004 -_080B06D4: .4byte 0x040000C6 - - .syntax divided diff --git a/asm/non_matching/m4a/m4aSoundVSyncOff.inc b/asm/non_matching/m4a/m4aSoundVSyncOff.inc deleted file mode 100644 index 4b025c78..00000000 --- a/asm/non_matching/m4a/m4aSoundVSyncOff.inc +++ /dev/null @@ -1,57 +0,0 @@ - - .syntax unified - - .text - - push {lr} - sub sp, #4 - ldr r0, _080B05E4 @ =0x03007FF0 - ldr r2, [r0] - ldr r1, [r2] - ldr r3, _080B05E8 @ =0x978C92AD - adds r0, r1, r3 - cmp r0, #1 - bhi _080B05DC - adds r0, r1, #0 - adds r0, #0xa - str r0, [r2] - ldr r1, _080B05EC @ =0x04000102 - movs r0, #0 - strh r0, [r1] - ldr r3, _080B05F0 @ =0x040000C4 - ldr r0, [r3] - movs r1, #0x80 - lsls r1, r1, #0x12 - ands r0, r1 - cmp r0, #0 - beq _080B05C0 - ldr r0, _080B05F4 @ =0x84400004 - str r0, [r3] -_080B05C0: - ldr r1, _080B05F8 @ =0x040000C6 - movs r3, #0x80 - lsls r3, r3, #3 - adds r0, r3, #0 - strh r0, [r1] - movs r0, #0 - str r0, [sp] - movs r0, #0xd4 - lsls r0, r0, #2 - adds r1, r2, r0 - ldr r2, _080B05FC @ =0x0500018C - mov r0, sp - bl CpuSet -_080B05DC: - add sp, #4 - pop {r0} - bx r0 - .align 2, 0 -_080B05E4: .4byte 0x03007FF0 -_080B05E8: .4byte 0x978C92AD -_080B05EC: .4byte 0x04000102 -_080B05F0: .4byte 0x040000C4 -_080B05F4: .4byte 0x84400004 -_080B05F8: .4byte 0x040000C6 -_080B05FC: .4byte 0x0500018C - - .syntax divided diff --git a/asm/non_matching/m4a/m4aSoundVSyncOn.inc b/asm/non_matching/m4a/m4aSoundVSyncOn.inc deleted file mode 100644 index 7781a9cc..00000000 --- a/asm/non_matching/m4a/m4aSoundVSyncOn.inc +++ /dev/null @@ -1,61 +0,0 @@ - - .syntax unified - - .text - - push {r4, lr} - ldr r0, _080B0658 @ =0x03007FF0 - ldr r2, [r0] - ldr r3, [r2] - ldr r0, _080B065C @ =0x68736D53 - cmp r3, r0 - beq _080B0650 - ldr r1, _080B0660 @ =0x040000C6 - movs r4, #0xb6 - lsls r4, r4, #8 - adds r0, r4, #0 - strh r0, [r1] - ldrb r0, [r2, #4] - movs r0, #0 - strb r0, [r2, #4] - adds r0, r3, #0 - subs r0, #0xa - str r0, [r2] - ldr r3, _080B0664 @ =0x04000006 - ldrb r0, [r3] - ldr r1, [r2, #0x10] - cmp r0, #0x9f - bne _080B0636 - adds r2, r3, #0 -_080B0630: - ldrb r0, [r2] - cmp r0, #0x9f - beq _080B0630 -_080B0636: - ldr r2, _080B0664 @ =0x04000006 -_080B0638: - ldrb r0, [r2] - cmp r0, #0x9f - bne _080B0638 - ldr r4, _080B0668 @ =0x04000100 - ldr r0, _080B066C @ =0x00044940 - bl __divsi3 - rsbs r0, r0, #0 - strh r0, [r4] - ldr r1, _080B0670 @ =0x04000102 - movs r0, #0x80 - strh r0, [r1] -_080B0650: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080B0658: .4byte 0x03007FF0 -_080B065C: .4byte 0x68736D53 -_080B0660: .4byte 0x040000C6 -_080B0664: .4byte 0x04000006 -_080B0668: .4byte 0x04000100 -_080B066C: .4byte 0x00044940 -_080B0670: .4byte 0x04000102 - - .syntax divided diff --git a/src/gba/m4a.c b/src/gba/m4a.c index 9fac2854..0fa6b184 100644 --- a/src/gba/m4a.c +++ b/src/gba/m4a.c @@ -46,6 +46,7 @@ typedef void (*CgbOscOffFunc)(u8); typedef u32 (*MidiKeyToCgbFreqFunc)(u8, u8, u8); typedef void (*ExtVolPitFunc)(void); typedef void (*MPlayMainFunc)(MusicPlayerInfo*); +typedef void (*XcmdFunc)(MusicPlayerInfo*, MusicPlayerTrack*); typedef struct WaveData { u16 type; @@ -309,19 +310,7 @@ extern char SoundMainRAM[]; extern void* gMPlayJumpTable[]; -typedef void (*XcmdFunc)(MusicPlayerInfo*, MusicPlayerTrack*); -extern const XcmdFunc gXcmdTable[]; - extern CgbChannel gCgbChans[]; -extern const u8 gCgb3Vol[]; - -extern const u8 gScaleTable[]; -extern const u32 gFreqTable[]; -extern const u16 gPcmSamplesPerVBlankTable[]; - -extern const u8 gCgbScaleTable[]; -extern const s16 gCgbFreqTable[]; -extern const u8 gNoiseTable[]; extern char gNumMusicPlayers[]; extern char gMaxLines[]; @@ -654,9 +643,16 @@ void m4aMPlayFadeIn(MusicPlayerInfo* mplayInfo, u16 speed) { } } -NONMATCH("asm/non_matching/m4a/m4aMPlayImmInit.inc", void m4aMPlayImmInit(MusicPlayerInfo* mplayInfo)) { - s32 trackCount = mplayInfo->trackCount; - MusicPlayerTrack* track = mplayInfo->tracks; +void m4aMPlayImmInit(MusicPlayerInfo* mplayInfo) { + s32 trackCount; + MusicPlayerTrack* track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + trackCount = mplayInfo->trackCount; + track = mplayInfo->tracks; while (trackCount > 0) { if (track->flags & MPT_FLG_EXIST) { @@ -673,8 +669,8 @@ NONMATCH("asm/non_matching/m4a/m4aMPlayImmInit.inc", void m4aMPlayImmInit(MusicP trackCount--; track++; } + mplayInfo->ident = ID_NUMBER; } -END_NONMATCH void MPlayExtender(CgbChannel* cgbChans) { SoundInfo* soundInfo; @@ -885,27 +881,26 @@ void SoundClear(void) { soundInfo->ident = ID_NUMBER; } -NONMATCH("asm/non_matching/m4a/m4aSoundVSyncOff.inc", void m4aSoundVSyncOff(void)) { +void m4aSoundVSyncOff(void) { SoundInfo* soundInfo = SOUND_INFO_PTR; if (soundInfo->ident >= ID_NUMBER && soundInfo->ident <= ID_NUMBER + 1) { soundInfo->ident += 10; + REG_TM0CNT_H = 0; + if (REG_DMA1CNT & (DMA_REPEAT << 16)) REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; - if (REG_DMA2CNT & (DMA_REPEAT << 16)) - REG_DMA2CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; - REG_DMA1CNT_H = DMA_32BIT; - REG_DMA2CNT_H = DMA_32BIT; CpuFill32(0, soundInfo->pcmBuffer, sizeof(soundInfo->pcmBuffer)); } } -END_NONMATCH -NONMATCH("asm/non_matching/m4a/m4aSoundVSyncOn.inc", void m4aSoundVSyncOn(void)) { +#define REG_VCOUNT_8 (*(vu8*)REG_ADDR_VCOUNT) + +void m4aSoundVSyncOn(void) { SoundInfo* soundInfo = SOUND_INFO_PTR; u32 ident = soundInfo->ident; @@ -913,16 +908,33 @@ NONMATCH("asm/non_matching/m4a/m4aSoundVSyncOn.inc", void m4aSoundVSyncOn(void)) return; REG_DMA1CNT_H = DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT; - REG_DMA2CNT_H = DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT; soundInfo->pcmDmaCounter = 0; soundInfo->ident = ident - 10; -} -END_NONMATCH -NONMATCH("asm/non_matching/m4a/m4aSoundVSync.inc", void m4aSoundVSync(void)) { + while (REG_VCOUNT_8 == 0x9f) {} + while (REG_VCOUNT_8 != 0x9f) {} + + REG_TM0CNT_L = -(0x44940 / soundInfo->pcmSamplesPerVBlank); + REG_TM0CNT_H = 0x80; +} + +void m4aSoundVSync(void) { + SoundInfo* soundInfo = SOUND_INFO_PTR; + + if (soundInfo->ident - ID_NUMBER > 1) + return; + + soundInfo->pcmDmaCounter--; + if ((s8)soundInfo->pcmDmaCounter > 0) + return; + soundInfo->pcmDmaCounter = soundInfo->pcmDmaPeriod; + if (REG_DMA1CNT & (DMA_REPEAT << 16)) { + REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; + } + REG_DMA1CNT_H = DMA_32BIT; + REG_DMA1CNT_H = DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT; } -END_NONMATCH void MPlayOpen(MusicPlayerInfo* mplayInfo, MusicPlayerTrack* tracks, u8 trackCount) { SoundInfo* soundInfo;