📄 mpg.s
字号:
dlw r5,Debug_Dump_Ptr
dlw r6,Stream_Rd_Ptr
dlw r7,Stream_Wr_Ptr
movi DcacheBase,0x12
movw r0,LWbytecount
nop
dswr r0,r5 // LWbytecount
addi r5,4
li r0,0x11111111
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 r1,0x130000
tst r5,r1
bne update_r3k_fast_play
li r5,0x120000
update_r3k_fast_play:
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
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
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_MPEG_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
//xxxxxxxxxxxxxx
#ifdef DUMP_PAGE12
dlw r6,Stream_Rd_Ptr
dlw r7,Stream_Wr_Ptr
dlw r5,Debug_Dump_Ptr
li r0,0x22222222
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 r1,0x130000
tst r5,r1
bne update_r3k_normal_play
li r5,0x120000
update_r3k_normal_play:
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 enable_STC
enable_STC:
movi r0,0
movw LWFrameCount,r0
movh LIMpegAttr, r3
movi r0, CMD_STOP
movh r3, LIMpegAttr
andi r2, r3, 0x100
tsti r2, 0x100
beq ExecCmd
movi r0, CMD_PLAY
j ExecCmd
/*--------------------------------------------*/
LVer:
movi r1,ROM_VER
dsw r1,STATUS0
j LClearCmd
LEndOfData:
movi r1,0x1
dsw r1,EOD_flag
j LClearCmd
LConfig:
dlw r1,USER_OCFG
nop
movh LIocfg,r1
j LClearCmd
#ifdef CPY_PRT
LCpyp_clear: // Drv_RD, Drv_acc, Drv_CD are assumed in the
movi r1,0 // consecutive byte location.
movi r2,Drv_RD // 16 byte/4 dword total
dswr r1,r2
addi r2,4
dswr r1,r2
addi r2,4
dswr r1,r2
addi r2,4
dswr r1,r2
LDrv_Auth:
#ifndef LS240
movi TrapReg,0
nop
nop
#endif
jsr r27,SUB_Drv_Auth
rtn_Drv_Auth:
#ifndef LS240
movi TrapReg,1<<2
#endif
j LClearCmd
LDec_Auth:
#ifndef LS240
movi TrapReg,0
nop
nop
#endif
jsr r27,SUB_Dec_Auth
rtn_Dec_Auth:
#ifndef LS240
movi TrapReg,1<<2
#endif
j LClearCmd
LKey_Share:
#ifndef LS240
movi TrapReg,0
nop
nop
#endif
jsr r27,SUB_Key_Share
rtn_Key_Share:
#ifndef LS240
movi TrapReg,1<<2
#endif
j LClearCmd
LDisc_Key:
#ifndef LS240
movi TrapReg,0
nop
nop
#endif
jsr r26,SUB_Disc_Key // beware it's r26
rtn_Disc_Key:
#ifndef LS240
movi TrapReg,1<<2
#endif
j LClearCmd
LTitle_Key:
#ifndef LS240
movi TrapReg,0
nop
nop
#endif
jsr r26,SUB_Title_Key // beware it's r26
rtn_Title_Key:
#ifndef LS240
movi TrapReg,1<<2
#endif
j LClearCmd
#endif
LDriver_Type:
movi r0,0x1
dsw r0,LBDriver // External DVD
j LClearCmd
//--------------------------------------------------
SUB_swap_byte:
dlw r11,Stream_Wr_Ptr
dlw r10,SWAP_PTR
nop
andi r11, 0xffff
tst r11,r10
bgte Lcheck_swap
addi r11,IBUF_SIZE // always assume wr ahead of rd
Lcheck_swap:
sub r11,r10
tsti r11,32*4
blte Lno_swap
movi DMASize, 31 ;32 words each block
movi BlockSkip, 0
movi BlockSize, 0 ;block size = 1.
mupi r13, 0x00ff ; mask
movi AGRSiz0, 0xffff
shr r11, 7 ; # of 32-word blocks
shr r10, 2 ; to word addr
.if 1
CLR_TrapReg
loop r11, Lswap_block
tsti r10, IBUF_END_OVER_4 //IBUF_END/4
blt Lblock_ok
subi r10, IBUF_SIZE_OVER_4 //IBUF_SIZE/4
Lblock_ok:
movi LocalAddr, Lswap_scratch_word
dmarr r10
Ldma_1: bdb Ldma_1
movi AGRAdr0, Lswap_scratch_byte
loop 32, Lswap_loop
mov r15, a0(0*4)
shl r16, r15, 24 ; 0
shl r17, r15, 8
and r17, r13 ; 1
shr r18, r15, 8
andi r18, 0xff00 ; 2
shr r19, r15, 24 ; 3
or r19, r16
or r19, r17
or a0(1*4), r19, r18
Lswap_loop:
movi LocalAddr, Lswap_scratch_word
dmawr r10
Ldma_2: bdb Ldma_2
addi r10, 32 ; to next block
Lswap_block:
SET_TrapReg
.endif
shl r10, 2 ; back to byte addr
dsw r10, SWAP_PTR
Lno_swap:
nop
nop
j r31
///////////////////////////////////////////////////////
///// SUB_clear_PCM
SUB_clear_PCM:
CLR_TrapReg_1
movi r0,0 // flush PCM FIFO
#ifdef EFFECT
movi DcacheBase,DataSeg
movi r2,MIDDLE_BUF
loop 24,LclearEFFECT
loop 128,LclearEFFECT
dswr r0,r2
addi r2,4
LclearEFFECT:
#endif //EFFECT
////////Corin ////////////////////////////////////////
//////// Test PCM read pointer /////////////////////////
///// Caution: r1 is reversed here can't use r1 here.
///// Or will hang the system !!!
LclearPCMcheck0:
rlwi r0, PCM_Rd_Ptr ; read current pointer register (28c)
andi r0,0xffff
tsti r0,PCM_FIFO_1_START
movi r0,0
movi r2,PCM_FIFO_0_START
blte LclearPCMcheck0
loop 32,LclearPCM_FIFO_0
loop 48,LclearPCM_FIFO_0
dswr r0,r2
addi r2,4
LclearPCM_FIFO_0:
nop
LclearPCMcheck1:
rlwi r0, PCM_Rd_Ptr ; read current pointer register (28c)
andi r0,0xffff
tsti r0,PCM_FIFO_1_START
movi r0,0
movi r2,PCM_FIFO_1_START
bgte LclearPCMcheck1
loop 32,LclearPCM_FIFO_1
loop 48,LclearPCM_FIFO_1
dswr r0,r2
addi r2,4
LclearPCM_FIFO_1:
////////Corin ////////////////////////////////////////
////////Corin ////////////////////////////////////////
LclearPCM_local_Start:
movi AGRAdr2, local_pcm_sample_byte
movi AGRSiz2,0xffff
//LclearPCM:
#ifdef EFFECT
movi DcacheBase,MEM_SEG
#endif //EFFECT
nop
nop
loop SBLIMIT, LclearPCM_local // clear 3*32 words
mov a2(1*4), r0
mov a2(1*4), r0
mov a2(1*4), r0
LclearPCM_local:
SET_TrapReg
j r31
////// End of SUB_clear_PCM ///////////////////////////
///////////////////////////////////////////////////////
SUB_clear_IBUF:
movi r0,0 // flush IBUF
movi r2,IBUF_START
CLR_TrapReg
loop 32,LclearIBUF
loop 128,LclearIBUF
dswr r0,r2
addi r2,4
LclearIBUF:
SET_TrapReg
j r31
#ifdef EFFECT
SUB_save_mpeg_context: //0x0-0x1000 and 0x1c80-0x1f80
movi StartAddrHigh,DataSeg //to second segment
movi DMASize,31
movi r10,0x0
movi r11,mpeg_context>>2
loop 32, save_mpeg ;total of 32*32 words
mov LocalAddr, r10
dmawr r11
Lwait0: bdb Lwait0
addi r10, 32 ;32 words each block
addi r11, 32
save_mpeg:
movi r10,local_scale_index_word
movi r11,(mpeg_context>>2+local_scale_index_word)
loop 6, save_mpeg2 ;total of 6*32 words
mov LocalAddr, r10
dmawr r11
Lwait0a: bdb Lwait0a
addi r10, 32 ;32 words each block
addi r11, 32
save_mpeg2:
movi StartAddrHigh,MEM_SEG //back to first segment
j r31
SUB_restore_mpeg_context: //0x0-0x1000
movi StartAddrHigh,DataSeg //to second segment
movi DMASize,31
movi r10,0x0
movi r11,mpeg_context>>2
loop 32, restore_mpeg ;total of 32*32 words
mov LocalAddr, r10
dmarr r11
Lwait1: bdb Lwait1
addi r10, 32 ;32 words each block
addi r11, 32
restore_mpeg:
movi r10,local_scale_index_word
movi r11,(mpeg_context>>2+local_scale_index_word)
loop 6, restore_mpeg2 ;total of 6*32 words
mov LocalAddr, r10
dmarr r11
Lwait1a: bdb Lwait1a
addi r10, 32 ;32 words each block
addi r11, 32
restore_mpeg2:
movi StartAddrHigh,MEM_SEG //back to first segment
j r31
SUB_save_keyshift_context: //0x2000-0x3000
movi StartAddrHigh,DataSeg //to second segment
movi DMASize,31
movi r10,0x0
movi r11,keyshift_context
shr r11,2
loop 32, save_keyshift ;total of 32*32 words
mov LocalAddr, r10
dmawr r11
Lwait2: bdb Lwait2
addi r10, 32 ;32 words each block
addi r11, 32
save_keyshift:
movi StartAddrHigh,MEM_SEG //back to first segment
j r31
SUB_clear_keyshift_context: //0x2000-0x3000
movi DcacheBase,DataSeg
movi r10,0x0
movi r11,keyshift_context
loop 32, clear_keyshift ;total of 32*32 words
loop 32, clear_keyshift ;total of 32*32 words
dswr r10, r11
addi r11, 4
clear_keyshift:
movi DcacheBase,MEM_SEG
j r31
SUB_restore_keyshift_context: //0x400-0x1000
movi StartAddrHigh,DataSeg //to second segment
movi DMASize,31
movi r10,0x400 //no need to copy output
shr r10,2
movi r11,(keyshift_context+0x400)
shr r11,2
loop 24, restore_keyshift ;total of 24*32 words
mov LocalAddr, r10
dmarr r11
Lwait3: bdb Lwait3
addi r10, 32 ;32 words each block
addi r11, 32
restore_keyshift:
movi StartAddrHigh,MEM_SEG //back to first segment
j r31
SUB_copy_to_middle:
movi DcacheBase,MEM_SEG //direct to first segment
movi StartAddrHigh,DataSeg //dma to second segment
movi DMASize,31
dlw r11,mid_buf_wr_ptr
movi r10,local_pcm_sample_word //output of mpeg
shr r11,2 //destination in word
loop 3, copy_to_middle ;total of 3*32 words
mov LocalAddr, r10
dmawr r11
Lwait4: bdb Lwait4
addi r10, 32 ;32 words each block
addi r11, 32
tsti r11,MIDDLE_BUF_END_WORD
blt Lno_wrap_to
movi r11,MIDDLE_BUF_WORD
Lno_wrap_to: nop
copy_to_middle:
shl r11,2
dsw r11,mid_buf_wr_ptr
movi StartAddrHigh,MEM_SEG //back to first segment
j r31
SUB_copy_from_middle:
movi DcacheBase,MEM_SEG //direct to first segment
movi StartAddrHigh,DataSeg //dma to second segment
movi DMASize,31
dlw r11,mid_buf_rd_ptr
movi r10,0x0 //input of keyshift
shr r11,2 //source in word
loop 8, copy_from_middle ;total of 8*32 words
mov LocalAddr, r10
dmarr r11
Lwait5: bdb Lwait5
addi r10, 32 ;32 words each block
addi r11, 32
tsti r11,MIDDLE_BUF_END_WORD
blt Lno_wrap_from
movi r11,MIDDLE_BUF_WORD
Lno_wrap_from: nop
copy_from_middle:
shl r11,2
dsw r11,mid_buf_rd_ptr
movi StartAddrHigh,MEM_SEG //back to first segment
j r31
#endif //EFFECT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -