📄 pcm.s
字号:
rtn_decoder:
#ifdef REAL_TIME
rlwi r0,STC
dsw r0,END_DECODE_TIME
dlw r1,START_DECODE_TIME
dlw r2,MAX_DURATION
sub r0,r1
maxs r3,r0,r2
dsw r3,MAX_DURATION
dlw r1,DEBUG_BUF_PTR
nop
dswr r0,r1
addi r1,4
tsti r1,DEBUG_BUF_END
blt Lok
movi r1,DEBUG_BUF
Lok:
dsw r1,DEBUG_BUF_PTR
#endif
#ifdef EFFECT
jsr r31,SUB_copy_to_middle //this will advance wr_ptr
#if 0 //yyy
dlw r0,mid_buf_wr_ptr
nop
addi r0,3072
tsti r0,MIDDLE_BUF_END_WORD
blt 1f
subi r0,MIDDLE_BUF_SIZE_WORD
1: dsw r0,mid_buf_wr_ptr
#endif //yyy
Lno_decoding:
nop
dlw r0,mid_buf_wr_ptr
dlw r1,mid_buf_rd_ptr
dlw r3,ok_decode_flag
sub r2,r0,r1 //gap from rd_ptr to wr_ptr
tsti r2,0
bgt Lno_mid_wrap2
addi r2,MIDDLE_BUF_SIZE
Lno_mid_wrap2:
tsti r2,256*4*3 //samples needed for key shift
blte Lno_key_shift
tsti r3,2 //3
blt Lno_key_shift
movb r2,LBPCM_flag
tsti r2,1 // test bit 0
bne LCheckPCM // skip key shift if PCM not ready
#if DEBUGGER
mupi r2,0x1000
dlw r3,DEBUG_BUF_PTR
nop
or r0,r2
dswr r0,r3 //wr
addi r3,4
nop
or r1,r2
dswr r1,r3 //rd
addi r3,4
rlwi r1, PCM_Rd_Ptr
dswr r1,r3 //ptr
addi r3,4
nop
dswr r1,r3
addi r3,4
tsti r3,DEBUG_BUF_END
blt Lno_db_wrap2
movi r3,DEBUG_BUF
Lno_db_wrap2:
dsw r3,DEBUG_BUF_PTR
#endif //DEBUGGER
jsr r31,SUB_save_pcm_context //0x0-0x2000
jsr r31,SUB_restore_keyshift_context //0x400-0x1000
jsr r31,SUB_copy_from_middle //this will advance rd_ptr
dlw r1,COMMAND1
mupi r0,MEM_SEG
tsti r1,0
beq chk_new_command1_done
dsw r1,EFFECT_COMMAND
chk_new_command1_done:
dlw r1,Audio_Effect_Entry
la r31,rtn_Effect
or r31,r0
or r1,r0
#if 1 //yyyy
j r1
#endif
rtn_Effect:
jsr r31,SUB_save_keyshift_context //0x0-0x1000
jsr r31,SUB_restore_pcm_context //0x0-0x2000
movi DcacheBase,MEM_SEG //back to mpeg segment
Lno_key_shift:
movi r1,0 // clear flag, signal there will be
movb LBPCM_flag,r1 // a valid PCM block
//Lno_key_shift:
movi DcacheBase,MEM_SEG //back to mpeg segment
movi StartAddrHigh,MEM_SEG
j rtn_PCM
#else //EFFECT
// need to add error handler routine here
j rtn_PCM
#endif //EFFECT
LCheckPCM:
// Make sure PCM sub will not rely on any parameter passed from
// register
#ifndef EFFECT
movi r1,0 // clear flag, signal there will be
movb LBPCM_flag,r1 // a valid PCM block
#endif //EFFECT
movi r0,MEM_SEG
andi r0,0x3
shl r0,16
la r27,rtn_PCM
or r27,r0
movw r1,LWPCMentry
or r1,r0
j r1
rtn_PCM:
movi r0,0
movb LBPCMlow,r0 // PCM got data in buffer
Lend_user:
#ifdef REAL_TIME
movb r1,LBPCM_flag
tsti r1,1 // test bit 0
bne Lready // not ready yet
rlwi r0,STC
dlw r1,START_DECODE_TIME
nop
sub r0,r1
dsw r0,BLOCK_PERIOD
Lready:
#endif
j LoopStart
ExecCmd:
#define CMD_BUF_ADR 0xffc0
dlw r1,CMD_BUF_ADR
dlw r2,CMD_BUF_ADR+0x4
dlw r3,CMD_BUF_ADR+0x8
dlw r4,CMD_BUF_ADR+0xc
shl r1,8
shr r5,r2,24
or r1,r5
shl r2,8
shr r5,r3,24
or r2,r5
shl r3,8
shr r5,r4,24
or r3,r5
shl r4,8
or r4,r0
dsw r1,CMD_BUF_ADR
dsw r2,CMD_BUF_ADR+0x4
dsw r3,CMD_BUF_ADR+0x8
dsw r4,CMD_BUF_ADR+0xc
movh r1,LIstatus
tsti r0,CMD_STOP
bgt LCommand2
tsti r0,CMD_PLAY
beq LPlay
tsti r0,CMD_STOPF
beq LStopf
tsti r0,CMD_STOP
beq LStop
tsti r0,CMD_PCM
beq LPCM
j LClearCmd
LPCM:
#ifdef I2S
mupi r2, 0x0030 //GPIO 4 and 5 enable
ori r2, 0x2000 //48 kHz MicroClock. need to test I2S later
mupi r0, 0xffcf
ori r0, 0xcfff // mask
#endif
rlwi r3, GPIO_CTRL_REG
and r3, r0
or r3, r2
#if !LS388
rswi r3, GPIO_CTRL_REG
#endif // LS388
// mupi r0, 0x0008
// ori r0, 0x0040 //48k,16bit
// ori r0, 0x0058 //96k,24bit
// ori r0, 0x0048 //48k,24bit
// dsw r0, USER_OCFG //debug. should be set by host
#ifdef I2S
movi r0, 0x3cfb ; enable 6-channel PCM output
#else
#if LS388
#ifdef EXTERNAL_A_CLOCK
li r3,0x30000
rlwi r0,PCM_Out_Ctrl
and r0,r3
movi r3,0x7449 // reverse PCM clock, 24-bit clock, 6-channel
or r0,r3
#else // EXTERNAL_A_CLOCK
li r0,0x17449 // reverse PCM clock, 24-bit clock, 6-channel
#endif // EXTERNAL_A_CLOCK
#else // LS388
movi r0, 0x3c21 ; enable 6-channel PCM output
#endif // LS388
#endif
dsw r0, PCM_Config_Word
#ifndef R3K_PCM_OUT_CTRL
rswi r0,PCM_Out_Ctrl
#endif // R3K_PCM_OUT_CTRL
movi r0, PCM_MIN_IBUF_DEPTH //default
dsw r0, MIN_IBUF_VAR
#if THREEPAGE
mupi r0,MEM_SEG12 // init input buffer write pointer
#else // THREEPAGE
mupi r0,MEM_SEG // init input buffer write pointer
#endif // THREEPAGE
ori r2,r0,PCM_IBUF_START // set up input stream circular buffer
dsw r2,Stream_Start
movw LWibufRdPtr,r2
// dsw r2,Stream_Wr_Ptr // init input buffer write pointer
// dsw r2,Stream_Rd_Ptr
SvStrWrPtr r2
nop
SvStrRdPtr r2
#if LS388
rswi r2, Comm_Reg3 //for host
#if 1
movh LIold_rd_ptr,r2
#else
andi r0,r2,0xffff
movh r3,LIold_rd_ptr
tst r0,r3
bgte 1f
addi r0,PCM_IBUF_SIZE
1: sub r0,r3
movh LIold_rd_ptr,r2
movw r3,LWbytecount
add r3,r0
movw LWbytecount,r3
#endif
movi r0,0x800
movh LIMpegAttr,r0 // init for qt_snc
mupi r0,MEM_SEG
#endif // LS388
addi r2,PCM_IBUF_SIZE // set up buffer end address
dsw r2,Stream_End
addi r2,r0,PTS_FIFO_START
dsw r2,PTS_FIFO_Start
// dsw r2,PTS_FIFO_Rd_Ptr
// dsw r2,PTS_FIFO_Wr_Ptr
SvPTSRdPtr r2
SvPTSWrPtr r2
addi r2,r0,PTS_FIFO_END
dsw r2,PTS_FIFO_End
movi r0,1
movb LBPCM_flag,r0
movi r0,0
movb LBblknum,r0 //match convention of AC-3
// movb LBFIFO_flag,r0
movw LWbytecount,r0
movw LWoldPTS,r0
#ifdef EFFECT
movi r0,MIDDLE_BUF
dsw r0,mid_buf_rd_ptr
dsw r0,mid_buf_wr_ptr
movi r0,SUB_Audio_Effect
// movi r0, main_audio_task
dsw r0,Audio_Effect_Entry
#if DEBUGGER
movi r0,DEBUG_BUF
dsw r0,DEBUG_BUF_PTR
#endif // DEBUGGER
movi r0,0
dsw r0,0xf140
#endif //EFFECT
la r0,SUB_PCM_decoder // PCM decoder
movw LWentry,r0
la r0,SUB_pcm_pcm
movw LWPCMentry,r0 // default, ac3 as decoder
ori r1,SET_PROCESS_NEW // process, new
j LStoreStatus
LPlay:
dlw r2,COMMAND1
andi r0,r1,PAUSE
tsti r2,0
dlw r2,EFFECT_COMMAND
bne 1f // branch if no new effect command
dsw r2,COMMAND1 // restore effect command
1:
tsti r0,PAUSE
bne 1f
andi r1,RESET_RESUME
1:
ori r1,SET_RUN
#ifdef EFFECT
movi r0,0
dsw r0,ok_decode_flag //not allow to decode
dsw r0,MUTE_BLK_CNT
#endif //EFFECT
#if DEBUGGER
movi r0,0
dsw r0,START_DECODE_TIME
dsw r0,END_DECODE_TIME
dsw r0,MAX_DURATION
rswi r0,STC //clear STC
movi r0,0x2dd
rswi r0,STC_INTERVAL //STC interval in 90kHz clock
rlwi r0,AUDIO_CTRL
ori r0,1 //enable STC
#if !LS388
rswi r0,AUDIO_CTRL
#endif // LS388
movi r0,DEBUG_BUF
dsw r0,DEBUG_BUF_PTR
#endif //DEBUGGER
j LStoreStatus
LStopb:
movi r0,0
// movw LWoldPTS,r0
movw LWbytecount,r0
LStopf:
dsw r0, DiskAttrib // DTS CD Corin
// movi r0,1
// movb LBPCM_flag,r0
// movi r0,0x0
// movb LBFIFO_flag,r0
// dsw r0,FIFO_BLK_PTR
// rswi r0,PCM_Run_Halt
jsr r31,SUB_mute_PCM //TChou
jsr r31,SUB_clear_PCM
movh r1,LIstatus
andi r1,RESET_STOP // need to flush PCM buffer
j LStoreStatus
LStop:
// movi r0,0x0
// rswi r0,PCM_Run_Halt
jsr r31,SUB_mute_PCM
jsr r31,SUB_clear_PCM
movh r1,LIstatus
ori r1,SET_PAUSE
andi r1,RESET_STOP
LStoreStatus:
movh LIstatus,r1
LClearCmd:
// movi r0,0
movi r0, 0x0100
dsw r0,COMMAND0
j LoopStart
LCommand2:
tsti r0,CMD_STAT
beq LStat
tsti r0,CMD_STOPB
beq LStopb
tsti r0,CMD_UNMUTE
beq LUnmute
tsti r0,CMD_VER
beq LVer
tsti r0,CMD_GAIN
beq Lgain
tsti r0,CMD_CONFIG
beq LConfig
tsti r0,CMD_FRAMES
beq LFrames
#if LS388
tsti r0,CMD_CPYP_CLEAR
beq LCpyp_clear
tsti r0,CMD_CPYP_DEC_AUTH
beq LDec_Auth
tsti r0,CMD_CPYP_DRV_AUTH
beq LDrv_Auth
tsti r0,CMD_CPYP_KEY_SHARE
beq LKey_Share
tsti r0,CMD_CPYP_DISC_KEY
beq LDisc_Key
tsti r0,CMD_CPYP_TITLE_KEY
beq LTitle_Key
tsti r0,CMD_CPYP_DRIVER_TYPE
beq LDriver_Type
#endif // LS388
/*-------- commands for trick modes ----------*/
#if !LS388
rlwi r5, DSP_INT_CTRL
li r2, DSP_INT_DISABLE
and r2, r5
rswi r2, DSP_INT_CTRL
#endif // LS388
li r2, 0xfffffe03
movh r3, LIMpegAttr
tsti r0, CMD_SLOW_PLAY
beq LSlowPlay
tsti r0, CMD_FAST_PLAY
beq LFastPlay
tsti r0, CMD_FF_FB_PLAY
beq LFFFBPlay
tsti r0, CMD_STEP_PLAY
beq LStepPlay
tsti r0, CMD_NORMAL_PLAY
beq LNormalPlay
/*--------------------------------------------*/
LStat:
movh r0,LIfrmsize //yyyy
dsw r0,STATUS1
dsw r1,STATUS0
j LClearCmd
LUnmute:
andi r1,RESET_UNMUTE
j LStoreStatus
LVer:
movi r1,ROM_VER
dsw r1,STATUS0
j LClearCmd
Lgain:
dlw r1,PCM_SCALE
nop
movw LWpcmscale,r1
j LClearCmd
LConfig:
dlw r1,USER_OCFG
nop
movh LIocfg,r1
j LClearCmd
LFrames:
movw r1,LWFrameCount
dsw r1,STATUS0
j LClearCmd
/*-------- commands for trick modes ----------*/
LSlowPlay:
ori r3, 0x0010
j enable_STC
LFastPlay:
ori r3, 0x0010
j enable_STC
LFFFBPlay:
ori r3, 0x0020
j enable_STC
LStepPlay:
ori r3, 0x0080
j enable_STC
LNormalPlay:
movh r3,LIstatus
ori r3,SET_PROCESS_NEW // process, new
movh LIstatus,r3
#ifdef EFFECT
movi r0,MIDDLE_BUF
dsw r0,mid_buf_rd_ptr
dsw r0,mid_buf_wr_ptr
movi r0,SUB_Audio_Effect
// movi r0, main_audio_task
dsw r0,Audio_Effect_Entry
la r3,SUB_pcm_pcm
#else //EFFECT
la r3,SUB_out_fifo
#endif //EFFECT
movw LWPCMentry,r3
la r3,SUB_PCM_decoder
movw LWentry,r3
movi r3,1
movb LBPCM_flag,r3
movi r3,0
movw LWhungrySTC,r3
movb LBblknum,r3
movi r0,0
dsw r0,0xf140
enable_STC:
movh LIMpegAttr, r3
jsr r31, SUB_clear_PCM
jsr r31, SUB_clear_keyshift_context
#if LS388 //==================================
dlw r0, USER_OCFG
nop
andi r11, r0, OCFG_CHANNEL_MASK
shr r11, OCFG_CHANNEL_SHIFT ; N-1 for N channels
andi r2, r0, OCFG_SAMP_FREQ_MASK
shr r2, OCFG_SAMP_FREQ_SHIFT ; 0 for 48kHz; 1 for 96kHz
andi r3, r0, OCFG_WORD_LEN_MASK
shr r3, OCFG_WORD_LEN_SHIFT
addi r3, 4 ; nibles/sample (16-bit=4, 20-bit=5, 24-bit=6)
add r11,r2
addi r11,7 ; 7=8-1 (256 samples/block, 2 nibles/byte)
shlv r0,r3,r11
movh LIfrmsize,r0
#else // LS388
dlw r10,USER_ICFG
nop
andi r0,r10,ICFG_SPDIF_MASK
shr r0,ICFG_SPDIF_SHIFT
tsti r0,SPDIF_ENABLED
// beq LSpdif //tchou
la r11,CLOCK_TABLE
andi r0,r10,ICFG_CLOCK_MASK
shl r0, 3 ; each entry takes 8 bytes
add r11,r0
dlwr r2,r11 ; get clock value and enable bits
addi r11,4
dlwr r0,r11 ; get mask
#endif // LS388
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -