📄 musicout.s
字号:
; Module: musicout - MPEG-I audio decoding main routine
;
; Initial version: R. Huang 2/19/97
; Jinshi Huang 12/1/98 for LS388/LS500
; Call : r26 ; set up return address for called subroutine,
; decode_info,
; I_bitalloc_scale, I_CRC_calc, I_buf_sample, I_requantize,
; II_bitalloc_scale, II_CRC_calc, II_buf_sample, II_requantize,
; recover_CRC_error, out_fifo
; Permanent:
; Temp reg:
; AGR reg:
; Local buffer:
.nolist
; global include file
#include "regdef.h"
#include "common.h"
#include "memory.h"
#include "mpg_mac.h"
#include "user.h"
#ifdef EFFECT
#include "stereo_user.h"
#endif //EFFECT
; local include file
; test reference file, to be removed
#define FRAMECOUNT 1
.list
.text
.extern framecount_DB
.extern SUB_seek_sync_mpg
.extern SUB_decode_info
.extern SUB_I_bitalloc_scale
.extern SUB_I_CRC_calc
.extern SUB_I_buffer_sample
.extern SUB_I_dequantize_sample
.extern SUB_II_bitalloc_scale
.extern SUB_II_CRC_calc
.extern SUB_II_buffer_sample
.extern SUB_II_dequantize_sample
.extern SUB_recover_CRC_error
#if SR48
.extern SUB_out_fifo_SR48
#endif
.extern SUB_out_fifo
.extern SUB_pack_pcm
#if QSOUND
.extern filterCoeffs
.extern m48both
.extern m44both
#endif // QSOUND
.extern SAMPLING_FREQ_TEMP
.globl Lframe_loop
.set noreorder
#ifdef EXECTIVE
.globl SUB_MPEG_decoder
SUB_MPEG_decoder:
#if SR48
movi r10,0
dsw r10,PCM_store_ptr
dsw r10,PCM_blk_cnt
#ifdef I2S
movi r10,local_scaled_pcm_byte
#else
movi r10,local_pcm_sample_byte
#endif
dsw r10,PCM_load_ptr
#endif // SR48
movh r10,LIstatus
andi r2,r10,SET_PROCESS_NEW
tsti r2,SET_PROCESS_NEW
bne Lframe_loop
andi r10,RESET_PROCESS_OLD
movh LIstatus,r10
#else
.globl _start
_start:
#endif
movi BlockSkip,0
movi ByteSize, 31*4 ;get 32 words
// clear F2Abuf0 and F2Abuf1. Done at the begining
movi AGRAdr0, local_buf0_byte
movi AGRAdr1, local_buf1_byte
movi r1, 0
loop 16, Lclear_a
loop 32, Lclear_a
mov a0(1*4), r1
mov a1(1*4), r1
Lclear_a:
movi r5, F2Abuf0 ;buf0
movi r1, local_buf1_byte
CLR_TrapReg
loop 16, clr_buf0 ; total of 512 words
mov ByteLocal, r1
dmabwr r5
WaitDma
addi r5, 32*4
clr_buf0:
SET_TrapReg
movi r5, F2Abuf1 ;buf1
movi r1, local_buf1_byte
CLR_TrapReg
loop 16, clr_buf1 ; total of 512 words
mov ByteLocal, r1
dmabwr r5
WaitDma
addi r5, 32*4
clr_buf1:
SET_TrapReg
;-----------read cos_tbl. This should be done at the initialization
movi BlockSize, 31 ;get 32 words
movi DMASize, 31
la r1, (FAcos_tbl) ;external memory addr in bytes
shr r1, 2 ;make a word addr
movi r3, local_cos1_64_word
mov LocalAddr, r3
dmarr r1 ;initiate DMA transfer
wait_dma_4:
mov r2,StatusPort
tsti r2,DmaDoneBit
bz wait_dma_4 ;wait for dma done
;----------read window coefs. This should be done at the initialization
la r1, (FAnew_win) ;external memory addr in bytes
shr r1, 2 ;make a word addr
movi r3, LFAnew_win_word
CLR_TrapReg
loop 16, read_window ; total of 512 words
mov LocalAddr, r3
dmarr r1 ;initiate DMA transfer
wait_dma_4a:
mov r2,StatusPort
tsti r2,DmaDoneBit
bz wait_dma_4a ;wait for dma done
addi r1, 32
addi r3, 32
read_window:
SET_TrapReg
//----------read FAmultiple. This should be done at the initialization
movi BlockSkip,0
movi BlockSize, 31 ;get 32 words
movi DMASize, 31
la r1, (FAmultiple) ;external memory addr in bytes
shr r1, 2 ;make a word addr
movi r3, local_multiple_word
CLR_TrapReg
loop 2, read_multiple //total of 64 words
mov LocalAddr, r3
dmarr r1
wait_dma_3:
mov r2,StatusPort
tsti r2,DmaDoneBit
bz wait_dma_3 ;wait for dma done
addi r1, 32
addi r3, 32
read_multiple:
SET_TrapReg
//---------read FAc_tbl & FAd_tbl. This should be done when layer_II is decided
movi BlockSize, 16 ;get 17 words
movi DMASize, 16
la r1, (FAc_tbl) ;external memory addr in bytes
shr r1, 2 ;make a word addr
movi r3, local_c_tbl_word
mov LocalAddr, r3
dmarr r1 ;initiate DMA transfer
wait_dma_4h:
mov r2,StatusPort
tsti r2,DmaDoneBit
bz wait_dma_4h ;wait for dma done
la r1, (FAd_tbl) ;external memory addr in bytes
shr r1, 2 ;make a word addr
movi r3, local_d_tbl_word
mov LocalAddr, r3
dmarr r1 ;initiate DMA transfer
wait_dma_4i:
mov r2,StatusPort
tsti r2,DmaDoneBit
bz wait_dma_4i ;wait for dma done
//--------------------------------------------------------------------
// Local buffer base: 0x0; Local buffer size: 32 words
// movi r1,0x6400 ; IBUF_SIZE 0x4000
movi r1,0x6000 ; IBUF_SIZE 0x4000
mov Gb_Control,r1
mupi r1,MEM_SEG
ori r1,IBUF_START // set up input stream circular buffer
#ifdef STREAM_SIM
rswi r1,Stream_Start // start address
movi r1,IBUF_SIZE // set up buffer size
rswi r1,Stream_Size
movi r1,0x1 // enable
rswi r1,Stream_Enable
#else
dsw r1,Stream_Start
addi r1,IBUF_SIZE
dsw r1,Stream_End
#endif
//---------------------------------------------------------------------
#if QSOUND
;;; Default filter coefficient is 48kHz.
mupi r4,MEM_SEG
ori r4,m48both
;;; update QExpander filter coefficient
mupi r3,MEM_SEG
ori r3,filterCoeffs
#if !THREE_STAGE
loop 9,config48kHzdone
#else // !THREE_STAGE
loop 7,config48kHzdone
#endif // !THREE_STAGE
dlwr r0,r4
addi r4,4
dswr r0,r3
addi r3,4
config48kHzdone:
#endif // QSOUND
//---------------------------------------------------------------------
/* Loop until end of strem pattern found in stream buffer,
host will fill end of strem pattern into buffer once end of stream reached */
movi r25,0
mov Gb_Shadow_Ptr,r25 // reset stream before enable it
movw r1,LWibufRdPtr
shl r1,3
mupi r25,0x8000 // bit 31=1, enable bit stream
or r25,r1 // it is a bit pointer
mov Gb_Shadow_Ptr, r25 // load stream bit pointer
nop
nop
gbi r10, 0x0 // Init bit stream, works without it in sim
Lframe_loop:
#ifdef EFFECT
dlw r1,Stream_Rd_Ptr
movh r0,LIold_rd_ptr
mupi r2,MEM_SEG
or r0,r2
sub r2,r1,r0
tst r1,r0
beq Lcheck_PTS_done
bgt Lcall_check_PTS
addi r2,IBUF_SIZE
Lcall_check_PTS:
movw r3,LWbytecount
add r2,r3
movh LIold_rd_ptr,r1
movw LWbytecount,r2
jsr r28,SUB_check_PTS
Lcheck_PTS_done:
//xxxxxxxxxxxxxx
#ifdef DUMP_PAGE12
dlw r5,Debug_Dump_Ptr
// dlw r0,Stream_Wr_Ptr
movh r0,LIfrmsize
dlw r1,Stream_Rd_Ptr
movw r2,LWbytecount
movi DcacheBase,0x12
nop
nop
li r3,0xffffff01
dswr r2,r5 // LWbytecount
addi r5,4
dswr r3,r5 // signature
addi r5,4
dswr r1,r5 // Stream_Rd_Ptr
addi r5,4
dswr r0,r5 // Stream_Wr_Ptr
addi r5,4
li r1,0x130000
tst r5,r1
bne frame_loop_dump
li r5,0x120000
frame_loop_dump:
li r0,0xdeadbeef
dswr r0,r5
addi r5,4
dswr r0,r5
addi r5,4
dswr r0,r5
addi r5,4
dswr r0,r5
subi r5,0xc
movi DcacheBase,MEM_SEG
nop
nop
dsw r5,Debug_Dump_Ptr
#endif // DUMP_PAGE12
//xxxxxxxxxxxxxx end
#endif // EFFECT
;
; Set up input bit stream pointer
;
//--------------------------------------
;
; Initialize AGRSiz(s)
;
movi AGRSiz4,0xffff
movi AGRSiz5,0xffff
movi AGRSiz6,0xffff
movi r11, FRAME_SIZE_LIMIT
#if 0
dlw r1,0xff20
mov r0,Gb_Getbits_Ptr
movi DcacheBase,0x12
shr r0,3
andi r0,0xffff
dshr r0,r1
addi r1,2
tsti r1,0xffff
blt chk_dump_ptr_done0
movi r1,0
chk_dump_ptr_done0:
movi DcacheBase,MEM_SEG
nop
dsw r1,0xff20
#endif // debug
jsr r26,SUB_seek_sync_mpg
#if 0
dlw r1,0xff20
mov r0,Gb_Getbits_Ptr
movi DcacheBase,0x12
shr r0,3
andi r0,0xffff
dshr r0,r1
addi r1,2
tsti r1,0xffff
blt chk_dump_ptr_done1
movi r1,0
chk_dump_ptr_done1:
movi r0,0
dsw r0,r1
nop
movi DcacheBase,MEM_SEG
nop
dsw r1,0xff20
#endif // debug
rtn_seek_sync:
tsti r10,F_SYNC_ERROR
beq error_handler
//--------------------j.h.: added to update Rd_Ptr and bytecount
mov r12,Gb_Getbits_Ptr
subi r12,0x10 //align to sync word and 4 bits
shl r12,8 // to clear MS byte
shr r12,3+8 // r12 = byte addr of the last byte of current frame
andi r12,0xffff
tsti r12,IBUF_END_plus1
blt 1f
subi r12,IBUF_END_plus1 // wrapped
addi r12,IBUF_START
1:
mupi r13,MEM_SEG // restore segment
or r12,r13
dlw r0,Stream_Rd_Ptr
nop
dsw r12,Stream_Rd_Ptr // update read pointer for host
dsw r12,Sync_Rd_Ptr // save for later use
movw LWibufRdPtr,r12
sub r13,r12,r0
tst r12,r0
bgte 1f
addi r13,IBUF_SIZE
1:
movw r0,LWbytecount
add r0,r13
//-------------------------------------
#ifdef LS388 //debug
dlw r0,Stream_Rd_Ptr
nop
// rswi r0, 0xd08>>2 //for host
#if !LS1888_TEST
rswi r0, Comm_Reg3 //for host
#endif // LS1888_TEST
#endif //LS388
jsr r26,SUB_decode_info
tsti r10,0
bne error_handler
movb r10,LBhdr_lay
// tsti r10,0x1 // exclude layer-I
// beq error_handler
tsti r10,0x2 // layer-II only
bne error_handler
rtn_decode_info:
//-------- detect and skip bad frame -------
dlw r2,VAL_PLL_CTRL_48K
rlwi r1,Chip_Id
tsti r2,0
bne load_PLL_CTRL_done // branch if value provided by RISC
li r2,PLL_CTRL_48K_500
tsti r1,LS500_ID
beq load_PLL_CTRL_done
#if !LS1888_TEST
li r2,PLL_CTRL_48K_508
#else // LS1888_TEST
li r2,PLL_CTRL_48K_1888
#endif // LS1888_TEST
load_PLL_CTRL_done:
#if !LS1888_TEST
rlwi r0,PLL_Ctrl_Reg2
#else // LS1888_TEST
rlwi r0,PLL_Ctrl_Reg1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -