mac-rom/Patches/DeCompressDefProc1.a

262 lines
7.2 KiB
Plaintext

;
; File: DeCompressDefProc1.a
;
; Contains: the standard decompression defproc for byte sized data.
;
; Written by: Donn Denman
;
; Copyright: © 1990-1991 by Apple Computer, Inc., all rights reserved.
;
; Change History (most recent first):
;
; <4> 7/9/91 JSM Remove obsolete check for 7.0 or greater, set tabs to 4.
; <3> 1/30/91 gbm sab, #38: Change the name of one of the decompressor header
; files (because Sheila said it was okay)
; <2> 4/19/90 DD removed include of patchmacros.a, added proc Export
; <1> 4/12/90 DD first checked in today
;
LOAD 'StandardEqu.d'
include 'DecompressorPatchEqu.a' ; equate file
DeCompressDefProc1 PROC Export
With VarTableRec
BRA UnpackData ; do the decompress.
DC.l ('dcmp') ; resource type
DC.W 1 ; ID 1 the byte-wise decompressor.
DC.W 0 ; current version number.
Delta Equ 1
LiteralEncoded Equ 0 ;literals with encoded values start here
DefsEncoded Equ $10 ;literals to be remembered with encoded values start here
VariableRefs Equ $20 ;variable refs start here.
ConstantItems Equ $D0 ;constant values start here.
Max1ByteReuse Equ ConstantItems-VariableRefs ;ReUseData can encode this many vars in one byte.
include 'DeCompressCommon.A' ;common to the DeCompressDefProc's
; Token fetch and dispatch loop.
UnpackLoop
MoveQ #0,D0
Move.B (A4)+,D0 ;get a token.
Move.W D0,D1
Cmp.W #ConstantItems,D1 ;is this a folded or constant table entry?
BLT.S @FoldedEntry
Sub.W #ConstantItems,D1
Asl.W #3,D1 ;index into an 8 byte (4 word) table.
Jmp ConstantDispatchTable(D1) ;jump to the handler entry.
@FoldedEntry
Lsr.W #2,D1 ;index into a 4 byte table, with one entry per 16 opcodes.
And.W #$FFFC,D1 ;mask off the low bits
Lea 0(A2,D1),A0 ;point to the entry.
Sub.W (A0)+,D0 ;jump to the handler entry.
Add.W (A0),A0
Jmp (A0)
;
;
; CodeDispatchTable - Each entry is 2 words, a value to subtract from
; the parameter, and a code offset.
;
CodeDispatchTable
DC.W -1,CopyLiteralAndLoop-*-2 ;subtract one less, since CopyLiteralAndLoop
DC.W $0F,RememberLiteral-*-2 ; and RememberLiteral assume a one based value.
DC.W $20,ReuseData - * - 2 ;variable references are already zero based.
DC.W $20,ReuseData - * - 2
DC.W $20,ReuseData - * - 2
DC.W $20,ReuseData - * - 2
DC.W $20,ReuseData - * - 2
DC.W $20,ReuseData - * - 2
DC.W $20,ReuseData - * - 2
DC.W $20,ReuseData - * - 2
DC.W $20,ReuseData - * - 2
DC.W $20,ReuseData - * - 2
DC.W $20,ReuseData - * - 2
;
;
;
StuffWord
Move.B D0,D1 ;remember the low byte.
Lsr.W #8,D0 ;get the high byte.
Move.B D0,(A1)+ ;output high byte
Move.B D1,(A1)+ ;output the low byte
Bra UnPackLoop
*****************************************************************
*
* W A R N I N G !
*
* This Table is position sensitive !!!!!!!!!!
*
*****************************************************************
align 8 ;this is an aligned table!
ConstantDispatchTable
; Literal data, to copy to the output stream.
Bsr.S CopyWithLength ;literal followed by an encoded length.
Bra.S UnpackLoop
align 8 ;D0
; Literal data to be remembered in the variable table.
Bsr.S RememberWithLength ;remember a literal followed by a byte length.
Bra.S UnpackLoop
align 8 ;$D1
; References to remembered strings.
Bsr.S ReuseByteLength ;previously seen literal.
Bra.S UnpackLoop
align 8 ;$D2
Bsr.S ReuseByte2Length ;previously seen literal, followed by byte+256.
Bra.S UnpackLoop
align 8 ;$D3
Bsr.S ReuseWordLength ;previously seen literal.
Bra.S UnpackLoop
align 8 ;$D4
; constant words, to stuff into the output stream.
MoveQ #0,D0 ;move 0 into the output stream.
Bra StuffWord ;stuff the word, and keep looping.
align 8 ;$D5
MoveQ #$0001,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
MoveQ #$0002,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
MoveQ #$0003,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
Move.W #$2E01,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
Move.W #$3E01,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
Move.W #$0101,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
Move.W #$1E01,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
MoveQ #$FFFFFFFF,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
Move.W #$0E01,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
Move.W #$3100,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
Move.W #$1112,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8 ;$E0
Move.W #$0107,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
Move.W #$3332,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
Move.W #$1239,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
Move.W #$ED10,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
Move.W #$0127,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
Move.W #$2322,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
Move.W #$0137,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
Move.W #$0706,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
Move.W #$0117,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
Move.W #$0123,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
Move.W #$00FF,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
MoveQ #$002F,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
Move.W #$070E,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
Move.W #$FD3C,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
Move.W #$0135,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
Move.W #$0115,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8 ;$F0
Move.W #$0102,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
MoveQ #$0007,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
MoveQ #$003E,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
Move.W #$05D5,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
Move.W #$0201,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
Move.W #$0607,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
Move.W #$0708,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
Move.W #$3001,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
Move.W #$0133,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
MoveQ #$0010,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
Move.W #$1716,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
Move.W #$373E,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8
Move.W #$3637,D0
Bra StuffWord ;stuff the word, and keep looping.
align 8 ;$FD
Bsr HandleExtensions
Bra UnpackLoop ;keep looping.
align 8 ;$FE
; last table entry is the terminator for unpack.
Bra ExitUnpack ;done with the unpacking.
;$FF
END