📄 spf_dec.s
字号:
/************************************************************************/
; (c)1996 Copyright M-Pact, Inc. All rights reserved
;
; Revision 1.0
;
;
; Module: PCM_decoder (PCM decoder routine)
;
; Initial version: Jinshi Huang 8/27/97
;
; Calling : none
; Called by: top level
; Return: r31
; Param in:
; Temp reg:
; AGR reg:
; Local buffer:
;************************************************************************
.nolist
#include "regdef.h"
#include "globalv.h"
#include "user.h"
.list
.globl SUB_SPF_decoder
.extern BAblksize
SUB_SPF_decoder:
// set up parameters
dlw r20, USER_OCFG
#ifdef NON_DEF
movi DMASize, 15 ;16 words each block
#else
movi DMASize, 31 ;32 words each block
#endif
movi BlockSkip, 0
movi BlockSize, 0 ;block size = 1.
// dlw r21, Stream_Rd_Ptr
LdStrRdPtr r21
dlw r23, Stream_End
//debug
// nop
// dsw r21, 0xffb8
andi r10, r20, OCFG_CHANNEL_MASK
shr r10, OCFG_CHANNEL_SHIFT
addi r10, 1 ; offset
mov r17, r10 ; as loop count
andi r1, r20, OCFG_SAMP_FREQ_MASK
shr r1, OCFG_SAMP_FREQ_SHIFT
tsti r1, 0
beq L48k
shl r17, 1 ; double if 96k
L48k:
andi r11, r20, OCFG_WORD_LEN_MASK
shr r11, OCFG_WORD_LEN_SHIFT
addi r12, r11, BAblksize
dlbr r13, r12
andi r22, r21, 0xffff ;lower 16-bit
shr r22, 2 ;to word addr
andi r23, 0xffff ;lower 16-bit
shr r23, 2 ;to word addr
movi AGRSiz0, 0xffff ; linear
movi AGRSiz1, 0xffff
movi AGRSiz2, 0xffff ; linear
movi AGRSiz3, 0xffff
mupi r15,0xff00
ori r15,0xff00 ; upper bytes
mupi r16,0x00ff
ori r16,0x00ff ; lower bytes
// start decoding
movi AGRAdr3, local_FApcm_buf_byte
// start channel loop ******************************************
movi r19, 0
movi r18, 0
Lchannel_loop_start:
// read in one channel data
movi r1, local_IBUF_word ; word addr
movi TrapReg,0
nop
nop
loop r13, block_loop
tst r22, r23
blt dma_blk_ok
subi r22, PCM_IBUF_SIZE/4 ;wrap in word addr
dma_blk_ok:
mov LocalAddr, r1
dmarr r22
wait_dma_PCM:
mov r3,StatusPort
tsti r3,DmaDoneBit
bz wait_dma_PCM ;wait for dma done
#ifdef NON_DEF
addi r22, 16
addi r1, 16 ;16 words each block
#else
addi r22, 32
addi r1, 32 ;32 words each block
#endif
block_loop:
movi TrapReg,1<<2
// byte swap
movi AGRAdr0, local_IBUF_byte
movi TrapReg,0
nop
nop
loop r13, byteswap_outer
#ifdef NON_DEF
loop 16, byteswap_inner
#else
loop 32, byteswap_inner
#endif
and r3,r15,a0(0*4) ; upper bytes
and r4,r16,a0(0*4) ; lower bytes
shr r3, 8
shl r4, 8
or a0(1*4), r3, r4
byteswap_inner:
byteswap_outer:
movi TrapReg,1<<2
// bit alignment
movi AGRAdr0, local_IBUF_byte
movi AGRAdr1, local_mid_buf_byte
tsti r11, 0
beq L16_bit_case
tsti r11, 1
beq L20_bit_case
tsti r11, 2
beq L24_bit_case
L16_bit_case:
movi TrapReg,0
nop
nop
#ifdef NON_DEF
loop 64, L16_bit_loop
#else
loop 128, L16_bit_loop
#endif
mov r3, a0(1*4)
mov a1(1*4), r3 ; L/U
L16_bit_loop:
movi TrapReg,1<<2
j PCM_gain_adjust
L20_bit_case:
mupi r6, 0xffff ; upper 16-bit
movi TrapReg,0
nop
nop
#ifdef NON_DEF
loop 16, L20_bit_loop //160/5
#else
loop 32, L20_bit_loop //160/5
#endif
shr r3, a0(0*4), 4
andi r3, 0xffff //L
shr r4, a0(1*4), 8
shl r5, a0(0*4), 24
or r4, r5
and r4, r6 //U
or a1(1*4), r3, r4 //L/U
shr r3, a0(1*4), 12
andi r3, 0xffff //L
shl r4, a0(0*4), 16 //U
or a1(1*4), r3, r4 //L/U
shr r3, a0(1*4), 20
shl r4, a0(0*4), 12
or r3, r4
andi r3, 0xffff //L
shl r4, a0(0*4), 8
and r4, r6 //U
or a1(1*4), r3, r4 //L/U
shr r3, a0(1*4), 28
shl r4, a0(0*4), 4
or r3, r4
andi r3, 0xffff //L
and r4, r6, a0(1*4) //U
or a1(1*4), r3, r4 //L/U
L20_bit_loop:
movi TrapReg,1<<2
j PCM_gain_adjust
L24_bit_case:
mupi r6, 0xffff ; upper 16-bit
.if 0
loop 64, L24_bit_loop //192/3
shr r3, a0(1*4), 8
andi r3, 0xffff //L
shl r4, a0(0*4), 16 //U
or a1(1*4), r3, r4 //L/U
shr r3, a0(1*4), 24
shl r4, a0(0*4), 8
or r3, r4
andi r3, 0xffff //L
and r4, r6, a0(1*4) //U
or a1(1*4), r3, r4 //L/U
L24_bit_loop:
.endif
movi TrapReg,0
nop
nop
#ifdef NON_DEF
loop 32, L24_bit_loop //96/3
#else
loop 64, L24_bit_loop //192/3
#endif
mov r3, a0(1*4)
mov a1(1*4), r3 ; L/U
mov r3, a0(2*4) ; skip third word
mov a1(1*4), r3 ; L/U
L24_bit_loop:
movi TrapReg,1<<2
// decode X, Y here later
PCM_gain_adjust:
nop //done in "pcm_pcm"
// pack the pcm data according to number of channels
// get sample frequency
movi AGRAdr2, local_mid_buf_byte
movi r0, 0
andi r1, r20, OCFG_SAMP_FREQ_MASK
shr r1, OCFG_SAMP_FREQ_SHIFT
tsti r1, 1
beq L96k_case
// ----------------------- 48k ----------------------------------
tsti r10, 1
beq L1_channel
tsti r10, 2
beq L2_channel
tsti r10, 3
beq L3_channel
tsti r10, 4
beq L4_channel
tsti r10, 5
beq L5_channel
tsti r10, 6
beq L6_channel
tsti r10, 7
beq L7_channel
tsti r10, 8
beq L8_channel
//---------------------------------------------------
L1_channel:
movi TrapReg,0
nop
nop
#ifdef NON_DEF
loop 64, L1_channel_loop
mov r3, a2(0*4)
andi r3, 0xffff
mov a3(1*4), r3
mov a3(1*4), r0 //clear the non-existing channels
mov a3(1*4), r0
mov a3(1*4), r0
mov a3(1*4), r0
mov a3(1*4), r0
shr r3, a2(1*4), 16
andi r3, 0xffff
mov a3(1*4), r3
mov a3(1*4), r0 //clear the non-existing channels
mov a3(1*4), r0
mov a3(1*4), r0
mov a3(1*4), r0
mov a3(1*4), r0
L1_channel_loop:
#else
loop 128, L1_channel_loop
mov r3, a2(0*4)
andi r3, 0xffff
mov a3(1*4), r3
mov a3(1*4), r0 //clear the non-existing channels
mov a3(1*4), r0
shr r3, a2(1*4), 16
andi r3, 0xffff
mov a3(1*4), r3
mov a3(1*4), r0 //clear the non-existing channels
mov a3(1*4), r0
L1_channel_loop:
#endif
movi TrapReg,1<<2
j Lchannel_continue
//---------------------------------------------------
L2_channel:
movi TrapReg,0
nop
nop
#ifdef NON_DEF
movi r1, 0xffff
loop 64, L2_channel_loop
and r3, r1, a2(0*4)
mov a3(1*4), r3 //L
shr r3, a2(1*4), 16
mov a3(1*4), r3 //R
mov a3(1*4), r0 //clear the non-existing channels
mov a3(1*4), r0
mov a3(1*4), r0
mov a3(1*4), r0
L2_channel_loop:
#else
loop 128, L2_channel_loop
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:
#endif
movi TrapReg,1<<2
j Lchannel_continue
//---------------------------------------------------
L3_channel:
tsti r19, 0
beq L3_first_blk
tsti r19, 1
beq L3_second_blk
tsti r19, 2
beq L3_third_blk
L3_first_blk:
jsr r29, SUB_3_channel
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
L3_second_blk:
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
movi AGRAdr0, local_temp_buf_byte
mov r3, a2(1*4) //save 1 left-over words
mov a0(1*4), r3
j Lchannel_continue
L3_third_blk:
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
j Lchannel_continue
//---------------------------------------------------
L4_channel:
movi TrapReg,0
nop
nop
#ifdef NON_DEF
loop 32, L4_channel_loop
#else
loop 64, L4_channel_loop
#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:
movi TrapReg,1<<2
j Lchannel_continue
//---------------------------------------------------
L5_channel:
tsti r19, 0
beq L5_first_blk
tsti r19, 1
beq L5_second_blk
tsti r19, 2
beq L5_third_blk
tsti r19, 3
beq L5_fourth_blk
tsti r19, 4
beq L5_fifth_blk
L5_first_blk:
jsr r29, SUB_5_channel
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -