; ; 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