?? idct.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 + -