Bload Compressor/6

 BBS: Inland Empire Archive
Date: 12-28-92 (06:44)             Number: 362
From: RICH GELDREICH               Refer#: NONE
  To: ALL                           Recvd: NO  
Subj: Bload Compressor/6             Conf: (2) Quik_Bas
'Page 1 of DECOM13.ASM begins here.
;TASM v2.0 source code for DECOM13.OBJ. By Rich Geldreich, 1992
;A LZ77 style sliding dictionary decompressor for SCREEN 13 images.
.286                                    ;<-sorry 8088 & 8086 guys,
IDEAL                                   ;it's 1992 get a real CPU!
MODEL SMALL
CODESEG
PUBLIC  Decom13
PROC    Decom13
INPTR   EQU [dword ss:bp+6]
P       = 2
        Cld                             ;clear direction flag
        Push    bp                      ;setup stack frame
        Mov     bp, sp
        Push    ds es si di             ;preserve important regs
        Lds     si, INPTR               ;get pointer from stack
        Cmp     [word ds:si], 'R'+'G'*256 ;is an image there?
        Je      @@OK                    ;nope
        Jmp     @@Exit
@@OK:   Inc     si                      ;get by signature
        Inc     si
        Mov     [word cs:ISeg1+1], ds   ;a little self modifying code
        Mov     [word cs:ISeg2+1], ds   ; can't hurt(I think).
        Jmp     @@10                    ;empty the prefetch
@@20:   Mov     dx, 03C4h               ;sequencer register
        Mov     al, 1                   ;clocking mode register
        Out     dx, al
        Inc     dx
        In      al, dx
        Or      al, 32                  ;set screen off bit
        Out     dx, al                  ;go for screen disable
        Mov     dl, 0DAh                ;wait for vertical retrace
@@30:   In      al, dx
        And     al, 8
        Jz      @@30
        Mov     dl, 0C8h                ;dx=03C8h
        Mov     cx, 768                 ;prepare to set the palette
        Xor     al, al                  ;start at attribute 0
        Out     dx, al
        Inc     dx
        Rep     Outsb                   ;output the palette
        Push    0A000h                  ;es=screen's segment
        Pop     es
        Xor     di, di                  ;di=output offset
        Mov     dx, di                  ;dx=# bits left in bitbuffer
EVEN                                    ;-decode loop starts here-
@@MoreBits:
        Lodsw                           ;prime the bitbuffer
        Mov     dl, 16                  ;16 more bits now
        Mov     bp, ax
        Shr     bp, 1                   ;character or match?
        Jc      @@Match                 ;go for match if carry set
EVEN
@@NoMatch:
        Movsb                           ;store one character
@@MainLoop:
        Dec     dx                      ;any more bits left?
        Jz      @@MoreBits              ;get more if not
        Shr     bp, 1                   ;character of match?
        Jnc     @@NoMatch               ;go if character(carry=0)
@@Match:                                ;-handles a string match-
        Lodsw                           ;get match length and
        Mov     cx, ax                  ; and distance
        Shr     ax, 4                   ;shift by the match length
        Neg     ax                      ;got -distance now
        Add     ax, di                  ;ax=match position
        And     cx, 0Fh                 ;get low 4 bytes for length
        Add     cl, 3                   ;add in length threshold
        Cmp     cl, 18                  ;is this a big match?
        Je      @@GetMore               ;go get 1 more byte if so
        Xchg    ax, si                  ;save si and set si to match
        Mov     bx, es                  ; position
        Mov     ds, bx                  ;ds=es=0A000h
        Rep     Movsb                   ;copy the string
        Mov     si, ax                  ;restore ds and si
ISeg1:  Mov     ax, 09999h              ;<--self modifying code
        Mov     ds, ax
        Jmp     @@MainLoop              ;go again
EVEN
@@GetMore:
        Mov     bx, ax                  ;save match pos in bx
        Xor     ax, ax                  ;get one more byte for
        Lodsb                           ; match length
        Add     cx, ax
        Cmp     cx, 273                 ;end of image code?
        Je      @@Exit                  ;if so then done
        Xchg    bx, si                  ;save si and set si to match
'Continued on page 2

--- MsgToss 2.0b
 * Origin: Computer Co-Op - Voorhees, NJ | Ted Hare (1:266/29)
Outer Court
Echo Basic Postings

Books at Amazon:

Back to BASIC: The History, Corruption, and Future of the Language

Hackers: Heroes of the Computer Revolution (including Tiny BASIC)

Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution

The Advent of the Algorithm: The Idea that Rules the World

Moths in the Machine: The Power and Perils of Programming

Mastering Visual Basic .NET