diff --git a/asm/non_matching/m4a/CgbSound.inc b/asm/non_matching/m4a/CgbSound.inc deleted file mode 100644 index c4fadc4d..00000000 --- a/asm/non_matching/m4a/CgbSound.inc +++ /dev/null @@ -1,616 +0,0 @@ - - .syntax unified - - .text - - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - sub sp, #0x24 - ldr r0, _080B0B74 @ =0x03007FF0 - ldr r0, [r0] - str r0, [sp, #8] - ldrb r0, [r0, #0xa] - cmp r0, #0 - beq _080B0B78 - subs r0, #1 - ldr r1, [sp, #8] - strb r0, [r1, #0xa] - b _080B0B7E - .align 2, 0 -_080B0B74: .4byte 0x03007FF0 -_080B0B78: - movs r0, #0xe - ldr r3, [sp, #8] - strb r0, [r3, #0xa] -_080B0B7E: - movs r6, #1 - ldr r0, [sp, #8] - ldr r4, [r0, #0x1c] - mov r1, sp - str r1, [sp, #0x1c] -_080B0B88: - ldrb r1, [r4] - movs r0, #0xc7 - ands r0, r1 - adds r3, r6, #1 - mov sl, r3 - movs r1, #0x40 - adds r1, r1, r4 - mov sb, r1 - cmp r0, #0 - bne _080B0B9E - b _080B0FBA -_080B0B9E: - cmp r6, #2 - beq _080B0BD4 - cmp r6, #2 - bgt _080B0BAC - cmp r6, #1 - beq _080B0BB2 - b _080B0C1C -_080B0BAC: - cmp r6, #3 - beq _080B0BF8 - b _080B0C1C -_080B0BB2: - ldr r3, _080B0BC8 @ =0x04000060 - str r3, [sp, #0xc] - adds r3, #2 - ldr r0, _080B0BCC @ =0x04000063 - str r0, [sp, #0x10] - ldr r1, _080B0BD0 @ =0x04000064 - str r1, [sp, #0x14] - adds r0, #2 - str r0, [sp, #0x18] - movs r0, #0 - b _080B0C30 - .align 2, 0 -_080B0BC8: .4byte 0x04000060 -_080B0BCC: .4byte 0x04000063 -_080B0BD0: .4byte 0x04000064 -_080B0BD4: - ldr r3, _080B0BEC @ =0x04000061 - str r3, [sp, #0xc] - adds r3, #7 - ldr r0, _080B0BF0 @ =0x04000069 - str r0, [sp, #0x10] - ldr r1, _080B0BF4 @ =0x0400006C - str r1, [sp, #0x14] - adds r0, #4 - str r0, [sp, #0x18] - movs r0, #1 - b _080B0C30 - .align 2, 0 -_080B0BEC: .4byte 0x04000061 -_080B0BF0: .4byte 0x04000069 -_080B0BF4: .4byte 0x0400006C -_080B0BF8: - ldr r3, _080B0C10 @ =0x04000070 - str r3, [sp, #0xc] - adds r3, #2 - ldr r0, _080B0C14 @ =0x04000073 - str r0, [sp, #0x10] - ldr r1, _080B0C18 @ =0x04000074 - str r1, [sp, #0x14] - adds r0, #2 - str r0, [sp, #0x18] - movs r0, #2 - b _080B0C30 - .align 2, 0 -_080B0C10: .4byte 0x04000070 -_080B0C14: .4byte 0x04000073 -_080B0C18: .4byte 0x04000074 -_080B0C1C: - ldr r3, _080B0C84 @ =0x04000071 - str r3, [sp, #0xc] - adds r3, #7 - ldr r0, _080B0C88 @ =0x04000079 - str r0, [sp, #0x10] - ldr r1, _080B0C8C @ =0x0400007C - str r1, [sp, #0x14] - adds r0, #4 - str r0, [sp, #0x18] - movs r0, #3 -_080B0C30: - ldr r1, [sp, #0x1c] - strb r0, [r1] - ldr r0, [sp, #8] - ldrb r0, [r0, #0xa] - str r0, [sp, #4] - ldr r1, [sp, #0x10] - ldrb r0, [r1] - mov r8, r0 - ldrb r2, [r4] - movs r0, #0x80 - ands r0, r2 - cmp r0, #0 - beq _080B0D2A - movs r7, #0x40 - adds r0, r7, #0 - ands r0, r2 - lsls r0, r0, #0x18 - lsrs r5, r0, #0x18 - adds r0, r6, #1 - mov sl, r0 - movs r1, #0x40 - adds r1, r1, r4 - mov sb, r1 - cmp r5, #0 - beq _080B0C64 - b _080B0D60 -_080B0C64: - movs r0, #3 - strb r0, [r4] - strb r0, [r4, #0x1d] - adds r0, r4, #0 - str r3, [sp, #0x20] - bl CgbModVol - ldr r3, [sp, #0x20] - cmp r6, #2 - beq _080B0C9C - cmp r6, #2 - bgt _080B0C90 - cmp r6, #1 - beq _080B0C96 - b _080B0CF0 - .align 2, 0 -_080B0C84: .4byte 0x04000071 -_080B0C88: .4byte 0x04000079 -_080B0C8C: .4byte 0x0400007C -_080B0C90: - cmp r6, #3 - beq _080B0CA8 - b _080B0CF0 -_080B0C96: - ldrb r0, [r4, #0x1f] - ldr r1, [sp, #0xc] - strb r0, [r1] -_080B0C9C: - ldr r0, [r4, #0x24] - lsls r0, r0, #6 - ldrb r1, [r4, #0x1e] - adds r0, r0, r1 - strb r0, [r3] - b _080B0CFC -_080B0CA8: - ldr r1, [r4, #0x24] - ldr r0, [r4, #0x28] - cmp r1, r0 - beq _080B0CD0 - ldr r0, [sp, #0xc] - strb r7, [r0] - ldr r1, _080B0CE4 @ =0x04000090 - ldr r2, [r4, #0x24] - ldr r0, [r2] - str r0, [r1] - adds r1, #4 - ldr r0, [r2, #4] - str r0, [r1] - adds r1, #4 - ldr r0, [r2, #8] - str r0, [r1] - adds r1, #4 - ldr r0, [r2, #0xc] - str r0, [r1] - str r2, [r4, #0x28] -_080B0CD0: - ldr r1, [sp, #0xc] - strb r5, [r1] - ldrb r0, [r4, #0x1e] - strb r0, [r3] - ldrb r0, [r4, #0x1e] - cmp r0, #0 - beq _080B0CE8 - movs r0, #0xc0 - b _080B0D0A - .align 2, 0 -_080B0CE4: .4byte 0x04000090 -_080B0CE8: - movs r3, #0x80 - rsbs r3, r3, #0 - strb r3, [r4, #0x1a] - b _080B0D0C -_080B0CF0: - ldrb r0, [r4, #0x1e] - strb r0, [r3] - ldr r0, [r4, #0x24] - lsls r0, r0, #3 - ldr r1, [sp, #0x14] - strb r0, [r1] -_080B0CFC: - ldrb r0, [r4, #4] - adds r0, #8 - mov r8, r0 - ldrb r0, [r4, #0x1e] - cmp r0, #0 - beq _080B0D0A - movs r0, #0x40 -_080B0D0A: - strb r0, [r4, #0x1a] -_080B0D0C: - ldrb r1, [r4, #4] - movs r2, #0 - strb r1, [r4, #0xb] - movs r0, #0xff - ands r0, r1 - adds r3, r6, #1 - mov sl, r3 - movs r1, #0x40 - adds r1, r1, r4 - mov sb, r1 - cmp r0, #0 - bne _080B0D26 - b _080B0E7A -_080B0D26: - strb r2, [r4, #9] - b _080B0EA8 -_080B0D2A: - movs r0, #4 - ands r0, r2 - cmp r0, #0 - bne _080B0D44 - ldr r0, _080B0D70 @ =0x04000084 - ldrb r1, [r0] - ldr r3, [sp, #0x1c] - ldrb r0, [r3] - asrs r1, r0 - movs r0, #1 - ands r1, r0 - cmp r1, #0 - bne _080B0D74 -_080B0D44: - ldrb r0, [r4, #0xd] - subs r0, #1 - strb r0, [r4, #0xd] - movs r1, #0xff - ands r0, r1 - lsls r0, r0, #0x18 - adds r3, r6, #1 - mov sl, r3 - movs r1, #0x40 - adds r1, r1, r4 - mov sb, r1 - cmp r0, #0 - ble _080B0D60 - b _080B0EBA -_080B0D60: - lsls r0, r6, #0x18 - lsrs r0, r0, #0x18 - bl CgbOscOff - movs r0, #0 - strb r0, [r4] - b _080B0FB6 - .align 2, 0 -_080B0D70: .4byte 0x04000084 -_080B0D74: - movs r0, #0x40 - ands r0, r2 - adds r3, r6, #1 - mov sl, r3 - movs r1, #0x40 - adds r1, r1, r4 - mov sb, r1 - cmp r0, #0 - beq _080B0DB4 - movs r0, #3 - ands r0, r2 - cmp r0, #0 - beq _080B0DB4 - movs r0, #0xfc - ands r0, r2 - movs r2, #0 - strb r0, [r4] - ldrb r1, [r4, #7] - strb r1, [r4, #0xb] - movs r0, #0xff - ands r0, r1 - cmp r0, #0 - beq _080B0DE6 - ldrb r0, [r4, #0x1d] - movs r1, #1 - orrs r0, r1 - strb r0, [r4, #0x1d] - cmp r6, #3 - beq _080B0EA8 - ldrb r3, [r4, #7] - mov r8, r3 - b _080B0EA8 -_080B0DB4: - ldrb r0, [r4, #0xb] - cmp r0, #0 - bne _080B0EA8 - cmp r6, #3 - bne _080B0DC6 - ldrb r1, [r4, #0x1d] - movs r0, #1 - orrs r0, r1 - strb r0, [r4, #0x1d] -_080B0DC6: - adds r0, r4, #0 - bl CgbModVol - ldrb r0, [r4] - movs r1, #3 - ands r1, r0 - cmp r1, #0 - bne _080B0E18 - ldrb r0, [r4, #9] - subs r0, #1 - strb r0, [r4, #9] - movs r1, #0xff - ands r0, r1 - lsls r0, r0, #0x18 - cmp r0, #0 - bgt _080B0E14 -_080B0DE6: - ldrb r1, [r4, #0xa] - ldrb r0, [r4, #0xc] - muls r0, r1, r0 - adds r0, #0xff - asrs r0, r0, #8 - movs r1, #0 - strb r0, [r4, #9] - lsls r0, r0, #0x18 - cmp r0, #0 - beq _080B0D60 - ldrb r0, [r4] - movs r1, #4 - orrs r0, r1 - strb r0, [r4] - ldrb r0, [r4, #0x1d] - movs r1, #1 - orrs r0, r1 - strb r0, [r4, #0x1d] - cmp r6, #3 - beq _080B0EBA - movs r3, #8 - mov r8, r3 - b _080B0EBA -_080B0E14: - ldrb r0, [r4, #7] - b _080B0EA6 -_080B0E18: - cmp r1, #1 - bne _080B0E24 -_080B0E1C: - ldrb r0, [r4, #0x19] - strb r0, [r4, #9] - movs r0, #7 - b _080B0EA6 -_080B0E24: - cmp r1, #2 - bne _080B0E6A - ldrb r0, [r4, #9] - subs r0, #1 - strb r0, [r4, #9] - movs r1, #0xff - ands r0, r1 - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - movs r1, #0x19 - ldrsb r1, [r4, r1] - cmp r0, r1 - bgt _080B0E66 -_080B0E3E: - ldrb r0, [r4, #6] - cmp r0, #0 - bne _080B0E4E - ldrb r1, [r4] - movs r0, #0xfc - ands r0, r1 - strb r0, [r4] - b _080B0DE6 -_080B0E4E: - ldrb r0, [r4] - subs r0, #1 - strb r0, [r4] - ldrb r1, [r4, #0x1d] - movs r0, #1 - orrs r0, r1 - strb r0, [r4, #0x1d] - cmp r6, #3 - beq _080B0E1C - movs r3, #8 - mov r8, r3 - b _080B0E1C -_080B0E66: - ldrb r0, [r4, #5] - b _080B0EA6 -_080B0E6A: - ldrb r0, [r4, #9] - adds r0, #1 - strb r0, [r4, #9] - movs r1, #0xff - ands r0, r1 - ldrb r3, [r4, #0xa] - cmp r0, r3 - blo _080B0EA4 -_080B0E7A: - ldrb r0, [r4] - subs r0, #1 - movs r2, #0 - strb r0, [r4] - ldrb r1, [r4, #5] - strb r1, [r4, #0xb] - movs r0, #0xff - ands r0, r1 - cmp r0, #0 - beq _080B0E3E - ldrb r0, [r4, #0x1d] - movs r1, #1 - orrs r0, r1 - strb r0, [r4, #0x1d] - ldrb r0, [r4, #0xa] - strb r0, [r4, #9] - cmp r6, #3 - beq _080B0EA8 - ldrb r0, [r4, #5] - mov r8, r0 - b _080B0EA8 -_080B0EA4: - ldrb r0, [r4, #4] -_080B0EA6: - strb r0, [r4, #0xb] -_080B0EA8: - ldrb r0, [r4, #0xb] - subs r0, #1 - strb r0, [r4, #0xb] - ldr r1, [sp, #4] - cmp r1, #0 - bne _080B0EBA - subs r1, #1 - str r1, [sp, #4] - b _080B0DB4 -_080B0EBA: - ldrb r1, [r4, #0x1d] - movs r0, #2 - ands r0, r1 - cmp r0, #0 - beq _080B0F34 - cmp r6, #3 - bgt _080B0EFA - ldrb r1, [r4, #1] - movs r0, #8 - ands r0, r1 - cmp r0, #0 - beq _080B0EFA - ldr r0, _080B0EE4 @ =0x04000089 - ldrb r0, [r0] - adds r1, r0, #0 - cmp r1, #0x3f - bgt _080B0EEC - ldr r0, [r4, #0x20] - adds r0, #2 - ldr r1, _080B0EE8 @ =0x000007FC - b _080B0EF6 - .align 2, 0 -_080B0EE4: .4byte 0x04000089 -_080B0EE8: .4byte 0x000007FC -_080B0EEC: - cmp r1, #0x7f - bgt _080B0EFA - ldr r0, [r4, #0x20] - adds r0, #1 - ldr r1, _080B0F04 @ =0x000007FE -_080B0EF6: - ands r0, r1 - str r0, [r4, #0x20] -_080B0EFA: - cmp r6, #4 - beq _080B0F08 - ldr r0, [r4, #0x20] - b _080B0F14 - .align 2, 0 -_080B0F04: .4byte 0x000007FE -_080B0F08: - ldr r1, [sp, #0x14] - ldrb r0, [r1] - movs r1, #8 - ands r1, r0 - ldr r0, [r4, #0x20] - orrs r0, r1 -_080B0F14: - ldr r3, [sp, #0x14] - strb r0, [r3] - ldrb r0, [r4, #0x1a] - movs r1, #0xc0 - ands r1, r0 - ldr r0, [r4, #0x20] - movs r2, #0xfc - lsls r2, r2, #6 - ands r0, r2 - lsrs r0, r0, #8 - adds r1, r1, r0 - strb r1, [r4, #0x1a] - movs r0, #0xff - ands r1, r0 - ldr r3, [sp, #0x18] - strb r1, [r3] -_080B0F34: - ldrb r1, [r4, #0x1d] - movs r0, #1 - ands r0, r1 - cmp r0, #0 - beq _080B0FB6 - ldr r2, _080B0F7C @ =0x04000081 - ldrb r1, [r4, #0x1c] - ldrb r0, [r2] - bics r0, r1 - ldrb r1, [r4, #0x1b] - orrs r0, r1 - strb r0, [r2] - cmp r6, #3 - bne _080B0F84 - ldr r1, _080B0F80 @ =gCgb3Vol - ldrb r0, [r4, #9] - adds r0, r0, r1 - ldrb r0, [r0] - ldr r1, [sp, #0x10] - strb r0, [r1] - ldrb r1, [r4, #0x1a] - movs r2, #0x80 - adds r0, r2, #0 - ands r0, r1 - cmp r0, #0 - beq _080B0FB6 - ldr r3, [sp, #0xc] - strb r2, [r3] - ldrb r0, [r4, #0x1a] - ldr r1, [sp, #0x18] - strb r0, [r1] - ldrb r1, [r4, #0x1a] - movs r0, #0x7f - ands r0, r1 - strb r0, [r4, #0x1a] - b _080B0FB6 - .align 2, 0 -_080B0F7C: .4byte 0x04000081 -_080B0F80: .4byte gCgb3Vol -_080B0F84: - movs r0, #0xf - mov r3, r8 - ands r3, r0 - mov r8, r3 - ldrb r0, [r4, #9] - lsls r0, r0, #4 - add r0, r8 - ldr r1, [sp, #0x10] - strb r0, [r1] - ldrb r0, [r4, #0x1a] - movs r2, #0x80 - orrs r0, r2 - ldr r3, [sp, #0x18] - strb r0, [r3] - cmp r6, #1 - bne _080B0FB6 - ldr r0, [sp, #0xc] - ldrb r1, [r0] - movs r0, #8 - ands r0, r1 - cmp r0, #0 - bne _080B0FB6 - ldrb r0, [r4, #0x1a] - orrs r0, r2 - strb r0, [r3] -_080B0FB6: - movs r0, #0 - strb r0, [r4, #0x1d] -_080B0FBA: - mov r6, sl - mov r4, sb - cmp r6, #4 - bgt _080B0FC4 - b _080B0B88 -_080B0FC4: - add sp, #0x24 - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - - .syntax divided diff --git a/src/gba/m4a.c b/src/gba/m4a.c index 19978368..b5e2e13e 100644 --- a/src/gba/m4a.c +++ b/src/gba/m4a.c @@ -1059,16 +1059,9 @@ void CgbModVol(CgbChannel* chan) { if (!CgbPan(chan)) { chan->pan = 0xFF; - chan->envelopeGoal = (u32)(chan->rightVolume + chan->leftVolume) >> 4; + chan->envelopeGoal = (u32)(chan->rightVolume + chan->leftVolume) / 16; } else { - // Force chan->rightVolume and chan->leftVolume to be read from memory again, - // even though there is no reason to do so. - // The command line option "-fno-gcse" achieves the same result as this. -#ifndef NON_MATCHING - asm("" : : : "memory"); -#endif - - chan->envelopeGoal = (u32)(chan->rightVolume + chan->leftVolume) >> 4; + chan->envelopeGoal = (u32)(chan->rightVolume + chan->leftVolume) / 16; if (chan->envelopeGoal > 15) chan->envelopeGoal = 15; } @@ -1077,7 +1070,7 @@ void CgbModVol(CgbChannel* chan) { chan->pan &= chan->panMask; } -NONMATCH("asm/non_matching/m4a/CgbSound.inc", void CgbSound(void)) { +void CgbSound(void) { s32 ch; CgbChannel* channels; s32 envelopeStepTimeAndDir; @@ -1088,6 +1081,8 @@ NONMATCH("asm/non_matching/m4a/CgbSound.inc", void CgbSound(void)) { vu8* nrx2ptr; vu8* nrx3ptr; vu8* nrx4ptr; + vu8* sp1C; + u8 sp00; // Most comparision operations that cast to s8 perform 'and' by 0xFF. int mask = 0xff; @@ -1097,7 +1092,7 @@ NONMATCH("asm/non_matching/m4a/CgbSound.inc", void CgbSound(void)) { else soundInfo->c15 = 14; - for (ch = 1, channels = soundInfo->cgbChannels; ch <= 4; ch++, channels++) { + for (ch = 1, channels = soundInfo->cgbChannels, sp1C = &sp00; ch <= 4; ch++, channels++) { if (!(channels->statusFlags & SOUND_CHANNEL_SF_ON)) continue; @@ -1109,6 +1104,7 @@ NONMATCH("asm/non_matching/m4a/CgbSound.inc", void CgbSound(void)) { nrx2ptr = (vu8*)(REG_ADDR_NR12); nrx3ptr = (vu8*)(REG_ADDR_NR13); nrx4ptr = (vu8*)(REG_ADDR_NR14); + *sp1C = 0; break; case 2: nrx0ptr = (vu8*)(REG_ADDR_NR10 + 1); @@ -1116,6 +1112,7 @@ NONMATCH("asm/non_matching/m4a/CgbSound.inc", void CgbSound(void)) { nrx2ptr = (vu8*)(REG_ADDR_NR22); nrx3ptr = (vu8*)(REG_ADDR_NR23); nrx4ptr = (vu8*)(REG_ADDR_NR24); + *sp1C = 1; break; case 3: nrx0ptr = (vu8*)(REG_ADDR_NR30); @@ -1123,6 +1120,7 @@ NONMATCH("asm/non_matching/m4a/CgbSound.inc", void CgbSound(void)) { nrx2ptr = (vu8*)(REG_ADDR_NR32); nrx3ptr = (vu8*)(REG_ADDR_NR33); nrx4ptr = (vu8*)(REG_ADDR_NR34); + *sp1C = 2; break; default: nrx0ptr = (vu8*)(REG_ADDR_NR30 + 1); @@ -1130,6 +1128,7 @@ NONMATCH("asm/non_matching/m4a/CgbSound.inc", void CgbSound(void)) { nrx2ptr = (vu8*)(REG_ADDR_NR42); nrx3ptr = (vu8*)(REG_ADDR_NR43); nrx4ptr = (vu8*)(REG_ADDR_NR44); + *sp1C = 3; break; } @@ -1187,7 +1186,7 @@ NONMATCH("asm/non_matching/m4a/CgbSound.inc", void CgbSound(void)) { } else { goto oscillator_off; } - } else if (channels->statusFlags & SOUND_CHANNEL_SF_IEC) { + } else if (channels->statusFlags & SOUND_CHANNEL_SF_IEC || !((REG_NR52 >> *sp1C) & 1)) { channels->echoLength--; if ((s8)(channels->echoLength & mask) <= 0) { oscillator_off: @@ -1291,7 +1290,7 @@ NONMATCH("asm/non_matching/m4a/CgbSound.inc", void CgbSound(void)) { if (channels->modify & CGB_CHANNEL_MO_PIT) { if (ch < 4 && (channels->type & TONEDATA_TYPE_FIX)) { int dac_pwm_rate = REG_SOUNDBIAS_H; - + asm("" ::: "r0"); if (dac_pwm_rate < 0x40) // if PWM rate = 32768 Hz channels->frequency = (channels->frequency + 2) & 0x7fc; else if (dac_pwm_rate < 0x80) // if PWM rate = 65536 Hz @@ -1302,7 +1301,7 @@ NONMATCH("asm/non_matching/m4a/CgbSound.inc", void CgbSound(void)) { *nrx3ptr = channels->frequency; else *nrx3ptr = (*nrx3ptr & 0x08) | channels->frequency; - channels->n4 = (channels->n4 & 0xC0) + (*((u8*)(&channels->frequency) + 1)); + channels->n4 = (channels->n4 & 0xC0) + ((channels->frequency & 0x3F00) >> 8); *nrx4ptr = (s8)(channels->n4 & mask); } @@ -1329,7 +1328,6 @@ NONMATCH("asm/non_matching/m4a/CgbSound.inc", void CgbSound(void)) { channels->modify = 0; } } -END_NONMATCH void m4aMPlayTempoControl(MusicPlayerInfo* mplayInfo, u16 tempo) { if (mplayInfo->ident == ID_NUMBER) {