📄 cs_dec.s
字号:
movi AGRAdr0, L16k
movi AGRAdr1, R16k
movi AGRAdr2, logdifLRhi
movi AGRAdr4, Log_a1
li r15, 0x00FFFFFF
li r17, 0x00800000
li r18, 0x00400000
movi AGRAdr3, local_iir_filter_byte
loop BLOCKSIZE, LRlogdifhi
abs r4, a0(1*4) //1.23
abs r16, a1(1*4) //1.23
// movi AGRSiz3, 0xffff
loop 2, FindLog2_LR16k
// abs r4
// li r2, 0xFFFFFFFF
movi r2,0xff
tst r4, r17 // test if equal 0x00800000=1
bne tst_one_LR16k
mov r4, r18
movi r2, 0x0
tst_one_LR16k:
tsti r4, 0x80 // test if less than 2^(-16)
bgte tst_norm_LR16k
movi r4, 0x80
// nop
tst_norm_LR16k:
and r1, r4, r18
tst r1, r18
beq start_log2_LR16k
subi r2, 1 // integer protion of log
shl r4, 1 // new x
j tst_norm_LR16k
start_log2_LR16k:
mov r6, r4
mulf r8, r6, r4 // r8 = x^2
mulf r10, r4,a4(4) // r10 =a1 * x
madd r10, r8,a4(-8) // r10 =a2 * x^2 + a1 * x
add r6, r10, a4(4) // r6 =a2 * x^2 + a1 * x + a0
shl r6, 3 // r6 = 4 * (a2* x^2 + a1* x + a0)
// andi r2, 0xFF
and r6, r15
shl r2, 24
or r6, r2
shra r6, 6 // divide by 32 and shift sign bit back
mov r4, r16
rnd a3(1*4),r6
FindLog2_LR16k:
mov r4, a3(-8) //log2(L)
sub r2, r6, a3(0) //log2(R)-log2(L)r2
mov a2(1*4), r2
LRlogdifhi:
//Log Difference for 480Hz high pass filtered L,R signals
movi AGRAdr0, L480
movi AGRAdr1, R480
movi AGRAdr2, logdifLRlo
loop BLOCKSIZE, LRlogdiflo
abs r4, a0(1*4) //1.23
abs r16,a1(1*4) //1.23
loop 2, FindLog2_LR480
// abs r4
// li r2, 0xFFFFFFFF
movi r2,0xff
tst r4, r17 // test if equal 0x00800000=1
bne tst_one_LR480
mov r4, r18
movi r2, 0x0
tst_one_LR480:
tsti r4, 0x80 // test if less than 2^(-16)
bgte tst_norm_LR480
movi r4, 0x80
// nop
tst_norm_LR480:
and r1, r4, r18
tst r1, r18
beq start_log2_LR480
subi r2, 1 // integer protion of log
shl r4, 1 // new x
j tst_norm_LR480
start_log2_LR480:
mov r6, r4
mulf r8, r6, r4 // r8 = x^2
mulf r10, r4,a4(4) // r10 =a1 * x
madd r10, r8,a4(-8) // r10 =a2 * x^2 + a1 * x
add r6, r10, a4(4) // r6 =a2 * x^2 + a1 * x + a0
shl r6, 3 // r6 = 4 * (a2* x^2 + a1* x + a0)
// andi r2, 0xFF
and r6, r15
shl r2, 24
or r6, r2
shra r6, 6 // divide by 32 and shift sign bit back
mov r4, r16
rnd a3(1*4), r6
FindLog2_LR480:
mov r4, a3(-8) //log2(L)
sub r2, r6, a3(0) //log2(R)-log2(L)r2
mov a2(1*4), r2
LRlogdiflo:
//Log Difference for 480Hz high pass filtered L-R,L+R signals
movi AGRAdr0, LMR480
movi AGRAdr1, LPR480
movi AGRAdr2, logdifLMPR
// nop
loop BLOCKSIZE, LMPRlogdif
abs r4, a0(1*4) //1.23
abs r16,a1(1*4) //1.23
// movi AGRAdr3, local_iir_filter_byte
loop 2, FindLog2_3
// abs r4
// li r2, 0xFFFFFFFF
movi r2,0xff
tst r4, r17 // test if equal 0x00800000=1
bne tst_one_LMPR
mov r4, r18
movi r2, 0x0
tst_one_LMPR:
tsti r4, 0x80 // test if less than 2^(-16)
bgte tst_norm_LMPR
movi r4, 0x80
// nop
tst_norm_LMPR:
and r1, r4, r18
tst r1, r18
beq start_log2_LMPR
subi r2, 1 // integer protion of log
shl r4, 1 // new x
j tst_norm_LMPR
start_log2_LMPR:
mov r6, r4
mulf r8, r6, r4 // r8 = x^2
mulf r10, r4,a4(4) // r10 =a1 * x
madd r10, r8,a4(-8) // r10 =a2 * x^2 + a1 * x
add r6, r10, a4(4) // r6 =a2 * x^2 + a1 * x + a0
shl r6, 3 // r6 = 4 * (a2* x^2 + a1* x + a0)
// andi r2, 0xFF
and r6, r15
shl r2, 24
or r6, r2
shra r6, 6 // divide by 32 and shift sign bit back
mov r4, r16
rnd a3(1*4), r6
FindLog2_3:
mov r4, a3(-8) //log2(L)
sub r2, r6, a3(0) //log2(R)-log2(L)r2
mov a2(1*4), r2
LMPRlogdif:
//Low pass filter on the high band path
movi AGRAdr3, logdifLRhi //a3->Log difference output buffer
movw r7, hblogdif //r7->y(n-1)
mov r4, a3(1*4)
loop BLOCKSIZE,lowpass1
mulf r8, r7, l1p32_1 //r0=-a1*y(n-1),a6->b0
madd r8, r4, l1p32_2
mov r4, a3(1*4)
mov r7, r8
lowpass1:
movw hblogdif, r7 //Decimated by 16,last one stored
movw hb1v10db, r7 //signal, 1v/10db
abs r7
movw tccntl,r7 //Store it in TConst control volt
//Low pass filters on the lowband/frontback signal path
movi AGRAdr0, logdifLRlo //a3->Log difference for Lowband
movi AGRAdr1, logdifLMPR //a4->Log difference for Hiband
movw r7, lblogdif
movw r8, fblogdif
movi AGRAdr4, iir_l1p16_1
movi AGRAdr5, iir_l1p16_2
loop BLOCKSIZE,lowpass2
mulf r10, r7, i4
mulf r12, r8, i4
// mov r3, a0(1*4)
// mov r4, a1(1*4)
madd r10, i5,a0(1*4)
madd r12, i5,a1(1*4)
mov r7, r10
mov r8, r12
lowpass2:
movw lblogdif, r7
movw fblogdif, r8
shl r10, 1
movw r7, tccntl //Store it in TConst control volt
movw lb2v10db, r10
li r0, 0x266666 //r0=0.3
abs r10
movw %local_iir_filter_byte, r0
tst r7, r10
blt 4f
mov r10, r7 //save the one that is bigger
4:
madd r12, r8, %local_iir_filter_byte
nop
shl r12, 1
nop
movw fb2v10db, r12
abs r12
tst r10, r12
bgte 5f
mov r10, r12 //store max to r10
5:
movw tccntl, r10
// Evaluate Time constant filter coefficients
// from Time Constant Control
// Voltage.
movw r1, vartclow
movw r0, vartchigh
tst r10, r1
bgte 1f
mov r10, r1
1:
movw r1, hbslope
tst r0, r10
bgte 2f
mov r10, r0
2:
movw r0, hpinter
li r2, 0x7FFFFF
mulf r6, r10, r1 //r10=x0
movw r3, lofbslope
movw r4, lofbinter
add r6, r0
add r6, r0
movw hba1, r6 //r6=a
sub r14, r2, r6 //r7=b
mulf r6, r10, r3
movw hbb0, r14
add r6, r4
add r6, r4
sub r9, r2, r6 //r9=a, r6=y0
movw lofba1, r6
movw lofbb0, r9
mulf r10, r6, fbtcout//r10=b
movi r0, 0 //r0=y0=0
madd r10, r9, fb2v10db //r10=b
nop
tsti r10, 0x0
bgte NOSV
// Exponential Ratio circuit on Sv
movw fbtcout, r10
sub r8, r0, r10 // r8 = -r10
movw Cv, r0 // Cv = 0
movw Sv, r8 // Sv = -r10
mov r10, r8
movw r1, exprcoeff1
mulf r4, r8, r10
movw r2, exprcoeff2
mulf r6, r8, r1
// movw %local_iir_filter_byte+4, r2
movw r3, exprcoeff3
madd r6, r4, exprcoeff2
nop
madd r6, r4, exprcoeff2
nop
add r6, r3
tst r0, r6
blt 3f
mov r6, r0 //at least 0, nonnegative
3:
nop
movw Bv, r6
j Varmultupdate
NOSV:
movw fbtcout, r10
movw Bv, r0 // Bv = 0
movw Sv, r0 // Sv = 0
movw Cv, r10 // Cv = fbtcout
// Variable Multiplier value update
Varmultupdate:
movi r0, 0
movh r3, Lhcsflag
andi r3, SURROUND525
movw r6, Sv
movw r1, vmlowend
tsti r3, SURROUND525
bne 1f
mov r0, r6 //r0=b
1:
movw r2, vmupend
tst r1, r0
blt 2f
mov r0, r1
2:
movw r8, vminter
tst r2, r0
bgt 3f
mov r0, r2 //r2 = x1
3:
movw r4, vmslope
movw %local_iir_filter_byte, r0
movw r10, hba1 //r5=y1
nop
madd r8, r4, %local_iir_filter_byte
nop
movw multval, r8 //Store multiplier value.
// Make high band time constant, long for dominant surround
movw r12, hbb0
tst r0, r2
blt Hbtcfilter
li r10, 0x7F6500 // 0.99527
li r12, 0X009AFE // 1-0.99527
// Varable Timeconstant filter on the highband signal path
Hbtcfilter:
movw r6, hb1v10db
// nop
mulf r4, r6, r12 //r4=a
// nop
madd r4, r10, hbtcout
// Varable Multiplier circuit in highband path
nop
movw hbtcout, r4
mulf r14, r4, r8 //r14=a
nop
shl r8, r14, 8 // multiply by 256
movi r12, 0x0
shl r9, r8, 8
shra r8, 24
shra r9, 8
nop
// Find Lha, Rha
mov r10, r9
tsti r8, 0x0
bgte 1f
movi r8, 0x0
movi r10, 0x0
1:
sub r0, r12, r9
movw Lha, r10
tsti r0, 0x0
bgte 2f
movi r0, 0x0
2:
movw r3, lofba1
movw Rha, r0
// Variable Timeconstant filter on the lowband signal path
movw r2, lbtcout
mulf r8, r2, r3
movw r5, lofbb0
movw r6, multval
// nop
madd r8, r5, lb2v10db
nop
mov r2, r8
shra r8, 2 //r8=a
movi r0, 0x0
mov r10, r8 // r8=r10=a
tsti r8, 0x0
bgte 3f
movi r8, 0x0
3:
nop
movw Flv, r8
abs r8, r10
sub r12, r0, r10 //r12=b
movw RLatt, r8
tsti r12, 0x0
bgte 4f
movi r12, 0x0
4:
mulf r8, r2, r6 //r8=a
movw lbtcout, r2
shl r8, 7 // multiply by 128
movw Frv, r12
shl r9, r8, 8
shra r8, 24
shra r9, 8
nop
// Find Lla, Rla
mov r12, r9
tsti r8, 0x0
bgte 5f
movi r8, 0x0
movi r12, 0x0
5:
sub r10, r0, r9 //r0=0
movw Lla, r12
tsti r10, 0x0
bgte 6f
movi r10, 0x0
6:
li r2, 0x600000 // 0.75
movw Rla, r10
// Evaluate Flv, Frv
movw r1, Cv
li r3, 0x09F73E // 1.5*ONEVOLT
mulnf r8, r1, r2
nop
add r8, r3
movw r4, Flv
tsti r8, 0x0
bgte 1f
movi r8, 0x0
1:
nop
shl r8, 1
movw r6, Frv
tst r8, r4
blt 2f
mov r4, r8
2:
tst r8, r6
blt 3f
mov r6, r8
3:
movw Flv, r4 // r4=b
movw Frv, r6 // r6=a
// Vca Update
movi r3, VCA0500
movi r1, vcatable
movi r2, MAXVCAINDEX
// Update Vca1 and Vca2 - Frv, Flv
mulf r8, r6, r3
nop
tst r8, r2
blte 4f
mov r8, r2 //r8=N6
4:
mulf r10, r4, r3
shl r8, 2 // convert to byte address
tst r10, r2
blte 5f
mov r10, r2 //r10=N6
5:
add r12, r1, r8
shl r10, 2 // convert to byte address
dlwr r14, r12
add r11, r1, r10
dlwr r15, r11
movw vca1, r14
movw vca2, r15
// Update Vca09, Vca10 - Lha, Lla
movi r3, VCA1250
movw r4, Lha
movw r5, Lla
mulf r8, r4, r3
nop
tst r8, r2
blte 1f
mov r8, r2 //r8=N6
1:
mulf r10, r5, r3
shl r8, 2 // convert to byte address
tst r10, r2
blte 2f
mov r10, r2
2:
add r12, r1, r8
shl r10, 2 // convert to byte address
dlwr r14, r12 //r14=a
add r11, r1, r10
movw r6, sscale
dlwr r15, r11
mulf r8, r6, r14
mulf r10, r6, r15
// nop
movw vca09, r8
movw vca10, r10
// Update Vca11, Vca12 - Rha, Rla
movi r3, VCA1250
movw r4, Rha
movw r5, Rla
mulf r8, r4, r3
nop
tst r8, r2
blte 3f
mov r8, r2 //r8=N6
3:
mulf r10, r5, r3
shl r8, 2 // convert to byte address
tst r10, r2
blte 4f
mov r10, r2
4:
add r12, r1, r8
shl r10, 2 // convert to byte address
dlwr r14, r12 //r14=a
add r11, r1, r10
dlwr r15, r11 //r5=b
movw vca11, r14
movw vca12, r15
// Update Vca8, Vca34
movw r4, RLatt
movw r5, Bv
mulf r8, r4, r3
movi r3, VCA0500
tst r8, r2
blte 5f
mov r8, r2 //r8=N6
5:
mulf r10, r5, r3
shl r8, 2
tst r10, r2
blte 6f
mov r10, r2
6:
add r12, r1, r8
shl r10, 2 // convert to byte address
dlwr r14, r12 //r14=a
add r11, r1, r10
dlwr r15, r11 //r5=b
movw vca8, r14
movw vca5, r14
movw vca34, r15
// Check for Wide/Narrow mode
li r2, 0x7FFFFF
movh r3, Lhcsflag
andi r5, r3, WIDE
tsti r5, WIDE
beq 1f
mov r14, r2
1:
// movw vca8, r14
// Check for MUSIC/CINEMA mode and Set vca1, vca2 accordingly
movw r0, vca1
movw r1, vca2
andi r5, r3, MUSIC
tsti r5, MUSIC
beq 2f
movi r0, 0x0
movi r1, 0x0
2:
movw vca1, r0
movw vca2, r1
//===== Move output to 0x1000 - 0x1C00 =====
movi AGRAdr1, LFRF
movi AGRAdr2, LSRS
movi AGRAdr3, CTSW
movw r2, storedataptr
mov AGRAdr4, r2
movi AGRSiz4, 0xffff
loop BLOCKSIZE, Align_6ch_data
mov r3, a1(1*4)
mov r4, a2(1*4)
mov r5, a3(1*4)
mov a4(1*4), r3
mov a4(1*4), r4
mov a4(1*4), r5
Align_6ch_data:
mov r2, AGRAdr4
movw storedataptr, r2 //Store ptr for next block
addi r20, 1 // counter
tsti r20, BLOCKSIZE
bne jump_SRS_init
no_SRS:
jsr r30, SUB_save_SRS_context
jsr r30, SUB_restore_pcm_context1000
j r29
/////===== SRS Context Switch ==================
SUB_save_pcm_context1000: //0xd000-0xefff
movi StartAddrHigh, DataSeg //to second segment
movi DMASize,31
movi r10,0x0
movi r11,(mpeg_context)>>2
loop 32, save_pcm1000 //total of 32*32 words
mov LocalAddr, r10
dmawr r11
Lwait7: bdb Lwait7
addi r10, 32 //32 words each block
addi r11, 32
save_pcm1000:
movi r10,(0x1c00)>>2 // save a few high bank loacal mem
// loop 2, save_pcm1c00 //total of 2*32 words
mov LocalAddr, r10
dmawr r11
Lwait7h:
bdb Lwait7h
addi r10, 32 //32 words each block
addi r11, 32
//save_pcm1c00:
movi StartAddrHigh,MEM_SEG //back to first segment
j r30
//=========================================
SUB_restore_pcm_context1000: //0xd000-0xefff
movi StartAddrHigh, DataSeg //to second segment
movi DMASize,31
movi r10,0x0
movi r11,(mpeg_context)>>2
loop 32, restore_pcm1000 //total of 32*32 words
mov LocalAddr, r10
dmarr r11
Lwait8: bdb Lwait8
addi r10, 32 //32 words each block
addi r11, 32
restore_pcm1000:
movi r10,(0x1c00)>>2 // restore a few high bank loacal mem
// loop 2, restore_pcm1c00 //total of 2*32 words
mov LocalAddr, r10
dmarr r11
Lwait8h:
bdb Lwait8h
addi r10, 32 //32 words each block
addi r11, 32
//restore_pcm1c00:
movi StartAddrHigh,MEM_SEG //back to first segment
j r30
//=========================================
SUB_save_SRS_context: //0x8000-0x9000
movi StartAddrHigh, DataSeg //to second segment
movi DMASize, 31
movi r10, 0x0
movi r11, (SRS_context)>>2
loop 32, save_SRS //total of 32*32 words
mov LocalAddr, r10
dmawr r11
Lwait9: bdb Lwait9
addi r10, 32 //32 words each block
addi r11, 32
save_SRS:
movi r10,(0x1c00)>>2 // save a few high bank loacal mem
// loop 2, save_SRS1c00 //total of 2*32 words
mov LocalAddr, r10
dmawr r11
Lwait9h:
bdb Lwait9h
addi r10, 32 //32 words each block
addi r11, 32
//save_SRS1c00:
movi StartAddrHigh, MEM_SEG //back to first segment
j r30
//=========================================
SUB_restore_SRS_context: //0x8000-0x9000
movi StartAddrHigh, DataSeg //to second segment
movi DMASize, 31
movi r10, 0x0 //no need to copy output
movi r11, (SRS_context)>>2 //SRS_context = 0x8000
loop 32, restore_SRS //total of 32*32 words
mov LocalAddr, r10
dmarr r11
Lwait10:
bdb Lwait10
addi r10, 32 //32 words each block
addi r11, 32
restore_SRS:
movi r10,(0x1c00)>>2 // restore a few high bank loacal mem
// loop 2, restore_SRS1c00 //total of 2*32 words
mov LocalAddr, r10
dmarr r11
Lwait10h:
bdb Lwait10h
addi r10, 32 //32 words each block
addi r11, 32
//restore_SRS1c00:
movi StartAddrHigh,MEM_SEG //back to first segment
j r30
/////===== End of SRS Context Switch ==================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -