xref: /netbsd/sys/arch/acorn32/stand/lib/riscoscalls.S (revision 6550d01e)
1/*	$NetBSD: riscoscalls.S,v 1.10 2006/08/19 22:44:58 bjh21 Exp $	*/
2
3/*-
4 * Copyright (c) 2001 Ben Harris
5 * Copyright (c) 2002 Reinoud Zandijk
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 * 3. The name of the author may not be used to endorse or promote products
17 *    derived from this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31#include <machine/asm.h>
32#include <riscoscalls.h>
33
34ENTRY(os_writec)
35	mov	ip, sp
36	stmfd	sp!, {fp, ip, lr, pc}
37	sub	fp, ip, #4
38	swi	OS_WriteC
39	ldmdb	fp, {fp, sp, pc}
40
41ENTRY(os_new_line)
42	mov	ip, sp
43	stmfd	sp!, {fp, ip, lr, pc}
44	sub	fp, ip, #4
45	swi	OS_NewLine
46	ldmdb	fp, {fp, sp, pc}
47
48ENTRY(os_readc)
49	mov	ip, sp
50	stmfd	sp!, {fp, ip, lr, pc}
51	sub	fp, ip, #4
52	swi	OS_ReadC
53	ldmdb	fp, {fp, sp, pc}
54
55ENTRY(os_cli)
56	mov	ip, sp
57	stmfd	sp!, {fp, ip, lr, pc}
58	sub	fp, ip, #4
59	swi	OS_CLI
60	ldmdb	fp, {fp, sp, pc}
61
62ENTRY(xos_cli)
63	mov	ip, sp
64	stmfd	sp!, {fp, ip, lr, pc}
65	sub	fp, ip, #4
66	swi	XOS_CLI
67	movvc	r0, #0
68	ldmdb	fp, {fp, sp, pc}
69
70ENTRY(os_byte)
71	mov	ip, sp
72	stmfd	sp!, {fp, ip, lr, pc}
73	sub	fp, ip, #4
74	swi	OS_Byte
75	teq	r3, #0
76	strne	r1, [r3]
77	ldr	r3, [fp, #4]
78	teq	r3, #0
79	strne	r2, [r3]
80	ldmdb	fp, {fp, sp, pc}
81
82ENTRY(osbyte_read)
83	mov	ip, sp
84	stmfd	sp!, {fp, ip, lr, pc}
85	sub	fp, ip, #4
86	mov	r1, #0
87	mov	r2, #255
88	swi	OS_Byte
89	mov	r0, r1
90	ldmdb	fp, {fp, sp, pc}
91
92ENTRY(os_word)
93	mov	ip, sp
94	stmfd	sp!, {fp, ip, lr, pc}
95	sub	fp, ip, #4
96	swi	OS_Word
97	ldmdb	fp, {fp, sp, pc}
98
99ENTRY(xosargs_read)
100	mov	ip, sp
101	stmfd	sp!, {fp, ip, lr, pc}
102	sub	fp, ip, #4
103	mov	r3, r2
104	swi	XOS_Args
105	ldmvsdb	fp, {fp, sp, pc}
106	teq	r3, #0
107	strne	r2, [r3]
108	mov	r0, #0
109	ldmdb	fp, {fp, sp, pc}
110
111ENTRY(xosargs_set)
112	mov	ip, sp
113	stmfd	sp!, {fp, ip, lr, pc}
114	sub	fp, ip, #4
115	swi	XOS_Args
116	movvc	r0, #0
117	ldmdb	fp, {fp, sp, pc}
118
119ENTRY(xosgbpb_write)
120	mov	ip, sp
121	stmfd	sp!, {r4, fp, ip, lr, pc}
122	sub	fp, ip, #4
123	mov	ip, r3
124	mov	r3, r2
125	mov	r2, r1
126	mov	r1, r0
127	mov	r0, #OSGBPB_Write
128	swi	XOS_GBPB
129	teq	ip, #0
130	strne	r3, [ip]
131	movvc	r0, #0
132	ldmdb	fp, {r4, fp, sp, pc}
133
134ENTRY(xosgbpb_read)
135	mov	ip, sp
136	stmfd	sp!, {r4, fp, ip, lr, pc}
137	sub	fp, ip, #4
138	mov	ip, r3
139	mov	r3, r2
140	mov	r2, r1
141	mov	r1, r0
142	mov	r0, #OSGBPB_Read
143	swi	XOS_GBPB
144	teq	ip, #0
145	strne	r3, [ip]
146	movvc	r0, #0
147	ldmdb	fp, {r4, fp, sp, pc}
148
149ENTRY(xosfind_close)
150	mov	ip, sp
151	stmfd	sp!, {fp, ip, lr, pc}
152	sub	fp, ip, #4
153	mov	r1, r0
154	mov	r0, #OSFind_Close
155	swi	XOS_Find
156	movvc	r0, #0
157	ldmdb	fp, {fp, sp, pc}
158
159ENTRY(xosfind_open)
160	mov	ip, sp
161	stmfd	sp!, {fp, ip, lr, pc}
162	sub	fp, ip, #4
163	swi	XOS_Find
164	ldmvsdb	fp, {fp, sp, pc}
165	teq	r3, #0
166	strne	r0, [r3]
167	mov	r0, #0
168	ldmdb	fp, {fp, sp, pc}
169
170ENTRY(os_get_env)
171	mov	ip, sp
172	stmfd	sp!, {r4, fp, ip, lr, pc}
173	sub	fp, ip, #4
174	mov	r3, r0
175	mov	r4, r1
176	swi	OS_GetEnv
177	teq	r3, #0
178	strne	r1, [r3]
179	teq	r4, #0
180	strne	r2, [r4]
181	ldmdb	fp, {r4, fp, sp, pc}
182
183ENTRY(os_exit)
184	mov	ip, sp
185	stmfd	sp!, {fp, ip, lr, pc}
186	sub	fp, ip, #4
187	mov	r2, r1
188	ldr	r1, Labex
189	swi	OS_Exit
190	ldmdb	fp, {fp, sp, pc}
191Labex:
192	.ascii	"ABEX"
193
194ENTRY(os_int_off)
195	mov	ip, sp
196	stmfd	sp!, {fp, ip, lr, pc}
197	sub	fp, ip, #4
198	swi	OS_IntOff
199	ldmdb	fp, {fp, sp, pc}
200
201ENTRY(os_enter_os)
202	mov	ip, sp
203	stmfd	sp!, {fp, ip, lr, pc}
204	sub	fp, ip, #4
205	swi	OS_EnterOS
206	ldmdb	fp, {fp, sp, pc}
207
208ENTRY(xosmodule_alloc)
209	mov	ip, sp
210	stmfd	sp!, {fp, ip, lr, pc}
211	sub	fp, ip, #4
212	mov	r3, r0
213	mov	r0, #OSModule_Alloc
214	swi	XOS_Module
215	ldmvsdb	fp, {fp, sp, pc}
216	teq	r1, #0
217	strne	r2, [r1]
218	mov	r0, #0
219	ldmdb	fp, {fp, sp, pc}
220
221ENTRY(xosmodule_free)
222	mov	ip, sp
223	stmfd	sp!, {fp, ip, lr, pc}
224	sub	fp, ip, #4
225	mov	r2, r0
226	mov	r0, #OSModule_Free
227	swi	XOS_Module
228	movvc	r0, #0
229	ldmdb	fp, {fp, sp, pc}
230
231ENTRY(xosmodule_lookup)
232	mov	ip, sp
233	stmfd	sp!, {r4-r8, fp, ip, lr, pc}
234	sub	fp, ip, #4
235	mov	r6, r1
236	mov	r7, r2
237	mov	r8, r3
238	mov	r1, r0
239	mov	r0, #OSModule_Lookup
240	swi	XOS_Module
241	ldmvsdb	fp, {r4-r8, fp, sp, pc}
242	teq	r6, #0
243	strne	r1, [r6]
244	teq	r7, #0
245	strne	r2, [r7]
246	teq	r8, #0
247	strne	r3, [r8]
248	ldr	r8, [fp, #4]
249	teq	r8, #0
250	strne	r4, [r8]
251	ldr	r8, [fp, #8]
252	teq	r8, #0
253	strne	r5, [r8]
254	mov	r0, #0
255	ldmdb	fp, {r4-r8, fp, sp, pc}
256
257ENTRY(xosfscontrol_shutdown)
258	mov	ip, sp
259	stmfd	sp!, {fp, ip, lr, pc}
260	sub	fp, ip, #4
261	mov	r0, #OSFSControl_Shutdown
262	swi	XOS_FSControl
263	movvc	r0, #0
264	ldmdb	fp, {fp, sp, pc}
265
266ENTRY(service_pre_reset)
267	mov	ip, sp
268	stmfd	sp!, {fp, ip, lr, pc}
269	sub	fp, ip, #4
270	mov	r1, #Service_PreReset
271	swi	OS_ServiceCall
272	ldmdb	fp, {fp, sp, pc}
273
274ENTRY(os_read_vdu_variables)
275	mov	ip, sp
276	stmfd	sp!, {fp, ip, lr, pc}
277	sub	fp, ip, #4
278	swi	OS_ReadVduVariables
279	ldmdb	fp, {fp, sp, pc}
280
281ENTRY(xos_swi_number_from_string)
282	mov	ip, sp
283	stmfd	sp!, {fp, ip, lr, pc}
284	sub	fp, ip, #4
285	mov	r2, r1
286	mov	r1, r0
287	swi	XOS_SWINumberFromString
288	ldmvsdb	fp, {fp, sp, pc}
289	str	r0, [r2]
290	mov	r0, #0
291	ldmdb	fp, {fp, sp, pc}
292
293ENTRY(os_read_monotonic_time)
294	mov	ip, sp
295	stmfd	sp!, {fp, ip, lr, pc}
296	sub	fp, ip, #4
297	swi	OS_ReadMonotonicTime
298	ldmdb	fp, {fp, sp, pc}
299
300ENTRY(os_read_mem_map_info)
301	mov	ip, sp
302	stmfd	sp!, {fp, ip, lr, pc}
303	sub	fp, ip, #4
304	mov	r2, r0
305	mov	r3, r1
306	swi	OS_ReadMemMapInfo
307	teq	r2, #0
308	strne	r0, [r2]
309	teq	r3, #0
310	strne	r1, [r3]
311	ldmdb	fp, {fp, sp, pc}
312
313ENTRY(os_readsysinfo)
314	mov	ip, sp
315	stmfd	sp!, {r4-r9, fp, ip, lr, pc}
316	sub	fp, ip, #4
317	mov	r9, r5
318	mov	r8, r4
319	mov	r7, r3
320	mov	r6, r2
321	mov	r5, r1
322	swi	OS_ReadSysInfo
323	teq	r5, #0
324	strne	r0, [r5]
325	teq	r6, #0
326	strne	r1, [r6]
327	teq	r7, #0
328	strne	r2, [r7]
329	ldr	r1, [ip, #0]
330	teq	r1, #0
331	strne	r3, [r1]
332	ldr	r1, [ip, #4]
333	teq	r1, #0
334	strne	r4, [r1]
335	ldmdb	fp, {r4-r9, fp, sp, pc}
336
337ENTRY(os_read_mem_map_entries)
338	mov	ip, sp
339	stmfd	sp!, {fp, ip, lr, pc}
340	sub	fp, ip, #4
341	swi	OS_ReadMemMapEntries
342	ldmdb	fp, {fp, sp, pc}
343
344ENTRY(osmemory_read_arrangement_table_size)
345	mov	ip, sp
346	stmfd	sp!, {r4, fp, ip, lr, pc}
347	sub	fp, ip, #4
348	mov	r3, r0
349	mov	r4, r1
350	mov	r0, #OSMemory_ReadArrangementTableSize
351	swi	OS_Memory
352	cmp	r3, #0
353	strne	r1, [r3]
354	cmp	r4, #0
355	strne	r2, [r4]
356	ldmdb	fp, {r4, fp, sp, pc}
357
358ENTRY(xosmemory_read_arrangement_table_size)
359	mov	ip, sp
360	stmfd	sp!, {r4, fp, ip, lr, pc}
361	sub	fp, ip, #4
362	mov	r3, r0
363	mov	r4, r1
364	mov	r0, #OSMemory_ReadArrangementTableSize
365	swi	XOS_Memory
366	ldmvsdb	fp, {r4, fp, sp, pc}
367	cmp	r3, #0
368	strne	r1, [r3]
369	cmp	r4, #0
370	strne	r2, [r4]
371	mov	r0, #0
372	ldmdb	fp, {r4, fp, sp, pc}
373
374ENTRY(osmemory_read_arrangement_table)
375	mov	ip, sp
376	stmfd	sp!, {fp, ip, lr, pc}
377	sub	fp, ip, #4
378	mov	r1, r0
379	mov	r0, #OSMemory_ReadArrangementTable
380	swi	OS_Memory
381	ldmdb	fp, {fp, sp, pc}
382
383ENTRY(xosmemory_read_arrangement_table)
384	mov	ip, sp
385	stmfd	sp!, {fp, ip, lr, pc}
386	sub	fp, ip, #4
387	mov	r1, r0
388	mov	r0, #OSMemory_ReadArrangementTable
389	swi	XOS_Memory
390	movvc	r0, #0
391	ldmdb	fp, {fp, sp, pc}
392
393ENTRY(osmemory_page_op)
394	mov	ip, sp
395	stmfd	sp!, {fp, ip, lr, pc}
396	sub	fp, ip, #4
397	add	r0, r0, #OSMemory_PageOp
398	swi	OS_Memory
399	ldmdb	fp, {fp, sp, pc}
400
401ENTRY(xcache_control)
402	mov	ip, sp
403	stmfd	sp!, {fp, ip, lr, pc}
404	sub	fp, ip, #4
405	swi	XCache_Control
406	ldmvsdb	fp, {fp, sp, pc}
407	teq	r2, #0
408	strne	r0, [r2]
409	mov	r0, #0
410	ldmdb	fp, {fp, sp, pc}
411
412ENTRY(xfilecorediscop_read_sectors)
413	mov	ip, sp
414	stmfd	sp!, {r4, r8, fp, ip, lr, pc}
415	sub	fp, ip, #4
416	mov	r4, r3
417	mov	r3, r2
418	mov	r2, r1
419	orr	r1, r0, #FileCoreDiscOp_ReadSectors
420	ldr	r8, [fp, #4]
421	swi	XFileCore_DiscOp
422	ldmvsdb	fp, {r4, r8, fp, sp, pc}
423	ldr	r0, [fp, #8]
424	teq	r0, #0
425	strne	r2, [r0]
426	ldr	r0, [fp, #12]
427	teq	r0, #0
428	strne	r3, [r0]
429	ldr	r0, [fp, #16]
430	teq	r0, #0
431	strne	r4, [r0]
432	mov	r0, #0
433	ldmdb	fp, {r4, r8, fp, sp, pc}
434
435ENTRY(xfilecore_drives)
436	mov	ip, sp
437	stmfd	sp!, {r4-r5, r8, fp, ip, lr, pc}
438	sub	fp, ip, #4
439	mov	r5, r3
440	mov	r4, r2
441	mov	r3, r1
442	mov	r8, r0
443	swi	XFileCore_Drives
444	ldmvsdb	fp, {r4-r5, r8, fp, sp, pc}
445	teq	r3, #0
446	strne	r0, [r3]
447	teq	r4, #0
448	strne	r1, [r4]
449	teq	r5, #0
450	strne	r2, [r5]
451	mov	r0, #0
452	ldmdb	fp, {r4-r5, r8, fp, sp, pc}
453
454ENTRY(xfilecoresectorop_read_sectors)
455	mov	ip, sp
456	stmfd	sp!, {r4, r8, fp, ip, lr, pc}
457	sub	fp, ip, #4
458	mov	r4, r3
459	mov	r3, r2
460	mov	r2, r1
461	orr	r1, r0, #FileCoreDiscOp_ReadSectors
462	ldr	r8, [fp, #4]
463	swi	XFileCore_SectorOp
464	ldmvsdb	fp, {r4, r8, fp, sp, pc}
465	ldr	r0, [fp, #8]
466	teq	r0, #0
467	strne	r2, [r0]
468	ldr	r0, [fp, #12]
469	teq	r0, #0
470	strne	r3, [r0]
471	ldr	r0, [fp, #16]
472	teq	r0, #0
473	strne	r4, [r0]
474	mov	r0, #0
475	ldmdb	fp, {r4, r8, fp, sp, pc}
476
477ENTRY(xfilecorediscop64_read_sectors)
478	mov	ip, sp
479	stmfd	sp!, {r4, r5, r8, fp, ip, lr, pc}
480	sub	fp, ip, #4
481	mov	r4, r3
482	mov	r3, r2
483	mov	r2, r1
484	orr	r1, r0, #FileCoreDiscOp_ReadSectors
485	ldr	r5, [fp, #4]
486	ldr	r8, [fp, #8]
487	swi	XFileCore_DiscOp64
488	ldmvsdb	fp, {r4, r5, r8, fp, sp, pc}
489	ldr	r0, [fp, #12]
490	teq	r0, #0
491	strne	r2, [r0]
492	ldr	r0, [fp, #16]
493	teq	r0, #0
494	strne	r3, [r0]
495	ldr	r0, [fp, #20]
496	teq	r0, #0
497	strne	r4, [r0]
498	mov	r0, #0
499	ldmdb	fp, {r4, r5, r8, fp, sp, pc}
500