www.pudn.com > jpeg1.zip > DCT.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 PARA 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 ( ? ) 
X12		DW 	64 DUP ( ? ) 
LH_DENIST 	DW 	64 DUP ( ? ) 
ABOUT_0     	DW 	64 DUP ( 0 ) 
LABLES   	DD 	2  DUP ( 0 ) 
 
LH_TABLE	DW   	16,11,12,14,12,10,16,14 
		DW   	13,14,18,17,16,19,24,40 
		DW   	26,24,22,22,24,49,35,37 
		DW   	29,40,58,51,61,60,57,51 
		DW   	56,55,64,72,92,78,64,68 
		DW   	87,69,55,56,80,109,81,87 
		DW   	95,98,103,104,103,62,77,113 
		DW   	121,112,100,120,92,101,103,99 
 
COLOR_TABLE	DW      17,18,18,24,21,24,47,26 
		DW	26,47,99,66,56,66,99,99 
		DW	99,99,99,99,99,99,99,99 
		DW	99,99,99,99,99,99,99,99 
		DW	99,99,99,99,99,99,99,99 
                DW	99,99,99,99,99,99,99,99 
		DW	99,99,99,99,99,99,99,99 
		DW	99,99,99,99,99,99,99,99 
 
COUNTOR1 	DW 	? 
COUNT2		DW	? 
COUNT3		DW	? 
STEP		DW	? 
DIMENSION_X 	DW 	? 
DIMENSION_Y 	DW 	? 
LOCATION	DW	0 
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	? 
CODE_BUFF       DW 	? 
SOURCE          DW 	? 
DCT_SUB		DW	DCT_2D 
DCT_87		DW	DCT_2D_87 
NUM 		DW 	10000 
INT_2 		DW  	2 
INT_4 		DW  	4 
INT_32 		DW 	32 
INT_64 		DW 	64 
TMP0 		DD   	? 
TMP1 		DD   	? 
TMP2 		DD   	? 
TMP3 		DD   	? 
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 
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 
MUL_TEMP	DB	6 DUP ( ? ) 
 
CODE_LOCATION   DW 	1 
CODE_CURRENT_LOCATION 	DB 	32 
 
DC_TABLE   	DD 01000000000000000000000000000011B;0 
		DD 01100000000000000000000000000011B;1 
		DD 10000000000000000000000000000011B;2 
		DD 00000000000000000000000000000010B;3 
		DD 10100000000000000000000000000011B;4 
		DD 11000000000000000000000000000011B;5 
		DD 11100000000000000000000000000100B;6 
		DD 11110000000000000000000000000101B;7 
		DD 11111000000000000000000000000110B;8 
		DD 11111100000000000000000000000111B;9 
		DD 11111110000000000000000000001000B;A 
		DD 11111111000000000000000000001001B;B 
 
CHRO_DC_TABLE	DD 00000000000000000000000000000010B;0 
		DD 01000000000000000000000000000010B;1 
		DD 10000000000000000000000000000010B;2 
		DD 11000000000000000000000000000011B;3 
		DD 11100000000000000000000000000100B;4 
		DD 11110000000000000000000000000101B;5 
		DD 11111000000000000000000000000110B;6 
		DD 11111100000000000000000000000111B;7 
		DD 11111110000000000000000000001000B;8 
		DD 11111111000000000000000000001001B;9 
		DD 11111111100000000000000000001010B;A 
		DD 11111111110000000000000000001011B;B 
 
CODE_TABLE 	DD 10100000000000000000000000000100B;0/0 
		DD 00000000000000000000000000000010B;0/1 
		DD 01000000000000000000000000000010B;0/2 
		DD 10000000000000000000000000000011B;0/3 
		DD 10110000000000000000000000000100B;0/4 
		DD 11010000000000000000000000000101B;0/5 
		DD 11100000000000000000000000000110B;0/6 
		DD 11110000000000000000000000000111B;0/7 
		DD 11111101100000000000000000001010B;0/8 
		DD 11111111100000100000000000010000B;0/9 
		DD 11111111100000110000000000010000B;0/A 
		DD 6 DUP (0) 
		DD 11000000000000000000000000000100B;1/1 
		DD 11100100000000000000000000000110B;1/2 
		DD 11110010000000000000000000000111B;1/3 
		DD 11111011000000000000000000001001B;1/4 
		DD 11111110110000000000000000001011B;1/5 
		DD 11111111100001000000000000010000B;1/6 
		DD 11111111100001010000000000010000B;1/7 
		DD 11111111100001100000000000010000B;1/8 
		DD 11111111100001110000000000010000B;1/9 
		DD 11111111100010000000000000010000B;1/A 
		DD 6 DUP (0) 
		DD 11011000000000000000000000000101B;2/1 
		DD 11111000000000000000000000001000B;2/2 
		DD 11111101110000000000000000001010B;2/3 
		DD 11111111100010010000000000010000B;2/4 
		DD 11111111100010100000000000010000B;2/5 
		DD 11111111100010110000000000010000B;2/6 
		DD 11111111100011000000000000010000B;2/7 
		DD 11111111100011010000000000010000B;2/8 
		DD 11111111100011100000000000010000B;2/9 
		DD 11111111100011110000000000010000B;2/A 
		DD 6 DUP (0) 
		DD 11101000000000000000000000000110B;3/1 
		DD 11111011100000000000000000001001B;3/2 
		DD 11111110111000000000000000001011B;3/3 
		DD 11111111100100000000000000010000B;3/4 
		DD 11111111100100010000000000010000B;3/5 
		DD 11111111100100100000000000010000B;3/6 
		DD 11111111100100110000000000010000B;3/7 
		DD 11111111100101000000000000010000B;3/8 
		DD 11111111100101010000000000010000B;3/9 
		DD 11111111100101100000000000010000B;3/A 
		DD 6 DUP (0) 
		DD 11101100000000000000000000000110B;4/1 
		DD 11111110000000000000000000001010B;4/2 
		DD 11111111100101110000000000010000B;4/3 
		DD 11111111100110000000000000010000B;4/4 
		DD 11111111100110010000000000010000B;4/5 
		DD 11111111100110100000000000010000B;4/6 
		DD 11111111100110110000000000010000B;4/7 
		DD 11111111100111000000000000010000B;4/8 
		DD 11111111100111010000000000010000B;4/9 
		DD 11111111100111100000000000010000B;4/A 
		DD 6 DUP (0) 
		DD 11110100000000000000000000000111B;5/1 
		DD 11111110010000000000000000001010B;5/2 
		DD 11111111100111110000000000010000B;5/3 
		DD 11111111101000000000000000010000B;5/4 
		DD 11111111101000010000000000010000B;5/5 
		DD 11111111101000100000000000010000B;5/6 
		DD 11111111101000110000000000010000B;5/7 
		DD 11111111101001000000000000010000B;5/8 
		DD 11111111101001010000000000010000B;5/9 
		DD 11111111101001100000000000010000B;5/A 
		DD 6 DUP (0) 
		DD 11110110000000000000000000000111B;6/1 
		DD 11111111000000000000000000001011B;6/2 
		DD 11111111101001110000000000010000B;6/3 
		DD 11111111101010000000000000010000B;6/4 
		DD 11111111101010010000000000010000B;6/5 
		DD 11111111101010100000000000010000B;6/6 
		DD 11111111101010110000000000010000B;6/7 
		DD 11111111101011000000000000010000B;6/8 
		DD 11111111101011010000000000010000B;6/9 
		DD 11111111101011100000000000010000B;6/A 
		DD 6 DUP (0) 
		DD 11111001000000000000000000001000B;7/1 
		DD 11111111001000000000000000001011B;7/2 
		DD 11111111101011110000000000010000B;7/3 
		DD 11111111101100000000000000010000B;7/4 
		DD 11111111101100010000000000010000B;7/5 
		DD 11111111101100100000000000010000B;7/6 
		DD 11111111101100110000000000010000B;7/7 
		DD 11111111101101000000000000010000B;7/8 
		DD 11111111101101010000000000010000B;7/9 
		DD 11111111101101100000000000010000B;7/A 
		DD 6 DUP (0) 
		DD 11111010000000000000000000001000B;8/1 
		DD 11111111100000000000000000001111B;8/2 
		DD 11111111101101110000000000010000B;8/3 
		DD 11111111101110000000000000010000B;8/4 
		DD 11111111101110010000000000010000B;8/5 
		DD 11111111101110100000000000010000B;8/6 
		DD 11111111101110110000000000010000B;8/7 
		DD 11111111101111000000000000010000B;8/8 
		DD 11111111101111010000000000010000B;8/9 
		DD 11111111101111100000000000010000B;8/A 
		DD 6 DUP (0) 
		DD 11111100000000000000000000001001B;9/1 
		DD 11111111101111110000000000010000B;9/2 
		DD 11111111110000000000000000010000B;9/3 
		DD 11111111110000010000000000010000B;9/4 
		DD 11111111110000100000000000010000B;9/5 
		DD 11111111110000110000000000010000B;9/6 
		DD 11111111110001000000000000010000B;9/7 
		DD 11111111110001010000000000010000B;9/8 
		DD 11111111110001100000000000010000B;9/9 
		DD 11111111110001110000000000010000B;9/A 
		DD 6 DUP (0) 
		DD 11111100100000000000000000001001B;A/1 
		DD 11111111110010000000000000010000B;A/2 
		DD 11111111110010010000000000010000B;A/3 
		DD 11111111110010100000000000010000B;A/4 
		DD 11111111110010110000000000010000B;A/5 
		DD 11111111110011000000000000010000B;A/6 
		DD 11111111110011010000000000010000B;A/7 
		DD 11111111110011100000000000010000B;A/8 
		DD 11111111110011110000000000010000B;A/9 
		DD 11111111110100000000000000010000B;A/A 
		DD 6 DUP (0) 
		DD 11111101000000000000000000001001B;B/1 
		DD 11111111110100010000000000010000B;B/2 
		DD 11111111110100100000000000010000B;B/3 
		DD 11111111110100110000000000010000B;B/4 
		DD 11111111110101000000000000010000B;B/5 
		DD 11111111110101010000000000010000B;B/6 
		DD 11111111110101100000000000010000B;B/7 
		DD 11111111110101110000000000010000B;B/8 
		DD 11111111110110000000000000010000B;B/9 
		DD 11111111110110010000000000010000B;B/A 
		DD 6 DUP (0) 
		DD 11111110100000000000000000001010B;C/1 
		DD 11111111110110100000000000010000B;C/2 
		DD 11111111110110110000000000010000B;C/3 
		DD 11111111110111000000000000010000B;C/4 
		DD 11111111110111010000000000010000B;C/5 
		DD 11111111110111100000000000010000B;C/6 
		DD 11111111110111110000000000010000B;C/7 
		DD 11111111111000000000000000010000B;C/8 
		DD 11111111111000010000000000010000B;C/9 
		DD 11111111111000100000000000010000B;C/A 
		DD 6 DUP (0) 
		DD 11111111010000000000000000001011B;D/1 
		DD 11111111111000110000000000010000B;D/2 
		DD 11111111111001000000000000010000B;D/3 
		DD 11111111111001010000000000010000B;D/4 
		DD 11111111111001100000000000010000B;D/5 
		DD 11111111111001110000000000010000B;D/6 
		DD 11111111111010000000000000010000B;D/7 
		DD 11111111111010010000000000010000B;D/8 
		DD 11111111111010100000000000010000B;D/9 
		DD 11111111111010110000000000010000B;D/A 
		DD 6 DUP (0) 
		DD 11111111011000000000000000001100B;E/1 
		DD 11111111111011000000000000010000B;E/2 
		DD 11111111111011010000000000010000B;E/3 
		DD 11111111111011100000000000010000B;E/4 
		DD 11111111111011110000000000010000B;E/5 
		DD 11111111111100000000000000010000B;E/6 
		DD 11111111111100010000000000010000B;E/7 
		DD 11111111111100100000000000010000B;E/8 
		DD 11111111111100110000000000010000B;E/9 
		DD 11111111111101000000000000010000B;E/A 
		DD 5 DUP (0) 
		DD 11111111011100000000000000001100B;F/0 
		DD 11111111111101010000000000010000B;F/1 
		DD 11111111111101100000000000010000B;F/2 
		DD 11111111111101110000000000010000B;F/3 
		DD 11111111111110000000000000010000B;F/4 
		DD 11111111111110010000000000010000B;F/5 
		DD 11111111111110100000000000010001B;F/6 
		DD 11111111111110110000000000010001B;F/7 
		DD 11111111111111000000000000010001B;F/8 
		DD 11111111111111010000000000010000B;F/9 
		DD 11111111111111100000000000010000B;F/A 
 
