mirror of
https://github.com/Ninjdai1/pokeemerald.git
synced 2024-12-29 13:50:42 +01:00
1917 lines
39 KiB
ArmAsm
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
|