⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spf_dec.s

📁 关于DVD上的PCM的解码的代码,PCM的DSP压缩,解调的算法,用RISC32指令来写.
💻 S
📖 第 1 页 / 共 2 页
字号:
/************************************************************************/
; (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 + -