CHRO_AC_TABLE 	DD 00000000000000000000000000000010B;0/0 
		DD 01000000000000000000000000000010B;0/1 
		DD 10000000000000000000000000000011B;0/2 
		DD 10100000000000000000000000000100B;0/3 
		DD 11000000000000000000000000000101B;0/4 
		DD 11001000000000000000000000000101B;0/5 
		DD 11100000000000000000000000000110B;0/6 
		DD 11110000000000000000000000000111B;0/7 
		DD 11111010000000000000000000001001B;0/8 
		DD 11111101100000000000000000001010B;0/9 
		DD 11111111010000000000000000001100B;0/A 
		DD 6 DUP (0) 
		DD 10110000000000000000000000000100B;1/1 
		DD 11100100000000000000000000000110B;1/2 
		DD 11110110000000000000000000001000B;1/3 
		DD 11111010100000000000000000001001B;1/4 
		DD 11111110110000000000000000001011B;1/5 
		DD 11111111010100000000000000001100B;1/6 
		DD 11111111100010000000000000010000B;1/7 
		DD 11111111100010010000000000010000B;1/8 
		DD 11111111100010100000000000010000B;1/9 
		DD 11111111100010110000000000010000B;1/A 
		DD 6 DUP (0) 
		DD 11010000000000000000000000000101B;2/1 
		DD 11110111000000000000000000001000B;2/2 
		DD 11111101110000000000000000001010B;2/3 
		DD 11111111011000000000000000001100B;2/4 
		DD 11111111100001000000000000001111B;2/5 
		DD 11111111100011000000000000010000B;2/6 
		DD 11111111100011010000000000010000B;2/7 
		DD 11111111100011100000000000010000B;2/8 
		DD 11111111100011110000000000010000B;2/9 
		DD 11111111100100000000000000010000B;2/A 
		DD 6 DUP (0) 
		DD 11011000000000000000000000000101B;3/1 
		DD 11111000000000000000000000001000B;3/2 
		DD 11111110000000000000000000001010B;3/3 
		DD 11111111011100000000000000001100B;3/4 
		DD 11111111100100010000000000010000B;3/5 
		DD 11111111100100100000000000010000B;3/6 
		DD 11111111100100110000000000010000B;3/7 
		DD 11111111100101000000000000010000B;3/8 
		DD 11111111100101010000000000010000B;3/9 
		DD 11111111100101100000000000010000B;3/A 
		DD 6 DUP (0) 
		DD 11101000000000000000000000000110B;4/1 
		DD 11111011000000000000000000001001B;4/2 
		DD 11111111100101110000000000010000B;4/3 
		DD 11111111100110000000000000010000B;4/4 
		DD 11111111100110010000000000010000B;4/5 
		DD 11111111100110100000000000010000B;4/6 
		DD 11111111100110110000000000010000B;4/7 
		DD 11111111100111000000000000010000B;4/8 
		DD 11111111100111010000000000010000B;4/9 
		DD 11111111100111100000000000010000B;4/A 
		DD 6 DUP (0) 
		DD 11101100000000000000000000000110B;5/1 
		DD 11111110010000000000000000001010B;5/2 
		DD 11111111100111110000000000010000B;5/3 
		DD 11111111101000000000000000010000B;5/4 
		DD 11111111101000010000000000010000B;5/5 
		DD 11111111101000100000000000010000B;5/6 
		DD 11111111101000110000000000010000B;5/7 
		DD 11111111101001000000000000010000B;5/8 
		DD 11111111101001010000000000010000B;5/9 
		DD 11111111101001100000000000010000B;5/A 
		DD 6 DUP (0) 
		DD 11110010000000000000000000000111B;6/1 
		DD 11111110111000000000000000001011B;6/2 
		DD 11111111101001110000000000010000B;6/3 
		DD 11111111101010000000000000010000B;6/4 
		DD 11111111101010010000000000010000B;6/5 
		DD 11111111101010100000000000010000B;6/6 
		DD 11111111101010110000000000010000B;6/7 
		DD 11111111101011000000000000010000B;6/8 
		DD 11111111101011010000000000010000B;6/9 
		DD 11111111101011100000000000010000B;6/A 
		DD 6 DUP (0) 
		DD 11110100000000000000000000000111B;7/1 
		DD 11111111000000000000000000001011B;7/2 
		DD 11111111101011110000000000010000B;7/3 
		DD 11111111101100000000000000010000B;7/4 
		DD 11111111101100010000000000010000B;7/5 
		DD 11111111101100100000000000010000B;7/6 
		DD 11111111101100110000000000010000B;7/7 
		DD 11111111101101000000000000010000B;7/8 
		DD 11111111101101010000000000010000B;7/9 
		DD 11111111101101100000000000010000B;7/A 
		DD 6 DUP (0) 
		DD 11111001000000000000000000001000B;8/1 
		DD 11111111101101110000000000010000B;8/2 
		DD 11111111101110000000000000010000B;8/3 
		DD 11111111101110010000000000010000B;8/4 
		DD 11111111101110100000000000010000B;8/5 
		DD 11111111101110110000000000010000B;8/6 
		DD 11111111101111000000000000010000B;8/7 
		DD 11111111101111010000000000010000B;8/8 
		DD 11111111101111100000000000010000B;8/9 
		DD 11111111101111110000000000010000B;8/A 
		DD 6 DUP (0) 
		DD 11111011100000000000000000001001B;9/1 
		DD 11111111110000000000000000010000B;9/2 
		DD 11111111110000010000000000010000B;9/3 
		DD 11111111110000100000000000010000B;9/4 
		DD 11111111110000110000000000010000B;9/5 
		DD 11111111110001000000000000010000B;9/6 
		DD 11111111110001010000000000010000B;9/7 
		DD 11111111110001100000000000010000B;9/8 
		DD 11111111110001110000000000010000B;9/9 
		DD 11111111110010000000000000010000B;9/A 
		DD 6 DUP (0) 
		DD 11111100000000000000000000001001B;A/1 
		DD 11111111110010010000000000010000B;A/2 
		DD 11111111110010100000000000010000B;A/3 
		DD 11111111110010110000000000010000B;A/4 
		DD 11111111110011000000000000010000B;A/5 
		DD 11111111110011010000000000010000B;A/6 
		DD 11111111110011100000000000010000B;A/7 
		DD 11111111110011110000000000010000B;A/8 
		DD 11111111110100000000000000010000B;A/9 
		DD 11111111110100010000000000010000B;A/A 
		DD 6 DUP (0) 
		DD 11111100100000000000000000001001B;B/1 
		DD 11111111110100100000000000010000B;B/2 
		DD 11111111110100110000000000010000B;B/3 
		DD 11111111110101000000000000010000B;B/4 
		DD 11111111110101010000000000010000B;B/5 
		DD 11111111110101100000000000010000B;B/6 
		DD 11111111110101110000000000010000B;B/7 
		DD 11111111110110000000000000010000B;B/8 
		DD 11111111110110010000000000010000B;B/9 
		DD 11111111110110100000000000010000B;B/A 
		DD 6 DUP (0) 
		DD 11111101000000000000000000001001B;C/1 
		DD 11111111110110110000000000010000B;C/2 
		DD 11111111110111000000000000010000B;C/3 
		DD 11111111110111010000000000010000B;C/4 
		DD 11111111110111100000000000010000B;C/5 
		DD 11111111110111110000000000010000B;C/6 
		DD 11111111111000000000000000010000B;C/7 
		DD 11111111111000010000000000010000B;C/8 
		DD 11111111111000100000000000010000B;C/9 
		DD 11111111111000110000000000010000B;C/A 
		DD 6 DUP (0) 
		DD 11111111001000000000000000001011B;D/1 
		DD 11111111111001000000000000010000B;D/2 
		DD 11111111111001010000000000010000B;D/3 
		DD 11111111111001100000000000010000B;D/4 
		DD 11111111111001110000000000010000B;D/5 
		DD 11111111111010000000000000010000B;D/6 
		DD 11111111111010010000000000010000B;D/7 
		DD 11111111111010100000000000010000B;D/8 
		DD 11111111111010110000000000010000B;D/9 
		DD 11111111111011000000000000010000B;D/A 
		DD 6 DUP (0) 
		DD 11111111100000000000000000001110B;E/1 
		DD 11111111111011010000000000010000B;E/2 
		DD 11111111111011100000000000010000B;E/3 
		DD 11111111111011110000000000010000B;E/4 
		DD 11111111111100000000000000010000B;E/5 
		DD 11111111111100010000000000010000B;E/6 
		DD 11111111111100100000000000010000B;E/7 
		DD 11111111111100110000000000010000B;E/8 
		DD 11111111111101000000000000010000B;E/9 
		DD 11111111111101010000000000010000B;E/A 
		DD 5 DUP (0) 
		DD 11111110100000000000000000001010B;F/0 
		DD 11111111100001100000000000001111B;F/1 
		DD 11111111111101100000000000010000B;F/2 
		DD 11111111111101110000000000010000B;F/3 
		DD 11111111111110000000000000010000B;F/4 
		DD 11111111111110010000000000010000B;F/5 
		DD 11111111111110100000000000010001B;F/6 
		DD 11111111111110110000000000010001B;F/7 
		DD 11111111111111000000000000010001B;F/8 
		DD 11111111111111010000000000010000B;F/9 
		DD 11111111111111100000000000010000B;F/A 
_DATA		ENDS 
_JPEG_TEXT	SEGMENT PARA PUBLIC 'CODE' 
		ASSUME CS:_JPEG_TEXT,DS:DGROUP 
		public	_Compress 
		public	_CCompress 
		public	LH_TABLE 
		public	COLOR_TABLE 
		extrn	_FPU	:	byte 
;====================================== 
_Compress	PROC 	FAR 
		PUSH 	BP 
		MOV 	BP,SP 
		PUSH	DS 
		PUSH	ES 
		PUSH	SI 
		PUSH	DI 
		PUSH	DX 
		PUSH	CX 
		PUSH	BX 
		MOV 	AX,[BP+6] 
		MOV 	SOURCE,AX 
		MOV 	AX,[BP+8] 
		MOV 	CODE_BUFF,AX 
		MOV	ES,AX 
		MOV	CL,3 
		MOV	AX,[BP+10] 
		MOV	COUNT2,AX 
		MOV	STEP,AX 
		AND	AX,0FFF8H 
		MOV	ES:[0],AX 
		SHR	AX,CL 
		MOV	DIMENSION_X,AX 
		MOV	AX,[BP+12] 
		MOV	COUNT3,AX 
		AND	AX,0FFF8H 
		MOV	ES:[2],AX 
		SHR	AX,CL 
		MOV	DIMENSION_Y,AX 
		MOV 	AX,DGROUP 
		MOV 	DS,AX 
		MOV	ES,AX 
		MOV	CODE_CURRENT_LOCATION,32 
		MOV	CODE_LOCATION,1 
		MOV	LOCATION,0 
		MOV	DC_BASE,0 
		MOV	NUM,10000 
		MOV	AL,0FFH 
		CMP	BYTE PTR DGROUP:_FPU,AL 
		JE      DEFAULT 
		MOV	AX,DCT_87 
		MOV	DCT_SUB,AX 
		FINIT 
DEFAULT:	CLD 
		MOV	LOCATION,0 
		MOV 	CX,DIMENSION_Y 
		STI 
COMPRESS_LOOP1: PUSH	CX 
		MOV 	CX,DIMENSION_X 
COMPRESS_LOOP2: PUSH	CX 
		CALL	MOVE_DATA_X1 
		CALL 	WORD PTR DCT_SUB 
		CALL	QUANTIZER 
		CALL	ENTROPY_CODEC 
		ADD	LOCATION,LEN 
		POP	CX 
		LOOP	COMPRESS_LOOP2 
		MOV	AX,COUNT2 
		MOV	LOCATION,0 
		SHR	AX,1 
		PUSHF 
		ADD 	SOURCE,AX 
		POPF 
		JNC	SET_POINTER 
		MOV	LOCATION,LEN 
SET_POINTER:	POP	CX 
		LOOP	COMPRESS_LOOP1 
		MOV 	CL,DH 
		PUSH	DS 
		PUSH	CODE_BUFF 
		POP	DS 
		MOV	DI,BP 
		XCHG	CH,CL 
		MOV	CL,2 
		SHL	DI,CL 
		XCHG	CH,CL 
		XOR	CH,CH 
SHIFT:		SHL	WORD PTR [DI],1 
		RCL	WORD PTR [DI+2],1 
		LOOP	SHIFT 
		POP	DS 
		MOV 	AX,CODE_LOCATION 
		INC 	AX 
		POP	BX 
		POP	CX 
		POP	DX 
		POP	DI 
		POP	SI 
		POP	ES 
		POP	DS 
		POP 	BP 
		RET 
_Compress	ENDP 
;====================================== 
_CCompress	PROC 	FAR 
		PUSH 	BP 
		MOV 	BP,SP 
		PUSH	DS 
		PUSH	ES 
		PUSH	SI 
		PUSH	DI 
		PUSH	DX 
		PUSH	CX 
		PUSH	BX 
		MOV 	AX,[BP+6] 
		MOV 	COLOR_Y,AX 
		ADD	AX,4096 
		MOV	COLOR_CR,AX 
		ADD	AX,1024 
		MOV	COLOR_CB,AX 
		MOV 	AX,[BP+8] 
		MOV 	CODE_BUFF,AX 
		MOV	ES,AX 
		MOV	CL,4 
		MOV	AX,[BP+10] 
		MOV	COUNT2,AX 
		AND	AX,0FFF0H 
		MOV	ES:[0],AX 
		SHR	AX,CL 
		MOV	DIMENSION_X,AX 
		MOV	AX,[BP+12] 
		MOV	COUNT3,AX 
		AND	AX,0FFF0H 
		MOV	ES:[2],AX 
		SHR	AX,CL 
		MOV	DIMENSION_Y,AX 
		MOV 	AX,DGROUP 
		MOV 	DS,AX 
		MOV	ES,AX 
		MOV	CODE_CURRENT_LOCATION,32 
		MOV	CODE_LOCATION,1 
		MOV	LOC_Y,0 
		MOV	LOC_CR,0 
		MOV	LOC_CB,0 
		MOV	DC_Y,0 
		MOV	DC_CR,0 
		MOV	DC_CB,0 
		MOV	NUM,10000 
		MOV	AL,0FFH 
		CMP	BYTE PTR DGROUP:_FPU,AL 
		JE      CDEFAULT 
		MOV	AX,DCT_87 
		MOV	DCT_SUB,AX 
		FINIT 
CDEFAULT:	CLD 
		MOV	LOCATION,0 
		MOV 	CX,DIMENSION_Y 
		STI 
COMPRE_LOOP1: 	PUSH	CX 
		MOV 	CX,DIMENSION_X 
