Create readable text `.bas' for each tokenized BASIC `,ffb' file.
[ssr] / StraySrc / Utilities / b / buildstub.bas
1 REM
2 REM SapphStub
3 REM
4 REM Build Sapphire extension stub entries
5 REM
6 REM © 1994-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 REM --- Parse arguments ---
28
29 ON ERROR ERROR EXT 0,REPORT$+"["+STR$(ERL)+"]"
30 PROCinit
31 PROCparse(FNreadCommandLine)
32 END
33
34 DEF PROCinit
35 DIM q% 256
36 LIBRARY "libs:bas"
37 PROCbas_init
38 ENDPROC
39
40 REM --- Read a command line ---
41
42 DEF FNreadCommandLine
43 LOCAL comm$
44 SYS "OS_GetEnv" TO comm$
45 IF INSTR(comm$,"-quit")=0 THEN ERROR 1,"SapphStub must be started using *Run"
46 comm$=MID$(comm$,INSTR(comm$,"""")+1)
47 comm$=MID$(comm$,INSTR(comm$," ")+1)
48 comm$=LEFT$(comm$,INSTR(comm$,"""")-1)
49 =comm$
50
51 REM --- Remove a word from a command line ---
52
53 DEF FNword(RETURN line$)
54 LOCAL word$
55 IF INSTR(line$," ") THEN
56 word$=LEFT$(line$,INSTR(line$," ")-1)
57 line$=MID$(line$,INSTR(line$," ")+1)
58 ELSE
59 word$=line$
60 line$=""
61 ENDIF
62 =word$
63
64 REM --- Convert a string to upper case ---
65
66 DEF FNupper(line$)
67 LOCAL i%
68 $q%=line$
69 FOR i%=0 TO LEN(line$)-1
70 IF q%?i%>=97 AND q%?i%<=122 THEN q%?i%-=32
71 NEXT
72 =$q%
73
74 REM --- Do the command line parsing ---
75
76 DEF PROCparse(line$)
77 LOCAL libfn$,stub$,lib$,off%,helped%,word$
78 REPEAT
79 word$=FNword(line$)
80 CASE FNupper(word$) OF
81 WHEN "-HELP"
82 PROCshowHelp
83 helped%=TRUE
84 WHEN "-LIBFN"
85 libfn$=FNword(line$)
86 WHEN "-LIB"
87 lib$=FNword(line$)
88 WHEN "-STUB"
89 stub$=FNword(line$)
90 WHEN "-OFFSET"
91 off%=VAL(FNword(line$))
92 OTHERWISE
93 CASE TRUE OF
94 WHEN lib$=""
95 lib$=word$
96 WHEN stub$=""
97 stub$=word$
98 WHEN libfn$=""
99 libfn$=word$
100 WHEN off%=0
101 off%=VAL(word$)
102 ENDCASE
103 ENDCASE
104 UNTIL line$=""
105 IF helped% THEN END
106 IF libfn$="" OR lib$="" OR stub$="" THEN ERROR 0,"Bad arguments"
107 PROCbuild(lib$,stub$,libfn$,off%)
108 ENDPROC
109
110 DEF PROCbuild(lib$,stub$,libfn$,off%)
111
112 REM --- Build library section ---
113
114 zero=0
115
116 PROCbas_aofInit(&1000)
117 FOR o=4 TO 6 STEP 2
118 [ opt o
119 FNpass
120
121 FNimportAs("Sapphire$$LibData$$Base","sapph_base")
122 FNimportAs("Sapphire$$LibData$$Limit","sapph_limit")
123
124 FNarea("!Stub$$Code","CODE,READONLY")
125
126 FNexportAs("stubfn",libfn$)
127 .stubfn
128 adr r0,stubBlock
129 ldmia r0,{r0-2}
130 movs pc,r14
131
132 .stubBlock
133 dcd sapph_base
134 dcd sapph_limit
135 dcd off%
136
137 FNexportAs("zero","sapphire_init")
138 FNexportAs("zero","sapphire_libInit")
139 FNexportAs("zero","sapphire_disable")
140 ]
141 offDiff%=off%-4
142 [ opt o
143 FNexportAs("offDiff%","__sph_workoff")
144 ]
145 NEXT
146 PROCbas_aofSaveAs(lib$)
147
148 REM --- Build stub section ---
149
150 PROCbas_aofInit(0)
151 FOR o=4 TO 6 STEP 2
152 [ opt o
153 FNpass
154
155 FNimportAs(libfn$,"stubfn")
156
157 FNarea("Sapphire$$ExtTable","CODE,READONLY")
158
159 dcd stubfn
160 ]
161 NEXT
162 PROCbas_aofSaveAs(stub$)
163
164 ENDPROC