pokeemerald/src/m4a_1.s
2022-05-17 14:00:02 -04:00

1917 lines
39 KiB
ArmAsm

.include "asm/macros.inc"
.include "constants/gba_constants.inc"
.include "constants/m4a_constants.inc"
.syntax unified
.text
thumb_func_start umul3232H32
umul3232H32:
adr r2, __umul3232H32
bx r2
.arm
__umul3232H32:
umull r2, r3, r0, r1
add r0, r3, 0
bx lr
thumb_func_end umul3232H32
thumb_func_start SoundMain
SoundMain:
ldr r0, lt_SOUND_INFO_PTR
ldr r0, [r0]
ldr r2, lt_ID_NUMBER
ldr r3, [r0, o_SoundInfo_ident]
cmp r2, r3
beq SoundMain_1
bx lr @ Exit the function if ident doesn't match ID_NUMBER.
SoundMain_1:
adds r3, 1
str r3, [r0, o_SoundInfo_ident]
push {r4-r7,lr}
mov r1, r8
mov r2, r9
mov r3, r10
mov r4, r11
push {r0-r4}
sub sp, 0x18
ldrb r1, [r0, o_SoundInfo_maxLines]
cmp r1, 0 @ if maxLines is 0, there is no maximum
beq SoundMain_3
ldr r2, lt_REG_VCOUNT
ldrb r2, [r2]
cmp r2, VCOUNT_VBLANK
bhs SoundMain_2
adds r2, TOTAL_SCANLINES
SoundMain_2:
adds r1, r2
SoundMain_3:
str r1, [sp, 0x14]
ldr r3, [r0, o_SoundInfo_MPlayMainHead]
cmp r3, 0
beq SoundMain_4
ldr r0, [r0, o_SoundInfo_musicPlayerHead]
bl _081DD25E
ldr r0, [sp, 0x18]
SoundMain_4:
ldr r3, [r0, o_SoundInfo_CgbSound]
bl _081DD25E
ldr r0, [sp, 0x18]
ldr r3, [r0, o_SoundInfo_pcmSamplesPerVBlank]
mov r8, r3
ldr r5, lt_o_SoundInfo_pcmBuffer
adds r5, r0
ldrb r4, [r0, o_SoundInfo_pcmDmaCounter]
subs r7, r4, 1
bls SoundMain_5
ldrb r1, [r0, o_SoundInfo_pcmDmaPeriod]
subs r1, r7
mov r2, r8
muls r2, r1
adds r5, r2
SoundMain_5:
str r5, [sp, 0x8]
ldr r6, lt_PCM_DMA_BUF_SIZE
ldr r3, lt_SoundMainRAM_Buffer
bx r3
.align 2, 0
lt_SOUND_INFO_PTR: .word SOUND_INFO_PTR
lt_ID_NUMBER: .word ID_NUMBER
lt_SoundMainRAM_Buffer: .word SoundMainRAM_Buffer + 1
lt_REG_VCOUNT: .word REG_VCOUNT
lt_o_SoundInfo_pcmBuffer: .word o_SoundInfo_pcmBuffer
lt_PCM_DMA_BUF_SIZE: .word PCM_DMA_BUF_SIZE
thumb_func_end SoundMain
thumb_func_start SoundMainRAM
SoundMainRAM:
ldrb r3, [r0, o_SoundInfo_reverb]
cmp r3, 0
beq SoundMainRAM_NoReverb
adr r1, SoundMainRAM_Reverb
bx r1
.arm
SoundMainRAM_Reverb:
cmp r4, 0x2
addeq r7, r0, o_SoundInfo_pcmBuffer
addne r7, r5, r8
mov r4, r8
_081DCEC4:
ldrsb r0, [r5, r6]
ldrsb r1, [r5]
add r0, r0, r1
ldrsb r1, [r7, r6]
add r0, r0, r1
ldrsb r1, [r7], 0x1
add r0, r0, r1
mul r1, r0, r3
mov r0, r1, asr 9
tst r0, 0x80
addne r0, r0, 0x1
strb r0, [r5, r6]
strb r0, [r5], 0x1
subs r4, r4, 0x1
bgt _081DCEC4
adr r0, _081DCF36 + 1 @ plus 1 because THUMB
bx r0
.thumb
SoundMainRAM_NoReverb:
movs r0, 0
mov r1, r8
adds r6, r5
lsrs r1, 3
bcc SoundMainRAM_NoReverb_Ok
stm r5!, {r0}
stm r6!, {r0}
SoundMainRAM_NoReverb_Ok:
lsrs r1, 1
bcc SoundMainRAM_NoReverb_Loop
stm r5!, {r0}
stm r6!, {r0}
stm r5!, {r0}
stm r6!, {r0}
SoundMainRAM_NoReverb_Loop:
stm r5!, {r0}
stm r6!, {r0}
stm r5!, {r0}
stm r6!, {r0}
stm r5!, {r0}
stm r6!, {r0}
stm r5!, {r0}
stm r6!, {r0}
subs r1, 1
bgt SoundMainRAM_NoReverb_Loop
_081DCF36:
ldr r4, [sp, 0x18]
ldr r0, [r4, o_SoundInfo_divFreq]
mov r12, r0
ldrb r0, [r4, o_SoundInfo_maxChans]
adds r4, o_SoundInfo_chans
SoundMainRAM_ChanLoop:
str r0, [sp, 0x4]
ldr r3, [r4, o_SoundChannel_wav]
ldr r0, [sp, 0x14]
cmp r0, 0
beq _081DCF60
ldr r1, =REG_VCOUNT
ldrb r1, [r1]
cmp r1, VCOUNT_VBLANK
bhs _081DCF54
adds r1, TOTAL_SCANLINES
_081DCF54:
cmp r1, r0
blo _081DCF60
b _081DD24A
.pool
_081DCF60:
ldrb r6, [r4, o_SoundChannel_statusFlags]
movs r0, SOUND_CHANNEL_SF_ON
tst r0, r6
bne _081DCF6A
b _081DD240
_081DCF6A:
movs r0, SOUND_CHANNEL_SF_START
tst r0, r6
beq _081DCFA0
movs r0, SOUND_CHANNEL_SF_STOP
tst r0, r6
bne _081DCFB0
movs r6, SOUND_CHANNEL_SF_ENV_ATTACK
strb r6, [r4, o_SoundChannel_statusFlags]
adds r0, r3, 0
adds r0, o_WaveData_data
ldr r1, [r4, o_SoundChannel_count]
adds r0, r1
str r0, [r4, o_SoundChannel_currentPointer]
ldr r0, [r3, o_WaveData_size]
subs r0, r1
str r0, [r4, o_SoundChannel_count]
movs r5, 0
strb r5, [r4, o_SoundChannel_envelopeVolume]
str r5, [r4, o_SoundChannel_fw]
ldrb r2, [r3, o_WaveData_flags]
movs r0, WAVE_DATA_FLAG_LOOP
tst r0, r2
beq _081DCFF8
movs r0, SOUND_CHANNEL_SF_LOOP
orrs r6, r0
strb r6, [r4, o_SoundChannel_statusFlags]
b _081DCFF8
_081DCFA0:
ldrb r5, [r4, o_SoundChannel_envelopeVolume]
movs r0, SOUND_CHANNEL_SF_IEC
tst r0, r6
beq _081DCFB6
ldrb r0, [r4, o_SoundChannel_pseudoEchoLength]
subs r0, 1
strb r0, [r4, o_SoundChannel_pseudoEchoLength]
bhi _081DD006
_081DCFB0:
movs r0, 0
strb r0, [r4, o_SoundChannel_statusFlags]
b _081DD240
_081DCFB6:
movs r0, SOUND_CHANNEL_SF_STOP
tst r0, r6
beq _081DCFD6
ldrb r0, [r4, o_SoundChannel_release]
muls r5, r0
lsrs r5, 8
ldrb r0, [r4, o_SoundChannel_pseudoEchoVolume]
cmp r5, r0
bhi _081DD006
_081DCFC8:
ldrb r5, [r4, o_SoundChannel_pseudoEchoVolume]
cmp r5, 0
beq _081DCFB0
movs r0, SOUND_CHANNEL_SF_IEC
orrs r6, r0
strb r6, [r4, o_SoundChannel_statusFlags]
b _081DD006
_081DCFD6:
movs r2, SOUND_CHANNEL_SF_ENV
ands r2, r6
cmp r2, SOUND_CHANNEL_SF_ENV_DECAY
bne _081DCFF4
ldrb r0, [r4, o_SoundChannel_decay]
muls r5, r0
lsrs r5, 8
ldrb r0, [r4, o_SoundChannel_sustain]
cmp r5, r0
bhi _081DD006
adds r5, r0, 0
beq _081DCFC8
subs r6, 0x1
strb r6, [r4, o_SoundChannel_statusFlags]
b _081DD006
_081DCFF4:
cmp r2, SOUND_CHANNEL_SF_ENV_ATTACK
bne _081DD006
_081DCFF8:
ldrb r0, [r4, o_SoundChannel_attack]
adds r5, r0
cmp r5, 0xFF
bcc _081DD006
movs r5, 0xFF
subs r6, 0x1
strb r6, [r4, o_SoundChannel_statusFlags]
_081DD006:
strb r5, [r4, o_SoundChannel_envelopeVolume]
ldr r0, [sp, 0x18]
ldrb r0, [r0, o_SoundChannel_release]
adds r0, 0x1
muls r0, r5
lsrs r5, r0, 4
ldrb r0, [r4, o_SoundChannel_rightVolume]
muls r0, r5
lsrs r0, 8
strb r0, [r4, o_SoundChannel_envelopeVolumeRight]
ldrb r0, [r4, o_SoundChannel_leftVolume]
muls r0, r5
lsrs r0, 8
strb r0, [r4, o_SoundChannel_envelopeVolumeLeft]
movs r0, SOUND_CHANNEL_SF_LOOP
ands r0, r6
str r0, [sp, 0x10]
beq _081DD03A
adds r0, r3, 0
adds r0, o_WaveData_data
ldr r1, [r3, o_WaveData_loopStart]
adds r0, r1
str r0, [sp, 0xC]
ldr r0, [r3, o_WaveData_size]
subs r0, r1
str r0, [sp, 0x10]
_081DD03A:
ldr r5, [sp, 0x8]
ldr r2, [r4, o_SoundChannel_count]
ldr r3, [r4, o_SoundChannel_currentPointer]
adr r0, _081DD044
bx r0
.arm
_081DD044:
str r8, [sp]
ldr r9, [r4, o_SoundChannel_fw]
ldrb r10, [r4, o_SoundChannel_envelopeVolumeRight]
ldrb r11, [r4, o_SoundChannel_envelopeVolumeLeft]
ldrb r0, [r4, o_SoundChannel_type]
tst r0, TONEDATA_TYPE_CMP | TONEDATA_TYPE_REV
beq _081DD068
bl SoundMainRAM_Unk1
b _081DD228
_081DD068:
mov r10, r10, lsl 16
mov r11, r11, lsl 16
ldrb r0, [r4, o_SoundChannel_type]
tst r0, 0x8
beq _081DD19C
_081DD07C:
cmp r2, 0x4
ble _081DD0EC
subs r2, r2, r8
movgt r9, 0
bgt _081DD0A8
mov r9, r8
add r2, r2, r8
sub r8, r2, 0x4
sub r9, r9, r8
ands r2, r2, 0x3
moveq r2, 0x4
_081DD0A8:
ldr r6, [r5]
ldr r7, [r5, PCM_DMA_BUF_SIZE]
_081DD0B0:
ldrsb r0, [r3], 0x1
mul r1, r10, r0
bic r1, r1, 0xFF0000
add r6, r1, r6, ror 8
mul r1, r11, r0
bic r1, r1, 0xFF0000
add r7, r1, r7, ror 8
adds r5, r5, 0x40000000
bcc _081DD0B0
str r7, [r5, PCM_DMA_BUF_SIZE]
str r6, [r5], 0x4
subs r8, r8, 0x4
bgt _081DD0A8
adds r8, r8, r9
beq _081DD22C
_081DD0EC:
ldr r6, [r5]
ldr r7, [r5, PCM_DMA_BUF_SIZE]
_081DD0F4:
ldrsb r0, [r3], 0x1
mul r1, r10, r0
bic r1, r1, 0xFF0000
add r6, r1, r6, ror 8
mul r1, r11, r0
bic r1, r1, 0xFF0000
add r7, r1, r7, ror 8
subs r2, r2, 0x1
beq _081DD164
_081DD118:
adds r5, r5, 0x40000000
bcc _081DD0F4
str r7, [r5, PCM_DMA_BUF_SIZE]
str r6, [r5], 0x4
subs r8, r8, 0x4
bgt _081DD07C
b _081DD22C
_081DD134:
ldr r0, [sp, 0x18]
cmp r0, 0
beq _081DD158
ldr r3, [sp, 0x14]
rsb lr, r2, 0
_081DD148:
adds r2, r0, r2
bgt _081DD1FC
sub lr, lr, r0
b _081DD148
_081DD158:
pop {r4,r12}
mov r2, 0
b _081DD174
_081DD164:
ldr r2, [sp, 0x10]
cmp r2, 0
ldrne r3, [sp, 0xC]
bne _081DD118
_081DD174:
strb r2, [r4, o_SoundChannel_statusFlags]
mov r0, r5, lsr 30
bic r5, r5, 0xC0000000
rsb r0, r0, 0x3
mov r0, r0, lsl 3
mov r6, r6, ror r0
mov r7, r7, ror r0
str r7, [r5, PCM_DMA_BUF_SIZE]
str r6, [r5], 0x4
b _081DD234
_081DD19C:
push {r4,r12}
ldr r1, [r4, o_SoundChannel_frequency]
mul r4, r12, r1
ldrsb r0, [r3]
ldrsb r1, [r3, 0x1]!
sub r1, r1, r0
_081DD1B4:
ldr r6, [r5]
ldr r7, [r5, PCM_DMA_BUF_SIZE]
_081DD1BC:
mul lr, r9, r1
add lr, r0, lr, asr 23
mul r12, r10, lr
bic r12, r12, 0xFF0000
add r6, r12, r6, ror 8
mul r12, r11, lr
bic r12, r12, 0xFF0000
add r7, r12, r7, ror 8
add r9, r9, r4
movs lr, r9, lsr 23
beq _081DD208
bic r9, r9, 0x3F800000
subs r2, r2, lr
ble _081DD134
subs lr, lr, 0x1
addeq r0, r0, r1
_081DD1FC:
ldrsbne r0, [r3, lr]!
ldrsb r1, [r3, 0x1]!
sub r1, r1, r0
_081DD208:
adds r5, r5, 0x40000000
bcc _081DD1BC
str r7, [r5, PCM_DMA_BUF_SIZE]
str r6, [r5], 0x4
subs r8, r8, 0x4
bgt _081DD1B4
sub r3, r3, 0x1
pop {r4,r12}
_081DD228:
str r9, [r4, o_SoundChannel_fw]
_081DD22C:
str r2, [r4, o_SoundChannel_count]
str r3, [r4, o_SoundChannel_currentPointer]
_081DD234:
ldr r8, [sp]
add r0, pc, 0x1
bx r0
.thumb
_081DD240:
ldr r0, [sp, 0x4]
subs r0, 1
ble _081DD24A
adds r4, SoundChannel_size
b SoundMainRAM_ChanLoop
_081DD24A:
ldr r0, [sp, 0x18]
ldr r3, =ID_NUMBER
str r3, [r0]
add sp, 0x1C
pop {r0-r7}
mov r8, r0
mov r9, r1
mov r10, r2
mov r11, r3
pop {r3}
_081DD25E:
bx r3
.pool
thumb_func_end SoundMainRAM
@ Not present in GBA SDK 3.0
arm_func_start SoundMainRAM_Unk1
SoundMainRAM_Unk1:
ldr r6, [r4, o_SoundChannel_wav]
ldrb r0, [r4, o_SoundChannel_statusFlags]
tst r0, SOUND_CHANNEL_SF_SPECIAL
bne _081DD2B4
orr r0, r0, SOUND_CHANNEL_SF_SPECIAL
strb r0, [r4, o_SoundChannel_statusFlags]
ldrb r0, [r4, o_SoundChannel_type]
tst r0, TONEDATA_TYPE_REV
beq _081DD29C
ldr r1, [r6, o_WaveData_size]
add r1, r1, r6, lsl 1
add r1, r1, 0x20
sub r3, r1, r3
str r3, [r4, o_SoundChannel_currentPointer]
_081DD29C:
ldrh r0, [r6, o_WaveData_type]
cmp r0, 0
beq _081DD2B4
sub r3, r3, r6
sub r3, r3, 0x10
str r3, [r4, o_SoundChannel_currentPointer]
_081DD2B4:
push {r8,r12,lr}
mov r10, r10, lsl 16
mov r11, r11, lsl 16
ldr r1, [r4, o_SoundChannel_frequency]
ldrb r0, [r4, o_SoundChannel_type]
tst r0, TONEDATA_TYPE_FIX
movne r8, 0x800000
muleq r8, r12, r1
ldrh r0, [r6, o_WaveData_type]
cmp r0, 0
beq _081DD468
mov r0, 0xFF000000
str r0, [r4, o_SoundChannel_xpi]
ldrb r0, [r4, o_SoundChannel_type]
tst r0, TONEDATA_TYPE_REV
bne _081DD3C0
bl SoundMainRAM_Unk2
mov r0, r1
add r3, r3, 0x1
bl SoundMainRAM_Unk2
sub r1, r1, r0
_081DD308:
ldr r6, [r5]
ldr r7, [r5, PCM_DMA_BUF_SIZE]
_081DD310:
mul lr, r9, r1
add lr, r0, lr, asr 23
mul r12, r10, lr
bic r12, r12, 0xFF0000
add r6, r12, r6, ror 8
mul r12, r11, lr
bic r12, r12, 0xFF0000
add r7, r12, r7, ror 8
add r9, r9, r8
movs lr, r9, lsr 23
beq _081DD370
bic r9, r9, 0x3F800000
subs r2, r2, lr
ble _081DD398
subs lr, lr, 0x1
bne _081DD358
add r0, r0, r1
b _081DD364
_081DD358:
add r3, r3, lr
bl SoundMainRAM_Unk2
mov r0, r1
_081DD364:
add r3, r3, 0x1
bl SoundMainRAM_Unk2
sub r1, r1, r0
_081DD370:
adds r5, r5, 0x40000000
bcc _081DD310
str r7, [r5, PCM_DMA_BUF_SIZE]
str r6, [r5], 0x4
ldr r6, [sp]
subs r6, r6, 0x4
str r6, [sp]
bgt _081DD308
sub r3, r3, 0x1
b _081DD4F0
_081DD398:
ldr r0, [sp, 0x1C]
cmp r0, 0
beq _081DD4F4
ldr r3, [r4, o_SoundChannel_wav]
ldr r3, [r3, o_WaveData_loopStart]
rsb lr, r2, 0
_081DD3B0:
adds r2, r2, r0
bgt _081DD358
sub lr, lr, r0
b _081DD3B0
_081DD3C0:
sub r3, r3, 0x1
bl SoundMainRAM_Unk2
mov r0, r1
sub r3, r3, 0x1
bl SoundMainRAM_Unk2
sub r1, r1, r0
_081DD3D8:
ldr r6, [r5]
ldr r7, [r5, PCM_DMA_BUF_SIZE]
_081DD3E0:
mul lr, r9, r1
add lr, r0, lr, asr 23
mul r12, r10, lr
bic r12, r12, 0xFF0000
add r6, r12, r6, ror 8
mul r12, r11, lr
bic r12, r12, 0xFF0000
add r7, r12, r7, ror 8
add r9, r9, r8
movs lr, r9, lsr 23
beq _081DD440
bic r9, r9, 0x3F800000
subs r2, r2, lr
ble _081DD4F4
subs lr, lr, 0x1
bne _081DD428
add r0, r0, r1
b _081DD434
_081DD428:
sub r3, r3, lr
bl SoundMainRAM_Unk2
mov r0, r1
_081DD434:
sub r3, r3, 0x1
bl SoundMainRAM_Unk2
sub r1, r1, r0
_081DD440:
adds r5, r5, 0x40000000
bcc _081DD3E0
str r7, [r5, PCM_DMA_BUF_SIZE]
str r6, [r5], 0x4
ldr r6, [sp]
subs r6, r6, 0x4
str r6, [sp]
bgt _081DD3D8
add r3, r3, 0x2
b _081DD4F0
_081DD468:
ldrb r0, [r4, o_SoundChannel_type]
tst r0, TONEDATA_TYPE_REV
beq _081DD4F0
ldrsb r0, [r3, -0x1]!
ldrsb r1, [r3, -0x1]
sub r1, r1, r0
_081DD480:
ldr r6, [r5]
ldr r7, [r5, 0x630]
_081DD488:
mul lr, r9, r1
add lr, r0, lr, asr 23
mul r12, r10, lr
bic r12, r12, 0xFF0000
add r6, r12, r6, ror 8
mul r12, r11, lr
bic r12, r12, 0xFF0000
add r7, r12, r7, ror 8
add r9, r9, r8
movs lr, r9, lsr 23
beq _081DD4CC
bic r9, r9, 0x3F800000
subs r2, r2, lr
ble _081DD4F4
ldrsb r0, [r3, -lr]!
ldrsb r1, [r3, -0x1]
sub r1, r1, r0
_081DD4CC:
adds r5, r5, 0x40000000
bcc _081DD488
str r7, [r5, 0x630]
str r6, [r5], 0x4
ldr r6, [sp]
subs r6, r6, 0x4
str r6, [sp]
bgt _081DD480
add r3, r3, 0x1
_081DD4F0:
pop {r8,r12,pc}
_081DD4F4:
mov r2, 0
strb r2, [r4, o_SoundChannel_statusFlags]
mov r0, r5, lsr 30
bic r5, r5, 0xC0000000
rsb r0, r0, 0x3
mov r0, r0, lsl 3
mov r6, r6, ror r0
mov r7, r7, ror r0
str r7, [r5, 0x630]
str r6, [r5], 0x4
pop {r8,r12,pc}
arm_func_end SoundMainRAM_Unk1
@ Not present in GBA SDK 3.0
arm_func_start SoundMainRAM_Unk2
SoundMainRAM_Unk2:
push {r0,r2,r5-r7,lr}
mov r0, r3, lsr 6
ldr r1, [r4, o_SoundChannel_xpi]
cmp r0, r1
beq _081DD594
str r0, [r4, o_SoundChannel_xpi]
mov r1, 0x21
mul r2, r1, r0
ldr r1, [r4, o_SoundChannel_wav]
add r2, r2, r1
add r2, r2, 0x10
ldr r5, =sDecodingBuffer
ldr r6, =gDeltaEncodingTable
mov r7, 0x40
ldrb lr, [r2], 1
strb lr, [r5], 1
ldrb r1, [r2], 1
b _081DD57C
_081DD568:
ldrb r1, [r2], 1
mov r0, r1, lsr 4
ldrsb r0, [r6, r0]
add lr, lr, r0
strb lr, [r5], 1
_081DD57C:
and r0, r1, 0xF
ldrsb r0, [r6, r0]
add lr, lr, r0
strb lr, [r5], 1
subs r7, r7, 2
bgt _081DD568
_081DD594:
ldr r5, =sDecodingBuffer
and r0, r3, 0x3F
ldrsb r1, [r5, r0]
pop {r0,r2,r5-r7,pc}
.pool
arm_func_end SoundMainRAM_Unk2
thumb_func_start SoundMainBTM
SoundMainBTM:
mov r12, r4
movs r1, 0
movs r2, 0
movs r3, 0
movs r4, 0
stm r0!, {r1-r4}
stm r0!, {r1-r4}
stm r0!, {r1-r4}
stm r0!, {r1-r4}
mov r4, r12
bx lr
thumb_func_end SoundMainBTM
thumb_func_start RealClearChain
RealClearChain:
ldr r3, [r0, o_SoundChannel_track]
cmp r3, 0
beq _081DD5E2
ldr r1, [r0, o_SoundChannel_nextChannelPointer]
ldr r2, [r0, o_SoundChannel_prevChannelPointer]
cmp r2, 0
beq _081DD5D6
str r1, [r2, o_SoundChannel_nextChannelPointer]
b _081DD5D8
_081DD5D6:
str r1, [r3, o_MusicPlayerTrack_chan]
_081DD5D8:
cmp r1, 0
beq _081DD5DE
str r2, [r1, o_SoundChannel_prevChannelPointer]
_081DD5DE:
movs r1, 0
str r1, [r0, o_SoundChannel_track]
_081DD5E2:
bx lr
thumb_func_end RealClearChain
thumb_func_start ply_fine
ply_fine:
push {r4,r5,lr}
adds r5, r1, 0
ldr r4, [r5, o_MusicPlayerTrack_chan]
cmp r4, 0
beq ply_fine_done
ply_fine_loop:
ldrb r1, [r4, o_SoundChannel_statusFlags]
movs r0, SOUND_CHANNEL_SF_ON
tst r0, r1
beq ply_fine_ok
movs r0, SOUND_CHANNEL_SF_STOP
orrs r1, r0
strb r1, [r4, o_SoundChannel_statusFlags]
ply_fine_ok:
adds r0, r4, 0
bl RealClearChain
ldr r4, [r4, o_SoundChannel_nextChannelPointer]
cmp r4, 0
bne ply_fine_loop
ply_fine_done:
movs r0, 0
strb r0, [r5, o_MusicPlayerTrack_flags]
pop {r4,r5}
pop {r0}
bx r0
thumb_func_end ply_fine
thumb_func_start MPlayJumpTableCopy
MPlayJumpTableCopy:
mov r12, lr
movs r1, 0x24
ldr r2, lt_MPlayJumpTableTemplate
MPlayJumpTableCopy_Loop:
ldr r3, [r2]
bl chk_adr_r2
stm r0!, {r3}
adds r2, 0x4
subs r1, 0x1
bgt MPlayJumpTableCopy_Loop
bx r12
thumb_func_end MPlayJumpTableCopy
.align 2, 0
.thumb_func
ldrb_r3_r2:
ldrb r3, [r2]
@ This attempts to protect against reading anything from the BIOS ROM
@ besides the jump table template.
@ It assumes that the jump table template is located at the end of the ROM.
.thumb_func
chk_adr_r2:
push {r0}
lsrs r0, r2, 25
bne chk_adr_r2_done @ if adr >= 0x2000000 (i.e. not in BIOS ROM), accept it
ldr r0, lt_MPlayJumpTableTemplate
cmp r2, r0
blo chk_adr_r2_reject @ if adr < gMPlayJumpTableTemplate, reject it
lsrs r0, r2, 14
beq chk_adr_r2_done @ if adr < 0x40000 (i.e. in BIOS ROM), accept it
chk_adr_r2_reject:
movs r3, 0
chk_adr_r2_done:
pop {r0}
bx lr
.align 2, 0
lt_MPlayJumpTableTemplate: .word gMPlayJumpTableTemplate
thumb_func_start ld_r3_tp_adr_i
ld_r3_tp_adr_i:
ldr r2, [r1, o_MusicPlayerTrack_cmdPtr]
_081DD64A:
adds r3, r2, 0x1
str r3, [r1, o_MusicPlayerTrack_cmdPtr]
ldrb r3, [r2]
b chk_adr_r2
thumb_func_end ld_r3_tp_adr_i
thumb_func_start ply_goto
ply_goto:
push {lr}
ply_goto_1:
ldr r2, [r1, o_MusicPlayerTrack_cmdPtr]
ldrb r0, [r2, 0x3]
lsls r0, 8
ldrb r3, [r2, 0x2]
orrs r0, r3
lsls r0, 8
ldrb r3, [r2, 0x1]
orrs r0, r3
lsls r0, 8
bl ldrb_r3_r2
orrs r0, r3
str r0, [r1, o_MusicPlayerTrack_cmdPtr]
pop {r0}
bx r0
thumb_func_end ply_goto
thumb_func_start ply_patt
ply_patt:
ldrb r2, [r1, o_MusicPlayerTrack_patternLevel]
cmp r2, 3
bhs ply_patt_done
lsls r2, 2
adds r3, r1, r2
ldr r2, [r1, o_MusicPlayerTrack_cmdPtr]
adds r2, 0x4
str r2, [r3, o_MusicPlayerTrack_patternStack]
ldrb r2, [r1, o_MusicPlayerTrack_patternLevel]
adds r2, 1
strb r2, [r1, o_MusicPlayerTrack_patternLevel]
b ply_goto
ply_patt_done:
b ply_fine
thumb_func_end ply_patt
thumb_func_start ply_pend
ply_pend:
ldrb r2, [r1, o_MusicPlayerTrack_patternLevel]
cmp r2, 0
beq ply_pend_done
subs r2, 1
strb r2, [r1, o_MusicPlayerTrack_patternLevel]
lsls r2, 2
adds r3, r1, r2
ldr r2, [r3, o_MusicPlayerTrack_patternStack]
str r2, [r1, o_MusicPlayerTrack_cmdPtr]
ply_pend_done:
bx lr
thumb_func_end ply_pend
thumb_func_start ply_rept
ply_rept:
push {lr}
ldr r2, [r1, o_MusicPlayerTrack_cmdPtr]
ldrb r3, [r2]
cmp r3, 0
bne ply_rept_1
adds r2, 1
str r2, [r1, o_MusicPlayerTrack_cmdPtr]
b ply_goto_1
ply_rept_1:
ldrb r3, [r1, o_MusicPlayerTrack_repN]
adds r3, 1
strb r3, [r1, o_MusicPlayerTrack_repN]
mov r12, r3
bl ld_r3_tp_adr_i
cmp r12, r3
bhs ply_rept_2
b ply_goto_1
ply_rept_2:
movs r3, 0
strb r3, [r1, o_MusicPlayerTrack_repN]
adds r2, 5
str r2, [r1, o_MusicPlayerTrack_cmdPtr]
pop {r0}
bx r0
thumb_func_end ply_rept
thumb_func_start ply_prio
ply_prio:
mov r12, lr
bl ld_r3_tp_adr_i
strb r3, [r1, o_MusicPlayerTrack_priority]
bx r12
thumb_func_end ply_prio
thumb_func_start ply_tempo
ply_tempo:
mov r12, lr
bl ld_r3_tp_adr_i
lsls r3, 1
strh r3, [r0, o_MusicPlayerInfo_tempoD]
ldrh r2, [r0, o_MusicPlayerInfo_tempoU]
muls r3, r2
lsrs r3, 8
strh r3, [r0, o_MusicPlayerInfo_tempoI]
bx r12
thumb_func_end ply_tempo
thumb_func_start ply_keysh
ply_keysh:
mov r12, lr
bl ld_r3_tp_adr_i
strb r3, [r1, o_MusicPlayerTrack_keyShift]
ldrb r3, [r1, o_MusicPlayerTrack_flags]
movs r2, 0xC
orrs r3, r2
strb r3, [r1, o_MusicPlayerTrack_flags]
bx r12
thumb_func_end ply_keysh
thumb_func_start ply_voice
ply_voice:
mov r12, lr
ldr r2, [r1, o_MusicPlayerTrack_cmdPtr]
ldrb r3, [r2]
adds r2, 1
str r2, [r1, o_MusicPlayerTrack_cmdPtr]
lsls r2, r3, 1
adds r2, r3
lsls r2, 2
ldr r3, [r0, o_MusicPlayerInfo_tone]
adds r2, r3
ldr r3, [r2, o_ToneData_type]
bl chk_adr_r2
str r3, [r1, o_MusicPlayerTrack_ToneData_type]
ldr r3, [r2, o_ToneData_wav]
bl chk_adr_r2
str r3, [r1, o_MusicPlayerTrack_ToneData_wav]
ldr r3, [r2, o_ToneData_attack]
bl chk_adr_r2
str r3, [r1, o_MusicPlayerTrack_ToneData_attack]
bx r12
thumb_func_end ply_voice
thumb_func_start ply_vol
ply_vol:
mov r12, lr
bl ld_r3_tp_adr_i
strb r3, [r1, o_MusicPlayerTrack_vol]
ldrb r3, [r1, o_MusicPlayerTrack_flags]
movs r2, MPT_FLG_VOLCHG
orrs r3, r2
strb r3, [r1, o_MusicPlayerTrack_flags]
bx r12
thumb_func_end ply_vol
thumb_func_start ply_pan
ply_pan:
mov r12, lr
bl ld_r3_tp_adr_i
subs r3, C_V
strb r3, [r1, o_MusicPlayerTrack_pan]
ldrb r3, [r1, o_MusicPlayerTrack_flags]
movs r2, MPT_FLG_VOLCHG
orrs r3, r2
strb r3, [r1, o_MusicPlayerTrack_flags]
bx r12
thumb_func_end ply_pan
thumb_func_start ply_bend
ply_bend:
mov r12, lr
bl ld_r3_tp_adr_i
subs r3, C_V
strb r3, [r1, o_MusicPlayerTrack_bend]
ldrb r3, [r1, o_MusicPlayerTrack_flags]
movs r2, MPT_FLG_PITCHG
orrs r3, r2
strb r3, [r1, o_MusicPlayerTrack_flags]
bx r12
thumb_func_end ply_bend
thumb_func_start ply_bendr
ply_bendr:
mov r12, lr
bl ld_r3_tp_adr_i
strb r3, [r1, o_MusicPlayerTrack_bendRange]
ldrb r3, [r1, o_MusicPlayerTrack_flags]
movs r2, MPT_FLG_PITCHG
orrs r3, r2
strb r3, [r1, o_MusicPlayerTrack_flags]
bx r12
thumb_func_end ply_bendr
thumb_func_start ply_lfodl
ply_lfodl:
mov r12, lr
bl ld_r3_tp_adr_i
strb r3, [r1, o_MusicPlayerTrack_lfoDelay]
bx r12
thumb_func_end ply_lfodl
thumb_func_start ply_modt
ply_modt:
mov r12, lr
bl ld_r3_tp_adr_i
ldrb r0, [r1, o_MusicPlayerTrack_modT]
cmp r0, r3
beq _081DD7AA
strb r3, [r1, o_MusicPlayerTrack_modT]
ldrb r3, [r1, o_MusicPlayerTrack_flags]
movs r2, MPT_FLG_VOLCHG | MPT_FLG_PITCHG
orrs r3, r2
strb r3, [r1, o_MusicPlayerTrack_flags]
_081DD7AA:
bx r12
thumb_func_end ply_modt
thumb_func_start ply_tune
ply_tune:
mov r12, lr
bl ld_r3_tp_adr_i
subs r3, C_V
strb r3, [r1, o_MusicPlayerTrack_tune]
ldrb r3, [r1, o_MusicPlayerTrack_flags]
movs r2, MPT_FLG_PITCHG
orrs r3, r2
strb r3, [r1, o_MusicPlayerTrack_flags]
bx r12
thumb_func_end ply_tune
thumb_func_start ply_port
ply_port:
mov r12, lr
ldr r2, [r1, o_MusicPlayerTrack_cmdPtr]
ldrb r3, [r2]
adds r2, 1
ldr r0, =REG_SOUND1CNT_L @ sound register base address
adds r0, r3
bl _081DD64A
strb r3, [r0]
bx r12
.pool
thumb_func_end ply_port
thumb_func_start m4aSoundVSync
m4aSoundVSync:
ldr r0, lt2_SOUND_INFO_PTR
ldr r0, [r0]
@ Exit the function if ident is not ID_NUMBER or ID_NUMBER+1.
ldr r2, lt2_ID_NUMBER
ldr r3, [r0, o_SoundInfo_ident]
subs r3, r2
cmp r3, 1
bhi m4aSoundVSync_Done
@ Decrement the PCM DMA counter. If it reaches 0, we need to do a DMA.
ldrb r1, [r0, o_SoundInfo_pcmDmaCounter]
subs r1, 1
strb r1, [r0, o_SoundInfo_pcmDmaCounter]
bgt m4aSoundVSync_Done
@ Reload the PCM DMA counter.
ldrb r1, [r0, o_SoundInfo_pcmDmaPeriod]
strb r1, [r0, o_SoundInfo_pcmDmaCounter]
ldr r2, =REG_DMA1
ldr r1, [r2, 0x8] @ DMA1CNT
lsls r1, 7
bcc m4aSoundVSync_SkipDMA1 @ branch if repeat bit isn't set
ldr r1, =((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4
str r1, [r2, 0x8] @ DMA1CNT
m4aSoundVSync_SkipDMA1:
ldr r1, [r2, 0xC + 0x8] @ DMA2CNT
lsls r1, 7
bcc m4aSoundVSync_SkipDMA2 @ branch if repeat bit isn't set
ldr r1, =((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4
str r1, [r2, 0xC + 0x8] @ DMA2CNT
m4aSoundVSync_SkipDMA2:
@ turn off DMA1/DMA2
movs r1, DMA_32BIT >> 8
lsls r1, 8
strh r1, [r2, 0xA] @ DMA1CNT_H
strh r1, [r2, 0xC + 0xA] @ DMA2CNT_H
@ turn on DMA1/DMA2 direct-sound FIFO mode
movs r1, (DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT) >> 8
lsls r1, 8 @ LSB is 0, so DMA_SRC_INC is used (destination is always fixed in FIFO mode)
strh r1, [r2, 0xA] @ DMA1CNT_H
strh r1, [r2, 0xC + 0xA] @ DMA2CNT_H
m4aSoundVSync_Done:
bx lr
.pool
thumb_func_end m4aSoundVSync
thumb_func_start MPlayMain
MPlayMain:
ldr r2, lt2_ID_NUMBER
ldr r3, [r0, o_MusicPlayerInfo_ident]
cmp r2, r3
beq _081DD82E
bx lr
_081DD82E:
adds r3, 0x1
str r3, [r0, o_MusicPlayerInfo_ident]
push {r0,lr}
ldr r3, [r0, o_MusicPlayerInfo_func]
cmp r3, 0
beq _081DD840
ldr r0, [r0, o_MusicPlayerInfo_intp]
bl call_r3
_081DD840:
pop {r0}
push {r4-r7}
mov r4, r8
mov r5, r9
mov r6, r10
mov r7, r11
push {r4-r7}
adds r7, r0, 0
ldr r0, [r7, o_MusicPlayerInfo_status]
cmp r0, 0
bge _081DD858
b _081DDA6C
_081DD858:
ldr r0, lt2_SOUND_INFO_PTR
ldr r0, [r0]
mov r8, r0
adds r0, r7, 0
bl FadeOutBody
ldr r0, [r7, o_MusicPlayerInfo_status]
cmp r0, 0
bge _081DD86C
b _081DDA6C
_081DD86C:
ldrh r0, [r7, o_MusicPlayerInfo_tempoC]
ldrh r1, [r7, o_MusicPlayerInfo_tempoI]
adds r0, r1
b _081DD9BC
_081DD874:
ldrb r6, [r7, o_MusicPlayerInfo_trackCount]
ldr r5, [r7, o_MusicPlayerInfo_tracks]
movs r3, 0x1
movs r4, 0
_081DD87C:
ldrb r0, [r5, o_MusicPlayerTrack_flags]
movs r1, MPT_FLG_EXIST
tst r1, r0
bne _081DD886
b _081DD998
_081DD886:
mov r10, r3
orrs r4, r3
mov r11, r4
ldr r4, [r5, o_MusicPlayerTrack_chan]
cmp r4, 0
beq _081DD8BA
_081DD892:
ldrb r1, [r4, o_SoundChannel_statusFlags]
movs r0, SOUND_CHANNEL_SF_ON
tst r0, r1
beq _081DD8AE
ldrb r0, [r4, o_SoundChannel_gateTime]
cmp r0, 0
beq _081DD8B4
subs r0, 0x1
strb r0, [r4, o_SoundChannel_gateTime]
bne _081DD8B4
movs r0, SOUND_CHANNEL_SF_STOP
orrs r1, r0
strb r1, [r4, o_SoundChannel_statusFlags]
b _081DD8B4
_081DD8AE:
adds r0, r4, 0
bl ClearChain
_081DD8B4:
ldr r4, [r4, o_SoundChannel_nextChannelPointer]
cmp r4, 0
bne _081DD892
_081DD8BA:
ldrb r3, [r5, o_MusicPlayerTrack_flags]
movs r0, MPT_FLG_START
tst r0, r3
beq _081DD938
adds r0, r5, 0
bl Clear64byte
movs r0, MPT_FLG_EXIST
strb r0, [r5, o_MusicPlayerTrack_flags]
movs r0, 0x2
strb r0, [r5, o_MusicPlayerTrack_bendRange]
movs r0, 0x40
strb r0, [r5, o_MusicPlayerTrack_volX]
movs r0, 0x16
strb r0, [r5, o_MusicPlayerTrack_lfoSpeed]
movs r0, 0x1
adds r1, r5, 0x6
strb r0, [r1, o_MusicPlayerTrack_ToneData_type - 0x6]
b _081DD938
_081DD8E0:
ldr r2, [r5, o_MusicPlayerTrack_cmdPtr]
ldrb r1, [r2]
cmp r1, 0x80
bhs _081DD8EC
ldrb r1, [r5, o_MusicPlayerTrack_runningStatus]
b _081DD8F6
_081DD8EC:
adds r2, 0x1
str r2, [r5, o_MusicPlayerTrack_cmdPtr]
cmp r1, 0xBD
bcc _081DD8F6
strb r1, [r5, o_MusicPlayerTrack_runningStatus]
_081DD8F6:
cmp r1, 0xCF
bcc _081DD90C
mov r0, r8
ldr r3, [r0, o_SoundInfo_plynote]
adds r0, r1, 0
subs r0, 0xCF
adds r1, r7, 0
adds r2, r5, 0
bl call_r3
b _081DD938
_081DD90C:
cmp r1, 0xB0
bls _081DD92E
adds r0, r1, 0
subs r0, 0xB1
strb r0, [r7, o_MusicPlayerInfo_cmd]
mov r3, r8
ldr r3, [r3, o_SoundInfo_MPlayJumpTable]
lsls r0, 2
ldr r3, [r3, r0]
adds r0, r7, 0
adds r1, r5, 0
bl call_r3
ldrb r0, [r5, o_MusicPlayerTrack_flags]
cmp r0, 0
beq _081DD994
b _081DD938
_081DD92E:
ldr r0, lt_gClockTable
subs r1, 0x80
adds r1, r0
ldrb r0, [r1]
strb r0, [r5, o_MusicPlayerTrack_wait]
_081DD938:
ldrb r0, [r5, o_MusicPlayerTrack_wait]
cmp r0, 0
beq _081DD8E0
subs r0, 0x1
strb r0, [r5, o_MusicPlayerTrack_wait]
ldrb r1, [r5, o_MusicPlayerTrack_lfoSpeed]
cmp r1, 0
beq _081DD994
ldrb r0, [r5, o_MusicPlayerTrack_mod]
cmp r0, 0
beq _081DD994
ldrb r0, [r5, o_MusicPlayerTrack_lfoDelayC]
cmp r0, 0
beq _081DD95A
subs r0, 0x1
strb r0, [r5, o_MusicPlayerTrack_lfoDelayC]
b _081DD994
_081DD95A:
ldrb r0, [r5, o_MusicPlayerTrack_lfoSpeedC]
adds r0, r1
strb r0, [r5, o_MusicPlayerTrack_lfoSpeedC]
adds r1, r0, 0
subs r0, 0x40
lsls r0, 24
bpl _081DD96E
lsls r2, r1, 24
asrs r2, 24
b _081DD972
_081DD96E:
movs r0, 0x80
subs r2, r0, r1
_081DD972:
ldrb r0, [r5, o_MusicPlayerTrack_mod]
muls r0, r2
asrs r2, r0, 6
ldrb r0, [r5, o_MusicPlayerTrack_modM]
eors r0, r2
lsls r0, 24
beq _081DD994
strb r2, [r5, o_MusicPlayerTrack_modM]
ldrb r0, [r5]
ldrb r1, [r5, o_MusicPlayerTrack_modT]
cmp r1, 0
bne _081DD98E
movs r1, MPT_FLG_PITCHG
b _081DD990
_081DD98E:
movs r1, MPT_FLG_VOLCHG
_081DD990:
orrs r0, r1
strb r0, [r5, o_MusicPlayerTrack_flags]
_081DD994:
mov r3, r10
mov r4, r11
_081DD998:
subs r6, 0x1
ble _081DD9A4
movs r0, MusicPlayerTrack_size
adds r5, r0
lsls r3, 1
b _081DD87C
_081DD9A4:
ldr r0, [r7, o_MusicPlayerInfo_clock]
adds r0, 0x1
str r0, [r7, o_MusicPlayerInfo_clock]
cmp r4, 0
bne _081DD9B6
movs r0, 0x80
lsls r0, 24
str r0, [r7, o_MusicPlayerInfo_status]
b _081DDA6C
_081DD9B6:
str r4, [r7, o_MusicPlayerInfo_status]
ldrh r0, [r7, o_MusicPlayerInfo_tempoC]
subs r0, 150
_081DD9BC:
strh r0, [r7, o_MusicPlayerInfo_tempoC]
cmp r0, 150
bcc _081DD9C4
b _081DD874
_081DD9C4:
ldrb r2, [r7, o_MusicPlayerInfo_trackCount]
ldr r5, [r7, o_MusicPlayerInfo_tracks]
_081DD9C8:
ldrb r0, [r5, o_MusicPlayerTrack_flags]
movs r1, 0x80
tst r1, r0
beq _081DDA62
movs r1, MPT_FLG_VOLCHG | MPT_FLG_PITCHG
tst r1, r0
beq _081DDA62
mov r9, r2
adds r0, r7, 0
adds r1, r5, 0
bl TrkVolPitSet
ldr r4, [r5, o_MusicPlayerTrack_chan]
cmp r4, 0
beq _081DDA58
_081DD9E6:
ldrb r1, [r4, o_SoundChannel_statusFlags]
movs r0, SOUND_CHANNEL_SF_ON
tst r0, r1
bne _081DD9F6
adds r0, r4, 0
bl ClearChain
b _081DDA52
_081DD9F6:
ldrb r0, [r4, o_SoundChannel_type]
movs r6, TONEDATA_TYPE_CGB
ands r6, r0
ldrb r3, [r5, o_MusicPlayerTrack_flags]
movs r0, MPT_FLG_VOLCHG
tst r0, r3
beq _081DDA14
bl ChnVolSetAsm
cmp r6, 0
beq _081DDA14
ldrb r0, [r4, o_CgbChannel_modify]
movs r1, 0x1
orrs r0, r1
strb r0, [r4, o_CgbChannel_modify]
_081DDA14:
ldrb r3, [r5, o_MusicPlayerTrack_flags]
movs r0, MPT_FLG_PITCHG
tst r0, r3
beq _081DDA52
ldrb r1, [r4, o_SoundChannel_key]
movs r0, o_MusicPlayerTrack_keyM
ldrsb r0, [r5, r0]
adds r2, r1, r0
bpl _081DDA28
movs r2, 0
_081DDA28:
cmp r6, 0
beq _081DDA46
mov r0, r8
ldr r3, [r0, o_SoundInfo_MidiKeyToCgbFreq]
adds r1, r2, 0
ldrb r2, [r5, o_MusicPlayerTrack_pitM]
adds r0, r6, 0
bl call_r3
str r0, [r4, o_CgbChannel_frequency]
ldrb r0, [r4, o_CgbChannel_modify]
movs r1, CGB_CHANNEL_MO_PIT
orrs r0, r1
strb r0, [r4, o_CgbChannel_modify]
b _081DDA52
_081DDA46:
adds r1, r2, 0
ldrb r2, [r5, o_MusicPlayerTrack_pitM]
ldr r0, [r4, o_SoundChannel_wav]
bl MidiKeyToFreq
str r0, [r4, o_SoundChannel_frequency]
_081DDA52:
ldr r4, [r4, o_SoundChannel_nextChannelPointer]
cmp r4, 0
bne _081DD9E6
_081DDA58:
ldrb r0, [r5, o_MusicPlayerTrack_flags]
movs r1, 0xF0
ands r0, r1
strb r0, [r5, o_MusicPlayerTrack_flags]
mov r2, r9
_081DDA62:
subs r2, 0x1
ble _081DDA6C
movs r0, MusicPlayerTrack_size
adds r5, r0
bgt _081DD9C8
_081DDA6C:
ldr r0, lt2_ID_NUMBER
str r0, [r7, o_MusicPlayerInfo_ident]
pop {r0-r7}
mov r8, r0
mov r9, r1
mov r10, r2
mov r11, r3
pop {r3}
call_r3:
bx r3
.align 2, 0
lt_gClockTable: .word gClockTable
lt2_SOUND_INFO_PTR: .word SOUND_INFO_PTR
lt2_ID_NUMBER: .word ID_NUMBER
thumb_func_end MPlayMain
thumb_func_start TrackStop
TrackStop:
push {r4-r6,lr}
adds r5, r1, 0
ldrb r1, [r5, o_MusicPlayerTrack_flags]
movs r0, MPT_FLG_EXIST
tst r0, r1
beq TrackStop_Done
ldr r4, [r5, o_MusicPlayerTrack_chan]
cmp r4, 0
beq TrackStop_3
movs r6, 0
TrackStop_Loop:
ldrb r0, [r4, o_SoundChannel_statusFlags]
cmp r0, 0
beq TrackStop_2
ldrb r0, [r4, o_SoundChannel_type]
movs r3, TONEDATA_TYPE_CGB
ands r0, r3
beq TrackStop_1
ldr r3, =SOUND_INFO_PTR
ldr r3, [r3]
ldr r3, [r3, o_SoundInfo_CgbOscOff]
bl call_r3
TrackStop_1:
strb r6, [r4, o_SoundChannel_statusFlags]
TrackStop_2:
str r6, [r4, o_SoundChannel_track]
ldr r4, [r4, o_SoundChannel_nextChannelPointer]
cmp r4, 0
bne TrackStop_Loop
TrackStop_3:
str r4, [r5, o_MusicPlayerTrack_chan]
TrackStop_Done:
pop {r4-r6}
pop {r0}
bx r0
.pool
thumb_func_end TrackStop
thumb_func_start ChnVolSetAsm
ChnVolSetAsm:
ldrb r1, [r4, o_SoundChannel_velocity]
movs r0, o_SoundChannel_rhythmPan
ldrsb r2, [r4, r0]
movs r3, 0x80
adds r3, r2
muls r3, r1
ldrb r0, [r5, o_MusicPlayerTrack_volMR]
muls r0, r3
asrs r0, 14
cmp r0, 0xFF
bls _081DDAE8
movs r0, 0xFF
_081DDAE8:
strb r0, [r4, o_SoundChannel_rightVolume]
movs r3, 0x7F
subs r3, r2
muls r3, r1
ldrb r0, [r5, o_MusicPlayerTrack_volML]
muls r0, r3
asrs r0, 14
cmp r0, 0xFF
bls _081DDAFC
movs r0, 0xFF
_081DDAFC:
strb r0, [r4, o_SoundChannel_leftVolume]
bx lr
thumb_func_end ChnVolSetAsm
thumb_func_start ply_note
ply_note:
push {r4-r7,lr}
mov r4, r8
mov r5, r9
mov r6, r10
mov r7, r11
push {r4-r7}
sub sp, 0x18
str r1, [sp]
adds r5, r2, 0
ldr r1, =SOUND_INFO_PTR
ldr r1, [r1]
str r1, [sp, 0x4]
ldr r1, =gClockTable
adds r0, r1
ldrb r0, [r0]
strb r0, [r5, o_MusicPlayerTrack_gateTime]
ldr r3, [r5, o_MusicPlayerTrack_cmdPtr]
ldrb r0, [r3]
cmp r0, 0x80
bhs _081DDB46
strb r0, [r5, o_MusicPlayerTrack_key]
adds r3, 0x1
ldrb r0, [r3]
cmp r0, 0x80
bhs _081DDB44
strb r0, [r5, o_MusicPlayerTrack_velocity]
adds r3, 0x1
ldrb r0, [r3]
cmp r0, 0x80
bhs _081DDB44
ldrb r1, [r5, o_MusicPlayerTrack_gateTime]
adds r1, r0
strb r1, [r5, o_MusicPlayerTrack_gateTime]
adds r3, 0x1
_081DDB44:
str r3, [r5, o_MusicPlayerTrack_cmdPtr]
_081DDB46:
movs r0, 0
str r0, [sp, 0x14]
adds r4, r5, 0
adds r4, o_MusicPlayerTrack_ToneData_type
ldrb r2, [r4]
movs r0, TONEDATA_TYPE_RHY | TONEDATA_TYPE_SPL
tst r0, r2
beq _081DDB98
ldrb r3, [r5, o_MusicPlayerTrack_key]
movs r0, TONEDATA_TYPE_SPL
tst r0, r2
beq _081DDB66
ldr r1, [r5, o_MusicPlayerTrack_ToneData_keySplitTable]
adds r1, r3
ldrb r0, [r1]
b _081DDB68
_081DDB66:
adds r0, r3, 0
_081DDB68:
lsls r1, r0, 1
adds r1, r0
lsls r1, 2
ldr r0, [r5, o_MusicPlayerTrack_ToneData_wav]
adds r1, r0
mov r9, r1
mov r6, r9
ldrb r1, [r6]
movs r0, TONEDATA_TYPE_SPL | TONEDATA_TYPE_RHY
tst r0, r1
beq _081DDB80
b _081DDCEA
_081DDB80:
movs r0, TONEDATA_TYPE_RHY
tst r0, r2
beq _081DDB9C
ldrb r1, [r6, o_ToneData_pan_sweep]
movs r0, 0x80
tst r0, r1
beq _081DDB94
subs r1, TONEDATA_P_S_PAN
lsls r1, 1
str r1, [sp, 0x14]
_081DDB94:
ldrb r3, [r6, o_SoundChannel_type]
b _081DDB9C
_081DDB98:
mov r9, r4
ldrb r3, [r5, o_MusicPlayerTrack_key]
_081DDB9C:
str r3, [sp, 0x8]
ldr r6, [sp]
ldrb r1, [r6, o_MusicPlayerInfo_priority]
ldrb r0, [r5, o_MusicPlayerTrack_priority]
adds r0, r1
cmp r0, 0xFF
bls _081DDBAC
movs r0, 0xFF
_081DDBAC:
str r0, [sp, 0x10]
mov r6, r9
ldrb r0, [r6, o_ToneData_type]
movs r6, TONEDATA_TYPE_CGB
ands r6, r0
str r6, [sp, 0xC]
beq _081DDBEC
ldr r0, [sp, 0x4]
ldr r4, [r0, o_SoundInfo_cgbChans]
cmp r4, 0
bne _081DDBC4
b _081DDCEA
_081DDBC4:
subs r6, 0x1
lsls r0, r6, 6
adds r4, r0
ldrb r1, [r4, o_CgbChannel_statusFlags]
movs r0, SOUND_CHANNEL_SF_ON
tst r0, r1
beq _081DDC40
movs r0, SOUND_CHANNEL_SF_STOP
tst r0, r1
bne _081DDC40
ldrb r1, [r4, o_CgbChannel_priority]
ldr r0, [sp, 0x10]
cmp r1, r0
bcc _081DDC40
beq _081DDBE4
b _081DDCEA
_081DDBE4:
ldr r0, [r4, o_CgbChannel_track]
cmp r0, r5
bcs _081DDC40
b _081DDCEA
_081DDBEC:
ldr r6, [sp, 0x10]
adds r7, r5, 0
movs r2, 0
mov r8, r2
ldr r4, [sp, 0x4]
ldrb r3, [r4, o_SoundInfo_maxChans]
adds r4, o_SoundInfo_chans
_081DDBFA:
ldrb r1, [r4, o_SoundChannel_statusFlags]
movs r0, SOUND_CHANNEL_SF_ON
tst r0, r1
beq _081DDC40
movs r0, SOUND_CHANNEL_SF_STOP
tst r0, r1
beq _081DDC14
cmp r2, 0
bne _081DDC18
adds r2, 0x1
ldrb r6, [r4, o_SoundChannel_priority]
ldr r7, [r4, o_SoundChannel_track]
b _081DDC32
_081DDC14:
cmp r2, 0
bne _081DDC34
_081DDC18:
ldrb r0, [r4, o_SoundChannel_priority]
cmp r0, r6
bcs _081DDC24
adds r6, r0, 0
ldr r7, [r4, o_SoundChannel_track]
b _081DDC32
_081DDC24:
bhi _081DDC34
ldr r0, [r4, o_SoundChannel_track]
cmp r0, r7
bls _081DDC30
adds r7, r0, 0
b _081DDC32
_081DDC30:
bcc _081DDC34
_081DDC32:
mov r8, r4
_081DDC34:
adds r4, SoundChannel_size
subs r3, 0x1
bgt _081DDBFA
mov r4, r8
cmp r4, 0
beq _081DDCEA
_081DDC40:
adds r0, r4, 0
bl ClearChain
movs r1, 0
str r1, [r4, o_SoundChannel_prevChannelPointer]
ldr r3, [r5, o_MusicPlayerTrack_chan]
str r3, [r4, o_SoundChannel_nextChannelPointer]
cmp r3, 0
beq _081DDC54
str r4, [r3, o_SoundChannel_prevChannelPointer]
_081DDC54:
str r4, [r5, o_MusicPlayerTrack_chan]
str r5, [r4, o_SoundChannel_track]
ldrb r0, [r5, o_MusicPlayerTrack_lfoDelay]
strb r0, [r5, o_MusicPlayerTrack_lfoDelayC]
cmp r0, r1
beq _081DDC66
adds r1, r5, 0
bl clear_modM
_081DDC66:
ldr r0, [sp]
adds r1, r5, 0
bl TrkVolPitSet
ldr r0, [r5, o_MusicPlayerTrack_gateTime]
str r0, [r4, o_SoundChannel_gateTime]
ldr r0, [sp, 0x10]
strb r0, [r4, o_SoundChannel_priority]
ldr r0, [sp, 0x8]
strb r0, [r4, o_SoundChannel_key]
ldr r0, [sp, 0x14]
strb r0, [r4, o_SoundChannel_rhythmPan]
mov r6, r9
ldrb r0, [r6, o_ToneData_type]
strb r0, [r4, o_SoundChannel_type]
ldr r7, [r6, o_ToneData_wav]
str r7, [r4, o_SoundChannel_wav]
ldr r0, [r6, o_ToneData_attack]
str r0, [r4, o_SoundChannel_attack]
ldrh r0, [r5, o_MusicPlayerTrack_pseudoEchoVolume]
strh r0, [r4, o_SoundChannel_pseudoEchoVolume]
bl ChnVolSetAsm
ldrb r1, [r4, o_SoundChannel_key]
movs r0, o_MusicPlayerTrack_keyM
ldrsb r0, [r5, r0]
adds r3, r1, r0
bpl _081DDCA0
movs r3, 0
_081DDCA0:
ldr r6, [sp, 0xC]
cmp r6, 0
beq _081DDCCE
mov r6, r9
ldrb r0, [r6, o_ToneData_length]
strb r0, [r4, o_CgbChannel_length]
ldrb r1, [r6, o_ToneData_pan_sweep]
movs r0, 0x80
tst r0, r1
bne _081DDCBA
movs r0, 0x70
tst r0, r1
bne _081DDCBC
_081DDCBA:
movs r1, 0x8
_081DDCBC:
strb r1, [r4, o_CgbChannel_sweep]
ldrb r2, [r5, o_MusicPlayerTrack_pitM]
adds r1, r3, 0
ldr r0, [sp, 0xC]
ldr r3, [sp, 0x4]
ldr r3, [r3, o_SoundInfo_MidiKeyToCgbFreq]
bl call_r3
b _081DDCDC
_081DDCCE:
ldr r0, [r5, o_MusicPlayerTrack_unk_3C]
str r0, [r4, o_SoundChannel_count]
ldrb r2, [r5, o_MusicPlayerTrack_pitM]
adds r1, r3, 0
adds r0, r7, 0
bl MidiKeyToFreq
_081DDCDC:
str r0, [r4, o_SoundChannel_frequency]
movs r0, SOUND_CHANNEL_SF_START
strb r0, [r4, o_SoundChannel_statusFlags]
ldrb r1, [r5, o_MusicPlayerTrack_flags]
movs r0, 0xF0
ands r0, r1
strb r0, [r5, o_MusicPlayerTrack_flags]
_081DDCEA:
add sp, 0x18
pop {r0-r7}
mov r8, r0
mov r9, r1
mov r10, r2
mov r11, r3
pop {r0}
bx r0
.pool
thumb_func_end ply_note
thumb_func_start ply_endtie
ply_endtie:
push {r4,r5}
ldr r2, [r1, o_MusicPlayerTrack_cmdPtr]
ldrb r3, [r2]
cmp r3, 0x80
bhs _081DDD16
strb r3, [r1, o_MusicPlayerTrack_key]
adds r2, 0x1
str r2, [r1, o_MusicPlayerTrack_cmdPtr]
b _081DDD18
_081DDD16:
ldrb r3, [r1, o_MusicPlayerTrack_key]
_081DDD18:
ldr r1, [r1, o_MusicPlayerTrack_chan]
cmp r1, 0
beq _081DDD40
movs r4, SOUND_CHANNEL_SF_START | SOUND_CHANNEL_SF_ENV
movs r5, SOUND_CHANNEL_SF_STOP
_081DDD22:
ldrb r2, [r1, o_SoundChannel_statusFlags]
tst r2, r4
beq _081DDD3A
tst r2, r5
bne _081DDD3A
ldrb r0, [r1, o_SoundChannel_midiKey]
cmp r0, r3
bne _081DDD3A
movs r0, SOUND_CHANNEL_SF_STOP
orrs r2, r0
strb r2, [r1, o_SoundChannel_statusFlags]
b _081DDD40
_081DDD3A:
ldr r1, [r1, o_SoundChannel_nextChannelPointer]
cmp r1, 0
bne _081DDD22
_081DDD40:
pop {r4,r5}
bx lr
thumb_func_end ply_endtie
thumb_func_start clear_modM
clear_modM:
movs r2, 0
strb r2, [r1, o_MusicPlayerTrack_modM]
strb r2, [r1, o_MusicPlayerTrack_lfoSpeedC]
ldrb r2, [r1, o_MusicPlayerTrack_modT]
cmp r2, 0
bne _081DDD54
movs r2, MPT_FLG_PITCHG
b _081DDD56
_081DDD54:
movs r2, MPT_FLG_VOLCHG
_081DDD56:
ldrb r3, [r1, o_MusicPlayerTrack_flags]
orrs r3, r2
strb r3, [r1, o_MusicPlayerTrack_flags]
bx lr
thumb_func_end clear_modM
thumb_func_start ld_r3_tp_adr_i
ld_r3_tp_adr_i_unchecked:
ldr r2, [r1, o_MusicPlayerTrack_cmdPtr]
adds r3, r2, 1
str r3, [r1, o_MusicPlayerTrack_cmdPtr]
ldrb r3, [r2]
bx lr
thumb_func_end ld_r3_tp_adr_i
thumb_func_start ply_lfos
ply_lfos:
mov r12, lr
bl ld_r3_tp_adr_i_unchecked
strb r3, [r1, o_MusicPlayerTrack_lfoSpeed]
cmp r3, 0
bne _081DDD7C
bl clear_modM
_081DDD7C:
bx r12
thumb_func_end ply_lfos
thumb_func_start ply_mod
ply_mod:
mov r12, lr
bl ld_r3_tp_adr_i_unchecked
strb r3, [r1, o_MusicPlayerTrack_mod]
cmp r3, 0
bne _081DDD90
bl clear_modM
_081DDD90:
bx r12
thumb_func_end ply_mod
.align 2, 0 @ Don't pad with nop.
.bss
sDecodingBuffer: @ Used as a buffer for audio decoded from compressed DPCM
.space 0x40
.size sDecodingBuffer, .-sDecodingBuffer