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毫秒