Create readable text `.bas' for each tokenized BASIC `,ffb' file.
[ssr] / StraySrc / Utilities / b / resgen.bas
CommitLineData
c1b567d8
MW
1REM
2REM resGen
3REM
4REM Convert resource files into linkable format
5REM
6REM © 1995-1998 Straylight
7REM
8
9REM ----- Licensing note ----------------------------------------------------
10REM
11REM This file is part of Straylight's core utilities (coreutils)
12REM
13REM Coreutils is free software; you can redistribute it and/or modify
14REM it under the terms of the GNU General Public License as published by
15REM the Free Software Foundation; either version 2, or (at your option)
16REM any later version
17REM
18REM Coreutils is distributed in the hope that it will be useful,
19REM but WITHOUT ANY WARRANTY; without even the implied warranty of
20REM MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21REM GNU General Public License for more details.
22REM
23REM You should have received a copy of the GNU General Public License
24REM along with Coreutils. If not, write to the Free Software Foundation,
25REM 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26
27ON ERROR ERROR EXT 0,REPORT$+" ["+STR$(ERL)+"]"
28
29DIM q% 1024
30
31SYS "OS_GetEnv" TO comm$
32IF INSTR(comm$,"-quit")=0 THEN ERROR 1,"resGen must be started using *Run"
33comm$=MID$(comm$,INSTR(comm$,"""")+1)
34comm$=MID$(comm$,INSTR(comm$," ")+1)
35comm$=LEFT$(comm$,INSTR(comm$,"""")-1)
36
37res$=FNword(comm$)
38out$=FNword(comm$)
39IF res$="" OR out$="" THEN ERROR 0,"Syntax: resGen <resDir> <aofFile>"
40
41LIBRARY "libs:bas"
42PROCbas_init
43
44PROCassembleAux
45
46PROCbas_aofInit(256*1024)
47FOR pass=4 TO 6 STEP 2
48[ opt pass
49 FNpass
50 FNarea("Resources$$Data","CODE,READONLY")
51]
52
53PROCsprites(res$+".Sprites")
54PROCmessages(res$+".Messages")
55PROCtemplates(res$+".Templates")
56
57NEXT
58PROCbas_aofSaveAs(out$)
59END
60
61REM ----- Sprites -----------------------------------------------------------
62
63DEF PROCsprites(spr$)
64[ opt pass
65 FNexport("rsc_sprites")
66.rsc_sprites
67 dcd (FNfSize(spr$)+4+3) AND -4
68 FNbin(spr$)
69 FNalign
70]
71ENDPROC
72
73REM ----- Messages ----------------------------------------------------------
74
75DEF PROCmessages(msg$)
76[ opt pass
77 FNexport("rsc_msgBase")
78.rsc_msgBase
79]
80A%=O%
81B%=A%+FNfSize(msg$)
82SYS "OS_File",16,msg$,A%,0
83l%=USR(msgs)-A%
84O%+=l%
85P%+=l%
86[ opt pass
87 dcb 0
88 FNexport("rsc_msgLimit")
89.rsc_msgLimit
90 FNalign
91]
92ENDPROC
93
94REM ----- Templates ---------------------------------------------------------
95
96DEF FNlabel(l$)=EVAL("FNassign("+l$+","+STR$(P%)+")")
97DEF FNref(l$)=EVAL(l$)
98DEF FNassign(RETURN x%,y%)
99x%=y%
100=0
101
102DEF PROCtemplates(tpl$)
103IF pass=4 THEN
104 SYS "OS_File",17,tpl$ TO ,,,,tsize%
105 DIM tfile% tsize%
106 SYS "OS_File",16,tpl$,tfile%,0
107ENDIF
108
109REM --- Build the name table ---
110
111[ opt pass
112 FNexport("rsc_tplBase")
113.rsc_tplBase
114]
115
116index%=tfile%+16
117WHILE index%!0
118 CASE index%!8 OF
119 WHEN 1
120 name$=FNgetString(index%+12)
121 [ opt pass
122 dcb name$
123 dcb 0
124 FNalign
125 dcd FNref("__"+name$)
126 ]
127 OTHERWISE
128 ERROR 1,"Template type "+STR$(index%!0)+" unrecognised"
129 ENDCASE
130 index%+=24
131ENDWHILE
132
133[ opt pass
134 FNexport("rsc_tplLimit")
135.rsc_tplLimit
136]
137
138REM --- Now write out the window definitions ---
139
140B%=tfile%+16
141C%=tfile%
142WHILE B%!0
143 CASE B%!8 OF
144 WHEN 1
145 name$=FNgetString(B%+12)
146 [ opt pass
147 FNlabel("__"+name$)
148 ]
149 A%=O%
150 l%=USR(tpl_window)-A%
151 P%+=l%
152 O%+=l%
153 [ opt pass
154 FNalign
155 ]
156 OTHERWISE
157 ERROR 1,"Template type "+STR$(index%!0)+" unrecognised"
158 ENDCASE
159 B%+=24
160ENDWHILE
161ENDPROC
162
163REM ----- Other useful functions --------------------------------------------
164
165DEF FNgetString(a%)
166LOCAL s$
167WHILE ?a%>=32
168 s$+=CHR$(?a%)
169 a%+=1
170ENDWHILE
171=s$
172
173DEF FNword(RETURN line$)
174LOCAL word$
175IF INSTR(line$," ") THEN
176 word$=LEFT$(line$,INSTR(line$," ")-1)
177 line$=MID$(line$,INSTR(line$," ")+1)
178ELSE
179 word$=line$
180 line$=""
181ENDIF
182=word$
183
184DEF FNupper(line$)
185LOCAL i%
186$q%=line$
187FOR i%=0 TO LEN(line$)-1
188 IF q%?i%>=97 AND q%?i%<=122 THEN q%?i%-=32
189NEXT
190=$q%
191
192REM ----- Auxiliary assembler bits ------------------------------------------
193
194DEF PROCassembleAux
195DIM aux% 4096
196FOR o=0 TO 2 STEP 2
197P%=aux%
198[ opt o
199
200; --- msgs ---
201;
202; entry; r0 == pointer to file
203; r1 == limit of file
204; exit; r0 == new output pointer
205
206.msgs
207 stmfd r13!,{r14}
208 mov r2,r0
209
210.msgs_newline
211 cmp r2,r1
212 bcs msgs_end
213 ldrb r14,[r2],#1
214 cmp r14,#&21
215 bcc msgs_newline
216
217 cmp r14,#ASC(";")
218 cmpne r14,#ASC("#")
219 cmpne r14,#ASC("|")
220 beq msgs_skipline
221
222.msgs_writeline
223 cmp r14,#&20
224 movcc r14,#0
225 strb r14,[r0],#1
226 ldrcsb r14,[r2],#1
227 bcs msgs_writeline
228
229 b msgs_newline
230
231.msgs_skipline
232 ldrb r14,[r2],#1
233 cmp r14,#&20
234 bcs msgs_skipline
235
236 b msgs_newline
237
238.msgs_end
239 ldmfd r13!,{pc}^
240
241
242; --- tpl_window ---
243;
244; entry; r0 == output pointer
245; r1 == pointer to index entry
246; r2 == pointer to template file base
247; exit; r0 == new output pointer
248
249.tpl_window
250 stmfd r13!,{r14}
251 add r11,r0,#12
252 mov r10,r0
253 mov r9,r2
254 ldr r14,[r1,#0]
255 add r8,r9,r14
256
257 ; --- Build relocation table ---
258
259 mov r14,#64
260 orr r14,r14,#1<<28
261 str r14,[r11],#4
262
263 ldr r0,[r8,#56]
264 add r1,r8,#72
265 bl tpl_doReloc
266
267 ldr r7,[r8,#84]
268 add r6,r8,#88
269
270.loop
271 subs r7,r7,#1
272 ldrcs r0,[r6,#16]
273 addcs r1,r6,#20
274 blcs tpl_doReloc
275 addcs r6,r6,#32
276 bcs loop
277
278 ; --- Add in offset entry for window definition ---
279
280 sub r14,r11,r10
281 str r14,[r10,#0]
282
283 ; --- Now copy over the window definition ---
284
285 mov r14,r8
286 mov r7,#72
287
288.loop
289 subs r7,r7,#16
290 ldmcsia r14!,{r0-r3}
291 stmcsia r11!,{r0-r3}
292 bcs loop
293 ldmia r14!,{r0,r1}
294 stmia r11!,{r0,r1}
295
296 ldr r0,[r8,#56]
297 add r1,r8,#72
298 mov r5,#0
299 bl tpl_writeData
300
301 ldr r7,[r8,#84]
302 str r7,[r11],#4
303 add r6,r8,#88
304
305.loop
306 subs r7,r7,#1
307 ldmcsia r6,{r0-r3,r14}
308 stmcsia r11!,{r0-r3,r14}
309 ldrcs r0,[r6,#16]
310 addcs r1,r6,#20
311 blcs tpl_writeData
312 addcs r6,r6,#32
313 bcs loop
314
315 ; --- Add in offset for this ---
316
317 sub r14,r11,r10
318 str r14,[r10,#4]
319
320 ; --- Finally copy over the indirected data ---
321
322 ldr r0,[r8,#56]
323 add r1,r8,#72
324 bl tpl_copyData
325
326 ldr r7,[r8,#84]
327 add r6,r8,#88
328
329.loop
330 subs r7,r7,#1
331 ldrcs r0,[r6,#16]
332 addcs r1,r6,#20
333 blcs tpl_copyData
334 addcs r6,r6,#32
335 bcs loop
336
337 ; --- Put in the last offset and return ---
338
339 sub r14,r11,r10
340 str r14,[r10,#8]
341
342 mov r0,r11
343 ldmfd r13!,{pc}^
344
345
346; --- tpl_doReloc ---
347;
348; entry; r0 == icon flags word
349; r1 == pointer to icon data
350; r8 == base of window definition
351; r11 == output pointer
352; exit; r0-r5 corrupted
353
354.tpl_doReloc
355 tst r0,#&100
356 moveqs pc,r14
357
358 stmfd r13!,{r14}
359 sub r14,r1,r8
360 str r14,[r11],#4
361
362 and r14,r0,#&3
363 cmp r14,#&2
364 beq tpl_drSprite
365
366 ldr r14,[r1,#4]
367 cmn r14,#-(-1)
368 subne r14,r1,r8
369 addne r14,r14,#4
370 strne r14,[r11],#4
371 ldmfd r13!,{pc}^
372
373.tpl_drSprite
374 sub r14,r8,r1
375 add r14,r14,#4
376 orr r14,r14,#(2<<28)
377 str r14,[r11],#4
378 ldmfd r13!,{pc}^
379
380
381; --- tpl_writeData ---
382;
383; entry; r0 == icon flags word
384; r1 == pointer to icon data
385; r5 == indirection offset
386; r8 == base of window definition
387; r11 == output pointer
388; exit; r5 updated
389; r0-r4 corrupted
390
391.tpl_writeData
392 tst r0,#&100
393 beq tpl_wdNotInd
394
395 stmfd r13!,{r14}
396 str r5,[r11],#4
397 ldr r14,[r1,#8]
398 add r5,r5,r14
399
400 and r14,r0,#&3
401 cmp r14,#&2
402 beq tpl_wdSprite
403 ldr r14,[r1,#4]
404 cmn r14,#-(-1)
405 beq tpl_wdNoValid
406
407 str r5,[r11],#4
408 add r2,r8,r14
409
410.loop
411 ldrb r14,[r2],#1
412 add r5,r5,#1
413 cmp r14,#&20
414 bcs loop
415
416 b tpl_wdCont
417
418.tpl_wdSprite
419 mov r14,#1
420.tpl_wdNoValid
421 str r14,[r11],#4
422
423.tpl_wdCont
424 ldr r14,[r1,#8]
425 str r14,[r11],#4
426
427 ldmfd r13!,{pc}^
428
429.tpl_wdNotInd
430 ldmia r1,{r0-r2}
431 stmia r11!,{r0-r2}
432 movs pc,r14
433
434
435; --- tpl_copyData ---
436;
437; entry; r0 == icon flags
438; r1 == pointer to icon data
439; r8 == base of window definition
440; r11 == output pointer
441; exit; r0-r5 corrupted
442
443.tpl_copyData
444 tst r0,#&100
445 moveqs pc,r14
446
447 stmfd r13!,{r14}
448 mov r2,r11
449 ldr r14,[r1,#0]
450 add r3,r8,r14
451
452.loop
453 ldrb r14,[r3],#1
454 cmp r14,#&20
455 movcc r14,#0
456 strb r14,[r2],#1
457 bcs loop
458
459 ldr r14,[r1,#8]
460 add r11,r11,r14
461 mov r14,#0
462
463.loop
464 cmp r2,r11
465 strccb r14,[r2],#1
466 bcc loop
467
468 tst r0,#1
469 ldrne r14,[r1,#4]
470 cmnne r14,#-(-1)
471 beq tpl_cdSkip
472
473 add r2,r8,r14
474
475.loop
476 ldrb r14,[r2],#1
477 cmp r14,#&20
478 movcc r14,#0
479 strb r14,[r11],#1
480 bcs loop
481
482.tpl_cdSkip
483 ldmfd r13!,{pc}^
484
485]
486NEXT
487ENDPROC