📄 mpg.s
字号:
; Module: user
;
; Initial version: K. WEN 9/24/96
; Jinshi Huang 12/1/98 for LS388/LS500
; Call : r26 ; set up return address for called subroutine
; ac3_pcm ac3_dec
; Permanent:
; Temp reg:
; AGR reg:
; Local buffer:
.nolist
; global include file
#include "regdef.h"
#include "memory.h"
#include "constant.h"
#include "common.h"
; local include file
#include "user.h"
#include "sync.h"
#ifdef EFFECT
#include "stereo_user.h"
#endif //EFFECT
.list
.text
.extern APP_Init
.extern APP_Main
.extern APP_Exit
.extern SUB_isr
.extern SWAP_PTR
.extern LBDriver
.extern SUB_MPEG_decoder
#ifdef EFFECT
.extern mid_buf_rd_ptr
.extern mid_buf_wr_ptr
.extern ok_decode_flag
.extern Audio_Effect_Entry
.extern SUB_Audio_Effect
.extern SUB_pcm_pcm
.extern EFFECT_COMMAND
.extern mic_data_ptr
#else //EFFECT
.extern SUB_out_fifo
#endif //EFFECT
.extern Lframe_loop
.extern EOD_flag
.extern SAMPLING_FREQ_TEMP
#ifdef CERTIFY
.extern idle_flag
#endif
#if SR48
.extern PCM_store_ptr
.extern PCM_load_ptr
.extern PCM_blk_cnt
.extern PCM_bcnt
.extern PCM_scnt
.extern PCM_gcnt
#endif
.globl ProgStart
.globl LoopStart
.globl _start
.globl LBreakPointEntry
.globl rtn_Microphone
.set noreorder
#ifdef DEBUGGER
.extern SUB_DSP_DEBUGGER
.extern dbg_last_inst
#define DEBUG_BUF 0xf200
#define DEBUG_BUF_END 0xf600
#define DEBUG_BUF_PTR 0xf130
#endif // DEBUGGER
_start:
movi DcacheBase,MEM_SEG
movi StartAddrHigh,MEM_SEG
CLR_TrapReg_1
j ProgStart
.align 4
#ifdef DEBUGGER
j SUB_DSP_DEBUGGER // break point
la r0,dbg_last_inst // RETURN_OFFSET (addr: 0x1f1814)
#else // DEBUGGER
ret
#endif // DEBUGGER
.align 4
#ifdef DEBUGGER
j SUB_DSP_DEBUGGER // debug
#else // DEBUGGER
ret
#endif // DEBUGGER // debug
.align 4
#ifdef DEBUGGER
j SUB_DSP_DEBUGGER // debug
#else // DEBUGGER
#ifdef QT_SYNC
#if LS388
ret
#else // LS388
j SUB_isr // interrupt
#endif // LS388
#else // QT_SYNC
nop
#endif
#endif // DEBUGGER
.align 4
ProgStart:
//
// init section
//
li r0,0xffffffff
dsw r0,COMMAND0 // clear command
//--------------------------------------------------------------------------------------
// ShenZhen application
//--------------------------------------------------------------------------------------
jsr r31, APP_Init
nop
//---------------------------------------------------------------------------------------
movw r20,LWtitlekey0
dsw r20,Drv_RD
rswi r20,0x3c>>2
movb r20,LBtitlekey4
dsw r20,Drv_RD+4
rswi r20,0x38>>2
movi r0,MIN_IBUF_DEPTH
movh LIfrmsize,r0 // use default as depth to start with
mupi r0,MEM_SEG // init input buffer write pointer
addi r1,r0,IBUF_START
movw LWibufRdPtr,r1
dsw r1,Stream_Wr_Ptr
dsw r1,Stream_Rd_Ptr
#ifdef EFFECT
// dsw r1,OLD_Stream_Rd_Ptr
movh LIold_rd_ptr,r1
#endif
dsw r1,Stream_Start
addi r1,IBUF_SIZE
dsw r1,Stream_End
#ifdef QT_SYNC
addi r1,r0,PTS_FIFO_START
dsw r1,PTS_FIFO_Start
dsw r1,PTS_FIFO_Rd_Ptr
dsw r1,PTS_FIFO_Wr_Ptr
addi r1,r0,PTS_FIFO_END
dsw r1,PTS_FIFO_End
#endif
mupi r1,DataSeg
rswi r1,PCM_FIFO_StartReg
ori r1,PCM_OUT_END
rswi r1,PCM_FIFO_EndReg
jsr r31,SUB_clear_PCM //clear PCM before enable PCM out
#ifdef CMD_BUF
movi r0,0
dsw r0,CMD_BUF_ADR
dsw r0,CMD_BUF_ADR+0x4
dsw r0,CMD_BUF_ADR+0x8
dsw r0,CMD_BUF_ADR+0xc
#ifdef DB_FLAG
dsw r0,DB_FLAG_ADR+0x0
dsw r0,DB_FLAG_ADR+0x4
dsw r0,DB_FLAG_ADR+0x8
dsw r0,DB_FLAG_ADR+0xc
dsw r0,DB_FLAG_ADR+0x10
dsw r0,DB_FLAG_ADR+0x14
dsw r0,DB_FLAG_ADR+0x18
dsw r0,DB_FLAG_ADR+0x1c
#endif
#endif
// clear local buffer. This should be done at initialization
movi AGRMod0, 0
movi AGRSiz0, 0xffff ;linear addressing
movi AGRAdr0, 0x80
movi r0, 0
dsw r0,LBDriver // Default as loader DVD
loop 63, clr_outer_loop ; total of 2048 words
loop 32, clr_inner_loop
mov a0(1*4), r0
clr_inner_loop:
clr_outer_loop:
movi r0,0xffff
dsw r0,SAMPLING_FREQ_TEMP
li r0,0x7fffff
movw LWpcmscale,r0 // default to unity gain
movi r0,MIN_IBUF_DEPTH
movh LIfrmsize,r0
movi r0,1
movb LBPCM_flag,r0 // set PCM_flag done
movb LBPCMlow,r0 // set PCM buffer empty
movi r0,0
#ifdef QT_SYNC
movh LIMpegAttr,r0 // init for QT_SYNC
movw LWbytecount,r0 // init byte count
#endif
#ifdef CERTIFY
movi r0,0
dsw r0, idle_flag
#endif
ori r0,SET_PROCESS_NEW // set process, new
movh LIstatus,r0 // init status
jsr r31,SUB_clear_keyshift_context
//
// enable interrupt
//
#ifdef QT_SYNC
movi TrapReg,TRAPREG_VAL // enable int
nop
nop
#endif
LoopStart:
;************************************************
; Add for ufon hardware existence check *
;************************************************
dlw r0,USER_ICFG
nop
andi r0,ICFG_MIC_EXIST_MASK ;bit15 stands for ufone hardware
tsti r0,ICFG_MIC_EXIST_MASK
bz skip_ufon_resetting ;skip if non-existence
rlwi r1,PCM_Run_Halt
tsti r1,0x131 ; Yes it is set already
beq skip_ufon_resetting
;********** set up the read pointer in the micro FIFO ***********
mupi r0,0x1011
ori r0,MIC_BUF_START_B
rswi r0,PCM_In_Fifo_Start_Addr
rswi r0,PCM_In_Current_Addr
ori r0,MIC_BUF_END_B
rswi r0,PCM_In_Fifo_End_Addr
movi r0,mic_start_addr
dsh r0,mic_data_ptr
ori r1,0x0600
rswi r1,PCM_Run_Halt
subi r1,0x0500
// ori r1,0x0100
nop
rswi r1,PCM_Run_Halt ;ufon is turned on
movi r0,SUB_Audio_Effect
dsw r0,Audio_Effect_Entry
skip_ufon_resetting:
//
// get command from memory
//
//=====================================================================
// check application command --white
//---------------------------------------------------------------------
nop
//-------------------------------------------------------------------------------
// *********** ShenZhen application ****************************************
//-------------------------------------------------------------------------------
j APP_Main
nop
APP_Exit:
nop
//------------------------------------------------------------------------------
dlw r0,COMMAND0 // get command from host(DRAM)
nop
andi r0,0xff
tsti r0,CMD_NOP // check if it's a NOP
beq LcheckStatus
tsti r0,0xff
bne ExecCmd // exec and clear command
movi r0,0x100
dsw r0,COMMAND0 // clear command
LcheckStatus:
movh r1,LIstatus // read in current status
andi r0,r1,RUN_STOP_MASK // check if process stopped
tsti r0,STATUS_STOP
/* checking QSOUND command to avoid R3K lock up */
bne Lno_chk_qsnd_cmd
dlw r0,COMMAND1
nop
tsti r0,CMD1_QSOUND
beq Lupdate_qsnd_cmd
tsti r0,CMD1_QSOUND_A
beq Lupdate_qsnd_cmd
tsti r0,CMD1_QSOUND_OFF
bne Lchk_qsnd_done
Lupdate_qsnd_cmd:
movi DcacheBase, DataSeg
nop
dsw r0,QSOUND_CMD_BUF
nop
movi DcacheBase, MEM_SEG
nop
Lchk_qsnd_done:
#if 1
//***********************************************************************
// Enabled Microphone when Mpeg is not running
//***********************************************************************
//---------------------PCM-in registers setting------------------
dlw r0,USER_ICFG
nop
andi r0,ICFG_LS128_MASK
tsti r0,ICFG_LS128_MASK
bne not_ls128_adc
movi r0,0x61
j adc_chip_set_done
not_ls128_adc:
movi r0,0x16d ;0x56d
adc_chip_set_done:
rswi r0,PCM_In_Control_Reg
//--------------------------------------------------------------
dlw r0,USER_ICFG
nop
andi r0,ICFG_MIC_EXIST_MASK ;bit15 stands for ufone hardware
tsti r0,ICFG_MIC_EXIST_MASK
bz No_ufone_at_all ;skip if non-existence
rlwi r1,PCM_In_Current_Addr
andi r1,0xffff
movi r0,MIC_BUF_START_B ; range check in case nonexistence of hw
tst r1,r0
blt No_ufone_at_all
movi r0,MIC_BUF_END_B
tst r1,r0
bgt No_ufone_at_all
dlh r0, mic_data_ptr ; read the current address of pointer
nop
tst r1,r0
bgte Yes_256_samples
addi r1,MIC_BUF_SIZE_B
Yes_256_samples:
sub r1,r0
tsti r1,0x400
blt No_ufone_at_all ;wait_till_next ; avoid dram bandwidth consume ;
Clear_Audio_samples_for_ufone_omly:
movi r0,0
movi AGRAdr2, 0
movi AGRSiz2,0xffff
jsr r31,SUB_save_mpeg_context //0x0-0x1000
jsr r31,SUB_restore_keyshift_context //0x400-0x1000
loop 128, Clear_Audio_stream
mov a2(1*4), r0
mov a2(1*4), r0
Clear_Audio_stream:
dlw r1,COMMAND1
mupi r0,MEM_SEG
tsti r1,0
beq Effct_in
dsw r1,EFFECT_COMMAND
Effct_in:
dlw r1,Audio_Effect_Entry
la r31,rtn_Microphone
or r31,r0
or r1,r0
j r1
rtn_Microphone:
jsr r31,SUB_save_keyshift_context //0x0-0x1000
jsr r31,SUB_restore_mpeg_context //0x0-0x1000
movi DcacheBase,MEM_SEG //back to mpeg segment
movi StartAddrHigh,MEM_SEG
j LCheckPCM
//***************** Ufone
#endif
No_ufone_at_all:
j LoopStart
Lno_chk_qsnd_cmd:
#ifndef EFFECT
LCheckPCM_flag:
movb r1,LBPCM_flag
tsti r1,1 // test bit 0
bne LCheckPCM // skip decoder, wait until set
#endif //EFFECT
Lcheck_ibuf_depth:
dlw r1,Stream_Wr_Ptr
dlw r0,Stream_Rd_Ptr
nop
tst r1,r0
bgte Lcheck_space
addi r1,IBUF_SIZE // always assume wr ahead of rd
Lcheck_space:
sub r1,r0
movh r0,LIMpegAttr
andi r0,0x00b0 //STEP or FF/FB or fast/slow play mode
tsti r0,0
bne Lcheck_2frmsize
movh r0,LIfrmsize
addi r0,0x8 // leave some margin
tst r1,r0 // guarantee at least one freame in normal mode
bgte Lcheck_status
j Lcheck_space_done
Lcheck_2frmsize:
movh r0,LIfrmsize
shl r0,1 // guarantee at least two frame in trick modes
tst r1,r0
bgte Lcheck_status
Lcheck_space_done:
dlw r0,EOD_flag
nop
tsti r0,1
beq hungry_clear_PCM
rlwi r0,STC
movw r2,LWhungrySTC
tsti r2,0
bne 1f
movw LWhungrySTC,r0
j clear_PCM_already
1:
movb r1,LBhdr_sampling_frequency
tsti r1,1 // 0: 44.1kHz, 1: 48kHz
beq hungry_clear_PCM // do not repeat PCM if it's DVD
sub r1,r0,r2
// tsti r1,0x22d6 // check if I/O out of sync - repeat up to 4 frames
tsti r1,0x45ac // check if I/O out of sync - repeat up to 8 frames
blte LoopStart
hungry_clear_PCM:
movi r0,0
dsw r0,EOD_flag
movw LWhungrySTC,r0
dlw r0,clr_buffer_flag
movi r1,1
tsti r0,0
bne clear_PCM_already
dsw r1,clr_buffer_flag
jsr r31,SUB_clear_PCM
clear_PCM_already:
j LoopStart
Lcheck_status:
#ifdef DB_FLAG
movi r0,0x1
dsw r0,0xe028
#endif // debug
// do byteswap if needed
jsr r31, SUB_swap_byte
movi r0,0
movw LWhungrySTC,r0
movh r0,LIstatus
andi r0,ERROR_MASK
tsti r0,0
beq Ldo_decode
#ifdef CERTIFY
//4-27-98 tsti r0,F_SYNC_ERROR
//4-27-98 beq 1f
andi r0,RESET_ERROR //4-27-98
movh LIstatus,r0 //4-27-98
movw r1,LWibufRdPtr // move ahead 4 byte before seek
andi r1,0xffff
addi r1,4 // otherwise data rate error will
tsti r1,IBUF_END_plus1
blt 5f
subi r1,IBUF_END_plus1
addi r1,IBUF_START
5:
mupi r0,MEM_SEG
or r1,r0
movw LWibufRdPtr,r1 // stick
movw r1,LWbytecount
addi r1,4
movw LWbytecount,r1
1:
jsr r31,SUB_clear_PCM
#if 0
mupi r0,MEM_SEG
la r1,Lframe_loop // do seek_SYNC
or r1,r0
j r1
#endif // 0
#else // CERTIFY
jsr r31,SUB_seek_SYNC // won't return to do_decode
#endif // CERTIFY
Ldo_decode:
/*
movb r0,LBblknum
tsti r0,0
bne Lnormal_decode //start consuming data at end of frame
*/
movh r0,LIMpegAttr
andi r0,0x00b0 //STEP or FF/FB or fast/slow play mode
tsti r0,0
beq Lnormal_decode
#if 1
dlw r0,clr_buffer_flag
movi r1,1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -