REM REM resGen REM REM Convert resource files into linkable format REM REM © 1995-1998 Straylight REM REM ----- Licensing note ---------------------------------------------------- REM REM This file is part of Straylight's core utilities (coreutils) REM REM Coreutils is free software; you can redistribute it and/or modify REM it under the terms of the GNU General Public License as published by REM the Free Software Foundation; either version 2, or (at your option) REM any later version REM REM Coreutils is distributed in the hope that it will be useful, REM but WITHOUT ANY WARRANTY; without even the implied warranty of REM MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the REM GNU General Public License for more details. REM REM You should have received a copy of the GNU General Public License REM along with Coreutils. If not, write to the Free Software Foundation, REM 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ON ERROR ERROR EXT 0,REPORT$+" ["+STR$(ERL)+"]" DIM q% 1024 SYS "OS_GetEnv" TO comm$ IF INSTR(comm$,"-quit")=0 THEN ERROR 1,"resGen must be started using *Run" comm$=MID$(comm$,INSTR(comm$,"""")+1) comm$=MID$(comm$,INSTR(comm$," ")+1) comm$=LEFT$(comm$,INSTR(comm$,"""")-1) res$=FNword(comm$) out$=FNword(comm$) IF res$="" OR out$="" THEN ERROR 0,"Syntax: resGen " LIBRARY "libs:bas" PROCbas_init PROCassembleAux PROCbas_aofInit(256*1024) FOR pass=4 TO 6 STEP 2 [ opt pass FNpass FNarea("Resources$$Data","CODE,READONLY") ] PROCsprites(res$+".Sprites") PROCmessages(res$+".Messages") PROCtemplates(res$+".Templates") NEXT PROCbas_aofSaveAs(out$) END REM ----- Sprites ----------------------------------------------------------- DEF PROCsprites(spr$) [ opt pass FNexport("rsc_sprites") .rsc_sprites dcd (FNfSize(spr$)+4+3) AND -4 FNbin(spr$) FNalign ] ENDPROC REM ----- Messages ---------------------------------------------------------- DEF PROCmessages(msg$) [ opt pass FNexport("rsc_msgBase") .rsc_msgBase ] A%=O% B%=A%+FNfSize(msg$) SYS "OS_File",16,msg$,A%,0 l%=USR(msgs)-A% O%+=l% P%+=l% [ opt pass dcb 0 FNexport("rsc_msgLimit") .rsc_msgLimit FNalign ] ENDPROC REM ----- Templates --------------------------------------------------------- DEF FNlabel(l$)=EVAL("FNassign("+l$+","+STR$(P%)+")") DEF FNref(l$)=EVAL(l$) DEF FNassign(RETURN x%,y%) x%=y% =0 DEF PROCtemplates(tpl$) IF pass=4 THEN SYS "OS_File",17,tpl$ TO ,,,,tsize% DIM tfile% tsize% SYS "OS_File",16,tpl$,tfile%,0 ENDIF REM --- Build the name table --- [ opt pass FNexport("rsc_tplBase") .rsc_tplBase ] index%=tfile%+16 WHILE index%!0 CASE index%!8 OF WHEN 1 name$=FNgetString(index%+12) [ opt pass dcb name$ dcb 0 FNalign dcd FNref("__"+name$) ] OTHERWISE ERROR 1,"Template type "+STR$(index%!0)+" unrecognised" ENDCASE index%+=24 ENDWHILE [ opt pass FNexport("rsc_tplLimit") .rsc_tplLimit ] REM --- Now write out the window definitions --- B%=tfile%+16 C%=tfile% WHILE B%!0 CASE B%!8 OF WHEN 1 name$=FNgetString(B%+12) [ opt pass FNlabel("__"+name$) ] A%=O% l%=USR(tpl_window)-A% P%+=l% O%+=l% [ opt pass FNalign ] OTHERWISE ERROR 1,"Template type "+STR$(index%!0)+" unrecognised" ENDCASE B%+=24 ENDWHILE ENDPROC REM ----- Other useful functions -------------------------------------------- DEF FNgetString(a%) LOCAL s$ WHILE ?a%>=32 s$+=CHR$(?a%) a%+=1 ENDWHILE =s$ DEF FNword(RETURN line$) LOCAL word$ IF INSTR(line$," ") THEN word$=LEFT$(line$,INSTR(line$," ")-1) line$=MID$(line$,INSTR(line$," ")+1) ELSE word$=line$ line$="" ENDIF =word$ DEF FNupper(line$) LOCAL i% $q%=line$ FOR i%=0 TO LEN(line$)-1 IF q%?i%>=97 AND q%?i%<=122 THEN q%?i%-=32 NEXT =$q% REM ----- Auxiliary assembler bits ------------------------------------------ DEF PROCassembleAux DIM aux% 4096 FOR o=0 TO 2 STEP 2 P%=aux% [ opt o ; --- msgs --- ; ; entry; r0 == pointer to file ; r1 == limit of file ; exit; r0 == new output pointer .msgs stmfd r13!,{r14} mov r2,r0 .msgs_newline cmp r2,r1 bcs msgs_end ldrb r14,[r2],#1 cmp r14,#&21 bcc msgs_newline cmp r14,#ASC(";") cmpne r14,#ASC("#") cmpne r14,#ASC("|") beq msgs_skipline .msgs_writeline cmp r14,#&20 movcc r14,#0 strb r14,[r0],#1 ldrcsb r14,[r2],#1 bcs msgs_writeline b msgs_newline .msgs_skipline ldrb r14,[r2],#1 cmp r14,#&20 bcs msgs_skipline b msgs_newline .msgs_end ldmfd r13!,{pc}^ ; --- tpl_window --- ; ; entry; r0 == output pointer ; r1 == pointer to index entry ; r2 == pointer to template file base ; exit; r0 == new output pointer .tpl_window stmfd r13!,{r14} add r11,r0,#12 mov r10,r0 mov r9,r2 ldr r14,[r1,#0] add r8,r9,r14 ; --- Build relocation table --- mov r14,#64 orr r14,r14,#1<<28 str r14,[r11],#4 ldr r0,[r8,#56] add r1,r8,#72 bl tpl_doReloc ldr r7,[r8,#84] add r6,r8,#88 .loop subs r7,r7,#1 ldrcs r0,[r6,#16] addcs r1,r6,#20 blcs tpl_doReloc addcs r6,r6,#32 bcs loop ; --- Add in offset entry for window definition --- sub r14,r11,r10 str r14,[r10,#0] ; --- Now copy over the window definition --- mov r14,r8 mov r7,#72 .loop subs r7,r7,#16 ldmcsia r14!,{r0-r3} stmcsia r11!,{r0-r3} bcs loop ldmia r14!,{r0,r1} stmia r11!,{r0,r1} ldr r0,[r8,#56] add r1,r8,#72 mov r5,#0 bl tpl_writeData ldr r7,[r8,#84] str r7,[r11],#4 add r6,r8,#88 .loop subs r7,r7,#1 ldmcsia r6,{r0-r3,r14} stmcsia r11!,{r0-r3,r14} ldrcs r0,[r6,#16] addcs r1,r6,#20 blcs tpl_writeData addcs r6,r6,#32 bcs loop ; --- Add in offset for this --- sub r14,r11,r10 str r14,[r10,#4] ; --- Finally copy over the indirected data --- ldr r0,[r8,#56] add r1,r8,#72 bl tpl_copyData ldr r7,[r8,#84] add r6,r8,#88 .loop subs r7,r7,#1 ldrcs r0,[r6,#16] addcs r1,r6,#20 blcs tpl_copyData addcs r6,r6,#32 bcs loop ; --- Put in the last offset and return --- sub r14,r11,r10 str r14,[r10,#8] mov r0,r11 ldmfd r13!,{pc}^ ; --- tpl_doReloc --- ; ; entry; r0 == icon flags word ; r1 == pointer to icon data ; r8 == base of window definition ; r11 == output pointer ; exit; r0-r5 corrupted .tpl_doReloc tst r0,#&100 moveqs pc,r14 stmfd r13!,{r14} sub r14,r1,r8 str r14,[r11],#4 and r14,r0,#&3 cmp r14,#&2 beq tpl_drSprite ldr r14,[r1,#4] cmn r14,#-(-1) subne r14,r1,r8 addne r14,r14,#4 strne r14,[r11],#4 ldmfd r13!,{pc}^ .tpl_drSprite sub r14,r8,r1 add r14,r14,#4 orr r14,r14,#(2<<28) str r14,[r11],#4 ldmfd r13!,{pc}^ ; --- tpl_writeData --- ; ; entry; r0 == icon flags word ; r1 == pointer to icon data ; r5 == indirection offset ; r8 == base of window definition ; r11 == output pointer ; exit; r5 updated ; r0-r4 corrupted .tpl_writeData tst r0,#&100 beq tpl_wdNotInd stmfd r13!,{r14} str r5,[r11],#4 ldr r14,[r1,#8] add r5,r5,r14 and r14,r0,#&3 cmp r14,#&2 beq tpl_wdSprite ldr r14,[r1,#4] cmn r14,#-(-1) beq tpl_wdNoValid str r5,[r11],#4 add r2,r8,r14 .loop ldrb r14,[r2],#1 add r5,r5,#1 cmp r14,#&20 bcs loop b tpl_wdCont .tpl_wdSprite mov r14,#1 .tpl_wdNoValid str r14,[r11],#4 .tpl_wdCont ldr r14,[r1,#8] str r14,[r11],#4 ldmfd r13!,{pc}^ .tpl_wdNotInd ldmia r1,{r0-r2} stmia r11!,{r0-r2} movs pc,r14 ; --- tpl_copyData --- ; ; entry; r0 == icon flags ; r1 == pointer to icon data ; r8 == base of window definition ; r11 == output pointer ; exit; r0-r5 corrupted .tpl_copyData tst r0,#&100 moveqs pc,r14 stmfd r13!,{r14} mov r2,r11 ldr r14,[r1,#0] add r3,r8,r14 .loop ldrb r14,[r3],#1 cmp r14,#&20 movcc r14,#0 strb r14,[r2],#1 bcs loop ldr r14,[r1,#8] add r11,r11,r14 mov r14,#0 .loop cmp r2,r11 strccb r14,[r2],#1 bcc loop tst r0,#1 ldrne r14,[r1,#4] cmnne r14,#-(-1) beq tpl_cdSkip add r2,r8,r14 .loop ldrb r14,[r2],#1 cmp r14,#&20 movcc r14,#0 strb r14,[r11],#1 bcs loop .tpl_cdSkip ldmfd r13!,{pc}^ ] NEXT ENDPROC