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

📄 idct.asm

📁 离散余玄的数学实现
💻 ASM
字号:
// PRAM offsets
oDGFILT equ 0
oPREFILT equ 1
oPREFILT2 equ 2
oFSGFILT equ 3
oSH_GAIN equ 4
oMED_GRN_THRESH equ 5
oSH_CORE_THRESH equ 6
oSH_CORE_DIV equ 7
oRRCoeff equ 8
oRGCoeff equ 9
oRBCoeff equ 10
oGRCoeff equ 11
oGGCoeff equ 12
oGBCoeff equ 13
oBRCoeff equ 14
oBGCoeff equ 15
oBBCoeff equ 16
oRtoY  equ 17
oRtoU  equ 18
oRtoV  equ 19
oGtoY  equ 20
oGtoU  equ 21
oGtoV  equ 22
oBtoY  equ 23
oBtoU  equ 24
oBtoV  equ 25
oACGain  equ 26
oI0Store equ 30
oI3Store0 equ 31
oI3Store1 equ 32
oS0Store equ 33

//DSPRAM offsets
BAY_BLOCK equ 0
YBLOCK equ (BAY_BLOCK+(32*32))
UBLOCK equ (YBLOCK+512)
VBLOCK equ (UBLOCK+512)
//VBLOCK equ (UBLOCK+128)
DCT_OUT_BUF equ (VBLOCK+512)
RL_OUT_BUF equ (DCT_OUT_BUF+(128*6))
COPY_Y_BUFF equ 0x1200
BAY_WIDTH equ 32
BAY_WIDTH1 equ 33
GAMMA_256 equ 0x1dc0
QTBL_0 equ 0x1f00
QTBL_1 equ 0x1f80
ZZ_TABLE equ 0x1ec0
PROG1_START equ 0x080
PROG2_START equ 0x0A0
DATA1_START equ 0xe0
DATA2_START equ 0xf0
PROG1I_START equ 0xc0
PROG2I_START equ 0xd0
VLOOPCOUNT equ 2	// should be 2 for 320x240
HLOOPCOUNT equ 20	// should be 20 for 320x240
// local variables
// based starting at 0x1800
Y_DC_PRED equ 0x1800
U_DC_PRED equ 0x1802
V_DC_PRED equ 0x1804


// constants for DCT
K6c equ 8866 	// ((sqrt(2) * cos(6*pi/16))* 16384)
K6s equ 21406 	// ((sqrt(2) * sin(6*pi/16))* 16384)
nK6s equ -21406
K3c equ 19265 	// ((sqrt(2) * cos(3*pi/16))* 16384)
K3s equ 12872 	// ((sqrt(2) * sin(3*pi/16))* 16384)
nK3s equ -12872
K1c equ 22725 	// ((sqrt(2) * cos(pi/16))* 16384)
K1s equ 4520 	// ((sqrt(2) * sin(pi/16))* 16384)
nK1s equ -4520
S_5 equ 11585 	// (sqrt(0.5) * 16384) */

main:
	ldc s0,4	//input block is 16bytesX16bytes
	ldc i3,16	//process row first
	stc s0,#oS0STORE
	stc i3,#oI3STORE0		//??
	ldc i0,0	//only for development purpose, put input block at address 0
	
	call idct
	
	nopd

	wait

//Register Usage
//r01:i0, j0 ,... 
//r02:i1, j1 ,...
//r03:...
//r04:...
//r05:...
//r06:...
//r07:i7, j7 ,...
//r08: Not used
//r09: k6c, k3c,...
//r10: K6s, k3s,...
//r11: nK6s, nK3s,...
//r12: S_5


idct:
//**************************************************************************************************************
//*  Parameters
//*	i0: address of input block
//*	#oS0STORE: Block width. s0=5 means block width 32 bytes (s0=4 means width 16 bytes).
//**************************************************************************************************************
	ldc shft,14		// multiplier shift register
	nopd // FAKE OPERAND GET S0 from PRAM, might be 4 or 5 depending if we're in Y or U,V.  ldc s0,4		// index scale factor
	ldc i3,2		// increment between columns
	ldc lpc,2
	stc i0,#oI0STORE
	nopd
	ldc s0,#oS0STORE
	nopd
dct_vert:
	ldc i0,#oI0STORE // RETRIEVE i0		//point to data
	nopd
	ldc lpc,8
dct_horiz:
	//J Phase starts
	ld r0,[i0]				//J0
	ld r1,[i0+4]				//J1
	ld r4,[i0+7]
	ld r12,S_5		
	addsub r0,r1,r0; ld r7,[i0+1]		//L0; L1
	mul r4,r12,r4;   ld r2,[i0+2]		//J4; J2
	mul r7,r12,r7;   ld r3,[i0+6]		//J7; J3
	ld r5,[i0+3]				//J5
	addsub r7,r4,r7; ld r6,[i0+5]		//K4,K7 ;J6
	addsub r7,r5,r7; ld r9,K6c		//L5,L7
	addsub r4,r6,r4; ld r11,nK6s		//L6,L4
	mul r2,r9,r15;	 ld r10,K6s		
	macc r3,r11,r2				//L2
	mul r2,r10,r15;	 ld r9,K3c
	macc r3,r9,r3;	 ld r11,nK3s		//L3
	
	///J, K, L phase done
	///M Phase starts
	
	mul r4,r9,r15;	 ld r10,K3s		
	macc r7,r11,r4;	 			//M4
	mul r4,r10,r15;	 ld r9,K1c
	macc r7,r9,r7;	 ld r11,nK1s		//M7
	
	mul r5,r9,r15;	 ld r10,K1s
	macc r6,r11,r5				//M5
	mul r5,r10,r15
	macc r6,r9,r6				//M6
	nopd					//addsub can not after macc immediately

	addsub r1,r2,r1 		//M2,M1
	addsub r0,r3,r0 		//M3,M0
			
	////M phase ends
	////O phase starts

	addsub r0,r7,r0
	addsub r1,r6,r1; st r0,[i0+0]
	addsub r2,r5,r2; st r7,[i0+7]
	addsub r3,r4,r3; st r1,[i0+1]
	st r6,[i0+6]
	st r2,[i0+2]
	st r5,[i0+5]
	st r3,[i0+3]
	st r4,[i0+4]

	////O phase ends
	
	loop dct_horiz
	addi0		// executed in delay slot

	ldc s0,1		// while s0=1, code inside dct_vert process data row by row
	loop dct_vert
	ldc i3,#oI3STORE0	//GET row increment
	nopd
	ret
	nopd
	//wait

⌨️ 快捷键说明

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