📄 qt_snc.s
字号:
;;;
;;; Test external interrupts
;;;
.nolist
#include "regdef.h"
#include "user.h"
#include "sync.h"
#include "stereo_user.h"
.globl SUB_check_PTS
.globl SUB_consume_data
.globl SUB_seek_DTS_SYNC // Corin 101
.extern Debug_Dump_Ptr // xxxxxxxxx
.list
.text
.set noreorder
#define DTSDVD_SyncHigh 0xfe7f
#define DTSDVD_SyncLow 0x0180
#define DTSCD_SyncHigh 0xff1f
#define DTSCD_SyncLow 0x00e8
/***************************************************************************************
This routine updates STC with audio PTS and consumes one PTS, if
1. PTS fifo is not empty;
2. (internal bytecount) >= (A_PTS bytecount).
***************************************************************************************/
SUB_check_PTS:
movw r23,LWbytecount
#ifdef WS_DEBUG
// dlw r21,PTS_FIFO_Rd_Ptr // point to PTS
// dlw r20,PTS_FIFO_Wr_Ptr
LdPTSRdPtr r21
LdPTSWrPtr r20
rlwi r2,STC // xxxxxx debug
// dsw r23,0xff40 // internal bytecount
// dsw r2,0xff44 // STC
tst r20,r21
beq Lcheck_PTS_done // branch if PTS fifo empty
update_data_to_r3k:
dlwr r0,r21 // load A_PTS
addi r1,r21,4
dlwr r4,r1 // load A_PTS bytecount
dsw r23,0xff40 // internal bytecount
dsw r2,0xff44 // STC
dsw r0,0xff48 // A_PTS
shl r0,1
dsw r0,0xff58 // A_PTS
dsw r4,0xff4c // A_PTS bytecount
//xxxxxxxxxxxxxx
#ifdef DUMP_PAGE12
dlw r5,Debug_Dump_Ptr
nop
movi DcacheBase,0x12
nop
nop
dswr r23,r5 // LWbytecount
addi r5,4
dswr r2,r5 // STC
addi r5,4
dswr r0,r5 // A_PTS
addi r5,4
dswr r4,r5 // A_PTSbytecount
addi r5,4
li r1,0x130000
tst r5,r1
bne update_r3k_done_1
li r5,0x120000
update_r3k_done_1:
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
#endif // WS_DEBUG
LPTS1:
addi r24,r21,4 // point to byte count
tst r20,r21
beq Lcheck_PTS_done // branch if PTS fifo empty
dlwr r22,r24 // get byte count
dlwr r2,r21 // get PTS
tst r23,r22
blt Lcheck_PTS_done // branch if
// (internal bytecount) < (A_PTS bytecount)
shl r2,1 // PTS passed is bit 32..1
#if LS388
movh r0,LIMpegAttr
andi r0,0x00b0 //STEP or FF/FB or fast/slow play mode
tsti r0,0
bne update_STC_done // not update STC in trick modes
#if 1 //yyyy
rswi r2,STC // load STC only in normal mode
#endif
update_STC_done:
#else // LS388
rswi r2,AUDIO_PTS // load audio PTS
#endif // LS388
Lno_update:
mupi r0,MEM_SEG
addi r0,PTS_FIFO_END
addi r21,8 // two element per entry
tst r21,r0
blt Lupdate_rd_ptr
mupi r21,MEM_SEG
addi r21,PTS_FIFO_START // wrap around
Lupdate_rd_ptr:
// dsw r21,PTS_FIFO_Rd_Ptr // update read pointer
SvPTSRdPtr r21
LdPTSWrPtr r20
j LPTS1 // keep consuming A_PTS and its bytecount until
// either PTS fifo empty or
// (internal bytecount) < (A_PTS bytecount)
Lcheck_PTS_done:
j r28
/***************************************************************************************
This routine consumes data in trick modes.
Consume one audio frame and update internal bytecount.
Consume one PTS, if PTS fifo is not empty and (internal bytecount) > (A_PTS bytecount).
There must be at least one audio frame in IBUF when enter this routine.
***************************************************************************************/
SUB_consume_data:
movw r3,LWbytecount
#ifdef WS_DEBUG
// dlw r6,PTS_FIFO_Wr_Ptr
// dlw r7,PTS_FIFO_Rd_Ptr
LdPTSWrPtr r6
LdPTSRdPtr r7
rlwi r2,STC
tst r6,r7
#if 0
beq update_r3k_done
#else // 1
bne update_r3k
li r2,0xdeadbeef
dsw r3,0xff40 // LWbytecount
dsw r2,0xff44 // STC - update STC even PTS fifo empty
// dsw r2,0xff48 // A_PTS
// j update_r3k_done
j check_video_fifo_empty // check video fifo if PTS fifo empty
#endif // 1
update_r3k:
dlwr r0,r7
addi r1,r7,4
dlwr r4,r1
dsw r3,0xff40 // LWbytecount
dsw r2,0xff44 // STC
dsw r0,0xff48 // A_PTS
shl r0,1
dsw r0,0xff58 // A_PTS
dsw r4,0xff4c // A_PTSbytecount
//xxxxxxxxxxxxxx
#ifdef DUMP_PAGE12
dlw r5,Debug_Dump_Ptr
nop
movi DcacheBase,0x12
nop
nop
dswr r3,r5 // LWbytecount
addi r5,4
dswr r2,r5 // STC
addi r5,4
dswr r0,r5 // A_PTS
addi r5,4
dswr r4,r5 // A_PTSbytecount
addi r5,4
li r1,0x130000
tst r5,r1
bne update_r3k_done_2
li r5,0x120000
update_r3k_done_2:
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
update_r3k_done:
#endif // WS_DEBUG
// dlw r1,PTS_FIFO_Rd_Ptr // point to PTS
// dlw r0,PTS_FIFO_Wr_Ptr
addi r4,r7,4 // point to byte count
dlwr r2,r4 // get byte count
dlwr r5,r7 // get A_PTS
rlwi r4,STC // get STC
shl r5,1
tst r4,r5
movh r4,LIfrmsize
// blt end_consume_data // branch if STC < A_PTS
blt check_video_fifo_empty
add r3,r4 // consume one frame, bytecount
movw LWbytecount,r3
tst r3,r2
blt update_pts_rd_ptr_done // branch if bytecount < A_PTSbytecount
tst r6,r7
beq update_pts_rd_ptr_done // branch if PTS fifo empty
addi r7,8
andi r0,r7,0xffff
tsti r0,PTS_FIFO_END
blt update_pts_rd_ptr
subi r0,PTS_FIFO_SIZE
update_pts_rd_ptr:
mupi r1,MEM_SEG
or r1,r0
// dsw r1,PTS_FIFO_Rd_Ptr
SvPTSRdPtr r1
consume_one_more_PTS:
tst r1,r6
beq update_pts_rd_ptr_done // branch if PTS fifo empty
addi r1,4 // point to next A_PTSbytecount
dlwr r5,r1 // next A_PTSbytecount
nop
tst r3,r5
blt update_pts_rd_ptr_done // branch if (bytecount < A_PTSbytecount)
addi r1,4 // point to 2nd next PTS
andi r1,0xffff
tsti r1,PTS_FIFO_END
blt save_one_more_PTS
subi r1,PTS_FIFO_SIZE
save_one_more_PTS:
mupi r0,MEM_SEG
or r1,r0
SvPTSRdPtr r1
j consume_one_more_PTS // until (bytecount < A_PTSbytecount) or PTS fifo empty
update_pts_rd_ptr_done:
// movh r4,LIfrmsize
movw r5,LWibufRdPtr
andi r5,0xffff
add r5,r4 // consume one frame, ibuf_rd_ptr
tsti r5,IBUF_END
blt 5f
subi r5,IBUF_SIZE
5:
mupi r0,MEM_SEG // prefix w/ segment number
or r5,r0
movw LWibufRdPtr,r5 // update read pointer
// dsw r5,Stream_Rd_Ptr
SvStrRdPtr r5
// dsw r5,OLD_Stream_Rd_Ptr
movh LIold_rd_ptr,r5
//xxxxxxxxxxxxxx
#ifdef DUMP_PAGE12
// dlw r6,Stream_Wr_Ptr
LdStrWrPtr r6
mov r7,r5
movw r0,LWbytecount
dlw r5,Debug_Dump_Ptr
nop
movi DcacheBase,0x12
nop
li r3,0xffffff03
dswr r0,r5 // LWbytecount
addi r5,4
dswr r3,r5 // signature
addi r5,4
dswr r7,r5 // Stream_Rd_Ptr
addi r5,4
dswr r6,r5 // Stream_Wr_Ptr
addi r5,4
li r1,0x130000
tst r5,r1
bne consume_data_dump
li r5,0x120000
consume_data_dump:
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
end_consume_data:
movi r0,128
1:
nop
loop 16,delay_loop1
nop
nop
nop
nop
delay_loop1:
subi r0,1
tsti r0,0
bne 1b
j r31
check_video_fifo_empty:
rlwi r4,MPEG_VID_FIFO_CUR_BYTE
tsti r4,0
bne end_consume_data
movh r4,LIfrmsize
add r3,r4 // consume one frame, bytecount
movw LWbytecount,r3
j update_pts_rd_ptr_done
//=================================================
// DTS CD Seek Sync Subroutine
//=================================================
SUB_seek_DTS_SYNC:
dlh r7, DiskAttrib+2
movi StartAddrHigh, MEM_SEG
movi AGRSiz2, 0xffff
movi DMASize, 31 //32 words each block
movi BlockSkip, 0
movi BlockSize, 0 // block size = 1
addi r7, 1
dsh r7, DiskAttrib+2 // counter for seek sync
LdStrRdPtr r21
dlw r23, Stream_End
movi r1, 0x400 // 0x400(word)=0x1000(byte)
andi r22, r21, 0xffff
andi r23, 0xffff
shr r22, 2
shr r23, 2
movi r3, 0 // counter for DMA
movi r0, 0 // counter for seek sync
Seek_sync:
movi AGRAdr2, 0x1000
tst r22, r23
blt DMA_data
subi r22, PCM_IBUF_SIZE/4
DMA_data:
mov LocalAddr, r1
dmarr r22
WaitDma
addi r22, 32 // 32 words each block
addi r3, 1
get_next_word:
mov r4, a2(1*4)
shr r6, r4, 16 // Sync Low 0x00e8
andi r4, 0xffff // Sync High 0xff1f
tsti r4, DTSCD_SyncHigh
bne find_DVD_Syncword
tsti r6, DTSCD_SyncLow
beq sync_found
find_DVD_Syncword:
tsti r4, DTSDVD_SyncHigh
bne find_next_word
tsti r6, DTSDVD_SyncLow
beq sync_found
find_next_word:
addi r0, 1
tsti r0, 32
blt get_next_word
movi r0, 0
tsti r3, 8
blt Seek_sync
movi r0, 2 // PCM CDDA
j No_DTS_Sync
sync_found:
// DiskAttrib: Low half for Disk Attribution, Hi half for seek snyc counter
// Low half: 0 = not seek yet, 1 = DTS CD, 2 = PCM CD
// Hi half: number of seeking sync
movi r0, 1
No_DTS_Sync:
nop
dsh r0, DiskAttrib
End_seeking:
j r29
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -