⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 decode.s

📁 关于DVD的MPEG2用的DSP代码,在DSP的实现MPEG的压缩,解压算法.
💻 S
📖 第 1 页 / 共 3 页
字号:
	dmarr	r1			;initiate DMA transfer
	
wait_dma_4d:
	mov	r2,StatusPort
	tsti	r2,DmaDoneBit
	bz	wait_dma_4d		;wait for dma done

not_loading_nb_table:
        movb    LBfr_ps_sblimit,r8
        movb    r8,LBhdr_mode
        tsti    r8,MPG_MD_JOINT_STEREO
        beq     htf_020
        movb    r8,LBfr_ps_sblimit
        j       htf_025
htf_020:
        /* js_bound, for Layer I and II */
        movb    r8,LBhdr_mode_ext
        addi    r8,1
	shl	r8,2
htf_025:
        movb    LBfr_ps_jsbound,r8
decode_info_done_ok:
        movi    r10,0
        j       r26
decode_info_done_error:
        movi    r10,F_INFO_ERROR

	
        j       r26


SUB_chk_CRC:
        movi    r9,0
        movi    r10,0
        tsth    r8,LIold_crc
        beq     chk_CRC_done
        movh    r9,LIcrc_error_count
        addi    r9,1
        movh    LIcrc_error_count,r9
        movh    r9,LItotal_error_count
        addi    r9,1
        movh    LItotal_error_count,r9
        jsr     r27,SUB_recover_CRC_error
        nop
        nop
        movh    r9,LIcrc_error_count
        movi    r10,F_CRC_ERROR
chk_CRC_done:
        movh    LIcrc_error_count,r9
        j       r26

SUB_recover_CRC_error:
recover_CRC_error_done:
        j       r27

SUB_I_CRC_calc:
        jsr     r27,SUB_CRC_calc_header

        movi    r6,4                    // length=4
        movi    r1,0
        CLR_TrapReg
        loop    SBLIMIT,8f              // for(i=0;i<SBLIMIT;i++)
        movb    r7,LBfr_ps_stereo       // r7=stereo
        shr     r2,r1,2                 // r2=i
        tstb    r2,LBfr_ps_jsbound      // (i>jsbound)?
        blt     2f                      // branch if i<jsbound ( r7=stereo )
        movi    r7,1                    // r7=1 ( i>=jsbound )
2:
        movi    r2,0
        loop    r7,4f           // for(k=0;k<((i<jsbound)?stereo:1);k++)
        add     r3,r2,r1                // r3=k*32*4+i*4
        addi    r10,r3,local_bit_alloc_byte // r10<=(addr. of bit_alloc[k][i])
        movb    r7,l10                  // r7=bit_alloc[k][i]
        jsr     r28,SUB_update_CRC

        addi    r2,32*4                 // r2=(j++)*32*4
4:
        addi    r1,4                    // r1=(i++)*4
8:
        SET_TrapReg
I_CRC_calc_done:
        j       r26

SUB_II_CRC_calc:
        jsr     r27,SUB_CRC_calc_header

        movb    r11,LBfr_ps_sblimit
        movi    r0,local_ITaloc_idx_byte
        movi    r1,0
        CLR_TrapReg_1
        tsti    r11,0
        beq     6f
        loop    r11,6f                  // for(i=0; i<sblimit(in r11); i++)
        movb    r7,LBfr_ps_stereo       // r7=stereo
        shr     r2,r1,2                 // r2=i
        tstb    r2,LBfr_ps_jsbound      // (i>jsbound)?
        blt     2f                      // branch if i<jsbound
        movi    r7,1                    // r7=1 ( i>=jsbound )
2:
        movi    r2,0
        tsti    r7,0
        beq     4f
        loop    r7,4f           // for(j=0;j<((i<jsbound)?stereo:1);j++)
        add     r3,r2,r1                // r3=j*32*4+i*4
        addi    r10,r3,local_bit_alloc_byte // r10<=(addr. of bit_alloc[j][i])
        movb    r7,l10                  // r7=bit_alloc[j][i]
        shr     r3,r1,2                 // r3=i
        add     r3,r0                   // r3<=(address of table aloc_idx)
        movb    r5,l3                   // r5=aloc_idx[i]
        addi    r3,r5,local_B2Abits     // r3=addr of alloc[i][0].bits
        movb    r6,l3                   // r6=alloc[i][0].bits
        jsr     r28,SUB_update_CRC
        addi    r2,32*4                 // r2=(j++)*32*4
4:
        addi    r1,4                    // r1=(i++)*4
6:
        SET_TrapReg

        movb    r12,LBfr_ps_stereo      // r12=stereo
        movi    r6,2                    // length=2
        movi    r1,0
        CLR_TrapReg_1
        tsti    r11,0
        beq     6f
        loop    r11,6f                  // for(i=0; i<sblimit(in r11); i++)
        movi    r2,0
        tsti    r12,0
        beq     4f
        loop    r12,4f                  // for(k=0;k<stereeo;k++)
        add     r3,r2,r1                // r3=k*32*4+i*4
        addi    r10,r3,local_bit_alloc_byte // r10<=(addr. of bit_alloc[k][i])
        movb    r7,l10                  // r7=bit_alloc[k][i]
        tsti    r7,0
        beq     2f
        addi    r3,local_ITscfsi_byte   // r3<=(addr. of scfsi[k][i])
        movb    r7,l3                   // r7=scfsi[k][i]
        jsr     r28,SUB_update_CRC
2:
        addi    r2,32*4                 // r2=(k++)*32*4
4:
        addi    r1,4                    // r1=(i++)*4
6:
        SET_TrapReg
II_CRC_calc_done:
        j       r26

SUB_CRC_calc_header:
        movi    r8,0xffff               // r8=crc=0xffff

        movi    r6,4                    // r6=length=4
        movb    r7,LBhdr_bitrate_index  // r7=bit_rate_index
        jsr     r28,SUB_update_CRC

        movi    r6,2                    // r6=length=2
        movb    r7,LBhdr_sampling_frequency     // r7=sampling_frequency
        jsr     r28,SUB_update_CRC

        movi    r6,1                    // r6=length=1
        movb    r7,LBhdr_padding        // r7=padding
        jsr     r28,SUB_update_CRC

        movi    r6,1                    // r6=length=1
        movb    r7,LBhdr_extension      // r7=extension
        jsr     r28,SUB_update_CRC

        movi    r6,2                    // r6=length=2
        movb    r7,LBhdr_mode           // r7=mode
        jsr     r28,SUB_update_CRC

        movi    r6,2                    // r6=length=2
        movb    r7,LBhdr_mode_ext       // r7=mode_ext
        jsr     r28,SUB_update_CRC

        movi    r6,1                    // r6=length=1
        movb    r7,LBhdr_copyright      // r7=copyright
        jsr     r28,SUB_update_CRC

        movi    r6,1                    // r6=length=1
        movb    r7,LBhdr_original       // r7=original
        jsr     r28,SUB_update_CRC

        movi    r6,2                    // r6=length=2
        movb    r7,LBhdr_emphasis       // r7=emphasis
        jsr     r28,SUB_update_CRC

CRC_calc_header_done:
        j       r27

SUB_update_CRC:                 // r6=length, r7=data, r8=crc
        movi    r5,1            // r5=1
        shlv    r5,r6           // r5=masking=1<<length
1:
        shr     r5,1            // r5=masking>>=1
        tsti    r5,0
        beq     4f              // while((masking>>1))
        andi    r9,r8,0x8000    // r9=carry=crc*0x8000
        tsti    r9,0
        beq     5f
        movi    r9,1            // r9=!carry
5:
        shl     r8,1            // crc<<=1
        and     r10,r7,r5       // r10=data&masking
        tsti    r10,0
        beq     5f
        movi    r10,1           // r10=!(data&masking)
5:
        xor     r9,r10          // r9=!carry^!(data&masking)
        tsti    r9,0
        beq     2f
        xori    r8,CRC16_POLYNOMIAL
2:
        j       1b
4:
        andi    r8,0xffff
update_CRC_done:
        j       r28

SUB_I_decode_bitalloc:
        movb    r10,LBfr_ps_jsbound
        movb    r9,LBfr_ps_stereo
        movi    r0,local_ITaloc_idx_byte
	tsti	r9,0
        beq     I_dec_ba_020
	tsti	r10,0
        beq     I_dec_ba_020
        movi    r1,0
        CLR_TrapReg
        loop    r10,I_dec_ba_020        // for(i=0;i<jsbound;i++)
        movi    r2,0
        loop    r9,I_dec_ba_010         // for(j=0;j<stereo;j++)
        gbi     r4,4
        shl     r3,r2,5                 // r3=j*32
        add     r3,r1                   // r3=j*32+i
	shl	r3,2
        addi    r3,local_bit_alloc_byte // r3<=(addr. of bit_alloc[j][i])
	mov	AGRAdr4,r3
        addi    r2,1                    // r2=j++
	mov	a4(0),r4
I_dec_ba_010:
        addi    r1,1                    // r1=i++
I_dec_ba_020:
        SET_TrapReg
        rsubi   r10,SBLIMIT             // r10=SBLIMIT-jsbound(r10)
        bz      I_dec_ba_050
	tsti	r9,0
        beq     I_dec_ba_050
        CLR_TrapReg
        loop    r10,I_dec_ba_050        // for(i=jsbound;i<SBLIMIT;i++)
        gbi     r4,4
        movi    r2,0
        loop    r9,I_dec_ba_040         // for(j=0;j<stereo;j++)
        shl     r3,r2,5                 // r3=j*32
        add     r3,r1                   // r3=j*32+i
	shl	r3,2
        addi    r3,local_bit_alloc_byte // r3<=(addr. of bit_alloc[j][i])
	mov	AGRAdr4,r3
        addi    r2,1                    // r2=j++
	mov	a4(0),r4
I_dec_ba_040:
        addi    r1,1                    // r1=i++
I_dec_ba_050:
        SET_TrapReg
I_decode_bitalloc_done:
        j       r26

SUB_I_decode_scale:
        movb    r9,LBfr_ps_stereo
        /* decode scale_index[j][k][i] */
	tsti	r9,0
        beq     I_dec_sc_060
        movi    r1,0
        CLR_TrapReg
        loop    SBLIMIT,I_dec_sc_060    // for(i=0;i<SBLIMIT;i++)
        movi    r2,0
        loop    r9,I_dec_sc_050         // for(j=0;j<stereo;j++)
        shl     r3,r2,5                 // r3=j*32
        add     r3,r1                   // r3=j*32+i
	shl	r3,2
        addi    r10,r3,local_bit_alloc_byte // r10<=(addr. of bit_alloc[j][i])
        movb    r4,l10                  // r4=bit_alloc[j][i]
        multi   r10,r2,3*32             // r10=j*3*32
	nop
        add     r10,r1                  // r10=j*3*32+i
	shl	r10,2			// r10=(j*3*32+i)*4
	addi	r10,local_scale_index_byte
	mov	AGRAdr4,r10
        tsti    r4,0
        beq     I_dec_sc_054            // branch if bit_alloc[j][i]==0
        gbi     r4,6
	nop
        mov     a4(0),r4                // load scale_index[j][0][i]
        j       I_dec_sc_058
I_dec_sc_054:                           // else
        movi    r4,SCALE_RANGE-1
        mov     a4(0),r4                // load scale_index[j][0][i]
I_dec_sc_058:
        addi    r2,1                    // r2=j++
I_dec_sc_050:
        addi    r1,1                    // r1=i++
