Initial revision
[ssr] / StraySrc / Libraries / Steel / s / os
1 ;
2 ; os.s
3 ;
4 ; RISC OS kernel interface
5 ;
6 ; © 1994-1998 Straylight
7 ;
8
9 ;----- Licensing note -------------------------------------------------------
10 ;
11 ; This file is part of Straylight's Steel library.
12 ;
13 ; Steel is free software; you can redistribute it and/or modify
14 ; it under the terms of the GNU General Public License as published by
15 ; the Free Software Foundation; either version 2, or (at your option)
16 ; any later version.
17 ;
18 ; Steel is distributed in the hope that it will be useful,
19 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
20 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 ; GNU General Public License for more details.
22 ;
23 ; You should have received a copy of the GNU General Public License
24 ; along with Steel. If not, write to the Free Software Foundation,
25 ; 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26
27 ;----- Standard stuff -------------------------------------------------------
28
29 GET libs:header
30 GET libs:swis
31
32 ;----- Generic SWI interface ------------------------------------------------
33
34 AREA |C$$Code|,CODE,READONLY
35 GET libs:s.swihack
36
37 ; --- os_swi ---
38 ;
39 ; On entry: a1 == SWI number
40 ; a2 == pointer to register set
41
42 EXPORT os_swi
43
44 os_swi STMFD R13!,{R1,R4-R10,R14} ;Save registers
45 BIC R10,R0,#&20000 ;Strip the X bit
46 LDMIA R1,{R0-R9} ;Load lots of registers
47 MOV R14,PC ;Set return address
48 LDR PC,_swihack ;And call the hacky routine
49 LDR R10,[R13],#4 ;Reload regset pointer
50 STMIA R10,{R0-R9} ;Save output registers
51 LDMFD R13!,{R4-R10,PC}^ ;And return to caller
52
53 LTORG
54
55 ; --- os_swix ---
56 ;
57 ; On entry: a1 == SWI number
58 ; a2 == pointer to register set
59
60 EXPORT os_swix
61
62 os_swix STMFD R13!,{R1,R4-R10,R14} ;Save registers
63 ORR R10,R0,#&20000 ;Set the X bit
64 LDMIA R1,{R0-R9} ;Load lots of registers
65 MOV R14,PC ;Set return address
66 LDR PC,_swihack ;And call the hacky routine
67 LDR R10,[R13],#4 ;Reload regset pointer
68 STMIA R10,{R0-R9} ;Save output registers
69 MOVVC R0,#0 ;Return zero on no error
70 LDMFD R13!,{R4-R10,PC}^ ;And return to caller
71
72 LTORG
73
74 ;----- Fixed-parameter non-returning SWI interfaces -------------------------
75
76 ; --- os_swi0, os_swi1, os_swi2, os_swi3 ---
77 ;
78 ; On entry: a1 == SWI number
79 ; a2,a3,a4 == R0,R1,R2 on entry to SWI
80 ; On exit: a1 == pointer to possible error
81
82 EXPORT os_swi0
83 EXPORT os_swi1
84 EXPORT os_swi2
85 EXPORT os_swi3
86 os_swi0
87 os_swi1
88 os_swi2
89 os_swi3 STMFD R13!,{R4-R10,R14} ;Save registers
90 ORR R10,R0,#&20000 ;Set the X bit
91 MOV R0,R1
92 MOV R1,R2
93 MOV R2,R3
94 MOV R14,PC ;Set return address
95 LDR PC,_swihack ;And call the hacky routine
96 MOVVC R0,#0 ;Return zero on no error
97 LDMFD R13!,{R4-R10,PC}^ ;And return to caller
98
99 LTORG
100
101 ; --- os_swi4, os_swi5, os_swi6 ---
102 ;
103 ; On entry: a1 == SWI number
104 ; a2,a3,a4 == R0,R1,R2 on entry to SWI
105 ; [sp,#0],[sp,#4],[sp,#8] == R3,R4,R5 on entry to SWI
106 ; On exit: a1 == pointer to possible error
107
108 EXPORT os_swi4
109 EXPORT os_swi5
110 EXPORT os_swi6
111 os_swi4
112 os_swi5
113 os_swi6 MOV R12,R12 ;Remember stack position
114 STMFD R13!,{R1,R4-R10,R14} ;Save registers
115 ORR R10,R0,#&20000 ;Set the X bit
116 MOV R0,R1
117 MOV R1,R2
118 MOV R2,R3
119 LDMIA R12,{R3-R5}
120 MOV R14,PC ;Set return address
121 LDR PC,_swihack ;And call the hacky routine
122 MOVVC R0,#0 ;Return zero on no error
123 LDMFD R13!,{R4-R10,PC}^ ;And return to caller
124
125 LTORG
126
127 ;----- Fixed-parameter, returning SWI interfaces ----------------------------
128
129 ; --- os__doSWI ---
130 ;
131 ; CAUTION: NOTHING LIKE APCS
132 ;
133 ; On entry: R0-R5 == SWI registers
134 ; R6-R11 == where to output registers
135 ; R14 == SWI number
136 ; sp points to saved R4-R11 and R14 on stack
137 ; On exit: R0 == pointer to possible error
138
139 os__doSWI ROUT
140
141 STMFD sp!,{R6-R11} ;Save the pointers away
142 ORR R10,R14,#&20000 ;Put in the X bit anyway
143 MOV R14,PC
144 LDR PC,_swihack
145 ADDVS sp,sp,#24 ;Point back at saved regs
146 LDMVSFD sp!,{R4-R11,pc}^ ;If it failed, return now
147
148 ; --- Refind the the pointers and store ---
149
150 LDMFD sp!,{R6-R11} ;Get the output pointers
151 CMP R6,#0
152 STRNE R0,[R6]
153 CMP R7,#0
154 STRNE R1,[R7]
155 CMP R8,#0
156 STRNE R2,[R8]
157 CMP R9,#0
158 STRNE R3,[R9]
159 CMP R10,#0
160 STRNE R4,[R10]
161 CMP R11,#0
162 STRNE R5,[R11]
163
164 ; --- Now return to the caller ---
165
166 MOV R0,#0 ;There was no error
167 LDMFD sp!,{R4-R11,pc}^ ;Return to caller
168
169 LTORG
170
171 ; --- os_swi1r ---
172
173 EXPORT os_swi1r
174 os_swi1r MOV ip,sp
175 STMFD sp!,{R4-R11,lr} ;We corrupt lots of registers
176
177 MOV R14,R0
178
179 MOV R0,R1
180
181 MOV R6,R2
182 MOV R7,#0
183 MOV R8,#0
184 MOV R9,#0
185 MOV R10,#0
186 MOV R11,#0
187
188 B os__doSWI
189
190 ; --- os_swi2r ---
191
192 EXPORT os_swi2r
193 os_swi2r MOV ip,sp
194 STMFD sp!,{R4-R11,lr} ;We corrupt lots of registers
195
196 MOV R14,R0
197
198 MOV R0,R1
199 MOV R1,R2
200
201 MOV R6,R3
202 LDMIA ip!,{R7}
203 MOV R8,#0
204 MOV R9,#0
205 MOV R10,#0
206 MOV R11,#0
207
208 B os__doSWI
209
210 ; --- os_swi3r ---
211
212 EXPORT os_swi3r
213 os_swi3r MOV ip,sp
214 STMFD sp!,{R4-R11,lr} ;We corrupt lots of registers
215
216 MOV R14,R0
217
218 MOV R0,R1
219 MOV R1,R2
220 MOV R2,R3
221
222 LDMIA ip!,{R6-R8}
223 MOV R9,#0
224 MOV R10,#0
225 MOV R11,#0
226
227 B os__doSWI
228
229 ; --- os_swi4r ---
230
231 EXPORT os_swi4r
232 os_swi4r MOV ip,sp
233 STMFD sp!,{R4-R11,lr} ;We corrupt lots of registers
234
235 MOV R14,R0
236
237 MOV R0,R1
238 MOV R1,R2
239 MOV R2,R3
240 LDMIA ip!,{R3}
241
242 LDMIA ip!,{R6-R9}
243 MOV R10,#0
244 MOV R11,#0
245
246 B os__doSWI
247
248 ; --- os_swi5r ---
249
250 EXPORT os_swi5r
251 os_swi5r MOV ip,sp
252 STMFD sp!,{R4-R11,lr} ;We corrupt lots of registers
253
254 MOV R14,R0
255
256 MOV R0,R1
257 MOV R1,R2
258 MOV R2,R3
259 LDMIA ip!,{R3,R4}
260
261 LDMIA ip!,{R6-R10}
262 MOV R11,#0
263
264 B os__doSWI
265
266 ; --- os_swi6r ---
267
268 EXPORT os_swi6r
269 os_swi6r MOV ip,sp
270 STMFD sp!,{R4-R11,lr} ;We corrupt lots of registers
271
272 MOV R14,R0
273
274 MOV R0,R1
275 MOV R1,R2
276 MOV R2,R3
277 LDMIA ip!,{R3-R5}
278
279 LDMIA ip!,{R6-R11}
280
281 B os__doSWI
282
283 ;----- Variable number of registers -----------------------------------------
284
285 ; --- os_swiv ---
286 ;
287 ; On entry: a1 == SWI number
288 ; a2... == registers
289 ; On exit: a1 == pointer to possible to area
290
291 EXPORT os_swiv
292
293 os_swiv MOV R12,R13
294 STMFD R13!,{R4-R10,R14} ;Save registers
295 ORR R10,R0,#&20000 ;Set the X bit
296 MOV R0,R1
297 MOV R1,R2
298 MOV R2,R3
299 LDMIA R12,{R3-R9}
300 MOV R14,PC ;Set return address
301 LDR PC,_swihack ;And call the hacky routine
302 MOVVC R0,#0 ;Return zero on no error
303 LDMFD R13!,{R4-R10,PC}^ ;And return to caller
304
305 LTORG
306
307 ; --- os_swivr ---
308 ;
309 ; On entry: a1 == SWI number
310 ; a2 == pointer to os_regset
311 ; a3... == registers to pass
312 ; On exit: a1 == pointer to possible error
313
314 EXPORT os_swivr
315
316 os_swivr MOV R12,R13
317 STMFD R13!,{R1,R4-R10,R14} ;Save registers
318 ORR R10,R0,#&20000 ;Set the X bit
319 MOV R0,R2
320 MOV R1,R3
321 LDMIA R12,{R2-R9}
322 MOV R14,PC ;Set return address
323 LDR PC,_swihack ;And call the hacky routine
324 LDR R12,[R13],#4 ;Load regset pointer
325 LDMVCIA R12,{R0-R9} ;Save all of them away
326 MOVVC R0,#0 ;Return zero on no error
327 LDMFD R13!,{R4-R10,PC}^ ;And return to caller
328
329 LTORG
330
331 ;----- Veneers to specific routines -----------------------------------------
332
333 ; --- os_byte ---
334 ;
335 ; On entry: a1 == reason code for OS_Byte
336 ; a2 == pointer to x value
337 ; a3 == pointer to y value
338
339 EXPORT os_byte
340 os_byte STMFD sp!,{v1,v2,lr} ;Save registers away
341 MOV v1,a2
342 MOV v2,a3
343 LDR a2,[v1]
344 LDR a3,[v2]
345 SWI XOS_Byte
346 STRVC a2,[v1]
347 STRVC a3,[v2]
348 MOVVC a1,#0
349 LDMFD sp!,{v1,v2,pc}^
350
351 ; --- os_word ---
352 ;
353 ; On entry: a1 == reason code for OS_Word
354 ; a2 == pointer to parameter block
355
356 EXPORT os_word
357 os_word SWI XOS_Word
358 MOVVC a1,#0
359 MOVS pc,lr
360
361 ; --- os_gbpb ---
362 ;
363 ; On entry: a1 == pointer to `reg block'
364
365 EXPORT os_gbpb
366 os_gbpb STMFD sp!,{a1,v1-v6,lr}
367 LDMIA a1,{a1-a4,v1-v6}
368 SWI XOS_GBPB
369 LDR lr,[sp],#4
370 STMVCIA lr,{a1-a4,v1-v6}
371 MOVVC a1,#0
372 LDMFD sp!,{v1-v6,pc}^
373
374 LTORG
375
376 ; --- os_file ---
377 ;
378 ; On entry: a1 == pointer to `reg block'
379
380 EXPORT os_file
381 os_file STMFD sp!,{a1,v1-v6,lr}
382 LDMIA a1,{a1-a4,v1-v6}
383 SWI XOS_File
384 LDR lr,[sp],#4
385 STMVCIA lr,{a1-a4,v1-v6}
386 MOVVC a1,#0
387 LDMFD sp!,{v1-v6,pc}^
388
389 LTORG
390
391 ; --- os_args ---
392 ;
393 ; On entry: a1 == pointer to a real reg block
394
395 EXPORT os_args
396 os_args STMFD sp!,{a1,v1-v6,lr}
397 LDMIA a1,{a1-a4,v1-v6}
398 SWI XOS_Args
399 LDR lr,[sp],#4
400 STMVCIA lr,{a1-a4,v1-v6}
401 MOVVC a1,#0
402 LDMFD sp!,{v1-v6,pc}^
403
404 LTORG
405
406 ; --- os_find ---
407 ;
408 ; On entry: a1 == pointer to a real reg block
409
410 EXPORT os_find
411 os_find STMFD sp!,{a1,v1-v6,lr}
412 LDMIA a1,{a1-a4,v1-v6}
413 SWI XOS_Find
414 LDR lr,[sp],#4
415 STMVCIA lr,{a1-a4,v1-v6}
416 MOVVC a1,#0
417 LDMFD sp!,{v1-v6,pc}^
418
419 LTORG
420
421 ; --- os_cli ---
422 ;
423 ; On entry: a1 == pointer to command string
424
425 EXPORT os_cli
426 os_cli SWI XOS_CLI
427 MOVVC a1,#0
428 MOVS pc,lr
429
430 ; --- os_read_var_val ---
431 ;
432 ; On entry: a1 == pointer to variable name
433 ; a2 == pointer to buffer to store the value
434 ; a3 == size of the buffer
435
436 EXPORT os_read_var_val
437 os_read_var_val STMFD sp!,{v1,lr}
438 MOV a4,#0
439 MOV v1,#3
440 SWI XOS_ReadVarVal
441 MOV v1,#0
442 MOVVS a3,#0
443 STRB v1,[a2,a3]
444 MOVVC a1,#0
445 LDMFD sp!,{v1,pc}^
446
447 ;----- That's all, folks ----------------------------------------------------
448
449 END