📄 pcm.s
字号:
movi r0, CMD_STOP
movh r3, LIMpegAttr
andi r2, r3, 0x100
tsti r2, 0x100
beq ExecCmd
movi r0, CMD_PLAY
j ExecCmd
#if 0
/********************************************************/
/* Set PCM_Out_Ctrl in R3k, the rest has no difference */
/* from 6 ch. This sub could be removed. */
/********************************************************/
LSpdif:
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
rlwi r3, GPIO_CTRL_REG
and r3, r0
or r3, r2
#if !LS388
rswi r3, GPIO_CTRL_REG
#endif // LS388
#if LS388
#ifdef EXTERNAL_A_CLOCK
li r2,0x30000
rlwi r0,PCM_Out_Ctrl
and r0,r2
li r2,0x47049 // reverse PCM clock, 24-bit clock, 6-channel, front to S/PDIF
or r0,r2
#else // EXTERNAL_A_CLOCK
li r0,0x57049 // reverse PCM clock, 24-bit clock, 6-channel, front to S/PDIF
#endif // EXTERNAL_A_CLOCK
#else // LS388
li r0,0x13d21
#endif // LS388
#ifndef R3K_PCM_OUT_CTRL
rswi r0,PCM_Out_Ctrl
#endif // R3K_PCM_OUT_CTRL
dsw r0, PCM_Config_Word
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
movh LIold_rd_ptr,r2
#endif // LS388
addi r2,PCM_IBUF_SIZE // set up buffer end address
dsw r2,Stream_End
mupi r0,MEM_SEG
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
movw LWbytecount,r0
movw LWoldPTS,r0
/******************************************************/
/* For Spdif mode Make (user_icfg=0x02 then 0x82) */
/******************************************************/
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
#endif
#if LS388
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
movh r0,LIMpegAttr
dsw r0,TEMP_MpegAttr
jsr r26,SUB_Title_Key // beware it's r26
rtn_Title_Key:
dlw r0,TEMP_MpegAttr
nop
movh LIMpegAttr,r0
#ifndef LS240
movi TrapReg,1<<2
#endif
j LClearCmd
#endif // LS388
LDriver_Type:
movi r0,0x1
movb LBDriver,r0 // External DVD
j LClearCmd
///////////////////////////////////////////////////////
///// SUB_clear_PCM
SUB_clear_PCM:
movi TrapReg,0
movi r0,0 // flush PCM FIFO
#ifdef EFFECT
movi DcacheBase,DataSeg
movi r2,MIDDLE_BUF
loop 24,LclearEFFECT
loop 128,LclearEFFECT
#if 1 //yyyy
dswr r0,r2
#endif
addi r2,4
LclearEFFECT:
#endif // EFFECT
////////Corin ////////////////////////////////////////
////////Corin ////////////////////////////////////////
movi r8, PCM_FIFO_0_START
movi r9, PCM_FIFO_0_END
rlwi r1, PCM_Rd_Ptr ; read current pointer register (28c)
andi r1,0xffff
tst r1, r9
blt LclrPCM_from_BLK_1
// Clear from BLOCK 0
movi r0,0
movi r2,PCM_FIFO_0_START
loop 32,LclearPCM_FIFO_0
loop 48,LclearPCM_FIFO_0
dswr r0,r2
addi r2,4
LclearPCM_FIFO_0:
movi r0,0
movi r2,PCM_FIFO_1_START
loop 32,LclearPCM_FIFO_1
loop 48,LclearPCM_FIFO_1
dswr r0,r2
addi r2,4
LclearPCM_FIFO_1:
j LclrPCM_BLK_0
LclrPCM_from_BLK_1:
movi r0,0
movi r2,PCM_FIFO_1_START
loop 32,LclrPCM_BLK_1
loop 48,LclrPCM_BLK_1
dswr r0,r2
addi r2,4
LclrPCM_BLK_1:
movi r0,0
movi r2,PCM_FIFO_0_START
loop 32,LclrPCM_BLK_0
loop 48,LclrPCM_BLK_0
dswr r0,r2
addi r2,4
LclrPCM_BLK_0:
////////Corin ////////////////////////////////////////
////////Corin ////////////////////////////////////////
////////Corin ////////////////////////////////////////
/*corin movi r2,PCM_FIFO_BASE
loop 32,LclearPCM
loop 96,LclearPCM
#if 1 //yyyy
dswr r0,r2
#endif
addi r2,4
*/
LclearPCM:
movi DcacheBase,MEM_SEG
movi AGRAdr0,local_FApcm_buf_byte
movi AGRSiz0,0xffff
loop 32,LclearPCM_local
#ifdef EFFECT
loop 8,LclearPCM_local
#else //EFFECT
loop 24,LclearPCM_local
#endif //EFFECT
mov a0(4),r0
LclearPCM_local:
movi TrapReg,1<<2
j r31
///////////////////////////////////////////////////////
///////////////////////////////////////////////////////
///////////////////////////////////////////////////////
SUB_mute_PCM:
#ifdef I2S
dlw r11,USER_ICFG
nop
andi r11,ICFG_SPDIF_MASK
shr r11,ICFG_SPDIF_SHIFT
#endif
movi r29,0 //loop counter
movi AGRSiz0,0xffff
movi AGRMod0,0
#ifdef I2S
li r3,0x007ae7d2 ; 0.960199606 time constant for 256 samples
// 10 ^^ (-15 * lg 2 / 256)
tsti r11,SPDIF_ENABLED
bne Lnot_Spdif //in spdif mode, use non-I2S
li r3,0x007d6d4a ; 0.979897753 time constant for 512 samples
// 10 ^^ (-15 * lg 2 / 512)
Lnot_Spdif:
#else
li r3,0x007d6d4a ; 0.979897753 time constant for 512 samples
// 10 ^^ (-15 * lg 2 / 512)
#endif
mov r16,r3 ; start with r3
start_mute_loop:
movi TrapReg,0
nop
nop
#ifdef I2S
tsti r11,SPDIF_ENABLED
beq LSpdif_i2s //in spdif mode, use non-I2S
movi AGRAdr0,local_FApcm_buf_byte
loop 128,Linear
movhf r1,a0(12) ; L
movhf r2,a0(-12) ; R
mulf r6,r1,r16
mulf r8,r2,r16
movhf a0(12),r6 //pcm_dec in 1.15 format. to R sample
movhf a0(12),r8 //pcm_dec in 1.15 format. to next L sample
mulf r16,r16,r3 //decaying
Linear:
j Lcont_mute
LSpdif_i2s:
movi AGRAdr0,local_FApcm_buf_byte
loop 256,Linear_spf
movhf r1,a0(2) //L
movhf r2,a0(-2) //R
mulf r6,r1,r16
mulf r8,r2,r16
movhf a0(2),r6 //to R sample
movhf a0(10),r8 //to next L sample
mulf r16,r16,r3
Linear_spf:
Lcont_mute:
#else
movi AGRAdr0,local_FApcm_buf_byte
loop 256,Linear
movhf r1,a0(2) //L
movhf r2,a0(-2) //R
mulf r6,r1,r16
mulf r8,r2,r16
movhf a0(2),r6 //to R sample
movhf a0(10),r8 //to next L sample
mulf r16,r16,r3
Linear:
#endif
movi TrapReg,1<<2
#ifdef EFFECT
dsw r31,r31_temp //push stack
jsr r31,SUB_copy_to_middle //this will advance wr_ptr
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
jsr r31,SUB_save_keyshift_context //0x0-0x1000
jsr r31,SUB_restore_pcm_context //0x0-0x2000
movi DcacheBase,MEM_SEG //back to mpeg segment
movi StartAddrHigh,MEM_SEG
dlw r31,r31_temp //pop stack
#endif //EFFECT
wait_PCM:
movi r1,0 // clear flag, signal there will be
movb LBPCM_flag,r1 // a valid PCM block
movi r0,MEM_SEG
andi r0,0x3
shl r0,16
la r27,rtn_PCM2
or r27,r0
movw r1,LWPCMentry //should not use r16,r17,r18,r19,r29
or r1,r0
j r1
rtn_PCM2:
movb r1,LBPCM_flag
tsti r1,1 // test bit 0
bne wait_PCM // wait until set
addi r29,1
tsti r29,4 //do 4 blocks
blt start_mute_loop
j r31
#ifdef EFFECT
SUB_save_pcm_context: //0x0-0x2000
movi StartAddrHigh,DataSeg //to second segment
movi DMASize,31
movi r10,0x0
movi r11,(mpeg_context)>>2
loop 64, save_pcm ;total of 64*32 words
#if 1 //yyyy
mov LocalAddr, r10
dmawr r11
Lwait0: bdb Lwait0
#endif
addi r10, 32 ;32 words each block
addi r11, 32
save_pcm:
movi StartAddrHigh,MEM_SEG //back to first segment
j r31
SUB_restore_pcm_context: //0x0-0x2000
movi StartAddrHigh,DataSeg //to second segment
movi DMASize,31
movi r10,0x0
movi r11,(mpeg_context)>>2
loop 64, restore_pcm ;total of 64*32 words
#if 1 //yyyy
mov LocalAddr, r10
dmarr r11
Lwait1: bdb Lwait1
#endif
addi r10, 32 ;32 words each block
addi r11, 32
restore_pcm:
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
#if 1 //yyyy
mov LocalAddr, r10
dmawr r11
Lwait2: bdb Lwait2
#endif
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 //to second segment
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 //back to first segment
j r31
SUB_restore_keyshift_context: //0x2400-0x3000
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
#if 1 //yyyy
mov LocalAddr, r10
dmarr r11
Lwait3: bdb Lwait3
#endif
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_FApcm_buf_word //output of pcm
shr r11,2 //destination in word
loop 24, copy_to_middle ;total of 3*8*32 words
#if 1 //yyyy
mov LocalAddr, r10
dmawr r11
Lwait4: bdb Lwait4
#endif
addi r10, 32 ;32 words each block
addi r11, 32
tsti r11,MIDDLE_BUF_END_WORD
blt Lno_wrap_to
subi r11,MIDDLE_BUF_SIZE_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
movi BlockSkip, 2 //6- to 2-channel
loop 8, copy_from_middle ;total of 8*32 words
#if 1 //yyyy
mov LocalAddr, r10
dmarr r11
Lwait5: bdb Lwait5
#endif
addi r10, 32 ;32 words each block
addi r11, 32*3 //with skip
tsti r11,MIDDLE_BUF_END_WORD
blt Lno_wrap_from
subi r11,MIDDLE_BUF_SIZE_WORD
Lno_wrap_from: nop
copy_from_middle:
movi BlockSkip, 0
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 + -