📄 musicout.s
字号:
// sub-band synthesis
movb r23, LBfr_ps_stereo
movi r21, 0 //seg count always = 0
movi r20, 0 // channel count
synthesis_I_loop_begin:
jsr r26, SUB_SubBandSynthesis // r21 is not used
rtn_SubBandSynthesis:
addi r20, 1
tst r20, r23
blt synthesis_I_loop_begin
I_pack_pcm_samples_begin:
// pack pcm smaples
jsr r26,SUB_pack_pcm
rtn_pack_pcm_I:
//be careful ! need to accumulate 3 blocks for layer I
#ifdef EFFECT //for EFFECT with keyshift use SUB_pcm_pcm
j out_fifo_done_I
#endif //EFFECT
// output pcm
checking_pcm_flag_I:
movi r1, 0
movb LBPCM_flag, r1 //reset flag
#if SR48
movb r1,LBhdr_sampling_frequency
tsti r1,SAMPLING_FREQ_480
beq L_I_no_sr48
jsr r26,SUB_out_fifo_SR48
j rtn_I_out_fifo
L_I_no_sr48:
#endif //SR48
jsr r26,SUB_out_fifo
rtn_I_out_fifo:
.if PCM_OUT
movb r1, LBPCM_flag //this should be in top level later
tsti r1, 1
#ifndef EXECTIVE
bne checking_pcm_flag_I
movi r1, 0
movb LBPCM_flag, r1 //reset flag
#else // EXECTIVE
beq out_fifo_done_I
la r1,checking_pcm_flag_I
movw LWPCMentry,r1
j r31
out_fifo_done_I:
#endif // EXECTIVE
.endif // PCM_OUT
#endif // NO_RHDEBUG
mupi r6,MEM_SEG
la r26,I_block_loop_start
or r26,r6
I_block_loop_end:
j Block_loop_end
chk_layer2:
tsti r8,2
movi r10,F_LAYER_ERROR
bne error_handler
movi r8,8
movb LBbitsPerSlot,r8
movi r8,1152
movh LIsamplesPerFrame,r8
jsr r26,SUB_II_decode_bitalloc
rtn_II_decode_bitalloc:
jsr r26,SUB_II_decode_scale
rtn_II_decode_scale:
movb r8,LBhdr_error_protection
tsti r8,0
bne end_II_chk_CRC
jsr r26,SUB_II_CRC_calc
rtn_II_CRC_calc:
jsr r26,SUB_chk_CRC
rtn_II_chk_CRC:
tsti r10,0
bne error_handler
end_II_chk_CRC:
/* for (i=0;i<SCALE_BLOCK;i++) { ... } */
movi r6,0
movb LBblknum,r6
II_block_loop_start:
.if SB_OUT
movi AGRAdr4,local_sample_byte // r5=addr. of sample[0][0][i]
movi r10,0
mupi r10,0x1111
CLR_TrapReg
loop 2,6f // for(j=0;j<2;j++)
loop 3,6f // for(k=0;k<3;k++)
loop 32,6f // for(i=0;i<SBLIMIT;i++)
mov a4(4),r10
6:
SET_TrapReg
.endif // SB_OUT
jsr r26,SUB_II_buffer_sample
rtn_II_buffer_sample:
.if SB_OUT
movi r10,local_sample_byte
rswi r10,0x500 // start address to dump
addi r10,2*3*32*4
rswi r10,0x504 // end address to dump
movi r10,1
rswi r10,0x508 // enable dumping
.endif // SB_OUT
#if NO_RHDEBUG
movb r22, LBblknum
shr r22, 2 //r22=x=i>>2
jsr r26,SUB_II_dequantize_sample
rtn_II_dequantize_sample:
// sub-band synthesis
movb r23, LBfr_ps_stereo
movi r21, 0 // segment count
segment_loop_begin: //max 3 nested hardware loops
movi r20, 0 // channel count
synthesis_II_loop_begin:
jsr r26, SUB_SubBandSynthesis // r21 is not used
rtn_SubBandSynthesis_II:
addi r20, 1
tst r20, r23
blt synthesis_II_loop_begin
II_check_segment:
addi r21, 1
tsti r21, 3
blt segment_loop_begin
// pack pcm smaples
jsr r26,SUB_pack_pcm
rtn_pack_pcm_II:
#ifdef EFFECT //for EFFECT with keyshift use SUB_pcm_pcm
j out_fifo_done_II
#endif //EFFECT
// output pcm
checking_pcm_flag_II:
movi r1, 0
movb LBPCM_flag, r1 //reset flag
#if SR48
movb r1,LBhdr_sampling_frequency
tsti r1,SAMPLING_FREQ_480
beq L_II_no_sr48
jsr r26,SUB_out_fifo_SR48
j rtn_II_out_fifo
L_II_no_sr48:
#endif //SR48
jsr r26,SUB_out_fifo
rtn_II_out_fifo:
.if PCM_OUT
movb r1, LBPCM_flag //this should be in top level later
tsti r1, 1
#ifndef EXECTIVE
bne checking_pcm_flag_II
movi r1, 0
movb LBPCM_flag, r1 //reset flag
#else // EXECTIVE
beq out_fifo_done_II
la r1,checking_pcm_flag_II
movw LWPCMentry,r1
j r31
out_fifo_done_II:
#endif // EXECTIVE
.endif // PCM_OUT
#endif // NO_RHDEBUG
mupi r6,MEM_SEG
la r26,II_block_loop_start
or r26,r6
II_block_loop_end:
Block_loop_end:
dlw r6,Sync_Rd_Ptr // Rd_Ptr at sync location
dlw r7,Stream_Rd_Ptr
nop
tst r6, r7
bne Lend1frame // if neq, bit-stream errors occur, do NOT decode
movb r6,LBblknum
addi r6,1
movb LBblknum,r6
tsti r6,SCALE_BLOCK
#ifdef EXECTIVE
beq Lend1frame
movw LWentry,r26 // (r26 = addr. of block_loop_start)
j r31 // return to exective
Lend1frame:
movw r6,LWFrameCount
addi r6,1
movw LWFrameCount,r6
movi r6,0 //j.h.: reset blknum so that
movb LBblknum,r6 //Check_PTS can start
#else // EXECTIVE
bgte 2f // branch if loop count > SCALE_BLOCK
j r26 // decode next block (r26 = addr. of block_loop_start)
2:
#endif // EXECTIVE
.if FRAMECOUNT
dlw r7,framecount_DB
nop
addi r7,1
tsti r7, 441
blte Lcnt_ok
movi r7, 1
#if ISO
#ifndef MPEG_2
movh r0,LIfrmsize_offset
dsw r0,frmsize_offset_cnt
#endif // MPEG_2
#else // ISO
#ifdef MPEG_2
movb r0,LBhdr_sampling_frequency
tsti r0,1
beq Lcnt_ok
#endif // MPEG_2
movh r0,LIfrmsize_offset
dsw r0,frmsize_offset_cnt
#endif // ISO
Lcnt_ok:
dsw r7,framecount_DB
.endif // FRAMECOUNT
la r10,Lframe_loop // set entry for exective
movw LWentry,r10
j r31 // return to exective
Ldecode_done:
.if PCM_OUT
;; read location of read fifo
pcm_end_wait:
#ifdef FILE_OUT
dlw r1, PCM_Rd_Ptr ; read current pointer register (28c to 294)
nop
#else // FILE_OUT
rlwi r1, PCM_Rd_Ptr ; read current pointer register (28c to 294)
#endif // FILE_OUT
#ifdef STREAM_SIM
shr r1, 16 ; make it just the current address portion
#endif // STREAM_SIM
#ifdef EFFECT
mupi r10,DataSeg
#else // EFFECT
mupi r10,MEM_SEG
#endif // EFFECT
tst r1, r10 ;until last 6-word unit is out
bne pcm_end_wait
.endif // PCM_OUT
#ifdef EXECTIVE
j r31
#else
halt pass
#endif
//------------------------------------------------------
error_handler: // r10 = error flag
dlw r12,DB_FLAG_ADR+0x4
movh r0,LIstatus
or r0,r10
movh LIstatus,r0
#if FRAMECOUNT
dlw r0,framecount_DB
dlw r1,DB_FLAG_ADR+0x4 // sticky error flag
#endif // FRAMECOUNT
or r12,r10
dsw r10,DB_FLAG_ADR+0 // new error flag
dsw r12,DB_FLAG_ADR+0x4 // sticky error flag
#if FRAMECOUNT
tsti r1,0
bne 2f
dsw r0,DB_FLAG_ADR+0xc // framecount when error occur
2:
#endif // FRAMECOUNT
//--------------------j.h.: added to update Rd_Ptr and bytecount
movh r11,LIfrmsize
shl r11,3 // byte addr -> bit addr
mov r12,Gb_Getbits_Ptr
add r12,r11 //advance one frame
#ifdef LS388
#if SVCD
li r13,0x804e0000 //end of buffer
#else // SVCD
li r13,0x80860000 //end of buffer
#endif // SVCD
#else // LS388
li r13,0x80fe0000 //end of buffer
#endif // LS388
tst r12,r13
blt 1f
li r13,0x00020000 //ibuf length in bits
sub r12,r13
1:
mov Gb_Shadow_Ptr, r12 // load stream bit pointer
nop
nop
gbi r10, 0x0 // Init bit stream, works without it in sim
mov r12,Gb_Getbits_Ptr
shl r12,8 // to clear MS byte
shr r12,3+8 // r12 = byte addr of the last byte of current frame
andi r12,0xffff
tsti r12,IBUF_END_plus1
blt 1f
subi r12,IBUF_END_plus1 // wrapped
addi r12,IBUF_START
1:
mupi r13,MEM_SEG // restore segment
or r12,r13
dlw r0,Stream_Rd_Ptr
nop
dsw r12,Stream_Rd_Ptr // update read pointer for host
movw LWibufRdPtr,r12
sub r13,r12,r0
tst r12,r0
bgte 1f
addi r13,0x4000 //ibuf length
1:
movw r0,LWbytecount
add r0,r13
//xxxxxxxxxxxxxx
#ifdef DUMP_PAGE12
dlw r5,Debug_Dump_Ptr
dlw r14,Stream_Wr_Ptr
nop
movi DcacheBase,0x12
nop
li r3,0xffffff02
dswr r0,r5 // LWbytecount
addi r5,4
dswr r3,r5 // signature
addi r5,4
dswr r12,r5 // Stream_Rd_Ptr
addi r5,4
dswr r14,r5 // Stream_Wr_Ptr
addi r5,4
li r1,0x130000
tst r5,r1
bne error_handler_dump
li r5,0x120000
error_handler_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
//-------------------------------------
// added by j.h. clear delay buffer to smooth out
// clear F2Abuf0 and F2Abuf1. Done at the begining
movi AGRAdr0, local_buf0_byte
movi AGRAdr1, local_buf1_byte
movi r1, 0
loop 16, Lclear_0
loop 32, Lclear_0
mov a0(1*4), r1
mov a1(1*4), r1
Lclear_0:
movi AGRAdr0, local_pcm_sample_byte
loop 6, Lclear_1
loop 32, Lclear_1
mov a0(1*4), r1
Lclear_1:
movi BlockSize, 31 ;get 32 words
movi DMASize, 31
movi r5, F2Abuf0 ;buf0
movi r1, local_buf1_byte
CLR_TrapReg
loop 16, clr_buf0_a ; total of 512 words
mov ByteLocal, r1
dmabwr r5
WaitDma
addi r5, 32*4
clr_buf0_a:
SET_TrapReg
movi r5, F2Abuf1 ;buf1
movi r1, local_buf1_byte
CLR_TrapReg
loop 16, clr_buf1_a ; total of 512 words
mov ByteLocal, r1
dmabwr r5
WaitDma
addi r5, 32*4
clr_buf1_a:
SET_TrapReg
la r10,SUB_MPEG_decoder //start decoder again if errors found
movw LWentry,r10
//--------------------------------------------
#ifdef EXECTIVE
j r31
#else
halt fail
#endif
#ifndef MPEG_2
.global frmsize_offset_cnt
frmsize_offset_cnt: .align 2
.word 0x00000000
#endif // MPEG_2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -