123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413 |
-
-
-
-
- .global main_mixer
- .global mixer_size
-
- .set mixer_size, (main_mixer_end - main_mixer) / 4
-
-
- .equ GAME_BPED, 0
- .equ GAME_BPEE, 1
- .equ GAME_BPRE, 2
- .equ GAME_KWJ6, 3
- .equ GAME_AE7E, 4
- .equ GAME_BPRD, 5
-
-
- .equ USED_GAME, GAME_BPRE
-
- .equ FRAME_LENGTH_5734, 0x60
- .equ FRAME_LENGTH_7884, 0x84
- .equ FRAME_LENGTH_10512, 0xB0
- .equ FRAME_LENGTH_13379, 0xE0
- .equ FRAME_LENGTH_15768, 0x108
- .equ FRAME_LENGTH_18157, 0x130
- .equ FRAME_LENGTH_21024, 0x160
- .equ FRAME_LENGTH_26758, 0x1C0
- .equ FRAME_LENGTH_31536, 0x210
- .equ FRAME_LENGTH_36314, 0x260
- .equ FRAME_LENGTH_40137, 0x2A0
- .equ FRAME_LENGTH_42048, 0x2C0
-
- .equ DECODER_BUFFER_BPE, 0x03001300
- .equ DECODER_BUFFER_BPR, 0x03002088
- .equ DECODER_BUFFER_KWJ, 0x03005800
-
- .equ BUFFER_IRAM_BPE, 0x03001AA8
- .equ BUFFER_IRAM_BPR, 0x030028E0
- .equ BUFFER_IRAM_KWJ, 0x03005840
- .equ BUFFER_IRAM_AE7, 0x03006D60
-
-
- .equ ARG_FRAME_LENGTH, 0x0
- .equ ARG_REMAIN_CHN, 0x4
- .equ ARG_BUFFER_POS, 0x8
- .equ ARG_LOOP_START_POS, 0xC
- .equ ARG_LOOP_LENGTH, 0x10
-
- .equ ARG_PCM_STRUCT, 0x18
-
-
- .equ CHN_STATUS, 0x0
- .equ CHN_MODE, 0x1
- .equ CHN_VOL_1, 0x2
- .equ CHN_VOL_2, 0x3
- .equ CHN_ATTACK, 0x4
- .equ CHN_DECAY, 0x5
- .equ CHN_SUSTAIN, 0x6
- .equ CHN_RELEASE, 0x7
- .equ CHN_ADSR_LEVEL, 0x9
- .equ CHN_FINAL_VOL_1, 0xA
- .equ CHN_FINAL_VOL_2, 0xB
- .equ CHN_ECHO_VOL, 0xC
- .equ CHN_ECHO_REMAIN, 0xD
- .equ CHN_SAMPLE_COUNTDOWN, 0x18
- .equ CHN_FINE_POSITION, 0x1C
- .equ CHN_FREQUENCY, 0x20
- .equ CHN_WAVE_OFFSET, 0x24
- .equ CHN_POSITION_ABS, 0x28
- .equ CHN_BLOCK_COUNT, 0x3C
-
-
- .equ WAVE_LOOP_FLAG, 0x3
- .equ WAVE_FREQ, 0x4
- .equ WAVE_LOOP_START, 0x8
- .equ WAVE_LENGTH, 0xC
- .equ WAVE_DATA, 0x10
-
-
- .equ SYNTH_BASE_WAVE_DUTY, 0x1
- .equ SYNTH_WIDTH_CHANGE_1, 0x2
- .equ SYNTH_MOD_AMOUNT, 0x3
- .equ SYNTH_WIDTH_CHANGE_2, 0x4
-
-
- .equ FLAG_CHN_INIT, 0x80
- .equ FLAG_CHN_RELEASE, 0x40
- .equ FLAG_CHN_COMP, 0x20
- .equ FLAG_CHN_LOOP, 0x10
- .equ FLAG_CHN_ECHO, 0x4
- .equ FLAG_CHN_ATTACK, 0x3
- .equ FLAG_CHN_DECAY, 0x2
- .equ FLAG_CHN_SUSTAIN, 0x1
-
-
- .equ MODE_FIXED_FREQ, 0x8
- .equ MODE_REVERSE, 0x10
- .equ MODE_COMP, 0x30
- .equ MODE_SYNTH, 0x40
-
-
- .equ VAR_REVERB, 0x5
- .equ VAR_MAX_CHN, 0x6
- .equ VAR_MASTER_VOL, 0x7
- .equ VAR_DEF_PITCH_FAC, 0x18
- .equ VAR_FIRST_CHN, 0x50
-
-
- .equ REG_DMA3_SRC, 0x040000D4
- .equ ARM_OP_LEN, 0x4
-
-
-
-
-
-
-
-
- .if USED_GAME==GAME_BPED
-
- .equ hq_buffer_ptr, BUFFER_IRAM_BPE
- .equ decoder_buffer_target, DECODER_BUFFER_BPE
- .equ POKE_INIT, 1
- .equ DMA_FIX, 1
- .equ ENABLE_DECOMPRESSION, 1
- .equ ENABLE_CLIPPING, 1
-
- .endif
-
- .if USED_GAME==GAME_BPRD
-
- .equ hq_buffer_ptr, 0x03002830
- .equ decoder_buffer_target, DECODER_BUFFER_BPR
- .equ POKE_INIT, 1
- .equ DMA_FIX, 1
- .equ ENABLE_DECOMPRESSION, 1
- .equ ENABLE_CLIPPING, 1
-
- .endif
-
- .if USED_GAME==GAME_BPEE
-
- .equ hq_buffer_ptr, BUFFER_IRAM_BPE
- .equ decoder_buffer_target, DECODER_BUFFER_BPE
- .equ POKE_INIT, 1
- .equ DMA_FIX, 1
- .equ ENABLE_DECOMPRESSION, 1
- .equ ENABLE_CLIPPING, 1
-
- .endif
-
- .if USED_GAME==GAME_BPRE
-
- .equ hq_buffer_ptr, BUFFER_IRAM_BPR
- .equ decoder_buffer_target, DECODER_BUFFER_BPR
- .equ POKE_INIT, 1
- .equ DMA_FIX, 1
- .equ ENABLE_DECOMPRESSION, 1
- .equ ENABLE_CLIPPING, 1
-
- .endif
-
- .if USED_GAME==GAME_KWJ6
-
- .equ hq_buffer_ptr, BUFFER_IRAM_KWJ
- .equ decoder_buffer_target, DECODER_BUFFER_KWJ
- .equ POKE_INIT, 0
- .equ DMA_FIX, 0
- .equ ENABLE_DECOMPRESSION, 0
- .equ ENABLE_CLIPPING, 1
-
- .endif
-
- .if USED_GAME==GAME_AE7E
-
- .equ hq_buffer_ptr, BUFFER_IRAM_AE7
- .equ POKE_INIT, 0
- .equ DMA_FIX, 0
- .equ ENABLE_DECOMPRESSION, 0
- .equ ENABLE_CLIPPING, 0
- .endif
-
-
- .thumb
-
- main_mixer:
-
- LDRB R3, [R0, #VAR_REVERB]
- LSR R3, R3, #2
- BEQ C_clear_hq_buffer
-
- ADR R1, C_setup_reverb_loop
- BX R1
-
- .arm
- .align 2
-
- C_setup_reverb_loop:
-
-
- CMP R4, #2
- ADDEQ R7, R0, #0x350
- ADDNE R7, R5, R8
- MOV R4, R8
- ORR R3, R3, R3, LSL#16
- STMFD SP!, {R8, LR}
- LDR LR, hq_buffer
-
- C_reverb_loop:
-
- LDRSB R0, [R5, R6]
- LDRSB R1, [R5], #1
- LDRSB R2, [R7, R6]
- LDRSB R8, [R7], #1
- LDRSB R9, [R5, R6]
- LDRSB R10, [R5], #1
- LDRSB R11, [R7, R6]
- LDRSB R12, [R7], #1
- ADD R0, R0, R1
- ADD R0, R0, R2
- ADD R0, R0, R8
- ADDMI R0, R0, #0x4
- ADD R1, R9, R10
- ADD R1, R1, R11
- ADDS R1, R1, R12
- ADDMI R1, R1, #0x4
- MUL R0, R3, R0
- MUL R1, R3, R1
- STMIA LR!, {R0, R1}
- SUBS R4, R4, #2
- BGT C_reverb_loop
-
- LDMFD SP!, {R8, LR}
- ADR R0, (C_setup_channel_state_loop+1)
- BX R0
-
- .thumb
-
- C_clear_hq_buffer:
-
- LDR R3, hq_buffer
- MOV R1, R8
- MOV R4, #0
- MOV R5, #0
- MOV R6, #0
- MOV R7, #0
-
-
- LSR R1, #3
- BCC C_clr_hq_buffer_align_8
-
- STMIA R3!, {R4, R5, R6, R7}
-
- C_clr_hq_buffer_align_8:
- LSR R1, #1
- BCC C_clr_hq_buffer_align_16
-
- STMIA R3!, {R4, R5, R6, R7}
- STMIA R3!, {R4, R5, R6, R7}
-
- C_clr_hq_buffer_align_16:
-
- STMIA R3!, {R4, R5, R6, R7}
- STMIA R3!, {R4, R5, R6, R7}
- STMIA R3!, {R4, R5, R6, R7}
- STMIA R3!, {R4, R5, R6, R7}
- SUB R1, #1
- BGT C_clr_hq_buffer_align_16
-
- C_setup_channel_state_loop:
-
-
- MOV R4, R8
-
-
- ADR R0, hq_buffer_length
- STR R4, [R0]
-
- LDR R4, [SP, #ARG_PCM_STRUCT]
- LDR R0, [R4, #VAR_DEF_PITCH_FAC]
- MOV R12, R0
- LDRB R0, [R4, #VAR_MAX_CHN]
- ADD R4, #VAR_FIRST_CHN
-
- C_channel_state_loop:
-
- STR R0, [SP, #ARG_REMAIN_CHN]
- LDR R3, [R4, #CHN_WAVE_OFFSET]
- LDRB R6, [R4, #CHN_STATUS]
- MOVS R0, #0xC7
- TST R0, R6
- BEQ C_skip_channel
-
- LSL R0, R6, #25
- BCC C_adsr_echo_check
-
- BMI C_stop_channel
-
- MOVS R6, #FLAG_CHN_ATTACK
- MOVS R0, R3
- ADD R0, #WAVE_DATA
-
-
- .if POKE_INIT==0
- STR R0, [R4, #CHN_POSITION_ABS]
- LDR R0, [R3, #WAVE_LENGTH]
- STR R0, [R4, #CHN_SAMPLE_COUNTDOWN]
- .else
- LDR R1, [R4, #CHN_SAMPLE_COUNTDOWN]
- ADD R0, R0, R1
- STR R0, [R4, #CHN_POSITION_ABS]
- LDR R0, [R3, #WAVE_LENGTH]
- SUB R0, R0, R1
- STR R0, [R4, #CHN_SAMPLE_COUNTDOWN]
- .endif
-
- MOVS R5, #0
- STRB R5, [R4, #CHN_ADSR_LEVEL]
- STR R5, [R4, #CHN_FINE_POSITION]
- LDRB R2, [R3, #WAVE_LOOP_FLAG]
- LSR R0, R2, #6
- BEQ C_adsr_attack
-
- MOVS R0, #FLAG_CHN_LOOP
- ORR R6, R0
- B C_adsr_attack
-
- C_adsr_echo_check:
-
- LDRB R5, [R4, #CHN_ADSR_LEVEL]
- LSL R0, R6, #29
- BPL C_adsr_release_check
-
- LDRB R0, [R4, #CHN_ECHO_REMAIN]
- SUB R0, #1
- STRB R0, [R4, #CHN_ECHO_REMAIN]
- BHI C_channel_vol_calc
-
- C_stop_channel:
- MOVS R0, #0
- STRB R0, [R4, #CHN_STATUS]
-
- C_skip_channel:
-
- B C_end_channel_state_loop
-
- C_adsr_release_check:
- LSL R0, R6, #25
- BPL C_adsr_decay_check
-
- LDRB R0, [R4, #CHN_RELEASE]
-
-
-
- MUL R5, R5, R0
- LSR R5, #8
- BLE C_adsr_released
-
- LDRB R0, [R4, #CHN_ECHO_VOL]
- CMP R5, R0
- BHI C_channel_vol_calc
-
- C_adsr_released:
-
- LDRB R5, [R4, #CHN_ECHO_VOL]
- CMP R5, #0
- BEQ C_stop_channel
-
- MOVS R0, #FLAG_CHN_ECHO
- ORR R6, R0
- B C_adsr_save_and_finalize
-
- C_adsr_decay_check:
-
- MOVS R2, #(FLAG_CHN_DECAY+FLAG_CHN_SUSTAIN)
- AND R2, R6
- CMP R2, #FLAG_CHN_DECAY
- BNE C_adsr_attack_check
-
- LDRB R0, [R4, #CHN_DECAY]
- MUL R5, R5, R0
- LSR R5, R5, #8
- LDRB R0, [R4, #CHN_SUSTAIN]
- CMP R5, R0
- BHI C_channel_vol_calc
-
- MOVS R5, R0
- BEQ C_adsr_released
-
- B C_adsr_next_state
-
- C_adsr_attack_check:
-
- CMP R2, #FLAG_CHN_ATTACK
- BNE C_channel_vol_calc
-
- C_adsr_attack:
-
- LDRB R0, [R4, #CHN_ATTACK]
- ADD R5, R0
- CMP R5, #0xFF
- BLO C_adsr_save_and_finalize
-
- MOVS R5, #0xFF
-
- C_adsr_next_state:
-
- SUB R6, #1
-
- C_adsr_save_and_finalize:
-
- STRB R6, [R4, #CHN_STATUS]
-
- C_channel_vol_calc:
-
- STRB R5, [R4, #CHN_ADSR_LEVEL]
-
- LDR R0, [SP, #ARG_PCM_STRUCT]
- LDRB R0, [R0, #VAR_MASTER_VOL]
- ADD R0, #1
- MUL R5, R0
-
- LDRB R0, [R4, #CHN_VOL_2]
- MUL R0, R5
- LSR R0, #13
- MOV R10, R0
-
- LDRB R0, [R4, #CHN_VOL_1]
- MUL R0, R5
- LSR R0, #13
- MOV R11, R0
-
-
- MOVS R0, #FLAG_CHN_LOOP
- AND R0, R6
- BEQ C_skip_sample_loop_setup
-
- ADD R3, #WAVE_LOOP_START
- LDMIA R3!, {R0, R1}
- ADD R3, R0
- STR R3, [SP, #ARG_LOOP_START_POS]
- SUB R0, R1, R0
-
- C_skip_sample_loop_setup:
-
- STR R0, [SP, #ARG_LOOP_LENGTH]
- LDR R5, hq_buffer
- LDR R2, [R4, #CHN_SAMPLE_COUNTDOWN]
- LDR R3, [R4, #CHN_POSITION_ABS]
- LDRB R0, [R4, #CHN_MODE]
- ADR R1, C_mixing_setup
- BX R1
-
- .align 2
- hq_buffer:
- .word hq_buffer_ptr
- hq_buffer_length:
- .word 0xFFFFFFFF
-
- .arm
- .align 2
-
- C_mixing_setup:
-
- LDR R8, hq_buffer_length
- ORRS R11, R10, R11, LSL#16
- BEQ C_mixing_epilogue
-
- TST R0, #MODE_FIXED_FREQ
- BNE C_setup_fixed_freq_mixing
- TST R0, #MODE_COMP
- BNE C_setup_special_mixing
-
- STMFD SP!, {R4, R9, R12}
-
-
- MOVS R2, R2
- ORREQ R0, R0, #MODE_SYNTH
- STREQB R0, [R4, #CHN_MODE]
- ADD R4, R4, #CHN_FINE_POSITION
- LDMIA R4, {R7, LR}
- MUL R4, LR, R12
-
- LDRSB R6, [R3], #1
- LDRSB R12, [R3]
- TST R0, #MODE_SYNTH
- BNE C_setup_synth
-
- SUB R12, R12, R6
-
-
- MOVS R11, R11, LSR#1
- ADC R11, R11, #0x8000
- BIC R11, R11, #0xFF00
- MOV R1, R7
-
-
- UMLAL R1, R0, R4, R8
- MOV R1, R1, LSR#23
- ORR R0, R1, R0, LSL#9
- CMP R2, R0
- BLE C_setup_unbuffered_mixing
-
-
- SUB R2, R2, R0
- LDR R10, upper_stack_bounds
- ADD R10, R10, R0
- CMP R10, SP
- ADD R10, R3, R0
- ADR R9, stack_backup
-
-
- STMIA R9, {R2, R10, SP}
- CMPCC R0, #0x400
- BCS C_select_highspeed_codepath
-
-
- BIC R1, R3, #3
- MOV R9, #0x04000000
- ADD R9, R9, #0xD4
- ADD R0, R0, #7
- MOV R0, R0, LSR#2
- SUB SP, SP, R0, LSL#2
- AND R3, R3, #3
- ADD R3, R3, SP
- ORR LR, R0, #0x84000000
- STMIA R9, {R1, SP, LR}
-
-
- .if DMA_FIX==1
- MOV R0, #0
- MOV R1, #0
- MOV R2, #0
- STMIA R9, {R0, R1, R2}
- .endif
-
- C_select_highspeed_codepath:
-
-
- ADR R0, high_speed_code_resource
- SUBS R4, R4, #0x800000
- MOVPL R11, R11, LSL#1
- ADDPL R0, R0, #(ARM_OP_LEN*6)
- SUBPLS R4, R4, #0x800000
- ADDPL R0, R0, #(ARM_OP_LEN*6)
- ADDPL R4, R4, #0x800000
- LDR R2, previous_fast_code
- CMP R0, R2
- BEQ C_skip_fast_mixing_creation
-
- STR R0, previous_fast_code
- LDMIA R0, {R0-R2, R8-R10}
- ADR LR, fast_mixing_instructions
-
- C_fast_mixing_creation_loop:
-
- STMIA LR, {R0, R1}
- ADD LR, LR, #(ARM_OP_LEN*38)
- STMIA LR, {R0, R1}
- SUB LR, LR, #(ARM_OP_LEN*35)
- STMIA LR, {R2, R8-R10}
- ADD LR, LR, #(ARM_OP_LEN*38)
- STMIA LR, {R2, R8-R10}
- SUB LR, LR, #(ARM_OP_LEN*32)
- ADDS R5, R5, #0x40000000
- BCC C_fast_mixing_creation_loop
-
- LDR R8, hq_buffer_length
-
- C_skip_fast_mixing_creation:
- MOV R2, #0xFF000000
- C_fast_mixing_loop:
-
- LDMIA R5, {R0, R1, R10, LR}
- MUL R9, R7, R12
- fast_mixing_instructions:
- NOP
- NOP
- MLANE R0, R11, R9, R0
- NOP
- NOP
- NOP
- NOP
- BIC R7, R7, R2, ASR#1
- MULNE R9, R7, R12
- NOP
- NOP
- MLANE R1, R11, R9, R1
- NOP
- NOP
- NOP
- NOP
- BIC R7, R7, R2, ASR#1
- MULNE R9, R7, R12
- NOP
- NOP
- MLANE R10, R11, R9, R10
- NOP
- NOP
- NOP
- NOP
- BIC R7, R7, R2, ASR#1
- MULNE R9, R7, R12
- NOP
- NOP
- MLANE LR, R11, R9, LR
- NOP
- NOP
- NOP
- NOP
- BIC R7, R7, R2, ASR#1
- STMIA R5!, {R0, R1, R10, LR}
-
- LDMIA R5, {R0, R1, R10, LR}
- MULNE R9, R7, R12
- NOP
- NOP
- MLANE R0, R11, R9, R0
- NOP
- NOP
- NOP
- NOP
- BIC R7, R7, R2, ASR#1
- MULNE R9, R7, R12
- NOP
- NOP
- MLANE R1, R11, R9, R1
- NOP
- NOP
- NOP
- NOP
- BIC R7, R7, R2, ASR#1
- MULNE R9, R7, R12
- NOP
- NOP
- MLANE R10, R11, R9, R10
- NOP
- NOP
- NOP
- NOP
- BIC R7, R7, R2, ASR#1
- MULNE R9, R7, R12
- NOP
- NOP
- MLANE LR, R11, R9, LR
- NOP
- NOP
- NOP
- NOP
- BIC R7, R7, R2, ASR#1
- STMIA R5!, {R0, R1, R10, LR}
- SUBS R8, R8, #8
- BGT C_fast_mixing_loop
-
- ADR R12, stack_backup
- LDMIA R12, {R2, R3, SP}
- B C_end_mixing
-
-
-
- .align 2
- stack_backup:
- .word 0x0, 0x0, 0x0
- upper_stack_bounds:
- .word 0x03007910
- previous_fast_code:
- .word 0x0
-
-
- high_speed_code_resource:
-
- MOV R9, R9, ASR#22
- ADDS R9, R9, R6, LSL#1
- ADDS R7, R7, R4
- ADDPL R6, R12, R6
- LDRPLSB R12, [R3, #1]!
- SUBPLS R12, R12, R6
-
-
- ADDS R9, R6, R9, ASR#23
- ADD R6, R12, R6
- ADDS R7, R7, R4
- LDRPLSB R6, [R3, #1]!
- LDRSB R12, [R3, #1]!
- SUBS R12, R12, R6
-
-
- ADDS R9, R6, R9, ASR#23
- ADD R7, R7, R4
- ADD R3, R3, R7, LSR#23
- LDRSB R6, [R3]
- LDRSB R12, [R3, #1]!
- SUBS R12, R12, R6
-
-
- C_setup_unbuffered_mixing:
- ADD R5, R5, R8, LSL#2
-
-
- C_unbuffered_mixing_loop:
-
- MUL R9, R7, R12
- MOV R9, R9, ASR#22
- ADDS R9, R9, R6, LSL#1
- LDRNE R0, [R5, -R8, LSL#2]
- MLANE R0, R11, R9, R0
- STRNE R0, [R5, -R8, LSL#2]
- ADD R7, R7, R4
- MOVS R9, R7, LSR#23
- BEQ C_unbuffered_mixing_skip_load
-
- SUBS R2, R2, R7, LSR#23
- BLLE C_mixing_loop_or_end
- SUBS R9, R9, #1
- ADDEQ R6, R12, R6
-
- LDRNESB R6, [R3, R9]!
- LDRSB R12, [R3, #1]!
- SUB R12, R12, R6
- BIC R7, R7, #0x3F800000
-
- C_unbuffered_mixing_skip_load:
- SUBS R8, R8, #1
- BGT C_unbuffered_mixing_loop
-
- C_end_mixing:
- SUB R3, R3, #1
- LDMFD SP!, {R4, R9, R12}
- STR R7, [R4, #CHN_FINE_POSITION]
- B C_mixing_end_store
-
- C_mixing_loop_or_end:
-
- ADD R3, SP, #ARG_LOOP_START_POS+0xC
- LDMIA R3, {R3, R6}
- CMP R6, #0
- RSBNE R9, R2, #0
- ADDNE R2, R6, R2
- ADDNE PC, LR, #(ARM_OP_LEN*2)
- LDMFD SP!, {R4, R9, R12}
- B C_mixing_end_and_stop_channel
-
- C_fixed_mixing_loop_or_end:
- LDR R2, [SP, #ARG_LOOP_LENGTH+0x8]
- MOVS R6, R2
- LDRNE R3, [SP, #ARG_LOOP_START_POS+0x8]
- BXNE LR
-
- LDMFD SP!, {R4, R9}
-
- C_mixing_end_and_stop_channel:
- STRB R6, [R4]
- B C_mixing_epilogue
-
-
- fixed_mixing_code_resource:
- MOVS R6, R10, LSL#24
- MOVS R6, R6, ASR#24
- MOVS R6, R10, LSL#16
- MOVS R6, R6, ASR#24
- MOVS R6, R10, LSL#8
- MOVS R6, R6, ASR#24
- MOVS R6, R10, ASR#24
- LDMIA R3!, {R10}
- MOVS R6, R10, LSL#24
- MOVS R6, R6, ASR#24
- MOVS R6, R10, LSL#16
- MOVS R6, R6, ASR#24
- MOVS R6, R10, LSL#8
- MOVS R6, R6, ASR#24
- LDMFD SP!, {R4, R9, R12}
-
- C_setup_fixed_freq_mixing:
- STMFD SP!, {R4, R9}
-
- C_fixed_mixing_length_check:
- MOV LR, R2
- CMP R2, R8
- MOVGT LR, R8
- SUB LR, LR, #1
- MOVS LR, LR, LSR#2
- BEQ C_fixed_mixing_process_rest
-
- SUB R8, R8, LR, LSL#2
- SUB R2, R2, LR, LSL#2
- ADR R1, fixed_mixing_instructions
- ADR R0, fixed_mixing_code_resource
- MOV R9, R3, LSL#30
- ADD R0, R0, R9, LSR#27
- LDMIA R0!, {R6, R7, R9, R10}
- STMIA R1, {R6, R7}
- ADD R1, R1, #0xC
- STMIA R1, {R9, R10}
- ADD R1, R1, #0xC
- LDMIA R0, {R6, R7, R9, R10}
- STMIA R1, {R6, R7}
- ADD R1, R1, #0xC
- STMIA R1, {R9, R10}
- LDMIA R3!, {R10}
-
- C_fixed_mixing_loop:
- LDMIA R5, {R0, R1, R7, R9}
-
- fixed_mixing_instructions:
- NOP
- NOP
- MLANE R0, R11, R6, R0
- NOP
- NOP
- MLANE R1, R11, R6, R1
- NOP
- NOP
- MLANE R7, R11, R6, R7
- NOP
- NOP
- MLANE R9, R11, R6, R9
- STMIA R5!, {R0, R1, R7, R9}
- SUBS LR, LR, #1
- BNE C_fixed_mixing_loop
-
- SUB R3, R3, #4
-
- C_fixed_mixing_process_rest:
- MOV R1, #4
-
- C_fixed_mixing_unaligned_loop:
- LDR R0, [R5]
- LDRSB R6, [R3], #1
- MLA R0, R11, R6, R0
- STR R0, [R5], #4
- SUBS R2, R2, #1
- BLEQ C_fixed_mixing_loop_or_end
- SUBS R1, R1, #1
- BGT C_fixed_mixing_unaligned_loop
-
- SUBS R8, R8, #4
- BGT C_fixed_mixing_length_check
-
- LDMFD SP!, {R4, R9}
-
- C_mixing_end_store:
- STR R2, [R4, #CHN_SAMPLE_COUNTDOWN]
- STR R3, [R4, #CHN_POSITION_ABS]
-
- C_mixing_epilogue:
- ADR R0, (C_end_channel_state_loop+1)
- BX R0
-
- .thumb
-
- C_end_channel_state_loop:
- LDR R0, [SP, #ARG_REMAIN_CHN]
- SUB R0, #1
- BLE C_main_mixer_return
-
- ADD R4, #0x40
- B C_channel_state_loop
-
- C_main_mixer_return:
- ADR R0, C_downsampler
- BX R0
-
- .arm
- .align 2
-
- C_downsampler:
- LDR R10, hq_buffer
- LDR R9, [SP, #ARG_BUFFER_POS]
- LDR R8, hq_buffer_length
- MOV R11, #0xFF
-
- .if ENABLE_CLIPPING==1
-
- MOV R12, #0xFFFFFFFF
- MOV R12, R12, LSL#14
- MOV R7, #0x630
-
- C_downsampler_loop:
- LDRSH R2, [R10], #2
- LDRSH R0, [R10], #2
- LDRSH R3, [R10], #2
- LDRSH R1, [R10], #2
-
- CMP R0, #0x4000
- MOVGE R0, #0x3F80
- CMP R0, #-0x4000
- MOVLT R0, R12
-
- CMP R1, #0x4000
- MOVGE R1, #0x3F80
- CMP R1, #-0x4000
- MOVLT R1, R12
-
- CMP R2, #0x4000
- MOVGE R2, #0x3F80
- CMP R2, #-0x4000
- MOVLT R2, R12
-
- CMP R3, #0x4000
- MOVGE R3, #0x3F80
- CMP R3, #-0x4000
- MOVLT R3, R12
-
- AND R0, R11, R0, ASR#7
- AND R1, R11, R1, ASR#7
- AND R2, R11, R2, ASR#7
- AND R3, R11, R3, ASR#7
-
- ORR R2, R2, R3, LSL#8
- ORR R0, R0, R1, LSL#8
-
- STRH R2, [R9, R7]
- STRH R0, [R9], #2
-
- SUBS R8, #2
- BGT C_downsampler_loop
-
- .else
- C_downsampler_loop:
- LDRH R4, [R10], #2
- LDRH R0, [R10], #2
- LDRH R5, [R10], #2
- LDRH R1, [R10], #2
- LDRH R6, [R10], #2
- LDRH R2, [R10], #2
- LDRH R7, [R10], #2
- LDRH R3, [R10], #2
-
- AND R0, R11, R0, LSR#7
- AND R1, R11, R1, LSR#7
- AND R2, R11, R2, LSR#7
- AND R3, R11, R3, LSR#7
- AND R4, R11, R4, LSR#7
- AND R5, R11, R5, LSR#7
- AND R6, R11, R6, LSR#7
- AND R7, R11, R7, LSR#7
-
- ORR R4, R4, R5, LSL#8
- ORR R4, R4, R6, LSL#16
- ORR R4, R4, R7, LSL#24
-
- ORR R0, R0, R1, LSL#8
- ORR R0, R0, R2, LSL#16
- ORR R0, R0, R3, LSL#24
-
- STR R4, [R9, #0x630]
- STR R0, [R9], #4
-
- SUBS R8, #4
- BGT C_downsampler_loop
- .endif
-
- ADR R0, (C_downsampler_return+1)
- BX R0
-
- .thumb
-
- C_downsampler_return:
- LDR R0, [SP, #ARG_PCM_STRUCT]
- LDR R3, mixer_finished_status
- STR R3, [R0]
- ADD SP, SP, #0x1C
- POP {R0-R7}
- MOV R8, R0
- MOV R9, R1
- MOV R10, R2
- MOV R11, R3
- POP {R3}
- BX R3
-
- .align 2
-
- mixer_finished_status:
- .word 0x68736D53
-
- .arm
- .align 2
-
- C_setup_synth:
- CMP R12, #0
- BNE C_check_synth_saw
-
-
- LDRB R6, [R3, #SYNTH_WIDTH_CHANGE_1]
- ADD R2, R2, R6, LSL#24
- LDRB R6, [R3, #SYNTH_WIDTH_CHANGE_2]
- ADDS R6, R2, R6, LSL#24
- MVNMI R6, R6
- MOV R10, R6, LSR#8
- LDRB R1, [R3, #SYNTH_MOD_AMOUNT]
- LDRB R0, [R3, #SYNTH_BASE_WAVE_DUTY]
- MOV R0, R0, LSL#24
- MLA R6, R10, R1, R0
- STMFD SP!, {R2, R3, R9, R12}
-
- C_synth_pulse_loop:
- LDMIA R5, {R0-R3, R9, R10, R12, LR}
- CMP R7, R6
- ADDLO R0, R0, R11, LSL#6
- SUBHS R0, R0, R11, LSL#6
- ADDS R7, R7, R4, LSL#3
- CMP R7, R6
- ADDLO R1, R1, R11, LSL#6
- SUBHS R1, R1, R11, LSL#6
- ADDS R7, R7, R4, LSL#3
- CMP R7, R6
- ADDLO R2, R2, R11, LSL#6
- SUBHS R2, R2, R11, LSL#6
- ADDS R7, R7, R4, LSL#3
- CMP R7, R6
- ADDLO R3, R3, R11, LSL#6
- SUBHS R3, R3, R11, LSL#6
- ADDS R7, R7, R4, LSL#3
- CMP R7, R6
- ADDLO R9, R9, R11, LSL#6
- SUBHS R9, R9, R11, LSL#6
- ADDS R7, R7, R4, LSL#3
- CMP R7, R6
- ADDLO R10, R10, R11, LSL#6
- SUBHS R10, R10, R11, LSL#6
- ADDS R7, R7, R4, LSL#3
- CMP R7, R6
- ADDLO R12, R12, R11, LSL#6
- SUBHS R12, R12, R11, LSL#6
- ADDS R7, R7, R4, LSL#3
- CMP R7, R6
- ADDLO LR, LR, R11, LSL#6
- SUBHS LR, LR, R11, LSL#6
- ADDS R7, R7, R4, LSL#3
-
- STMIA R5!, {R0-R3, R9, R10, R12, LR}
- SUBS R8, R8, #8
- BGT C_synth_pulse_loop
-
- LDMFD SP!, {R2, R3, R9, R12}
- B C_end_mixing
-
- C_check_synth_saw:
-
-
- SUBS R12, R12, #1
- BNE C_synth_triangle
-
- MOV R6, #0x300
- MOV R11, R11, LSR#1
- BIC R11, R11, #0xFF00
- MOV R12, #0x70
-
- C_synth_saw_loop:
-
- LDMIA R5, {R0, R1, R10, LR}
- ADDS R7, R7, R4, LSL#3
- RSB R9, R12, R7, LSR#24
- MOV R6, R7, LSL#1
- SUB R9, R9, R6, LSR#27
- ADDS R2, R9, R2, ASR#1
- MLANE R0, R11, R2, R0
-
- ADDS R7, R7, R4, LSL#3
- RSB R9, R12, R7, LSR#24
- MOV R6, R7, LSL#1
- SUB R9, R9, R6, LSR#27
- ADDS R2, R9, R2, ASR#1
- MLANE R1, R11, R2, R1
-
- ADDS R7, R7, R4, LSL#3
- RSB R9, R12, R7, LSR#24
- MOV R6, R7, LSL#1
- SUB R9, R9, R6, LSR#27
- ADDS R2, R9, R2, ASR#1
- MLANE R10, R11, R2, R10
-
- ADDS R7, R7, R4, LSL#3
- RSB R9, R12, R7, LSR#24
- MOV R6, R7, LSL#1
- SUB R9, R9, R6, LSR#27
- ADDS R2, R9, R2, ASR#1
- MLANE LR, R11, R2, LR
-
- STMIA R5!, {R0, R1, R10, LR}
- SUBS R8, R8, #4
- BGT C_synth_saw_loop
-
- B C_end_mixing
-
- C_synth_triangle:
- MOV R6, #0x80
- MOV R12, #0x180
-
- C_synth_triangle_loop:
- LDMIA R5, {R0, R1, R10, LR}
- ADDS R7, R7, R4, LSL#3
- RSBPL R9, R6, R7, ASR#23
- SUBMI R9, R12, R7, LSR#23
- MLA R0, R11, R9, R0
-
- ADDS R7, R7, R4, LSL#3
- RSBPL R9, R6, R7, ASR#23
- SUBMI R9, R12, R7, LSR#23
- MLA R1, R11, R9, R1
-
- ADDS R7, R7, R4, LSL#3
- RSBPL R9, R6, R7, ASR#23
- SUBMI R9, R12, R7, LSR#23
- MLA R10, R11, R9, R10
-
- ADDS R7, R7, R4, LSL#3
- RSBPL R9, R6, R7, ASR#23
- SUBMI R9, R12, R7, LSR#23
- MLA LR, R11, R9, LR
-
- STMIA R5!, {R0, R1, R10, LR}
- SUBS R8, R8, #4
- BGT C_synth_triangle_loop
-
- B C_end_mixing
-
- .if ENABLE_DECOMPRESSION==1
- C_setup_special_mixing:
- LDR R6, [R4, #CHN_WAVE_OFFSET]
- LDRB R0, [R4]
- TST R0, #FLAG_CHN_COMP
- BNE C_setup_special_mixing_freq
-
- ORR R0, #FLAG_CHN_COMP
- STRB R0, [R4]
- LDRB R0, [R4, #CHN_MODE]
- TST R0, #MODE_REVERSE
- BEQ C_check_compression
-
- LDR R1, [R6, #WAVE_LENGTH]
- ADD R1, R1, R6, LSL#1
- ADD R1, R1, #0x20
- SUB R3, R1, R3
- STR R3, [R4, #CHN_POSITION_ABS]
-
- C_check_compression:
- LDRH R0, [R6]
- CMP R0, #0
- BEQ C_setup_special_mixing_freq
-
- SUB R3, R3, R6
- SUB R3, R3, #0x10
- STR R3, [R4, #CHN_POSITION_ABS]
-
- C_setup_special_mixing_freq:
- LDR R0, [R6, #WAVE_LOOP_START]
- STR R0, [SP, #ARG_LOOP_START_POS]
-
- STMFD SP!, {R4, R9, R12}
-
- MOVS R11, R11, LSR#1
- ADC R11, R11, #0x8000
- BIC R11, R11, #0xFF00
-
- LDR R7, [R4, #CHN_FINE_POSITION]
- LDR R1, [R4, #CHN_FREQUENCY]
- LDRB R0, [R4, #CHN_MODE]
- TST R0, #MODE_FIXED_FREQ
- MOVNE R1, #0x800000
- MULEQ R1, R12, R1
-
- ADD R5, R5, R8, LSL#2
-
- LDRH R0, [R6]
- CMP R0, #0
- BEQ C_uncompressed_reverse_mixing_check
-
- MOV R0, #0xFF000000
- STR R0, [R4, #CHN_BLOCK_COUNT]
- LDRB R0, [R4, #CHN_MODE]
- TST R0, #MODE_REVERSE
- BNE C_setup_compressed_reverse_mixing
-
-
- BL F_bdpcm_decoder
- MOV R6, R12
- ADD R3, R3, #1
- BL F_bdpcm_decoder
- SUB R12, R12, R6
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- C_compressed_mixing_loop:
- MUL R9, R7, R12
- MOV R9, R9, ASR#22
- ADDS R9, R9, R6, LSL#1
- LDRNE R0, [R5, -R8, LSL#2]
- MLANE R0, R11, R9, R0
- STRNE R0, [R5, -R8, LSL#2]
- ADD R7, R7, R1
- MOVS R9, R7, LSR#23
- BEQ C_compressed_mixing_skip_load
-
- SUBS R2, R2, R7, LSR#23
- BLLE C_mixing_loop_or_end
- SUBS R9, R9, #1
- ADDEQ R6, R12, R6
- BEQ C_compressed_mixing_skip_base_load
-
- ADD R3, R3, R9
- BL F_bdpcm_decoder
- MOV R6, R12
-
- C_compressed_mixing_skip_base_load:
- ADD R3, R3, #1
- BL F_bdpcm_decoder
- SUB R12, R12, R6
- BIC R7, R7, #0x3F800000
-
- C_compressed_mixing_skip_load:
- SUBS R8, R8, #1
- BGT C_compressed_mixing_loop
-
- B C_end_mixing
-
- C_setup_compressed_reverse_mixing:
- SUB R3, R3, #1
- BL F_bdpcm_decoder
- MOV R6, R12
- SUB R3, R3, #1
- BL F_bdpcm_decoder
- SUB R12, R12, R6
-
- C_compressed_reverse_mixing_loop:
- MUL R9, R7, R12
- MOV R9, R9, ASR#22
- ADDS R9, R9, R6, LSL#1
- LDRNE R0, [R5, -R8, LSL#2]
- MLANE R0, R11, R9, R0
- STRNE R0, [R5, -R8, LSL#2]
- ADD R7, R7, R1
- MOVS R9, R7, LSR#23
- BEQ C_compressed_reverse_mixing_skip_load
-
- SUBS R2, R2, R7, LSR#23
- BLLE C_mixing_loop_or_end
- SUBS R9, R9, #1
- ADDEQ R6, R12, R6
- BEQ C_compressed_reverse_mixing_skip_base_load
-
- SUB R3, R3, R9
- BL F_bdpcm_decoder
- MOV R6, R12
-
- C_compressed_reverse_mixing_skip_base_load:
- SUB R3, R3, #1
- BL F_bdpcm_decoder
- SUB R12, R12, R6
- BIC R7, R7, #0x3F800000
-
- C_compressed_reverse_mixing_skip_load:
- SUBS R8, R8, #1
- BGT C_compressed_reverse_mixing_loop
-
- ADD R3, R3, #3
- B C_end_mixing
-
- C_uncompressed_reverse_mixing_check:
- LDRB R0, [R4, #1]
- TST R0, #MODE_REVERSE
- BEQ C_end_mixing
-
- LDRSB R6, [R3, #-1]!
- LDRSB R12, [R3, #-1]
- SUB R12, R12, R6
-
- C_uncompressed_reverse_mixing_loop:
- MUL R9, R7, R12
- MOV R9, R9, ASR#22
- ADDS R9, R9, R6, LSL#1
- LDRNE R0, [R5, -R8, LSL#2]
- MLANE R0, R11, R9, R0
- STRNE R0, [R5, -R8, LSL#2]
- ADD R7, R7, R1
- MOVS R9, R7, LSR#23
- BEQ C_uncompressed_reverse_mixing_load_skip
-
- SUBS R2, R2, R7, LSR#23
- BLLE C_mixing_loop_or_end
-
- MOVS R9, R9
- ADDEQ R6, R12, R6
- LDRNESB R6, [R3, -R9]!
- LDRSB R12, [R3, #-1]
- SUB R12, R12, R6
- BIC R7, R7, #0x3F800000
-
- C_uncompressed_reverse_mixing_load_skip:
- SUBS R8, R8, #1
- BGT C_uncompressed_reverse_mixing_loop
-
- ADD R3, R3, #2
- B C_end_mixing
-
-
- F_bdpcm_decoder:
-
- STMFD SP!, {R0, R2, R5-R7, LR}
- MOV R0, R3, LSR#6
- LDR R12, [R4, #CHN_BLOCK_COUNT]
- CMP R0, R12
- BEQ C_bdpcm_decoder_return
-
- STR R0, [R4, #CHN_BLOCK_COUNT]
- MOV R12, #0x21
- MUL R2, R12, R0
- LDR R12, [R4, #CHN_WAVE_OFFSET]
- ADD R2, R2, R12
- ADD R2, R2, #0x10
- LDR R5, decoder_buffer
- ADR R6, delta_lookup_table
- MOV R7, #0x40
- LDRB LR, [R2], #1
- STRB LR, [R5], #1
- LDRB R12, [R2], #1
- B C_bdpcm_decoder_lsb
-
- C_bdpcm_decoder_msb:
- LDRB R12, [R2], #1
- MOV R0, R12, LSR#4
- LDRSB R0, [R6, R0]
- ADD LR, LR, R0
- STRB LR, [R5], #1
-
- C_bdpcm_decoder_lsb:
- AND R0, R12, #0xF
- LDRSB R0, [R6, R0]
- ADD LR, LR, R0
- STRB LR, [R5], #1
- SUBS R7, R7, #2
- BGT C_bdpcm_decoder_msb
-
- C_bdpcm_decoder_return:
- LDR R5, decoder_buffer
- AND R0, R3, #0x3F
- LDRSB R12, [R5, R0]
- LDMFD SP!, {R0, R2, R5-R7, PC}
-
- .align 2
-
- decoder_buffer:
- .word decoder_buffer_target
-
- delta_lookup_table:
- .byte 0x0, 0x1, 0x4, 0x9, 0x10, 0x19, 0x24, 0x31, 0xC0, 0xCF, 0xDC, 0xE7, 0xF0, 0xF7, 0xFC, 0xFF
-
- .endif
-
- main_mixer_end:
- .end
-
|