SHOW:
|
|
- or go back to the newest paste.
1 | ; =========================================================================== | |
2 | ; --------------------------------------------------------------------------- | |
3 | ; Kosinski decompression routine | |
4 | ; | |
5 | ; Created by vladikcomper | |
6 | ; Special thanks to flamewing and MarkeyJester | |
7 | ; Modified for AS by MainMemory | |
8 | ; --------------------------------------------------------------------------- | |
9 | ||
10 | - | dbf d2,@skip\@ |
10 | + | |
11 | dbf d2,+ | |
12 | moveq #7,d2 | |
13 | move.b d1,d0 | |
14 | - | bpl.s @skip\@ |
14 | + | |
15 | bpl.s + | |
16 | move.b (a0)+,d0 ; get desc. bitfield | |
17 | move.b (a0)+,d1 ; | |
18 | move.b (a4,d0.w),d0 ; reload converted desc. bitfield from a LUT | |
19 | - | @skip\@ |
19 | + | |
20 | + | |
21 | endm | |
22 | ; --------------------------------------------------------------------------- | |
23 | ||
24 | KosDec: | |
25 | moveq #7,d7 | |
26 | moveq #0,d0 | |
27 | moveq #0,d1 | |
28 | lea KosDec_ByteMap(pc),a4 | |
29 | move.b (a0)+,d0 ; get desc field low-byte | |
30 | move.b (a0)+,d1 ; get desc field hi-byte | |
31 | move.b (a4,d0.w),d0 ; reload converted desc. bitfield from a LUT | |
32 | move.b (a4,d1.w),d1 ; | |
33 | moveq #7,d2 ; set repeat count to 8 | |
34 | moveq #-1,d3 ; d3 will be desc field switcher | |
35 | clr.w d3 ; | |
36 | bra.s KosDec_FetchNewCode | |
37 | ||
38 | KosDec_FetchCodeLoop: | |
39 | ; code 1 (Uncompressed byte) | |
40 | _Kos_RunBitStream | |
41 | move.b (a0)+,(a1)+ | |
42 | ||
43 | KosDec_FetchNewCode: | |
44 | add.b d0,d0 ; get a bit from the bitstream | |
45 | bcs.s KosDec_FetchCodeLoop ; if code = 0, branch | |
46 | ||
47 | ; codes 00 and 01 | |
48 | _Kos_RunBitStream | |
49 | moveq #0,d4 ; d4 will contain copy count | |
50 | add.b d0,d0 ; get a bit from the bitstream | |
51 | bcs.s KosDec_Code_01 | |
52 | ||
53 | ; code 00 (Dictionary ref. short) | |
54 | _Kos_RunBitStream | |
55 | add.b d0,d0 ; get a bit from the bitstream | |
56 | addx.w d4,d4 | |
57 | _Kos_RunBitStream | |
58 | add.b d0,d0 ; get a bit from the bitstream | |
59 | addx.w d4,d4 | |
60 | _Kos_RunBitStream | |
61 | moveq #-1,d5 | |
62 | move.b (a0)+,d5 ; d5 = displacement | |
63 | ||
64 | KosDec_StreamCopy: | |
65 | lea (a1,d5),a3 | |
66 | move.b (a3)+,(a1)+ ; do 1 extra copy (to compensate for +1 to copy counter) | |
67 | ||
68 | KosDec_copy: | |
69 | move.b (a3)+,(a1)+ | |
70 | dbf d4,KosDec_copy | |
71 | bra.w KosDec_FetchNewCode | |
72 | ; --------------------------------------------------------------------------- | |
73 | KosDec_Code_01: | |
74 | ; code 01 (Dictionary ref. long / special) | |
75 | _Kos_RunBitStream | |
76 | move.b (a0)+,d6 ; d6 = %LLLLLLLL | |
77 | move.b (a0)+,d4 ; d4 = %HHHHHCCC | |
78 | moveq #-1,d5 | |
79 | move.b d4,d5 ; d5 = %11111111 HHHHHCCC | |
80 | lsl.w #5,d5 ; d5 = %111HHHHH CCC00000 | |
81 | move.b d6,d5 ; d5 = %111HHHHH LLLLLLLL | |
82 | and.w d7,d4 ; d4 = %00000CCC | |
83 | bne.s KosDec_StreamCopy ; if CCC=0, branch | |
84 | ||
85 | ; special mode (extended counter) | |
86 | move.b (a0)+,d4 ; read cnt | |
87 | beq.s KosDec_Quit ; if cnt=0, quit decompression | |
88 | subq.b #1,d4 | |
89 | beq.w KosDec_FetchNewCode ; if cnt=1, fetch a new code | |
90 | ||
91 | lea (a1,d5),a3 | |
92 | move.b (a3)+,(a1)+ ; do 1 extra copy (to compensate for +1 to copy counter) | |
93 | move.w d4,d6 | |
94 | not.w d6 | |
95 | and.w d7,d6 | |
96 | add.w d6,d6 | |
97 | lsr.w #3,d4 | |
98 | jmp KosDec_largecopy(pc,d6.w) | |
99 | ||
100 | KosDec_largecopy: | |
101 | rept 8 | |
102 | - | endr |
102 | + | |
103 | endm | |
104 | dbf d4,KosDec_largecopy | |
105 | bra.w KosDec_FetchNewCode | |
106 | ||
107 | KosDec_Quit: | |
108 | rts | |
109 | ||
110 | ; --------------------------------------------------------------------------- | |
111 | ; A look-up table to invert bits order in desc. field bytes | |
112 | ; --------------------------------------------------------------------------- | |
113 | ||
114 | KosDec_ByteMap: | |
115 | dc.b $00,$80,$40,$C0,$20,$A0,$60,$E0,$10,$90,$50,$D0,$30,$B0,$70,$F0 | |
116 | dc.b $08,$88,$48,$C8,$28,$A8,$68,$E8,$18,$98,$58,$D8,$38,$B8,$78,$F8 | |
117 | dc.b $04,$84,$44,$C4,$24,$A4,$64,$E4,$14,$94,$54,$D4,$34,$B4,$74,$F4 | |
118 | dc.b $0C,$8C,$4C,$CC,$2C,$AC,$6C,$EC,$1C,$9C,$5C,$DC,$3C,$BC,$7C,$FC | |
119 | dc.b $02,$82,$42,$C2,$22,$A2,$62,$E2,$12,$92,$52,$D2,$32,$B2,$72,$F2 | |
120 | dc.b $0A,$8A,$4A,$CA,$2A,$AA,$6A,$EA,$1A,$9A,$5A,$DA,$3A,$BA,$7A,$FA | |
121 | dc.b $06,$86,$46,$C6,$26,$A6,$66,$E6,$16,$96,$56,$D6,$36,$B6,$76,$F6 | |
122 | dc.b $0E,$8E,$4E,$CE,$2E,$AE,$6E,$EE,$1E,$9E,$5E,$DE,$3E,$BE,$7E,$FE | |
123 | dc.b $01,$81,$41,$C1,$21,$A1,$61,$E1,$11,$91,$51,$D1,$31,$B1,$71,$F1 | |
124 | dc.b $09,$89,$49,$C9,$29,$A9,$69,$E9,$19,$99,$59,$D9,$39,$B9,$79,$F9 | |
125 | dc.b $05,$85,$45,$C5,$25,$A5,$65,$E5,$15,$95,$55,$D5,$35,$B5,$75,$F5 | |
126 | dc.b $0D,$8D,$4D,$CD,$2D,$AD,$6D,$ED,$1D,$9D,$5D,$DD,$3D,$BD,$7D,$FD | |
127 | dc.b $03,$83,$43,$C3,$23,$A3,$63,$E3,$13,$93,$53,$D3,$33,$B3,$73,$F3 | |
128 | dc.b $0B,$8B,$4B,$CB,$2B,$AB,$6B,$EB,$1B,$9B,$5B,$DB,$3B,$BB,$7B,$FB | |
129 | dc.b $07,$87,$47,$C7,$27,$A7,$67,$E7,$17,$97,$57,$D7,$37,$B7,$77,$F7 | |
130 | dc.b $0F,$8F,$4F,$CF,$2F,$AF,$6F,$EF,$1F,$9F,$5F,$DF,$3F,$BF,$7F,$FF | |
131 | ||
132 | ; =========================================================================== |