COMPRE_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			; COMPRESS Y 
		MOV     LOCATION,AX			; SET Y POINTER 
		CALL	MOVE_DATA_X1			; Y1 
		CALL 	WORD PTR DCT_SUB 
		CALL	QUANTIZER 
		CALL	ENTROPY_CODEC 
		ADD	LOCATION,LEN 
		CALL	MOVE_DATA_X1			; Y2 
		CALL 	WORD PTR DCT_SUB 
		CALL	QUANTIZER 
		CALL	ENTROPY_CODEC 
		ADD	LOCATION,LEN 
		MOV	AX,LOCATION			; ADJUST POINTER 
		MOV	LOC_Y,AX 
		MOV	AX,COUNT2 
		SHL	AX,1 
		SHL	AX,1 
		SHL	AX,1 
		ADD	AX,LOCATION 
		SUB	AX,LEN*2 
		MOV	LOCATION,AX			; 
		CALL	MOVE_DATA_X1			; Y3 
		CALL 	WORD PTR DCT_SUB 
		CALL	QUANTIZER 
		CALL	ENTROPY_CODEC 
		ADD	LOCATION,LEN 
		CALL	MOVE_DATA_X1			; Y4 
		CALL 	WORD PTR DCT_SUB 
		CALL	QUANTIZER 
		CALL	ENTROPY_CODEC 
		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	MOVE_DATA_X1			; CR 
		CALL 	WORD PTR DCT_SUB 
		CALL	C_QUANT 
		CALL	C_CODEC 
		ADD	LOC_CR,LEN 
		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	MOVE_DATA_X1			; CB 
		CALL 	WORD PTR DCT_SUB 
		CALL	C_QUANT 
		CALL	C_CODEC 
		ADD	LOC_CB,LEN 
		MOV	AX,DC_BASE 
		MOV	DC_CB,AX 
		POP	CX 
		DEC	CX 
		JZ      CLOOP_OUT1 
		JMP	COMPRE_LOOP2			; ONE LINE LOOP 
CLOOP_OUT1:	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_POINTER 
		MOV	COLOR_CR,LEN 
		MOV	COLOR_CB,LEN 
CSET_POINTER:	POP	CX 
		DEC	CX 
		JZ	CLOOP_OUT2 
		JMP	COMPRE_LOOP1 
CLOOP_OUT2:	MOV 	CL,DH 
		PUSH	DS 
		PUSH	CODE_BUFF 
		POP	DS 
		MOV	DI,BP 
		XCHG	CH,CL 
		MOV	CL,2 
		SHL	DI,CL 
		XCHG	CH,CL 
		XOR	CH,CH 
CSHIFT:		SHL	WORD PTR [DI],1 
		RCL	WORD PTR [DI+2],1 
		LOOP	CSHIFT 
		POP	DS 
		MOV 	AX,CODE_LOCATION 
		INC 	AX 
		POP	BX 
		POP	CX 
		POP	DX 
		POP	DI 
		POP	SI 
		POP	ES 
		POP	DS 
		POP 	BP 
		RET 
_CCompress	ENDP 
;-------------------------------------- 
MOVE_DATA_X1	PROC 
		MOV	SI,LOCATION 
		PUSH	ES 
		XOR	AX,AX 
		LEA	DI,X1 
		MOV	CX,256 
		REPZ	STOSW 
		PUSH	SOURCE 
		POP	ES 
		XOR	BX,BX 
		ASK_1_X 0,4,0,0,0 
		ASK_1_X 0,4,1,1,0 
		ASK_1_X 0,4,2,2,0 
		ASK_1_X 0,4,3,3,0 
		ASK_1_X 0,4,4,4,0 
		ASK_1_X 0,4,5,5,0 
		ASK_1_X 0,4,6,6,0 
		ASK_1_X 0,4,7,7,0 
		XOR	BX,BX 
		ASK_1_X 1,6,0,1,0 
		ASK_1_X 1,6,1,4,0 
		ASK_1_X 1,6,2,7,0 
		ASK_1_X 1,6,3,2,1 
		ASK_1_X 1,6,4,5,1 
		ASK_1_X 1,6,5,0,0 
		ASK_1_X 1,6,6,3,0 
		ASK_1_X 1,6,7,6,0 
		XOR	BX,BX 
		ASK_1_X 2,7,0,2,0 
		ASK_1_X 2,7,1,7,0 
		ASK_1_X 2,7,2,4,1 
		ASK_1_X 2,7,3,1,0 
		ASK_1_X 2,7,4,6,0 
		ASK_1_X 2,7,5,3,1 
		ASK_1_X 2,7,6,0,0 
		ASK_1_X 2,7,7,5,0 
		XOR	BX,BX 
		ASK_1_X 3,5,0,3,0 
		ASK_1_X 3,5,1,2,1 
		ASK_1_X 3,5,2,1,0 
		ASK_1_X 3,5,3,0,1 
		ASK_1_X 3,5,4,7,1 
		ASK_1_X 3,5,5,6,0 
		ASK_1_X 3,5,6,5,1 
		ASK_1_X 3,5,7,4,0 
		POP	ES 
		RET 
MOVE_DATA_X1	ENDP 
;-------------------------------------- 
DCT_2D_87	PROC 
		LEA	SI,X1 
		MOV	CX,64 
CHANGE_DATA_FORMAT: 
		SHL	BYTE PTR [SI+2],1 
		RCR	WORD PTR [SI+2],1 
		ADD	SI,4 
		LOOP	CHANGE_DATA_FORMAT 
		MOV 	COUNTOR1,8 
		LEA 	BP,X1 
AGAIN_87:	FLD 	DWORD PTR DS:[BP+0*4] 
		FLD 	DWORD PTR DS:[BP+1*4] 
		FLD 	DWORD PTR DS:[BP+3*4] 
		FLD 	DWORD PTR DS:[BP+2*4] 
		FLD 	DWORD PTR DS:[BP+7*4] 
		FLD 	DWORD PTR DS:[BP+6*4] 
		FLD 	DWORD PTR DS:[BP+4*4] 
		FLD 	DWORD PTR DS:[BP+5*4] 
		FDECSTP 
		FST 	TMP0 
		FADD 	ST,ST(4) 
		FDECSTP 
		FST 	TMP1 
		FADD 	ST,ST(4) 
		FDECSTP 
		FST 	TMP2 
		FADD 	ST,ST(4) 
		FDECSTP 
		FST 	TMP3 
		FADD 	ST,ST(4) 
		FDECSTP 
		FSUBR 	TMP0 
		FMUL 	CONST01 
		FDECSTP 
		FSUBR 	TMP1 
		FMUL 	CONST11 
		FDECSTP 
		FSUBR 	TMP2 
		FMUL 	CONST22 
		FDECSTP 
		FSUBR 	TMP3 
		FMUL 	CONST33 
		FDECSTP 
;---------------------------------- 
		FST 	TMP0 
		FADD 	ST,ST(6) 
		FDECSTP 
		FST 	TMP1 
		FADD 	ST,ST(6) 
		FDECSTP 
		FSUBR 	TMP0 
		FMUL 	CONST44 
		FDECSTP 
		FSUBR 	TMP1 
		FMUL 	CONST55 
		FDECSTP 
		FST 	TMP0 
		FADD 	ST,ST(6) 
		FDECSTP 
		FST 	TMP1 
		FADD 	ST,ST(6) 
		FDECSTP 
		FSUBR 	TMP0 
		FMUL 	CONST44 
		FDECSTP 
		FSUBR 	TMP1 
		FMUL 	CONST55 
		FDECSTP 
;---------------------------------------- 
		FST 	TMP0 
		FADD 	ST,ST(7) 
		FDECSTP 
		FSUBR 	TMP0 
		FMUL 	CONST66 
		FDECSTP 
		FST 	TMP0 
		FADD 	ST,ST(7) 
		FDECSTP 
		FSUBR 	TMP0 
		FMUL 	CONST66 
		FDECSTP 
		FST 	TMP0 
		FADD 	ST,ST(7) 
		FDECSTP 
		FSUBR 	TMP0 
		FMUL 	CONST66 
		FDECSTP 
		FST 	TMP0 
		FADD 	ST,ST(7) 
		FDECSTP 
		FSUBR 	TMP0 
		FMUL 	CONST66 
;-------------------------------- 
		FSUB 	ST,ST(1);7=7-6 
		FINCSTP 
		FSUB 	ST,ST(2);6=6-4 
		FSUB 	ST(1),ST;5=5-6 
		FIDIV 	INT_4 
		FSTP 	DWORD PTR DS:[BP+3*4] 
		FSUB 	ST(6),ST;7=7-5 
		FIDIV 	INT_4 
		FSTP 	DWORD PTR DS:[BP+5*4] 
		FIDIV 	INT_4 
		FSTP 	DWORD PTR DS:[BP+1*4] 
		FSUB 	ST,ST(1);3=3-2 
		FIDIV 	INT_4 
		FSTP 	DWORD PTR DS:[BP+6*4] 
		FIDIV 	INT_4 
		FSTP 	DWORD PTR DS:[BP+2*4] 
		FIDIV 	INT_4 
		FSTP 	DWORD PTR DS:[BP+4*4] 
		FIDIV 	INT_2 
		FSTP 	DWORD PTR DS:[BP+0*4] 
		FIDIV 	INT_4 
		FSTP 	DWORD PTR DS:[BP+7*4] 
		ADD 	BP,32 
		DEC 	COUNTOR1 
		JE	END_87 
		JMP	AGAIN_87 
;--------------------1_DCT----------------------- 
END_87: 	ASK_2_1_87 0,24,0,24 
		ASK_2_1_87 8,16,8,16 
		ASK_2_1_87 1,25,1,25 
		ASK_2_1_87 9,17,9,17 
		ASK_2_1_87 2,26,2,26 
		ASK_2_1_87 10,18,10,18 
		ASK_2_1_87 3,27,3,27 
		ASK_2_1_87 11,19,11,19 
		ASK_2_1_87 4,28,4,28 
		ASK_2_1_87 12,20,12,20 
		ASK_2_1_87 5,29,5,29 
		ASK_2_1_87 13,21,13,21 
		ASK_2_1_87 6,30,6,30 
		ASK_2_1_87 14,22,14,22 
		ASK_2_1_87 7,31,7,31 
		ASK_2_1_87 15,23,15,23 
		ASK_2_1_87 33,47,33,47 
		ASK_2_1_87 34,46,34,46 
		ASK_2_1_87 35,45,35,45 
		ASK_2_1_87 36,44,36,44 
		ASK_2_1_87 37,43,37,43 
		ASK_2_1_87 38,42,38,42 
		ASK_2_1_87 39,41,39,41 
		ASK_2_1_87 49,63,49,63 
		ASK_2_1_87 50,62,50,62 
		ASK_2_1_87 51,61,51,61 
		ASK_2_1_87 52,60,52,60 
		ASK_2_1_87 53,59,53,59 
		ASK_2_1_87 54,58,54,58 
		ASK_2_1_87 55,57,55,57 
		MOV_2_1_87 32,32,0 
		MOV_2_1_87 40,40,0 
		MOV_2_1_87 48,48,0 
		MOV_2_1_87 56,56,0 
;----------------------1 LEVEL ----------------------- 
		ASK_1_2_87 0,8,0,8 
		ASK_1_2_87 1,9,1,9 
		ASK_1_2_87 2,10,2,10 
		ASK_1_2_87 3,11,3,11 
		ASK_1_2_87 4,12,4,12 
		ASK_1_2_87 5,13,5,13 
		ASK_1_2_87 6,14,6,14 
		ASK_1_2_87 7,15,7,15 
		ASK_1_2_87 17,31,17,31 
		ASK_1_2_87 18,30,18,30 
		ASK_1_2_87 19,29,19,29 
		ASK_1_2_87 28,20,28,20 
		ASK_1_2_87 27,21,27,21 
		ASK_1_2_87 26,22,26,22 
		ASK_1_2_87 25,23,25,23 
		MOV_1_2_87 16,16,0 
		MOV_1_2_87 24,24,0 
		ASK_1_2_87 32,52,32,52 
		ASK_1_2_87 33,51,33,51 
		ASK_1_2_87 34,50,34,50 
		ASK_1_2_87 35,49,35,49 
		ASK_1_2_87 36,48,36,48 
		ASK_1_2_87 37,63,37,63 
		ASK_1_2_87 38,62,38,62 
		ASK_1_2_87 39,61,39,61 
		ASK_1_2_87 40,60,40,60 
		ASK_1_2_87 41,59,41,59 
		ASK_1_2_87 42,58,42,58 
		ASK_1_2_87 43,57,43,57 
		ASK_1_2_87 44,56,44,56 
		ASK_1_2_87 45,55,45,55 
		ASK_1_2_87 46,54,46,54 
		ASK_1_2_87 47,53,47,53 
;--------------------2 LEVLE ------------------------- 
		MOV_2_1_87 0,0,0 
		MOV_2_1_87 1,1,0 
		MOV_2_1_87 2,2,0 
		MOV_2_1_87 3,3,0 
		MOV_2_1_87 4,4,0 
		MOV_2_1_87 5,5,0 
		MOV_2_1_87 6,6,0 
		MOV_2_1_87 7,7,0 
		MOV_2_1_87 8,8,0 
		MOV_2_1_87 12,12,0 
		MOV_2_1_87 26,26,0 
		FLD 	X1[30*4] 
		FCHS 
		FSTP 	X2[30*4];SPECIAL 30 
		ASK_2_1_87 15,9,9,15 
		ASK_2_1_87 14,10,10,14 
		ASK_2_1_87 13,11,11,13 
		ASK_2_1_87 20,16,20,16 
		ASK_2_1_87 21,17,21,17 
		ASK_2_1_87 22,18,22,18 
		ASK_2_1_87 23,19,23,19 
		ASK_2_1_87 24,28,24,28 
		ASK_2_1_87 25,27,25,27 
		FLD 	X1[31*4] 
		FADD 	X1[29*4] 
		FCHS 
		FSTP 	X2[31*4] 
		FLD 	X1[31*4] 
		FSUB 	X1[29*4] 
		FSTP 	X2[29*4];special 29 31 
		ASK_2_1_87 32,34,32,34 
		ASK_2_1_87 47,35,47,35 
		ASK_2_1_87 46,36,46,36 
		ASK_2_1_87 45,37,45,37 
		ASK_2_1_87 44,38,44,38 
		ASK_2_1_87 57,39,57,39 
		ASK_2_1_87 58,40,58,40 
		ASK_2_1_87 51,41,51,41 
		ASK_2_1_87 52,42,52,42 
		ASK_2_1_87 53,43,53,43 
		ASK_2_1_87 48,62,48,62 
		ASK_2_1_87 49,61,49,61 
		ASK_2_1_87 50,60,50,60 
		ASK_2_1_87 54,56,56,54 
		MOV_2_1_87 33,33,0 
		MOV_2_1_87 55,55,0 
		MOV_2_1_87 59,59,0 
		MOV_2_1_87 63,63,0 
;------------------3 LEVEL--------------------- 
		MOVS_1_2_87 0,0,0 
		MOVS_1_2_87 1,2,4 
		MOVS_1_2_87 2,3,4 
		MOVS_1_2_87 3,9,4 
		MOVS_1_2_87 4,10,4 
		MOVS_1_2_87 5,20,4 
		MOVS_1_2_87 6,21,4 
		MOVS_1_2_87 7,35,4 
		MOVS_1_2_87 8,39,0 
		MOVS_1_2_87 9,46,0 
		MOVS_1_2_87 10,50,0 
		MOVS_1_2_87 11,57,0 
		MOVS_1_2_87 12,14,4 
		MOVS_1_2_87 13,16,0 
		MOVS_1_2_87 14,25,0 
		MOVS_1_2_87 15,31,0 
		MOVS_1_2_87 16,41,0 
		MOVS_1_2_87 17,44,0 
		MOVS_1_2_87 18,52,0 
		MOVS_1_2_87 19,55,0 
		MOVS_1_2_87 20,37,0 
		MOVS_1_2_87 21,33,0 
		MOVS_1_2_87 22,23,0 
		MOVS_1_2_87 23,18,0 
		MOVS_1_2_87 24,12,0 
		MOVS_1_2_87 25,7,0 
		MOVS_1_2_87 26,5,4 
		MOVS_1_2_87 27,62,0 
		MOVS_1_2_87 28,59,0 
		MOVS_1_2_87 29,48,0 
		MOVS_1_2_87 30,27,4 
		MOVS_1_2_87 31,29,0 
		MOVS_1_2_87 32,4,0 
		MOVS_1_2_87 33,1,4 
		MOVS_1_2_87 34,63,0 
		MOVS_1_2_87 35,61,0 
		MOVS_1_2_87 36,60,0 
		MOVS_1_2_87 37,54,0 
		MOVS_1_2_87 38,53,0 
		MOVS_1_2_87 39,43,0 
		MOVS_1_2_87 40,42,0 
		MOVS_1_2_87 41,45,0 
		MOVS_1_2_87 42,51,0 
		MOVS_1_2_87 43,56,0 
		MOVS_1_2_87 44,22,0 
		MOVS_1_2_87 45,19,0 
		MOVS_1_2_87 46,11,0 
		MOVS_1_2_87 47,8,0 
		MOVS_1_2_87 48,26,0 
		MOVS_1_2_87 49,30,0 
		MOVS_1_2_87 50,40,0 
		MOVS_1_2_87 51,32 0 
		MOVS_1_2_87 52,24,0 
		MOVS_1_2_87 53,17,0 
		MOVS_1_2_87 54,13,0 
		MOVS_1_2_87 55,6,4 
		MOVS_1_2_87 56,58,0 
		MOVS_1_2_87 57,34,0 
		MOVS_1_2_87 58,36,0 
		MOVS_1_2_87 59,28,4 
		MOVS_1_2_87 60,38,0 
		MOVS_1_2_87 61,47,0 
		MOVS_1_2_87 62,49,0 
		MOVS_1_2_87 63,15,4 
		LEA	SI,X1 
		MOV	CX,64 
RET_DATA_FORMAT: 
		SHL	WORD PTR [SI+2],1 
		RCR	BYTE PTR [SI+2],1 
		ADD	SI,4 
		LOOP    RET_DATA_FORMAT 
		RET 
DCT_2D_87	ENDP 
;-------------------------------------- 
DCT_2D		PROC 
		MOV 	COUNTOR1,8 
		LEA 	SI,X1 
AGAIN:  	MOV	BX,[SI+1*4+2] 
		MOV	AX,[SI+7*4+2] 
		MOV	[SI+1*4+2],AX 
		MOV	AX,[SI+5*4+2] 
		MOV	[SI+7*4+2],AX 
		MOV     AX,[SI+6*4+2] 
		MOV	[SI+5*4+2],AX 
		MOV	AX,[SI+2*4+2] 
		MOV	[SI+6*4+2],AX 
		MOV	AX,[SI+3*4+2] 
		MOV	[SI+2*4+2],AX 
		MOV	AX,[SI+4*4+2] 
		MOV	[SI+3*4+2],AX 
		MOV	[SI+4*4+2],BX 
;-------------------------------------- 
		MOV	AX,[SI+0*4+2] 
		XOR	BX,BX 
		MOV	CX,[SI+1*4+2] 
		MOV	DX,BX 
		PUSH	AX 
		CALL	FLOAT_ADD 
		MOV	[SI+0*4+2],AX 
		MOV	[SI+0*4],BX 
		POP	AX 
		XOR	BX,BX 
		SUB	CL,80H 
		CALL	FLOAT_ADD 
		MOV	[SI+1*4+2],AX 
		MOV	[SI+1*4],BX 
		LEA	BP,CONST0 
		LEA	DI,[SI+1*4] 
		CALL	FLOAT_MUL 
		MOV	AX,[SI+4*4+2] 
		XOR	BX,BX 
		MOV	CX,[SI+5*4+2] 
		MOV	DX,BX 
		PUSH	AX 
		CALL	FLOAT_ADD 
		MOV	[SI+4*4+2],AX 
		MOV	[SI+4*4],BX 
		POP	AX 
		XOR	BX,BX 
		SUB	CL,80H 
		CALL	FLOAT_ADD 
		MOV	[SI+5*4+2],AX 
		MOV	[SI+5*4],BX 
		LEA	BP,CONST1 
		LEA	DI,[SI+5*4] 
		CALL	FLOAT_MUL 
		MOV	AX,[SI+2*4+2] 
		XOR	BX,BX 
		MOV	CX,[SI+3*4+2] 
		MOV	DX,BX 
		PUSH	AX 
		CALL	FLOAT_ADD 
		MOV	[SI+2*4+2],AX 
		MOV	[SI+2*4],BX 
		POP	AX 
		PUSH	CX 
		OR	CX,DX 
		POP	CX 
		JZ	SUBZ 
		XOR	BX,BX 
		SUB	CL,80H 
		CALL	FLOAT_ADD 
SUBZ:		MOV	[SI+3*4+2],AX 
		MOV	[SI+3*4],BX 
		LEA	BP,CONST2 
		LEA	DI,[SI+3*4] 
		CALL	FLOAT_MUL 
		MOV	AX,[SI+6*4+2] 
		XOR	BX,BX 
		MOV	CX,[SI+7*4+2] 
		MOV	DX,BX 
		PUSH	AX 
		CALL	FLOAT_ADD 
		MOV	[SI+6*4+2],AX 
		MOV	[SI+6*4],BX 
		POP	AX 
		XOR	BX,BX 
		SUB	CL,80H 
		CALL	FLOAT_ADD 
		MOV	[SI+7*4+2],AX 
		MOV	[SI+7*4],BX 
		LEA	BP,CONST3 
		LEA	DI,[SI+7*4] 
		CALL	FLOAT_MUL 
		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 
		MOV	[SI+2*4+2],AX 
		MOV	[SI+2*4],BX 
		LEA	BP,CONST4 
		LEA	DI,[SI+2*4] 
		CALL	FLOAT_MUL 
		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 
		MOV	[SI+6*4+2],AX 
		MOV	[SI+6*4],BX 
		LEA	BP,CONST5 
		LEA	DI,[SI+6*4] 
		CALL	FLOAT_MUL 
		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 
		MOV	[SI+1*4+2],AX 
		MOV	[SI+1*4],BX 
		POP	BX 
		POP	AX 
		SUB	CL,80H 
		CALL	FLOAT_ADD 
		MOV	[SI+3*4+2],AX 
		MOV	[SI+3*4],BX 
		LEA	BP,CONST4 
		LEA	DI,[SI+3*4] 
		CALL	FLOAT_MUL 
		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 
		MOV	[SI+5*4+2],AX 
		MOV	[SI+5*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,CONST5 
		LEA	DI,[SI+7*4] 
		CALL	FLOAT_MUL 
		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 
		LEA	BP,CONST6 
		LEA	DI,[SI+4*4] 
		CALL	FLOAT_MUL 
		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,CONST6 
		LEA	DI,[SI+6*4] 
		CALL	FLOAT_MUL 
		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 
		LEA	BP,CONST6 
		LEA	DI,[SI+5*4] 
		CALL	FLOAT_MUL 
		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	DI,[SI+7*4] 
		LEA	BP,CONST6 
		CALL	FLOAT_MUL 
		MOV	AX,[SI+7*4+2] 
		MOV	BX,[SI+7*4] 
		MOV	CX,[SI+3*4+2] 
		MOV	DX,[SI+3*4] 
		SUB	CL,80H 
		CALL	FLOAT_ADD	;7=7-6 
		MOV	[SI+7*4+2],AX 
		MOV	[SI+7*4],BX 
		MOV	AX,[SI+3*4+2] ;6=6-4 
		MOV	BX,DX 
		MOV	CX,[SI+1*4+2] 
		MOV	DX,[SI+1*4] 
		SUB	CL,80H 
		CALL	FLOAT_ADD       ;6=6-4 
		MOV	[SI+3*4+2],AX 
		MOV	[SI+3*4],BX 
		MOV	CX,AX 
		MOV	DX,BX 
		MOV	AX,[SI+5*4+2] ;5=5-6 
		MOV	BX,[SI+5*4] 
		SUB	CL,80H 
		CALL	FLOAT_ADD 
		MOV	[SI+5*4+2],AX 
		MOV	[SI+5*4],BX 
		MOV	CX,AX 
		MOV	DX,BX 
		MOV	AX,[SI+7*4+2] 	;7=7-5 
		MOV	BX,[SI+7*4] 
		SUB	CL,80H 
		CALL	FLOAT_ADD 
		MOV	[SI+7*4+2],AX 
		MOV	[SI+7*4],BX 
		MOV	AX,[SI+6*4+2] 	;3=3-2 
		MOV	BX,[SI+6*4] 
		MOV	CX,[SI+2*4+2] 
		MOV	DX,[SI+2*4] 
		SUB	CL,80H 
		CALL	FLOAT_ADD 
		MOV	[SI+6*4+2],AX 
		MOV	[SI+6*4],BX 
		DIVIDE	3,4 
		DIVIDE	5,4 
		DIVIDE	1,4 
		DIVIDE	6,4 
		DIVIDE	2,4 
		DIVIDE	4,4 
		DIVIDE	0,2 
		DIVIDE	7,4 
		ADD 	SI,32 
		DEC 	COUNTOR1 
		JE	END1 
		JMP	AGAIN 
;--------------------1_DCT----------------------- 
END1:   	ASK_2_1 0,24,0,24 
		ASK_2_1 8,16,8,16 
		ASK_2_1 1,25,1,25 
		ASK_2_1 9,17,9,17 
		ASK_2_1 2,26,2,26 
		ASK_2_1 10,18,10,18 
		ASK_2_1 3,27,3,27 
		ASK_2_1 11,19,11,19 
		ASK_2_1 4,28,4,28 
		ASK_2_1 12,20,12,20 
		ASK_2_1 5,29,5,29 
		ASK_2_1 13,21,13,21 
		ASK_2_1 6,30,6,30 
		ASK_2_1 14,22,14,22 
		ASK_2_1 7,31,7,31 
		ASK_2_1 15,23,15,23 
		ASK_2_1 33,47,33,47 
		ASK_2_1 34,46,34,46 
		ASK_2_1 35,45,35,45 
		ASK_2_1 36,44,36,44 
		ASK_2_1 37,43,37,43 
		ASK_2_1 38,42,38,42 
		ASK_2_1 39,41,39,41 
		ASK_2_1 49,63,49,63 
		ASK_2_1 50,62,50,62 
		ASK_2_1 51,61,51,61 
		ASK_2_1 52,60,52,60 
		ASK_2_1 53,59,53,59 
		ASK_2_1 54,58,54,58 
		ASK_2_1 55,57,55,57 
		MOV_2_1 32,32,0 
		MOV_2_1 40,40,0 
		MOV_2_1 48,48,0 
		MOV_2_1 56,56,0 
;----------------------1 LEVEL ----------------------- 
		ASK_1_2 0,8,0,8 
		ASK_1_2 1,9,1,9 
		ASK_1_2 2,10,2,10 
		ASK_1_2 3,11,3,11 
		ASK_1_2 4,12,4,12 
		ASK_1_2 5,13,5,13 
		ASK_1_2 6,14,6,14 
		ASK_1_2 7,15,7,15 
		ASK_1_2 17,31,17,31 
		ASK_1_2 18,30,18,30 
		ASK_1_2 19,29,19,29 
		ASK_1_2 28,20,28,20 
		ASK_1_2 27,21,27,21 
		ASK_1_2 26,22,26,22 
		ASK_1_2 25,23,25,23 
		MOV_1_2 16,16,0 
		MOV_1_2 24,24,0 
		ASK_1_2 32,52,32,52 
		ASK_1_2 33,51,33,51 
		ASK_1_2 34,50,34,50 
		ASK_1_2 35,49,35,49 
		ASK_1_2 36,48,36,48 
		ASK_1_2 37,63,37,63 
		ASK_1_2 38,62,38,62 
		ASK_1_2 39,61,39,61 
		ASK_1_2 40,60,40,60 
		ASK_1_2 41,59,41,59 
		ASK_1_2 42,58,42,58 
		ASK_1_2 43,57,43,57 
		ASK_1_2 44,56,44,56 
		ASK_1_2 45,55,45,55 
		ASK_1_2 46,54,46,54 
		ASK_1_2 47,53,47,53 
;--------------------2 LEVLE ---------------------- 
		MOV_2_1 0,0,0 
		MOV_2_1 1,1,0 
		MOV_2_1 2,2,0 
		MOV_2_1 3,3,0 
		MOV_2_1 4,4,0 
		MOV_2_1 5,5,0 
		MOV_2_1 6,6,0 
		MOV_2_1 7,7,0 
		MOV_2_1 8,8,0 
		MOV_2_1 12,12,0 
		MOV_2_1 26,26,0 
		MOV	AX,WORD PTR X1[30*4+2] 
		MOV	BX,WORD PTR X1[30*4] 
		SUB	AL,80H 
		MOV	WORD PTR X2[30*4],BX 
		MOV	WORD PTR X2[30*4+2],AX 
		ASK_2_1 15,9,9,15 
		ASK_2_1 14,10,10,14 
		ASK_2_1 13,11,11,13 
		ASK_2_1 20,16,20,16 
		ASK_2_1 21,17,21,17 
		ASK_2_1 22,18,22,18 
		ASK_2_1 23,19,23,19 
		ASK_2_1 24,28,24,28 
		ASK_2_1 25,27,25,27 
		MOV	AX,WORD PTR X1[31*4+2] 
		MOV     BX,WORD PTR X1[31*4] 
		MOV	CX,WORD PTR X1[29*4+2] 
		MOV	DX,WORD PTR X1[29*4] 
		PUSH	AX 
		PUSH	BX 
		CALL	FLOAT_ADD 
		SUB	AL,80H 
		MOV	WORD PTR X2[31*4+2],AX 
		MOV	WORD PTR X2[31*4],BX 
		POP	BX 
		POP	AX 
		SUB	CL,80H 
		CALL	FLOAT_ADD 
		MOV	WORD PTR X2[29*4+2],AX 
		MOV	WORD PTR X2[29*4],BX	;special 29 31 
		ASK_2_1 32,34,32,34 
		ASK_2_1 47,35,47,35 
		ASK_2_1 46,36,46,36 
		ASK_2_1 45,37,45,37 
		ASK_2_1 44,38,44,38 
		ASK_2_1 57,39,57,39 
		ASK_2_1 58,40,58,40 
		ASK_2_1 51,41,51,41 
		ASK_2_1 52,42,52,42 
		ASK_2_1 53,43,53,43 
		ASK_2_1 48,62,48,62 
		ASK_2_1 49,61,49,61 
		ASK_2_1 50,60,50,60 
		ASK_2_1 54,56,56,54 
		MOV_2_1 33,33,0 
		MOV_2_1 55,55,0 
		MOV_2_1 59,59,0 
		MOV_2_1 63,63,0 
;------------------3 LEVEL--------------------- 
		MOVS_1_2 0,0,0 
		MOVS_1_2 1,2,4 
		MOVS_1_2 2,3,4 
		MOVS_1_2 3,9,4 
		MOVS_1_2 4,10,4 
		MOVS_1_2 5,20,4 
		MOVS_1_2 6,21,4 
		MOVS_1_2 7,35,4 
		MOVS_1_2 8,39,0 
		MOVS_1_2 9,46,0 
		MOVS_1_2 10,50,0 
		MOVS_1_2 11,57,0 
		MOVS_1_2 12,14,4 
		MOVS_1_2 13,16,0 
		MOVS_1_2 14,25,0 
		MOVS_1_2 15,31,0 
		MOVS_1_2 16,41,0 
		MOVS_1_2 17,44,0 
		MOVS_1_2 18,52,0 
		MOVS_1_2 19,55,0 
		MOVS_1_2 20,37,0 
		MOVS_1_2 21,33,0 
		MOVS_1_2 22,23,0 
		MOVS_1_2 23,18,0 
		MOVS_1_2 24,12,0 
		MOVS_1_2 25,7,0 
		MOVS_1_2 26,5,4 
		MOVS_1_2 27,62,0 
		MOVS_1_2 28,59,0 
		MOVS_1_2 29,48,0 
		MOVS_1_2 30,27,4 
		MOVS_1_2 31,29,0 
		MOVS_1_2 32,4,0 
		MOVS_1_2 33,1,4 
		MOVS_1_2 34,63,0 
		MOVS_1_2 35,61,0 
		MOVS_1_2 36,60,0 
		MOVS_1_2 37,54,0 
		MOVS_1_2 38,53,0 
		MOVS_1_2 39,43,0 
		MOVS_1_2 40,42,0 
		MOVS_1_2 41,45,0 
		MOVS_1_2 42,51,0 
		MOVS_1_2 43,56,0 
		MOVS_1_2 44,22,0 
		MOVS_1_2 45,19,0 
		MOVS_1_2 46,11,0 
		MOVS_1_2 47,8,0 
		MOVS_1_2 48,26,0 
		MOVS_1_2 49,30,0 
		MOVS_1_2 50,40,0 
		MOVS_1_2 51,32 0 
		MOVS_1_2 52,24,0 
		MOVS_1_2 53,17,0 
		MOVS_1_2 54,13,0 
		MOVS_1_2 55,6,4 
		MOVS_1_2 56,58,0 
		MOVS_1_2 57,34,0 
		MOVS_1_2 58,36,0 
		MOVS_1_2 59,28,4 
		MOVS_1_2 60,38,0 
		MOVS_1_2 61,47,0 
		MOVS_1_2 62,49,0 
		MOVS_1_2 63,15,4 
		RET 
DCT_2D		ENDP 
;-------------INT TO FLOAT----------------- 
STANDARD	PROC 
		AND	AX,AX 
		JZ	SET 
		PUSHF 
		JNS	SHIFT1 
		NEG	AX 
		CMP	AX,100H 
		JZ	IS_256 
SHIFT1:		MOV	AH,86H 
SHIFT2:		SHL	AL,1 
		JC	STAND_END 
		DEC	AH 
		JMP	SHORT SHIFT2 
IS_256:		MOV	AH,87H 
STAND_END:      SHR	AL,1 
		POPF 
		JNS	SET 
		OR	AL,80H 
SET:		RET 
STANDARD	ENDP 
 
QUANTIZER	PROC 
		MOV 	SI,2 
		MOV 	CX,64 
		MOV	AX,WORD PTR X1 
		MOV	BX,WORD PTR X1+2 
		CHANGE_FLOAT_INT 
		CWD 
		IDIV	LH_TABLE 
		SHL	DX,1 
		AND	DX,DX 
		JS	RND_BELOW_0 
		CMP	DX,LH_TABLE 
		JS	DC_RND_END 
		INC	AX 
		JMP	SHORT DC_RND_END 
RND_BELOW_0:    NEG	DX 
		CMP	DX,LH_TABLE 
		JS	DC_RND_END 
		DEC	AX 
DC_RND_END:	MOV	DX,DC_BASE 
		MOV	DC_BASE,AX 
		SUB	AX,DX 
		MOV	X12,AX 
		AND	AX,AX 
		JGE	ABOVE0 
		NEG	AX 
ABOVE0: 	MOV	LH_DENIST,AX 
AC_DO:     	PUSH	SI 
		SHL	SI,1 
		MOV	AX,WORD PTR X1[SI] 
		MOV	BX,WORD PTR X1[SI+2] 
		POP	SI 
		MOV	BYTE PTR X12[SI+1],BL 
		AND	BL,7FH 
		CHANGE_FLOAT_INT 
		AND	AX,AX 
		JZ	AC_RND_END 
		CWD 
		DIV	WORD PTR LH_TABLE[SI] 
		SHL	DX,1 
		CMP	DX,LH_TABLE[SI] 
		JNGE    AC_RND_END 
		INC	AX 
AC_RND_END:     MOV	WORD PTR LH_DENIST[SI],AX 
		DEC	CX 
		AND	AX,AX 
		JZ 	AC_NEXT 
		PUSH	CX 
		MOV	BX,CX 
		XCHG	CH,CL 
		MOV	CL,3 
		SHR	BX,CL 
		XCHG	CH,CL 
		AND	CX,7 
		INC	CH 
		SHL	CH,CL 
		OR	BYTE PTR LABLES[BX],CH 
		POP	CX 
AC_NEXT:	ADD	SI,2 
		CMP	CX,1 
		JZ 	QUANTIZE_OVER 
		JMP	AC_DO 
QUANTIZE_OVER: 
;---------------ASK ABOUT_0--------------- 
		XOR	SI,SI 
		MOV	CL,4 
BACK: 		XOR	AX,AX 
		MOV	DX,WORD PTR LABLES+6 
		OR	DX,WORD PTR LABLES+4 
		JNZ     SHIFT_LABLES 
		MOV	BX,WORD PTR LABLES+2 
		OR	BX,WORD PTR LABLES 
		JZ	CLOSE 
SHIFT_LABLES:   SHL	WORD PTR LABLES,1 
		RCL	WORD PTR LABLES+2,1 
		RCL	WORD PTR LABLES+4,1 
		RCL	WORD PTR LABLES+6,1 
		JC      ASK 
		INC	AX 
		JMP	SHORT SHIFT_LABLES 
ASK:            PUSH 	AX 
		SHR 	AX,CL 
		JZ 	BB1 
AA1:		MOV 	WORD PTR ABOUT_0[SI],15 
		ADD 	SI,2 
		DEC 	AL 
		JNZ 	AA1 
BB1:    	POP 	AX 
		AND 	AX,0FH 
		MOV 	ABOUT_0[SI],AX 
		ADD	SI,2 
		JMP 	BACK 
CLOSE:  	MOV 	WORD PTR ABOUT_0[SI],EOB 
		RET 
QUANTIZER	ENDP 
;---------------------------------------- 
C_QUANT		PROC 
		MOV 	SI,2 
		MOV 	CX,64 
		MOV	AX,WORD PTR X1 
		MOV	BX,WORD PTR X1+2 
		CHANGE_FLOAT_INT 
		CWD 
		IDIV	COLOR_TABLE 
		SHL	DX,1 
		AND	DX,DX 
		JS	CRND_BELOW_0 
		CMP	DX,COLOR_TABLE 
		JS	CDC_RND_END 
		INC	AX 
		JMP	SHORT CDC_RND_END 
CRND_BELOW_0:   NEG	DX 
		CMP	DX,COLOR_TABLE 
		JS	CDC_RND_END 
		DEC	AX 
CDC_RND_END:	MOV	DX,DC_BASE 
		MOV	DC_BASE,AX 
		SUB	AX,DX 
		MOV	X12,AX 
		AND	AX,AX 
		JGE	CABOVE0 
		NEG	AX 
CABOVE0: 	MOV	LH_DENIST,AX 
CAC_DO:     	PUSH	SI 
		SHL	SI,1 
		MOV	AX,WORD PTR X1[SI] 
		MOV	BX,WORD PTR X1[SI+2] 
		POP	SI 
		MOV	BYTE PTR X12[SI+1],BL 
		AND	BL,7FH 
		CHANGE_FLOAT_INT 
		AND	AX,AX 
		JZ	CAC_RND_END 
		CWD 
		DIV	WORD PTR COLOR_TABLE[SI] 
		SHL	DX,1 
		CMP	DX,COLOR_TABLE[SI] 
		JNGE    CAC_RND_END 
		INC	AX 
CAC_RND_END:    MOV	WORD PTR LH_DENIST[SI],AX 
		DEC	CX 
		AND	AX,AX 
		JZ 	CAC_NEXT 
		PUSH	CX 
		MOV	BX,CX 
		XCHG	CH,CL 
		MOV	CL,3 
		SHR	BX,CL 
		XCHG	CH,CL 
		AND	CX,7 
		INC	CH 
		SHL	CH,CL 
		OR	BYTE PTR LABLES[BX],CH 
		POP	CX 
CAC_NEXT:	ADD	SI,2 
		CMP	CX,1 
		JZ 	CQUANTIZE_OVER 
		JMP	CAC_DO 
CQUANTIZE_OVER: 
;---------------ASK ABOUT_0--------------- 
		XOR	SI,SI 
		MOV	CL,4 
CBACK: 		XOR	AX,AX 
		MOV	DX,WORD PTR LABLES+6 
		OR	DX,WORD PTR LABLES+4 
		JNZ     CSHIFT_LABLES 
		MOV	BX,WORD PTR LABLES+2 
		OR	BX,WORD PTR LABLES 
		JZ	CCLOSE 
CSHIFT_LABLES:  SHL	WORD PTR LABLES,1 
		RCL	WORD PTR LABLES+2,1 
		RCL	WORD PTR LABLES+4,1 
		RCL	WORD PTR LABLES+6,1 
		JC      CASK 
		INC	AX 
		JMP	SHORT CSHIFT_LABLES 
CASK:           PUSH 	AX 
		SHR 	AX,CL 
		JZ 	CBB1 
CAA1:		MOV 	WORD PTR ABOUT_0[SI],15 
		ADD 	SI,2 
		DEC 	AL 
		JNZ 	CAA1 
CBB1:    	POP 	AX 
		AND 	AX,0FH 
		MOV 	ABOUT_0[SI],AX 
		ADD	SI,2 
		JMP 	CBACK 
CCLOSE:  	MOV 	WORD PTR ABOUT_0[SI],EOB 
		RET 
C_QUANT		ENDP 
;---------------CODE SHIFT IN------------ 
SHIFT_IN	PROC 
		AND	CL,CL 
		JZ	ZERO 
		PUSH	ES 
		PUSH	CODE_BUFF 
		POP	ES 
		PUSH	BP 
		SHL	BP,1 
		SHL	BP,1 
		XOR	CH,CH 
SHIFT_CODE_IN:	SHL	AX,1 
		RCL	WORD PTR ES:[BP],1 
		RCL	WORD PTR ES:[BP+2],1 
		LOOP	SHIFT_CODE_IN 
		POP	BP 
		POP	ES 
ZERO:   	RET 
SHIFT_IN	ENDP 
 
ENTROPY_CODEC	PROC 
;-------------------------------------- 
;------------BEGIN TO CODE------------- 
;---------------DC CODE---------------- 
;-------------------------------------- 
		MOV 	DH,CODE_CURRENT_LOCATION 
		MOV 	BP,CODE_LOCATION 
		MOV 	BX,LH_DENIST 
		INS_BSR_BX 
		MOV	SI,BX 
		SHL	SI,1 
		SHL	SI,1 
		MOV	AX,WORD PTR DC_TABLE[SI+2] 
		MOV	DL,BYTE PTR DC_TABLE[SI] 
		D_SHIFT 
		MOV 	AX,WORD PTR LH_DENIST 
		MOV	CL,16 
		SUB	CL,BL 
		SHL	AX,CL 
		CMP     WORD PTR X12,0 
		JGE	CONTINUE2 
		XOR	AX,0FFFFH 
CONTINUE2:	MOV 	DL,BL 
		D_SHIFT 
;-------------------------------------- 
;------------AC CODE------------------- 
;-------------------------------------- 
		XOR	SI,SI 
		XOR	DI,DI 
BACKS:  	XOR	AX,AX 
		MOV 	AX,ABOUT_0[SI] 
		MOV 	NUM,AX 
		CMP 	AX,EOB 
		JNE	N3 
		JMP 	NEXT1 
N3:		ADD 	DI,AX 
		INC 	DI 
		PUSH	DI 
		SHL	DI,1 
		MOV 	BX,LH_DENIST[DI] 
		INS_BSR_BX 
		MOV	CL,4 
		SHL 	AX,CL 
		ADD 	AX,BX 
		MOV 	NUM,BX 
		PUSH	DI 
		MOV	DI,AX 
		SHL	DI,1 
		SHL	DI,1 
		MOV	AX,WORD PTR CODE_TABLE[DI+2] 
		MOV	DL,BYTE PTR CODE_TABLE[DI] 
		POP	DI 
		D_SHIFT 
		ADD	SI,2 
		MOV	CL,16 
		SUB	CL,BL 
		MOV 	AX,WORD PTR LH_DENIST[DI] 
		SHL	AX,CL 
		CMP	WORD PTR X12[DI],0 
		POP	DI 
		JGE     CONTINUE1 
		XOR	AX,0FFFFH 
CONTINUE1:	MOV 	DL,BL 
		D_SHIFT 
		JMP 	BACKS 
NEXT1:  	MOV	AX,WORD PTR CODE_TABLE+2 
		MOV	DL,BYTE PTR CODE_TABLE 
		D_SHIFT 
		MOV 	CODE_CURRENT_LOCATION,DH 
		MOV 	CODE_LOCATION,BP 
		RET 
ENTROPY_CODEC	ENDP 
;************************************** 
C_CODEC		PROC 
;-------------------------------------- 
;------------BEGIN TO CODE------------- 
;---------------DC CODE---------------- 
;-------------------------------------- 
		MOV 	DH,CODE_CURRENT_LOCATION 
		MOV 	BP,CODE_LOCATION 
		MOV 	BX,LH_DENIST 
		INS_BSR_BX 
		MOV	SI,BX 
		SHL	SI,1 
		SHL	SI,1 
		MOV	AX,WORD PTR CHRO_DC_TABLE[SI+2] 
		MOV	DL,BYTE PTR CHRO_DC_TABLE[SI] 
		D_SHIFT 
		MOV 	AX,WORD PTR LH_DENIST 
		MOV	CL,16 
		SUB	CL,BL 
		SHL	AX,CL 
		CMP     WORD PTR X12,0 
		JGE	CCONTINUE2 
		XOR	AX,0FFFFH 
CCONTINUE2:	MOV 	DL,BL 
		D_SHIFT 
;-------------------------------------- 
;------------AC CODE------------------- 
;-------------------------------------- 
		XOR	SI,SI 
		XOR	DI,DI 
CBACKS:  	XOR	AX,AX 
		MOV 	AX,ABOUT_0[SI] 
		MOV 	NUM,AX 
		CMP 	AX,EOB 
		JNE	CN3 
		JMP 	CNEXT1 
CN3:		ADD 	DI,AX 
		INC 	DI 
		PUSH	DI 
		SHL	DI,1 
		MOV 	BX,LH_DENIST[DI] 
		INS_BSR_BX 
		MOV	CL,4 
		SHL 	AX,CL 
		ADD 	AX,BX 
		MOV 	NUM,BX 
		PUSH	DI 
		MOV	DI,AX 
		SHL	DI,1 
		SHL	DI,1 
		MOV	AX,WORD PTR CHRO_AC_TABLE[DI+2] 
		MOV	DL,BYTE PTR CHRO_AC_TABLE[DI] 
		POP	DI 
		D_SHIFT 
		ADD	SI,2 
		MOV	CL,16 
		SUB	CL,BL 
		MOV 	AX,WORD PTR LH_DENIST[DI] 
		SHL	AX,CL 
		CMP	WORD PTR X12[DI],0 
		POP	DI 
		JGE     CCONTINUE1 
		XOR	AX,0FFFFH 
CCONTINUE1:	MOV 	DL,BL 
		D_SHIFT 
		JMP 	CBACKS 
CNEXT1:  	MOV	AX,WORD PTR CHRO_AC_TABLE+2 
		MOV	DL,BYTE PTR CHRO_AC_TABLE 
		D_SHIFT 
		MOV 	CODE_CURRENT_LOCATION,DH 
		MOV 	CODE_LOCATION,BP 
		RET 
C_CODEC		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	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 
		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: 
		RET 
FLOAT_MUL	ENDP 
;************************************** 
; SR=BP , DT=DI , TEMP:MUL_TEMP=BX 
; DT=DT/SR; 
;************************************** 
FLOAT_DIV	PROC 
		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:        RET 
FLOAT_DIV	ENDP 
_JPEG_TEXT 	ENDS 
		END