Algorithm 版 (精华区)
发信人: lofe ()感激生活(), 信区: Algorithm
标 题: Fin--decomp2.asm
发信站: 哈工大紫丁香 (Sun Sep 3 16:03:42 2000), 转信
; Copyright 1991 by Jussi Puttonen, Timo Raita and Jukka Teuhola
; Written by Jussi Puttonen, 19.4.1991 at University of Turku, Finland
; Algorithms suggested by Timo Raita and Jukka Teuhola
InFile equ 0
OutFile equ 1
ReadBufferSize equ 16384
WriteBufferSize equ 16384
stack segment stack 'stack'
db 1024 dup (?)
stack ends
data segment para public 'data'
FailString db 'DECOMP failed.', 10,13, '$'
align
ReadBuffer db ReadBufferSize dup (?)
ReadBufferEnd label byte
ReadEnd dw offset ReadBufferEnd
align
WriteBuffer db WriteBufferSize dup (?)
WriteBufferEnd label byte
nine dw 9
data ends
table segment para public 'data'
db 8000h dup (' ')
db 8000h dup (' ')
table ends
code segment para public 'code'
assume cs:code, ds:data, es:table
WriteBlock:
push ax
push bx
push cx
push dx
mov ah, 40h
mov bx, OutFile
mov cx, WriteBufferSize
lea dx, WriteBuffer
mov di, dx
int 21h
pop dx
pop cx
pop bx
pop ax
ret
FlushBuffer proc
mov ah, 40h
mov bx, OutFile
mov cx, di
lea dx, WriteBuffer
sub cx, dx
int 21h
ret
FlushBuffer endp
jProcessWithChecks:
jmp ProcessWithChecks
start: cld
mov ax, data
mov ds, ax
mov ax, table
mov es, ax
; si contains pointer to ReadBuffer
mov si, offset ReadBufferEnd
; di contains pointer to WriteBuffer
mov di, offset WriteBuffer
; bx contains the Addr
mov bx, 0
ReadLoop: mov ax, ReadEnd
sub ax, si
xor dx, dx
div nine
cmp ax, 1
jbe jProcessWithChecks
mov dx, ax
dec dx
mov ax, offset WriteBufferEnd
sub ax, di
mov cl, 3
shr ax, cl
cmp ax, 1
jbe jProcessWithChecks
dec ax
mov cx, ax
cmp cx, dx
jbe MinFound
mov cx, dx
MinFound:
ByteLoop: lodsb
mov dl, al
ProcessBit macro
local zerobit, over
shl dl, 1
jnc zerobit
lodsb
mov es:[bx], al
jmp short over
zerobit: mov al, es:[bx]
over: mov bh, bl
mov bl, al
mov ds:[di], al
inc di
endm
ProcessBit
ProcessBit
ProcessBit
ProcessBit
ProcessBit
ProcessBit
ProcessBit
ProcessBit
loop jByteLoop
jmp ReadLoop
jByteLoop: jmp ByteLoop
ProcessWithChecks:
; read a byte
cmp si, ReadEnd
jb noreadblock$1
push bx
mov dx, offset ReadBuffer
mov si, dx
mov bx, InFile
mov ah, 3Fh
mov cx, ReadBufferSize
int 21h
pop bx
jnc readsuccess$1
jmp fail
readsuccess$1:
or ax, ax
jne notready$1
jmp ready
notready$1:
add ax, offset ReadBuffer
mov ReadEnd, ax
noreadblock$1:
lodsb
;
mov dl, al
mov cx, 8
bitloop:
shl dl, 1
jnc zerobit
onebit:
; read a byte
cmp si, ReadEnd
jb noreadblock$2
push bx
push cx
push dx
mov dx, offset ReadBuffer
mov si, dx
mov bx, InFile
mov ah, 3Fh
mov cx, ReadBufferSize
int 21h
pop dx
pop cx
pop bx
jnc readsuccess$2
jmp fail
readsuccess$2:
or ax, ax
jne notready$2
jmp ready
notready$2:
add ax, offset ReadBuffer
mov ReadEnd, ax
noreadblock$2:
lodsb
;
mov es:[bx], al
mov bh, bl
mov bl, al
; Write a byte
cmp di, offset WriteBufferEnd
jb nowriteblock$1
call WriteBlock
nowriteblock$1:
mov ds:[di], al
inc di
;
loop bitloop
jmp ReadLoop
zerobit:
mov al, es:[bx]
mov bh, bl
mov bl, al
; Write a byte
cmp di, offset WriteBufferEnd
jb nowriteblock$2
call WriteBlock
nowriteblock$2:
mov ds:[di], al
inc di
;
loop bitloop
jmp ReadLoop
ready: call FlushBuffer
mov ax, 4c00h
int 21h
fail:
mov dx, offset FailString
mov ah, 9
int 21h
mov ax, 4c01h
int 21h
code ends
end start
--
┌─ ─┐
Every problem has a solution.
└─ ─┘
infosite@263.net
http://infosite.topcool.net
※ 修改:.haojs 于 Sep 3 16:01:13 修改本文.[FROM: bbs.hit.edu.cn]
--
※ 转寄:.武汉白云黄鹤站 bbs.whnet.edu.cn.[FROM: bbs.hit.edu.cn]
--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: haojs.bbs@bbs.whnet.]
※ 修改:·lofe 於 09月03日16:07:47 修改本文·[FROM: 202.118.226.15]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.633毫秒