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

📄 decode.s

📁 关于DVD的MPEG2用的DSP代码,在DSP的实现MPEG的压缩,解压算法.
💻 S
📖 第 1 页 / 共 3 页
字号:
        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
II_dec_ba_010:
        addi    r1,1                    // r1=i++
II_dec_ba_020:
        movb    r8,LBfr_ps_sblimit
        rsub    r10,r10,r8              // r10=sblimit(r8)-jsbound(r10)
	bz	II_dec_ba_030
        loop    r10,II_dec_ba_030        // for(i=jsbound;i<sblimit;i++)
        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
	shl	r3,r1,2
        addi    r3,local_bit_alloc_byte // r3<=(addr. of bit_alloc[j][i])
	mov	AGRAdr4,r3
        addi    r1,1                    // r1=i++
	mov	a4(2*32),r4
	mov	r3,a4(2*32)		// dumi
	mov	a4(0),r4
II_dec_ba_030:
        rsubi   r10,r8,SBLIMIT          // r10=SBLIMIT-sblimit(r8)
	bz	II_dec_ba_050
	tsti	r9,0
	beq	II_dec_ba_050
        movi    r4,0
        loop    r10,II_dec_ba_050       // for(i=sblimit;i<SBLIMIT;i++)
        movi    r2,0
        loop    r9,II_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
II_dec_ba_040:
        addi    r1,1                    // r1=i++
II_dec_ba_050:
        SET_TrapReg
        nop
        nop
II_decode_bitalloc_done:
        j       r26

SUB_II_decode_scale:
#if RHDEBUG
        movi    r3,local_ITscfsi_byte   // r3<=(addr. of scfsi[0][0])
	Mov	AGRAdr4,r3
	movi	r4,0
        CLR_TrapReg
	loop	SBLIMIT,II_dec_sc_dbg	// for(i=0;i<SBLIMIT;i++)
	loop	2,II_dec_sc_dbg		// for(j=0;j<2;j++)
        mov	a4(4),r4		// clear scfsi[j][i]
II_dec_sc_dbg:
        SET_TrapReg
#endif
        movb    r8,LBfr_ps_sblimit
        movb    r9,LBfr_ps_stereo
	tsti	r8,0
	beq	II_dec_sc_020
	tsti	r9,0
	beq	II_dec_sc_020
        /* decode scfsi[j][i] */
        CLR_TrapReg_1
        nop
        movi    r1,0
        loop    r8,II_dec_sc_020        // for(i=0;i<sblimit;i++)
        movi    r2,0
        loop    r9,II_dec_sc_010        // 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]
        tsti    r4,0
        beq     II_dec_sc_002
        gbi     r4,2
        addi    r3,local_ITscfsi_byte   // r3<=(addr. of scfsi[j][i])
	mov	AGRAdr4,r3
	nop
        mov	a4(0),r4                   // load scfsi[j][i]
II_dec_sc_002:
        addi    r2,1                    // r2=j++
II_dec_sc_010:
        addi    r1,1                    // r1=i++
II_dec_sc_020:
        SET_TrapReg
        rsubi   r10,r8,SBLIMIT          // r10=SBLIMIT-sblimit(r8)
	tsti	r10,0
	beq	II_dec_sc_040
	tsti	r9,0
	beq	II_dec_sc_040
        CLR_TrapReg_1
        nop
        movi    r4,0
        loop    r10,II_dec_sc_040       // for(i=sblimit;i<SBLIMIT;i++)
        movi    r2,0
        loop    r9,II_dec_sc_030        // 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_ITscfsi_byte   // r3<=(addr. of scfsi[j][i])
	mov	AGRAdr4,r3
	nop
	mov	a4(0),r4
        addi    r2,1                    // r2=j++
II_dec_sc_030:
        addi    r1,1                    // r1=i++
II_dec_sc_040:
        SET_TrapReg
        /* decode scale_index[j][k][i] */
	tsti	r8,0
	beq	II_dec_sc_060
	tsti	r9,0
	beq	II_dec_sc_060
        CLR_TrapReg_1
        nop
        movi    r1,0
        loop    r8,II_dec_sc_060        // for(i=0;i<sblimit;i++)
        movi    r2,0
        loop    r9,II_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
	nop
	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     II_dec_sc_054           // branch if bit_alloc[j][i]==0
        addi    r3,local_ITscfsi_byte   // r3<=(addr. of scfsi[j][i])
        movb    r4,l3
        tsti    r4,0
        bne     II_dec_sc_051
        gbi     r4,6                    // --- case 0 ---
	nop
	mov	a4(2*32),r4		// load scale_index[j][0][i]
        gbi     r4,6
	mov	r10,a4(2*32)		// dumi
	mov	a4(2*32),r4		// load scale_index[j][1][i]
        gbi     r4,6
	mov	r10,a4(2*32)		// dumi
	mov	a4(0),r4		// load scale_index[j][2][i]
        j       II_dec_sc_058
II_dec_sc_051:
        tsti    r4,1
        bne     II_dec_sc_052
        gbi     r4,6                    // --- case 1 ---
	nop
	mov	a4(2*32),r4		// load scale_index[j][0][i]
	mov	r10,a4(2*32)		// dumi
        mov	a4(2*32),r4             // load scale_index[j][1][i]
        gbi     r4,6 
	mov	r10,a4(2*32)		// dumi
	mov	a4(0),r4		// load scale_index[j][2][i]
        j       II_dec_sc_058
II_dec_sc_052:
        tsti    r4,3
        bne     II_dec_sc_053
        gbi     r4,6                    // --- case 3 ---
	nop
	mov	a4(2*32),r4		// load scale_index[j][0][i]
        gbi     r4,6
	mov	r10,a4(2*32)		// dumi
        mov	a4(2*32),r4             // load scale_index[j][1][i]
	mov	r10,a4(2*32)		// dumi
	mov	a4(0),r4		// load scale_index[j][2][i]
        j       II_dec_sc_058
II_dec_sc_053:
        tsti    r4,2
        bne     II_dec_sc_058
        gbi     r4,6                    // --- case 2 ---
	nop
	mov	a4(2*32),r4		// load scale_index[j][0][i]
	mov	r10,a4(2*32)		// dumi
        mov	a4(2*32),r4             // load scale_index[j][1][i]
	mov	r10,a4(2*32)		// dumi
	mov	a4(0),r4		// load scale_index[j][2][i]
        j       II_dec_sc_058
II_dec_sc_054:                          // else
        movi    r4,SCALE_RANGE-1
	mov	a4(2*32),r4		// load scale_index[j][0][i]
	mov	r10,a4(2*32)		// dumi
        mov	a4(2*32),r4             // load scale_index[j][1][i]
	mov	r10,a4(2*32)		// dumi
	mov	a4(0),r4		// load scale_index[j][2][i]
II_dec_sc_058:
        addi    r2,1                    // r2=j++
II_dec_sc_050:
        addi    r1,1                    // r1=i++
II_dec_sc_060:
        SET_TrapReg
        rsubi   r10,r8,SBLIMIT          // r10=SBLIMIT-sblimit(r8)
	bz	II_dec_sc_080
	tsti	r9,0
	beq	II_dec_sc_080
        movi    r4,SCALE_RANGE-1
        CLR_TrapReg_1
	shl	r3,r1,2
	addi    r3,local_scale_index_byte-(3*32+1)*4
        loop    r10,II_dec_sc_080       // for(i=sblimit;i<SBLIMIT;i++)
	addi	r3,4
	mov	r2,r3
        loop    r9,II_dec_sc_070        // for(j=0;j<stereo;j++)
	addi	r2,3*32*4		// r3=(j*3*32+i)*4
	mov	AGRAdr4,r2
	nop
	mov	a4(2*32),r4		// load scale_index[j][0][i]
	mov	r1,a4(2*32)		// dumi
        mov	a4(2*32),r4             // load scale_index[j][1][i]
	mov	r1,a4(2*32)		// dumi
	mov	a4(0),r4		// load scale_index[j][2][i]
II_dec_sc_070:
II_dec_sc_080:
        SET_TrapReg
II_decode_scale_done:
        j       r26

SUB_II_buffer_sample:
	movi	AGRSiz4,0xffff
	movi	AGRSiz5,0xffff
        movb    r8,LBfr_ps_sblimit
        movb    r9,LBfr_ps_stereo
        movi    r1,0
II_buf_sp_100_loop_start:               // for(i=0; i < sblimit(in r8); i++)
        mov     r7,r9                   // r7=stereo
        tstb    r1,LBfr_ps_jsbound      // (i>jsbound)?
        blt     2f                      // branch if i<jsbound ( r7=stereo )
        movi    r7,1                    // r7=1 ( i>=jsbound )
2:
        movi    r0,local_ITaloc_idx_byte
        movi    r2,0
        CLR_TrapReg_1
        tsti    r7,0
        beq     II_buf_sp_090
        loop    r7,II_buf_sp_090 // for(j=0;j<((i<jsbound)?stereo:1);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
        tsti    r4,0
        beq     II_buf_sp_080           // branch if bit_alloc[j][i]==0
        add     r3,r0,r1                // r3<=(address of table aloc_idx)
        movb    r5,l3                   // r5=aloc_idx[i]
        add     r5,r4                   // r5=aloc_idx[i]+bit_alloc[j][i]
        addi    r3,r5,local_B2Agroup
        movb    r6,l3                   // r6=alloc[i][bit_alloc[j][i]].group
        tsti    r6,3
        bne     II_buf_sp_020	// branch if alloc[i][bit_alloc[j][i]].group!=3
        addi    r3,r5,local_B2Abits     // r3=k=bit_alloc[j][i].bits
        movb    r6,l3                   // r6=alloc[i][bit_alloc[j][i]].bits
        loop    3,II_buf_sp_018         // for(m=0;m<3;m++)
        gb      r3,r6		// getbits(bs,alloc[i][bit_alloc[j][i]].bits)
        mov     a4(2*32),r3             // load sample[j][m][i]
        mov     r3,a4(2*32)             // dumi
II_buf_sp_018:
        j       II_buf_sp_088
II_buf_sp_020:                          // else (bit_alloc[j][i].group!=3)
	shl	r3,r5,1			// offset for half data
        addi    r3,local_I2Asteps
        movh    r4,l3                   // r4=nlevels=bit_alloc[j][i].steps
        addi    r3,r5,local_B2Abits
        movb    r6,l3                   // r6=k=bit_alloc[j][i].bits
#ifdef	EFFECT
	shl	r5,r2,6			//2*32
	shl	r3,r2,5			//1*32
	add	r5,r3			//3*32
#else	//EFFECT
	multi	r5,r2,3*32		// r5=j*3*32
        nop
        nop
        nop
#endif	//EFFECT
        gb      r3,r6                   // r3=c=getbits(bs,k)
        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
        shl     r4,15   // shift divisor (nlevels) left by 15
        loop    3,II_buf_sp_028         // for(k=0;k<3;k++)
	loop	16,5f			// division loop
        sub	r5,r3,r4                // ACC-[dma*(2^15)]
        bgte    1f			// branch if result positive
        shl     r5,r3,1                 // shift dividend left by 1
	j	2f
1:
        shl     r5,1                    // shift dividend left by 1
        addi	r5,1                    // set LSB to 1
2:
        mov     r3,r5                   // save dividend
5:
        andi    r3,r5,0xffff    // mask lower half (quotient) into r3
        shr     r10,r5,16       // shift upper half (remainder) into r10
        mov     a4(2*32),r10            // load sample[j][k][i]
	mov	r10,a4(2*32)		// dumi
II_buf_sp_028:
        j       II_buf_sp_088
II_buf_sp_080:                          // else (bit_alloc[j][i]=0)
        movi    r10,0
        loop    3,II_buf_sp_088         // for(k=0;k<3;k++)
        mov     a4(2*32),r10            // clear sample[j][k][i]
        mov     r4,a4(2*32)		// dumi
II_buf_sp_088:
        movb    r4,LBfr_ps_stereo
        tsti    r4,2
        bne     2f                      // b if stereo != 2
        tstb    r1,LBfr_ps_jsbound
        blt     2f                      // b if i < jsbound
        shl     r5,r1,2                 // r5=i*4
        addi    r5,local_sample_byte    // r5=addr. of sample[0][0][i]
        mov     AGRAdr4,r5
        addi    r5,3*32*4               // r5=addr. of sample[1][0][i]
        mov     AGRAdr5,r5
        loop    3,2f                    // for(k=0;k<3;k++)
        mov     r5,a4(2*32)             // clear sample[0][k][i]
        mov     r4,a4(2*32)             // dumi
        mov     a5(2*32),r5             // sample[1][k][i] = sample[0][k][i]
        mov     r4,a5(2*32)             // dumi
2:
        addi    r2,1                    // r2=j++
II_buf_sp_090:
        SET_TrapReg
        addi    r1,1                    // r1=i++
	tst	r1,r8
	blt	II_buf_sp_100_loop_start	// loop if i<sblimit (r8)
II_buf_sp_100:
        rsubi   r10,r8,SBLIMIT          // r10=SBLIMIT-sblimit(r8)
        tsti    r10,0
        beq     II_buffer_sample_done
        tsti    r9,0
        beq     II_buffer_sample_done
        shl     r5,r1,2
        addi    r5,local_sample_byte    // r5=addr. of sample[0][0][sblimit]
        CLR_TrapReg
#ifdef	EFFECT
	movi	r3,0
#endif	//EFFECT
        loop    r10,6f                  // for(i=sblimit;i<SBLIMIT;i++)
        movi    r2,0
        loop    r9,4f                   // for(j=0;j<stereo;j++)
#ifdef	EFFECT
	shl	r5,r2,6			//2*32
	shl	r4,r2,5			//1*32
	add	r5,r4
#else	//EFFECT
	multi   r5,r2,3*32              // r5=j*3*32
        nop
        nop
        nop
        movi    r3,0
#endif	//EFFECT
        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
        loop    3,2f                    // for(k=0;k<3;k++)
        mov     a4(2*32),r3             // clear sample[j][k][i]
        mov     r5,a4(2*32)             // dumi
2:
        addi    r2,1                    // r2=j++
4:
        addi    r1,1                    // r1=i++
6:
        SET_TrapReg
II_buffer_sample_done:
        j       r26

⌨️ 快捷键说明

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