www.pudn.com > jpeg1.zip > IDCT.ASM
.8086
include MACROS.ASM
;======================================
_JPEG_TEXT segment para public 'CODE'
DGROUP group _DATA,_BSS
assume cs:_JPEG_TEXT,ds:DGROUP
_JPEG_TEXT ends
_DATA segment word public 'DATA'
d@ label byte
d@w label word
_DATA ends
_BSS segment word public 'BSS'
b@ label byte
b@w label word
_BSS ends
_DATA SEGMENT WORD PUBLIC 'DATA'
s@ label byte
X1 DD 64 DUP ( ? )
X2 DD 64 DUP ( ? )
LH_DENIST DW 64 DUP ( ? )
COUNTOR1 DW ?
COUNT2 DW ?
COUNT3 DW ?
STEP DW ?
DIMENSION_X DW ?
DIMENSION_Y DW ?
DC_BASE DW 0
DC_Y DW ?
DC_CR DW ?
DC_CB DW ?
COLOR_Y DW ?
COLOR_CR DW ?
COLOR_CB DW ?
LOC_Y DW ?
LOC_CR DW ?
LOC_CB DW ?
LOCATION DW 0
CODE_BUFF DW ?
SOURCE DW ?
IDCT_SUB DW IDCT_2D
IDCT_87 DW IDCT_2D_87
SCRATCH DW ?
NUM DW 10000
MUL_TEMP DB 6 DUP ( ?)
TMP0 DD ?
TMP1 DD ?
TMP2 DD ?
TMP3 DD ?
CONST01 DD 1.96157056080646
CONST11 DD 1.662939222460509
CONST22 DD 0.390180644032257
CONST33 DD 1.1111404660392
CONST44 DD 1.84775906502257
CONST55 DD 0.76536686473018
CONST66 DD 1.41421356237309504880
CONST77 DD 2.82842712474619009760
INT_4 DW 4
INT_2 DW 2
INT_64 DW 64
INT_32 DW 32
CONST0 DD 7F7B14BEH ;1.96157056080646
CONST1 DD 7F54DB31H ;1.662939222460509
CONST2 DD 7D47C5C1H ;0.390180644032257
CONST3 DD 7F0E39D9H ;1.1111404660392
CONST4 DD 7F6C835EH ;1.84775906502257
CONST5 DD 7E43EF15H ;0.76536686473018
CONST6 DD 7F3504F3H ;1.41421356237309504880
CONST7 DD 803504F3H ;2.82842712474619009760
NEWS DD 2 DUP(?)
EOB EQU 0FFH
DECODE_CURRENT_LOCATION DB 32
DECODE_LOCATION DW 1
CURRENT_CODE DD ?
IDC_TABLE DB 64 DUP (0FFH,0FFH,00H,00H,05H,03H,00H,00H)
DB 32 DUP (0FFH,0FFH,00H,00H,03H,00H,00H,00H)
DB 32 DUP (0FFH,0FFH,00H,00H,04H,01H,00H,00H)
DB 32 DUP (0FFH,0FFH,00H,00H,05H,02H,00H,00H)
DB 32 DUP (0FFH,0FFH,00H,00H,07H,04H,00H,00H)
DB 32 DUP (0FFH,0FFH,00H,00H,08H,05H,00H,00H)
DB 16 DUP (0FFH,0FFH,00H,00H,0AH,06H,06H,00H)
DB 08 DUP (0FFH,0FFH,00H,00H,0CH,07H,00H,00H)
DB 04 DUP (0FFH,0FFH,00H,00H,0EH,08H,00H,00H)
DB 02 DUP (0FFH,0FFH,00H,00H,10H,09H,00H,00H)
DB 01 DUP (0FFH,0FFH,00H,00H,12H,0AH,00H,00H)
DB 01 DUP (000H,0FFH,00H,00H,14H,0BH,00H,00H)
IDC_CHRO DB 64 DUP (0FFH,0FFH,00H,00H,02H,00H,00H,00H)
DB 64 DUP (0FFH,0FFH,00H,00H,03H,01H,00H,00H)
DB 64 DUP (0FFH,0FFH,00H,00H,04H,02H,00H,00H)
DB 32 DUP (0FFH,0FFH,00H,00H,06H,03H,00H,00H)
DB 16 DUP (0FFH,0FFH,00H,00H,08H,04H,00H,00H)
DB 08 DUP (0FFH,0FFH,00H,00H,0AH,05H,00H,00H)
DB 04 DUP (0FFH,0FFH,00H,00H,0CH,06H,00H,00H)
DB 02 DUP (0FFH,0FFH,00H,00H,0EH,07H,00H,00H)
DB 01 DUP (0FFH,0FFH,00H,00H,10H,08H,00H,00H)
DW 01 DUP (0FFH,IDC_CHRO_2,0FFH,0FFH)
IDC_CHRO_2 DB 128 DUP (0FFH,0FFH,00H,00H,12H,09H,00H,00H)
DB 64 DUP (0FFH,0FFH,00H,00H,14H,0AH,00H,00H)
DB 32 DUP (0FFH,0FFH,00H,00H,16H,0BH,00H,00H)
DECODE_TABLE DB 64 DUP (0FFH,0FFH,0H,1H,3H,1H,0H,0H);0/1
DB 64 DUP (0FFH,0FFH,0H,2H,4H,2H,0H,0H);0/2
DB 32 DUP (0FFH,0FFH,0H,3H,6H,3H,0H,0H);0/3
DB 16 DUP (000H,000H,0H,0H,4H,0H,0H,0H);0/0
DB 16 DUP (0FFH,0FFH,0H,4H,8H,4H,0H,0H);0/4
DB 16 DUP (0FFH,0FFH,1H,1H,5H,1H,0H,0H);1/1
DB 08 DUP (0FFH,0FFH,0H,5H,0AH,5H,0H,0H);0/5
DB 08 DUP (0FFH,0FFH,2H,1H,6H,1H,0H,0H);2/1
DB 04 DUP (0FFH,0FFH,0H,6H,0CH,6H,0H,0H);0/6
DB 04 DUP (0FFH,0FFH,1H,2H,8H,2H,0H,0H);1/2
DB 04 DUP (0FFH,0FFH,3H,1H,7H,1H,0H,0H);3/1
DB 04 DUP (0FFH,0FFH,4H,1H,7H,1H,0H,0H);4/1
DB 02 DUP (0FFH,0FFH,0H,7H,0EH,7H,0H,0H);0/7
DB 02 DUP (0FFH,0FFH,1H,3H,0AH,3H,0H,0H);1/3
DB 02 DUP (0FFH,0FFH,5H,1H,8H,1H,0H,0H);5/1
DB 02 DUP (0FFH,0FFH,6H,1H,8H,1H,0H,0H);6/1
DB 01 DUP (0FFH,0FFH,2H,2H,0AH,2H,0H,0H);2/2
DB 01 DUP (0FFH,0FFH,7H,1H,9H,1H,0H,0H);7/1
DB 01 DUP (0FFH,0FFH,8H,1H,9H,1H,0H,0H);8/1
;-1-1--1-1-11-1--11--1-1-1-1-11--1-1-1
DW 0FFH,A1,0,0;1/4
DW 0FFH,A2,0,0;9/1
DW 0FFH,A3,0,0;0/8
DW 0FFH,A4,0,0;1/5
DW 0FFH,A5,0,0;0/9
;-------------------- 1 LEVEL ---------------------
;1111'1011
A1 DB 128 DUP (0FFH,0FFH,1H,4H,0DH,4H,0H,0H);1/4
DB 128 DUP (0FFH,0FFH,3H,2H,0BH,2H,0H,0H);3/2
;1111'1100
A2 DB 128 DUP (0FFH,0FFH,9H,1H,0AH,1H,0H,0H);9/1
DB 128 DUP (0FFH,0FFH,0AH,1H,0AH,1H,0H,0H);A/1
;1111'1101
A3 DB 128 DUP (0FFH,0FFH,0BH,1H,0AH,1H,0H,0H);B/1
DB 64 DUP (0FFH,0FFH,0H,8H,12H,8H,0H,0H);0/8
DB 64 DUP (0FFH,0FFH,2H,3H,0DH,3H,0H,0H);2/3
;1111'1110
A4 DB 64 DUP (0FFH,0FFH,4H,2H,0CH,2H,0H,0H);4/2
DB 64 DUP (0FFH,0FFH,5H,2H,0CH,2H,0H,0H);5/2
DB 64 DUP (0FFH,0FFH,0CH,1H,0BH,1H,0H,0H);C/1
DB 32 DUP (0FFH,0FFH,1H,5H,10H,5H,0H,0H);1/5
DB 32 DUP (0FFH,0FFH,3H,3H,0EH,3H,0H,0H);3/3
;1111'1111
A5 DB 32 DUP (0FFH,0FFH,6H,2H,0DH,2H,0H,0H);6/2
DB 32 DUP (0FFH,0FFH,7H,2H,0DH,2H,0H,0H);7/2
DB 32 DUP (0FFH,0FFH,0DH,1H,0CH,1H,0H,0H);D/1
DB 16 DUP (0FFH,0FFH,0EH,1H,0DH,1H,0H,0H);E/1
DB 16 DUP (0FFH,0FFH,0FH,0H,0CH,0H,0H,0H);F/0
DB 02 DUP (0FFH,0FFH,8H,2H,11H,2H,0H,0H);8/2
DB 01 DUP (0FFH,0FFH,0H,9H,19H,9H,0H,0H);0/9
DB 01 DUP (0FFH,0FFH,0H,0AH,1AH,0AH,0H,0H);0/A
DB 01 DUP (0FFH,0FFH,1H,6H,16H,6H,0H,0H);1/6
DB 01 DUP (0FFH,0FFH,1H,7H,17H,7H,0H,0H);1/7
DB 01 DUP (0FFH,0FFH,1H,8H,18H,8H,0H,0H);1/8
DB 01 DUP (0FFH,0FFH,1H,9H,19H,9H,0H,0H);1/9
DB 01 DUP (0FFH,0FFH,1H,0AH,1AH,0AH,0H,0H);1/A
DB 01 DUP (0FFH,0FFH,2H,4H,14H,4H,0H,0H);2/4
DB 01 DUP (0FFH,0FFH,2H,5H,15H,5H,0H,0H);2/5
DB 01 DUP (0FFH,0FFH,2H,6H,16H,6H,0H,0H);2/6
DB 01 DUP (0FFH,0FFH,2H,7H,17H,7H,0H,0H);2/7
DB 01 DUP (0FFH,0FFH,2H,8H,18H,8H,0H,0H);2/8
DB 01 DUP (0FFH,0FFH,2H,9H,19H,9H,0H,0H);2/9
DB 01 DUP (0FFH,0FFH,2H,0AH,1AH,0AH,0H,0H);2/A
DB 01 DUP (0FFH,0FFH,3H,4H,14H,4H,0H,0H);3/4
DB 01 DUP (0FFH,0FFH,3H,5H,15H,5H,0H,0H);3/5
DB 01 DUP (0FFH,0FFH,3H,6H,16H,6H,0H,0H);3/6
DB 01 DUP (0FFH,0FFH,3H,7H,17H,7H,0H,0H);3/7
DB 01 DUP (0FFH,0FFH,3H,8H,18H,8H,0H,0H);3/8
DB 01 DUP (0FFH,0FFH,3H,9H,19H,9H,0H,0H);3/9
DB 01 DUP (0FFH,0FFH,3H,0AH,1AH,0AH,0H,0H);3/A
DB 01 DUP (0FFH,0FFH,4H,3H,13H,3H,0H,0H);4/3
DB 01 DUP (0FFH,0FFH,4H,4H,14H,4H,0H,0H);4/4
DB 01 DUP (0FFH,0FFH,4H,5H,15H,5H,0H,0H);4/5
DB 01 DUP (0FFH,0FFH,4H,6H,16H,6H,0H,0H);4/6
DB 01 DUP (0FFH,0FFH,4H,7H,17H,7H,0H,0H);4/7
DB 01 DUP (0FFH,0FFH,4H,8H,18H,8H,0H,0H);4/8
DB 01 DUP (0FFH,0FFH,4H,9H,19H,9H,0H,0H);4/9
DB 01 DUP (0FFH,0FFH,4H,0AH,1AH,0AH,0H,0H);4/A
DB 01 DUP (0FFH,0FFH,5H,3H,13H,3H,0H,0H);5/3
DB 01 DUP (0FFH,0FFH,5H,4H,14H,4H,0H,0H);5/4
DB 01 DUP (0FFH,0FFH,5H,5H,15H,5H,0H,0H);5/5
DB 01 DUP (0FFH,0FFH,5H,6H,16H,6H,0H,0H);5/6
DB 01 DUP (0FFH,0FFH,5H,7H,17H,7H,0H,0H);5/7
DB 01 DUP (0FFH,0FFH,5H,8H,18H,8H,0H,0H);5/8
DB 01 DUP (0FFH,0FFH,5H,9H,19H,9H,0H,0H);5/9
DB 01 DUP (0FFH,0FFH,5H,0AH,1AH,0AH,0H,0H);5/A
DB 01 DUP (0FFH,0FFH,6H,3H,13H,3H,0H,0H);6/3
DB 01 DUP (0FFH,0FFH,6H,4H,14H,4H,0H,0H);6/4
DB 01 DUP (0FFH,0FFH,6H,5H,15H,5H,0H,0H);6/5
DB 01 DUP (0FFH,0FFH,6H,6H,16H,6H,0H,0H);6/6
DB 01 DUP (0FFH,0FFH,6H,7H,17H,7H,0H,0H);6/7
DB 01 DUP (0FFH,0FFH,6H,8H,18H,8H,0H,0H);6/8
DB 01 DUP (0FFH,0FFH,6H,9H,19H,9H,0H,0H);6/9
DB 01 DUP (0FFH,0FFH,6H,0AH,1AH,0AH,0H,0H);6/A
DB 01 DUP (0FFH,0FFH,7H,3H,13H,3H,0H,0H);7/3
DB 01 DUP (0FFH,0FFH,7H,4H,14H,4H,0H,0H);7/4
DB 01 DUP (0FFH,0FFH,7H,5H,15H,5H,0H,0H);7/5
DB 01 DUP (0FFH,0FFH,7H,6H,16H,6H,0H,0H);7/6
DB 01 DUP (0FFH,0FFH,7H,7H,17H,7H,0H,0H);7/7
DB 01 DUP (0FFH,0FFH,7H,8H,18H,8H,0H,0H);7/8
DB 01 DUP (0FFH,0FFH,7H,9H,19H,9H,0H,0H);7/9
DB 01 DUP (0FFH,0FFH,7H,0AH,1AH,0AH,0H,0H);7/A
DB 01 DUP (0FFH,0FFH,8H,3H,13H,3H,0H,0H);8/3
DB 01 DUP (0FFH,0FFH,8H,4H,14H,4H,0H,0H);8/4
DB 01 DUP (0FFH,0FFH,8H,5H,15H,5H,0H,0H);8/5
DB 01 DUP (0FFH,0FFH,8H,6H,16H,6H,0H,0H);8/6
DB 01 DUP (0FFH,0FFH,8H,7H,17H,7H,0H,0H);8/7
DB 01 DUP (0FFH,0FFH,8H,8H,18H,8H,0H,0H);8/8
DB 01 DUP (0FFH,0FFH,8H,9H,19H,9H,0H,0H);8/9
DB 01 DUP (0FFH,0FFH,8H,0AH,1AH,0AH,0H,0H);8/A
DB 01 DUP (0FFH,0FFH,9H,2H,12H,2H,0H,0H);9/2
DB 01 DUP (0FFH,0FFH,9H,3H,13H,3H,0H,0H);9/3
DB 01 DUP (0FFH,0FFH,9H,4H,14H,4H,0H,0H);9/4
DB 01 DUP (0FFH,0FFH,9H,5H,15H,5H,0H,0H);9/5
DB 01 DUP (0FFH,0FFH,9H,6H,16H,6H,0H,0H);9/6
DB 01 DUP (0FFH,0FFH,9H,7H,17H,7H,0H,0H);9/7
DB 01 DUP (0FFH,0FFH,9H,8H,18H,8H,0H,0H);9/8
DB 01 DUP (0FFH,0FFH,9H,9H,19H,9H,0H,0H);9/9
DB 01 DUP (0FFH,0FFH,9H,0AH,1AH,0AH,0H,0H);9/A
DB 01 DUP (0FFH,0FFH,0AH,2H,12H,2H,0H,0H);A/2
DB 01 DUP (0FFH,0FFH,0AH,3H,13H,3H,0H,0H);A/3
DB 01 DUP (0FFH,0FFH,0AH,4H,14H,4H,0H,0H);A/4
DB 01 DUP (0FFH,0FFH,0AH,5H,15H,5H,0H,0H);A/5
DB 01 DUP (0FFH,0FFH,0AH,6H,16H,6H,0H,0H);A/6
DB 01 DUP (0FFH,0FFH,0AH,7H,17H,7H,0H,0H);A/7
DB 01 DUP (0FFH,0FFH,0AH,8H,18H,8H,0H,0H);A/8
DB 01 DUP (0FFH,0FFH,0AH,9H,19H,9H,0H,0H);A/9
DB 01 DUP (0FFH,0FFH,0AH,0AH,1AH,0AH,0H,0H);A/A
DB 01 DUP (0FFH,0FFH,0BH,2H,12H,2H,0H,0H);B/2
DB 01 DUP (0FFH,0FFH,0BH,3H,13H,3H,0H,0H);B/3
DB 01 DUP (0FFH,0FFH,0BH,4H,14H,4H,0H,0H);B/4
DB 01 DUP (0FFH,0FFH,0BH,5H,15H,5H,0H,0H);B/5
DB 01 DUP (0FFH,0FFH,0BH,6H,16H,6H,0H,0H);B/6
DB 01 DUP (0FFH,0FFH,0BH,7H,17H,7H,0H,0H);B/7
DB 01 DUP (0FFH,0FFH,0BH,8H,18H,8H,0H,0H);B/8
DB 01 DUP (0FFH,0FFH,0BH,9H,19H,9H,0H,0H);B/9
DB 01 DUP (0FFH,0FFH,0BH,0AH,1AH,0AH,0H,0H);B/A
DB 01 DUP (0FFH,0FFH,0CH,2H,12H,2H,0H,0H);C/2
DB 01 DUP (0FFH,0FFH,0CH,3H,13H,3H,0H,0H);C/3
DB 01 DUP (0FFH,0FFH,0CH,4H,14H,4H,0H,0H);C/4
DB 01 DUP (0FFH,0FFH,0CH,5H,15H,5H,0H,0H);C/5
DB 01 DUP (0FFH,0FFH,0CH,6H,16H,6H,0H,0H);C/6
DB 01 DUP (0FFH,0FFH,0CH,7H,17H,7H,0H,0H);C/7
DB 01 DUP (0FFH,0FFH,0CH,8H,18H,8H,0H,0H);C/8
DB 01 DUP (0FFH,0FFH,0CH,9H,19H,9H,0H,0H);C/9
DB 01 DUP (0FFH,0FFH,0CH,0AH,1AH,0AH,0H,0H);C/A
DB 01 DUP (0FFH,0FFH,0DH,2H,12H,2H,0H,0H);D/2
DB 01 DUP (0FFH,0FFH,0DH,3H,13H,3H,0H,0H);D/3
DB 01 DUP (0FFH,0FFH,0DH,4H,14H,4H,0H,0H);D/4
DB 01 DUP (0FFH,0FFH,0DH,5H,15H,5H,0H,0H);D/5
DB 01 DUP (0FFH,0FFH,0DH,6H,16H,6H,0H,0H);D/6
DB 01 DUP (0FFH,0FFH,0DH,7H,17H,7H,0H,0H);D/7
DB 01 DUP (0FFH,0FFH,0DH,8H,18H,8H,0H,0H);D/8
DB 01 DUP (0FFH,0FFH,0DH,9H,19H,9H,0H,0H);D/9
DB 01 DUP (0FFH,0FFH,0DH,0AH,1AH,0AH,0H,0H);D/A
DB 01 DUP (0FFH,0FFH,0EH,2H,12H,2H,0H,0H);E/2
DB 01 DUP (0FFH,0FFH,0EH,3H,13H,3H,0H,0H);E/3
DB 01 DUP (0FFH,0FFH,0EH,4H,14H,4H,0H,0H);E/4
DB 01 DUP (0FFH,0FFH,0EH,5H,15H,5H,0H,0H);E/5
DB 01 DUP (0FFH,0FFH,0EH,6H,16H,6H,0H,0H);E/6
DB 01 DUP (0FFH,0FFH,0EH,7H,17H,7H,0H,0H);E/7
DB 01 DUP (0FFH,0FFH,0EH,8H,18H,8H,0H,0H);E/8
DB 01 DUP (0FFH,0FFH,0EH,9H,19H,9H,0H,0H);E/9
DB 01 DUP (0FFH,0FFH,0EH,0AH,1AH,0AH,0H,0H);E/A
DB 01 DUP (0FFH,0FFH,0FH,1H,11H,1H,0H,0H);F/1
DB 01 DUP (0FFH,0FFH,0FH,2H,12H,2H,0H,0H);F/2
DB 01 DUP (0FFH,0FFH,0FH,3H,13H,3H,0H,0H);F/3
DB 01 DUP (0FFH,0FFH,0FH,4H,14H,4H,0H,0H);F/4
DB 01 DUP (0FFH,0FFH,0FH,5H,15H,5H,0H,0H);F/5
DB 01 DUP (0FFH,0FFH,0FH,6H,16H,6H,0H,0H);F/6
DB 01 DUP (0FFH,0FFH,0FH,7H,17H,7H,0H,0H);F/7
DB 01 DUP (0FFH,0FFH,0FH,8H,18H,8H,0H,0H);F/8
DB 01 DUP (0FFH,0FFH,0FH,9H,19H,9H,0H,0H);F/9
DB 01 DUP (0FFH,0FFH,0FH,0AH,1AH,0AH,0H,0H);F/A
IAC_CHRO_TABLE DB 64 DUP (000H,000H,0H,0H,2H,0H,0H,0H);0/0
DB 64 DUP (0FFH,0FFH,0H,1H,3H,1H,0H,0H);0/1
DB 32 DUP (0FFH,0FFH,0H,2H,5H,2H,0H,0H);0/2
DB 16 DUP (0FFH,0FFH,0H,3H,7H,3H,0H,0H);0/3
DB 16 DUP (0FFH,0FFH,1H,1H,5H,1H,0H,0H);1/1
DB 08 DUP (0FFH,0FFH,0H,4H,9H,4H,0H,0H);0/4
DB 08 DUP (0FFH,0FFH,0H,5H,0AH,5H,0H,0H);0/5
DB 08 DUP (0FFH,0FFH,2H,1H,6H,1H,0H,0H);2/1
DB 08 DUP (0FFH,0FFH,3H,1H,6H,1H,0H,0H);3/1
DB 04 DUP (0FFH,0FFH,0H,6H,0CH,6H,0H,0H);0/6
DB 04 DUP (0FFH,0FFH,1H,2H,8H,2H,0H,0H);1/2
DB 04 DUP (0FFH,0FFH,4H,1H,7H,1H,0H,0H);4/1
DB 04 DUP (0FFH,0FFH,5H,1H,7H,1H,0H,0H);5/1
DB 02 DUP (0FFH,0FFH,0H,7H,0EH,7H,0H,0H);0/7
DB 02 DUP (0FFH,0FFH,6H,1H,8H,1H,0H,0H);6/1
DB 02 DUP (0FFH,0FFH,7H,1H,8H,1H,0H,0H);7/1
DB 01 DUP (0FFH,0FFH,1H,3H,0BH,3H,0H,0H);1/3
DB 01 DUP (0FFH,0FFH,2H,2H,0AH,2H,0H,0H);2/2
DB 01 DUP (0FFH,0FFH,3H,2H,0AH,2H,0H,0H);3/2
DB 01 DUP (0FFH,0FFH,8H,1H,9H,1H,0H,0H);8/1
;-1-1--1-1-11-1--11--1-1-1-1-11--1-1-1
DW 0FFH,AC1,0,0 ;1111'1010
DW 0FFH,AC2,0,0 ;1111'1011
DW 0FFH,AC3,0,0 ;1111'1100
DW 0FFH,AC4,0,0 ;1111'1101
DW 0FFH,AC5,0,0 ;1111'1110
DW 0FFH,AC6,0,0 ;1111'1111
;-------------------- 1 LEVEL ---------------------
;1111'1010
AC1 DB 128 DUP (0FFH,0FFH,0H,8H,11H,8H,0H,0H);0/8
DB 128 DUP (0FFH,0FFH,1H,4H,0DH,4H,0H,0H);1/4
;1111'1011
AC2 DB 128 DUP (0FFH,0FFH,4H,2H,0BH,2H,0H,0H);4/2
DB 128 DUP (0FFH,0FFH,9H,1H,0AH,1H,0H,0H);9/1
;1111'1100
AC3 DB 128 DUP (0FFH,0FFH,0AH,1H,0AH,1H,0H,0H);A/1
DB 128 DUP (0FFH,0FFH,0BH,1H,0AH,1H,0H,0H);B/1
;1111'1101
AC4 DB 128 DUP (0FFH,0FFH,0CH,1H,0AH,1H,0H,0H);C/1
DB 64 DUP (0FFH,0FFH,0H,9H,13H,9H,0H,0H);0/9
DB 64 DUP (0FFH,0FFH,2H,3H,0DH,3H,0H,0H);2/3
;1111'1110
AC5 DB 64 DUP (0FFH,0FFH,3H,3H,0DH,3H,0H,0H);3/3
DB 64 DUP (0FFH,0FFH,5H,2H,0CH,2H,0H,0H);5/2
DB 64 DUP (0FFH,0FFH,0FH,0H,0AH,0H,0H,0H);F/0
DB 32 DUP (0FFH,0FFH,1H,5H,10H,5H,0H,0H);1/5
DB 32 DUP (0FFH,0FFH,6H,2H,0DH,2H,0H,0H);6/2
;1111'1111
AC6 DB 32 DUP (0FFH,0FFH,7H,2H,0DH,2H,0H,0H);7/2
DB 32 DUP (0FFH,0FFH,0DH,1H,0CH,1H,0H,0H);D/1
DB 16 DUP (0FFH,0FFH,0H,0AH,16H,0AH,0H,0H);0/A
DB 16 DUP (0FFH,0FFH,1H,6H,12H,6H,0H,0H);1/6
DB 16 DUP (0FFH,0FFH,2H,4H,10H,4H,0H,0H);2/4
DB 16 DUP (0FFH,0FFH,3H,4H,10H,4H,0H,0H);3/4
DB 04 DUP (0FFH,0FFH,0EH,1H,0FH,1H,0H,0H);E/1
DB 02 DUP (0FFH,0FFH,2H,5H,14H,5H,0H,0H);2/5
DB 02 DUP (0FFH,0FFH,0FH,1H,10H,1H,0H,0H);F/1
DB 01 DUP (0FFH,0FFH,1H,7H,17H,7H,0H,0H);1/7
DB 01 DUP (0FFH,0FFH,1H,8H,18H,8H,0H,0H);1/8
DB 01 DUP (0FFH,0FFH,1H,9H,19H,9H,0H,0H);1/9
DB 01 DUP (0FFH,0FFH,1H,0AH,1AH,0AH,0H,0H);1/A
DB 01 DUP (0FFH,0FFH,2H,6H,16H,6H,0H,0H);2/6
DB 01 DUP (0FFH,0FFH,2H,7H,17H,7H,0H,0H);2/7
DB 01 DUP (0FFH,0FFH,2H,8H,18H,8H,0H,0H);2/8
DB 01 DUP (0FFH,0FFH,2H,9H,19H,9H,0H,0H);2/9
DB 01 DUP (0FFH,0FFH,2H,0AH,1AH,0AH,0H,0H);2/A
DB 01 DUP (0FFH,0FFH,3H,5H,15H,5H,0H,0H);3/5
DB 01 DUP (0FFH,0FFH,3H,6H,16H,6H,0H,0H);3/6
DB 01 DUP (0FFH,0FFH,3H,7H,17H,7H,0H,0H);3/7
DB 01 DUP (0FFH,0FFH,3H,8H,18H,8H,0H,0H);3/8
DB 01 DUP (0FFH,0FFH,3H,9H,19H,9H,0H,0H);3/9
DB 01 DUP (0FFH,0FFH,3H,0AH,1AH,0AH,0H,0H);3/A
DB 01 DUP (0FFH,0FFH,4H,3H,13H,3H,0H,0H);4/3
DB 01 DUP (0FFH,0FFH,4H,4H,14H,4H,0H,0H);4/4
DB 01 DUP (0FFH,0FFH,4H,5H,15H,5H,0H,0H);4/5
DB 01 DUP (0FFH,0FFH,4H,6H,16H,6H,0H,0H);4/6
DB 01 DUP (0FFH,0FFH,4H,7H,17H,7H,0H,0H);4/7
DB 01 DUP (0FFH,0FFH,4H,8H,18H,8H,0H,0H);4/8
DB 01 DUP (0FFH,0FFH,4H,9H,19H,9H,0H,0H);4/9
DB 01 DUP (0FFH,0FFH,4H,0AH,1AH,0AH,0H,0H);4/A
DB 01 DUP (0FFH,0FFH,5H,3H,13H,3H,0H,0H);5/3
DB 01 DUP (0FFH,0FFH,5H,4H,14H,4H,0H,0H);5/4
DB 01 DUP (0FFH,0FFH,5H,5H,15H,5H,0H,0H);5/5
DB 01 DUP (0FFH,0FFH,5H,6H,16H,6H,0H,0H);5/6
DB 01 DUP (0FFH,0FFH,5H,7H,17H,7H,0H,0H);5/7
DB 01 DUP (0FFH,0FFH,5H,8H,18H,8H,0H,0H);5/8
DB 01 DUP (0FFH,0FFH,5H,9H,19H,9H,0H,0H);5/9
DB 01 DUP (0FFH,0FFH,5H,0AH,1AH,0AH,0H,0H);5/A
DB 01 DUP (0FFH,0FFH,6H,3H,13H,3H,0H,0H);6/3
DB 01 DUP (0FFH,0FFH,6H,4H,14H,4H,0H,0H);6/4
DB 01 DUP (0FFH,0FFH,6H,5H,15H,5H,0H,0H);6/5
DB 01 DUP (0FFH,0FFH,6H,6H,16H,6H,0H,0H);6/6
DB 01 DUP (0FFH,0FFH,6H,7H,17H,7H,0H,0H);6/7
DB 01 DUP (0FFH,0FFH,6H,8H,18H,8H,0H,0H);6/8
DB 01 DUP (0FFH,0FFH,6H,9H,19H,9H,0H,0H);6/9
DB 01 DUP (0FFH,0FFH,6H,0AH,1AH,0AH,0H,0H);6/A
DB 01 DUP (0FFH,0FFH,7H,3H,13H,3H,0H,0H);7/3
DB 01 DUP (0FFH,0FFH,7H,4H,14H,4H,0H,0H);7/4
DB 01 DUP (0FFH,0FFH,7H,5H,15H,5H,0H,0H);7/5
DB 01 DUP (0FFH,0FFH,7H,6H,16H,6H,0H,0H);7/6
DB 01 DUP (0FFH,0FFH,7H,7H,17H,7H,0H,0H);7/7
DB 01 DUP (0FFH,0FFH,7H,8H,18H,8H,0H,0H);7/8
DB 01 DUP (0FFH,0FFH,7H,9H,19H,9H,0H,0H);7/9
DB 01 DUP (0FFH,0FFH,7H,0AH,1AH,0AH,0H,0H);7/A
DB 01 DUP (0FFH,0FFH,8H,2H,12H,2H,0H,0H);8/2
DB 01 DUP (0FFH,0FFH,8H,3H,13H,3H,0H,0H);8/3
DB 01 DUP (0FFH,0FFH,8H,4H,14H,4H,0H,0H);8/4
DB 01 DUP (0FFH,0FFH,8H,5H,15H,5H,0H,0H);8/5
DB 01 DUP (0FFH,0FFH,8H,6H,16H,6H,0H,0H);8/6
DB 01 DUP (0FFH,0FFH,8H,7H,17H,7H,0H,0H);8/7
DB 01 DUP (0FFH,0FFH,8H,8H,18H,8H,0H,0H);8/8
DB 01 DUP (0FFH,0FFH,8H,9H,19H,9H,0H,0H);8/9
DB 01 DUP (0FFH,0FFH,8H,0AH,1AH,0AH,0H,0H);8/A
DB 01 DUP (0FFH,0FFH,9H,2H,12H,2H,0H,0H);9/2
DB 01 DUP (0FFH,0FFH,9H,3H,13H,3H,0H,0H);9/3
DB 01 DUP (0FFH,0FFH,9H,4H,14H,4H,0H,0H);9/4
DB 01 DUP (0FFH,0FFH,9H,5H,15H,5H,0H,0H);9/5
DB 01 DUP (0FFH,0FFH,9H,6H,16H,6H,0H,0H);9/6
DB 01 DUP (0FFH,0FFH,9H,7H,17H,7H,0H,0H);9/7
DB 01 DUP (0FFH,0FFH,9H,8H,18H,8H,0H,0H);9/8
DB 01 DUP (0FFH,0FFH,9H,9H,19H,9H,0H,0H);9/9
DB 01 DUP (0FFH,0FFH,9H,0AH,1AH,0AH,0H,0H);9/A
DB 01 DUP (0FFH,0FFH,0AH,2H,12H,2H,0H,0H);A/2
DB 01 DUP (0FFH,0FFH,0AH,3H,13H,3H,0H,0H);A/3
DB 01 DUP (0FFH,0FFH,0AH,4H,14H,4H,0H,0H);A/4
DB 01 DUP (0FFH,0FFH,0AH,5H,15H,5H,0H,0H);A/5
DB 01 DUP (0FFH,0FFH,0AH,6H,16H,6H,0H,0H);A/6
DB 01 DUP (0FFH,0FFH,0AH,7H,17H,7H,0H,0H);A/7
DB 01 DUP (0FFH,0FFH,0AH,8H,18H,8H,0H,0H);A/8
DB 01 DUP (0FFH,0FFH,0AH,9H,19H,9H,0H,0H);A/9
DB 01 DUP (0FFH,0FFH,0AH,0AH,1AH,0AH,0H,0H);A/A
DB 01 DUP (0FFH,0FFH,0BH,2H,12H,2H,0H,0H);B/2
DB 01 DUP (0FFH,0FFH,0BH,3H,13H,3H,0H,0H);B/3
DB 01 DUP (0FFH,0FFH,0BH,4H,14H,4H,0H,0H);B/4
DB 01 DUP (0FFH,0FFH,0BH,5H,15H,5H,0H,0H);B/5
DB 01 DUP (0FFH,0FFH,0BH,6H,16H,6H,0H,0H);B/6
DB 01 DUP (0FFH,0FFH,0BH,7H,17H,7H,0H,0H);B/7
DB 01 DUP (0FFH,0FFH,0BH,8H,18H,8H,0H,0H);B/8
DB 01 DUP (0FFH,0FFH,0BH,9H,19H,9H,0H,0H);B/9
DB 01 DUP (0FFH,0FFH,0BH,0AH,1AH,0AH,0H,0H);B/A
DB 01 DUP (0FFH,0FFH,0CH,2H,12H,2H,0H,0H);C/2
DB 01 DUP (0FFH,0FFH,0CH,3H,13H,3H,0H,0H);C/3
DB 01 DUP (0FFH,0FFH,0CH,4H,14H,4H,0H,0H);C/4
DB 01 DUP (0FFH,0FFH,0CH,5H,15H,5H,0H,0H);C/5
DB 01 DUP (0FFH,0FFH,0CH,6H,16H,6H,0H,0H);C/6
DB 01 DUP (0FFH,0FFH,0CH,7H,17H,7H,0H,0H);C/7
DB 01 DUP (0FFH,0FFH,0CH,8H,18H,8H,0H,0H);C/8
DB 01 DUP (0FFH,0FFH,0CH,9H,19H,9H,0H,0H);C/9
DB 01 DUP (0FFH,0FFH,0CH,0AH,1AH,0AH,0H,0H);C/A
DB 01 DUP (0FFH,0FFH,0DH,2H,12H,2H,0H,0H);D/2
DB 01 DUP (0FFH,0FFH,0DH,3H,13H,3H,0H,0H);D/3
DB 01 DUP (0FFH,0FFH,0DH,4H,14H,4H,0H,0H);D/4
DB 01 DUP (0FFH,0FFH,0DH,5H,15H,5H,0H,0H);D/5
DB 01 DUP (0FFH,0FFH,0DH,6H,16H,6H,0H,0H);D/6
DB 01 DUP (0FFH,0FFH,0DH,7H,17H,7H,0H,0H);D/7
DB 01 DUP (0FFH,0FFH,0DH,8H,18H,8H,0H,0H);D/8
DB 01 DUP (0FFH,0FFH,0DH,9H,19H,9H,0H,0H);D/9
DB 01 DUP (0FFH,0FFH,0DH,0AH,1AH,0AH,0H,0H);D/A
DB 01 DUP (0FFH,0FFH,0EH,2H,12H,2H,0H,0H);E/2
DB 01 DUP (0FFH,0FFH,0EH,3H,13H,3H,0H,0H);E/3
DB 01 DUP (0FFH,0FFH,0EH,4H,14H,4H,0H,0H);E/4
DB 01 DUP (0FFH,0FFH,0EH,5H,15H,5H,0H,0H);E/5
DB 01 DUP (0FFH,0FFH,0EH,6H,16H,6H,0H,0H);E/6
DB 01 DUP (0FFH,0FFH,0EH,7H,17H,7H,0H,0H);E/7
DB 01 DUP (0FFH,0FFH,0EH,8H,18H,8H,0H,0H);E/8
DB 01 DUP (0FFH,0FFH,0EH,9H,19H,9H,0H,0H);E/9
DB 01 DUP (0FFH,0FFH,0EH,0AH,1AH,0AH,0H,0H);E/A
DB 01 DUP (0FFH,0FFH,0FH,2H,12H,2H,0H,0H);F/2
DB 01 DUP (0FFH,0FFH,0FH,3H,13H,3H,0H,0H);F/3
DB 01 DUP (0FFH,0FFH,0FH,4H,14H,4H,0H,0H);F/4
DB 01 DUP (0FFH,0FFH,0FH,5H,15H,5H,0H,0H);F/5
DB 01 DUP (0FFH,0FFH,0FH,6H,16H,6H,0H,0H);F/6
DB 01 DUP (0FFH,0FFH,0FH,7H,17H,7H,0H,0H);F/7
DB 01 DUP (0FFH,0FFH,0FH,8H,18H,8H,0H,0H);F/8
DB 01 DUP (0FFH,0FFH,0FH,9H,19H,9H,0H,0H);F/9
DB 01 DUP (0FFH,0FFH,0FH,0AH,1AH,0AH,0H,0H);F/A
_DATA ENDS
_JPEG_TEXT SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:_JPEG_TEXT,DS:DGROUP
public _Decompress
public _CDecompress
extrn LH_TABLE: word
extrn COLOR_TABLE: word
extrn _IDX_87: far
extrn _FPU : byte
;======================================
_Decompress PROC FAR
PUSH BP
MOV BP,SP
PUSH DS
PUSH ES
PUSH SI
PUSH DI
PUSH CX
PUSH BX
MOV AX,[BP+6]
MOV SOURCE,AX
MOV AX,[BP+8]
MOV CODE_BUFF,AX
MOV ES,AX
MOV AX,ES:[0]
MOV COUNT2,AX
MOV STEP,AX
MOV CL,3
SHR AX,CL
MOV DIMENSION_X,AX
MOV AX,ES:[2]
MOV COUNT3,AX
SHR AX,CL
MOV DIMENSION_Y,AX
MOV AX,_DATA
MOV DS,AX
MOV DECODE_LOCATION,1
MOV DC_BASE,0
MOV LOCATION,0
MOV NUM,10000
MOV DECODE_CURRENT_LOCATION,32
MOV AL,0FFH
CMP BYTE PTR DGROUP:_FPU,AL
JE IDEFAULT
MOV AX,IDCT_87
MOV IDCT_SUB,AX
FINIT
IDEFAULT: CLD
STI
PUSH ES
PUSH DS
POP ES
POP DS
LEA DI,CURRENT_CODE
MOV SI,4
MOV CX,2
REPZ MOVSW
PUSH ES
PUSH DS
POP ES
POP DS
MOV CX,DIMENSION_Y
DECOMPRESS_LOOP1:
PUSH CX
MOV CX,DIMENSION_X
DECOMPRESS_LOOP2:
PUSH CX
CALL ENTROPY_DECODER
CALL IQUANTIZER
CALL WORD PTR IDCT_SUB
CALL MOVE_DATA_BUFF
ADD LOCATION,8
POP CX
LOOP DECOMPRESS_LOOP2
MOV LOCATION,0
MOV AX,COUNT2
SHR AX,1
PUSHF
ADD SOURCE,AX
POPF
JNC SET_LOCATION
MOV LOCATION,8
SET_LOCATION: POP CX
LOOP DECOMPRESS_LOOP1
MOV AX,COUNT2
MOV DX,COUNT3
POP BX
POP CX
POP DI
POP SI
POP ES
POP DS
POP BP
RET
_Decompress ENDP
;======================================
_CDecompress PROC FAR
PUSH BP
MOV BP,SP
PUSH DS
PUSH ES
PUSH SI
PUSH DI
PUSH CX
PUSH BX
MOV AX,[BP+6]
MOV SOURCE,AX ; IMAGE BUFFER
MOV COLOR_Y,AX
ADD AX,4096
MOV COLOR_CR,AX
ADD AX,1024
MOV COLOR_CB,AX
MOV AX,[BP+8] ; CODE BUFFER
MOV CODE_BUFF,AX
MOV ES,AX
MOV AX,ES:[0]
MOV COUNT2,AX
MOV CL,4
SHR AX,CL
MOV DIMENSION_X,AX
MOV AX,ES:[2]
MOV COUNT3,AX
SHR AX,CL
MOV DIMENSION_Y,AX
MOV AX,DGROUP
MOV DS,AX
MOV DECODE_LOCATION,1
MOV DC_BASE,0
MOV DC_Y,0
MOV DC_CR,0
MOV DC_CB,0
MOV LOCATION,0
MOV LOC_Y,0 ; INIT SEGMENT
MOV LOC_CR,0
MOV LOC_CB,0
MOV NUM,10000
MOV DECODE_CURRENT_LOCATION,32
MOV AL,0FFH
CMP BYTE PTR DGROUP:_FPU,AL
JE CIDEFAULT
MOV AX,IDCT_87
MOV IDCT_SUB,AX
FINIT
CIDEFAULT: CLD
STI
PUSH ES
PUSH DS
POP ES
POP DS
LEA DI,CURRENT_CODE
MOV SI,4
MOV CX,2
REPZ MOVSW
PUSH ES
PUSH DS
POP ES
POP DS
MOV CX,DIMENSION_Y
DECOMPRE_LOOP1: PUSH CX
MOV CX,DIMENSION_X
DECOMPRE_LOOP2: PUSH CX
MOV AX,COUNT2 ; SET STEP FOR Y
MOV STEP,AX
MOV AX,DC_Y
MOV DC_BASE,AX
MOV AX,COLOR_Y ; SET Y SEGMENT
MOV SOURCE,AX
MOV AX,LOC_Y ; SET Y POINTER
MOV LOCATION,AX
CALL ENTROPY_DECODER ; Y1 DECODE
CALL IQUANTIZER
CALL WORD PTR IDCT_SUB
CALL MOVE_DATA_BUFF
ADD LOCATION,8
CALL ENTROPY_DECODER ; Y2 DECODE
CALL IQUANTIZER
CALL WORD PTR IDCT_SUB
CALL MOVE_DATA_BUFF
ADD LOCATION,8
MOV AX,LOCATION
MOV LOC_Y,AX
MOV AX,COUNT2 ; ADJUST POINTER
SHL AX,1
SHL AX,1
SHL AX,1
ADD AX,LOCATION
SUB AX,16
MOV LOCATION,AX
CALL ENTROPY_DECODER ; Y3 DECODE
CALL IQUANTIZER
CALL WORD PTR IDCT_SUB
CALL MOVE_DATA_BUFF
ADD LOCATION,8
CALL ENTROPY_DECODER ; Y4 DECODE
CALL IQUANTIZER
CALL WORD PTR IDCT_SUB
CALL MOVE_DATA_BUFF
MOV AX,DC_BASE ; RESTORE Y DC
MOV DC_Y,AX
MOV AX,DC_CR ; SET CR DC
MOV DC_BASE,AX
MOV AX,COUNT2 ; SET STEP FOR CR&CB
SHR AX,1
MOV STEP,AX
MOV AX,COLOR_CR ; SET CR SEGMENT
MOV SOURCE,AX
MOV AX,LOC_CR ; SET CR POINTER
MOV LOCATION,AX
CALL C_DECODER ; CR DECODE
CALL C_IQUANT
CALL WORD PTR IDCT_SUB
CALL MOVE_DATA_BUFF
ADD LOC_CR,8
MOV AX,DC_BASE ; RESTORE CR DC
MOV DC_CR,AX
MOV AX,DC_CB ; SET CB DC
MOV DC_BASE,AX
MOV AX,COLOR_CB ; SET CB SEGMENT
MOV SOURCE,AX
MOV AX,LOC_CB ; SET CB POINTER
MOV LOCATION,AX
CALL C_DECODER ; CB DECODE
CALL C_IQUANT
CALL WORD PTR IDCT_SUB
CALL MOVE_DATA_BUFF
ADD LOC_CB,8
MOV AX,DC_BASE
MOV DC_CB,AX
POP CX
DEC CX
JZ CLOOP_OUT2
JMP DECOMPRE_LOOP2
CLOOP_OUT2: MOV AX,COUNT2
ADD COLOR_Y,AX
MOV LOC_Y,0
MOV LOC_CR,0
MOV LOC_CB,0
SHR AX,1
SHR AX,1
PUSHF
ADD COLOR_CR,AX
ADD COLOR_CB,AX
POPF
JNC CSET_LOCATION
MOV LOC_CR,8
MOV LOC_CB,8
CSET_LOCATION: POP CX
DEC CX
JZ CLOOP_OUT1
JMP DECOMPRE_LOOP1
CLOOP_OUT1: MOV AX,DGROUP
MOV DS,AX
MOV AX,COUNT2
MOV DX,COUNT3
POP BX
POP CX
POP DI
POP SI
POP ES
POP DS
POP BP
RET
_CDecompress ENDP
;=======================================
ENTROPY_DECODER PROC
PUSH ES
PUSH DS
POP ES
LEA DI,LH_DENIST
MOV CX,64
XOR AX,AX
REPZ STOSW
POP ES
MOV BP,DECODE_LOCATION
MOV DH,DECODE_CURRENT_LOCATION
INDEX_8
PUSH ES
PUSH DS
POP ES
LEA SI,IDC_TABLE
MOV CL,3
SHL BX,CL
ADD SI,BX
LEA DI,NEWS
MOV CX,4
REPZ MOVSW
POP ES
XOR DI,DI
MOV SI,DI
MOV DL,BYTE PTR NEWS+4
I_SHIFT
PUSH DX
MOV CL,BYTE PTR NEWS+5
MOV DX,1
SHL DX,CL
DEC DX
AND BX,DX
MOV CX,BX
XOR CX,DX
CMP CX,BX
JA FU_U
ADD BX,DC_BASE
MOV DC_BASE,BX
MOV WORD PTR LH_DENIST,BX
JMP NEXT_3_3
FU_U: NEG CX
ADD CX,DC_BASE
MOV DC_BASE,CX
MOV WORD PTR LH_DENIST,CX
NEXT_3_3: POP DX
ADD SI,2
BACK1: INDEX_8
MOV DI,BX
SHL DI,1
SHL DI,1
SHL DI,1
CMP BYTE PTR DS:DECODE_TABLE[DI],0
JNZ SHORT NEXT1
JMP ALL_IS_0
NEXT1: CMP BYTE PTR DS:DECODE_TABLE[DI+1],0
JNZ SHORT NEXT2
JMP TWO_LEVEL
NEXT2: PUSH ES
PUSH SI
LEA SI,DECODE_TABLE
ADD SI,DI
PUSH DS
POP ES
LEA DI,NEWS
MOV CX,4
CLD
REPZ MOVSW
POP SI
POP ES
MOV AL,BYTE PTR NEWS+2
CBW
ADD SI,AX
ADD SI,AX
MOV DL,BYTE PTR NEWS+4
I_SHIFT
PUSH DX
MOV CL,BYTE PTR NEWS+5
MOV DX,1
SHL DX,CL
DEC DX
AND BX,DX
MOV CX,BX
XOR CX,DX
CMP CX,BX
JA FU
MOV WORD PTR LH_DENIST[SI],BX
JMP NEXT_3
FU: NEG CX
MOV WORD PTR LH_DENIST[SI],CX
NEXT_3: POP DX
ADD SI,2
JMP BACK1
TWO_LEVEL: XOR DI,DI
MOV DI,BX
MOV CX,3
SHL DI,CL
ADD DI,2
MOV DI,WORD PTR DECODE_TABLE[DI]
INDEX_16
AND BX,0FFH
PUSH ES
PUSH SI
PUSH DS
POP ES
SHL BX,1
SHL BX,1
SHL BX,1
ADD DI,BX
MOV SI,DI
LEA DI,NEWS
MOV CX,4
REPZ MOVSW
POP SI
POP ES
MOV AL,BYTE PTR NEWS+2
CBW
ADD SI,AX
ADD SI,AX
MOV DL,BYTE PTR NEWS+4
I_SHIFT
PUSH DX
MOV CL,BYTE PTR NEWS+5
MOV DX,1
SHL DX,CL
DEC DX
AND BX,DX
MOV CX,BX
XOR CX,DX
CMP CX,BX
JA FU1
MOV WORD PTR LH_DENIST[SI],BX
JMP NEXTA
FU1: NEG CX
MOV WORD PTR LH_DENIST[SI],CX
NEXTA: POP DX
ADD SI,2
JMP BACK1
ALL_IS_0: MOV DI,BX
MOV CX,3
SHL DI,CL
ADD DI,4
MOV DL,BYTE PTR DECODE_TABLE[DI]
CMP DH,DL
JB LESS5
JE EQUAL5
GREAT5: MOV CL,DL
PUSH BX
ISHLD
POP BX
SUB DH,DL
JMP NEXT5
EQUAL5: INC BP
SHL BP,1
SHL BP,1
MOV AX,ES:[BP+2]
MOV WORD PTR CURRENT_CODE+2,AX
MOV AX,ES:[BP]
MOV WORD PTR CURRENT_CODE,AX
SHR BP,1
SHR BP,1
MOV DH,32
JMP NEXT5
LESS5: SUB DL,DH
MOV DH,32
SUB DH,DL
INC BP
SHL BP,1
SHL BP,1
MOV AX,ES:[BP+2]
MOV WORD PTR CURRENT_CODE+2,AX
MOV AX,ES:[BP]
MOV WORD PTR CURRENT_CODE,AX
SHR BP,1
SHR BP,1
MOV CL,DL
PUSH BX
ISHLD
POP BX
NEXT5: MOV DECODE_LOCATION,BP
MOV DECODE_CURRENT_LOCATION,DH
RET
ENTROPY_DECODER ENDP
;========================================
C_DECODER PROC
PUSH ES
PUSH DS
POP ES
LEA DI,LH_DENIST ; CLEAR TO ZERO
MOV CX,64
XOR AX,AX
REPZ STOSW
POP ES
MOV BP,DECODE_LOCATION
MOV DH,DECODE_CURRENT_LOCATION
INDEX_8
PUSH ES
PUSH DS
POP ES
LEA SI,IDC_CHRO
MOV CL,3
SHL BX,CL
ADD SI,BX
CMP BYTE PTR [SI+1],0
JNZ DC_LEVEL
DC_TWO_LEVEL: MOV DI,[SI+2]
INDEX_16
AND BX,0FFH
MOV CL,3
SHL BX,CL
ADD SI,BX
DC_LEVEL: LEA DI,NEWS
MOV CX,4
REPZ MOVSW
POP ES
XOR DI,DI
MOV SI,DI
MOV DL,BYTE PTR NEWS+4
I_SHIFT
PUSH DX
MOV CL,BYTE PTR NEWS+5
MOV DX,1
SHL DX,CL
DEC DX
AND BX,DX
MOV CX,BX
XOR CX,DX
CMP CX,BX
JA CFU_U
ADD BX,DC_BASE
MOV DC_BASE,BX
MOV WORD PTR LH_DENIST,BX
JMP CNEXT_3_3
CFU_U: NEG CX
ADD CX,DC_BASE
MOV DC_BASE,CX
MOV WORD PTR LH_DENIST,CX
CNEXT_3_3: POP DX
;--------------------------------------
; ------------- AC DECODE -----------
;--------------------------------------
ADD SI,2
CBACK1: INDEX_8
MOV DI,BX
SHL DI,1
SHL DI,1
SHL DI,1
CMP BYTE PTR DS:IAC_CHRO_TABLE[DI],0
JNZ SHORT CNEXT1
JMP CALL_IS_0
CNEXT1: CMP BYTE PTR DS:IAC_CHRO_TABLE[DI+1],0
JNZ SHORT CNEXT2
JMP CTWO_LEVEL
CNEXT2: PUSH ES
PUSH SI
LEA SI,IAC_CHRO_TABLE
ADD SI,DI
PUSH DS
POP ES
LEA DI,NEWS
MOV CX,4
CLD
REPZ MOVSW
POP SI
POP ES
MOV AL,BYTE PTR NEWS+2
CBW
ADD SI,AX
ADD SI,AX
MOV DL,BYTE PTR NEWS+4
I_SHIFT
PUSH DX
MOV CL,BYTE PTR NEWS+5
MOV DX,1
SHL DX,CL
DEC DX
AND BX,DX
MOV CX,BX
XOR CX,DX
CMP CX,BX
JA CFU
MOV WORD PTR LH_DENIST[SI],BX
JMP CNEXT_3
CFU: NEG CX
MOV WORD PTR LH_DENIST[SI],CX
CNEXT_3: POP DX
ADD SI,2
JMP CBACK1
CTWO_LEVEL: ADD DI,2
MOV DI,WORD PTR IAC_CHRO_TABLE[DI]
INDEX_16
AND BX,0FFH
PUSH ES
PUSH SI
PUSH DS
POP ES
SHL BX,1
SHL BX,1
SHL BX,1
ADD DI,BX
MOV SI,DI
LEA DI,NEWS
MOV CX,4
REPZ MOVSW
POP SI
POP ES
MOV AL,BYTE PTR NEWS+2
CBW
ADD SI,AX
ADD SI,AX
MOV DL,BYTE PTR NEWS+4
I_SHIFT
PUSH DX
MOV CL,BYTE PTR NEWS+5
MOV DX,1
SHL DX,CL
DEC DX
AND BX,DX
MOV CX,BX
XOR CX,DX
CMP CX,BX
JA CFU1
MOV WORD PTR LH_DENIST[SI],BX
JMP SHORT CNEXTA
CFU1: NEG CX
MOV WORD PTR LH_DENIST[SI],CX
CNEXTA: POP DX
ADD SI,2
JMP CBACK1
CALL_IS_0: MOV DI,BX
MOV CX,3
SHL DI,CL
ADD DI,4
MOV DL,BYTE PTR IAC_CHRO_TABLE[DI]
CMP DH,DL
JB CLESS5
JE CEQUAL5
CGREAT5: MOV CL,DL
PUSH BX
ISHLD
POP BX
SUB DH,DL
JMP CNEXT5
CEQUAL5: INC BP
SHL BP,1
SHL BP,1
MOV AX,ES:[BP+2]
MOV WORD PTR CURRENT_CODE+2,AX
MOV AX,ES:[BP]
MOV WORD PTR CURRENT_CODE,AX
SHR BP,1
SHR BP,1
MOV DH,32
JMP CNEXT5
CLESS5: SUB DL,DH
MOV DH,32
SUB DH,DL
INC BP
SHL BP,1
SHL BP,1
MOV AX,ES:[BP+2]
MOV WORD PTR CURRENT_CODE+2,AX
MOV AX,ES:[BP]
MOV WORD PTR CURRENT_CODE,AX
SHR BP,1
SHR BP,1
MOV CL,DL
PUSH BX
ISHLD
POP BX
CNEXT5: MOV DECODE_LOCATION,BP
MOV DECODE_CURRENT_LOCATION,DH
RET
C_DECODER ENDP
;========================================
IQUANTIZER PROC
PUSH ES
PUSH DS
POP ES
MOV CX,256
XOR AX,AX
LEA DI,X1
REPZ STOSW
POP ES
XOR SI,SI
MOV CX,63
MOV AX,LH_DENIST
AND AX,AX
JZ DO1
IMUL LH_TABLE
CALL IQSTD
DO1: ADD SI,2
MOV AX,LH_DENIST[SI]
AND AX,AX
JZ DO2
IMUL LH_TABLE[SI]
SHL SI,1
CALL IQSTD
SHR SI,1
DO2: DEC CX
JNE DO1
RET
IQUANTIZER ENDP
;=======================================
C_IQUANT PROC
PUSH ES
PUSH DS
POP ES
MOV CX,256
XOR AX,AX
LEA DI,X1
REPZ STOSW
POP ES
XOR SI,SI
MOV CX,63
MOV AX,LH_DENIST
AND AX,AX
JZ CDO1
IMUL COLOR_TABLE
CALL IQSTD
CDO1: ADD SI,2
MOV AX,LH_DENIST[SI]
AND AX,AX
JZ CDO2
IMUL COLOR_TABLE[SI]
SHL SI,1
CALL IQSTD
SHR SI,1
CDO2: DEC CX
JNE CDO1
RET
C_IQUANT ENDP
;=======================================
IDCT_2D_87 PROC NEAR
LEA SI,X1
MOV CX,64
IRET_DATA_FORMAT:
SHL BYTE PTR [SI+2],1
RCR WORD PTR [SI+2],1
ADD SI,4
LOOP IRET_DATA_FORMAT
MOVS_2_1_87 0,0,0
MOVS_2_1_87 2,1,4
MOVS_2_1_87 3,2,4
MOVS_2_1_87 9,3,4
MOVS_2_1_87 10,4,4
MOVS_2_1_87 20,5,4
MOVS_2_1_87 21,6,4
MOVS_2_1_87 35,7,4
MOVS_2_1_87 39,8,0
MOVS_2_1_87 46,9,0
MOVS_2_1_87 50,10,0
MOVS_2_1_87 57,11,0
MOVS_2_1_87 14,12,4
MOVS_2_1_87 16,13,0
MOVS_2_1_87 25,14,0
MOVS_2_1_87 31,15,0
MOVS_2_1_87 41,16,0
MOVS_2_1_87 44,17,0
MOVS_2_1_87 52,18,0
MOVS_2_1_87 55,19,0
MOVS_2_1_87 37,20,0
MOVS_2_1_87 33,21,0
MOVS_2_1_87 23,22,0
MOVS_2_1_87 18,23,0
MOVS_2_1_87 12,24,0
MOVS_2_1_87 7,25,0
MOVS_2_1_87 5,26,4
MOVS_2_1_87 62,27,0
MOVS_2_1_87 59,28,0
MOVS_2_1_87 48,29,0
MOVS_2_1_87 27,30,4
MOVS_2_1_87 29,31,0
MOVS_2_1_87 4,32,0
MOVS_2_1_87 1,33,4
MOVS_2_1_87 63,34,0
MOVS_2_1_87 61,35,0
MOVS_2_1_87 60,36,0
MOVS_2_1_87 54,37,0
MOVS_2_1_87 53,38,0
MOVS_2_1_87 43,39,0
MOVS_2_1_87 42,40,0
MOVS_2_1_87 45,41,0
MOVS_2_1_87 51,42,0
MOVS_2_1_87 56,43,0
MOVS_2_1_87 22,44,0
MOVS_2_1_87 19,45,0
MOVS_2_1_87 11,46,0
MOVS_2_1_87 8,47,0
MOVS_2_1_87 26,48,0
MOVS_2_1_87 30,49,0
MOVS_2_1_87 40,50,0
MOVS_2_1_87 32,51,0
MOVS_2_1_87 24,52,0
MOVS_2_1_87 17,53,0
MOVS_2_1_87 13,54,0
MOVS_2_1_87 6,55,4
MOVS_2_1_87 58,56,0
MOVS_2_1_87 34,57,0
MOVS_2_1_87 36,58,0
MOVS_2_1_87 28,59,4
MOVS_2_1_87 38,60,0
MOVS_2_1_87 47,61,0
MOVS_2_1_87 49,62,0
MOVS_2_1_87 15,63,4
;--------------------CODE--------------------
MOV_1_2_87 0,0,2
MOV_1_2_87 1,1,2
MOV_1_2_87 2,2,2
MOV_1_2_87 3,3,2
MOV_1_2_87 4,4,2
MOV_1_2_87 5,5,2
MOV_1_2_87 6,6,2
MOV_1_2_87 7,7,2
MOV_1_2_87 8,8,2
MOV_1_2_87 12,12,2
MOV_1_2_87 26,26,2
FLD X2[30*4]
FCHS
FIMUL INT_2
FSTP X1[30*4]
ASK_1_2_87 9,15,15,9
ASK_1_2_87 10,14,14,10
ASK_1_2_87 11,13,13,11
ASK_1_2_87 20,16,20,16
ASK_1_2_87 21,17,21,17
ASK_1_2_87 22,18,22,18
ASK_1_2_87 23,19,23,19
ASK_1_2_87 24,28,24,28
ASK_1_2_87 25,27,25,27
FLD X2[31*4]
FADD X2[29*4]
FCHS
FSTP X1[29*4]
FLD X2[29*4]
FSUB X2[31*4]
FSTP X1[31*4];special 29 31
ASK_1_2_87 32,34,32,34
ASK_1_2_87 47,35,47,35
ASK_1_2_87 46,36,46,36
ASK_1_2_87 45,37,45,37
ASK_1_2_87 44,38,44,38
ASK_1_2_87 57,39,57,39
ASK_1_2_87 58,40,58,40
ASK_1_2_87 51,41,51,41
ASK_1_2_87 52,42,52,42
ASK_1_2_87 53,43,53,43
ASK_1_2_87 48,62,48,62
ASK_1_2_87 49,61,49,61
ASK_1_2_87 50,60,50,60
ASK_1_2_87 56,54,54,56
MOV_1_2_87 33,33,2
MOV_1_2_87 55,55,2
MOV_1_2_87 59,59,2
MOV_1_2_87 63,63,2
;/*===================1 level======================*/
ASK_2_1_87 0,8,0,8
ASK_2_1_87 1,9,1,9
ASK_2_1_87 2,10,2,10
ASK_2_1_87 3,11,3,11
ASK_2_1_87 4,12,4,12
ASK_2_1_87 5,13,5,13
ASK_2_1_87 6,14,6,14
ASK_2_1_87 7,15,7,15
ASK_2_1_87 17,31,17,31
ASK_2_1_87 18,30,18,30
ASK_2_1_87 19,29,19,29
ASK_2_1_87 28,20,28,20
ASK_2_1_87 27,21,27,21
ASK_2_1_87 26,22,26,22
ASK_2_1_87 25,23,25,23
MOV_2_1_87 16,16,2
MOV_2_1_87 24,24,2
ASK_2_1_87 32,52,32,52
ASK_2_1_87 33,51,33,51
ASK_2_1_87 34,50,34,50
ASK_2_1_87 35,49,35,49
ASK_2_1_87 36,48,36,48
ASK_2_1_87 37,63,37,63
ASK_2_1_87 38,62,38,62
ASK_2_1_87 39,61,39,61
ASK_2_1_87 40,60,40,60
ASK_2_1_87 41,59,41,59
ASK_2_1_87 42,58,42,58
ASK_2_1_87 43,57,43,57
ASK_2_1_87 44,56,44,56
ASK_2_1_87 45,55,45,55
ASK_2_1_87 46,54,46,54
ASK_2_1_87 47,53,47,53
;/*=====================2 level ======================*/
ASK_1_2_87 0,24,0,24
ASK_1_2_87 8,16,8,16
ASK_1_2_87 1,25,1,25
ASK_1_2_87 9,17,9,17
ASK_1_2_87 2,26,2,26
ASK_1_2_87 10,18,10,18
ASK_1_2_87 3,27,3,27
ASK_1_2_87 11,19,11,19
ASK_1_2_87 4,28,4,28
ASK_1_2_87 12,20,12,20
ASK_1_2_87 5,29,5,29
ASK_1_2_87 13,21,13,21
ASK_1_2_87 6,30,6,30
ASK_1_2_87 14,22,14,22
ASK_1_2_87 7,31,7,31
ASK_1_2_87 15,23,15,23
ASK_1_2_87 33,47,33,47
ASK_1_2_87 34,46,34,46
ASK_1_2_87 35,45,35,45
ASK_1_2_87 36,44,36,44
ASK_1_2_87 37,43,37,43
ASK_1_2_87 38,42,38,42
ASK_1_2_87 39,41,39,41
ASK_1_2_87 49,63,49,63
ASK_1_2_87 50,62,50,62
ASK_1_2_87 51,61,51,61
ASK_1_2_87 52,60,52,60
ASK_1_2_87 53,59,53,59
ASK_1_2_87 54,58,54,58
ASK_1_2_87 55,57,55,57
MOV_1_2_87 32,32,2
MOV_1_2_87 40,40,2
MOV_1_2_87 48,48,2
MOV_1_2_87 56,56,2
LEA BP,X1
MOV COUNTOR1,8
AGAIN1_87: FLD DWORD PTR DS:[BP+0*4];0-0
FIDIV INT_64
FLD DWORD PTR DS:[BP+4*4];1-4
FIDIV INT_32
FDIV CONST66
FLD DWORD PTR DS:[BP+2*4];2-2
FIDIV INT_32
FLD DWORD PTR DS:[BP+6*4] ;3-6
FIDIV INT_32
FADD ST,ST(1) ;3=3+2
FDIV CONST66
FLD DWORD PTR DS:[BP+1*4];4-1
FIDIV INT_32
FLD DWORD PTR DS:[BP+5*4] ;5-5
FIDIV INT_32
FLD DWORD PTR DS:[BP+3*4];6-3
FIDIV INT_32
FLD DWORD PTR DS:[BP+7*4];7-7
FIDIV INT_32
FADD ST,ST(2);7=7+5
FINCSTP
FADD ST(1),ST;5=6+5
FINCSTP
FDIV CONST66
FDECSTP
FADD ST,ST(2);6=6+4
FDECSTP
FADD ST,ST(1);7=7+6
FDIV CONST66
;------------------------------------
FDECSTP
FST TMP0
FADD ST,ST(7);0=0+1
FDECSTP
FSUBR TMP0;1=0-1
FDECSTP
FST TMP0
FADD ST,ST(7);2=2+3
FDIV CONST44
FDECSTP
FSUBR TMP0;3=2-3
FDIV CONST55
FDECSTP
FST TMP0
FADD ST,ST(7);4=4+5
FDECSTP
FSUBR TMP0;5=4-5
FDECSTP
FST TMP0
FADD ST,ST(7);6=6+7
FDIV CONST44
FDECSTP
FSUBR TMP0;L7=6-7
FDIV CONST55
FDECSTP
;----------------------------------
FST TMP0
FADD ST,ST(6);0=0+2
FDECSTP
FST TMP1
FADD ST,ST(6);1=1+3
FDECSTP
FSUBR TMP0;2=0-2
FDECSTP
FSUBR TMP1;3=1-3
FDECSTP
FST TMP0
FADD ST,ST(6);4=4+6
FDIV CONST01
FDECSTP
FST TMP1
FADD ST,ST(6);5=5+7
FDIV CONST11
FDECSTP
FSUBR TMP0;6=4-6
FDIV CONST22
FDECSTP
FSUBR TMP1;7=5-7
FDIV CONST33
FDECSTP
;----------------------------------------
FST TMP0
FADD ST,ST(4);0=0+4
FDECSTP
FST TMP1
FADD ST,ST(4);1=1+5
FDECSTP
FST TMP2
FADD ST,ST(4);2=2+6
FDECSTP
FST TMP3
FADD ST,ST(4);3=3+7
FDECSTP
FSUBR TMP0 ;4=0-4
FDECSTP
FSUBR TMP1 ;5=1-5
FDECSTP
FSUBR TMP2 ;6=2-6
FDECSTP
FSUBR TMP3 ;7=3-7
;--------------------------------
FSTP DWORD PTR DS:[BP+5*4];7-5
FSTP DWORD PTR DS:[BP+4*4];6-4
FSTP DWORD PTR DS:[BP+6*4];5-6
FSTP DWORD PTR DS:[BP+7*4];4-7
FSTP DWORD PTR DS:[BP+2*4];3-2
FSTP DWORD PTR DS:[BP+3*4];2-3
FSTP DWORD PTR DS:[BP+1*4];1-1
FSTP DWORD PTR DS:[BP+0*4];0-0
ADD BP,32
DEC COUNTOR1
JE GO_87
JMP AGAIN1_87
GO_87: LEA SI,X1
MOV CX,64
ICHG_DATA_FORMAT:
SHL WORD PTR [SI+2],1
RCR BYTE PTR [SI+2],1
ADD SI,4
LOOP ICHG_DATA_FORMAT
RET
IDCT_2D_87 ENDP
;======================================
IDCT_2D PROC NEAR
MOVS_2_1 0,0,0
MOVS_2_1 2,1,4
MOVS_2_1 3,2,4
MOVS_2_1 9,3,4
MOVS_2_1 10,4,4
MOVS_2_1 20,5,4
MOVS_2_1 21,6,4
MOVS_2_1 35,7,4
MOVS_2_1 39,8,0
MOVS_2_1 46,9,0
MOVS_2_1 50,10,0
MOVS_2_1 57,11,0
MOVS_2_1 14,12,4
MOVS_2_1 16,13,0
MOVS_2_1 25,14,0
MOVS_2_1 31,15,0
MOVS_2_1 41,16,0
MOVS_2_1 44,17,0
MOVS_2_1 52,18,0
MOVS_2_1 55,19,0
MOVS_2_1 37,20,0
MOVS_2_1 33,21,0
MOVS_2_1 23,22,0
MOVS_2_1 18,23,0
MOVS_2_1 12,24,0
MOVS_2_1 7,25,0
MOVS_2_1 5,26,4
MOVS_2_1 62,27,0
MOVS_2_1 59,28,0
MOVS_2_1 48,29,0
MOVS_2_1 27,30,4
MOVS_2_1 29,31,0
MOVS_2_1 4,32,0
MOVS_2_1 1,33,4
MOVS_2_1 63,34,0
MOVS_2_1 61,35,0
MOVS_2_1 60,36,0
MOVS_2_1 54,37,0
MOVS_2_1 53,38,0
MOVS_2_1 43,39,0
MOVS_2_1 42,40,0
MOVS_2_1 45,41,0
MOVS_2_1 51,42,0
MOVS_2_1 56,43,0
MOVS_2_1 22,44,0
MOVS_2_1 19,45,0
MOVS_2_1 11,46,0
MOVS_2_1 8,47,0
MOVS_2_1 26,48,0
MOVS_2_1 30,49,0
MOVS_2_1 40,50,0
MOVS_2_1 32,51,0
MOVS_2_1 24,52,0
MOVS_2_1 17,53,0
MOVS_2_1 13,54,0
MOVS_2_1 6,55,4
MOVS_2_1 58,56,0
MOVS_2_1 34,57,0
MOVS_2_1 36,58,0
MOVS_2_1 28,59,4
MOVS_2_1 38,60,0
MOVS_2_1 47,61,0
MOVS_2_1 49,62,0
MOVS_2_1 15,63,4
;--------------------CODE--------------------
MOV_1_2 0,0,2
MOV_1_2 1,1,2
MOV_1_2 2,2,2
MOV_1_2 3,3,2
MOV_1_2 4,4,2
MOV_1_2 5,5,2
MOV_1_2 6,6,2
MOV_1_2 7,7,2
MOV_1_2 8,8,2
MOV_1_2 12,12,2
MOV_1_2 26,26,2
MOV AX,WORD PTR X2[30*4]
MOV BX,WORD PTR X2[30*4+2]
PUSH AX
OR AX,BX
POP AX
JZ Z1
INC BH
SUB BL,80H
Z1: MOV WORD PTR X1[30*4],AX
MOV WORD PTR X1[30*4+2],BX
ASK_1_2 9,15,15,9
ASK_1_2 10,14,14,10
ASK_1_2 11,13,13,11
ASK_1_2 20,16,20,16
ASK_1_2 21,17,21,17
ASK_1_2 22,18,22,18
ASK_1_2 23,19,23,19
ASK_1_2 24,28,24,28
ASK_1_2 25,27,25,27
MOV AX,WORD PTR X2[29*4+2]
MOV BX,WORD PTR X2[29*4]
MOV CX,WORD PTR X2[31*4+2]
MOV DX,WORD PTR X2[31*4]
PUSH AX
PUSH BX
CALL FLOAT_ADD
SUB AL,80H
MOV WORD PTR X1[29*4+2],AX
MOV WORD PTR X1[29*4],BX
POP BX
POP AX
SUB CL,80H
CALL FLOAT_ADD
MOV WORD PTR X1[31*4+2],AX
MOV WORD PTR X1[31*4],BX
ASK_1_2 32,34,32,34
ASK_1_2 47,35,47,35
ASK_1_2 46,36,46,36
ASK_1_2 45,37,45,37
ASK_1_2 44,38,44,38
ASK_1_2 57,39,57,39
ASK_1_2 58,40,58,40
ASK_1_2 51,41,51,41
ASK_1_2 52,42,52,42
ASK_1_2 53,43,53,43
ASK_1_2 48,62,48,62
ASK_1_2 49,61,49,61
ASK_1_2 50,60,50,60
ASK_1_2 56,54,54,56
MOV_1_2 33,33,2
MOV_1_2 55,55,2
MOV_1_2 59,59,2
MOV_1_2 63,63,2
;/*===================1 level======================*/
ASK_2_1 0,8,0,8
ASK_2_1 1,9,1,9
ASK_2_1 2,10,2,10
ASK_2_1 3,11,3,11
ASK_2_1 4,12,4,12
ASK_2_1 5,13,5,13
ASK_2_1 6,14,6,14
ASK_2_1 7,15,7,15
ASK_2_1 17,31,17,31
ASK_2_1 18,30,18,30
ASK_2_1 19,29,19,29
ASK_2_1 28,20,28,20
ASK_2_1 27,21,27,21
ASK_2_1 26,22,26,22
ASK_2_1 25,23,25,23
MOV_2_1 16,16,2
MOV_2_1 24,24,2
ASK_2_1 32,52,32,52
ASK_2_1 33,51,33,51
ASK_2_1 34,50,34,50
ASK_2_1 35,49,35,49
ASK_2_1 36,48,36,48
ASK_2_1 37,63,37,63
ASK_2_1 38,62,38,62
ASK_2_1 39,61,39,61
ASK_2_1 40,60,40,60
ASK_2_1 41,59,41,59
ASK_2_1 42,58,42,58
ASK_2_1 43,57,43,57
ASK_2_1 44,56,44,56
ASK_2_1 45,55,45,55
ASK_2_1 46,54,46,54
ASK_2_1 47,53,47,53
;/*=====================2 level ======================*/
ASK_1_2 0,24,0,24
ASK_1_2 8,16,8,16
ASK_1_2 1,25,1,25
ASK_1_2 9,17,9,17
ASK_1_2 2,26,2,26
ASK_1_2 10,18,10,18
ASK_1_2 3,27,3,27
ASK_1_2 11,19,11,19
ASK_1_2 4,28,4,28
ASK_1_2 12,20,12,20
ASK_1_2 5,29,5,29
ASK_1_2 13,21,13,21
ASK_1_2 6,30,6,30
ASK_1_2 14,22,14,22
ASK_1_2 7,31,7,31
ASK_1_2 15,23,15,23
ASK_1_2 33,47,33,47
ASK_1_2 34,46,34,46
ASK_1_2 35,45,35,45
ASK_1_2 36,44,36,44
ASK_1_2 37,43,37,43
ASK_1_2 38,42,38,42
ASK_1_2 39,41,39,41
ASK_1_2 49,63,49,63
ASK_1_2 50,62,50,62
ASK_1_2 51,61,51,61
ASK_1_2 52,60,52,60
ASK_1_2 53,59,53,59
ASK_1_2 54,58,54,58
ASK_1_2 55,57,55,57
MOV_1_2 32,32,2
MOV_1_2 40,40,2
MOV_1_2 48,48,2
MOV_1_2 56,56,2
LEA SI,X1
MOV COUNTOR1,8
AGAIN1: DIV32 0,64
DIV32 4,32
LEA BP,CONST6
LEA DI,[SI+4*4]
CALL FLOAT_DIV
DIV32 2,32
DIV32 6,32
MOV BX,[SI+6*4]
MOV CX,[SI+2*4+2]
MOV DX,[SI+2*4]
CALL FLOAT_ADD
MOV [SI+6*4+2],AX
MOV [SI+6*4],BX
LEA BP,CONST6
LEA DI,[SI+6*4]
CALL FLOAT_DIV
DIV32 1,32
DIV32 5,32
DIV32 3,32
DIV32 7,32
MOV BX,[SI+7*4]
MOV CX,[SI+5*4+2]
MOV DX,[SI+5*4]
CALL FLOAT_ADD
MOV [SI+7*4+2],AX
MOV [SI+7*4],BX
MOV AX,[SI+3*4+2]
MOV BX,[SI+3*4]
PUSH AX
PUSH BX
CALL FLOAT_ADD
MOV WORD PTR [SI+5*4+2],AX
MOV WORD PTR [SI+5*4],BX
LEA DI,[SI+5*4]
LEA BP,CONST6
CALL FLOAT_DIV
POP BX
POP AX
MOV CX,[SI+1*4+2]
MOV DX,[SI+1*4]
CALL FLOAT_ADD
MOV WORD PTR [SI+3*4+2],AX
MOV WORD PTR [SI+3*4],BX
MOV CX,WORD PTR [SI+7*4+2]
MOV DX,WORD PTR [SI+7*4]
CALL FLOAT_ADD
MOV WORD PTR [SI+7*4+2],AX
MOV WORD PTR [SI+7*4],BX
LEA BP,CONST6
LEA DI,[SI+7*4]
CALL FLOAT_DIV
MOV AX,[SI+0*4+2]
MOV BX,[SI+0*4]
MOV CX,[SI+4*4+2]
MOV DX,[SI+4*4]
PUSH AX
PUSH BX
CALL FLOAT_ADD
MOV [SI+0*4+2],AX
MOV [SI+0*4],BX
POP BX
POP AX
SUB CL,80H
CALL FLOAT_ADD
MOV [SI+4*4+2],AX
MOV [SI+4*4],BX
MOV AX,[SI+2*4+2]
MOV BX,[SI+2*4]
MOV CX,[SI+6*4+2]
MOV DX,[SI+6*4]
PUSH AX
PUSH BX
CALL FLOAT_ADD
MOV [SI+2*4+2],AX
MOV [SI+2*4],BX
POP BX
POP AX
SUB CL,80H
CALL FLOAT_ADD
MOV [SI+6*4+2],AX
MOV [SI+6*4],BX
LEA BP,CONST4
LEA DI,[SI+2*4]
CALL FLOAT_DIV
LEA BP,CONST5
LEA DI,[SI+6*4]
CALL FLOAT_DIV
MOV AX,[SI+1*4+2]
MOV BX,[SI+1*4]
MOV CX,[SI+5*4+2]
MOV DX,[SI+5*4]
PUSH AX
PUSH BX
CALL FLOAT_ADD
MOV [SI+1*4+2],AX
MOV [SI+1*4],BX
POP BX
POP AX
SUB CL,80H
CALL FLOAT_ADD
MOV [SI+5*4+2],AX
MOV [SI+5*4],BX
MOV AX,[SI+3*4+2]
MOV BX,[SI+3*4]
MOV CX,[SI+7*4+2]
MOV DX,[SI+7*4]
PUSH AX
PUSH BX
CALL FLOAT_ADD
MOV [SI+3*4+2],AX
MOV [SI+3*4],BX
POP BX
POP AX
SUB CL,80H
CALL FLOAT_ADD
MOV [SI+7*4+2],AX
MOV [SI+7*4],BX
LEA BP,CONST4
LEA DI,[SI+3*4]
CALL FLOAT_DIV
LEA BP,CONST5
LEA DI,[SI+7*4]
CALL FLOAT_DIV
MOV AX,[SI+0*4+2]
MOV BX,[SI+0*4]
MOV CX,[SI+2*4+2]
MOV DX,[SI+2*4]
PUSH AX
PUSH BX
CALL FLOAT_ADD
MOV [SI+0*4+2],AX
MOV [SI+0*4],BX
POP BX
POP AX
SUB CL,80H
CALL FLOAT_ADD ;2=0-2
MOV [SI+2*4+2],AX
MOV [SI+2*4],BX
MOV AX,[SI+4*4+2]
MOV BX,[SI+4*4]
MOV CX,[SI+6*4+2]
MOV DX,[SI+6*4]
PUSH AX
PUSH BX
CALL FLOAT_ADD
MOV [SI+4*4+2],AX
MOV [SI+4*4],BX
POP BX
POP AX
SUB CL,80H
CALL FLOAT_ADD ;3=1-3
MOV [SI+6*4+2],AX
MOV [SI+6*4],BX
MOV AX,[SI+1*4+2]
MOV BX,[SI+1*4]
MOV CX,[SI+3*4+2]
MOV DX,[SI+3*4]
PUSH AX
PUSH BX
CALL FLOAT_ADD ;4=4+6
MOV [SI+1*4+2],AX
MOV [SI+1*4],BX
POP BX
POP AX
SUB CL,80H
CALL FLOAT_ADD ;6=4-6
MOV [SI+3*4+2],AX
MOV [SI+3*4],BX
LEA BP,CONST0
LEA DI,[SI+1*4]
CALL FLOAT_DIV
LEA BP,CONST2
LEA DI,[SI+3*4]
CALL FLOAT_DIV
MOV AX,[SI+5*4+2]
MOV BX,[SI+5*4]
MOV CX,[SI+7*4+2]
MOV DX,[SI+7*4]
PUSH AX
PUSH BX
CALL FLOAT_ADD ;5=5+7
MOV [SI+5*4+2],AX
MOV [SI+5*4],BX
POP BX
POP AX
SUB CL,80H
CALL FLOAT_ADD ;7=5-7
MOV [SI+7*4+2],AX
MOV [SI+7*4],BX
LEA BP,CONST1
LEA DI,[SI+5*4]
CALL FLOAT_DIV
LEA BP,CONST3
LEA DI,[SI+7*4]
CALL FLOAT_DIV
MOV AX,[SI+0*4+2]
MOV BX,[SI+0*4]
MOV CX,[SI+1*4+2]
MOV DX,[SI+1*4]
PUSH AX
PUSH BX
CALL FLOAT_ADD
MOV [SI+0*4+2],AX
MOV [SI+0*4],BX
POP BX
POP AX
SUB CL,80H
CALL FLOAT_ADD ;4=0-4
MOV [SI+1*4+2],AX
MOV [SI+1*4],BX
MOV AX,[SI+4*4+2]
MOV BX,[SI+4*4]
MOV CX,[SI+5*4+2]
MOV DX,[SI+5*4]
PUSH AX
PUSH BX
CALL FLOAT_ADD
MOV [SI+4*4+2],AX
MOV [SI+4*4],BX
POP BX
POP AX
SUB CL,80H
CALL FLOAT_ADD ;5=1-5
MOV [SI+5*4+2],AX
MOV [SI+5*4],BX
MOV AX,[SI+2*4+2]
MOV BX,[SI+2*4]
MOV CX,[SI+3*4+2]
MOV DX,[SI+3*4]
PUSH AX
PUSH BX
CALL FLOAT_ADD
MOV [SI+2*4+2],AX
MOV [SI+2*4],BX
POP BX
POP AX
SUB CL,80H
CALL FLOAT_ADD ;6=2-6
MOV [SI+3*4+2],AX
MOV [SI+3*4],BX
MOV AX,[SI+6*4+2] ;3=3+7
MOV BX,[SI+6*4]
MOV CX,[SI+7*4+2]
MOV DX,[SI+7*4]
PUSH AX
PUSH BX
CALL FLOAT_ADD
MOV [SI+6*4+2],AX
MOV [SI+6*4],BX
POP BX
POP AX
SUB CL,80H
CALL FLOAT_ADD ;7=3-7
MOV [SI+7*4+2],AX
MOV [SI+7*4],BX
MOV CX,[SI+5*4+2]
MOV DX,[SI+5*4]
MOV AX,[SI+7*4+2]
MOV BX,[SI+7*4]
MOV [SI+5*4+2],AX
MOV [SI+5*4],BX
MOV AX,[SI+1*4+2]
MOV BX,[SI+1*4]
MOV [SI+7*4+2],AX
MOV [SI+7*4],BX
MOV AX,[SI+4*4+2]
MOV BX,[SI+4*4]
MOV [SI+1*4+2],AX
MOV [SI+1*4],BX
MOV AX,[SI+3*4+2]
MOV BX,[SI+3*4]
MOV [SI+4*4+2],AX
MOV [SI+4*4],BX
MOV AX,[SI+2*4+2]
MOV BX,[SI+2*4]
MOV [SI+3*4+2],AX
MOV [SI+3*4],BX
MOV AX,[SI+6*4+2]
MOV BX,[SI+6*4]
MOV [SI+2*4+2],AX
MOV [SI+2*4],BX
MOV [SI+6*4+2],CX
MOV [SI+6*4],DX
;-------------------------------------
ADD SI,32
DEC COUNTOR1
JE GO
JMP AGAIN1
GO:
RET
IDCT_2D ENDP
;======================================
MOVE_DATA_BUFF PROC
PUSH ES
MOV AX,SOURCE
MOV ES,AX
PUSH SI
MOV SI,LOCATION
XOR BP,BP
ASK_X_1 0,4,0,0,512,0
ASK_X_1 0,4,1,1,512,0
ASK_X_1 0,4,2,2,512,0
ASK_X_1 0,4,3,3,512,0
ASK_X_1 0,4,4,4,512,0
ASK_X_1 0,4,5,5,512,0
ASK_X_1 0,4,6,6,512,0
ASK_X_1 0,4,7,7,512,0
XOR BP,BP
ASK_X_1 1,6,0,1,512,0
ASK_X_1 1,6,1,4,512,0
ASK_X_1 1,6,2,7,512,0
ASK_X_1 1,6,3,2,512,1
ASK_X_1 1,6,4,5,512,1
ASK_X_1 1,6,5,0,512,0
ASK_X_1 1,6,6,3,512,0
ASK_X_1 1,6,7,6,512,0
XOR BP,BP
ASK_X_1 2,7,0,2,512,0
ASK_X_1 2,7,1,7,512,0
ASK_X_1 2,7,2,4,512,1
ASK_X_1 2,7,3,1,512,0
ASK_X_1 2,7,4,6,512,0
ASK_X_1 2,7,5,3,512,1
ASK_X_1 2,7,6,0,512,0
ASK_X_1 2,7,7,5,512,0
XOR BP,BP
ASK_X_1 3,5,0,3,512,0
ASK_X_1 3,5,1,2,512,1
ASK_X_1 3,5,2,1,512,0
ASK_X_1 3,5,3,0,512,1
ASK_X_1 3,5,4,7,512,1
ASK_X_1 3,5,5,6,512,0
ASK_X_1 3,5,6,5,512,1
ASK_X_1 3,5,7,4,512,0
POP SI
POP ES
RET
MOVE_DATA_BUFF ENDP
;======================================
IQSTD PROC
AND DX,DX
PUSHF
JNS SHIFT1
NEG AX
SHIFT1: MOV BYTE PTR X1[SI+3],8EH
SHIFT2: SHL AX,1
JC STAND_END
DEC BYTE PTR X1[SI+3]
JMP SHIFT2
STAND_END: MOV BYTE PTR X1[SI],0
MOV WORD PTR X1[SI+1],AX
SHR WORD PTR X1[SI+1],1
RCR BYTE PTR X1[SI],1
POPF
JZ SET
OR BYTE PTR X1[SI+2],80H
SET: RET
IQSTD ENDP
;**************************************
;Input: AX:BX+CX:DX
;Output: AX:BX
;**************************************
FLOAT_ADD PROC NEAR
FADD00: PUSH CX
PUSH DX
PUSH AX
OR AX,BX
POP AX
JZ FADD1
PUSH CX
OR CX,DX
POP CX
JZ FADD12
; CMP AX,80H
; JNZ NXT0
; AND BX,BX
; JNZ NXT0
; XOR AX,AX
; JMP FADD1
;NXT0: CMP CX,80H
; JNZ NXT1
; AND DX,DX
; JNZ NXT1
; XOR CX,CX
; JMP FADD12
;NXT1:
CMP AH,CH
JZ FADD3
JNC FADD4
XCHG AX,CX
XCHG BX,DX
FADD4: SUB AH,CH
CMP AH,24
JC FADD5
ADD AH,CH
JMP FADD21
FADD5: AND AL,AL
PUSHF
XOR AL,CL
PUSHF
XOR AL,CL
OR CL,80H
FADD6: SHR CL,1
RCR DX,1
INC CH
DEC AH
JNZ FADD6
MOV AH,CH
OR AL,80H
FADD7: POPF
JS FADD8
FADD9: ADD BX,DX
ADC AL,CL
RCR AL,1
RCR BX,1
INC AH
FADD10: TEST AL,80H
JNZ FADD11
SHL BX,1
RCL AL,1
DEC AH
JMP FADD10
FADD11: POPF
JS FADD12
AND AL,7FH
FADD12: CLC
POP DX
POP CX
RET
FADD8: SUB BX,DX
SBB AL,CL
JMP FADD10
FADD1: XCHG AX,CX
XCHG BX,DX
JMP FADD12
FADD3: AND AL,AL
PUSHF
XOR AL,CL
PUSHF
XOR AL,CL
POPF
JS FADD14
OR AL,80H
OR CL,80H
JMP FADD9
FADD14: AND CL,CL
PUSHF
JS FADD15
OR CL,80H
FADD15: OR AL,80H
CMP AL,CL
JNZ FADD13
CMP BX,DX
JNZ FADD13
POPF
POPF
XOR AX,AX
XOR BX,BX
POP DX
POP CX
RET
FADD13: JNC FADD16
XCHG AX,CX
XCHG BX,DX
POP DI
POPF
PUSH DI
JMP FADD8
FADD16: POPF
JMP FADD8
FADD21: STC
POP DX
POP CX
RET
FLOAT_ADD ENDP
;**************************************
; INPUT SR:BP DT:DI TEMP:BX
; DT=SR*DT
;**************************************
FLOAT_MUL PROC
PUSH ES
PUSH DS
POP ES
MOV DX,DS:[BP+2]
PUSH DX
OR DX,DS:[BP]
POP DX
JNZ NOT_ZERO1
JMP MUL_ZERO
NOT_ZERO1: MOV CX,[DI+2]
PUSH CX
OR CX,[DI]
POP CX
JNZ NOT_ZERO
JMP MUL_ZERO
NOT_ZERO: XOR DL,CL
PUSHF
XOR DL,CL
PUSH DX
OR DL,80H
OR CL,80H
MOV DS:[BP+2],DL
MOV [DI+2],CL
ADD DH,CH
SUB DH,7DH
MOV [DI+3],DH
XOR AX,AX
PUSH DI
LEA BX,MUL_TEMP
MOV DI,BX
MOV CX,3
REPZ STOSW
POP DI
PUSH DI
PUSH BP
MOV CX,3
MUL_LOOP1: PUSH CX
MOV DL,DS:[BP]
INC BP
PUSH BX
PUSH DI
MOV CX,3
MUL_LOOP2: MOV AL,[DI]
INC DI
MUL DL
ADD [BX],AX
INC BX
LOOP MUL_LOOP2
POP DI
POP BX
INC BX
POP CX
LOOP MUL_LOOP1
POP BP
POP DI
POP DS:[BP+2]
LEA BX,MUL_TEMP+2
XOR CL,CL
FSTD: INC CL
SHL WORD PTR [BX],1
RCL WORD PTR [BX+2],1
JNC FSTD
SUB [DI+3],CL
MOV AX,[BX+1]
MOV [DI],AX
MOV AH,[BX+3]
MOV [DI+2],AH
SHR BYTE PTR [DI+2],1
RCR WORD PTR [DI],1
ADC WORD PTR [DI],0
ADC WORD PTR [DI+2],0
POPF
JNS MUL_END
OR BYTE PTR [DI+2],80H
JMP MUL_END
MUL_ZERO: XOR AX,AX
MOV [DI],AX
MOV [DI+2],AX
MUL_END: POP ES
RET
FLOAT_MUL ENDP
;**************************************
; SR=BP , DT=DI , TEMP:MUL_TEMP=BX
; DT=DT/SR;
;**************************************
FLOAT_DIV PROC
PUSH ES
PUSH DS
POP ES
MOV CX,[DI+2]
PUSH CX
OR CX,[DI]
POP CX
JNZ CONT0
JMP DIV_ZERO
CONT0: MOV AX,DS:[BP+2]
XOR AL,CL
PUSHF
XOR AL,CL
PUSH AX
SUB CH,AH
CMP CH,-24
JG CONT1
POP AX
POPF
JMP DIV_ZERO
CONT1: OR CL,80H
ADD CH,80H
MOV [DI+3],CH
OR AL,80H
MOV DS:[BP+2],AL
LEA BX,MUL_TEMP+3
MOV [BX+2],CL
MOV AX,[DI]
MOV [BX],AX
XOR CH,CH
MOV [BX-1],CH
SHR WORD PTR [BX+1],1
RCR WORD PTR [BX-1],1
MOV CX,24
DIVP: PUSH CX
SHL WORD PTR [DI],1
RCL BYTE PTR [DI+2],1
SHL WORD PTR [BX-1],1
RCL word PTR [BX+1],1
JC MSUB0
MOV CX,3
PUSH BX
PUSH BP
ADD BX,2
ADD BP,2
COMPARE: MOV AL,[BX]
CMP AL,DS:[BP]
JNZ CONT3
DEC BX
DEC BP
LOOP COMPARE
CONT3: POP BP
POP BX
JC CHCNT
MSUB0: PUSH BP
PUSH BX
MOV CX,3
CLC
MSUB: MOV AL,DS:[BP]
SBB [BX],AL
INC BP
INC BX
LOOP MSUB
POP BX
POP BP
INC BYTE PTR [DI]
CHCNT: POP CX
LOOP DIVP
XOR CL,CL
STDP: INC CL
SHL WORD PTR [DI],1
RCL BYTE PTR [DI+2],1
JNC STDP
SUB [DI+3],CL
SHR BYTE PTR [DI+2],1
RCR WORD PTR [DI],1
POP DS:[BP+2]
POPF
JNS CONT4
OR BYTE PTR [DI+2],80H
CONT4: JMP DIV_END
DIV_ZERO: XOR AX,AX
MOV WORD PTR [DI],AX
MOV WORD PTR [DI+2],AX
DIV_END: POP ES
RET
FLOAT_DIV ENDP
_JPEG_TEXT ENDS
END