xref: /netbsd-src/sys/arch/acorn32/stand/lib/riscoscalls.S (revision fd1714100db6fda37051333b19efb01cda93f129)
1/*	$NetBSD: riscoscalls.S,v 1.12 2019/01/23 14:49:00 sborrill 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	ldmdbvs	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	ldmdbvs	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	ldmdbvs	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	ldmdbvs	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(xosmodule_enumeratewithversion)
258	mov	ip, sp
259	stmfd	sp!, {r4-r10, fp, ip, lr, pc}
260	sub	fp, ip, #4
261	mov	r7, r0
262	mov	r8, r1
263	mov	r9, r2
264	mov	r10, r3
265	ldr	r1, [r7]
266	ldr	r2, [r8]
267	mov	r0, #OSModule_EnumerateWithVersion
268	swi	XOS_Module
269	ldmdbvs	fp, {r4-r10, fp, sp, pc}
270	str	r1, [r7]
271	str	r2, [r8]
272	teq	r9, #0
273	strne	r3, [r9]
274	teq	r9, #0
275	strne	r3, [r9]
276	teq	r10, #0
277	strne	r4, [r10]
278	ldr	r10, [fp, #4]
279	teq	r10, #0
280	strne	r5, [r10]
281	ldr	r10, [fp, #8]
282	teq	r10, #0
283	strne	r6, [r10]
284	mov	r0, #0
285	ldmdb	fp, {r4-r10, fp, sp, pc}
286
287ENTRY(xosfscontrol_shutdown)
288	mov	ip, sp
289	stmfd	sp!, {fp, ip, lr, pc}
290	sub	fp, ip, #4
291	mov	r0, #OSFSControl_Shutdown
292	swi	XOS_FSControl
293	movvc	r0, #0
294	ldmdb	fp, {fp, sp, pc}
295
296ENTRY(service_pre_reset)
297	mov	ip, sp
298	stmfd	sp!, {fp, ip, lr, pc}
299	sub	fp, ip, #4
300	mov	r1, #Service_PreReset
301	swi	OS_ServiceCall
302	ldmdb	fp, {fp, sp, pc}
303
304ENTRY(os_read_vdu_variables)
305	mov	ip, sp
306	stmfd	sp!, {fp, ip, lr, pc}
307	sub	fp, ip, #4
308	swi	OS_ReadVduVariables
309	ldmdb	fp, {fp, sp, pc}
310
311ENTRY(xos_swi_number_from_string)
312	mov	ip, sp
313	stmfd	sp!, {fp, ip, lr, pc}
314	sub	fp, ip, #4
315	mov	r2, r1
316	mov	r1, r0
317	swi	XOS_SWINumberFromString
318	ldmdbvs	fp, {fp, sp, pc}
319	str	r0, [r2]
320	mov	r0, #0
321	ldmdb	fp, {fp, sp, pc}
322
323ENTRY(os_read_monotonic_time)
324	mov	ip, sp
325	stmfd	sp!, {fp, ip, lr, pc}
326	sub	fp, ip, #4
327	swi	OS_ReadMonotonicTime
328	ldmdb	fp, {fp, sp, pc}
329
330ENTRY(os_read_mem_map_info)
331	mov	ip, sp
332	stmfd	sp!, {fp, ip, lr, pc}
333	sub	fp, ip, #4
334	mov	r2, r0
335	mov	r3, r1
336	swi	OS_ReadMemMapInfo
337	teq	r2, #0
338	strne	r0, [r2]
339	teq	r3, #0
340	strne	r1, [r3]
341	ldmdb	fp, {fp, sp, pc}
342
343ENTRY(os_readsysinfo)
344	mov	ip, sp
345	stmfd	sp!, {r4-r9, fp, ip, lr, pc}
346	sub	fp, ip, #4
347	mov	r9, r5
348	mov	r8, r4
349	mov	r7, r3
350	mov	r6, r2
351	mov	r5, r1
352	swi	OS_ReadSysInfo
353	teq	r5, #0
354	strne	r0, [r5]
355	teq	r6, #0
356	strne	r1, [r6]
357	teq	r7, #0
358	strne	r2, [r7]
359	ldr	r1, [ip, #0]
360	teq	r1, #0
361	strne	r3, [r1]
362	ldr	r1, [ip, #4]
363	teq	r1, #0
364	strne	r4, [r1]
365	ldmdb	fp, {r4-r9, fp, sp, pc}
366
367ENTRY(os_read_mem_map_entries)
368	mov	ip, sp
369	stmfd	sp!, {fp, ip, lr, pc}
370	sub	fp, ip, #4
371	swi	OS_ReadMemMapEntries
372	ldmdb	fp, {fp, sp, pc}
373
374ENTRY(osmemory_read_arrangement_table_size)
375	mov	ip, sp
376	stmfd	sp!, {r4, fp, ip, lr, pc}
377	sub	fp, ip, #4
378	mov	r3, r0
379	mov	r4, r1
380	mov	r0, #OSMemory_ReadArrangementTableSize
381	swi	OS_Memory
382	cmp	r3, #0
383	strne	r1, [r3]
384	cmp	r4, #0
385	strne	r2, [r4]
386	ldmdb	fp, {r4, fp, sp, pc}
387
388ENTRY(xosmemory_read_arrangement_table_size)
389	mov	ip, sp
390	stmfd	sp!, {r4, fp, ip, lr, pc}
391	sub	fp, ip, #4
392	mov	r3, r0
393	mov	r4, r1
394	mov	r0, #OSMemory_ReadArrangementTableSize
395	swi	XOS_Memory
396	ldmdbvs	fp, {r4, fp, sp, pc}
397	cmp	r3, #0
398	strne	r1, [r3]
399	cmp	r4, #0
400	strne	r2, [r4]
401	mov	r0, #0
402	ldmdb	fp, {r4, fp, sp, pc}
403
404ENTRY(osmemory_read_arrangement_table)
405	mov	ip, sp
406	stmfd	sp!, {fp, ip, lr, pc}
407	sub	fp, ip, #4
408	mov	r1, r0
409	mov	r0, #OSMemory_ReadArrangementTable
410	swi	OS_Memory
411	ldmdb	fp, {fp, sp, pc}
412
413ENTRY(xosmemory_read_arrangement_table)
414	mov	ip, sp
415	stmfd	sp!, {fp, ip, lr, pc}
416	sub	fp, ip, #4
417	mov	r1, r0
418	mov	r0, #OSMemory_ReadArrangementTable
419	swi	XOS_Memory
420	movvc	r0, #0
421	ldmdb	fp, {fp, sp, pc}
422
423ENTRY(osmemory_page_op)
424	mov	ip, sp
425	stmfd	sp!, {fp, ip, lr, pc}
426	sub	fp, ip, #4
427	add	r0, r0, #OSMemory_PageOp
428	swi	OS_Memory
429	ldmdb	fp, {fp, sp, pc}
430
431ENTRY(xcache_control)
432	mov	ip, sp
433	stmfd	sp!, {fp, ip, lr, pc}
434	sub	fp, ip, #4
435	swi	XCache_Control
436	ldmdbvs	fp, {fp, sp, pc}
437	teq	r2, #0
438	strne	r0, [r2]
439	mov	r0, #0
440	ldmdb	fp, {fp, sp, pc}
441
442ENTRY(xfilecorediscop_read_sectors)
443	mov	ip, sp
444	stmfd	sp!, {r4, r8, fp, ip, lr, pc}
445	sub	fp, ip, #4
446	mov	r4, r3
447	mov	r3, r2
448	mov	r2, r1
449	orr	r1, r0, #FileCoreDiscOp_ReadSectors
450	ldr	r8, [fp, #4]
451	swi	XFileCore_DiscOp
452	ldmdbvs	fp, {r4, r8, fp, sp, pc}
453	ldr	r0, [fp, #8]
454	teq	r0, #0
455	strne	r2, [r0]
456	ldr	r0, [fp, #12]
457	teq	r0, #0
458	strne	r3, [r0]
459	ldr	r0, [fp, #16]
460	teq	r0, #0
461	strne	r4, [r0]
462	mov	r0, #0
463	ldmdb	fp, {r4, r8, fp, sp, pc}
464
465ENTRY(xfilecore_drives)
466	mov	ip, sp
467	stmfd	sp!, {r4-r5, r8, fp, ip, lr, pc}
468	sub	fp, ip, #4
469	mov	r5, r3
470	mov	r4, r2
471	mov	r3, r1
472	mov	r8, r0
473	swi	XFileCore_Drives
474	ldmdbvs	fp, {r4-r5, r8, fp, sp, pc}
475	teq	r3, #0
476	strne	r0, [r3]
477	teq	r4, #0
478	strne	r1, [r4]
479	teq	r5, #0
480	strne	r2, [r5]
481	mov	r0, #0
482	ldmdb	fp, {r4-r5, r8, fp, sp, pc}
483
484ENTRY(xfilecoresectorop_read_sectors)
485	mov	ip, sp
486	stmfd	sp!, {r4, r8, fp, ip, lr, pc}
487	sub	fp, ip, #4
488	mov	r4, r3
489	mov	r3, r2
490	mov	r2, r1
491	orr	r1, r0, #FileCoreDiscOp_ReadSectors
492	ldr	r8, [fp, #4]
493	swi	XFileCore_SectorOp
494	ldmdbvs	fp, {r4, r8, fp, sp, pc}
495	ldr	r0, [fp, #8]
496	teq	r0, #0
497	strne	r2, [r0]
498	ldr	r0, [fp, #12]
499	teq	r0, #0
500	strne	r3, [r0]
501	ldr	r0, [fp, #16]
502	teq	r0, #0
503	strne	r4, [r0]
504	mov	r0, #0
505	ldmdb	fp, {r4, r8, fp, sp, pc}
506
507ENTRY(xfilecorediscop64_read_sectors)
508	mov	ip, sp
509	stmfd	sp!, {r4, r5, r8, fp, ip, lr, pc}
510	sub	fp, ip, #4
511	mov	r4, r3
512	mov	r3, r2
513	mov	r2, r1
514	orr	r1, r0, #FileCoreDiscOp_ReadSectors
515	ldr	r5, [fp, #4]
516	ldr	r8, [fp, #8]
517	swi	XFileCore_DiscOp64
518	ldmdbvs	fp, {r4, r5, r8, fp, sp, pc}
519	ldr	r0, [fp, #12]
520	teq	r0, #0
521	strne	r2, [r0]
522	ldr	r0, [fp, #16]
523	teq	r0, #0
524	strne	r3, [r0]
525	ldr	r0, [fp, #20]
526	teq	r0, #0
527	strne	r4, [r0]
528	mov	r0, #0
529	ldmdb	fp, {r4, r5, r8, fp, sp, pc}
530