urasm: no more built-in functions; all functions are external now
[urasm.git] / libs / deexo.inc
blob24addf2542af4fecc8b236e778b9b81f5f93f4de
1 ;Exomizer 2 Z80 decoder
2 ; by Metalbrain
4 ; compression algorithm by Magnus Lind
6 ;input:
7 ;  hl=compressed data start
8 ;  de=uncompressed destination start
10 ;  you may change exo_mapbasebits to point to any free buffer
12 deexo:
13   ld   a,(hl)
14   inc  hl
15   ld   ixh,a
17   ld   b,52
18   ld   iy,exo_mapbasebits
19   push de
20 exo_initbits:
21   ld   a,b
22   sub  4
23   and  15
24   jr   nz,exo_node1
26   ld   de,1    ;DE=b2
27 exo_node1:
28   ld   c,16
29 exo_get4bits:
30   call exo_getbit
31   rl   c
32   jr   nc,exo_get4bits
33   ld   (iy+0),c  ;bits[i]=b1
35   push hl
36   inc  c
37   ld   hl,0
38   scf
39 exo_setbit:
40   adc  hl,hl
41   dec  c
42   jr   nz,exo_setbit
43   ld   (iy+52),e
44   ld   (iy+104),d  ;base[i]=b2
45   add  hl,de
46   ex   de,hl
47   inc  iy
49   pop  hl
50   djnz exo_initbits
51   pop  de
53 exo_mainloop:
54   ld   c,1   ;lenght=1
55   call exo_getbit  ;literal?
56   jr   c,exo_literalcopy
57   ld   c,255
58 exo_getindex:
59   inc  c
60   call exo_getbit
61   jr   nc,exo_getindex
62   ld   a,c   ;C=index
63   cp   16
64   ret  z
65   jr   c,exo_continue
66   push de
67   ld   d,16
68   call exo_getbits
69   pop  de
70 exo_literalcopy:
71   ldir
72   jr   exo_mainloop
73 exo_continue:
74   push de
75   call exo_getpair
76   push bc
77   pop  af
78   ex   af,af'    ;lenght in AF'
79   ld   de,512+48 ;2 bits, 48 offset
80   dec  bc
81   ld   a,b
82   or   c
83   jr   z,exo_goforit ;1?
84   ld   de,1024+32  ;4 bits, 32 offset
85   dec  bc
86   ld   a,b
87   or   c
88   jr   z,exo_goforit ;2?
89   ld   e,16    ;16 offset
90 exo_goforit:
91   call exo_getbits
92   ld   a,e
93   add  a,c
94   ld   c,a
95   call exo_getpair
96   pop  de    ;bc=offset
97   push hl    ;de=destination
98   ld   h,d
99   ld   l,e
100   sbc  hl,bc   ;hl=origin
101   ex   af,af'  ;af'
102   push af
103   pop  bc    ;bc=lenght
104   ldir
105   pop  hl    ;Keep HL, DE is updated
106   jr   exo_mainloop  ;Next!
108 exo_getpair:
109   ld   iy,exo_mapbasebits
110   ld   b,0
111   add  iy,bc
112   ld   d,(iy+0)
113   call exo_getbits
114   ld   a,c
115   add  a,(iy+52)
116   ld   c,a
117   ld   a,b
118   adc  a,(iy+104)
119   ld   b,a
120   ret
122 exo_getbits:
123   ld   bc,0    ;get D bits in BC
124 exo_gettingbits:
125   dec  d
126   ret  m
127   call exo_getbit
128   rl   c
129   rl   b
130   jr   exo_gettingbits
132 exo_getbit:
133   ld   a,ixh   ;get one bit
134   srl  a
135   ld   ixh,a
136   ret  nz
137   ld   a,(hl)
138   inc  hl
139   rra
140   ld   ixh,a
141   ret
143 exo_mapbasebits_size equ 156
144 ;exo_mapbasebits:
145 ;  defs  156 ;tables for bits, baseL, baseH