| 1 | REM |
| 2 | REM templAOF |
| 3 | REM |
| 4 | REM Mangle template files into an easily extractable form |
| 5 | REM |
| 6 | REM © 1995-1998 Straylight |
| 7 | REM |
| 8 | |
| 9 | REM ----- Licensing note ---------------------------------------------------- |
| 10 | REM |
| 11 | REM This file is part of Straylight's core utilities (coreutils) |
| 12 | REM |
| 13 | REM Coreutils is free software; you can redistribute it and/or modify |
| 14 | REM it under the terms of the GNU General Public License as published by |
| 15 | REM the Free Software Foundation; either version 2, or (at your option) |
| 16 | REM any later version |
| 17 | REM |
| 18 | REM Coreutils is distributed in the hope that it will be useful, |
| 19 | REM but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 20 | REM MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 21 | REM GNU General Public License for more details. |
| 22 | REM |
| 23 | REM You should have received a copy of the GNU General Public License |
| 24 | REM along with Coreutils. If not, write to the Free Software Foundation, |
| 25 | REM 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
| 26 | |
| 27 | ON ERROR ERROR EXT 0,REPORT$+" ["+STR$(ERL)+"]" |
| 28 | |
| 29 | SYS "OS_GetEnv" TO comm$ |
| 30 | IF INSTR(comm$,"-quit")=0 THEN ERROR 1,"templAOF must be started using *Run" |
| 31 | comm$=MID$(comm$,INSTR(comm$,"""")+1) |
| 32 | comm$=MID$(comm$,INSTR(comm$," ")+1) |
| 33 | comm$=LEFT$(comm$,INSTR(comm$,"""")-1) |
| 34 | |
| 35 | tfile$=FNword(comm$) |
| 36 | out$=FNword(comm$) |
| 37 | header$=FNword(comm$) |
| 38 | IF tfile$="" OR out$="" THEN ERROR 0,"Syntax: templAOF <in> <out> [<header>]" |
| 39 | |
| 40 | IF header$<>"" THEN |
| 41 | hdr%=OPENOUT(header$) |
| 42 | BPUT #hdr%,";" |
| 43 | BPUT #hdr%,"; Template symbols [generated by templAOF]" |
| 44 | BPUT #hdr%,";" |
| 45 | BPUT #hdr%,"" |
| 46 | BPUT #hdr%,CHR$(9)+CHR$(9)+"["+CHR$(9)+":LNOT::DEF:tpl__dfn" |
| 47 | BPUT #hdr%,CHR$(9)+CHR$(9)+"GBLL"+CHR$(9)+"tpl__dfn" |
| 48 | BPUT #hdr%,"" |
| 49 | ON ERROR CLOSE #hdr%:ERROR EXT 0,REPORT$+" ["+STR$(ERL)+"]" |
| 50 | ELSE |
| 51 | hdr%=0 |
| 52 | ENDIF |
| 53 | |
| 54 | PROCassemble |
| 55 | |
| 56 | LIBRARY "libs:bas" |
| 57 | PROCbas_init |
| 58 | |
| 59 | SYS "OS_File",17,tfile$ TO ,,,,tsize% |
| 60 | DIM tfile% tsize% |
| 61 | SYS "OS_File",16,tfile$,tfile%,0 |
| 62 | |
| 63 | PROCbas_aofInit(tsize%*5) |
| 64 | FOR pass=4 TO 6 STEP 2 |
| 65 | [ opt pass |
| 66 | FNpass |
| 67 | FNarea("Resources$$Data","CODE,READONLY") |
| 68 | ] |
| 69 | index%=tfile%+16 |
| 70 | WHILE index%!0 |
| 71 | CASE index%!8 OF |
| 72 | WHEN 1 |
| 73 | PROCloadWindow(index%!0+tfile%,index%) |
| 74 | OTHERWISE |
| 75 | IF hdr% THEN CLOSE #hdr% |
| 76 | ERROR 1,"Template type "+STR$(index%!0)+" unrecognised" |
| 77 | ENDCASE |
| 78 | index%+=24 |
| 79 | ENDWHILE |
| 80 | NEXT |
| 81 | |
| 82 | PROCbas_aofSaveAs(out$) |
| 83 | IF hdr% THEN |
| 84 | BPUT #hdr%,"" |
| 85 | BPUT #hdr%,CHR$(9)+CHR$(9)+"]" |
| 86 | BPUT #hdr%,"" |
| 87 | BPUT #hdr%,CHR$(9)+CHR$(9)+"END" |
| 88 | CLOSE #hdr% |
| 89 | SYS "OS_File",1,header$,&FFFFFF3A,&BD896000,,3 |
| 90 | ENDIF |
| 91 | END |
| 92 | |
| 93 | DEF PROCloadWindow(addr%,index%) |
| 94 | name$=FNgetString(index%+12) |
| 95 | |
| 96 | REM --- Build template info block --- |
| 97 | |
| 98 | [ opt pass |
| 99 | .template |
| 100 | ] |
| 101 | |
| 102 | A%=O% |
| 103 | B%=index% |
| 104 | C%=tfile% |
| 105 | l%=USR(tpl_window)-A% |
| 106 | P%+=l% |
| 107 | O%+=l% |
| 108 | |
| 109 | [ opt pass |
| 110 | FNalign |
| 111 | FNexportAs("template","tpl_"+name$) |
| 112 | ] |
| 113 | IF hdr%<>0 AND pass=6 THEN BPUT #hdr%,CHR$(9)+CHR$(9)+"IMPORT"+CHR$(9)+"tpl_"+name$ |
| 114 | ENDPROC |
| 115 | |
| 116 | DEF FNgetString(a%) |
| 117 | LOCAL s$ |
| 118 | WHILE ?a%>=32 |
| 119 | s$+=CHR$(?a%) |
| 120 | a%+=1 |
| 121 | ENDWHILE |
| 122 | =s$ |
| 123 | |
| 124 | DEF FNword(RETURN line$) |
| 125 | LOCAL word$ |
| 126 | IF INSTR(line$," ") THEN |
| 127 | word$=LEFT$(line$,INSTR(line$," ")-1) |
| 128 | line$=MID$(line$,INSTR(line$," ")+1) |
| 129 | ELSE |
| 130 | word$=line$ |
| 131 | line$="" |
| 132 | ENDIF |
| 133 | =word$ |
| 134 | |
| 135 | DEF FNupper(line$) |
| 136 | LOCAL i% |
| 137 | $q%=line$ |
| 138 | FOR i%=0 TO LEN(line$)-1 |
| 139 | IF q%?i%>=97 AND q%?i%<=122 THEN q%?i%-=32 |
| 140 | NEXT |
| 141 | =$q% |
| 142 | |
| 143 | DEF PROCassemble |
| 144 | DIM code% 4096 |
| 145 | FOR o=0 TO 2 STEP 2 |
| 146 | P%=code% |
| 147 | [ opt o |
| 148 | |
| 149 | |
| 150 | ; --- tpl_window --- |
| 151 | ; |
| 152 | ; entry; r0 == output pointer |
| 153 | ; r1 == pointer to index entry |
| 154 | ; r2 == pointer to template file base |
| 155 | ; exit; r0 == new output pointer |
| 156 | |
| 157 | .tpl_window |
| 158 | stmfd r13!,{r14} |
| 159 | add r11,r0,#12 |
| 160 | mov r10,r0 |
| 161 | mov r9,r2 |
| 162 | ldr r14,[r1,#0] |
| 163 | add r8,r9,r14 |
| 164 | |
| 165 | ; --- Build relocation table --- |
| 166 | |
| 167 | mov r14,#64 |
| 168 | orr r14,r14,#1<<28 |
| 169 | str r14,[r11],#4 |
| 170 | |
| 171 | ldr r0,[r8,#56] |
| 172 | add r1,r8,#72 |
| 173 | bl tpl_doReloc |
| 174 | |
| 175 | ldr r7,[r8,#84] |
| 176 | add r6,r8,#88 |
| 177 | |
| 178 | .loop |
| 179 | subs r7,r7,#1 |
| 180 | ldrcs r0,[r6,#16] |
| 181 | addcs r1,r6,#20 |
| 182 | blcs tpl_doReloc |
| 183 | addcs r6,r6,#32 |
| 184 | bcs loop |
| 185 | |
| 186 | ; --- Add in offset entry for window definition --- |
| 187 | |
| 188 | sub r14,r11,r10 |
| 189 | str r14,[r10,#0] |
| 190 | |
| 191 | ; --- Now copy over the window definition --- |
| 192 | |
| 193 | mov r14,r8 |
| 194 | mov r7,#72 |
| 195 | |
| 196 | .loop |
| 197 | subs r7,r7,#16 |
| 198 | ldmcsia r14!,{r0-r3} |
| 199 | stmcsia r11!,{r0-r3} |
| 200 | bcs loop |
| 201 | ldmia r14!,{r0,r1} |
| 202 | stmia r11!,{r0,r1} |
| 203 | |
| 204 | ldr r0,[r8,#56] |
| 205 | add r1,r8,#72 |
| 206 | mov r5,#0 |
| 207 | bl tpl_writeData |
| 208 | |
| 209 | ldr r7,[r8,#84] |
| 210 | str r7,[r11],#4 |
| 211 | add r6,r8,#88 |
| 212 | |
| 213 | .loop |
| 214 | subs r7,r7,#1 |
| 215 | ldmcsia r6,{r0-r3,r14} |
| 216 | stmcsia r11!,{r0-r3,r14} |
| 217 | ldrcs r0,[r6,#16] |
| 218 | addcs r1,r6,#20 |
| 219 | blcs tpl_writeData |
| 220 | addcs r6,r6,#32 |
| 221 | bcs loop |
| 222 | |
| 223 | ; --- Add in offset for this --- |
| 224 | |
| 225 | sub r14,r11,r10 |
| 226 | str r14,[r10,#4] |
| 227 | |
| 228 | ; --- Finally copy over the indirected data --- |
| 229 | |
| 230 | ldr r0,[r8,#56] |
| 231 | add r1,r8,#72 |
| 232 | bl tpl_copyData |
| 233 | |
| 234 | ldr r7,[r8,#84] |
| 235 | add r6,r8,#88 |
| 236 | |
| 237 | .loop |
| 238 | subs r7,r7,#1 |
| 239 | ldrcs r0,[r6,#16] |
| 240 | addcs r1,r6,#20 |
| 241 | blcs tpl_copyData |
| 242 | addcs r6,r6,#32 |
| 243 | bcs loop |
| 244 | |
| 245 | ; --- Put in the last offset and return --- |
| 246 | |
| 247 | sub r14,r11,r10 |
| 248 | str r14,[r10,#8] |
| 249 | |
| 250 | mov r0,r11 |
| 251 | ldmfd r13!,{pc}^ |
| 252 | |
| 253 | |
| 254 | ; --- tpl_doReloc --- |
| 255 | ; |
| 256 | ; entry; r0 == icon flags word |
| 257 | ; r1 == pointer to icon data |
| 258 | ; r8 == base of window definition |
| 259 | ; r11 == output pointer |
| 260 | ; exit; r0-r5 corrupted |
| 261 | |
| 262 | .tpl_doReloc |
| 263 | tst r0,#&100 |
| 264 | moveqs pc,r14 |
| 265 | |
| 266 | stmfd r13!,{r14} |
| 267 | sub r14,r1,r8 |
| 268 | str r14,[r11],#4 |
| 269 | |
| 270 | and r14,r0,#&3 |
| 271 | cmp r14,#&2 |
| 272 | beq tpl_drSprite |
| 273 | |
| 274 | ldr r14,[r1,#4] |
| 275 | cmn r14,#-(-1) |
| 276 | subne r14,r1,r8 |
| 277 | addne r14,r14,#4 |
| 278 | strne r14,[r11],#4 |
| 279 | ldmfd r13!,{pc}^ |
| 280 | |
| 281 | .tpl_drSprite |
| 282 | sub r14,r8,r1 |
| 283 | add r14,r14,#4 |
| 284 | orr r14,r14,#(2<<28) |
| 285 | str r14,[r11],#4 |
| 286 | ldmfd r13!,{pc}^ |
| 287 | |
| 288 | |
| 289 | ; --- tpl_writeData --- |
| 290 | ; |
| 291 | ; entry; r0 == icon flags word |
| 292 | ; r1 == pointer to icon data |
| 293 | ; r5 == indirection offset |
| 294 | ; r8 == base of window definition |
| 295 | ; r11 == output pointer |
| 296 | ; exit; r5 updated |
| 297 | ; r0-r4 corrupted |
| 298 | |
| 299 | .tpl_writeData |
| 300 | tst r0,#&100 |
| 301 | beq tpl_wdNotInd |
| 302 | |
| 303 | stmfd r13!,{r14} |
| 304 | str r5,[r11],#4 |
| 305 | ldr r14,[r1,#8] |
| 306 | add r5,r5,r14 |
| 307 | |
| 308 | and r14,r0,#&3 |
| 309 | cmp r14,#&2 |
| 310 | beq tpl_wdSprite |
| 311 | ldr r14,[r1,#4] |
| 312 | cmn r14,#-(-1) |
| 313 | beq tpl_wdNoValid |
| 314 | |
| 315 | str r5,[r11],#4 |
| 316 | add r2,r8,r14 |
| 317 | |
| 318 | .loop |
| 319 | ldrb r14,[r2],#1 |
| 320 | add r5,r5,#1 |
| 321 | cmp r14,#&20 |
| 322 | bcs loop |
| 323 | |
| 324 | b tpl_wdCont |
| 325 | |
| 326 | .tpl_wdSprite |
| 327 | mov r14,#1 |
| 328 | .tpl_wdNoValid |
| 329 | str r14,[r11],#4 |
| 330 | |
| 331 | .tpl_wdCont |
| 332 | ldr r14,[r1,#8] |
| 333 | str r14,[r11],#4 |
| 334 | |
| 335 | ldmfd r13!,{pc}^ |
| 336 | |
| 337 | .tpl_wdNotInd |
| 338 | ldmia r1,{r0-r2} |
| 339 | stmia r11!,{r0-r2} |
| 340 | movs pc,r14 |
| 341 | |
| 342 | |
| 343 | ; --- tpl_copyData --- |
| 344 | ; |
| 345 | ; entry; r0 == icon flags |
| 346 | ; r1 == pointer to icon data |
| 347 | ; r8 == base of window definition |
| 348 | ; r11 == output pointer |
| 349 | ; exit; r0-r5 corrupted |
| 350 | |
| 351 | .tpl_copyData |
| 352 | tst r0,#&100 |
| 353 | moveqs pc,r14 |
| 354 | |
| 355 | stmfd r13!,{r14} |
| 356 | mov r2,r11 |
| 357 | ldr r14,[r1,#0] |
| 358 | add r3,r8,r14 |
| 359 | |
| 360 | .loop |
| 361 | ldrb r14,[r3],#1 |
| 362 | cmp r14,#&20 |
| 363 | movcc r14,#0 |
| 364 | strb r14,[r2],#1 |
| 365 | bcs loop |
| 366 | |
| 367 | ldr r14,[r1,#8] |
| 368 | add r11,r11,r14 |
| 369 | mov r14,#0 |
| 370 | |
| 371 | .loop |
| 372 | cmp r2,r11 |
| 373 | strccb r14,[r2],#1 |
| 374 | bcc loop |
| 375 | |
| 376 | tst r0,#1 |
| 377 | ldrne r14,[r1,#4] |
| 378 | cmnne r14,#-(-1) |
| 379 | beq tpl_cdSkip |
| 380 | |
| 381 | add r2,r8,r14 |
| 382 | |
| 383 | .loop |
| 384 | ldrb r14,[r2],#1 |
| 385 | cmp r14,#&20 |
| 386 | movcc r14,#0 |
| 387 | strb r14,[r11],#1 |
| 388 | bcs loop |
| 389 | |
| 390 | .tpl_cdSkip |
| 391 | ldmfd r13!,{pc}^ |
| 392 | |
| 393 | ] |
| 394 | NEXT |
| 395 | ENDPROC |
| 396 | |