I_dec_sc_060:
        SET_TrapReg
I_decode_scale_done:
        j       r26

SUB_I_buffer_sample:
	movi	AGRSiz4,0xffff
	movi	AGRSiz5,0xffff
        movb    r8,LBfr_ps_jsbound
        movb    r9,LBfr_ps_stereo
        movi    r1,0
        tsti    r9,0
        beq     I_buffer_sample_done
        CLR_TrapReg
        loop    r8,I_buf_sp_100         // for(i=0;i<jsbound;i++)
        movi    r2,0
        loop    r9,I_buf_sp_090         // for(j=0;j<stereo;j++)
        shl     r3,r2,5                 // r3=j*32
        add     r3,r1                   // r3=j*32+i
        shl     r3,2                    // r3=(j*32+i)*4
        addi    r10,r3,local_bit_alloc_byte // r10<=(addr. of bit_alloc[j][i])
        multi   r5,r2,3*32              // r5=j*3*32
        movb    r4,l10                  // r4=bit_alloc[j][i]
        add     r5,r1                   // r5=j*3*32+i
        shl     r5,2                    // r5=(j*3*32+i)*4
        addi    r5,local_sample_byte    // r5=addr. of sample[j][0][i]
        mov     AGRAdr4,r5
        movi    r3,0
        tsti    r4,0
        beq     I_buf_sp_080            // branch if bit_alloc[j][i]==0
        addi    r4,1                    // r4=k+1
        gb      r3,r4
        nop
I_buf_sp_080:                           // else (bit_alloc[j][i]=0)
        mov     a4(0),r3                // load sample[j][m][i]
        addi    r2,1                    // r2=j++
I_buf_sp_090:
        addi    r1,1                    // r1=i++
I_buf_sp_100:
        SET_TrapReg
        rsubi   r10,r8,SBLIMIT          // r10=SBLIMIT-jsbound(r8)
        beq     I_buffer_sample_done
        shl     r1,2                    // r1=jsbound*4
        CLR_TrapReg
        loop    r10,6f                  // for(i=jsbound;i<SBLIMIT;i++)
        addi    r10,r1,local_bit_alloc_byte
                                        // r10<=(addr. of bit_alloc[0][i])
        addi    r5,r1,local_sample_byte // r5=addr. of sample[0][0][i]
        mov     AGRAdr4,r5
        movb    r4,l10                  // r4=bit_alloc[0][i]
        tsti    r4,0
        movi    r3,0
        beq     1f
        addi    r4,1                    // r4=k+1
        gb      r3,r4                   // r3=s=getbits(bs,k+1)
1:
        loop    r9,4f                   // for(j=0;j<stereo;j++)
        mov     a4(32*2),r3             // load/clear sample[j][0][i]
        mov     r4,a4(32*2)             // dumi
        mov     r4,a4(32*2)             // dumi
        mov     r4,a4(32*2)             // dumi
        mov     r4,a4(32*2)             // dumi
        mov     r4,a4(32*2)             // dumi a4(2*3*32*4)
4:
        addi    r1,4                    // r1=(i++)*4
6:
        SET_TrapReg
I_buffer_sample_done:
        j       r26



SUB_II_decode_bitalloc:
        movb    r10,LBfr_ps_jsbound
        movb    r9,LBfr_ps_stereo
        movi    r0,local_ITaloc_idx_byte
	tsti	r9,0
	beq	II_dec_ba_020
	tsti	r10,0
	beq	II_dec_ba_020
        movi    r1,0
        CLR_TrapReg
        loop    r10,II_dec_ba_020       // for(i=0;i<jsbound;i++)
        movi    r2,0
        loop    r9,II_dec_ba_010        // for(j=0;j<stereo;j++)
        add     r4,r0,r1                // r4<=(address of table aloc_idx)
        movb    r3,l4
        addi    r4,r3,local_B2Abits
        movb    r3,l4                   // r3=alloc[i][0].bits
        gb      r4,r3

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -