Pac2Pic

10 rem Convert a compressed PAC file to PIC
11 rem Modes 0/4, 8, 16, 32, 33, 64
12 :
13 rem Invoke with:
14 :
15 rem er = FEW('<path>Pac2Pic_bas'; '<path>mypic_pac')
16 :
17 rem to convert <path>mypic_pac to <path>mypic_pic
18 :
19 fnm$ = CMD$
20 :
21 l% = LEN(fnm$)
22 IF l% < 10: QUIT -12
23 IF NOT (fnm$(l% - 2 TO l%) == 'pac'): QUIT -19
24 out$ = fnm$(1 TO l% - 3) & 'pic'
25 :
26 er = Pac2Pic(fnm$, out$, 0)
27 BEEP 2000, 2
28 QUIT er
29 :
30 :
100 rem + ------------------------------------------------------------------------ +
102 rem |<                                Pac2Pic                                 >|
104 rem + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +
106 rem |               Convert an RLE compressed PAC file to PIC                  |
108 rem |                                                                          |
110 rem | overw - 1 => unconditional overwrite, 0 => error if file already exists! |
112 rem |                                                                          |
114 rem | Dependencies: DERLE - external toolkit command                           |
116 rem | SMSQ/E due to POKE_X adr, multiple, and inline $hex                      |
118 rem + ------------------------------------------------------------------------ +
120 rem | V0.01, pjw, 2020 May 21                                                  |
122 rem + ------------------------------------------------------------------------ +
124 :
126 DEFine FuNction Pac2Pic(pac$, pic$, overw)
128 LOCal ch, pac, pic, fl, sz, csz, md%, rle%
130 :
132 ch = FOP_IN(pac$): IF ch < 0: RETurn ch
134 fl = FLEN(#ch): CLOSE#ch
136 IF fl < 18: RETurn -15:                 rem Cant be a PAC
138 pac = ALCHP(fl): IF pac <= 0: RETurn -3
140 LBYTES pac$, pac
142 :
144 rem     Basic format check
146 rle = PEEK_L(pac +  0)
148 f%  = PEEK_W(pac +  4)
150 rle = rle - $524C4530:                  rem "RLE0"
152 IF NOT rle INSTR '124' OR f% <> $4AFC: RECHP pac: RETurn -12
154 :
156 rem     PIC header
158 x% = PEEK_W(pac +  6)
160 y% = PEEK_W(pac +  8)
162 l% = PEEK_W(pac + 10)
164 m% = PEEK_W(pac + 12)
166 :
168 rem     Decompress
170 sz = 10 + y% * l%
172 pic = ALCHP(sz): IF pic <= 0: RECHP pac: RETurn -4
174 DERLE pac + 14, pic + 10, sz - 10, rle
176 POKE_W pic, f%, x%, y%, l%, m%
178 :
180 rem     Save
182 IF overw THEN
184  SBYTES_O pic$, pic, sz
186  sz = 0
188 ELSE
190  ch = FOPEN(pic$)
192  IF ch = -7 THEN
194   SBYTES pic$, pic, sz
196   sz = 0
198  ELSE
200   IF ch < 0: sz = ch: ELSE : CLOSE#ch: sz = -8
202  END IF
204 END IF
206 :
208 rem     Release memory LIFO
210 RECHP pic
212 RECHP pac
214 RETurn sz:              rem sz re-purposed as error code
216 END DEFine Pac2Pic
218 :
220 :

  
Generated with sb2htm on 2020 Dec 14
©pjwitte March 2oi9