diff --git a/Makefile b/Makefile index e17925d4..967ece49 100644 --- a/Makefile +++ b/Makefile @@ -84,6 +84,7 @@ endif #$(C_BUILDDIR)/need_interworking_file_name.o: CFLAGS += -mthumb-interwork $(C_BUILDDIR)/arm_proxy.o: CFLAGS += -mthumb-interwork +$(C_BUILDDIR)/gba/m4a.o: CFLAGS += -mthumb-interwork $(C_BUILDDIR)/eeprom.o: CFLAGS = -O1 -mthumb-interwork -Wimplicit -Wparentheses -Werror -Wno-multichar C_SRCS := $(wildcard $(C_SUBDIR)/*.c $(C_SUBDIR)/*/*.c) diff --git a/asm/code_080A3480.s b/asm/code_080A3480.s index a8e21e41..4a4030d9 100644 --- a/asm/code_080A3480.s +++ b/asm/code_080A3480.s @@ -138,8 +138,8 @@ _080A355E: ldrsh r0, [r0, r1] muls r0, r5, r0 lsrs r5, r0, #8 - ldr r2, _080A3594 @ =gUnk_08A11C3C - ldr r1, _080A3598 @ =gUnk_08A11DBC + ldr r2, _080A3594 @ =gMPlayTable + ldr r1, _080A3598 @ =gSongTable lsls r0, r3, #3 adds r0, r0, r1 ldrh r1, [r0, #4] @@ -159,8 +159,8 @@ _080A358C: pop {r4, r5, pc} .align 2, 0 _080A3590: .4byte gUnk_02021EE0 -_080A3594: .4byte gUnk_08A11C3C -_080A3598: .4byte gUnk_08A11DBC +_080A3594: .4byte gMPlayTable +_080A3598: .4byte gSongTable _080A359C: .4byte 0x0000FFFF thumb_func_start sub_080A35A0 diff --git a/asm/m4a.s b/asm/m4a.s deleted file mode 100644 index cfc629d4..00000000 --- a/asm/m4a.s +++ /dev/null @@ -1,3027 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start MidiKeyToFreq -MidiKeyToFreq: @ 0x080AFE9C - push {r4, r5, r6, r7, lr} - mov ip, r0 - lsls r1, r1, #0x18 - lsrs r6, r1, #0x18 - lsls r7, r2, #0x18 - cmp r6, #0xb2 - bls _080AFEB0 - movs r6, #0xb2 - movs r7, #0xff - lsls r7, r7, #0x18 -_080AFEB0: - ldr r3, _080AFEF8 @ =gUnk_089FC754 - adds r0, r6, r3 - ldrb r5, [r0] - ldr r4, _080AFEFC @ =gUnk_089FC808 - movs r2, #0xf - adds r0, r5, #0 - ands r0, r2 - lsls r0, r0, #2 - adds r0, r0, r4 - lsrs r1, r5, #4 - ldr r5, [r0] - lsrs r5, r1 - adds r0, r6, #1 - adds r0, r0, r3 - ldrb r1, [r0] - adds r0, r1, #0 - ands r0, r2 - lsls r0, r0, #2 - adds r0, r0, r4 - lsrs r1, r1, #4 - ldr r0, [r0] - lsrs r0, r1 - mov r1, ip - ldr r4, [r1, #4] - subs r0, r0, r5 - adds r1, r7, #0 - bl umul3232H32 - adds r1, r0, #0 - adds r1, r5, r1 - adds r0, r4, #0 - bl umul3232H32 - pop {r4, r5, r6, r7} - pop {r1} - bx r1 - .align 2, 0 -_080AFEF8: .4byte gUnk_089FC754 -_080AFEFC: .4byte gUnk_089FC808 - - thumb_func_start nullsub_543 -nullsub_543: @ 0x080AFF00 - bx lr - .align 2, 0 - - thumb_func_start MPlayContinue -MPlayContinue: @ 0x080AFF04 - push {lr} - adds r2, r0, #0 - ldr r3, [r2, #0x34] - ldr r0, _080AFF1C @ =0x68736D53 - cmp r3, r0 - bne _080AFF18 - ldr r0, [r2, #4] - ldr r1, _080AFF20 @ =0x7FFFFFFF - ands r0, r1 - str r0, [r2, #4] -_080AFF18: - pop {r0} - bx r0 - .align 2, 0 -_080AFF1C: .4byte 0x68736D53 -_080AFF20: .4byte 0x7FFFFFFF - - thumb_func_start MPlayFadeOut -MPlayFadeOut: @ 0x080AFF24 - push {lr} - adds r2, r0, #0 - lsls r1, r1, #0x10 - lsrs r1, r1, #0x10 - ldr r3, [r2, #0x34] - ldr r0, _080AFF44 @ =0x68736D53 - cmp r3, r0 - bne _080AFF3E - strh r1, [r2, #0x26] - strh r1, [r2, #0x24] - movs r0, #0x80 - lsls r0, r0, #1 - strh r0, [r2, #0x28] -_080AFF3E: - pop {r0} - bx r0 - .align 2, 0 -_080AFF44: .4byte 0x68736D53 - - thumb_func_start m4aSoundInit -m4aSoundInit: @ 0x080AFF48 - push {r4, r5, r6, lr} - ldr r0, _080AFF9C @ =SoundMainRAM - movs r1, #2 - rsbs r1, r1, #0 - ands r0, r1 - ldr r1, _080AFFA0 @ =gUnk_0300404C - ldr r2, _080AFFA4 @ =0x040000E0 - bl CpuSet - ldr r0, _080AFFA8 @ =gUnk_030043D0 - bl SoundInit - ldr r0, _080AFFAC @ =gUnk_03004DE0 - bl MPlayExtender - ldr r0, _080AFFB0 @ =0x0095F800 - bl m4aSoundMode - ldr r0, _080AFFB4 @ =0x00000020 - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - cmp r0, #0 - beq _080AFF96 - ldr r5, _080AFFB8 @ =gUnk_08A11C3C - adds r6, r0, #0 -_080AFF7A: - ldr r4, [r5] - ldr r1, [r5, #4] - ldrb r2, [r5, #8] - adds r0, r4, #0 - bl MPlayOpen - ldrh r0, [r5, #0xa] - strb r0, [r4, #0xb] - ldr r0, _080AFFBC @ =gUnk_030055E0 - str r0, [r4, #0x18] - adds r5, #0xc - subs r6, #1 - cmp r6, #0 - bne _080AFF7A -_080AFF96: - pop {r4, r5, r6} - pop {r0} - bx r0 - .align 2, 0 -_080AFF9C: .4byte SoundMainRAM -_080AFFA0: .4byte gUnk_0300404C -_080AFFA4: .4byte 0x040000E0 -_080AFFA8: .4byte gUnk_030043D0 -_080AFFAC: .4byte gUnk_03004DE0 -_080AFFB0: .4byte 0x0095F800 -_080AFFB4: .4byte 0x00000020 -_080AFFB8: .4byte gUnk_08A11C3C -_080AFFBC: .4byte gUnk_030055E0 - - thumb_func_start m4aSoundMain -m4aSoundMain: @ 0x080AFFC0 - push {lr} - bl SoundMain - pop {r0} - bx r0 - .align 2, 0 - - thumb_func_start m4aSongNumStart -m4aSongNumStart: @ 0x080AFFCC - push {lr} - lsls r0, r0, #0x10 - ldr r3, _080AFFF0 @ =gUnk_08A11C3C - ldr r1, _080AFFF4 @ =gUnk_08A11DBC - lsrs r0, r0, #0xd - adds r0, r0, r1 - ldrh r2, [r0, #4] - lsls r1, r2, #1 - adds r1, r1, r2 - lsls r1, r1, #2 - adds r1, r1, r3 - ldr r2, [r1] - ldr r1, [r0] - adds r0, r2, #0 - bl MPlayStart - pop {r0} - bx r0 - .align 2, 0 -_080AFFF0: .4byte gUnk_08A11C3C -_080AFFF4: .4byte gUnk_08A11DBC - - thumb_func_start m4aSongNumStartOrChange -m4aSongNumStartOrChange: @ 0x080AFFF8 - push {lr} - lsls r0, r0, #0x10 - ldr r3, _080B0024 @ =gUnk_08A11C3C - ldr r1, _080B0028 @ =gUnk_08A11DBC - lsrs r0, r0, #0xd - adds r0, r0, r1 - ldrh r2, [r0, #4] - lsls r1, r2, #1 - adds r1, r1, r2 - lsls r1, r1, #2 - adds r1, r1, r3 - ldr r1, [r1] - ldr r3, [r1] - ldr r2, [r0] - cmp r3, r2 - beq _080B002C - adds r0, r1, #0 - adds r1, r2, #0 - bl MPlayStart - b _080B0040 - .align 2, 0 -_080B0024: .4byte gUnk_08A11C3C -_080B0028: .4byte gUnk_08A11DBC -_080B002C: - ldr r2, [r1, #4] - ldrh r0, [r1, #4] - cmp r0, #0 - beq _080B0038 - cmp r2, #0 - bge _080B0040 -_080B0038: - adds r0, r1, #0 - adds r1, r3, #0 - bl MPlayStart -_080B0040: - pop {r0} - bx r0 - - thumb_func_start m4aSongNumStartOrContinue -m4aSongNumStartOrContinue: @ 0x080B0044 - push {lr} - lsls r0, r0, #0x10 - ldr r3, _080B0070 @ =gUnk_08A11C3C - ldr r1, _080B0074 @ =gUnk_08A11DBC - lsrs r0, r0, #0xd - adds r0, r0, r1 - ldrh r2, [r0, #4] - lsls r1, r2, #1 - adds r1, r1, r2 - lsls r1, r1, #2 - adds r1, r1, r3 - ldr r1, [r1] - ldr r3, [r1] - ldr r2, [r0] - cmp r3, r2 - beq _080B0078 - adds r0, r1, #0 - adds r1, r2, #0 - bl MPlayStart - b _080B0094 - .align 2, 0 -_080B0070: .4byte gUnk_08A11C3C -_080B0074: .4byte gUnk_08A11DBC -_080B0078: - ldr r2, [r1, #4] - ldrh r0, [r1, #4] - cmp r0, #0 - bne _080B008A - adds r0, r1, #0 - adds r1, r3, #0 - bl MPlayStart - b _080B0094 -_080B008A: - cmp r2, #0 - bge _080B0094 - adds r0, r1, #0 - bl MPlayContinue -_080B0094: - pop {r0} - bx r0 - - thumb_func_start m4aSongNumStop -m4aSongNumStop: @ 0x080B0098 - push {lr} - lsls r0, r0, #0x10 - ldr r3, _080B00C4 @ =gUnk_08A11C3C - ldr r1, _080B00C8 @ =gUnk_08A11DBC - lsrs r0, r0, #0xd - adds r0, r0, r1 - ldrh r2, [r0, #4] - lsls r1, r2, #1 - adds r1, r1, r2 - lsls r1, r1, #2 - adds r1, r1, r3 - ldr r2, [r1] - ldr r1, [r2] - ldr r0, [r0] - cmp r1, r0 - bne _080B00BE - adds r0, r2, #0 - bl MPlayStop -_080B00BE: - pop {r0} - bx r0 - .align 2, 0 -_080B00C4: .4byte gUnk_08A11C3C -_080B00C8: .4byte gUnk_08A11DBC - - thumb_func_start m4aSongNumContinue -m4aSongNumContinue: @ 0x080B00CC - push {lr} - lsls r0, r0, #0x10 - ldr r3, _080B00F8 @ =gUnk_08A11C3C - ldr r1, _080B00FC @ =gUnk_08A11DBC - lsrs r0, r0, #0xd - adds r0, r0, r1 - ldrh r2, [r0, #4] - lsls r1, r2, #1 - adds r1, r1, r2 - lsls r1, r1, #2 - adds r1, r1, r3 - ldr r2, [r1] - ldr r1, [r2] - ldr r0, [r0] - cmp r1, r0 - bne _080B00F2 - adds r0, r2, #0 - bl MPlayContinue -_080B00F2: - pop {r0} - bx r0 - .align 2, 0 -_080B00F8: .4byte gUnk_08A11C3C -_080B00FC: .4byte gUnk_08A11DBC - - thumb_func_start m4aMPlayAllStop -m4aMPlayAllStop: @ 0x080B0100 - push {r4, r5, lr} - ldr r0, _080B0124 @ =0x00000020 - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - cmp r0, #0 - beq _080B011E - ldr r5, _080B0128 @ =gUnk_08A11C3C - adds r4, r0, #0 -_080B0110: - ldr r0, [r5] - bl MPlayStop - adds r5, #0xc - subs r4, #1 - cmp r4, #0 - bne _080B0110 -_080B011E: - pop {r4, r5} - pop {r0} - bx r0 - .align 2, 0 -_080B0124: .4byte 0x00000020 -_080B0128: .4byte gUnk_08A11C3C - - thumb_func_start m4aMPlayContinue -m4aMPlayContinue: @ 0x080B012C - push {lr} - bl MPlayContinue - pop {r0} - bx r0 - .align 2, 0 - - thumb_func_start m4aMPlayAllContinue -m4aMPlayAllContinue: @ 0x080B0138 - push {r4, r5, lr} - ldr r0, _080B015C @ =0x00000020 - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - cmp r0, #0 - beq _080B0156 - ldr r5, _080B0160 @ =gUnk_08A11C3C - adds r4, r0, #0 -_080B0148: - ldr r0, [r5] - bl MPlayContinue - adds r5, #0xc - subs r4, #1 - cmp r4, #0 - bne _080B0148 -_080B0156: - pop {r4, r5} - pop {r0} - bx r0 - .align 2, 0 -_080B015C: .4byte 0x00000020 -_080B0160: .4byte gUnk_08A11C3C - - thumb_func_start m4aMPlayFadeOut -m4aMPlayFadeOut: @ 0x080B0164 - push {lr} - lsls r1, r1, #0x10 - lsrs r1, r1, #0x10 - bl MPlayFadeOut - pop {r0} - bx r0 - .align 2, 0 - - thumb_func_start m4aMPlayFadeOutTemporarily -m4aMPlayFadeOutTemporarily: @ 0x080B0174 - push {lr} - adds r2, r0, #0 - lsls r1, r1, #0x10 - lsrs r1, r1, #0x10 - ldr r3, [r2, #0x34] - ldr r0, _080B0190 @ =0x68736D53 - cmp r3, r0 - bne _080B018C - strh r1, [r2, #0x26] - strh r1, [r2, #0x24] - ldr r0, _080B0194 @ =0x00000101 - strh r0, [r2, #0x28] -_080B018C: - pop {r0} - bx r0 - .align 2, 0 -_080B0190: .4byte 0x68736D53 -_080B0194: .4byte 0x00000101 - - thumb_func_start m4aMPlayFadeIn -m4aMPlayFadeIn: @ 0x080B0198 - push {lr} - adds r2, r0, #0 - lsls r1, r1, #0x10 - lsrs r1, r1, #0x10 - ldr r3, [r2, #0x34] - ldr r0, _080B01BC @ =0x68736D53 - cmp r3, r0 - bne _080B01B8 - strh r1, [r2, #0x26] - strh r1, [r2, #0x24] - movs r0, #2 - strh r0, [r2, #0x28] - ldr r0, [r2, #4] - ldr r1, _080B01C0 @ =0x7FFFFFFF - ands r0, r1 - str r0, [r2, #4] -_080B01B8: - pop {r0} - bx r0 - .align 2, 0 -_080B01BC: .4byte 0x68736D53 -_080B01C0: .4byte 0x7FFFFFFF - - thumb_func_start m4aMPlayImmInit -m4aMPlayImmInit: @ 0x080B01C4 - 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 - - thumb_func_start MPlayExtender -MPlayExtender: @ 0x080B022C - push {r4, r5, r6, lr} - sub sp, #4 - adds r5, r0, #0 - ldr r1, _080B02F4 @ =0x04000084 - movs r0, #0x8f - strh r0, [r1] - ldr r3, _080B02F8 @ =0x04000080 - movs r2, #0 - strh r2, [r3] - ldr r0, _080B02FC @ =0x04000063 - movs r1, #8 - strb r1, [r0] - adds r0, #6 - strb r1, [r0] - adds r0, #0x10 - strb r1, [r0] - subs r0, #0x14 - movs r1, #0x80 - strb r1, [r0] - adds r0, #8 - strb r1, [r0] - adds r0, #0x10 - strb r1, [r0] - subs r0, #0xd - strb r2, [r0] - movs r0, #0x77 - strb r0, [r3] - ldr r0, _080B0300 @ =0x03007FF0 - ldr r4, [r0] - ldr r6, [r4] - ldr r0, _080B0304 @ =0x68736D53 - cmp r6, r0 - bne _080B02EC - adds r0, r6, #1 - str r0, [r4] - ldr r1, _080B0308 @ =gUnk_03004D50 - ldr r0, _080B030C @ =ply_memacc - str r0, [r1, #0x20] - ldr r0, _080B0310 @ =ply_lfos - str r0, [r1, #0x44] - ldr r0, _080B0314 @ =ply_mod - str r0, [r1, #0x4c] - ldr r0, _080B0318 @ =ply_xcmd - str r0, [r1, #0x70] - ldr r0, _080B031C @ =ply_endtie - str r0, [r1, #0x74] - ldr r0, _080B0320 @ =SampleFreqSet - str r0, [r1, #0x78] - ldr r0, _080B0324 @ =TrackStop - str r0, [r1, #0x7c] - adds r2, r1, #0 - adds r2, #0x80 - ldr r0, _080B0328 @ =FadeOutBody - str r0, [r2] - adds r1, #0x84 - ldr r0, _080B032C @ =TrkVolPitSet - str r0, [r1] - str r5, [r4, #0x1c] - ldr r0, _080B0330 @ =CgbSound - str r0, [r4, #0x28] - ldr r0, _080B0334 @ =CgbOscOff - str r0, [r4, #0x2c] - ldr r0, _080B0338 @ =MidiKeyToCgbFreq - str r0, [r4, #0x30] - ldr r0, _080B033C @ =0x00000000 - movs r1, #0 - strb r0, [r4, #0xc] - str r1, [sp] - ldr r2, _080B0340 @ =0x05000040 - mov r0, sp - adds r1, r5, #0 - bl CpuSet - movs r0, #1 - strb r0, [r5, #1] - movs r0, #0x11 - strb r0, [r5, #0x1c] - adds r1, r5, #0 - adds r1, #0x41 - movs r0, #2 - strb r0, [r1] - adds r1, #0x1b - movs r0, #0x22 - strb r0, [r1] - adds r1, #0x25 - movs r0, #3 - strb r0, [r1] - adds r1, #0x1b - movs r0, #0x44 - strb r0, [r1] - adds r1, #0x24 - movs r0, #4 - strb r0, [r1, #1] - movs r0, #0x88 - strb r0, [r1, #0x1c] - str r6, [r4] -_080B02EC: - add sp, #4 - pop {r4, r5, r6} - pop {r0} - bx r0 - .align 2, 0 -_080B02F4: .4byte 0x04000084 -_080B02F8: .4byte 0x04000080 -_080B02FC: .4byte 0x04000063 -_080B0300: .4byte 0x03007FF0 -_080B0304: .4byte 0x68736D53 -_080B0308: .4byte gUnk_03004D50 -_080B030C: .4byte ply_memacc -_080B0310: .4byte ply_lfos -_080B0314: .4byte ply_mod -_080B0318: .4byte ply_xcmd -_080B031C: .4byte ply_endtie -_080B0320: .4byte SampleFreqSet -_080B0324: .4byte TrackStop -_080B0328: .4byte FadeOutBody -_080B032C: .4byte TrkVolPitSet -_080B0330: .4byte CgbSound -_080B0334: .4byte CgbOscOff -_080B0338: .4byte MidiKeyToCgbFreq -_080B033C: .4byte 0x00000000 -_080B0340: .4byte 0x05000040 - - thumb_func_start MusicPlayerJumpTableCopy -MusicPlayerJumpTableCopy: @ 0x080B0344 - svc #0x2a - bx lr - - thumb_func_start ClearChain -ClearChain: @ 0x080B0348 - push {lr} - ldr r1, _080B0358 @ =gUnk_03004DD8 - ldr r1, [r1] - bl _call_via_r1 - pop {r0} - bx r0 - .align 2, 0 -_080B0358: .4byte gUnk_03004DD8 - - thumb_func_start Clear64byte -Clear64byte: @ 0x080B035C - push {lr} - ldr r1, _080B036C @ =gUnk_03004DDC - ldr r1, [r1] - bl _call_via_r1 - pop {r0} - bx r0 - .align 2, 0 -_080B036C: .4byte gUnk_03004DDC - - thumb_func_start SoundInit -SoundInit: @ 0x080B0370 - push {r4, r5, lr} - sub sp, #4 - adds r5, r0, #0 - movs r3, #0 - str r3, [r5] - ldr r2, _080B0408 @ =0x040000C4 - ldr r0, [r2] - movs r1, #0x80 - lsls r1, r1, #0x12 - ands r0, r1 - cmp r0, #0 - beq _080B038C - ldr r0, _080B040C @ =0x84400004 - str r0, [r2] -_080B038C: - ldr r1, _080B0410 @ =0x040000C6 - movs r2, #0x80 - lsls r2, r2, #3 - adds r0, r2, #0 - strh r0, [r1] - subs r1, #0x42 - movs r0, #0x8f - strh r0, [r1] - subs r1, #2 - ldr r2, _080B0414 @ =0x00000B0E - adds r0, r2, #0 - strh r0, [r1] - ldr r2, _080B0418 @ =0x04000089 - ldrb r1, [r2] - movs r0, #0x3f - ands r0, r1 - movs r1, #0x40 - orrs r0, r1 - strb r0, [r2] - ldr r1, _080B041C @ =0x040000BC - movs r2, #0xd4 - lsls r2, r2, #2 - adds r0, r5, r2 - str r0, [r1] - adds r1, #4 - ldr r0, _080B0420 @ =0x040000A0 - str r0, [r1] - ldr r0, _080B0424 @ =0x03007FF0 - str r5, [r0] - str r3, [sp] - ldr r2, _080B0428 @ =0x05000260 - mov r0, sp - adds r1, r5, #0 - bl CpuSet - movs r0, #8 - strb r0, [r5, #6] - movs r0, #0xf - strb r0, [r5, #7] - ldr r0, _080B042C @ =ply_note - str r0, [r5, #0x38] - ldr r0, _080B0430 @ =nullsub_544 - str r0, [r5, #0x28] - str r0, [r5, #0x2c] - str r0, [r5, #0x30] - str r0, [r5, #0x3c] - ldr r4, _080B0434 @ =gUnk_03004D50 - adds r0, r4, #0 - bl MPlayJumpTableCopy - str r4, [r5, #0x34] - movs r0, #0x80 - lsls r0, r0, #0xb - bl SampleFreqSet - ldr r0, _080B0438 @ =0x68736D53 - str r0, [r5] - add sp, #4 - pop {r4, r5} - pop {r0} - bx r0 - .align 2, 0 -_080B0408: .4byte 0x040000C4 -_080B040C: .4byte 0x84400004 -_080B0410: .4byte 0x040000C6 -_080B0414: .4byte 0x00000B0E -_080B0418: .4byte 0x04000089 -_080B041C: .4byte 0x040000BC -_080B0420: .4byte 0x040000A0 -_080B0424: .4byte 0x03007FF0 -_080B0428: .4byte 0x05000260 -_080B042C: .4byte ply_note -_080B0430: .4byte nullsub_544 -_080B0434: .4byte gUnk_03004D50 -_080B0438: .4byte 0x68736D53 - - thumb_func_start SampleFreqSet -SampleFreqSet: @ 0x080B043C - push {r4, r5, lr} - adds r4, r0, #0 - bl m4aSoundVSyncOff - ldr r0, _080B0494 @ =0x03007FF0 - ldr r5, [r0] - movs r0, #0xf0 - lsls r0, r0, #0xc - ands r0, r4 - lsrs r4, r0, #0x10 - strb r4, [r5, #8] - ldr r1, _080B0498 @ =gUnk_089FC838 - subs r0, r4, #1 - lsls r0, r0, #1 - adds r0, r0, r1 - ldrh r4, [r0] - str r4, [r5, #0x10] - movs r0, #0xc6 - lsls r0, r0, #3 - adds r1, r4, #0 - bl __divsi3 - strb r0, [r5, #0xb] - ldr r0, _080B049C @ =0x00091D1B - muls r0, r4, r0 - ldr r1, _080B04A0 @ =0x00001388 - adds r0, r0, r1 - ldr r1, _080B04A4 @ =0x00002710 - bl __divsi3 - adds r1, r0, #0 - str r1, [r5, #0x14] - movs r0, #0x80 - lsls r0, r0, #0x11 - bl __divsi3 - adds r0, #1 - asrs r0, r0, #1 - str r0, [r5, #0x18] - bl m4aSoundVSyncOn - pop {r4, r5} - pop {r0} - bx r0 - .align 2, 0 -_080B0494: .4byte 0x03007FF0 -_080B0498: .4byte gUnk_089FC838 -_080B049C: .4byte 0x00091D1B -_080B04A0: .4byte 0x00001388 -_080B04A4: .4byte 0x00002710 - - thumb_func_start m4aSoundMode -m4aSoundMode: @ 0x080B04A8 - push {r4, r5, lr} - adds r5, r0, #0 - ldr r0, _080B0530 @ =0x03007FF0 - ldr r4, [r0] - ldr r1, [r4] - ldr r0, _080B0534 @ =0x68736D53 - cmp r1, r0 - bne _080B052A - adds r0, r1, #1 - str r0, [r4] - movs r3, #0xff - ands r3, r5 - cmp r3, #0 - beq _080B04CA - movs r0, #0x7f - ands r3, r0 - strb r3, [r4, #5] -_080B04CA: - movs r3, #0xf0 - lsls r3, r3, #4 - ands r3, r5 - cmp r3, #0 - beq _080B04EA - lsrs r0, r3, #8 - strb r0, [r4, #6] - movs r3, #0xc - adds r0, r4, #0 - adds r0, #0x50 - movs r1, #0 -_080B04E0: - strb r1, [r0] - subs r3, #1 - adds r0, #0x40 - cmp r3, #0 - bne _080B04E0 -_080B04EA: - movs r3, #0xf0 - lsls r3, r3, #8 - ands r3, r5 - cmp r3, #0 - beq _080B04F8 - lsrs r0, r3, #0xc - strb r0, [r4, #7] -_080B04F8: - movs r3, #0xb0 - lsls r3, r3, #0x10 - ands r3, r5 - cmp r3, #0 - beq _080B0516 - movs r0, #0xc0 - lsls r0, r0, #0xe - ands r0, r3 - lsrs r3, r0, #0xe - ldr r2, _080B0538 @ =0x04000089 - ldrb r1, [r2] - movs r0, #0x3f - ands r0, r1 - orrs r0, r3 - strb r0, [r2] -_080B0516: - movs r3, #0xf0 - lsls r3, r3, #0xc - ands r3, r5 - cmp r3, #0 - beq _080B0526 - adds r0, r3, #0 - bl SampleFreqSet -_080B0526: - ldr r0, _080B0534 @ =0x68736D53 - str r0, [r4] -_080B052A: - pop {r4, r5} - pop {r0} - bx r0 - .align 2, 0 -_080B0530: .4byte 0x03007FF0 -_080B0534: .4byte 0x68736D53 -_080B0538: .4byte 0x04000089 - - thumb_func_start SoundClear -SoundClear: @ 0x080B053C - push {r4, r5, r6, r7, lr} - ldr r0, _080B0588 @ =0x03007FF0 - ldr r6, [r0] - ldr r1, [r6] - ldr r0, _080B058C @ =0x68736D53 - cmp r1, r0 - bne _080B0582 - adds r0, r1, #1 - str r0, [r6] - movs r5, #0xc - adds r4, r6, #0 - adds r4, #0x50 - movs r0, #0 -_080B0556: - strb r0, [r4] - subs r5, #1 - adds r4, #0x40 - cmp r5, #0 - bgt _080B0556 - ldr r4, [r6, #0x1c] - cmp r4, #0 - beq _080B057E - movs r5, #1 - movs r7, #0 -_080B056A: - lsls r0, r5, #0x18 - lsrs r0, r0, #0x18 - ldr r1, [r6, #0x2c] - bl _call_via_r1 - strb r7, [r4] - adds r5, #1 - adds r4, #0x40 - cmp r5, #4 - ble _080B056A -_080B057E: - ldr r0, _080B058C @ =0x68736D53 - str r0, [r6] -_080B0582: - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_080B0588: .4byte 0x03007FF0 -_080B058C: .4byte 0x68736D53 - - thumb_func_start m4aSoundVSyncOff -m4aSoundVSyncOff: @ 0x080B0590 - 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 - - thumb_func_start m4aSoundVSyncOn -m4aSoundVSyncOn: @ 0x080B0600 - 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 - - thumb_func_start m4aSoundVSync -m4aSoundVSync: @ 0x080B0674 - 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 - - thumb_func_start MPlayOpen -MPlayOpen: @ 0x080B06D8 - push {r4, r5, r6, r7, lr} - adds r7, r0, #0 - adds r6, r1, #0 - lsls r2, r2, #0x18 - lsrs r4, r2, #0x18 - cmp r4, #0 - beq _080B073C - cmp r4, #0x10 - bls _080B06EC - movs r4, #0x10 -_080B06EC: - ldr r0, _080B0744 @ =0x03007FF0 - ldr r5, [r0] - ldr r1, [r5] - ldr r0, _080B0748 @ =0x68736D53 - cmp r1, r0 - bne _080B073C - adds r0, r1, #1 - str r0, [r5] - adds r0, r7, #0 - bl Clear64byte - str r6, [r7, #0x2c] - strb r4, [r7, #8] - movs r0, #0x80 - lsls r0, r0, #0x18 - str r0, [r7, #4] - cmp r4, #0 - beq _080B0720 - movs r1, #0 -_080B0712: - strb r1, [r6] - subs r0, r4, #1 - lsls r0, r0, #0x18 - lsrs r4, r0, #0x18 - adds r6, #0x50 - cmp r4, #0 - bne _080B0712 -_080B0720: - ldr r0, [r5, #0x20] - cmp r0, #0 - beq _080B0730 - str r0, [r7, #0x38] - ldr r0, [r5, #0x24] - str r0, [r7, #0x3c] - movs r0, #0 - str r0, [r5, #0x20] -_080B0730: - str r7, [r5, #0x24] - ldr r0, _080B074C @ =MPlayMain - str r0, [r5, #0x20] - ldr r0, _080B0748 @ =0x68736D53 - str r0, [r5] - str r0, [r7, #0x34] -_080B073C: - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_080B0744: .4byte 0x03007FF0 -_080B0748: .4byte 0x68736D53 -_080B074C: .4byte MPlayMain - - thumb_func_start MPlayStart -MPlayStart: @ 0x080B0750 - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - adds r5, r0, #0 - adds r7, r1, #0 - ldr r1, [r5, #0x34] - ldr r0, _080B0830 @ =0x68736D53 - cmp r1, r0 - bne _080B0824 - adds r0, r1, #1 - str r0, [r5, #0x34] - ldrb r0, [r5, #0xb] - ldrb r2, [r7, #2] - cmp r0, #0 - beq _080B0796 - ldr r0, [r5] - cmp r0, #0 - beq _080B0780 - ldr r0, [r5, #0x2c] - ldrb r1, [r0] - movs r0, #0x40 - ands r0, r1 - cmp r0, #0 - bne _080B078C -_080B0780: - ldr r1, [r5, #4] - ldrh r0, [r5, #4] - cmp r0, #0 - beq _080B0796 - cmp r1, #0 - blt _080B0796 -_080B078C: - ldrb r0, [r7, #2] - ldrb r1, [r5, #9] - adds r2, r0, #0 - cmp r1, r2 - bhi _080B0820 -_080B0796: - movs r1, #0 - str r1, [r5, #4] - str r7, [r5] - ldr r0, [r7, #4] - str r0, [r5, #0x30] - strb r2, [r5, #9] - str r1, [r5, #0xc] - movs r0, #0x96 - strh r0, [r5, #0x1c] - strh r0, [r5, #0x20] - adds r0, #0x6a - strh r0, [r5, #0x1e] - strh r1, [r5, #0x22] - strh r1, [r5, #0x24] - movs r6, #0 - ldr r4, [r5, #0x2c] - ldrb r0, [r7] - cmp r6, r0 - bge _080B07F0 - ldrb r0, [r5, #8] - cmp r6, r0 - bge _080B0810 - mov r8, r6 -_080B07C4: - adds r0, r5, #0 - adds r1, r4, #0 - bl TrackStop - movs r0, #0xc0 - strb r0, [r4] - mov r0, r8 - str r0, [r4, #0x20] - lsls r1, r6, #2 - adds r0, r7, #0 - adds r0, #8 - adds r0, r0, r1 - ldr r0, [r0] - str r0, [r4, #0x40] - adds r6, #1 - adds r4, #0x50 - ldrb r0, [r7] - cmp r6, r0 - bge _080B07F0 - ldrb r0, [r5, #8] - cmp r6, r0 - blt _080B07C4 -_080B07F0: - ldrb r0, [r5, #8] - cmp r6, r0 - bge _080B0810 - movs r0, #0 - mov r8, r0 -_080B07FA: - adds r0, r5, #0 - adds r1, r4, #0 - bl TrackStop - mov r0, r8 - strb r0, [r4] - adds r6, #1 - adds r4, #0x50 - ldrb r0, [r5, #8] - cmp r6, r0 - blt _080B07FA -_080B0810: - ldrb r1, [r7, #3] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _080B0820 - ldrb r0, [r7, #3] - bl m4aSoundMode -_080B0820: - ldr r0, _080B0830 @ =0x68736D53 - str r0, [r5, #0x34] -_080B0824: - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_080B0830: .4byte 0x68736D53 - - thumb_func_start MPlayStop -MPlayStop: @ 0x080B0834 - push {r4, r5, r6, lr} - adds r6, r0, #0 - ldr r1, [r6, #0x34] - ldr r0, _080B0870 @ =0x68736D53 - cmp r1, r0 - bne _080B086A - adds r0, r1, #1 - str r0, [r6, #0x34] - ldr r0, [r6, #4] - movs r1, #0x80 - lsls r1, r1, #0x18 - orrs r0, r1 - str r0, [r6, #4] - ldrb r4, [r6, #8] - ldr r5, [r6, #0x2c] - cmp r4, #0 - ble _080B0866 -_080B0856: - adds r0, r6, #0 - adds r1, r5, #0 - bl TrackStop - subs r4, #1 - adds r5, #0x50 - cmp r4, #0 - bgt _080B0856 -_080B0866: - ldr r0, _080B0870 @ =0x68736D53 - str r0, [r6, #0x34] -_080B086A: - pop {r4, r5, r6} - pop {r0} - bx r0 - .align 2, 0 -_080B0870: .4byte 0x68736D53 - - thumb_func_start FadeOutBody -FadeOutBody: @ 0x080B0874 - push {r4, r5, r6, r7, lr} - adds r6, r0, #0 - ldrh r1, [r6, #0x24] - cmp r1, #0 - beq _080B0936 - ldrh r0, [r6, #0x26] - subs r0, #1 - strh r0, [r6, #0x26] - ldr r3, _080B08B4 @ =0x0000FFFF - adds r2, r3, #0 - lsls r0, r0, #0x10 - lsrs r3, r0, #0x10 - cmp r3, #0 - bne _080B0936 - strh r1, [r6, #0x26] - ldrh r1, [r6, #0x28] - movs r0, #2 - ands r0, r1 - cmp r0, #0 - beq _080B08B8 - adds r0, r1, #0 - adds r0, #0x10 - strh r0, [r6, #0x28] - ands r0, r2 - cmp r0, #0xff - bls _080B090A - movs r0, #0x80 - lsls r0, r0, #1 - strh r0, [r6, #0x28] - strh r3, [r6, #0x24] - b _080B090A - .align 2, 0 -_080B08B4: .4byte 0x0000FFFF -_080B08B8: - adds r0, r1, #0 - subs r0, #0x10 - strh r0, [r6, #0x28] - ands r0, r2 - lsls r0, r0, #0x10 - cmp r0, #0 - bgt _080B090A - ldrb r5, [r6, #8] - ldr r4, [r6, #0x2c] - cmp r5, #0 - ble _080B08EA -_080B08CE: - adds r0, r6, #0 - adds r1, r4, #0 - bl TrackStop - ldrh r0, [r6, #0x28] - movs r1, #1 - ands r1, r0 - cmp r1, #0 - bne _080B08E2 - strb r1, [r4] -_080B08E2: - subs r5, #1 - adds r4, #0x50 - cmp r5, #0 - bgt _080B08CE -_080B08EA: - ldrh r1, [r6, #0x28] - movs r0, #1 - ands r0, r1 - cmp r0, #0 - beq _080B08FE - ldr r0, [r6, #4] - movs r1, #0x80 - lsls r1, r1, #0x18 - orrs r0, r1 - b _080B0902 -_080B08FE: - movs r0, #0x80 - lsls r0, r0, #0x18 -_080B0902: - str r0, [r6, #4] - movs r0, #0 - strh r0, [r6, #0x24] - b _080B0936 -_080B090A: - ldrb r5, [r6, #8] - ldr r4, [r6, #0x2c] - cmp r5, #0 - ble _080B0936 - movs r3, #0x80 - movs r7, #0 - movs r2, #3 -_080B0918: - ldrb r1, [r4] - adds r0, r3, #0 - ands r0, r1 - cmp r0, #0 - beq _080B092E - ldrh r0, [r6, #0x28] - lsrs r0, r0, #2 - strb r0, [r4, #0x13] - adds r0, r1, #0 - orrs r0, r2 - strb r0, [r4] -_080B092E: - subs r5, #1 - adds r4, #0x50 - cmp r5, #0 - bgt _080B0918 -_080B0936: - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - - thumb_func_start TrkVolPitSet -TrkVolPitSet: @ 0x080B093C - push {r4, lr} - adds r2, r1, #0 - ldrb r1, [r2] - movs r0, #1 - ands r0, r1 - cmp r0, #0 - beq _080B099E - ldrb r0, [r2, #0x12] - ldrb r1, [r2, #0x13] - muls r0, r1, r0 - lsrs r3, r0, #5 - ldrb r4, [r2, #0x18] - cmp r4, #1 - bne _080B0962 - movs r0, #0x16 - ldrsb r0, [r2, r0] - adds r0, #0x80 - muls r0, r3, r0 - lsrs r3, r0, #7 -_080B0962: - movs r0, #0x14 - ldrsb r0, [r2, r0] - lsls r0, r0, #1 - movs r1, #0x15 - ldrsb r1, [r2, r1] - adds r1, r0, r1 - cmp r4, #2 - bne _080B0978 - movs r0, #0x16 - ldrsb r0, [r2, r0] - adds r1, r1, r0 -_080B0978: - movs r0, #0x80 - rsbs r0, r0, #0 - cmp r1, r0 - bge _080B0984 - adds r1, r0, #0 - b _080B098A -_080B0984: - cmp r1, #0x7f - ble _080B098A - movs r1, #0x7f -_080B098A: - adds r0, r1, #0 - adds r0, #0x80 - muls r0, r3, r0 - lsrs r0, r0, #8 - strb r0, [r2, #0x10] - movs r0, #0x7f - subs r0, r0, r1 - muls r0, r3, r0 - lsrs r0, r0, #8 - strb r0, [r2, #0x11] -_080B099E: - ldrb r1, [r2] - movs r0, #4 - ands r0, r1 - adds r3, r1, #0 - cmp r0, #0 - beq _080B09E2 - movs r1, #0xe - ldrsb r1, [r2, r1] - ldrb r0, [r2, #0xf] - muls r0, r1, r0 - movs r1, #0xc - ldrsb r1, [r2, r1] - adds r1, r1, r0 - lsls r1, r1, #2 - movs r0, #0xa - ldrsb r0, [r2, r0] - lsls r0, r0, #8 - adds r1, r1, r0 - movs r0, #0xb - ldrsb r0, [r2, r0] - lsls r0, r0, #8 - adds r1, r1, r0 - ldrb r0, [r2, #0xd] - adds r1, r1, r0 - ldrb r0, [r2, #0x18] - cmp r0, #0 - bne _080B09DC - movs r0, #0x16 - ldrsb r0, [r2, r0] - lsls r0, r0, #4 - adds r1, r1, r0 -_080B09DC: - asrs r0, r1, #8 - strb r0, [r2, #8] - strb r1, [r2, #9] -_080B09E2: - movs r0, #0xfa - ands r0, r3 - strb r0, [r2] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 - - thumb_func_start MidiKeyToCgbFreq -MidiKeyToCgbFreq: @ 0x080B09F0 - push {r4, r5, r6, r7, lr} - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - lsls r1, r1, #0x18 - lsrs r5, r1, #0x18 - lsls r2, r2, #0x18 - lsrs r2, r2, #0x18 - mov ip, r2 - cmp r0, #4 - bne _080B0A28 - cmp r5, #0x14 - bhi _080B0A0C - movs r5, #0 - b _080B0A1A -_080B0A0C: - adds r0, r5, #0 - subs r0, #0x15 - lsls r0, r0, #0x18 - lsrs r5, r0, #0x18 - cmp r5, #0x3b - bls _080B0A1A - movs r5, #0x3b -_080B0A1A: - ldr r0, _080B0A24 @ =gUnk_089FC8EC - adds r0, r5, r0 - ldrb r0, [r0] - b _080B0A8A - .align 2, 0 -_080B0A24: .4byte gUnk_089FC8EC -_080B0A28: - cmp r5, #0x23 - bhi _080B0A34 - movs r0, #0 - mov ip, r0 - movs r5, #0 - b _080B0A46 -_080B0A34: - adds r0, r5, #0 - subs r0, #0x24 - lsls r0, r0, #0x18 - lsrs r5, r0, #0x18 - cmp r5, #0x82 - bls _080B0A46 - movs r5, #0x82 - movs r1, #0xff - mov ip, r1 -_080B0A46: - ldr r3, _080B0A90 @ =gUnk_089FC850 - adds r0, r5, r3 - ldrb r6, [r0] - ldr r4, _080B0A94 @ =gUnk_089FC8D4 - movs r2, #0xf - adds r0, r6, #0 - ands r0, r2 - lsls r0, r0, #1 - adds r0, r0, r4 - movs r7, #0 - ldrsh r1, [r0, r7] - asrs r0, r6, #4 - adds r6, r1, #0 - asrs r6, r0 - adds r0, r5, #1 - adds r0, r0, r3 - ldrb r1, [r0] - adds r0, r1, #0 - ands r0, r2 - lsls r0, r0, #1 - adds r0, r0, r4 - movs r2, #0 - ldrsh r0, [r0, r2] - asrs r1, r1, #4 - asrs r0, r1 - subs r0, r0, r6 - mov r7, ip - muls r7, r0, r7 - adds r0, r7, #0 - asrs r0, r0, #8 - adds r0, r6, r0 - movs r1, #0x80 - lsls r1, r1, #4 - adds r0, r0, r1 -_080B0A8A: - pop {r4, r5, r6, r7} - pop {r1} - bx r1 - .align 2, 0 -_080B0A90: .4byte gUnk_089FC850 -_080B0A94: .4byte gUnk_089FC8D4 - - thumb_func_start CgbOscOff -CgbOscOff: @ 0x080B0A98 - push {lr} - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - adds r1, r0, #0 - cmp r0, #2 - beq _080B0AC4 - cmp r0, #2 - bgt _080B0AAE - cmp r0, #1 - beq _080B0AB4 - b _080B0AD8 -_080B0AAE: - cmp r1, #3 - beq _080B0ACC - b _080B0AD8 -_080B0AB4: - ldr r1, _080B0AC0 @ =0x04000063 - movs r0, #8 - strb r0, [r1] - adds r1, #2 - b _080B0AE0 - .align 2, 0 -_080B0AC0: .4byte 0x04000063 -_080B0AC4: - ldr r1, _080B0AC8 @ =0x04000069 - b _080B0ADA - .align 2, 0 -_080B0AC8: .4byte 0x04000069 -_080B0ACC: - ldr r1, _080B0AD4 @ =0x04000070 - movs r0, #0 - b _080B0AE2 - .align 2, 0 -_080B0AD4: .4byte 0x04000070 -_080B0AD8: - ldr r1, _080B0AE8 @ =0x04000079 -_080B0ADA: - movs r0, #8 - strb r0, [r1] - adds r1, #4 -_080B0AE0: - movs r0, #0x80 -_080B0AE2: - strb r0, [r1] - pop {r0} - bx r0 - .align 2, 0 -_080B0AE8: .4byte 0x04000079 - - thumb_func_start CgbModVol -CgbModVol: @ 0x080B0AEC - push {r4, lr} - adds r2, r0, #0 - ldrb r0, [r2, #2] - ldrb r1, [r2, #3] - lsls r3, r0, #0x18 - lsrs r4, r3, #0x18 - lsls r0, r1, #0x18 - lsrs r1, r0, #0x18 - cmp r4, r1 - blo _080B0B0C - lsrs r0, r3, #0x19 - cmp r0, r1 - blo _080B0B18 - movs r0, #0xf - strb r0, [r2, #0x1b] - b _080B0B26 -_080B0B0C: - lsrs r0, r0, #0x19 - cmp r0, r4 - blo _080B0B18 - movs r0, #0xf0 - strb r0, [r2, #0x1b] - b _080B0B26 -_080B0B18: - movs r0, #0xff - strb r0, [r2, #0x1b] - ldrb r0, [r2, #2] - ldrb r1, [r2, #3] - adds r0, r0, r1 - lsrs r0, r0, #4 - b _080B0B36 -_080B0B26: - ldrb r0, [r2, #2] - ldrb r1, [r2, #3] - adds r0, r0, r1 - lsrs r0, r0, #4 - strb r0, [r2, #0xa] - cmp r0, #0xf - bls _080B0B38 - movs r0, #0xf -_080B0B36: - strb r0, [r2, #0xa] -_080B0B38: - ldrb r1, [r2, #0xa] - ldrb r0, [r2, #6] - muls r0, r1, r0 - adds r0, #0xf - asrs r0, r0, #4 - strb r0, [r2, #0x19] - ldrb r1, [r2, #0x1b] - ldrb r0, [r2, #0x1c] - ands r0, r1 - strb r0, [r2, #0x1b] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 - - thumb_func_start CgbSound -CgbSound: @ 0x080B0B54 - 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 @ =gUnk_089FC928 - 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 gUnk_089FC928 -_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 - - thumb_func_start m4aMPlayTempoControl -m4aMPlayTempoControl: @ 0x080B0FD4 - push {lr} - adds r2, r0, #0 - lsls r1, r1, #0x10 - lsrs r1, r1, #0x10 - ldr r3, [r2, #0x34] - ldr r0, _080B0FF4 @ =0x68736D53 - cmp r3, r0 - bne _080B0FF0 - strh r1, [r2, #0x1e] - ldrh r1, [r2, #0x1c] - ldrh r0, [r2, #0x1e] - muls r0, r1, r0 - asrs r0, r0, #8 - strh r0, [r2, #0x20] -_080B0FF0: - pop {r0} - bx r0 - .align 2, 0 -_080B0FF4: .4byte 0x68736D53 - - thumb_func_start m4aMPlayVolumeControl -m4aMPlayVolumeControl: @ 0x080B0FF8 - push {r4, r5, r6, r7, lr} - mov r7, sb - mov r6, r8 - push {r6, r7} - adds r4, r0, #0 - lsls r1, r1, #0x10 - lsrs r7, r1, #0x10 - lsls r6, r2, #0x10 - ldr r3, [r4, #0x34] - ldr r0, _080B105C @ =0x68736D53 - cmp r3, r0 - bne _080B1050 - adds r0, r3, #1 - str r0, [r4, #0x34] - ldrb r2, [r4, #8] - ldr r1, [r4, #0x2c] - movs r5, #1 - cmp r2, #0 - ble _080B104C - movs r0, #0x80 - mov r8, r0 - lsrs r6, r6, #0x12 - movs r0, #3 - mov ip, r0 -_080B1028: - adds r0, r7, #0 - ands r0, r5 - cmp r0, #0 - beq _080B1042 - ldrb r3, [r1] - mov r0, r8 - ands r0, r3 - cmp r0, #0 - beq _080B1042 - strb r6, [r1, #0x13] - mov r0, ip - orrs r0, r3 - strb r0, [r1] -_080B1042: - subs r2, #1 - adds r1, #0x50 - lsls r5, r5, #1 - cmp r2, #0 - bgt _080B1028 -_080B104C: - ldr r0, _080B105C @ =0x68736D53 - str r0, [r4, #0x34] -_080B1050: - pop {r3, r4} - mov r8, r3 - mov sb, r4 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_080B105C: .4byte 0x68736D53 - - thumb_func_start m4aMPlayPitchControl -m4aMPlayPitchControl: @ 0x080B1060 - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - adds r4, r0, #0 - lsls r1, r1, #0x10 - lsrs r1, r1, #0x10 - mov ip, r1 - lsls r2, r2, #0x10 - lsrs r6, r2, #0x10 - ldr r3, [r4, #0x34] - ldr r0, _080B10D0 @ =0x68736D53 - cmp r3, r0 - bne _080B10C2 - adds r0, r3, #1 - str r0, [r4, #0x34] - ldrb r2, [r4, #8] - ldr r3, [r4, #0x2c] - movs r5, #1 - cmp r2, #0 - ble _080B10BE - movs r0, #0x80 - mov sb, r0 - lsls r0, r6, #0x10 - asrs r7, r0, #0x18 - movs r0, #0xc - mov r8, r0 -_080B1098: - mov r0, ip - ands r0, r5 - cmp r0, #0 - beq _080B10B4 - ldrb r1, [r3] - mov r0, sb - ands r0, r1 - cmp r0, #0 - beq _080B10B4 - strb r7, [r3, #0xb] - strb r6, [r3, #0xd] - mov r0, r8 - orrs r0, r1 - strb r0, [r3] -_080B10B4: - subs r2, #1 - adds r3, #0x50 - lsls r5, r5, #1 - cmp r2, #0 - bgt _080B1098 -_080B10BE: - ldr r0, _080B10D0 @ =0x68736D53 - str r0, [r4, #0x34] -_080B10C2: - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_080B10D0: .4byte 0x68736D53 - - thumb_func_start m4aMPlayPanpotControl -m4aMPlayPanpotControl: @ 0x080B10D4 - push {r4, r5, r6, r7, lr} - mov r7, sb - mov r6, r8 - push {r6, r7} - adds r4, r0, #0 - lsls r1, r1, #0x10 - lsrs r7, r1, #0x10 - lsls r2, r2, #0x18 - lsrs r6, r2, #0x18 - ldr r3, [r4, #0x34] - ldr r0, _080B1138 @ =0x68736D53 - cmp r3, r0 - bne _080B112C - adds r0, r3, #1 - str r0, [r4, #0x34] - ldrb r2, [r4, #8] - ldr r1, [r4, #0x2c] - movs r5, #1 - cmp r2, #0 - ble _080B1128 - movs r0, #0x80 - mov r8, r0 - movs r0, #3 - mov ip, r0 -_080B1104: - adds r0, r7, #0 - ands r0, r5 - cmp r0, #0 - beq _080B111E - ldrb r3, [r1] - mov r0, r8 - ands r0, r3 - cmp r0, #0 - beq _080B111E - strb r6, [r1, #0x15] - mov r0, ip - orrs r0, r3 - strb r0, [r1] -_080B111E: - subs r2, #1 - adds r1, #0x50 - lsls r5, r5, #1 - cmp r2, #0 - bgt _080B1104 -_080B1128: - ldr r0, _080B1138 @ =0x68736D53 - str r0, [r4, #0x34] -_080B112C: - pop {r3, r4} - mov r8, r3 - mov sb, r4 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_080B1138: .4byte 0x68736D53 - - thumb_func_start ClearModM -ClearModM: @ 0x080B113C - push {lr} - adds r2, r0, #0 - movs r1, #0 - movs r0, #0 - strb r0, [r2, #0x1a] - strb r0, [r2, #0x16] - ldrb r0, [r2, #0x18] - cmp r0, #0 - bne _080B1154 - ldrb r0, [r2] - movs r1, #0xc - b _080B1158 -_080B1154: - ldrb r0, [r2] - movs r1, #3 -_080B1158: - orrs r0, r1 - strb r0, [r2] - pop {r0} - bx r0 - - thumb_func_start m4aMPlayModDepthSet -m4aMPlayModDepthSet: @ 0x080B1160 - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - adds r6, r0, #0 - lsls r1, r1, #0x10 - lsrs r1, r1, #0x10 - mov sl, r1 - lsls r2, r2, #0x18 - lsrs r2, r2, #0x18 - mov r8, r2 - ldr r1, [r6, #0x34] - ldr r0, _080B11D0 @ =0x68736D53 - cmp r1, r0 - bne _080B11C0 - adds r0, r1, #1 - str r0, [r6, #0x34] - ldrb r5, [r6, #8] - ldr r4, [r6, #0x2c] - movs r7, #1 - cmp r5, #0 - ble _080B11BC - mov sb, r8 -_080B1190: - mov r0, sl - ands r0, r7 - cmp r0, #0 - beq _080B11B2 - ldrb r1, [r4] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _080B11B2 - mov r0, r8 - strb r0, [r4, #0x17] - mov r0, sb - cmp r0, #0 - bne _080B11B2 - adds r0, r4, #0 - bl ClearModM -_080B11B2: - subs r5, #1 - adds r4, #0x50 - lsls r7, r7, #1 - cmp r5, #0 - bgt _080B1190 -_080B11BC: - ldr r0, _080B11D0 @ =0x68736D53 - str r0, [r6, #0x34] -_080B11C0: - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_080B11D0: .4byte 0x68736D53 - - thumb_func_start m4aMPlayLFOSpeedSet -m4aMPlayLFOSpeedSet: @ 0x080B11D4 - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - adds r6, r0, #0 - lsls r1, r1, #0x10 - lsrs r1, r1, #0x10 - mov sl, r1 - lsls r2, r2, #0x18 - lsrs r2, r2, #0x18 - mov r8, r2 - ldr r1, [r6, #0x34] - ldr r0, _080B1244 @ =0x68736D53 - cmp r1, r0 - bne _080B1234 - adds r0, r1, #1 - str r0, [r6, #0x34] - ldrb r5, [r6, #8] - ldr r4, [r6, #0x2c] - movs r7, #1 - cmp r5, #0 - ble _080B1230 - mov sb, r8 -_080B1204: - mov r0, sl - ands r0, r7 - cmp r0, #0 - beq _080B1226 - ldrb r1, [r4] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _080B1226 - mov r0, r8 - strb r0, [r4, #0x19] - mov r0, sb - cmp r0, #0 - bne _080B1226 - adds r0, r4, #0 - bl ClearModM -_080B1226: - subs r5, #1 - adds r4, #0x50 - lsls r7, r7, #1 - cmp r5, #0 - bgt _080B1204 -_080B1230: - ldr r0, _080B1244 @ =0x68736D53 - str r0, [r6, #0x34] -_080B1234: - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_080B1244: .4byte 0x68736D53 - - thumb_func_start ply_memacc -ply_memacc: @ 0x080B1248 - push {r4, r5, r6, lr} - adds r4, r0, #0 - adds r6, r1, #0 - ldr r0, [r6, #0x40] - ldrb r5, [r0] - adds r1, r0, #1 - str r1, [r6, #0x40] - ldrb r2, [r0, #1] - ldr r0, [r4, #0x18] - adds r2, r0, r2 - adds r0, r1, #1 - str r0, [r6, #0x40] - ldrb r3, [r1, #1] - adds r0, #1 - str r0, [r6, #0x40] - cmp r5, #0x11 - bls _080B126C - b _080B139A -_080B126C: - lsls r0, r5, #2 - ldr r1, _080B1278 @ =_080B127C - adds r0, r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_080B1278: .4byte _080B127C -_080B127C: @ jump table - .4byte _080B12C4 @ case 0 - .4byte _080B12C8 @ case 1 - .4byte _080B12D0 @ case 2 - .4byte _080B12D8 @ case 3 - .4byte _080B12E2 @ case 4 - .4byte _080B12F0 @ case 5 - .4byte _080B12FE @ case 6 - .4byte _080B1306 @ case 7 - .4byte _080B130E @ case 8 - .4byte _080B1316 @ case 9 - .4byte _080B131E @ case 10 - .4byte _080B1326 @ case 11 - .4byte _080B132E @ case 12 - .4byte _080B133C @ case 13 - .4byte _080B134A @ case 14 - .4byte _080B1358 @ case 15 - .4byte _080B1366 @ case 16 - .4byte _080B1374 @ case 17 -_080B12C4: - strb r3, [r2] - b _080B139A -_080B12C8: - ldrb r0, [r2] - adds r0, r3, r0 - strb r0, [r2] - b _080B139A -_080B12D0: - ldrb r0, [r2] - subs r0, r0, r3 - strb r0, [r2] - b _080B139A -_080B12D8: - ldr r0, [r4, #0x18] - adds r0, r0, r3 - ldrb r0, [r0] - strb r0, [r2] - b _080B139A -_080B12E2: - ldr r0, [r4, #0x18] - adds r0, r0, r3 - ldrb r0, [r0] - ldrb r1, [r2] - adds r0, r0, r1 - strb r0, [r2] - b _080B139A -_080B12F0: - ldr r0, [r4, #0x18] - adds r0, r0, r3 - ldrb r1, [r2] - ldrb r0, [r0] - subs r1, r1, r0 - strb r1, [r2] - b _080B139A -_080B12FE: - ldrb r0, [r2] - cmp r0, r3 - beq _080B1380 - b _080B1394 -_080B1306: - ldrb r0, [r2] - cmp r0, r3 - bne _080B1380 - b _080B1394 -_080B130E: - ldrb r0, [r2] - cmp r0, r3 - bhi _080B1380 - b _080B1394 -_080B1316: - ldrb r0, [r2] - cmp r0, r3 - bhs _080B1380 - b _080B1394 -_080B131E: - ldrb r0, [r2] - cmp r0, r3 - bls _080B1380 - b _080B1394 -_080B1326: - ldrb r0, [r2] - cmp r0, r3 - blo _080B1380 - b _080B1394 -_080B132E: - ldr r0, [r4, #0x18] - adds r0, r0, r3 - ldrb r1, [r2] - ldrb r0, [r0] - cmp r1, r0 - beq _080B1380 - b _080B1394 -_080B133C: - ldr r0, [r4, #0x18] - adds r0, r0, r3 - ldrb r1, [r2] - ldrb r0, [r0] - cmp r1, r0 - bne _080B1380 - b _080B1394 -_080B134A: - ldr r0, [r4, #0x18] - adds r0, r0, r3 - ldrb r1, [r2] - ldrb r0, [r0] - cmp r1, r0 - bhi _080B1380 - b _080B1394 -_080B1358: - ldr r0, [r4, #0x18] - adds r0, r0, r3 - ldrb r1, [r2] - ldrb r0, [r0] - cmp r1, r0 - bhs _080B1380 - b _080B1394 -_080B1366: - ldr r0, [r4, #0x18] - adds r0, r0, r3 - ldrb r1, [r2] - ldrb r0, [r0] - cmp r1, r0 - bls _080B1380 - b _080B1394 -_080B1374: - ldr r0, [r4, #0x18] - adds r0, r0, r3 - ldrb r1, [r2] - ldrb r0, [r0] - cmp r1, r0 - bhs _080B1394 -_080B1380: - ldr r0, _080B1390 @ =gUnk_03004D54 - ldr r2, [r0] - adds r0, r4, #0 - adds r1, r6, #0 - bl _call_via_r2 - b _080B139A - .align 2, 0 -_080B1390: .4byte gUnk_03004D54 -_080B1394: - ldr r0, [r6, #0x40] - adds r0, #4 - str r0, [r6, #0x40] -_080B139A: - pop {r4, r5, r6} - pop {r0} - bx r0 - - thumb_func_start ply_xcmd -ply_xcmd: @ 0x080B13A0 - push {lr} - ldr r2, [r1, #0x40] - ldrb r3, [r2] - adds r2, #1 - str r2, [r1, #0x40] - ldr r2, _080B13BC @ =gUnk_089FC96C - lsls r3, r3, #2 - adds r3, r3, r2 - ldr r2, [r3] - bl _call_via_r2 - pop {r0} - bx r0 - .align 2, 0 -_080B13BC: .4byte gUnk_089FC96C - - thumb_func_start ply_xxx -ply_xxx: @ 0x080B13C0 - push {lr} - ldr r2, _080B13D0 @ =gUnk_03004D50 - ldr r2, [r2] - bl _call_via_r2 - pop {r0} - bx r0 - .align 2, 0 -_080B13D0: .4byte gUnk_03004D50 - - thumb_func_start ply_xwave -ply_xwave: @ 0x080B13D4 - push {r4, lr} - ldr r3, [r1, #0x40] - ldrb r2, [r3] - ldr r0, _080B140C @ =0xFFFFFF00 - ands r4, r0 - orrs r4, r2 - ldrb r0, [r3, #1] - lsls r0, r0, #8 - ldr r2, _080B1410 @ =0xFFFF00FF - ands r4, r2 - orrs r4, r0 - ldrb r0, [r3, #2] - lsls r0, r0, #0x10 - ldr r2, _080B1414 @ =0xFF00FFFF - ands r4, r2 - orrs r4, r0 - ldrb r0, [r3, #3] - lsls r0, r0, #0x18 - ldr r2, _080B1418 @ =0x00FFFFFF - ands r4, r2 - orrs r4, r0 - str r4, [r1, #0x28] - adds r3, #4 - str r3, [r1, #0x40] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080B140C: .4byte 0xFFFFFF00 -_080B1410: .4byte 0xFFFF00FF -_080B1414: .4byte 0xFF00FFFF -_080B1418: .4byte 0x00FFFFFF - - thumb_func_start ply_xtype -ply_xtype: @ 0x080B141C - ldr r0, [r1, #0x40] - ldrb r2, [r0] - adds r0, r1, #0 - adds r0, #0x24 - strb r2, [r0] - ldr r0, [r1, #0x40] - adds r0, #1 - str r0, [r1, #0x40] - bx lr - .align 2, 0 - - thumb_func_start ply_xatta -ply_xatta: @ 0x080B1430 - ldr r0, [r1, #0x40] - ldrb r2, [r0] - adds r0, r1, #0 - adds r0, #0x2c - strb r2, [r0] - ldr r0, [r1, #0x40] - adds r0, #1 - str r0, [r1, #0x40] - bx lr - .align 2, 0 - - thumb_func_start ply_xdeca -ply_xdeca: @ 0x080B1444 - ldr r0, [r1, #0x40] - ldrb r0, [r0] - adds r2, r1, #0 - adds r2, #0x2d - strb r0, [r2] - ldr r0, [r1, #0x40] - adds r0, #1 - str r0, [r1, #0x40] - bx lr - .align 2, 0 - - thumb_func_start ply_xsust -ply_xsust: @ 0x080B1458 - ldr r0, [r1, #0x40] - ldrb r0, [r0] - adds r2, r1, #0 - adds r2, #0x2e - strb r0, [r2] - ldr r0, [r1, #0x40] - adds r0, #1 - str r0, [r1, #0x40] - bx lr - .align 2, 0 - - thumb_func_start ply_xrele -ply_xrele: @ 0x080B146C - ldr r0, [r1, #0x40] - ldrb r0, [r0] - adds r2, r1, #0 - adds r2, #0x2f - strb r0, [r2] - ldr r0, [r1, #0x40] - adds r0, #1 - str r0, [r1, #0x40] - bx lr - .align 2, 0 - - thumb_func_start ply_xiecv -ply_xiecv: @ 0x080B1480 - ldr r0, [r1, #0x40] - ldrb r2, [r0] - strb r2, [r1, #0x1e] - adds r0, #1 - str r0, [r1, #0x40] - bx lr - - thumb_func_start ply_xiecl -ply_xiecl: @ 0x080B148C - ldr r0, [r1, #0x40] - ldrb r2, [r0] - strb r2, [r1, #0x1f] - adds r0, #1 - str r0, [r1, #0x40] - bx lr - - thumb_func_start ply_xleng -ply_xleng: @ 0x080B1498 - ldr r0, [r1, #0x40] - ldrb r0, [r0] - adds r2, r1, #0 - adds r2, #0x26 - strb r0, [r2] - ldr r0, [r1, #0x40] - adds r0, #1 - str r0, [r1, #0x40] - bx lr - .align 2, 0 - - thumb_func_start ply_xswee -ply_xswee: @ 0x080B14AC - ldr r0, [r1, #0x40] - ldrb r0, [r0] - adds r2, r1, #0 - adds r2, #0x27 - strb r0, [r2] - ldr r0, [r1, #0x40] - adds r0, #1 - str r0, [r1, #0x40] - bx lr - .align 2, 0 - - thumb_func_start nullsub_544 -nullsub_544: @ 0x080B14C0 - bx lr - .align 2, 0 - diff --git a/asm/non_matching/m4a/CgbModVol.inc b/asm/non_matching/m4a/CgbModVol.inc new file mode 100644 index 00000000..d1015d19 --- /dev/null +++ b/asm/non_matching/m4a/CgbModVol.inc @@ -0,0 +1,64 @@ + + .syntax unified + + .text + + push {r4, lr} + adds r2, r0, #0 + ldrb r0, [r2, #2] + ldrb r1, [r2, #3] + lsls r3, r0, #0x18 + lsrs r4, r3, #0x18 + lsls r0, r1, #0x18 + lsrs r1, r0, #0x18 + cmp r4, r1 + blo _080B0B0C + lsrs r0, r3, #0x19 + cmp r0, r1 + blo _080B0B18 + movs r0, #0xf + strb r0, [r2, #0x1b] + b _080B0B26 +_080B0B0C: + lsrs r0, r0, #0x19 + cmp r0, r4 + blo _080B0B18 + movs r0, #0xf0 + strb r0, [r2, #0x1b] + b _080B0B26 +_080B0B18: + movs r0, #0xff + strb r0, [r2, #0x1b] + ldrb r0, [r2, #2] + ldrb r1, [r2, #3] + adds r0, r0, r1 + lsrs r0, r0, #4 + b _080B0B36 +_080B0B26: + ldrb r0, [r2, #2] + ldrb r1, [r2, #3] + adds r0, r0, r1 + lsrs r0, r0, #4 + strb r0, [r2, #0xa] + cmp r0, #0xf + bls _080B0B38 + movs r0, #0xf +_080B0B36: + strb r0, [r2, #0xa] +_080B0B38: + ldrb r1, [r2, #0xa] + ldrb r0, [r2, #6] + muls r0, r1, r0 + adds r0, #0xf + asrs r0, r0, #4 + strb r0, [r2, #0x19] + ldrb r1, [r2, #0x1b] + ldrb r0, [r2, #0x1c] + ands r0, r1 + strb r0, [r2, #0x1b] + pop {r4} + pop {r0} + bx r0 + .align 2, 0 + + .syntax divided diff --git a/asm/non_matching/m4a/CgbSound.inc b/asm/non_matching/m4a/CgbSound.inc new file mode 100644 index 00000000..c4fadc4d --- /dev/null +++ b/asm/non_matching/m4a/CgbSound.inc @@ -0,0 +1,616 @@ + + .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/asm/non_matching/m4a/m4aMPlayImmInit.inc b/asm/non_matching/m4a/m4aMPlayImmInit.inc new file mode 100644 index 00000000..56996373 --- /dev/null +++ b/asm/non_matching/m4a/m4aMPlayImmInit.inc @@ -0,0 +1,61 @@ + + .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 new file mode 100644 index 00000000..52baef8e --- /dev/null +++ b/asm/non_matching/m4a/m4aSoundVSync.inc @@ -0,0 +1,54 @@ + + .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 new file mode 100644 index 00000000..4b025c78 --- /dev/null +++ b/asm/non_matching/m4a/m4aSoundVSyncOff.inc @@ -0,0 +1,57 @@ + + .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 new file mode 100644 index 00000000..7781a9cc --- /dev/null +++ b/asm/non_matching/m4a/m4aSoundVSyncOn.inc @@ -0,0 +1,61 @@ + + .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/asm/soundReq.s b/asm/soundReq.s index 6b5ef1c2..5e0055c6 100644 --- a/asm/soundReq.s +++ b/asm/soundReq.s @@ -190,8 +190,8 @@ _080A33C4: bl sub_080A35A0 b _080A347C _080A33CC: - ldr r2, _080A33EC @ =gUnk_08A11C3C - ldr r1, _080A33F0 @ =gUnk_08A11DBC + ldr r2, _080A33EC @ =gMPlayTable + ldr r1, _080A33F0 @ =gSongTable ldrh r0, [r5, #0x14] lsls r0, r0, #3 adds r0, r0, r1 @@ -205,8 +205,8 @@ _080A33CC: bl m4aMPlayTempoControl b _080A347C .align 2, 0 -_080A33EC: .4byte gUnk_08A11C3C -_080A33F0: .4byte gUnk_08A11DBC +_080A33EC: .4byte gMPlayTable +_080A33F0: .4byte gSongTable _080A33F4: bl m4aMPlayAllStop bl m4aSoundVSyncOff diff --git a/data/data_089FC6C4.s b/data/data_089FC6C4.s index fb6fb436..b5d488de 100644 --- a/data/data_089FC6C4.s +++ b/data/data_089FC6C4.s @@ -43,31 +43,31 @@ gUnk_089FC6C4:: @ 089FC6C4 .4byte RealClearChain .4byte SoundMainBTM -gUnk_089FC754:: @ 089FC754 +gScaleTable:: @ 089FC754 .incbin "baserom.gba", 0x9FC754, 0x00000B4 -gUnk_089FC808:: @ 089FC808 +gFreqTable:: @ 089FC808 .incbin "baserom.gba", 0x9FC808, 0x0000030 -gUnk_089FC838:: @ 089FC838 +gPcmSamplesPerVBlankTable:: @ 089FC838 .incbin "baserom.gba", 0x9FC838, 0x0000018 -gUnk_089FC850:: @ 089FC850 +gCgbScaleTable:: @ 089FC850 .incbin "baserom.gba", 0x9FC850, 0x0000084 -gUnk_089FC8D4:: @ 089FC8D4 +gCgbFreqTable:: @ 089FC8D4 .incbin "baserom.gba", 0x9FC8D4, 0x0000018 -gUnk_089FC8EC:: @ 089FC8EC +gNoiseTable:: @ 089FC8EC .incbin "baserom.gba", 0x9FC8EC, 0x000003C -gUnk_089FC928:: @ 089FC928 +gCgb3Vol:: @ 089FC928 .incbin "baserom.gba", 0x9FC928, 0x0000010 gUnk_089FC938:: @ 089FC938 .incbin "baserom.gba", 0x9FC938, 0x0000034 -gUnk_089FC96C:: @ 089FC96C +gXcmdTable:: @ 089FC96C @ replacing .incbin "baserom.gba", 0x009fc96c, 0x30 .4byte ply_xxx .4byte ply_xwave @@ -1690,10 +1690,10 @@ gUnk_08A11C0C:: @ 08A11C0C gUnk_08A11C1C:: @ 08A11C1C .incbin "baserom.gba", 0xA11C1C, 0x0000020 -gUnk_08A11C3C:: @ 08A11C3C +gMPlayTable:: @ 08A11C3C .incbin "baserom.gba", 0xA11C3C, 0x0000180 -gUnk_08A11DBC:: @ 08A11DBC +gSongTable:: @ 08A11DBC .incbin "baserom.gba", 0xA11DBC, 0x00009E5 gUnk_08A127A1:: @ 08A127A1 diff --git a/include/gba/m4a_internal.h b/include/gba/m4a_internal.h index 05a47859..89c76157 100644 --- a/include/gba/m4a_internal.h +++ b/include/gba/m4a_internal.h @@ -98,7 +98,7 @@ struct CgbChannel { u8 sw; u32 fr; u32* wp; - u32 cp; + u32* cp; u32 tp; u32 pp; u32 np; @@ -171,17 +171,17 @@ struct SoundInfo { s32 pcmFreq; s32 divFreq; struct CgbChannel* cgbChans; - u32 func; - u32 intp; + void* func; + void* intp; void (*CgbSound)(void); void (*CgbOscOff)(u8); u32 (*MidiKeyToCgbFreq)(u8, u8, u8); - u32 MPlayJumpTable; + void* MPlayJumpTable; void* plynote; void (*ExtVolPit)(void); u8 gap2[16]; struct SoundChannel chans[MAX_DIRECTSOUND_CHANNELS]; - s8 pcmBuffer[PCM_DMA_BUF_SIZE * 2]; + s8 pcmBuffer[PCM_DMA_BUF_SIZE]; }; struct SongHeader { @@ -272,8 +272,8 @@ struct MusicPlayerInfo { struct MusicPlayerTrack* tracks; struct ToneData* tone; u32 ident; - u32 func; - u32 intp; + u32* func; + u32* intp; }; struct MusicPlayer { diff --git a/linker.ld b/linker.ld index 4a55674c..2e16be52 100644 --- a/linker.ld +++ b/linker.ld @@ -1,5 +1,8 @@ ENTRY(__start) +gNumMusicPlayers = 0x20; +gMaxLines = 0; + MEMORY { ewram (w!x) : ORIGIN = 0x02000000, LENGTH = 256K iwram (w!x) : ORIGIN = 0x03000000, LENGTH = 32K @@ -212,15 +215,15 @@ SECTIONS { . = 0x00004020; gUnk_03004020 = .; . = 0x00004030; gUnk_03004030 = .; . = 0x00004040; gUnk_03004040 = .; - . = 0x0000404C; gUnk_0300404C = .; + . = 0x0000404C; SoundMainRAM_Buffer = .; . = 0x0000404D; gUnk_0300404D = .; - . = 0x000043D0; gUnk_030043D0 = .; - . = 0x00004D50; gUnk_03004D50 = .; + . = 0x000043D0; gSoundInfo = .; + . = 0x00004D50; gMPlayJumpTable = .; . = 0x00004D54; gUnk_03004D54 = .; . = 0x00004DD8; gUnk_03004DD8 = .; . = 0x00004DDC; gUnk_03004DDC = .; - . = 0x00004DE0; gUnk_03004DE0 = .; - . = 0x000055E0; gUnk_030055E0 = .; + . = 0x00004DE0; gCgbChans = .; + . = 0x000055E0; gMPlayMemAccArea = .; . = 0x000056F0; gUnk_030056F0 = .; . = 0x000056F1; gUnk_030056F1 = .; . = 0x00005740; gUnk_03005740 = .; @@ -901,7 +904,7 @@ SECTIONS { asm/code_080AD90C.o(.text); /* library functions */ asm/m4a_asm.o(.text); - asm/m4a.o(.text); + src/gba/m4a.o(.text); asm/libagbsyscall.o(.text); src/eeprom.o(.text); *libc.a:memcpy.o(.text); diff --git a/src/gba/m4a.c b/src/gba/m4a.c new file mode 100644 index 00000000..00003b88 --- /dev/null +++ b/src/gba/m4a.c @@ -0,0 +1,1379 @@ +#include "global.h" +#include "gba/m4a_internal.h" + +typedef void (*MPlayFunc)(); +typedef void (*PlyNoteFunc)(u32, struct MusicPlayerInfo*, struct MusicPlayerTrack*); +typedef void (*CgbSoundFunc)(void); +typedef void (*CgbOscOffFunc)(u8); +typedef u32 (*MidiKeyToCgbFreqFunc)(u8, u8, u8); +typedef void (*ExtVolPitFunc)(void); +typedef void (*MPlayMainFunc)(struct MusicPlayerInfo*); + +u8 SoundMainRAM_Buffer[0x380]; +struct SoundInfo gSoundInfo; + +#define SOUND_CHANNEL_SF_START 0x80 +#define SOUND_CHANNEL_SF_STOP 0x40 +#define SOUND_CHANNEL_SF_LOOP 0x10 +#define SOUND_CHANNEL_SF_IEC 0x04 +#define SOUND_CHANNEL_SF_ENV 0x03 +#define SOUND_CHANNEL_SF_ENV_ATTACK 0x03 +#define SOUND_CHANNEL_SF_ENV_DECAY 0x02 +#define SOUND_CHANNEL_SF_ENV_SUSTAIN 0x01 +#define SOUND_CHANNEL_SF_ENV_RELEASE 0x00 +#define SOUND_CHANNEL_SF_ON \ + (SOUND_CHANNEL_SF_START | SOUND_CHANNEL_SF_STOP | SOUND_CHANNEL_SF_IEC | SOUND_CHANNEL_SF_ENV) + +#define CGB_CHANNEL_MO_PIT 0x02 +#define CGB_CHANNEL_MO_VOL 0x01 + +#define CGB_NRx2_ENV_DIR_DEC 0x00 +#define CGB_NRx2_ENV_DIR_INC 0x08 + +void nullsub_544(); + +u32 MidiKeyToFreq(struct WaveData* wav, u8 key, u8 fineAdjust) { + u32 val1; + u32 val2; + u32 fineAdjustShifted = fineAdjust << 24; + + if (key > 178) { + key = 178; + fineAdjustShifted = 255 << 24; + } + + val1 = gScaleTable[key]; + val1 = gFreqTable[val1 & 0xF] >> (val1 >> 4); + + val2 = gScaleTable[key + 1]; + val2 = gFreqTable[val2 & 0xF] >> (val2 >> 4); + + return umul3232H32(wav->freq, val1 + umul3232H32(val2 - val1, fineAdjustShifted)); +} + +void nullsub_543() { +} + +void MPlayContinue(struct MusicPlayerInfo* mplayInfo) { + if (mplayInfo->ident == ID_NUMBER) { + mplayInfo->ident++; + mplayInfo->status &= ~MUSICPLAYER_STATUS_PAUSE; + mplayInfo->ident = ID_NUMBER; + } +} + +void MPlayFadeOut(struct MusicPlayerInfo* mplayInfo, u16 speed) { + if (mplayInfo->ident == ID_NUMBER) { + mplayInfo->ident++; + mplayInfo->fadeOC = speed; + mplayInfo->fadeOI = speed; + mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT); + mplayInfo->ident = ID_NUMBER; + } +} + +void m4aSoundInit(void) { + s32 i; + + CpuCopy32((void*)((s32)SoundMainRAM & ~1), SoundMainRAM_Buffer, sizeof(SoundMainRAM_Buffer)); + + SoundInit(&gSoundInfo); + MPlayExtender(gCgbChans); + m4aSoundMode(SOUND_MODE_DA_BIT_8 | SOUND_MODE_FREQ_15768 | (0xf << SOUND_MODE_MASVOL_SHIFT) | + (8 << SOUND_MODE_MAXCHN_SHIFT)); + + for (i = 0; i < NUM_MUSIC_PLAYERS; i++) { + struct MusicPlayerInfo* mplayInfo = gMPlayTable[i].info; + MPlayOpen(mplayInfo, gMPlayTable[i].track, gMPlayTable[i].unk_8); + mplayInfo->unk_B = gMPlayTable[i].unk_A; + mplayInfo->memAccArea = gMPlayMemAccArea; + } +} + +void m4aSoundMain(void) { + SoundMain(); +} + +void m4aSongNumStart(u16 n) { + const struct MusicPlayer* mplayTable = gMPlayTable; + const struct Song* songTable = gSongTable; + const struct Song* song = &songTable[n]; + const struct MusicPlayer* mplay = &mplayTable[song->ms]; + + MPlayStart(mplay->info, song->header); +} + +void m4aSongNumStartOrChange(u16 n) { + const struct MusicPlayer* mplayTable = gMPlayTable; + const struct Song* songTable = gSongTable; + const struct Song* song = &songTable[n]; + const struct MusicPlayer* mplay = &mplayTable[song->ms]; + + if (mplay->info->songHeader != song->header) { + MPlayStart(mplay->info, song->header); + } else { + if ((mplay->info->status & MUSICPLAYER_STATUS_TRACK) == 0 || (mplay->info->status & MUSICPLAYER_STATUS_PAUSE)) { + MPlayStart(mplay->info, song->header); + } + } +} + +void m4aSongNumStartOrContinue(u16 n) { + const struct MusicPlayer* mplayTable = gMPlayTable; + const struct Song* songTable = gSongTable; + const struct Song* song = &songTable[n]; + const struct MusicPlayer* mplay = &mplayTable[song->ms]; + + if (mplay->info->songHeader != song->header) + MPlayStart(mplay->info, song->header); + else if ((mplay->info->status & MUSICPLAYER_STATUS_TRACK) == 0) + MPlayStart(mplay->info, song->header); + else if (mplay->info->status & MUSICPLAYER_STATUS_PAUSE) + MPlayContinue(mplay->info); +} + +void m4aSongNumStop(u16 n) { + const struct MusicPlayer* mplayTable = gMPlayTable; + const struct Song* songTable = gSongTable; + const struct Song* song = &songTable[n]; + const struct MusicPlayer* mplay = &mplayTable[song->ms]; + + if (mplay->info->songHeader == song->header) + MPlayStop(mplay->info); +} + +void m4aSongNumContinue(u16 n) { + const struct MusicPlayer* mplayTable = gMPlayTable; + const struct Song* songTable = gSongTable; + const struct Song* song = &songTable[n]; + const struct MusicPlayer* mplay = &mplayTable[song->ms]; + + if (mplay->info->songHeader == song->header) + MPlayContinue(mplay->info); +} + +void m4aMPlayAllStop(void) { + s32 i; + + for (i = 0; i < NUM_MUSIC_PLAYERS; i++) + MPlayStop(gMPlayTable[i].info); +} + +void m4aMPlayContinue(struct MusicPlayerInfo* mplayInfo) { + MPlayContinue(mplayInfo); +} + +void m4aMPlayAllContinue(void) { + s32 i; + + for (i = 0; i < NUM_MUSIC_PLAYERS; i++) + MPlayContinue(gMPlayTable[i].info); +} + +void m4aMPlayFadeOut(struct MusicPlayerInfo* mplayInfo, u16 speed) { + MPlayFadeOut(mplayInfo, speed); +} + +void m4aMPlayFadeOutTemporarily(struct MusicPlayerInfo* mplayInfo, u16 speed) { + if (mplayInfo->ident == ID_NUMBER) { + mplayInfo->ident++; + mplayInfo->fadeOC = speed; + mplayInfo->fadeOI = speed; + mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT) | TEMPORARY_FADE; + mplayInfo->ident = ID_NUMBER; + } +} + +void m4aMPlayFadeIn(struct MusicPlayerInfo* mplayInfo, u16 speed) { + if (mplayInfo->ident == ID_NUMBER) { + mplayInfo->ident++; + mplayInfo->fadeOC = speed; + mplayInfo->fadeOI = speed; + mplayInfo->fadeOV = (0 << FADE_VOL_SHIFT) | FADE_IN; + mplayInfo->status &= ~MUSICPLAYER_STATUS_PAUSE; + mplayInfo->ident = ID_NUMBER; + } +} + +NONMATCH("asm/non_matching/m4a/m4aMPlayImmInit.inc", void m4aMPlayImmInit(struct MusicPlayerInfo* mplayInfo)) { + s32 trackCount = mplayInfo->trackCount; + struct MusicPlayerTrack* track = mplayInfo->tracks; + + while (trackCount > 0) { + if (track->flags & MPT_FLG_EXIST) { + if (track->flags & MPT_FLG_START) { + Clear64byte(track); + track->flags = MPT_FLG_EXIST; + track->bendRange = 2; + track->volX = 64; + track->lfoSpeed = 22; + track->tone.type = 1; + } + } + + trackCount--; + track++; + } +} +END_NONMATCH + +void MPlayExtender(struct CgbChannel* cgbChans) { + struct SoundInfo* soundInfo; + u32 ident; + + REG_SOUNDCNT_X = SOUND_MASTER_ENABLE | SOUND_4_ON | SOUND_3_ON | SOUND_2_ON | SOUND_1_ON; + REG_SOUNDCNT_L = 0; // set master volume to zero + REG_NR12 = 0x8; + REG_NR22 = 0x8; + REG_NR42 = 0x8; + REG_NR14 = 0x80; + REG_NR24 = 0x80; + REG_NR44 = 0x80; + REG_NR30 = 0; + REG_NR50 = 0x77; + + soundInfo = SOUND_INFO_PTR; + + ident = soundInfo->ident; + + if (ident != ID_NUMBER) + return; + + soundInfo->ident++; + + gMPlayJumpTable[8] = ply_memacc; + gMPlayJumpTable[17] = ply_lfos; + gMPlayJumpTable[19] = ply_mod; + gMPlayJumpTable[28] = ply_xcmd; + gMPlayJumpTable[29] = ply_endtie; + gMPlayJumpTable[30] = SampleFreqSet; + gMPlayJumpTable[31] = TrackStop; + gMPlayJumpTable[32] = FadeOutBody; + gMPlayJumpTable[33] = TrkVolPitSet; + + soundInfo->cgbChans = cgbChans; + soundInfo->CgbSound = CgbSound; + soundInfo->CgbOscOff = CgbOscOff; + soundInfo->MidiKeyToCgbFreq = MidiKeyToCgbFreq; + soundInfo->maxLines = MAX_LINES; + + CpuFill32(0, cgbChans, sizeof(struct CgbChannel) * 4); + + cgbChans[0].ty = 1; + cgbChans[0].panMask = 0x11; + cgbChans[1].ty = 2; + cgbChans[1].panMask = 0x22; + cgbChans[2].ty = 3; + cgbChans[2].panMask = 0x44; + cgbChans[3].ty = 4; + cgbChans[3].panMask = 0x88; + + soundInfo->ident = ident; +} + +void MusicPlayerJumpTableCopy(void) { + asm("swi 0x2A"); +} + +void ClearChain(void* x) { + void (*func)(void*) = *(&gMPlayJumpTable[34]); + func(x); +} + +void Clear64byte(void* x) { + void (*func)(void*) = *(&gMPlayJumpTable[35]); + func(x); +} + +void SoundInit(struct SoundInfo* soundInfo) { + soundInfo->ident = 0; + + 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_SOUNDCNT_X = SOUND_MASTER_ENABLE | SOUND_4_ON | SOUND_3_ON | SOUND_2_ON | SOUND_1_ON; + REG_SOUNDCNT_H = + SOUND_A_FIFO_RESET | SOUND_A_TIMER_0 | SOUND_A_LEFT_OUTPUT | SOUND_A_RIGHT_OUTPUT | SOUND_ALL_MIX_FULL; + REG_SOUNDBIAS_H = (REG_SOUNDBIAS_H & 0x3F) | 0x40; + + REG_DMA1SAD = (s32)soundInfo->pcmBuffer; + REG_DMA1DAD = (s32)®_FIFO_A; + + SOUND_INFO_PTR = soundInfo; + CpuFill32(0, soundInfo, sizeof(struct SoundInfo)); + + soundInfo->maxChans = 8; + soundInfo->masterVolume = 15; + soundInfo->plynote = ply_note; + soundInfo->CgbSound = nullsub_544; + soundInfo->CgbOscOff = (CgbOscOffFunc)nullsub_544; + soundInfo->MidiKeyToCgbFreq = (MidiKeyToCgbFreqFunc)nullsub_544; + soundInfo->ExtVolPit = (ExtVolPitFunc)nullsub_544; + + MPlayJumpTableCopy(gMPlayJumpTable); + + soundInfo->MPlayJumpTable = gMPlayJumpTable; + + SampleFreqSet(SOUND_MODE_FREQ_13379); + + soundInfo->ident = ID_NUMBER; +} + +void SampleFreqSet(u32 freq) { + struct SoundInfo* soundInfo; + m4aSoundVSyncOff(); + soundInfo = SOUND_INFO_PTR; + + freq = (freq & 0xF0000) >> 16; + soundInfo->freq = freq; + soundInfo->pcmSamplesPerVBlank = gPcmSamplesPerVBlankTable[freq - 1]; + soundInfo->pcmDmaPeriod = PCM_DMA_BUF_SIZE / soundInfo->pcmSamplesPerVBlank; + + // LCD refresh rate 59.7275Hz + soundInfo->pcmFreq = (597275 * soundInfo->pcmSamplesPerVBlank + 5000) / 10000; + + // CPU frequency 16.78Mhz + soundInfo->divFreq = (16777216 / soundInfo->pcmFreq + 1) >> 1; + + m4aSoundVSyncOn(); +} + +void m4aSoundMode(u32 mode) { + struct SoundInfo* soundInfo = SOUND_INFO_PTR; + u32 temp; + + if (soundInfo->ident != ID_NUMBER) + return; + + soundInfo->ident++; + + temp = mode & (SOUND_MODE_REVERB_SET | SOUND_MODE_REVERB_VAL); + + if (temp) + soundInfo->reverb = temp & SOUND_MODE_REVERB_VAL; + + temp = mode & SOUND_MODE_MAXCHN; + + if (temp) { + struct SoundChannel* chan; + + soundInfo->maxChans = temp >> SOUND_MODE_MAXCHN_SHIFT; + + temp = MAX_DIRECTSOUND_CHANNELS; + chan = &soundInfo->chans[0]; + + while (temp != 0) { + chan->status = 0; + temp--; + chan++; + } + } + + temp = mode & SOUND_MODE_MASVOL; + + if (temp) + soundInfo->masterVolume = temp >> SOUND_MODE_MASVOL_SHIFT; + + temp = mode & SOUND_MODE_DA_BIT; + + if (temp) { + temp = (temp & 0x300000) >> 14; + REG_SOUNDBIAS_H = (REG_SOUNDBIAS_H & 0x3F) | temp; + } + + temp = mode & SOUND_MODE_FREQ; + + if (temp) { + SampleFreqSet(temp); + } + + soundInfo->ident = ID_NUMBER; +} + +void SoundClear(void) { + struct SoundInfo* soundInfo = SOUND_INFO_PTR; + s32 i; + void* chan; + + if (soundInfo->ident != ID_NUMBER) + return; + + soundInfo->ident++; + + i = MAX_DIRECTSOUND_CHANNELS; + chan = &soundInfo->chans[0]; + + while (i > 0) { + ((struct SoundChannel*)chan)->status = 0; + i--; + chan = (void*)((s32)chan + sizeof(struct SoundChannel)); + } + + chan = soundInfo->cgbChans; + + if (chan) { + i = 1; + + while (i <= 4) { + soundInfo->CgbOscOff(i); + ((struct CgbChannel*)chan)->sf = 0; + i++; + chan = (void*)((s32)chan + sizeof(struct CgbChannel)); + } + } + + soundInfo->ident = ID_NUMBER; +} + +NONMATCH("asm/non_matching/m4a/m4aSoundVSyncOff.inc", void m4aSoundVSyncOff(void)) { + struct SoundInfo* soundInfo = SOUND_INFO_PTR; + + if (soundInfo->ident >= ID_NUMBER && soundInfo->ident <= ID_NUMBER + 1) { + soundInfo->ident += 10; + + 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)) { + struct SoundInfo* soundInfo = SOUND_INFO_PTR; + u32 ident = soundInfo->ident; + + if (ident == ID_NUMBER) + 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)) { +} +END_NONMATCH + +void MPlayOpen(struct MusicPlayerInfo* mplayInfo, struct MusicPlayerTrack* tracks, u8 trackCount) { + struct SoundInfo* soundInfo; + + if (trackCount == 0) + return; + + if (trackCount > MAX_MUSICPLAYER_TRACKS) + trackCount = MAX_MUSICPLAYER_TRACKS; + + soundInfo = SOUND_INFO_PTR; + + if (soundInfo->ident != ID_NUMBER) + return; + + soundInfo->ident++; + + Clear64byte(mplayInfo); + + mplayInfo->tracks = tracks; + mplayInfo->trackCount = trackCount; + mplayInfo->status = MUSICPLAYER_STATUS_PAUSE; + + while (trackCount != 0) { + tracks->flags = 0; + trackCount--; + tracks++; + } + + // append music player and MPlayMain to linked list + + if (soundInfo->func != NULL) { + mplayInfo->func = soundInfo->func; + mplayInfo->intp = soundInfo->intp; + // NULL assignment semantically useless, but required for match + soundInfo->func = NULL; + } + + soundInfo->intp = mplayInfo; + soundInfo->func = MPlayMain; + soundInfo->ident = ID_NUMBER; + mplayInfo->ident = ID_NUMBER; +} + +void MPlayStart(struct MusicPlayerInfo* mplayInfo, struct SongHeader* songHeader) { + s32 i; + u8 unk_B; + struct MusicPlayerTrack* track; + + if (mplayInfo->ident != ID_NUMBER) + return; + mplayInfo->ident++; + + unk_B = mplayInfo->unk_B; + + if (!unk_B || + ((!mplayInfo->songHeader || !(mplayInfo->tracks[0].flags & MPT_FLG_START)) && + ((mplayInfo->status & MUSICPLAYER_STATUS_TRACK) == 0 || (mplayInfo->status & MUSICPLAYER_STATUS_PAUSE))) || + (mplayInfo->priority <= songHeader->priority)) { + mplayInfo->status = 0; + mplayInfo->songHeader = songHeader; + mplayInfo->tone = songHeader->tone; + mplayInfo->priority = songHeader->priority; + mplayInfo->clock = 0; + mplayInfo->tempoD = 150; + mplayInfo->tempoI = 150; + mplayInfo->tempoU = 0x100; + mplayInfo->tempoC = 0; + mplayInfo->fadeOI = 0; + + i = 0; + track = mplayInfo->tracks; + + while (i < songHeader->trackCount && i < mplayInfo->trackCount) { + TrackStop(mplayInfo, track); + track->flags = MPT_FLG_EXIST | MPT_FLG_START; + track->chan = 0; + track->cmdPtr = songHeader->part[i]; + i++; + track++; + } + + while (i < mplayInfo->trackCount) { + TrackStop(mplayInfo, track); + track->flags = 0; + i++; + track++; + } + + if (songHeader->reverb & SOUND_MODE_REVERB_SET) + m4aSoundMode(songHeader->reverb); + } + mplayInfo->ident = ID_NUMBER; +} + +void MPlayStop(struct MusicPlayerInfo* mplayInfo) { + s32 i; + struct MusicPlayerTrack* track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + + while (i > 0) { + TrackStop(mplayInfo, track); + i--; + track++; + } + + mplayInfo->ident = ID_NUMBER; +} + +void FadeOutBody(struct MusicPlayerInfo* mplayInfo) { + s32 i; + struct MusicPlayerTrack* track; + u16 fadeOV; + + if (mplayInfo->fadeOI == 0) + return; + if (--mplayInfo->fadeOC != 0) + return; + + mplayInfo->fadeOC = mplayInfo->fadeOI; + + if (mplayInfo->fadeOV & FADE_IN) { + if ((u16)(mplayInfo->fadeOV += (4 << FADE_VOL_SHIFT)) >= (64 << FADE_VOL_SHIFT)) { + mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT); + mplayInfo->fadeOI = 0; + } + } else { + if ((s16)(mplayInfo->fadeOV -= (4 << FADE_VOL_SHIFT)) <= 0) { + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + + while (i > 0) { + u32 val; + + TrackStop(mplayInfo, track); + + fadeOV = mplayInfo->fadeOV; + val = TEMPORARY_FADE; + val &= fadeOV; + + if (!val) + track->flags = 0; + + i--; + track++; + } + + if (mplayInfo->fadeOV & TEMPORARY_FADE) + mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE; + else + mplayInfo->status = MUSICPLAYER_STATUS_PAUSE; + + mplayInfo->fadeOI = 0; + return; + } + } + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + + while (i > 0) { + if (track->flags & MPT_FLG_EXIST) { + fadeOV = mplayInfo->fadeOV; + + track->volX = (fadeOV >> FADE_VOL_SHIFT); + track->flags |= MPT_FLG_VOLCHG; + } + + i--; + track++; + } +} + +void TrkVolPitSet(struct MusicPlayerInfo* mplayInfo, struct MusicPlayerTrack* track) { + if (track->flags & MPT_FLG_VOLSET) { + s32 x; + s32 y; + + x = (u32)(track->vol * track->volX) >> 5; + + if (track->modT == 1) + x = (u32)(x * (track->modM + 128)) >> 7; + + y = 2 * track->pan + track->panX; + + if (track->modT == 2) + y += track->modM; + + if (y < -128) + y = -128; + else if (y > 127) + y = 127; + + track->volMR = (u32)((y + 128) * x) >> 8; + track->volML = (u32)((127 - y) * x) >> 8; + } + + if (track->flags & MPT_FLG_PITSET) { + s32 bend = track->bend * track->bendRange; + s32 x = (track->tune + bend) * 4 + (track->keyShift << 8) + (track->keyShiftX << 8) + track->pitX; + + if (track->modT == 0) + x += 16 * track->modM; + + track->keyM = x >> 8; + track->pitM = x; + } + + track->flags &= ~(MPT_FLG_PITSET | MPT_FLG_VOLSET); +} + +u32 MidiKeyToCgbFreq(u8 chanNum, u8 key, u8 fineAdjust) { + if (chanNum == 4) { + if (key <= 20) { + key = 0; + } else { + key -= 21; + if (key > 59) + key = 59; + } + + return gNoiseTable[key]; + } else { + s32 val1; + s32 val2; + + if (key <= 35) { + fineAdjust = 0; + key = 0; + } else { + key -= 36; + if (key > 130) { + key = 130; + fineAdjust = 255; + } + } + + val1 = gCgbScaleTable[key]; + val1 = gCgbFreqTable[val1 & 0xF] >> (val1 >> 4); + + val2 = gCgbScaleTable[key + 1]; + val2 = gCgbFreqTable[val2 & 0xF] >> (val2 >> 4); + + return val1 + ((fineAdjust * (val2 - val1)) >> 8) + 2048; + } +} + +void CgbOscOff(u8 chanNum) { + switch (chanNum) { + case 1: + REG_NR12 = 8; + REG_NR14 = 0x80; + break; + case 2: + REG_NR22 = 8; + REG_NR24 = 0x80; + break; + case 3: + REG_NR30 = 0; + break; + default: + REG_NR42 = 8; + REG_NR44 = 0x80; + } +} + +// CgbModVol does not match because of this +static inline int CgbPan(struct CgbChannel* chan) { + u32 rightVolume = chan->rightVolume; + u32 leftVolume = chan->leftVolume; + // regalloc + if ((rightVolume = (u8)rightVolume) >= (leftVolume = (u8)leftVolume)) { + if (rightVolume / 2 >= leftVolume) { + chan->pan = 0x0F; + return 1; + } + } else { + if (leftVolume / 2 >= rightVolume) { + chan->pan = 0xF0; + return 1; + } + } + + return 0; +} + +NONMATCH("asm/non_matching/m4a/CgbModVol.inc", void CgbModVol(struct CgbChannel* chan)) { + struct SoundInfo* soundInfo = SOUND_INFO_PTR; + + if (!CgbPan(chan)) { + chan->pan = 0xFF; + chan->eg = (u32)(chan->rightVolume + chan->leftVolume) >> 4; + } 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 NONMATCHING + asm("" : : : "memory"); +#endif + + chan->eg = (u32)(chan->rightVolume + chan->leftVolume) >> 4; + if (chan->eg > 15) + chan->eg = 15; + } + + chan->sg = (chan->eg * chan->su + 15) >> 4; + chan->pan &= chan->panMask; +} +END_NONMATCH + +NONMATCH("asm/non_matching/m4a/CgbSound.inc", void CgbSound(void)) { + s32 ch; + struct CgbChannel* channels; + s32 envelopeStepTimeAndDir; + s32 prevC15; + struct SoundInfo* soundInfo = SOUND_INFO_PTR; + vu8* nrx0ptr; + vu8* nrx1ptr; + vu8* nrx2ptr; + vu8* nrx3ptr; + vu8* nrx4ptr; + + // Most comparision operations that cast to s8 perform 'and' by 0xFF. + int mask = 0xff; + + if (soundInfo->c15) + soundInfo->c15--; + else + soundInfo->c15 = 14; + + for (ch = 1, channels = soundInfo->cgbChans; ch <= 4; ch++, channels++) { + if (!(channels->sf & SOUND_CHANNEL_SF_ON)) + continue; + + /* 1. determine hardware channel registers */ + switch (ch) { + case 1: + nrx0ptr = (vu8*)(REG_ADDR_NR10); + nrx1ptr = (vu8*)(REG_ADDR_NR11); + nrx2ptr = (vu8*)(REG_ADDR_NR12); + nrx3ptr = (vu8*)(REG_ADDR_NR13); + nrx4ptr = (vu8*)(REG_ADDR_NR14); + break; + case 2: + nrx0ptr = (vu8*)(REG_ADDR_NR10 + 1); + nrx1ptr = (vu8*)(REG_ADDR_NR21); + nrx2ptr = (vu8*)(REG_ADDR_NR22); + nrx3ptr = (vu8*)(REG_ADDR_NR23); + nrx4ptr = (vu8*)(REG_ADDR_NR24); + break; + case 3: + nrx0ptr = (vu8*)(REG_ADDR_NR30); + nrx1ptr = (vu8*)(REG_ADDR_NR31); + nrx2ptr = (vu8*)(REG_ADDR_NR32); + nrx3ptr = (vu8*)(REG_ADDR_NR33); + nrx4ptr = (vu8*)(REG_ADDR_NR34); + break; + default: + nrx0ptr = (vu8*)(REG_ADDR_NR30 + 1); + nrx1ptr = (vu8*)(REG_ADDR_NR41); + nrx2ptr = (vu8*)(REG_ADDR_NR42); + nrx3ptr = (vu8*)(REG_ADDR_NR43); + nrx4ptr = (vu8*)(REG_ADDR_NR44); + break; + } + + prevC15 = soundInfo->c15; + envelopeStepTimeAndDir = *nrx2ptr; + + /* 2. calculate envelope volume */ + if (channels->sf & SOUND_CHANNEL_SF_START) { + if (!(channels->sf & SOUND_CHANNEL_SF_STOP)) { + channels->sf = SOUND_CHANNEL_SF_ENV_ATTACK; + channels->mo = CGB_CHANNEL_MO_PIT | CGB_CHANNEL_MO_VOL; + CgbModVol(channels); + switch (ch) { + case 1: + *nrx0ptr = channels->sw; + // fallthrough + case 2: + *nrx1ptr = ((u32)channels->wp << 6) + channels->le; + goto init_env_step_time_dir; + case 3: + if (channels->wp != channels->cp) { + *nrx0ptr = 0x40; + REG_WAVE_RAM0 = channels->wp[0]; + REG_WAVE_RAM1 = channels->wp[1]; + REG_WAVE_RAM2 = channels->wp[2]; + REG_WAVE_RAM3 = channels->wp[3]; + channels->cp = channels->wp; + } + *nrx0ptr = 0; + *nrx1ptr = channels->le; + if (channels->le) + channels->n4 = 0xC0; + else + channels->n4 = 0x80; + break; + default: + *nrx1ptr = channels->le; + *nrx3ptr = (u32)channels->wp << 3; + init_env_step_time_dir: + envelopeStepTimeAndDir = channels->at + CGB_NRx2_ENV_DIR_INC; + if (channels->le) + channels->n4 = 0x40; + else + channels->n4 = 0x00; + break; + } + channels->ec = channels->at; + if ((s8)(channels->at & mask)) { + channels->ev = 0; + goto envelope_step_complete; + } else { + // skip attack phase if attack is instantaneous (=0) + goto envelope_decay_start; + } + } else { + goto oscillator_off; + } + } else if (channels->sf & SOUND_CHANNEL_SF_IEC) { + channels->echoLength--; + if ((s8)(channels->echoLength & mask) <= 0) { + oscillator_off: + CgbOscOff(ch); + channels->sf = 0; + goto channel_complete; + } + goto envelope_complete; + } else if ((channels->sf & SOUND_CHANNEL_SF_STOP) && (channels->sf & SOUND_CHANNEL_SF_ENV)) { + channels->sf &= ~SOUND_CHANNEL_SF_ENV; + channels->ec = channels->re; + if ((s8)(channels->re & mask)) { + channels->mo |= CGB_CHANNEL_MO_VOL; + if (ch != 3) + envelopeStepTimeAndDir = channels->re | CGB_NRx2_ENV_DIR_DEC; + goto envelope_step_complete; + } else { + goto envelope_pseudoecho_start; + } + } else { + envelope_step_repeat: + if (channels->ec == 0) { + if (ch == 3) + channels->mo |= CGB_CHANNEL_MO_VOL; + + CgbModVol(channels); + if ((channels->sf & SOUND_CHANNEL_SF_ENV) == SOUND_CHANNEL_SF_ENV_RELEASE) { + channels->ev--; + if ((s8)(channels->ev & mask) <= 0) { + envelope_pseudoecho_start: + channels->ev = ((channels->eg * channels->echoVolume) + 0xFF) >> 8; + if (channels->ev) { + channels->sf |= SOUND_CHANNEL_SF_IEC; + channels->mo |= CGB_CHANNEL_MO_VOL; + if (ch != 3) + envelopeStepTimeAndDir = 0 | CGB_NRx2_ENV_DIR_INC; + goto envelope_complete; + } else { + goto oscillator_off; + } + } else { + channels->ec = channels->re; + } + } else if ((channels->sf & SOUND_CHANNEL_SF_ENV) == SOUND_CHANNEL_SF_ENV_SUSTAIN) { + envelope_sustain: + channels->ev = channels->sg; + channels->ec = 7; + } else if ((channels->sf & SOUND_CHANNEL_SF_ENV) == SOUND_CHANNEL_SF_ENV_DECAY) { + int envelopeVolume, sustainGoal; + + channels->ev--; + envelopeVolume = (s8)(channels->ev & mask); + sustainGoal = (s8)(channels->sg); + if (envelopeVolume <= sustainGoal) { + envelope_sustain_start: + if (channels->su == 0) { + channels->sf &= ~SOUND_CHANNEL_SF_ENV; + goto envelope_pseudoecho_start; + } else { + channels->sf--; + channels->mo |= CGB_CHANNEL_MO_VOL; + if (ch != 3) + envelopeStepTimeAndDir = 0 | CGB_NRx2_ENV_DIR_INC; + goto envelope_sustain; + } + } else { + channels->ec = channels->de; + } + } else { + channels->ev++; + if ((u8)(channels->ev & mask) >= channels->eg) { + envelope_decay_start: + channels->sf--; + channels->ec = channels->de; + if ((u8)(channels->ec & mask)) { + channels->mo |= CGB_CHANNEL_MO_VOL; + channels->ev = channels->eg; + if (ch != 3) + envelopeStepTimeAndDir = channels->de | CGB_NRx2_ENV_DIR_DEC; + } else { + goto envelope_sustain_start; + } + } else { + channels->ec = channels->at; + } + } + } + } + + envelope_step_complete: + // every 15 frames, envelope calculation has to be done twice + // to keep up with the hardware envelope rate (1/64 s) + channels->ec--; + if (prevC15 == 0) { + prevC15--; + goto envelope_step_repeat; + } + + envelope_complete: + /* 3. apply pitch to HW registers */ + if (channels->mo & CGB_CHANNEL_MO_PIT) { + if (ch < 4 && (channels->ty & TONEDATA_TYPE_FIX)) { + int dac_pwm_rate = REG_SOUNDBIAS_H; + + if (dac_pwm_rate < 0x40) // if PWM rate = 32768 Hz + channels->fr = (channels->fr + 2) & 0x7fc; + else if (dac_pwm_rate < 0x80) // if PWM rate = 65536 Hz + channels->fr = (channels->fr + 1) & 0x7fe; + } + + if (ch != 4) + *nrx3ptr = channels->fr; + else + *nrx3ptr = (*nrx3ptr & 0x08) | channels->fr; + channels->n4 = (channels->n4 & 0xC0) + (*((u8*)(&channels->fr) + 1)); + *nrx4ptr = (s8)(channels->n4 & mask); + } + + /* 4. apply envelope & volume to HW registers */ + if (channels->mo & CGB_CHANNEL_MO_VOL) { + REG_NR51 = (REG_NR51 & ~channels->panMask) | channels->pan; + if (ch == 3) { + *nrx2ptr = gCgb3Vol[channels->ev]; + if (channels->n4 & 0x80) { + *nrx0ptr = 0x80; + *nrx4ptr = channels->n4; + channels->n4 &= 0x7f; + } + } else { + envelopeStepTimeAndDir &= 0xf; + *nrx2ptr = (channels->ev << 4) + envelopeStepTimeAndDir; + *nrx4ptr = channels->n4 | 0x80; + if (ch == 1 && !(*nrx0ptr & 0x08)) + *nrx4ptr = channels->n4 | 0x80; + } + } + + channel_complete: + channels->mo = 0; + } +} +END_NONMATCH + +void m4aMPlayTempoControl(struct MusicPlayerInfo* mplayInfo, u16 tempo) { + if (mplayInfo->ident == ID_NUMBER) { + mplayInfo->ident++; + mplayInfo->tempoU = tempo; + mplayInfo->tempoI = (mplayInfo->tempoD * mplayInfo->tempoU) >> 8; + mplayInfo->ident = ID_NUMBER; + } +} + +void m4aMPlayVolumeControl(struct MusicPlayerInfo* mplayInfo, u16 trackBits, u16 volume) { + s32 i; + u32 bit; + struct MusicPlayerTrack* track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + bit = 1; + + while (i > 0) { + if (trackBits & bit) { + if (track->flags & MPT_FLG_EXIST) { + track->volX = volume / 4; + track->flags |= MPT_FLG_VOLCHG; + } + } + + i--; + track++; + bit <<= 1; + } + + mplayInfo->ident = ID_NUMBER; +} + +void m4aMPlayPitchControl(struct MusicPlayerInfo* mplayInfo, u16 trackBits, s16 pitch) { + s32 i; + u32 bit; + struct MusicPlayerTrack* track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + bit = 1; + + while (i > 0) { + if (trackBits & bit) { + if (track->flags & MPT_FLG_EXIST) { + track->keyShiftX = pitch >> 8; + track->pitX = pitch; + track->flags |= MPT_FLG_PITCHG; + } + } + + i--; + track++; + bit <<= 1; + } + + mplayInfo->ident = ID_NUMBER; +} + +void m4aMPlayPanpotControl(struct MusicPlayerInfo* mplayInfo, u16 trackBits, s8 pan) { + s32 i; + u32 bit; + struct MusicPlayerTrack* track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + bit = 1; + + while (i > 0) { + if (trackBits & bit) { + if (track->flags & MPT_FLG_EXIST) { + track->panX = pan; + track->flags |= MPT_FLG_VOLCHG; + } + } + + i--; + track++; + bit <<= 1; + } + + mplayInfo->ident = ID_NUMBER; +} + +void ClearModM(struct MusicPlayerTrack* track) { + track->lfoSpeedC = 0; + track->modM = 0; + + if (track->modT == 0) + track->flags |= MPT_FLG_PITCHG; + else + track->flags |= MPT_FLG_VOLCHG; +} + +void m4aMPlayModDepthSet(struct MusicPlayerInfo* mplayInfo, u16 trackBits, u8 modDepth) { + s32 i; + u32 bit; + struct MusicPlayerTrack* track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + bit = 1; + + while (i > 0) { + if (trackBits & bit) { + if (track->flags & MPT_FLG_EXIST) { + track->mod = modDepth; + + if (!track->mod) + ClearModM(track); + } + } + + i--; + track++; + bit <<= 1; + } + + mplayInfo->ident = ID_NUMBER; +} + +void m4aMPlayLFOSpeedSet(struct MusicPlayerInfo* mplayInfo, u16 trackBits, u8 lfoSpeed) { + s32 i; + u32 bit; + struct MusicPlayerTrack* track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + bit = 1; + + while (i > 0) { + if (trackBits & bit) { + if (track->flags & MPT_FLG_EXIST) { + track->lfoSpeed = lfoSpeed; + + if (!track->lfoSpeed) + ClearModM(track); + } + } + + i--; + track++; + bit <<= 1; + } + + mplayInfo->ident = ID_NUMBER; +} + +#define MEMACC_COND_JUMP(cond) \ + if (cond) \ + goto cond_true; \ + else \ + goto cond_false; + +void ply_memacc(struct MusicPlayerInfo* mplayInfo, struct MusicPlayerTrack* track) { + u32 op; + u8* addr; + u8 data; + + op = *track->cmdPtr; + track->cmdPtr++; + + addr = mplayInfo->memAccArea + *track->cmdPtr; + track->cmdPtr++; + + data = *track->cmdPtr; + track->cmdPtr++; + + switch (op) { + case 0: + *addr = data; + return; + case 1: + *addr += data; + return; + case 2: + *addr -= data; + return; + case 3: + *addr = mplayInfo->memAccArea[data]; + return; + case 4: + *addr += mplayInfo->memAccArea[data]; + return; + case 5: + *addr -= mplayInfo->memAccArea[data]; + return; + case 6: + MEMACC_COND_JUMP(*addr == data) + return; + case 7: + MEMACC_COND_JUMP(*addr != data) + return; + case 8: + MEMACC_COND_JUMP(*addr > data) + return; + case 9: + MEMACC_COND_JUMP(*addr >= data) + return; + case 10: + MEMACC_COND_JUMP(*addr <= data) + return; + case 11: + MEMACC_COND_JUMP(*addr < data) + return; + case 12: + MEMACC_COND_JUMP(*addr == mplayInfo->memAccArea[data]) + return; + case 13: + MEMACC_COND_JUMP(*addr != mplayInfo->memAccArea[data]) + return; + case 14: + MEMACC_COND_JUMP(*addr > mplayInfo->memAccArea[data]) + return; + case 15: + MEMACC_COND_JUMP(*addr >= mplayInfo->memAccArea[data]) + return; + case 16: + MEMACC_COND_JUMP(*addr <= mplayInfo->memAccArea[data]) + return; + case 17: + MEMACC_COND_JUMP(*addr < mplayInfo->memAccArea[data]) + return; + default: + return; + } + +cond_true : { + // *& is required for matching + ((MPlayFunc)(*&gMPlayJumpTable[1]))(mplayInfo, track); + return; +} + +cond_false: + track->cmdPtr += 4; +} + +void ply_xcmd(struct MusicPlayerInfo* mplayInfo, struct MusicPlayerTrack* track) { + u32 n = *track->cmdPtr; + track->cmdPtr++; + + gXcmdTable[n](mplayInfo, track); +} + +void ply_xxx(struct MusicPlayerInfo* mplayInfo, struct MusicPlayerTrack* track) { + ((MPlayFunc)(gMPlayJumpTable[0]))(mplayInfo, track); +} + +#define READ_XCMD_BYTE(var, n) \ + { \ + u32 byte = track->cmdPtr[(n)]; \ + byte <<= n * 8; \ + (var) &= ~(0xFF << (n * 8)); \ + (var) |= byte; \ + } + +void ply_xwave(struct MusicPlayerInfo* mplayInfo, struct MusicPlayerTrack* track) { + u32 wav; + + READ_XCMD_BYTE(wav, 0) // UB: uninitialized variable + READ_XCMD_BYTE(wav, 1) + READ_XCMD_BYTE(wav, 2) + READ_XCMD_BYTE(wav, 3) + + track->tone.wav = (struct WaveData*)wav; + track->cmdPtr += 4; +} + +void ply_xtype(struct MusicPlayerInfo* mplayInfo, struct MusicPlayerTrack* track) { + track->tone.type = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xatta(struct MusicPlayerInfo* mplayInfo, struct MusicPlayerTrack* track) { + track->tone.attack = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xdeca(struct MusicPlayerInfo* mplayInfo, struct MusicPlayerTrack* track) { + track->tone.decay = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xsust(struct MusicPlayerInfo* mplayInfo, struct MusicPlayerTrack* track) { + track->tone.sustain = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xrele(struct MusicPlayerInfo* mplayInfo, struct MusicPlayerTrack* track) { + track->tone.release = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xiecv(struct MusicPlayerInfo* mplayInfo, struct MusicPlayerTrack* track) { + track->echoVolume = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xiecl(struct MusicPlayerInfo* mplayInfo, struct MusicPlayerTrack* track) { + track->echoLength = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xleng(struct MusicPlayerInfo* mplayInfo, struct MusicPlayerTrack* track) { + track->tone.length = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xswee(struct MusicPlayerInfo* mplayInfo, struct MusicPlayerTrack* track) { + track->tone.pan_sweep = *track->cmdPtr; + track->cmdPtr++; +} + +void nullsub_544() { +} \ No newline at end of file