View difference between Paste ID: UNt6WE1K and EtYf1vz6
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
; ===========================================================================