?? huf.asm
字號:
page 66, 120 ;
;$_init ;
;***********************************************;
; LHarc version 1.13 (c) Yoshi 1988-89. ;
; adaptive Huffman module : 1989/ 5/ 4 ;
; ;
; HTAB = 8 ;
;***********************************************;
;
extrn __fgetc:near ;
extrn fputc :near ;
;
;*************************************** ;
; getc macro ;
; bx: address of FILE struc ;
; ax: input char (return) ;
;*************************************** ;
getc@ macro ;
local getc1, getc2 ;
dec word ptr [bx] ;
jl getc1 ;
inc word ptr [bx+10] ;
mov bx, [bx+10] ;
mov al, [bx-1] ;
xor ah, ah ;
jmp getc2 ;
getc1: ;
push dx ;
push cx ;
push bx ;
call __fgetc ;
pop bx ;
pop cx ;
pop dx ;
getc2: ;
endm ;
;
;*************************************** ;
; putc macro ;
; ax: output char ;
; bx: address of FILE struc ;
;*************************************** ;
putc@ macro ;
local putc1, putc2 ;
inc word ptr [bx] ;
jge putc1 ;
inc word ptr [bx+10] ;
mov bx, [bx+10] ;
mov [bx-1], al ;
jmp short putc2 ;
putc1: ;
call fputc ;
putc2: ;
endm ;
;
DGROUP group _DATA, _BSS ;
assume cs:_TEXT, ds:DGROUP ;
;
_DATA segment word public 'DATA' ;
;
;-----------------------------------------------;
; 埵抲忣曬晞崋壔昞 ;
;-----------------------------------------------;
public _p_len, _p_code ;
public _d_len, _d_code ;
_p_len label byte ;
db 003h, 004h, 004h, 004h, 005h, 005h, 005h, 005h
db 005h, 005h, 005h, 005h, 006h, 006h, 006h, 006h
db 006h, 006h, 006h, 006h, 006h, 006h, 006h, 006h
db 007h, 007h, 007h, 007h, 007h, 007h, 007h, 007h
db 007h, 007h, 007h, 007h, 007h, 007h, 007h, 007h
db 007h, 007h, 007h, 007h, 007h, 007h, 007h, 007h
db 008h, 008h, 008h, 008h, 008h, 008h, 008h, 008h
db 008h, 008h, 008h, 008h, 008h, 008h, 008h, 008h
;
_p_code label byte ;
db 000h, 020h, 030h, 040h, 050h, 058h, 060h, 068h
db 070h, 078h, 080h, 088h, 090h, 094h, 098h, 09Ch
db 0A0h, 0A4h, 0A8h, 0ACh, 0B0h, 0B4h, 0B8h, 0BCh
db 0C0h, 0C2h, 0C4h, 0C6h, 0C8h, 0CAh, 0CCh, 0CEh
db 0D0h, 0D2h, 0D4h, 0D6h, 0D8h, 0DAh, 0DCh, 0DEh
db 0E0h, 0E2h, 0E4h, 0E6h, 0E8h, 0EAh, 0ECh, 0EEh
db 0F0h, 0F1h, 0F2h, 0F3h, 0F4h, 0F5h, 0F6h, 0F7h
db 0F8h, 0F9h, 0FAh, 0FBh, 0FCh, 0FDh, 0FEh, 0FFh
;
;-----------------------------------------------;
; 埵抲忣曬夝撉昞 ;
;-----------------------------------------------;
_d_code db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
db 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h
db 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h
db 02h, 02h, 02h, 02h, 02h, 02h, 02h, 02h
db 02h, 02h, 02h, 02h, 02h, 02h, 02h, 02h
db 03h, 03h, 03h, 03h, 03h, 03h, 03h, 03h
db 03h, 03h, 03h, 03h, 03h, 03h, 03h, 03h
db 04h, 04h, 04h, 04h, 04h, 04h, 04h, 04h
db 05h, 05h, 05h, 05h, 05h, 05h, 05h, 05h
db 06h, 06h, 06h, 06h, 06h, 06h, 06h, 06h
db 07h, 07h, 07h, 07h, 07h, 07h, 07h, 07h
db 08h, 08h, 08h, 08h, 08h, 08h, 08h, 08h
db 09h, 09h, 09h, 09h, 09h, 09h, 09h, 09h
db 0Ah, 0Ah, 0Ah, 0Ah, 0Ah, 0Ah, 0Ah, 0Ah
db 0Bh, 0Bh, 0Bh, 0Bh, 0Bh, 0Bh, 0Bh, 0Bh
db 0Ch, 0Ch, 0Ch, 0Ch, 0Dh, 0Dh, 0Dh, 0Dh
db 0Eh, 0Eh, 0Eh, 0Eh, 0Fh, 0Fh, 0Fh, 0Fh
db 10h, 10h, 10h, 10h, 11h, 11h, 11h, 11h
db 12h, 12h, 12h, 12h, 13h, 13h, 13h, 13h
db 14h, 14h, 14h, 14h, 15h, 15h, 15h, 15h
db 16h, 16h, 16h, 16h, 17h, 17h, 17h, 17h
db 18h, 18h, 19h, 19h, 1Ah, 1Ah, 1Bh, 1Bh
db 1Ch, 1Ch, 1Dh, 1Dh, 1Eh, 1Eh, 1Fh, 1Fh
db 20h, 20h, 21h, 21h, 22h, 22h, 23h, 23h
db 24h, 24h, 25h, 25h, 26h, 26h, 27h, 27h
db 28h, 28h, 29h, 29h, 2Ah, 2Ah, 2Bh, 2Bh
db 2Ch, 2Ch, 2Dh, 2Dh, 2Eh, 2Eh, 2Fh, 2Fh
db 30h, 31h, 32h, 33h, 34h, 35h, 36h, 37h
db 38h, 39h, 3Ah, 3Bh, 3Ch, 3Dh, 3Eh, 3Fh
;
;
_d_len db 03h, 03h, 03h, 03h, 03h, 03h, 03h, 03h
db 03h, 03h, 03h, 03h, 03h, 03h, 03h, 03h
db 03h, 03h, 03h, 03h, 03h, 03h, 03h, 03h
db 03h, 03h, 03h, 03h, 03h, 03h, 03h, 03h
db 04h, 04h, 04h, 04h, 04h, 04h, 04h, 04h
db 04h, 04h, 04h, 04h, 04h, 04h, 04h, 04h
db 04h, 04h, 04h, 04h, 04h, 04h, 04h, 04h
db 04h, 04h, 04h, 04h, 04h, 04h, 04h, 04h
db 04h, 04h, 04h, 04h, 04h, 04h, 04h, 04h
db 04h, 04h, 04h, 04h, 04h, 04h, 04h, 04h
db 05h, 05h, 05h, 05h, 05h, 05h, 05h, 05h
db 05h, 05h, 05h, 05h, 05h, 05h, 05h, 05h
db 05h, 05h, 05h, 05h, 05h, 05h, 05h, 05h
db 05h, 05h, 05h, 05h, 05h, 05h, 05h, 05h
db 05h, 05h, 05h, 05h, 05h, 05h, 05h, 05h
db 05h, 05h, 05h, 05h, 05h, 05h, 05h, 05h
db 05h, 05h, 05h, 05h, 05h, 05h, 05h, 05h
db 05h, 05h, 05h, 05h, 05h, 05h, 05h, 05h
db 06h, 06h, 06h, 06h, 06h, 06h, 06h, 06h
db 06h, 06h, 06h, 06h, 06h, 06h, 06h, 06h
db 06h, 06h, 06h, 06h, 06h, 06h, 06h, 06h
db 06h, 06h, 06h, 06h, 06h, 06h, 06h, 06h
db 06h, 06h, 06h, 06h, 06h, 06h, 06h, 06h
db 06h, 06h, 06h, 06h, 06h, 06h, 06h, 06h
db 07h, 07h, 07h, 07h, 07h, 07h, 07h, 07h
db 07h, 07h, 07h, 07h, 07h, 07h, 07h, 07h
db 07h, 07h, 07h, 07h, 07h, 07h, 07h, 07h
db 07h, 07h, 07h, 07h, 07h, 07h, 07h, 07h
db 07h, 07h, 07h, 07h, 07h, 07h, 07h, 07h
db 07h, 07h, 07h, 07h, 07h, 07h, 07h, 07h
db 08h, 08h, 08h, 08h, 08h, 08h, 08h, 08h
db 08h, 08h, 08h, 08h, 08h, 08h, 08h, 08h
even ;
_DATA ends ;
;
public THRESHOLD, F, N_CHAR, T ;
THRESHOLD equ 2 ;
F equ 60 ;
N_CHAR equ (256 - THRESHOLD + F) ;
T equ (N_CHAR * 2 - 1) ;
R equ (T - 1) ;
MAX_FREQ equ 8000h ;
;
_BSS segment word public 'BSS' ;
public _freq, _prnt, _son ;
public _iobuf, _iolen, _iobuf, _iolen ;
;
_freq dw (T + 1) dup (?) ;
_prnt dw (T + N_CHAR) dup (?) ;
_son dw T dup (?) ;
_iobuf label word ;
dw 1 dup (?) ;
_iolen label byte ;
db 1 dup (?) ;
_BSS ends ;
;
extrn _infile :word ;
extrn _outfile :word ;
extrn _codesize :word ;
extrn _backup2 :byte ;
extrn _error :near ;
;
_TEXT segment byte public 'CODE' ;
assume cs:_TEXT, ds:DGROUP ;
;
;-----------------------------------------------;
; 擖椡偐傜侾僶僀僩傪摼傞 ;
;-----------------------------------------------;
public _GetByte ;
_GetByte proc near ;
mov dx, DGROUP:_iobuf ;
cmp _iolen, 8
jG $_1
call _GetBufFill ;
$_1:
xchg dl, dh ;
mov ax, dx ;
xor dl, dl ;
mov DGROUP:_iobuf, dx ;
sub DGROUP:_iolen, 8 ;
xor ah, ah ;
ret ;
_GetByte endp ;
;
;-----------------------------------------------;
; 擖椡偐傜値價僢僩傪摼傞 ;
;-----------------------------------------------;
; cl : n bits ;
;-----------------------------------------------;
public _GetNBits ;
_GetNBits proc near ;
push cx ;
mov dx, DGROUP:_iobuf ;
cmp _iolen, 8
jG $_2
call _GetBufFill ;
$_2:
pop cx ;
mov ax, dx ;
shl dx, cl ;
mov DGROUP:_iobuf, dx ;
sub DGROUP:_iolen, cl ;
mov dx, -1 ;
shr dx, cl ;
not dx ;
and ax, dx ;
ret ;
_GetNBits endp ;
;
;-----------------------------------------------;
; 侾僶僀僩擖椡 ;
;-----------------------------------------------;
_GetBufFill proc near ;
mov bx, DGROUP:_infile ;
dec word ptr [bx] ;
jl getc1 ;
inc word ptr [bx+10] ;
mov bx, [bx+10] ;
mov al, [bx-1] ;
xor ah, ah ;
jmp getc2 ;
getc1: ;
push dx ;
push cx ;
push bx ;
call __fgetc ;
or ax, ax
jGE $_3
inc ax ;
$_3:
pop bx ;
pop cx ;
pop dx ;
getc2: ;
mov cl, 8 ;
sub cl, DGROUP:_iolen ;
shl ax, cl ;
or dx, ax ;
add DGROUP:_iolen, 8 ;
ret ;
_GetBufFill endp ;
;
;-----------------------------------------------;
; 値價僢僩弌椡 ;
;-----------------------------------------------;
; ax : code ;
; ch : len ;
;-----------------------------------------------;
public _Putcode ;
_Putcode proc near ;
mov dx, ax ;
mov cl, DGROUP:_iolen ;
shr ax, cl ;
or _iobuf, ax ;
add cl, ch ;
cmp cl, 8 ;
jae _PutBuf1 ;
_Putcode1: ;
mov _iolen, cl ;
ret ;
;
_PutBuf1: ;
mov al, byte ptr _iobuf + 1 ;
mov bx, DGROUP:_outfile ;
putc@ ;
sub cl, 8 ;
cmp cl, 8 ;
jae _PutBuf2 ;
mov ah, byte ptr _iobuf ;
mov al, 0 ;
mov _iobuf, ax ;
add DGROUP:_codesize, 1 ;
adc DGROUP:_codesize + 2, 0 ;
jmp _Putcode1 ;
;
_PutBuf2: ;
mov al, byte ptr _iobuf ;
mov bx, DGROUP:_outfile ;
putc@ ;
add DGROUP:_codesize, 2 ;
adc DGROUP:_codesize + 2, 0 ;
sub cl, 8 ;
sub ch, cl ;
xchg cl, ch ;
shl dx, cl ;
xchg cl, ch ;
mov _iobuf, dx ;
jmp _Putcode1 ;
_Putcode endp ;
;
;-----------------------------------------------;
; 俫倀俥梡偺栘峔憿偺弶婜壔 ;
;-----------------------------------------------;
public _StartModel ;
_StartModel proc near ;
push si ;
push di ;
mov ax, ds ;
mov es, ax ;
cld ;
;
mov ax, 1 ;
mov cx, N_CHAR ;
mov di, offset DGROUP:_freq ;
rep stosw ;
;
mov ax, T * 2 ;
mov dx, 0 ;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -