1 /* $NetBSD: riscoscalls.h,v 1.10 2007/03/04 05:59:07 christos Exp $ */
4 * Copyright (c) 2001 Ben Harris
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 * This file defines the interface for the veneers over RISC OS SWIs used
32 * by libsa. Only those SWIs actually needed by libsa are included. In
33 * general, the interface is based on the one provided by OsLib, though
34 * this implementation is independent.
37 #define OS_WriteC 0x000000
38 #define XOS_WriteC 0x020000
39 #define OS_NewLine 0x000003
40 #define XOS_NewLine 0x020003
41 #define OS_ReadC 0x000004
42 #define XOS_ReadC 0x020004
43 #define OS_CLI 0x000005
44 #define XOS_CLI 0x020005
45 #define OS_Byte 0x000006
46 #define XOS_Byte 0x020006
47 #define OS_Word 0x000007
48 #define XOS_Word 0x020007
49 #define OS_Args 0x000009
50 #define XOS_Args 0x020009
51 #define OS_GBPB 0x00000c
52 #define XOS_GBPB 0x02000c
53 #define OS_Find 0x00000d
54 #define XOS_Find 0x02000d
55 #define OS_GetEnv 0x000010
56 #define XOS_GetEnv 0x020010
57 #define OS_Exit 0x000011
58 #define XOS_Exit 0x020011
59 #define OS_IntOff 0x000014
60 #define XOS_IntOff 0x020014
61 #define OS_EnterOS 0x000016
62 #define XOS_EnterOS 0x020016
63 #define OS_Module 0x00001e
64 #define XOS_Module 0x02001e
65 #define OS_FSControl 0x000029
66 #define XOS_FSControl 0x020029
67 #define OS_ServiceCall 0x000030
68 #define XOS_ServiceCall 0x020030
69 #define OS_ReadVduVariables 0x000031
70 #define XOS_ReadVduVariables 0x020031
71 #define OS_SWINumberFromString 0x000039
72 #define XOS_SWINumberFromString 0x020039
73 #define OS_ReadMonotonicTime 0x000042
74 #define XOS_ReadMonotonicTime 0x020042
75 #define OS_ReadMemMapInfo 0x000051
76 #define XOS_ReadMemMapInfo 0x020051
77 #define OS_ReadMemMapEntries 0x000052
78 #define XOS_ReadMemMapEntries 0x020052
79 #define OS_ReadSysInfo 0x000058
80 #define XOS_ReadSysInfo 0x020058
81 #define OS_Memory 0x000068
82 #define XOS_Memory 0x020068
84 #define Cache_Control 0x000280
85 #define XCache_Control 0x020280
87 #define Wimp_SlotSize 0x0400ec
88 #define XWimp_SlotSize 0x0600ec
90 #define FileCore_DiscOp 0x040540
91 #define XFileCore_DiscOp 0x060540
92 #define FileCore_Drives 0x040542
93 #define XFileCore_Drives 0x060542
94 #define FileCore_SectorOp 0x04054A
95 #define XFileCore_SectorOp 0x06054A
96 #define FileCore_DiscOp64 0x04054E
97 #define XFileCore_DiscOp64 0x06054E
100 #ifndef __ASSEMBLER__
101 typedef struct os_error
{
106 /* Errors talking to the console may as well be fatal. */
108 extern void os_writec(int);
109 extern void os_new_line(void);
110 extern int os_readc(void);
115 #ifndef __ASSEMBLER__
116 extern void os_cli(char *);
117 extern os_error
*xos_cli(char *);
122 #define osbyte_OUTPUT_CURSOR_POSITION 165
123 #define osbyte_VAR_VSYNC_TIMER 176
125 #ifndef __ASSEMBLER__
126 extern void os_byte(int, int, int, int *, int *);
127 extern int osbyte_read(int);
132 #define osword_WRITE_SCREEN_ADDRESS 22
134 #ifndef __ASSEMBLER__
135 extern void os_word(int, char *);
140 #define OSArgs_ReadPtr 0
141 #define OSArgs_SetPtr 1
142 #define OSArgs_ReadExt 2
143 #define OSArgs_SetExt 3
144 #define OSArgs_ReadAllocation 4
145 #define OSArgs_ReadEOFStatus 5
147 #ifndef __ASSEMBLER__
148 extern os_error
*xosargs_read(int, int, int *);
149 extern os_error
*xosargs_set(int, int, int);
151 #define xosargs_read_ptr(f, vp) xosargs_read(OSArgs_ReadPtr, (f), (vp))
152 #define xosargs_set_ptr(f, v) xosargs_set(OSArgs_SetPtr, (f), (v))
153 #define xosargs_read_ext(f, vp) xosargs_read(OSArgs_ReadExt, (f), (vp))
154 #define xosargs_set_ext(f, v) xosargs_set(OSArgs_SetExt, (f), (v))
155 #define xosargs_read_allocation(f, vp) \
156 xosargs_read(OSArgs_ReadAllocation, (f), (vp))
157 #define xosargs_read_eof_status(f, vp) \
158 xosargs_read(OSArgs_ReadEOFStatus, (f), (vp))
163 #define OSGBPB_WriteAt 1
164 #define OSGBPB_Write 2
165 #define OSGBPB_ReadAt 3
166 #define OSGBPB_Read 4
168 #ifndef __ASSEMBLER__
169 extern os_error
*xosgbpb_write(int, char const *, int, int *);
170 extern os_error
*xosgbpb_read(int, char *, int, int *);
175 #define OSFind_Close 0x00
176 #define OSFind_Openin 0x40
177 #define OSFind_Openout 0x80
178 #define OSFind_Openup 0xc0
180 #define osfind_PATH 0x01
181 #define osfind_PATH_VAR 0x02
182 #define osfind_NO_PATH 0x03
183 #define osfind_ERROR_IF_DIR 0x04
184 #define osfind_ERROR_IF_ABSENT 0x08
186 #ifndef __ASSEMBLER__
187 extern os_error
*xosfind_close(int);
188 extern os_error
*xosfind_open(int, char const *, char const *, int *);
193 #define OSReadSysInfo_ReadConfiguredScreenSize 0x00
194 #define OSReadSysInfo_ReadMonitorInfo 0x01
195 #define OSReadSysInfo_ReadChipPresenceAndId 0x02
196 #define OSReadSysInfo_ReadSuperIOFeatures 0x03
197 #define OSReadSysInfo_ReadPlatformClass 0x08
199 #define osreadsysinfo_IOEB_ASIC_PRESENT 0x01
200 #define osreadsysinfo_SUPERIO_PRESENT 0x02
201 #define osreadsysinfo_LCD_ASIC_PRESENT 0x04
203 #define osreadsysinfo_Platform_Unknown 0x00
204 #define osreadsysinfo_Platform_RiscPC 0x01
205 #define osreadsysinfo_Platform_A7000 0x02
206 #define osreadsysinfo_Platform_A7000Plus 0x03
207 #define osreadsysinfo_Platform_Phoebe 0x04
208 #define osreadsysinfo_Platform_Pace 0x05
209 #define osreadsysinfo_Platform_VirtualRPC 0x06
210 #define osreadsysinfo_Platform_A9 0x07
212 #ifndef __ASSEMBLER__
213 extern void os_readsysinfo(int what
, int *r0
, int *r1
, int *r2
, int *r3
, int *r4
);
214 #define os_readsysinfo_configured_screensize(s) \
215 os_readsysinfo(OSReadSysInfo_ReadConfiguredScreenSize, (s), 0, 0, 0, 0)
217 #define os_readsysinfo_monitor_info(mode, type, sync) \
218 os_readsysinfo(OSReadSysInfo_ReadMonitorInfo, (mode), (type), (sync), 0, 0)
220 #define os_readsysinfo_chip_presence(ioeb, superio, lcd) \
221 os_readsysinfo(OSReadSysInfo_ReadChipPresenceAndId, (ioeb), (superio), (lcd), 0, 0)
223 #define os_readsysinfo_unique_id(low, high) \
224 os_readsysinfo(OSReadSysInfo_ReadChipPresenceAndId, 0, 0, 0, (low), (high))
226 #define os_readsysinfo_superio_features(basic, extra) \
227 os_readsysinfo(OSReadSysInfo_ReadSuperIOFeatures, (basic), (extra), 0, 0, 0)
229 #define os_readsysinfo_platform_class(class, flags, feature) \
230 os_readsysinfo(OSReadSysInfo_ReadPlatformClass, (class), (flags), (feature), 0, 0)
236 #define OSMemory_PageOp 0x00
237 #define OSMemory_ReadArrangementTableSize 0x06
238 #define OSMemory_ReadArrangementTable 0x07
239 #define OSMemory_ReadSize 0x08
240 #define OSMemory_ReadController 0x09
242 #define osmemory_GIVEN_PAGE_NO 0x0100
243 #define osmemory_GIVEN_LOG_ADDR 0x0200
244 #define osmemory_GIVEN_PHYS_ADDR 0x0400
245 #define osmemory_RETURN_PAGE_NO 0x0800
246 #define osmemory_RETURN_LOG_ADDR 0x1000
247 #define osmemory_RETURN_PHYS_ADDR 0x2000
249 #define osmemory_TYPE 0xf00
250 #define osmemory_TYPE_SHIFT 8
251 #define osmemory_TYPE_ABSENT 0x0
252 #define osmemory_TYPE_DRAM 0x1
253 #define osmemory_TYPE_VRAM 0x2
254 #define osmemory_TYPE_ROM 0x3
255 #define osmemory_TYPE_IO 0x4
256 /* 5, 6, 7 are undefined */
257 #define osmemory_TYPE_ALLOCATABLE_MASK 0x8 /* bit signaling allocatable */
260 #ifndef __ASSEMBLER__
267 extern void osmemory_read_arrangement_table_size(int *size
, int *nbpp
);
268 extern os_error
*xosmemory_read_arrangement_table_size(int *size
, int *nbpp
);
269 extern void osmemory_read_arrangement_table(unsigned char *block
);
270 extern os_error
*xosmemory_read_arrangement_table(unsigned char *block
);
271 extern void osmemory_page_op(int fromto
, struct page_info
*block
, int num_pages
);
275 #ifndef __ASSEMBLER__
276 extern char *os_get_env(void **, void **);
278 extern void os_exit(os_error
const *, int) __attribute__((noreturn
));
280 extern void os_int_off(void);
282 extern void os_enter_os(void);
285 #define OSModule_Alloc 6
286 #define OSModule_Free 7
287 #define OSModule_Lookup 18
289 #ifndef __ASSEMBLER__
290 extern os_error
*xosmodule_alloc(int, void **);
291 extern os_error
*xosmodule_free(void *);
292 extern os_error
*xosmodule_lookup(char const *, int *, int *, void **, void **,
296 #define OSFSControl_AddFS 12
297 #define OSFSControl_SelectFS 14
298 #define OSFSControl_RemoveFS 16
299 #define OSFSControl_Shutdown 23
301 #define fileswitch_SUPPORTS_SPECIAL (1 << 31)
302 #define fileswitch_INTERACTIVE (1 << 30)
303 #define fileswitch_SUPPORTS_EMPTY_NAMES (1 << 29)
304 #define fileswitch_NEEDS_CREATE (1 << 28)
305 #define fileswitch_NEEDS_FLUSH (1 << 27)
306 #define fileswitch_SUPPORTS_STAMP_NAMED (1 << 26)
307 #define fileswitch_SUPPORTS_FILE_INFO (1 << 25)
308 #define fileswitch_SUPPORTS_SET_CONTEXTS (1 << 24) /* MBZ in RO3 */
309 #define fileswitch_SUPPORTS_IMAGE (1 << 23)
310 #define fileswitch_NEEDS_URD_AND_LIB (1 << 22)
311 #define fileswitch_IMPLICIT_DIRECTORIES (1 << 21)
312 #define fileswitch_NO_LOAD_ENTRY (1 << 20)
313 #define fileswitch_NO_SAVE_ENTRY (1 << 19)
314 #define fileswitch_NO_FILE_ENTRIES (1 << 18)
315 #define fileswitch_HAS_EXTRA_FLAGS (1 << 17)
316 #define fileswitch_READ_ONLY (1 << 16)
318 #define fileswitch_SUPPORTS_DIR_CHANGE (1 << 0)
319 #define fileswitch_NEEDS_CAT (1 << 1)
320 #define fileswitch_NEEDS_EX (1 << 2)
322 #define fileswitch_NOT_FOUND 0
323 #define fileswitch_IS_FILE 1
324 #define fileswitch_IS_DIR 2
325 #define fileswitch_IS_IMAGE 3
327 #define fileswitch_ATTR_OWNER_READ (1 << 0)
328 #define fileswitch_ATTR_OWNER_WRITE (1 << 1)
329 #define fileswitch_ATTR_OWNER_LOCKED (1 << 3)
330 #define fileswitch_ATTR_WORLD_READ (1 << 4)
331 #define fileswitch_ATTR_WORLD_WRITE (1 << 5)
332 #define fileswitch_ATTR_WORLD_LOCKED (1 << 7)
334 #ifndef __ASSEMBLER__
335 struct fileswitch_dirent
{
341 char name
[1]; /* Actually variable length */
344 extern os_error
*xosfscontrol_shutdown(void);
347 #define Service_FSRedeclare 0x40
348 #define Service_PreReset 0x45
350 #ifndef __ASSEMBLER__
351 extern void service_pre_reset(void);
354 #define os_MODEVAR_LOG2_BPP 9
355 #define os_MODEVAR_XWIND_LIMIT 11
356 #define os_MODEVAR_YWIND_LIMIT 12
357 #define os_VDUVAR_DISPLAY_START 149
358 #define os_VDUVAR_TOTAL_SCREEN_SIZE 150
359 #define os_VDUVAR_TCHAR_SPACEY 170
361 #ifndef __ASSEMBLER__
362 extern void os_read_vdu_variables(const int *, int *);
364 extern os_error
*xos_swi_number_from_string(char const *, int *);
366 extern unsigned int os_read_monotonic_time(void);
368 extern void os_read_mem_map_info(int *, int *);
370 struct os_mem_map_request
{
374 #define os_AREA_ACCESS_READ_WRITE 0
375 #define os_AREA_ACCESS_READ_ONLY 1
376 #define os_AREA_ACCESS_NONE 3
379 extern void os_read_mem_map_entries(struct os_mem_map_request
*);
381 extern os_error
xcache_control(u_int
, u_int
, u_int
*);
385 #define FileCoreDiscOp_ReadSectors 1
387 #ifndef __ASSEMBLER__
389 struct filecore_disc
{
390 u_int8_t log2secsize
;
391 u_int8_t secspertrack
;
400 u_int16_t zone_spare
;
406 u_int32_t disc_size_hi
;
409 u_int8_t reserved
[22];
412 struct filecore_daddr64
{
417 extern os_error
*xfilecorediscop_read_sectors(uint32_t, uint32_t, void *,
418 size_t, void *, uint32_t *, void **, size_t *);
419 extern os_error
*xfilecoresectorop_read_sectors(uint32_t, uint32_t, void *,
420 size_t, void *, uint32_t *, void **, size_t *);
421 extern os_error
*xfilecorediscop64_read_sectors(uint32_t,
422 struct filecore_daddr64
*, void *, size_t, struct filecore_disc
const *,
423 void *, uint32_t *, void **, size_t *);
424 extern os_error
*xfilecore_drives(void *, int *, int *, int *);
428 /* RISC OS Error numbers */
430 #define error_IS_ADIR 0xa8
431 #define error_TOO_MANY_OPEN_FILES 0xc0
432 #define error_FILE_NOT_FOUND 0xd6
434 #ifndef __ASSEMBLER__
435 extern int riscos_errno(os_error
*);