ROM:082F4E20 ; =============== S U B R O U T I N E =======================================
ROM:082F4E20
ROM:082F4E20
ROM:082F4E20 entry
ROM:082F4E20
ROM:082F4E20 ARG_FRAME_LENGTH= 0
ROM:082F4E20 ARG_CHN_LEFT = 4
ROM:082F4E20 ARG_BUFFER_POS = 8
ROM:082F4E20 ARG_ABS_LOOP_OFFSET= 0xC
ROM:082F4E20 ARG_LOOP_MODE = 0x10
ROM:082F4E20 ARG_SCAN_LIMIT = 0x14
ROM:082F4E20 ARG_VAR_AREA = 0x18
ROM:082F4E20
ROM:082F4E20 LDRB R3, [R0,#5]
ROM:082F4E22 CMP R3, #0
ROM:082F4E24 BEQ clear_buffer
ROM:082F4E26 ADR R1, do_reverb
ROM:082F4E28 BX R1 ; do_reverb
ROM:082F4E28 ; ---------------------------------------------------------------------------
ROM:082F4E2A DCB 0
ROM:082F4E2B DCB 0
ROM:082F4E2C ; ---------------------------------------------------------------------------
ROM:082F4E2C CODE32
ROM:082F4E2C
ROM:082F4E2C do_reverb ; CODE XREF: entry+8j
ROM:082F4E2C ; DATA XREF: entry+6o
ROM:082F4E2C CMP R4, #2
ROM:082F4E30 ADDEQ R7, R0, #0x350
ROM:082F4E34 ADDNE R7, R5, R8
ROM:082F4E38 MOV R4, R8
ROM:082F4E3C
ROM:082F4E3C reverb_loop ; CODE XREF: entry+54j
ROM:082F4E3C LDRSB R0, [R5,R6]
ROM:082F4E40 LDRSB R1, [R5]
ROM:082F4E44 ADD R0, R0, R1
ROM:082F4E48 LDRSB R1, [R7,R6]
ROM:082F4E4C ADD R0, R0, R1
ROM:082F4E50 LDRSB R1, [R7],#1
ROM:082F4E54 ADD R0, R0, R1
ROM:082F4E58 MUL R1, R0, R3
ROM:082F4E5C MOV R0, R1,ASR#9
ROM:082F4E60 TST R0, #0x80
ROM:082F4E64 ADDNE R0, R0, #1
ROM:082F4E68 STRB R0, [R5,R6]
ROM:082F4E6C STRB R0, [R5],#1
ROM:082F4E70 SUBS R4, R4, #1
ROM:082F4E74 BGT reverb_loop
ROM:082F4E78 ADR R0, (loop_setup+1)
ROM:082F4E7C BX R0 ; loop_setup
ROM:082F4E80 ; ---------------------------------------------------------------------------
ROM:082F4E80 CODE16
ROM:082F4E80
ROM:082F4E80 clear_buffer ; CODE XREF: entry+4j
ROM:082F4E80 MOVS R0, #0
ROM:082F4E82 MOV R1, R8
ROM:082F4E84 ADDS R6, R6, R5
ROM:082F4E86 LSRS R1, R1, #3
ROM:082F4E88 BCC clear_buffer_align_8
ROM:082F4E8A STMIA R5!, {R0}
ROM:082F4E8C STMIA R6!, {R0}
ROM:082F4E8E
ROM:082F4E8E clear_buffer_align_8 ; CODE XREF: entry+68j
ROM:082F4E8E LSRS R1, R1, #1
ROM:082F4E90 BCC clear_buffer_align_16
ROM:082F4E92 STMIA R5!, {R0}
ROM:082F4E94 STMIA R6!, {R0}
ROM:082F4E96 STMIA R5!, {R0}
ROM:082F4E98 STMIA R6!, {R0}
ROM:082F4E9A
ROM:082F4E9A clear_buffer_align_16 ; CODE XREF: entry+70j
ROM:082F4E9A ; entry+8Cj
ROM:082F4E9A STMIA R5!, {R0}
ROM:082F4E9C STMIA R6!, {R0}
ROM:082F4E9E STMIA R5!, {R0}
ROM:082F4EA0 STMIA R6!, {R0}
ROM:082F4EA2 STMIA R5!, {R0}
ROM:082F4EA4 STMIA R6!, {R0}
ROM:082F4EA6 STMIA R5!, {R0}
ROM:082F4EA8 STMIA R6!, {R0}
ROM:082F4EAA SUBS R1, #1
ROM:082F4EAC BGT clear_buffer_align_16
ROM:082F4EAE
ROM:082F4EAE loop_setup ; CODE XREF: entry+5Cj
ROM:082F4EAE ; DATA XREF: entry+58o
ROM:082F4EAE LDR R4, [SP,#ARG_VAR_AREA]
ROM:082F4EB0 LDR R0, [R4,#0x18]
ROM:082F4EB2 MOV R12, R0
ROM:082F4EB4 LDRB R0, [R4,#6]
ROM:082F4EB6 ADDS R4, #0x50
ROM:082F4EB8
ROM:082F4EB8 channel_main_loop ; CODE XREF: entry+3A0j
ROM:082F4EB8 STR R0, [SP,#ARG_CHN_LEFT]
ROM:082F4EBA LDR R3, [R4,#0x24]
ROM:082F4EBC LDR R0, [SP,#ARG_SCAN_LIMIT]
ROM:082F4EBE CMP R0, #0
ROM:082F4EC0 BEQ channel_begin
ROM:082F4EC2 LDR R1, =0x4000006
ROM:082F4EC4 LDRB R1, [R1]
ROM:082F4EC6 CMP R1, #0xA0
ROM:082F4EC8 BCS scanline_vblank
ROM:082F4ECA ADDS R1, #0xE4
ROM:082F4ECC
ROM:082F4ECC scanline_vblank ; CODE XREF: entry+A8j
ROM:082F4ECC CMP R1, R0
ROM:082F4ECE BCC channel_begin
ROM:082F4ED0 B mixer_end
ROM:082F4ED0 ; ---------------------------------------------------------------------------
ROM:082F4ED2 DCB 0
ROM:082F4ED3 DCB 0
ROM:082F4ED4 vcount_reg ; DATA XREF: entry+A2r
ROM:082F4ED4 DCD 0x4000006
ROM:082F4ED8 ; ---------------------------------------------------------------------------
ROM:082F4ED8
ROM:082F4ED8 channel_begin ; CODE XREF: entry+A0j
ROM:082F4ED8 ; entry+AEj
ROM:082F4ED8 LDRB R6, [R4]
ROM:082F4EDA MOVS R0, #0xC7
ROM:082F4EDC TST R0, R6
ROM:082F4EDE BNE channel_status_check
ROM:082F4EE0 B channel_check_processed_channels
ROM:082F4EE2 ; ---------------------------------------------------------------------------
ROM:082F4EE2
ROM:082F4EE2 channel_status_check ; CODE XREF: entry+BEj
ROM:082F4EE2 MOVS R0, #0x80
ROM:082F4EE4 TST R0, R6
ROM:082F4EE6 BEQ channel_envelope_handler
ROM:082F4EE8 MOVS R0, #0x40
ROM:082F4EEA TST R0, R6
ROM:082F4EEC BNE channel_stop_func
ROM:082F4EEE MOVS R6, #3
ROM:082F4EF0 STRB R6, [R4]
ROM:082F4EF2 MOVS R0, R3
ROM:082F4EF4 ADDS R0, #0x10
ROM:082F4EF6 LDR R1, [R4,#0x18]
ROM:082F4EF8 ADDS R0, R0, R1
ROM:082F4EFA STR R0, [R4,#0x28]
ROM:082F4EFC LDR R0, [R3,#0xC]
ROM:082F4EFE SUBS R0, R0, R1
ROM:082F4F00 STR R0, [R4,#0x18]
ROM:082F4F02 MOVS R5, #0
ROM:082F4F04 STRB R5, [R4,#9]
ROM:082F4F06 STR R5, [R4,#0x1C]
ROM:082F4F08 LDRB R2, [R3,#3]
ROM:082F4F0A MOVS R0, #0xC0
ROM:082F4F0C TST R0, R2
ROM:082F4F0E BEQ channel_adsr_attack_handler
ROM:082F4F10 MOVS R0, #0x10
ROM:082F4F12 ORRS R6, R0
ROM:082F4F14 STRB R6, [R4]
ROM:082F4F16 B channel_adsr_attack_handler
ROM:082F4F18 ; ---------------------------------------------------------------------------
ROM:082F4F18
ROM:082F4F18 channel_envelope_handler ; CODE XREF: entry+C6j
ROM:082F4F18 LDRB R5, [R4,#9]
ROM:082F4F1A MOVS R0, #4
ROM:082F4F1C TST R0, R6
ROM:082F4F1E BEQ channel_adsr_no_echo
ROM:082F4F20 LDRB R0, [R4,#0xD]
ROM:082F4F22 SUBS R0, #1
ROM:082F4F24 STRB R0, [R4,#0xD]
ROM:082F4F26 BHI channel_vol_calc
ROM:082F4F28
ROM:082F4F28 channel_stop_func ; CODE XREF: entry+CCj
ROM:082F4F28 ; entry+124j
ROM:082F4F28 MOVS R0, #0
ROM:082F4F2A STRB R0, [R4]
ROM:082F4F2C B channel_check_processed_channels
ROM:082F4F2E ; ---------------------------------------------------------------------------
ROM:082F4F2E
ROM:082F4F2E channel_adsr_no_echo ; CODE XREF: entry+FEj
ROM:082F4F2E MOVS R0, #0x40
ROM:082F4F30 TST R0, R6
ROM:082F4F32 BEQ channel_adsr_no_release
ROM:082F4F34 LDRB R0, [R4,#7]
ROM:082F4F36 MULS R5, R0
ROM:082F4F38 LSRS R5, R5, #8
ROM:082F4F3A LDRB R0, [R4,#0xC]
ROM:082F4F3C CMP R5, R0
ROM:082F4F3E BHI channel_vol_calc
ROM:082F4F40
ROM:082F4F40 channel_adsr_check_echo_disabled ; CODE XREF: entry+144j
ROM:082F4F40 LDRB R5, [R4,#0xC]
ROM:082F4F42 CMP R5, #0
ROM:082F4F44 BEQ channel_stop_func
ROM:082F4F46 MOVS R0, #4
ROM:082F4F48 ORRS R6, R0
ROM:082F4F4A STRB R6, [R4]
ROM:082F4F4C B channel_vol_calc
ROM:082F4F4E ; ---------------------------------------------------------------------------
ROM:082F4F4E
ROM:082F4F4E channel_adsr_no_release ; CODE XREF: entry+112j
ROM:082F4F4E MOVS R2, #3
ROM:082F4F50 ANDS R2, R6
ROM:082F4F52 CMP R2, #2
ROM:082F4F54 BNE channel_adsr_no_decay
ROM:082F4F56 LDRB R0, [R4,#5]
ROM:082F4F58 MULS R5, R0
ROM:082F4F5A LSRS R5, R5, #8
ROM:082F4F5C LDRB R0, [R4,#6]
ROM:082F4F5E CMP R5, R0
ROM:082F4F60 BHI channel_vol_calc
ROM:082F4F62 MOVS R5, R0
ROM:082F4F64 BEQ channel_adsr_check_echo_disabled
ROM:082F4F66 SUBS R6, #1
ROM:082F4F68 STRB R6, [R4]
ROM:082F4F6A B channel_vol_calc
ROM:082F4F6C ; ---------------------------------------------------------------------------
ROM:082F4F6C
ROM:082F4F6C channel_adsr_no_decay ; CODE XREF: entry+134j
ROM:082F4F6C CMP R2, #3
ROM:082F4F6E BNE channel_vol_calc
ROM:082F4F70
ROM:082F4F70 channel_adsr_attack_handler ; CODE XREF: entry+EEj
ROM:082F4F70 ; entry+F6j
ROM:082F4F70 LDRB R0, [R4,#4]
ROM:082F4F72 ADDS R5, R5, R0
ROM:082F4F74 CMP R5, #0xFF
ROM:082F4F76 BCC channel_vol_calc
ROM:082F4F78 MOVS R5, #0xFF
ROM:082F4F7A SUBS R6, #1
ROM:082F4F7C STRB R6, [R4]
ROM:082F4F7E
ROM:082F4F7E channel_vol_calc ; CODE XREF: entry+106j
ROM:082F4F7E ; entry+11Ej ...
ROM:082F4F7E STRB R5, [R4,#9]
ROM:082F4F80 LDR R0, [SP,#ARG_VAR_AREA]
ROM:082F4F82 LDRB R0, [R0,#7]
ROM:082F4F84 ADDS R0, #1
ROM:082F4F86 MULS R0, R5
ROM:082F4F88 LSRS R5, R0, #4
ROM:082F4F8A LDRB R0, [R4,#2]
ROM:082F4F8C MULS R0, R5
ROM:082F4F8E LSRS R0, R0, #8
ROM:082F4F90 STRB R0, [R4,#0xA]
ROM:082F4F92 LDRB R0, [R4,#3]
ROM:082F4F94 MULS R0, R5
ROM:082F4F96 LSRS R0, R0, #8
ROM:082F4F98 STRB R0, [R4,#0xB]
ROM:082F4F9A MOVS R0, #0x10
ROM:082F4F9C ANDS R0, R6
ROM:082F4F9E STR R0, [SP,#ARG_LOOP_MODE]
ROM:082F4FA0 BEQ channel_setup_mixing
ROM:082F4FA2 MOVS R0, R3
ROM:082F4FA4 ADDS R0, #0x10
ROM:082F4FA6 LDR R1, [R3,#8]
ROM:082F4FA8 ADDS R0, R0, R1
ROM:082F4FAA STR R0, [SP,#ARG_ABS_LOOP_OFFSET]
ROM:082F4FAC LDR R0, [R3,#0xC]
ROM:082F4FAE SUBS R0, R0, R1
ROM:082F4FB0 STR R0, [SP,#ARG_LOOP_MODE]
ROM:082F4FB2
ROM:082F4FB2 channel_setup_mixing ; CODE XREF: entry+180j
ROM:082F4FB2 LDR R5, [SP,#ARG_BUFFER_POS]
ROM:082F4FB4 LDR R2, [R4,#0x18]
ROM:082F4FB6 LDR R3, [R4,#0x28]
ROM:082F4FB8 ADR R0, channel_mixing
ROM:082F4FBA BX R0 ; channel_mixing
ROM:082F4FBC CODE32
ROM:082F4FBC
ROM:082F4FBC channel_mixing ; DATA XREF: entry+198o
ROM:082F4FBC STR R8, [SP,#ARG_FRAME_LENGTH]
ROM:082F4FC0 LDR R9, [R4,#0x1C]
ROM:082F4FC4 LDRB R10, [R4,#0xA]
ROM:082F4FC8 LDRB R11, [R4,#0xB]
ROM:082F4FCC LDRB R0, [R4,#1]
ROM:082F4FD0 TST R0, #0x30
ROM:082F4FD4 BEQ channel_uncompressed_mixing
ROM:082F4FD8 BL channel_compressed_mixing
ROM:082F4FDC B channel_var_freq_mixing_store_fine_pos
ROM:082F4FE0 ; ---------------------------------------------------------------------------
ROM:082F4FE0
ROM:082F4FE0 channel_uncompressed_mixing ; CODE XREF: entry+1B4j
ROM:082F4FE0 MOV R10, R10,LSL#16
ROM:082F4FE4 MOV R11, R11,LSL#16
ROM:082F4FE8 LDRB R0, [R4,#1]
ROM:082F4FEC TST R0, #8
ROM:082F4FF0 BEQ channel_var_freq_mixing
ROM:082F4FF4
ROM:082F4FF4 channel_fixed_freq_mixing_loop ; CODE XREF: entry+284j
ROM:082F4FF4 CMP R2, #4
ROM:082F4FF8 BLE channel_fixed_freq_mixing_fetch_last
ROM:082F4FFC SUBS R2, R2, R8
ROM:082F5000 MOVGT R9, #0
ROM:082F5004 BGT channel_fixed_freq_mixing_fetch_samples
ROM:082F5008 MOV R9, R8
ROM:082F500C ADD R2, R2, R8
ROM:082F5010 SUB R8, R2, #4
ROM:082F5014 SUB R9, R9, R8
ROM:082F5018 ANDS R2, R2, #3
ROM:082F501C MOVEQ R2, #4
ROM:082F5020
ROM:082F5020 channel_fixed_freq_mixing_fetch_samples ; CODE XREF: entry+1E4j
ROM:082F5020 ; entry+238j
ROM:082F5020 LDR R6, [R5]
ROM:082F5024 LDR R7, [R5,#0x630]
ROM:082F5028
ROM:082F5028 channel_fixed_load_new_samples ; CODE XREF: entry+228j
ROM:082F5028 LDRSB R0, [R3],#1
ROM:082F502C MUL R1, R10, R0
ROM:082F5030 BIC R1, R1, #0xFF0000
ROM:082F5034 ADD R6, R1, R6,ROR#8
ROM:082F5038 MUL R1, R11, R0
ROM:082F503C BIC R1, R1, #0xFF0000
ROM:082F5040 ADD R7, R1, R7,ROR#8
ROM:082F5044 ADDS R5, R5, #0x40000000
ROM:082F5048 BCC channel_fixed_load_new_samples
ROM:082F504C STR R7, [R5,#0x630]
ROM:082F5050 STR R6, [R5],#4
ROM:082F5054 SUBS R8, R8, #4
ROM:082F5058 BGT channel_fixed_freq_mixing_fetch_samples
ROM:082F505C ADDS R8, R8, R9
ROM:082F5060 BEQ channel_mixing_store_pos
ROM:082F5064
ROM:082F5064 channel_fixed_freq_mixing_fetch_last ; CODE XREF: entry+1D8j
ROM:082F5064 LDR R6, [R5]
ROM:082F5068 LDR R7, [R5,#0x630]
ROM:082F506C
ROM:082F506C channel_fixed_load_last_samples ; CODE XREF: entry+274j
ROM:082F506C LDRSB R0, [R3],#1
ROM:082F5070 MUL R1, R10, R0
ROM:082F5074 BIC R1, R1, #0xFF0000
ROM:082F5078 ADD R6, R1, R6,ROR#8
ROM:082F507C MUL R1, R11, R0
ROM:082F5080 BIC R1, R1, #0xFF0000
ROM:082F5084 ADD R7, R1, R7,ROR#8
ROM:082F5088 SUBS R2, R2, #1
ROM:082F508C BEQ channel_fixed_freq_loop_handler
ROM:082F5090
ROM:082F5090 channel_fixed_freq_count_sample ; CODE XREF: entry+2C8j
ROM:082F5090 ADDS R5, R5, #0x40000000
ROM:082F5094 BCC channel_fixed_load_last_samples
ROM:082F5098 STR R7, [R5,#0x630]
ROM:082F509C STR R6, [R5],#4
ROM:082F50A0 SUBS R8, R8, #4
ROM:082F50A4 BGT channel_fixed_freq_mixing_loop
ROM:082F50A8 B channel_mixing_store_pos
ROM:082F50AC ; ---------------------------------------------------------------------------
ROM:082F50AC
ROM:082F50AC channel_var_freq_mixing_loop_handler ; CODE XREF: entry+348j
ROM:082F50AC LDR R0, [SP,#ARG_VAR_AREA]
ROM:082F50B0 CMP R0, #0
ROM:082F50B4 BEQ channel_var_freq_mixing_stop_channel
ROM:082F50B8 LDR R3, [SP,#ARG_SCAN_LIMIT]
ROM:082F50BC RSB LR, R2, #0
ROM:082F50C0
ROM:082F50C0 channel_var_freq_mixing_set_loop ; CODE XREF: entry+2ACj
ROM:082F50C0 ADDS R2, R0, R2
ROM:082F50C4 BGT channel_var_freq_mixing_fetch_next
ROM:082F50C8 SUB LR, LR, R0
ROM:082F50CC B channel_var_freq_mixing_set_loop
ROM:082F50D0 ; ---------------------------------------------------------------------------
ROM:082F50D0
ROM:082F50D0 channel_var_freq_mixing_stop_channel ; CODE XREF: entry+294j
ROM:082F50D0 LDMFD SP!, {R4,R12}
ROM:082F50D4 MOV R2, #0
ROM:082F50D8 B channel_fixed_freq_stop_mixing
ROM:082F50DC ; ---------------------------------------------------------------------------
ROM:082F50DC
ROM:082F50DC channel_fixed_freq_loop_handler ; CODE XREF: entry+26Cj
ROM:082F50DC LDR R2, [SP,#ARG_LOOP_MODE]
ROM:082F50E0 CMP R2, #0
ROM:082F50E4 LDRNE R3, [SP,#ARG_ABS_LOOP_OFFSET]
ROM:082F50E8 BNE channel_fixed_freq_count_sample
ROM:082F50EC
ROM:082F50EC channel_fixed_freq_stop_mixing ; CODE XREF: entry+2B8j
ROM:082F50EC STRB R2, [R4]
ROM:082F50F0 MOV R0, R5,LSR#30
ROM:082F50F4 BIC R5, R5, #0xC0000000
ROM:082F50F8 RSB R0, R0, #3
ROM:082F50FC MOV R0, R0,LSL#3
ROM:082F5100 MOV R6, R6,ROR R0
ROM:082F5104 MOV R7, R7,ROR R0
ROM:082F5108 STR R7, [R5,#0x630]
ROM:082F510C STR R6, [R5],#4
ROM:082F5110 B channel_mixing_exit_func
ROM:082F5114 ; ---------------------------------------------------------------------------
ROM:082F5114
ROM:082F5114 channel_var_freq_mixing ; CODE XREF: entry+1D0j
ROM:082F5114 STMFD SP!, {R4,R12}
ROM:082F5118 LDR R1, [R4,#0x20]
ROM:082F511C MUL R4, R12, R1
ROM:082F5120 LDRSB R0, [R3]
ROM:082F5124 LDRSB R1, [R3,#1]!
ROM:082F5128 SUB R1, R1, R0
ROM:082F512C
ROM:082F512C channel_var_freq_mixing_loop ; CODE XREF: entry+374j
ROM:082F512C LDR R6, [R5]
ROM:082F5130 LDR R7, [R5,#0x630]
ROM:082F5134
ROM:082F5134 channel_var_freq_mixing_resampling ; CODE XREF: entry+364j
ROM:082F5134 MUL LR, R9, R1
ROM:082F5138 ADD LR, R0, LR,ASR#23
ROM:082F513C MUL R12, R10, LR
ROM:082F5140 BIC R12, R12, #0xFF0000
ROM:082F5144 ADD R6, R12, R6,ROR#8
ROM:082F5148 MUL R12, R11, LR
ROM:082F514C BIC R12, R12, #0xFF0000
ROM:082F5150 ADD R7, R12, R7,ROR#8
ROM:082F5154 ADD R9, R9, R4
ROM:082F5158 MOVS LR, R9,LSR#23
ROM:082F515C BEQ channel_var_freq_mixing_count
ROM:082F5160 BIC R9, R9, #0x3F800000
ROM:082F5164 SUBS R2, R2, LR
ROM:082F5168 BLE channel_var_freq_mixing_loop_handler
ROM:082F516C SUBS LR, LR, #1
ROM:082F5170 ADDEQ R0, R0, R1
ROM:082F5174
ROM:082F5174 channel_var_freq_mixing_fetch_next ; CODE XREF: entry+2A4j
ROM:082F5174 LDRNESB R0, [R3,LR]!
ROM:082F5178 LDRSB R1, [R3,#1]!
ROM:082F517C SUB R1, R1, R0
ROM:082F5180
ROM:082F5180 channel_var_freq_mixing_count ; CODE XREF: entry+33Cj
ROM:082F5180 ADDS R5, R5, #0x40000000
ROM:082F5184 BCC channel_var_freq_mixing_resampling
ROM:082F5188 STR R7, [R5,#0x630]
ROM:082F518C STR R6, [R5],#4
ROM:082F5190 SUBS R8, R8, #4
ROM:082F5194 BGT channel_var_freq_mixing_loop
ROM:082F5198 SUB R3, R3, #1
ROM:082F519C LDMFD SP!, {R4,R12}
ROM:082F51A0
ROM:082F51A0 channel_var_freq_mixing_store_fine_pos ; CODE XREF: entry+1BCj
ROM:082F51A0 STR R9, [R4,#0x1C]
ROM:082F51A4
ROM:082F51A4 channel_mixing_store_pos ; CODE XREF: entry+240j
ROM:082F51A4 ; entry+288j
ROM:082F51A4 STR R2, [R4,#0x18]
ROM:082F51A8 STR R3, [R4,#0x28]
ROM:082F51AC
ROM:082F51AC channel_mixing_exit_func ; CODE XREF: entry+2F0j
ROM:082F51AC LDR R8, [SP,#ARG_FRAME_LENGTH]
ROM:082F51B0 ADR R0, (channel_check_processed_channels+1)
ROM:082F51B4 BX R0 ; channel_check_processed_channels
ROM:082F51B8 CODE16
ROM:082F51B8
ROM:082F51B8 channel_check_processed_channels ; CODE XREF: entry+C0j
ROM:082F51B8 ; entry+10Cj
ROM:082F51B8 ; DATA XREF: ...
ROM:082F51B8 LDR R0, [SP,#ARG_CHN_LEFT]
ROM:082F51BA SUBS R0, #1
ROM:082F51BC BLE mixer_end
ROM:082F51BE ADDS R4, #0x40
ROM:082F51C0 B channel_main_loop
ROM:082F51C2 ; ---------------------------------------------------------------------------
ROM:082F51C2
ROM:082F51C2 mixer_end ; CODE XREF: entry+B0j
ROM:082F51C2 ; entry+39Cj
ROM:082F51C2 LDR R0, [SP,#ARG_VAR_AREA]
ROM:082F51C4 LDR R3, =0x68736D53
ROM:082F51C6 STR R3, [R0]
ROM:082F51C8 ADD SP, SP, #0x1C
ROM:082F51CA POP {R0-R7}
ROM:082F51CC MOV R8, R0
ROM:082F51CE MOV R9, R1
ROM:082F51D0 MOV R10, R2
ROM:082F51D2 MOV R11, R3
ROM:082F51D4 POP {R3}
ROM:082F51D6 BX R3
ROM:082F51D6 ; End of function entry
ROM:082F51D6
ROM:082F51D6 ; ---------------------------------------------------------------------------
ROM:082F51D8 dword_82F51D8 DCD 0x68736D53 ; DATA XREF: entry+3A4r
ROM:082F51DC CODE32
ROM:082F51DC
ROM:082F51DC ; =============== S U B R O U T I N E =======================================
ROM:082F51DC
ROM:082F51DC
ROM:082F51DC channel_compressed_mixing ; CODE XREF: entry+1B8p
ROM:082F51DC
ROM:082F51DC ARG_FRAME_COUNT = -0xC
ROM:082F51DC ARG_LOOP_MODE = 0x10
ROM:082F51DC
ROM:082F51DC LDR R6, [R4,#0x24] ; load wave offset to R6
ROM:082F51E0 LDRB R0, [R4]
ROM:082F51E4 TST R0, #0x20
ROM:082F51E8 BNE setup_compressed_mixing_frequency
ROM:082F51EC ORR R0, R0, #0x20 ; if compresson or
ROM:082F51EC ; reverse playback
ROM:082F51EC ; not enabled yet,
ROM:082F51EC ; set it up here
ROM:082F51F0 STRB R0, [R4]
ROM:082F51F4 LDRB R0, [R4,#1]
ROM:082F51F8 TST R0, #0x10
ROM:082F51FC BEQ determine_compression
ROM:082F5200 LDR R1, [R6,#0xC] ; R1 = sample amount
ROM:082F5204 ADD R1, R1, R6,LSL#1
ROM:082F5208 ADD R1, R1, #0x20
ROM:082F520C SUB R3, R1, R3
ROM:082F5210 STR R3, [R4,#0x28] ; reverse playback sample location
ROM:082F5214
ROM:082F5214 determine_compression ; CODE XREF: channel_compressed_mixing+20j
ROM:082F5214 LDRH R0, [R6]
ROM:082F5218 CMP R0, #0
ROM:082F521C BEQ setup_compressed_mixing_frequency
ROM:082F5220 SUB R3, R3, R6
ROM:082F5224 SUB R3, R3, #0x10
ROM:082F5228 STR R3, [R4,#0x28]
ROM:082F522C
ROM:082F522C setup_compressed_mixing_frequency ; CODE XREF: channel_compressed_mixing+Cj
ROM:082F522C ; channel_compressed_mixing+40j
ROM:082F522C STMFD SP!, {R8,R12,LR}
ROM:082F5230 MOV R10, R10,LSL#16
ROM:082F5234 MOV R11, R11,LSL#16
ROM:082F5238 LDR R1, [R4,#0x20]
ROM:082F523C LDRB R0, [R4,#1]
ROM:082F5240 TST R0, #8
ROM:082F5244 MOVNE R8, #0x800000
ROM:082F5248 MULEQ R8, R12, R1
ROM:082F524C LDRH R0, [R6]
ROM:082F5250 CMP R0, #0
ROM:082F5254 BEQ uncomressed_mixing_reverse_check
ROM:082F5258 MOV R0, #0xFF000000
ROM:082F525C STR R0, [R4,#0x3C]
ROM:082F5260 LDRB R0, [R4,#1]
ROM:082F5264 TST R0, #0x10
ROM:082F5268 BNE compressed_mixing_reverse_init
ROM:082F526C BL bdpcm_decoder
ROM:082F5270 MOV R0, R1
ROM:082F5274 ADD R3, R3, #1
ROM:082F5278 BL bdpcm_decoder
ROM:082F527C SUB R1, R1, R0
ROM:082F5280
ROM:082F5280 compressed_mixing_load_samples ; CODE XREF: channel_compressed_mixing+128j
ROM:082F5280 LDR R6, [R5]
ROM:082F5284 LDR R7, [R5,#0x630]
ROM:082F5288
ROM:082F5288 compressed_mixing_loop ; CODE XREF: channel_compressed_mixing+110j
ROM:082F5288 MUL LR, R9, R1
ROM:082F528C ADD LR, R0, LR,ASR#23
ROM:082F5290 MUL R12, R10, LR
ROM:082F5294 BIC R12, R12, #0xFF0000
ROM:082F5298 ADD R6, R12, R6,ROR#8
ROM:082F529C MUL R12, R11, LR
ROM:082F52A0 BIC R12, R12, #0xFF0000
ROM:082F52A4 ADD R7, R12, R7,ROR#8
ROM:082F52A8 ADD R9, R9, R8
ROM:082F52AC MOVS LR, R9,LSR#23
ROM:082F52B0 BEQ compressed_mixing_count_current_sample
ROM:082F52B4 BIC R9, R9, #0x3F800000
ROM:082F52B8 SUBS R2, R2, LR
ROM:082F52BC BLE compressed_mixing_end_handler
ROM:082F52C0 SUBS LR, LR, #1
ROM:082F52C4 BNE compressed_mixing_fetch_next
ROM:082F52C8 ADD R0, R0, R1
ROM:082F52CC B compressed_mixing_fetch_delta
ROM:082F52D0 ; ---------------------------------------------------------------------------
ROM:082F52D0
ROM:082F52D0 compressed_mixing_fetch_next ; CODE XREF: channel_compressed_mixing+E8j
ROM:082F52D0 ; channel_compressed_mixing+150j
ROM:082F52D0 ADD R3, R3, LR
ROM:082F52D4 BL bdpcm_decoder
ROM:082F52D8 MOV R0, R1
ROM:082F52DC
ROM:082F52DC compressed_mixing_fetch_delta ; CODE XREF: channel_compressed_mixing+F0j
ROM:082F52DC ADD R3, R3, #1
ROM:082F52E0 BL bdpcm_decoder
ROM:082F52E4 SUB R1, R1, R0
ROM:082F52E8
ROM:082F52E8 compressed_mixing_count_current_sample ; CODE XREF: channel_compressed_mixing+D4j
ROM:082F52E8 ADDS R5, R5, #0x40000000
ROM:082F52EC BCC compressed_mixing_loop
ROM:082F52F0 STR R7, [R5,#0x630]
ROM:082F52F4 STR R6, [R5],#4
ROM:082F52F8 LDR R6, [SP,#0xC+ARG_FRAME_COUNT]
ROM:082F52FC SUBS R6, R6, #4
ROM:082F5300 STR R6, [SP,#0xC+ARG_FRAME_COUNT]
ROM:082F5304 BGT compressed_mixing_load_samples
ROM:082F5308 SUB R3, R3, #1
ROM:082F530C B special_mixing_return
ROM:082F5310 ; ---------------------------------------------------------------------------
ROM:082F5310
ROM:082F5310 compressed_mixing_end_handler ; CODE XREF: channel_compressed_mixing+E0j
ROM:082F5310 LDR R0, [SP,#0xC+ARG_LOOP_MODE]
ROM:082F5314 CMP R0, #0
ROM:082F5318 BEQ compressed_mixing_stop_and_return
ROM:082F531C LDR R3, [R4,#0x24]
ROM:082F5320 LDR R3, [R3,#8]
ROM:082F5324 RSB LR, R2, #0
ROM:082F5328
ROM:082F5328 compressed_mixing_loop_handler ; CODE XREF: channel_compressed_mixing+158j
ROM:082F5328 ADDS R2, R2, R0
ROM:082F532C BGT compressed_mixing_fetch_next
ROM:082F5330 SUB LR, LR, R0
ROM:082F5334 B compressed_mixing_loop_handler
ROM:082F5338 ; ---------------------------------------------------------------------------
ROM:082F5338
ROM:082F5338 compressed_mixing_reverse_init ; CODE XREF: channel_compressed_mixing+8Cj
ROM:082F5338 SUB R3, R3, #1
ROM:082F533C BL bdpcm_decoder
ROM:082F5340 MOV R0, R1
ROM:082F5344 SUB R3, R3, #1
ROM:082F5348 BL bdpcm_decoder
ROM:082F534C SUB R1, R1, R0
ROM:082F5350
ROM:082F5350 compressed_mixing_reverse_load_samples ; CODE XREF: channel_compressed_mixing+1F8j
ROM:082F5350 LDR R6, [R5]
ROM:082F5354 LDR R7, [R5,#0x630]
ROM:082F5358
ROM:082F5358 compressed_mixing_reverse_loop ; CODE XREF: channel_compressed_mixing+1E0j
ROM:082F5358 MUL LR, R9, R1
ROM:082F535C ADD LR, R0, LR,ASR#23
ROM:082F5360 MUL R12, R10, LR
ROM:082F5364 BIC R12, R12, #0xFF0000
ROM:082F5368 ADD R6, R12, R6,ROR#8
ROM:082F536C MUL R12, R11, LR
ROM:082F5370 BIC R12, R12, #0xFF0000
ROM:082F5374 ADD R7, R12, R7,ROR#8
ROM:082F5378 ADD R9, R9, R8
ROM:082F537C MOVS LR, R9,LSR#23
ROM:082F5380 BEQ compressed_mixing_reverse_count_sample
ROM:082F5384 BIC R9, R9, #0x3F800000
ROM:082F5388 SUBS R2, R2, LR
ROM:082F538C BLE compressed_mixing_stop_and_return
ROM:082F5390 SUBS LR, LR, #1
ROM:082F5394 BNE compressed_mixing_reverse_fetch_next
ROM:082F5398 ADD R0, R0, R1
ROM:082F539C B compressed_mixing_reverse_seekback
ROM:082F53A0 ; ---------------------------------------------------------------------------
ROM:082F53A0
ROM:082F53A0 compressed_mixing_reverse_fetch_next ; CODE XREF: channel_compressed_mixing+1B8j
ROM:082F53A0 SUB R3, R3, LR
ROM:082F53A4 BL bdpcm_decoder
ROM:082F53A8 MOV R0, R1
ROM:082F53AC
ROM:082F53AC compressed_mixing_reverse_seekback ; CODE XREF: channel_compressed_mixing+1C0j
ROM:082F53AC SUB R3, R3, #1
ROM:082F53B0 BL bdpcm_decoder
ROM:082F53B4 SUB R1, R1, R0
ROM:082F53B8
ROM:082F53B8 compressed_mixing_reverse_count_sample ; CODE XREF: channel_compressed_mixing+1A4j
ROM:082F53B8 ADDS R5, R5, #0x40000000
ROM:082F53BC BCC compressed_mixing_reverse_loop
ROM:082F53C0 STR R7, [R5,#0x630]
ROM:082F53C4 STR R6, [R5],#4
ROM:082F53C8 LDR R6, [SP,#0xC+ARG_FRAME_COUNT]
ROM:082F53CC SUBS R6, R6, #4
ROM:082F53D0 STR R6, [SP,#0xC+ARG_FRAME_COUNT]
ROM:082F53D4 BGT compressed_mixing_reverse_load_samples
ROM:082F53D8 ADD R3, R3, #2
ROM:082F53DC B special_mixing_return
ROM:082F53E0 ; ---------------------------------------------------------------------------
ROM:082F53E0
ROM:082F53E0 uncomressed_mixing_reverse_check ; CODE XREF: channel_compressed_mixing+78j
ROM:082F53E0 LDRB R0, [R4,#1]
ROM:082F53E4 TST R0, #0x10
ROM:082F53E8 BEQ special_mixing_return
ROM:082F53EC LDRSB R0, [R3,#-1]!
ROM:082F53F0 LDRSB R1, [R3,#-1]
ROM:082F53F4 SUB R1, R1, R0
ROM:082F53F8
ROM:082F53F8 uncompressed_mixing_reverse_load_samples
ROM:082F53F8 ; CODE XREF: channel_compressed_mixing+284j
ROM:082F53F8 LDR R6, [R5]
ROM:082F53FC LDR R7, [R5,#0x630]
ROM:082F5400
ROM:082F5400 uncompressed_mixing_reverse_loop ; CODE XREF: channel_compressed_mixing+26Cj
ROM:082F5400 MUL LR, R9, R1
ROM:082F5404 ADD LR, R0, LR,ASR#23
ROM:082F5408 MUL R12, R10, LR
ROM:082F540C BIC R12, R12, #0xFF0000
ROM:082F5410 ADD R6, R12, R6,ROR#8
ROM:082F5414 MUL R12, R11, LR
ROM:082F5418 BIC R12, R12, #0xFF0000
ROM:082F541C ADD R7, R12, R7,ROR#8
ROM:082F5420 ADD R9, R9, R8
ROM:082F5424 MOVS LR, R9,LSR#23
ROM:082F5428 BEQ uncompressed_mixing_reverse_count
ROM:082F542C BIC R9, R9, #0x3F800000
ROM:082F5430 SUBS R2, R2, LR
ROM:082F5434 BLE compressed_mixing_stop_and_return
ROM:082F5438 LDRSB R0, [R3,-LR]!
ROM:082F543C LDRSB R1, [R3,#-1]
ROM:082F5440 SUB R1, R1, R0
ROM:082F5444
ROM:082F5444 uncompressed_mixing_reverse_count ; CODE XREF: channel_compressed_mixing+24Cj
ROM:082F5444 ADDS R5, R5, #0x40000000
ROM:082F5448 BCC uncompressed_mixing_reverse_loop
ROM:082F544C STR R7, [R5,#0x630]
ROM:082F5450 STR R6, [R5],#4
ROM:082F5454 LDR R6, [SP,#0xC+ARG_FRAME_COUNT]
ROM:082F5458 SUBS R6, R6, #4
ROM:082F545C STR R6, [SP,#0xC+ARG_FRAME_COUNT]
ROM:082F5460 BGT uncompressed_mixing_reverse_load_samples
ROM:082F5464 ADD R3, R3, #1
ROM:082F5468
ROM:082F5468 special_mixing_return ; CODE XREF: channel_compressed_mixing+130j
ROM:082F5468 ; channel_compressed_mixing+200j ...
ROM:082F5468 LDMFD SP!, {R8,R12,PC}
ROM:082F546C ; ---------------------------------------------------------------------------
ROM:082F546C
ROM:082F546C compressed_mixing_stop_and_return ; CODE XREF: channel_compressed_mixing+13Cj
ROM:082F546C ; channel_compressed_mixing+1B0j ...
ROM:082F546C MOV R2, #0
ROM:082F5470 STRB R2, [R4]
ROM:082F5474 MOV R0, R5,LSR#30
ROM:082F5478 BIC R5, R5, #0xC0000000
ROM:082F547C RSB R0, R0, #3
ROM:082F5480 MOV R0, R0,LSL#3
ROM:082F5484 MOV R6, R6,ROR R0
ROM:082F5488 MOV R7, R7,ROR R0
ROM:082F548C STR R7, [R5,#0x630]
ROM:082F5490 STR R6, [R5],#4
ROM:082F5494 LDMFD SP!, {R8,R12,PC}
ROM:082F5494 ; End of function channel_compressed_mixing
ROM:082F5494
ROM:082F5498
ROM:082F5498 ; =============== S U B R O U T I N E =======================================
ROM:082F5498
ROM:082F5498
ROM:082F5498 bdpcm_decoder ; CODE XREF: channel_compressed_mixing+90p
ROM:082F5498 ; channel_compressed_mixing+9Cp ...
ROM:082F5498 STMFD SP!, {R0,R2,R5-R7,LR}
ROM:082F549C MOV R0, R3,LSR#6
ROM:082F54A0 LDR R1, [R4,#0x3C]
ROM:082F54A4 CMP R0, R1
ROM:082F54A8 BEQ bdpcm_decoder_return
ROM:082F54AC STR R0, [R4,#0x3C]
ROM:082F54B0 MOV R1, #0x21
ROM:082F54B4 MUL R2, R1, R0
ROM:082F54B8 LDR R1, [R4,#0x24]
ROM:082F54BC ADD R2, R2, R1
ROM:082F54C0 ADD R2, R2, #0x10
ROM:082F54C4 LDR R5, =0x3001300
ROM:082F54C8 LDR R6, =delta_table_686C5C
ROM:082F54CC MOV R7, #0x40
ROM:082F54D0 LDRB LR, [R2],#1
ROM:082F54D4 STRB LR, [R5],#1
ROM:082F54D8 LDRB R1, [R2],#1
ROM:082F54DC B bdpcm_decoder_lsb
ROM:082F54E0 ; ---------------------------------------------------------------------------
ROM:082F54E0
ROM:082F54E0 bdpcm_decoder_msb ; CODE XREF: bdpcm_decoder+70j
ROM:082F54E0 LDRB R1, [R2],#1
ROM:082F54E4 MOV R0, R1,LSR#4
ROM:082F54E8 LDRSB R0, [R6,R0]
ROM:082F54EC ADD LR, LR, R0
ROM:082F54F0 STRB LR, [R5],#1
ROM:082F54F4
ROM:082F54F4 bdpcm_decoder_lsb ; CODE XREF: bdpcm_decoder+44j
ROM:082F54F4 AND R0, R1, #0xF
ROM:082F54F8 LDRSB R0, [R6,R0]
ROM:082F54FC ADD LR, LR, R0
ROM:082F5500 STRB LR, [R5],#1
ROM:082F5504 SUBS R7, R7, #2
ROM:082F5508 BGT bdpcm_decoder_msb
ROM:082F550C
ROM:082F550C bdpcm_decoder_return ; CODE XREF: bdpcm_decoder+10j
ROM:082F550C LDR R5, =0x3001300
ROM:082F5510 AND R0, R3, #0x3F
ROM:082F5514 LDRSB R1, [R5,R0]
ROM:082F5518 LDMFD SP!, {R0,R2,R5-R7,PC}
ROM:082F5518 ; End of function bdpcm_decoder
ROM:082F5518
ROM:082F5518 ; ---------------------------------------------------------------------------
ROM:082F551C decoder_buffer DCD 0x3001300 ; DATA XREF: bdpcm_decoder+2Cr
ROM:082F551C ; bdpcm_decoder:bdpcm_decoder_returnr
ROM:082F5520 delta_lookup_table DCD delta_table_686C5C ; DATA XREF: bdpcm_decoder+30r