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