📄 mpg.s
字号:
tsti r0,0
bne clear_PCM_once
dsw r1,clr_buffer_flag
jsr r31,SUB_clear_PCM
clear_PCM_once:
// jsr r27,SUB_clr_all_downmix
jsr r31,SUB_consume_data //update bytecount w/o decoding
// j rtn_decoder
j LoopStart
#endif // 1
Lnormal_decode:
movi r0,0
dsw r0,clr_buffer_flag
#ifdef EFFECT
dlw r0,mid_buf_rd_ptr
dlw r1,mid_buf_wr_ptr
nop
sub r2,r0,r1 //gap from wr_ptr to rd_ptr
tsti r2,0
bgt Lno_mid_wrap
addi r2,MIDDLE_BUF_SIZE
Lno_mid_wrap:
dsw r2,0xf100 //debug
tsti r2,3*SBLIMIT*4 //samples produced in each block
blte Lno_decoding
dlw r3,ok_decode_flag
nop
tsti r3,3
bgte Lno_inc
addi r3,1
dsw r3,ok_decode_flag
Lno_inc:
#endif //EFFECT
//debug
#ifdef DEBUGGER
dlw r2,0xf140
nop
addi r2,1
dsw r2,0xf140
dlw r3,DEBUG_BUF_PTR
nop
dswr r1,r3 //wr
addi r3,4
nop
dswr r0,r3 //rd
addi r3,4
rlwi r1, PCM_Rd_Ptr
// movw r1,LWentry
dswr r1,r3 //pcm_ptr
addi r3,4
// dlw r1,Stream_Rd_Ptr
movb r1,LBblknum
nop
dswr r1,r3 //stream_rd_ptr
addi r3,4
tsti r3,DEBUG_BUF_END
blt Lno_db_wrap
movi r3,DEBUG_BUF
Lno_db_wrap:
dsw r3,DEBUG_BUF_PTR
#endif // DEBUGGER
// call decoder
mupi r0,MEM_SEG
la r31,rtn_decoder
or r31,r0
movw r1,LWentry // set up subroutine entry
or r1,r0
j r1
rtn_decoder:
#ifdef EFFECT
jsr r31,SUB_copy_to_middle //this will advance wr_ptr
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 //samples needed for key shift
blte Lno_key_shift
tsti r3,3
blt Lno_key_shift
movb r2,LBPCM_flag
tsti r2,1 // test bit 0
bne LCheckPCM // skip key shift if PCM not ready
//debug
#ifdef 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_mpeg_context //0x0-0x1000
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
j r1
rtn_Effect:
// jsr r31,SUB_Audio_Effect
jsr r31,SUB_save_keyshift_context //0x0-0x1000
jsr r31,SUB_restore_mpeg_context //0x0-0x1000
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
mupi r0,MEM_SEG
la r31,rtn_PCM
or r31,r0
// movw r1,LWPCMentry
// or r1,r0
// j r1
jsr r31,SUB_pcm_pcm
rtn_PCM:
movi r0,0
movb LBPCMlow,r0 // PCM got data in buffer
movh r0,LIstatus
andi r1,r0,ERROR_MASK
tsti r1,0
bne Lclear_status
ori r0,FIRST_PCM_OUT
movh LIstatus,r0
j LoopStart
Lclear_status:
andi r0, RESET_ERROR
movh LIstatus,r0
movi r1,0
movi AGRSiz0,0xffff
movi AGRMod0,0
#ifdef I2S
movi AGRAdr0,local_scaled_pcm_byte
#else
movi AGRAdr0,local_pcm_sample_byte
#endif
CLR_TrapReg
#ifdef I2S
loop 6, clr_outer_1
#else
loop 3, clr_outer_1
#endif
loop 32, clr_inner_1 // 3*32*2 words
mov a0(1*4),r1
clr_inner_1:
clr_outer_1:
SET_TrapReg
j LoopStart
Lend_user:
#ifdef STREAM_SIM
halt pass
#else
j LoopStart
#endif
ExecCmd:
#ifdef CMD_BUF
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
#endif
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_MPEG1
beq LMPEG
tsti r0,CMD_MPEG2
beq LMPEG
tsti r0,CMD_AC3
beq LMPEG
j LClearCmd
LMPEG:
jsr r31,SUB_clear_PCM
#if SR48
dsw r0,PCM_store_ptr
dsw r0,PCM_blk_cnt
#ifdef I2S
movi r0,local_scaled_pcm_byte
#else // I2S
movi r0,local_pcm_sample_byte
#endif // I2S
dsw r0,PCM_load_ptr
dsw r0,EOD_flag
movi r0,5
dsw r0,PCM_bcnt
movi r0,8
dsw r0,PCM_scnt
movi r0,3
dsw r0,PCM_gcnt
#endif // SR48
mupi r0,MEM_SEG // init input buffer write pointer
#ifdef QT_SYNC
addi r2,r0,PTS_FIFO_START
dsw r2,PTS_FIFO_Start
dsw r2,PTS_FIFO_Rd_Ptr
dsw r2,PTS_FIFO_Wr_Ptr
addi r2,r0,PTS_FIFO_END
dsw r2,PTS_FIFO_End
#endif // QT_SYNC
addi r2,r0,IBUF_END
dsw r2,Stream_End
addi r0,IBUF_START
dsw r0,Stream_Start
movw LWibufRdPtr,r0
dsw r0,Stream_Wr_Ptr
dsw r0,Stream_Rd_Ptr
// dsw r0,OLD_Stream_Rd_Ptr
movh LIold_rd_ptr,r0
movi r0,IBUF_START
dsw r0,SWAP_PTR
#ifdef EFFECT
movi r0,MIDDLE_BUF
dsw r0,mid_buf_rd_ptr
dsw r0,mid_buf_wr_ptr
movi r0,SUB_Audio_Effect
dsw r0,Audio_Effect_Entry
#ifdef DEBUGGER
movi r0,DEBUG_BUF
dsw r0,DEBUG_BUF_PTR
#endif // DEBUGGER
movi r0,0
dsw r0,0xf140
movw LWFrameCount,r0
#endif //EFFECT
#ifdef QT_SYNC
movi r0,0
movh LIMpegAttr,r0 // init for QT_SYNC
movw LWbytecount,r0
movw LWhungrySTC,r0
#endif // QT_SYNC
// jsr r31,SUB_clear_PCM
mupi r0,DataSeg
rswi r0,PCM_FIFO_StartReg
ori r0,PCM_OUT_END
rswi r0,PCM_FIFO_EndReg
#ifndef LS388
#ifndef R3K_PCM_OUT_CTRL
rswi r0,PCM_Out_Ctrl
rlwi r0,Audio_CtrlReg
ori r0,0x22
rswi r0,Audio_CtrlReg
#endif // R3K_PCM_OUT_CTRL
#endif //LS388
la r0,SUB_MPEG_decoder
movw LWentry,r0
#ifdef EFFECT
la r0,SUB_pcm_pcm
#else //EFFECT
la r0,SUB_out_fifo
#endif //EFFECT
movw LWPCMentry,r0 // default, ac3 as decoder
movi r0,1
movb LBPCM_flag,r0
ori r1,SET_PROCESS_NEW // process, new
//xxxxxxxxxxxxxx
#ifdef DUMP_PAGE12
dlw r6,Stream_Rd_Ptr
dlw r7,Stream_Wr_Ptr
dlw r5,Debug_Dump_Ptr
li r0,0x33333333
movi DcacheBase,0x12
nop
movw r3,LWbytecount
dswr r3,r5 // LWbytecount
addi r5,4
dswr r0,r5 // signature
addi r5,4
dswr r6,r5 // Stream_Rd_Ptr
addi r5,4
dswr r7,r5 // Stream_Wr_Ptr
addi r5,4
li r2,0x130000
tst r5,r2
bne update_r3k_mpeg
li r5,0x120000
update_r3k_mpeg:
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
movi r3,0
#endif // DUMP_PAGE12
//xxxxxxxxxxxxxx end
j LStoreStatus
LPlay:
movi r0,0
dsw r0,EOD_flag
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:
movi r2,0xffff //so that FIFO and clocks are reset
dsw r2,SAMPLING_FREQ_TEMP
movi r0,0
dsw r0,ok_decode_flag //not allow to decode
andi r1,RESET_RESUME
ori r1,SET_RUN
j LStoreStatus
LStopb:
#if 1 // LS388
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
dsw r0,Audio_Effect_Entry
la r3,SUB_pcm_pcm
#else //EFFECT
la r3,SUB_out_fifo
#endif //EFFECT
#endif // 1
movi r0,0
movw LWbytecount,r0
ori r1,SET_PROCESS_NEW // process, new
LStopf:
jsr r31,SUB_clear_PCM
movi r0,1 // xxxx
movb LBPCM_flag,r0 // xxxx
andi r1,RESET_STOP // need to flush PCM buffer
j LStoreStatus
LStop:
ori r1,SET_PAUSE
andi r1,RESET_STOP
LStoreStatus:
jsr r31,SUB_clear_PCM
movh LIstatus, r1
LClearCmd:
movi r0,0x100
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_EOD
beq LEndOfData
#ifdef CPY_PRT
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
/*-------- commands for trick modes ----------*/
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
/*--------------------------------------------*/
j LClearCmd
LStat:
dsw r1,STATUS0
j LClearCmd
Lgain:
dlw r1,PCM_SCALE
nop
movw LWpcmscale,r1
j LClearCmd
LMute:
ori r1,SET_MUTE
j LStoreStatus
LUnmute:
andi r1,RESET_UNMUTE
j LStoreStatus
/*-------- commands for trick modes ----------*/
LSlowPlay:
ori r3, 0x0010
j enable_STC
LFastPlay:
ori r3, 0x0010
//xxxxxxxxxxxxxx
#ifdef DUMP_PAGE12
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -