📄 pcm_dec.s
字号:
L2_channel_loop_96k:
#else
#if 1
#if 1
dlw r0,USER_OCFG
#else
dlw r0,0xff00
#endif
nop
andi r0, OCFG_PCM_FREQ_MASK
tsti r0, 0 ; 0/1 - 48/96 kHz output
bne L96k_ND
//Decimation filter applied
;******* load the coefficient of the filter in local memory *************
movi StartAddrHigh, DataSeg
movi DMASize, 31 ; coefficient = 32
movi r9, local_dec_filter_word
movi r26, decimation2
shr r26,2
mov LocalAddr,r9
; sets the location in local memory
dmarr r26 ; adress in DRAM for history
WaitDma
;******* load the history of the filter in local memory *************
movi DMASize, 31 ; history =64 data
movi r9, local_hist_mid_buf_word
movi r26, (pcm_dec_hist)>>2
loop 2,load_hist_sample
mov LocalAddr,r9
; sets the location in local memory
dmarr r26 ; adress in DRAM for history
WaitDma
addi r9,32
addi r26,32
load_hist_sample:
;******* set up the AGRAdr ******************************************
;******* filter coefficients********
movi AGRAdr4, local_dec_filter_byte; pointer to filter coefficients
movi AGRSiz4, 0x7e ; 64 coefficients, circular buffer
movi AGRInc4, 0x2 ; increments by 2 (one coefficient)
;******* data_in *******
movi AGRAdr2, local_hist_mid_buf_byte ; +4 pointer on the beginning of history
movi AGRSiz2, 0xffff
movi AGRMod2, 0
movi AGRInc2, 0xff02 ; increments by -254 (reset of history)
;******* process a block of 128 samples *******************************
loop 64, L2_channel_loop_96k ;64
mulhf r8, i4, a2(4)
// nop
// mov r6,r8 ;test
loop 21, decimation_flt_1
maddhf r8, i4, a2(4) ; first filter set
maddhf r8, i4, a2(4) ; second
maddhf r8, i4, a2(4) ; third, go back to first set of filter
decimation_flt_1:
nop
; shra r8,1 ;test
rndhf a3(1*2), r8
movhf r6,i2 ; dummy a4 point to next channel -254
mulhf r8, i4, a2(4)
// nop
loop 21, decimation_flt_2 ; 2nd channel
maddhf r8, i4, a2(4) ; first filter set
maddhf r8, i4, a2(4) ; second
maddhf r8, i4, a2(4) ; third, go back to first set of filter
decimation_flt_2:
nop
; shra r8,1 ;test
rndhf a3(1*2), r8
mov a3(1*4), r0 ; clear the non-existing channels
mov a3(1*4), r0
movhf r6,i2 ; dummy instruction for data shifting
movhf r6,a2(4) ; dummy instr
L2_channel_loop_96k:
;******* save the history of the filter in DRAM *************
movi DMASize, 31 ; history =64 data
movi r9, local_last_dec_buf_word
movi r26, (pcm_dec_hist)>>2
loop 2,save_hist_sample
mov LocalAddr,r9
; sets the location in local memory
dmawr r26 ; adress in DRAM for history
WaitDma
addi r9,32
addi r26,32
save_hist_sample:
j L2_channel_loop_96k_ND
#else
loop 64, L2_channel_loop_96k
mov r3, a2(2*4)
mov a3(1*4), r3
mov a3(1*4), r0 //clear the non-existing channels
mov a3(1*4), r0
L2_channel_loop_96k:
#endif //0 test
L96k_ND:
loop 128, L2_channel_loop_96k_ND
mov r3, a2(1*4)
mov a3(1*4), r3
mov a3(1*4), r0 //clear the non-existing channels
mov a3(1*4), r0
L2_channel_loop_96k_ND:
#endif
movi TrapReg,1<<2
j Lchannel_continue_96k
//---------------------------------------------------
L3_channel_96k:
tsti r19, 0
beq L3_first_blk_96k
tsti r19, 1
beq L3_second_blk_96k
tsti r19, 2
beq L3_third_blk_96k
L3_first_blk_96k:
jsr r29, SUB_3_channel_96k
movi AGRAdr0, local_temp_buf_byte
mov r3, a2(1*4) //save 2 left-over words
mov a0(1*4), r3
mov r3, a2(1*4)
mov a0(1*4), r3
j Lchannel_continue_96k
L3_second_blk_96k:
movi AGRAdr0, local_temp_buf_byte
nop
mov r3, a0(1*4) //get left-over from previous block
mov a3(1*4), r3
mov r3, a0(0*4)
andi r3, 0xffff
mov a3(1*4), r3
mov a3(1*4), r0 //clear the non-existing channels
shr r3, a0(1*4), 16
shl r4, a2(0*4), 16 //get new data
or a3(1*4), r3, r4
shr r3, a2(1*4), 16
mov a3(1*4), r3
mov a3(1*4), r0 //clear the non-existing channels
jsr r29, SUB_3_channel_96k
movi AGRAdr0, local_temp_buf_byte
mov r3, a2(1*4) //save 1 left-over words
mov a0(1*4), r3
j Lchannel_continue_96k
L3_third_blk_96k:
movi AGRAdr0, local_temp_buf_byte
nop
mov r3, a0(1*4) //get left-over from previous block
mov a3(1*4), r3
mov r3, a2(0*4) //get new data
andi r3, 0xffff
mov a3(1*4), r3
mov a3(1*4), r0 //clear the non-existing channels
shr r3, a2(1*4), 16
shl r4, a2(0*4), 16 //get new data
or a3(1*4), r3, r4
shr r3, a2(1*4), 16
mov a3(1*4), r3
mov a3(1*4), r0 //clear the non-existing channels
jsr r29, SUB_3_channel_96k
j Lchannel_continue_96k
//---------------------------------------------------
L4_channel_96k:
movi TrapReg,0
nop
nop
#ifdef I2S
loop 32, L4_channel_loop_96k
#else
loop 64, L4_channel_loop_96k
#endif
mov r3, a2(0*4)
mov a3(1*4), r3
mov r3, a2(0*4)
mov a3(1*4), r3
mov a3(1*4), r0 //clear the non-existing channels
L4_channel_loop_96k:
movi TrapReg,1<<2
j Lchannel_continue_96k
//---------------------------------------------------
L5_channel_96k:
tsti r19, 0
beq L5_first_blk_96k
tsti r19, 1
beq L5_second_blk_96k
tsti r19, 2
beq L5_third_blk_96k
tsti r19, 3
beq L5_fourth_blk_96k
tsti r19, 4
beq L5_fifth_blk_96k
L5_first_blk_96k:
jsr r29, SUB_5_channel_96k
mov r3, a2(1*4)
mov a3(1*4), r3
mov r3, a2(1*4)
mov a3(1*4), r3
mov r3, a2(0*4)
andi r3, 0xffff
mov a3(1*4), r3
movi AGRAdr0, local_temp_buf_byte
mov r3, a2(1*4) //save 1/2 left-over word
mov a0(1*4), r3
j Lchannel_continue_96k
L5_second_blk_96k:
movi AGRAdr0, local_temp_buf_byte
nop
shr r3, a0(1*4), 16 //get 1/2 left-over word
shl r4, a2(0*4), 16
or a3(1*4), r3, r4
shr r3, a2(1*4), 16
shl r4, a2(0*4), 16
or a3(1*4), r3, r4
shr r3, a2(1*4), 16
mov a3(1*4), r3
jsr r29, SUB_5_channel_96k
movi AGRAdr0, local_temp_buf_byte
mov r3, a2(1*4) //save 1 left-over word
mov a0(1*4), r3
j Lchannel_continue_96k
L5_third_blk_96k:
/* movi AGRAdr0, local_temp_buf_byte
nop
mov r3, a0(1*4)
mov a3(1*4), r3
mov r3, a2(1*4)
mov a3(1*4), r3
mov r3, a2(0*4)
andi a3(1*4), r3, 0xffff
jsr r29, SUB_5_channel_96k
*/
L5_fourth_blk_96k:
L5_fifth_blk_96k:
j Lchannel_continue_96k
L6_channel_96k:
L7_channel_96k:
L8_channel_96k:
Lchannel_continue_96k:
//-----------------------------------------------------
Lupdate_channel_count:
addi r19, 1 //inc channel count
addi r18, 1
tst r18, r17
blt Lchannel_loop_start
//****************************************************************
// De-emphasis will start here
//****************************************************************
#if 0
dlw r0,0xff10 ; testing purpose
nop
nop
tsti r0,0x80
bne skip_Deemphasis
#else
andi r0, r20, OCFG_EMPHA_MASK
tsti r0,0
beq skip_Deemphasis
#endif
;******* load the coefficient of the filter in local memory *************
movi StartAddrHigh, DataSeg
movi DMASize, 2 ; coefficient = 5
movi r9, local_deemphasis_filter_word
movi r26, Deemphasis_coef
shr r26,2
mov LocalAddr,r9
; sets the location in local memory
dmarr r26 ; adress in DRAM for history
WaitDma
;******* set up the AGRAdr ******************************************
;******* filter coefficients********
movi AGRAdr2,local_deemphasis_filter_byte
movi AGRSiz2,2*4 ; 5 coefficients circular buffer
movi AGRInc2, 2
;******* Filter Left Data Input********
movi AGRAdr7, local_deemph_hist_byte_L
movi AGRSiz7,0xffff
movi AGRInc7, 2
movi AGRAdr6, local_FApcm_buf_byte
movi AGRSiz6,0xffff
movi AGRInc6, 4*3
mulhf r8,i2,i7 ; -a2 * Y(t-1)
maddhf r8,i2,i7 ; -a2 * Y(t-1)-a3 * Y(t-2)
maddhf r8,i2,i6 ; ..+b1 * X
maddhf r8,i2,i7 ; ..+b2 * X(t-1)
maddhf r8,i2,a7(-2*3) ; ..+b3 * X(t-2)
movhf r0,a7(0) ; Y(t-1)->Y(t-2)
rndhf a7(+2),r8 ; Y(t)->Y(t-1)
movhf a7(-2),r0
#if 1
nop
#else
nop
nop
mov r1,AGRAdr7
dsw r1,0xff34
mov r0,AGRAdr6
dsw r0,0xff38
mov r1,AGRAdr2
dsw r1,0xff3c
// dlw r0,0xff30
shr r8,8
nop
test_66:
nop
nop
nop
// tsti r0,0xbeef
tsti r0,0x5000
bgt test_66
nop
nop
nop
// j test_66
#endif
mulhf r8,i2,i7 ; -a2 * Y(t-1)
maddhf r8,i2,i7 ; -a2 * Y(t-1)-a3 * Y(t-2)
maddhf r8,i2,a6(-12*1) ; ..+b1 * X
maddhf r8,i2,a6(+12*2) ; ..+b2 * X(t-1)
maddhf r8,i2,a7(-2*2) ; ..+b3 * X(t-2)
movhf r0,a7(0) ; Y(t-1)->Y(t-2)
rndhf a7(+2),r8 ; Y(t)->Y(t-1)
movhf a7(-2),r0
loop 252,till_the_last_2L
mulhf r8,i2,i7 ; -a2 * Y(t-1)
maddhf r8,i2,a7(0) ; -a2 * Y(t-1)-a3 * Y(t-2)
maddhf r8,i2,a6(-12*1) ; ..+b1 * X
maddhf r8,i2,a6(-12*1) ; ..+b2 * X(t-1)
maddhf r8,i2,a6(0) ; ..+b3 * X(t-2)
movhf r0,a7(-2) ;
movhf r1,a7(2)
movhf a6(+12*3),r0 ; store output
movhf a7(-2),r1 ; Y(t-1)->Y(t-2)
rndhf a7(0),r8 ; Y(t)->Y(t-1)
till_the_last_2L:
mulhf r8,i2,i7 ; -a2 * Y(t-1)
maddhf r8,i2,a7(+4) ; -a2 * Y(t-1)-a3 * Y(t-2)
movhf r3,a6(0) ; X(t-2) for next frame
maddhf r8,i2,a6(-12*1) ; ..+b1 * X
maddhf r8,i2,a6(-12*1) ; ..+b2 * X(t-1)
maddhf r8,i2,a6(0) ; ..+b3 * X(t-2)
movhf a7(-4),r3 ; store X(t-2)
// dsw r3,0xff60 //test
movhf r0,a7(-2) ;
movhf r1,a7(2)
movhf a6(+12*3),r0 ; store output
movhf a7(-2),r1 ; Y(t-1)->Y(t-2)
rndhf a7(0),r8 ; Y(t)->Y(t-1)
mulhf r8,i2,i7 ; -a2 * Y(t-1)
maddhf r8,i2,i7 ; -a2 * Y(t-1)-a3 * Y(t-2)
movhf r3,a6(0) ; X(t-1) for next frame
maddhf r8,i2,a6(-12*1) ; ..+b1 * X
maddhf r8,i2,a6(-12*1) ; ..+b2 * X(t-1)
maddhf r8,i2,a6(0) ; ..+b3 * X(t-2)
movhf a7(-2),r3 ; store X(t-1)
// dsw r3,0xff5c //test
movhf r0,a7(-2) ;
movhf r1,a7(2)
movhf a6(+12*1),r0 ; store output
movhf a7(-2),r1 ; Y(t-1)->Y(t-2)
movhf a6(+12*1),r1 ; store output
rndhf a7(0),r8 ; Y(t)->Y(t-1)
rndhf a6(0),r8 ;store output
#if 0
dsw r1,0xff54
nop
dsw r8,0xff50
#endif
;******* Filter Right Data Input********
movi AGRAdr7, local_deemph_hist_byte_R
movi AGRAdr6, local_FApcm_buf_byte+2
mulhf r8,i2,i7 ; -a2 * Y(t-1)
maddhf r8,i2,i7 ; -a2 * Y(t-1)-a3 * Y(t-2)
maddhf r8,i2,i6 ; ..+b1 * X
maddhf r8,i2,i7 ; ..+b2 * X(t-1)
maddhf r8,i2,a7(-2*3) ; ..+b3 * X(t-2)
movhf r0,a7(0) ; Y(t-1)->Y(t-2)
rndhf a7(+2),r8 ; Y(t)->Y(t-1)
movhf a7(-2),r0
nop
mulhf r8,i2,i7 ; -a2 * Y(t-1)
maddhf r8,i2,i7 ; -a2 * Y(t-1)-a3 * Y(t-2)
maddhf r8,i2,a6(-12*1) ; ..+b1 * X
maddhf r8,i2,a6(+12*2) ; ..+b2 * X(t-1)
maddhf r8,i2,a7(-2*2) ; ..+b3 * X(t-2)
movhf r0,a7(0) ; Y(t-1)->Y(t-2)
rndhf a7(+2),r8 ; Y(t)->Y(t-1)
movhf a7(-2),r0
loop 252,till_the_last_2R
mulhf r8,i2,i7 ; -a2 * Y(t-1)
maddhf r8,i2,a7(0) ; -a2 * Y(t-1)-a3 * Y(t-2)
maddhf r8,i2,a6(-12*1) ; ..+b1 * X
maddhf r8,i2,a6(-12*1) ; ..+b2 * X(t-1)
maddhf r8,i2,a6(0) ; ..+b3 * X(t-2)
movhf r0,a7(-2) ;
movhf r1,a7(2)
movhf a6(+12*3),r0 ; store output
movhf a7(-2),r1 ; Y(t-1)->Y(t-2)
rndhf a7(0),r8 ; Y(t)->Y(t-1)
till_the_last_2R:
mulhf r8,i2,i7 ; -a2 * Y(t-1)
maddhf r8,i2,a7(+4) ; -a2 * Y(t-1)-a3 * Y(t-2)
movhf r3,a6(0) ; X(t-2) for next frame
maddhf r8,i2,a6(-12*1) ; ..+b1 * X
maddhf r8,i2,a6(-12*1) ; ..+b2 * X(t-1)
maddhf r8,i2,a6(0) ; ..+b3 * X(t-2)
movhf a7(-4),r3 ; store X(t-2)
movhf r0,a7(-2) ;
movhf r1,a7(2)
movhf a6(+12*3),r0 ; store output
movhf a7(-2),r1 ; Y(t-1)->Y(t-2)
rndhf a7(0),r8 ; Y(t)->Y(t-1)
mulhf r8,i2,i7 ; -a2 * Y(t-1)
maddhf r8,i2,a7(+2) ; -a2 * Y(t-1)-a3 * Y(t-2)
movhf r3,a6(0) ; X(t-1) for next frame
maddhf r8,i2,a6(-12*1) ; ..+b1 * X
maddhf r8,i2,a6(-12*1) ; ..+b2 * X(t-1)
maddhf r8,i2,a6(0) ; ..+b3 * X(t-2)
movhf a7(-2),r3 ; store X(t-1)
movhf r0,a7(-2) ; Y(t-1)->Y(t-2)
movhf r1,a7(2)
movhf a6(+12*1),r0 ; store output
movhf a7(-2),r1 ; Y(t-1)->Y(t-2)
movhf a6(+12*1),r1 ; store output
rndhf a7(0),r8 ; Y(t)->Y(t-1)
rndhf a6(0),r8 ;store output
movi AGRSiz2,0xffff ; back to linear buffer
skip_Deemphasis:
//****************************************************************
// End of De-emphasis
//****************************************************************
movb r1,LBblknum
addi r1,1
tsti r1, 6
blte blk_ok
movi r1,1 ; starts with 1
blk_ok:
movb LBblknum,r1
mult r4, r13, r17 //#blk * #chan
dlw r1, Stream_Start
dlw r2, Stream_End
#ifdef I2S
shl r4, 6 //*16*4
#else
shl r4, 7 //*32*4
#endif
add r0, r21, r4
multi r10, r4, 3 //*6/2 (6 blk per PTS.16-bit per word)
tst r0, r2
blt end_PCM_decode
subi r0, PCM_IBUF_SIZE ;circular IBUF read ptr
end_PCM_decode:
// dsw r0, Stream_Rd_Ptr ;update IBUF read ptr
SvStrRdPtr r0
movw LWibufRdPtr,r0
#if LS388
rswi r0, Comm_Reg3 //for host
andi r2,r0,0xffff
movh r10,LIold_rd_ptr
tst r2,r10
bgte 1f
addi r2,PCM_IBUF_SIZE
1: sub r2,r10
movh LIold_rd_ptr,r0
movw r10,LWbytecount
add r10,r2
// add r10,r4
movw LWbytecount,r10
// movh LIfrmsize, r4 ;for PTS
#else // LS388
movh LIfrmsize, r10 ;for PTS
#endif // LS388
dsw r4, MIN_IBUF_VAR ;for testing buffer emptyness
j r31
// sub-routines
SUB_3_channel:
movi TrapReg,0
nop
nop
loop 42, L3_channel_loop
mov r3, a2(1*4)
mov a3(1*4), r3
mov r3, a2(0*4)
andi r3, 0xffff
mov a3(1*4), r3
mov a3(1*4), r0 //clear the non-existing channels
shr r3, a2(1*4), 16
shl r4, a2(0*4), 16
or a3(1*4), r3, r4
shr r3, a2(1*4), 16
mov a3(1*4), r3
mov a3(1*4), r0 //clear the non-existing channels
L3_channel_loop:
movi TrapReg,1<<2
j r29
SUB_5_channel:
movi TrapReg,0
nop
nop
loop 25, L5_channel_loop
mov r3, a2(1*4)
mov a3(1*4), r3
mov r3, a2(1*4)
mov a3(1*4), r3
mov r3, a2(0*4)
andi r3, 0xffff
mov a3(1*4), r3
shr r3, a2(1*4), 16
shl r4, a2(0*4), 16
or a3(1*4), r3, r4
shr r3, a2(1*4), 16
shl r4, a2(0*4), 16
or a3(1*4), r3, r4
shr r3, a2(1*4), 16
mov a3(1*4), r3
L5_channel_loop:
movi TrapReg,1<<2
j r29
SUB_3_channel_96k:
movi TrapReg,0
nop
nop
loop 42, L3_channel_loop_96k
mov r3, a2(1*4)
mov a3(1*4), r3
mov r3, a2(0*4)
andi r3, 0xffff
mov a3(1*4), r3
mov a3(1*4), r0 //clear the non-existing channels
shr r3, a2(1*4), 16
shl r4, a2(0*4), 16
or a3(1*4), r3, r4
shr r3, a2(1*4), 16
mov a3(1*4), r3
mov a3(1*4), r0 //clear the non-existing channels
L3_channel_loop_96k:
movi TrapReg,1<<2
j r29
SUB_5_channel_96k:
movi TrapReg,0
nop
nop
loop 25, L5_channel_loop_96k
mov r3, a2(1*4)
mov a3(1*4), r3
mov r3, a2(1*4)
mov a3(1*4), r3
mov r3, a2(0*4)
andi r3, 0xffff
mov a3(1*4), r3
shr r3, a2(1*4), 16
shl r4, a2(0*4), 16
or a3(1*4), r3, r4
shr r3, a2(1*4), 16
shl r4, a2(0*4), 16
or a3(1*4), r3, r4
shr r3, a2(1*4), 16
mov a3(1*4), r3
L5_channel_loop_96k:
movi TrapReg,1<<2
j r29
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -