⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 huf.asm

📁 lharc压缩算法
💻 ASM
📖 第 1 页 / 共 2 页
字号:
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 + -