/* $NetBSD: riscoscalls.h,v 1.13 2019/01/23 14:49:00 sborrill Exp $ */ /*- * Copyright (c) 2001 Ben Harris * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * This file defines the interface for the veneers over RISC OS SWIs used * by libsa. Only those SWIs actually needed by libsa are included. In * general, the interface is based on the one provided by OsLib, though * this implementation is independent. */ #define OS_WriteC 0x000000 #define XOS_WriteC 0x020000 #define OS_NewLine 0x000003 #define XOS_NewLine 0x020003 #define OS_ReadC 0x000004 #define XOS_ReadC 0x020004 #define OS_CLI 0x000005 #define XOS_CLI 0x020005 #define OS_Byte 0x000006 #define XOS_Byte 0x020006 #define OS_Word 0x000007 #define XOS_Word 0x020007 #define OS_Args 0x000009 #define XOS_Args 0x020009 #define OS_GBPB 0x00000c #define XOS_GBPB 0x02000c #define OS_Find 0x00000d #define XOS_Find 0x02000d #define OS_GetEnv 0x000010 #define XOS_GetEnv 0x020010 #define OS_Exit 0x000011 #define XOS_Exit 0x020011 #define OS_IntOff 0x000014 #define XOS_IntOff 0x020014 #define OS_EnterOS 0x000016 #define XOS_EnterOS 0x020016 #define OS_Module 0x00001e #define XOS_Module 0x02001e #define OS_FSControl 0x000029 #define XOS_FSControl 0x020029 #define OS_ServiceCall 0x000030 #define XOS_ServiceCall 0x020030 #define OS_ReadVduVariables 0x000031 #define XOS_ReadVduVariables 0x020031 #define OS_SWINumberFromString 0x000039 #define XOS_SWINumberFromString 0x020039 #define OS_ReadMonotonicTime 0x000042 #define XOS_ReadMonotonicTime 0x020042 #define OS_ReadMemMapInfo 0x000051 #define XOS_ReadMemMapInfo 0x020051 #define OS_ReadMemMapEntries 0x000052 #define XOS_ReadMemMapEntries 0x020052 #define OS_ReadSysInfo 0x000058 #define XOS_ReadSysInfo 0x020058 #define OS_Memory 0x000068 #define XOS_Memory 0x020068 #define Cache_Control 0x000280 #define XCache_Control 0x020280 #define Wimp_SlotSize 0x0400ec #define XWimp_SlotSize 0x0600ec #define FileCore_DiscOp 0x040540 #define XFileCore_DiscOp 0x060540 #define FileCore_Drives 0x040542 #define XFileCore_Drives 0x060542 #define FileCore_SectorOp 0x04054A #define XFileCore_SectorOp 0x06054A #define FileCore_DiscOp64 0x04054E #define XFileCore_DiscOp64 0x06054E #ifndef __ASSEMBLER__ typedef struct os_error { uint32_t errnum; char errmess[252]; } os_error; /* Errors talking to the console may as well be fatal. */ extern void os_writec(int); extern void os_new_line(void); extern int os_readc(void); #endif /* OS_CLI */ #ifndef __ASSEMBLER__ extern void os_cli(char *); extern os_error *xos_cli(char *); #endif /* OS_Byte */ #define osbyte_OUTPUT_CURSOR_POSITION 165 #define osbyte_VAR_VSYNC_TIMER 176 #ifndef __ASSEMBLER__ extern void os_byte(int, int, int, int *, int *); extern int osbyte_read(int); #endif /* OS_Word */ #define osword_WRITE_SCREEN_ADDRESS 22 #ifndef __ASSEMBLER__ extern void os_word(int, char *); #endif /* OS_Args */ #define OSArgs_ReadPtr 0 #define OSArgs_SetPtr 1 #define OSArgs_ReadExt 2 #define OSArgs_SetExt 3 #define OSArgs_ReadAllocation 4 #define OSArgs_ReadEOFStatus 5 #ifndef __ASSEMBLER__ extern os_error *xosargs_read(int, int, int *); extern os_error *xosargs_set(int, int, int); #define xosargs_read_ptr(f, vp) xosargs_read(OSArgs_ReadPtr, (f), (vp)) #define xosargs_set_ptr(f, v) xosargs_set(OSArgs_SetPtr, (f), (v)) #define xosargs_read_ext(f, vp) xosargs_read(OSArgs_ReadExt, (f), (vp)) #define xosargs_set_ext(f, v) xosargs_set(OSArgs_SetExt, (f), (v)) #define xosargs_read_allocation(f, vp) \ xosargs_read(OSArgs_ReadAllocation, (f), (vp)) #define xosargs_read_eof_status(f, vp) \ xosargs_read(OSArgs_ReadEOFStatus, (f), (vp)) #endif /* OS_GBPB */ #define OSGBPB_WriteAt 1 #define OSGBPB_Write 2 #define OSGBPB_ReadAt 3 #define OSGBPB_Read 4 #ifndef __ASSEMBLER__ extern os_error *xosgbpb_write(int, char const *, int, int *); extern os_error *xosgbpb_read(int, char *, int, int *); #endif /* OS_Find */ #define OSFind_Close 0x00 #define OSFind_Openin 0x40 #define OSFind_Openout 0x80 #define OSFind_Openup 0xc0 #define osfind_PATH 0x01 #define osfind_PATH_VAR 0x02 #define osfind_NO_PATH 0x03 #define osfind_ERROR_IF_DIR 0x04 #define osfind_ERROR_IF_ABSENT 0x08 #ifndef __ASSEMBLER__ extern os_error *xosfind_close(int); extern os_error *xosfind_open(int, char const *, char const *, int *); #endif /* OS_ReadSysInfo */ #define OSReadSysInfo_ReadConfiguredScreenSize 0x00 #define OSReadSysInfo_ReadMonitorInfo 0x01 #define OSReadSysInfo_ReadChipPresenceAndId 0x02 #define OSReadSysInfo_ReadSuperIOFeatures 0x03 #define OSReadSysInfo_ReadPlatformClass 0x08 #define osreadsysinfo_IOEB_ASIC_PRESENT 0x01 #define osreadsysinfo_SUPERIO_PRESENT 0x02 #define osreadsysinfo_LCD_ASIC_PRESENT 0x04 #define osreadsysinfo_Platform_Unknown 0x00 #define osreadsysinfo_Platform_RiscPC 0x01 #define osreadsysinfo_Platform_A7000 0x02 #define osreadsysinfo_Platform_A7000Plus 0x03 #define osreadsysinfo_Platform_Phoebe 0x04 #define osreadsysinfo_Platform_Pace 0x05 #define osreadsysinfo_Platform_VirtualRPC 0x06 #define osreadsysinfo_Platform_A9 0x07 #ifndef __ASSEMBLER__ extern void os_readsysinfo(int what, int *r0, int *r1, int *r2, int *r3, int *r4); #define os_readsysinfo_configured_screensize(s) \ os_readsysinfo(OSReadSysInfo_ReadConfiguredScreenSize, (s), 0, 0, 0, 0) #define os_readsysinfo_monitor_info(mode, type, sync) \ os_readsysinfo(OSReadSysInfo_ReadMonitorInfo, (mode), (type), (sync), 0, 0) #define os_readsysinfo_chip_presence(ioeb, superio, lcd) \ os_readsysinfo(OSReadSysInfo_ReadChipPresenceAndId, (ioeb), (superio), (lcd), 0, 0) #define os_readsysinfo_unique_id(low, high) \ os_readsysinfo(OSReadSysInfo_ReadChipPresenceAndId, 0, 0, 0, (low), (high)) #define os_readsysinfo_superio_features(basic, extra) \ os_readsysinfo(OSReadSysInfo_ReadSuperIOFeatures, (basic), (extra), 0, 0, 0) #define os_readsysinfo_platform_class(class, flags, feature) \ os_readsysinfo(OSReadSysInfo_ReadPlatformClass, (class), (flags), (feature), 0, 0) #endif /* OS_Memory */ #define OSMemory_PageOp 0x00 #define OSMemory_ReadArrangementTableSize 0x06 #define OSMemory_ReadArrangementTable 0x07 #define OSMemory_ReadSize 0x08 #define OSMemory_ReadController 0x09 #define osmemory_GIVEN_PAGE_NO 0x0100 #define osmemory_GIVEN_LOG_ADDR 0x0200 #define osmemory_GIVEN_PHYS_ADDR 0x0400 #define osmemory_RETURN_PAGE_NO 0x0800 #define osmemory_RETURN_LOG_ADDR 0x1000 #define osmemory_RETURN_PHYS_ADDR 0x2000 #define osmemory_TYPE 0xf00 #define osmemory_TYPE_SHIFT 8 #define osmemory_TYPE_ABSENT 0x0 #define osmemory_TYPE_DRAM 0x1 #define osmemory_TYPE_VRAM 0x2 #define osmemory_TYPE_ROM 0x3 #define osmemory_TYPE_IO 0x4 /* 5, 6, 7 are undefined */ #define osmemory_TYPE_ALLOCATABLE_MASK 0x8 /* bit signaling allocatable */ #ifndef __ASSEMBLER__ struct page_info { int pagenumber; int logical; int physical; }; extern void osmemory_read_arrangement_table_size(int *size, int *nbpp); extern os_error *xosmemory_read_arrangement_table_size(int *size, int *nbpp); extern void osmemory_read_arrangement_table(unsigned char *block); extern os_error *xosmemory_read_arrangement_table(unsigned char *block); extern void osmemory_page_op(int fromto, struct page_info *block, int num_pages); #endif /* Misc */ #ifndef __ASSEMBLER__ extern char *os_get_env(void **, void **); extern void os_exit(os_error const *, int) __attribute__((noreturn)); extern void os_int_off(void); extern void os_enter_os(void); #endif #define OSModule_Alloc 6 #define OSModule_Free 7 #define OSModule_Lookup 18 #define OSModule_EnumerateWithVersion 20 #ifndef __ASSEMBLER__ extern os_error *xosmodule_alloc(int, void **); extern os_error *xosmodule_free(void *); extern os_error *xosmodule_lookup(char const *, int *, int *, void **, void **, char **); extern os_error *xosmodule_enumeratewithversion(int *, int *, char **, int *, int *, int *); #endif #define OSFSControl_AddFS 12 #define OSFSControl_SelectFS 14 #define OSFSControl_RemoveFS 16 #define OSFSControl_Shutdown 23 #define fileswitch_SUPPORTS_SPECIAL (1 << 31) #define fileswitch_INTERACTIVE (1 << 30) #define fileswitch_SUPPORTS_EMPTY_NAMES (1 << 29) #define fileswitch_NEEDS_CREATE (1 << 28) #define fileswitch_NEEDS_FLUSH (1 << 27) #define fileswitch_SUPPORTS_STAMP_NAMED (1 << 26) #define fileswitch_SUPPORTS_FILE_INFO (1 << 25) #define fileswitch_SUPPORTS_SET_CONTEXTS (1 << 24) /* MBZ in RO3 */ #define fileswitch_SUPPORTS_IMAGE (1 << 23) #define fileswitch_NEEDS_URD_AND_LIB (1 << 22) #define fileswitch_IMPLICIT_DIRECTORIES (1 << 21) #define fileswitch_NO_LOAD_ENTRY (1 << 20) #define fileswitch_NO_SAVE_ENTRY (1 << 19) #define fileswitch_NO_FILE_ENTRIES (1 << 18) #define fileswitch_HAS_EXTRA_FLAGS (1 << 17) #define fileswitch_READ_ONLY (1 << 16) #define fileswitch_SUPPORTS_DIR_CHANGE (1 << 0) #define fileswitch_NEEDS_CAT (1 << 1) #define fileswitch_NEEDS_EX (1 << 2) #define fileswitch_NOT_FOUND 0 #define fileswitch_IS_FILE 1 #define fileswitch_IS_DIR 2 #define fileswitch_IS_IMAGE 3 #define fileswitch_ATTR_OWNER_READ (1 << 0) #define fileswitch_ATTR_OWNER_WRITE (1 << 1) #define fileswitch_ATTR_OWNER_LOCKED (1 << 3) #define fileswitch_ATTR_WORLD_READ (1 << 4) #define fileswitch_ATTR_WORLD_WRITE (1 << 5) #define fileswitch_ATTR_WORLD_LOCKED (1 << 7) #ifndef __ASSEMBLER__ struct fileswitch_dirent { uint32_t loadaddr; uint32_t execaddr; uint32_t length; uint32_t attr; uint32_t objtype; char name[1]; /* Actually variable length */ }; extern os_error *xosfscontrol_shutdown(void); #endif #define Service_FSRedeclare 0x40 #define Service_PreReset 0x45 #ifndef __ASSEMBLER__ extern void service_pre_reset(void); #endif #define os_MODEVAR_LOG2_BPP 9 #define os_MODEVAR_XWIND_LIMIT 11 #define os_MODEVAR_YWIND_LIMIT 12 #define os_VDUVAR_DISPLAY_START 149 #define os_VDUVAR_TOTAL_SCREEN_SIZE 150 #define os_VDUVAR_TCHAR_SPACEY 170 #ifndef __ASSEMBLER__ extern void os_read_vdu_variables(const int *, int *); extern os_error *xos_swi_number_from_string(char const *, int *); extern unsigned int os_read_monotonic_time(void); extern void os_read_mem_map_info(int *, int *); struct os_mem_map_request { int page_no; void *map; int access; #define os_AREA_ACCESS_READ_WRITE 0 #define os_AREA_ACCESS_READ_ONLY 1 #define os_AREA_ACCESS_NONE 3 }; extern void os_read_mem_map_entries(struct os_mem_map_request *); extern os_error xcache_control(u_int, u_int, u_int *); #endif #define FileCoreDiscOp_ReadSectors 1 #ifndef __ASSEMBLER__ struct filecore_disc { uint8_t log2secsize; uint8_t secspertrack; uint8_t heads; uint8_t density; uint8_t idlen; uint8_t log2bpmp; uint8_t skew; uint8_t bootoption; uint8_t lowsector; uint8_t nzones; uint16_t zone_spare; uint32_t root; uint32_t disc_size; uint16_t disc_id; char disc_name[10]; uint32_t disc_type; uint32_t disc_size_hi; uint8_t share_size; uint8_t big_flag; uint8_t reserved[22]; }; struct filecore_daddr64 { uint32_t drive; uint64_t daddr; }; extern os_error *xfilecorediscop_read_sectors(uint32_t, uint32_t, void *, size_t, void *, uint32_t *, void **, size_t *); extern os_error *xfilecoresectorop_read_sectors(uint32_t, uint32_t, void *, size_t, void *, uint32_t *, void **, size_t *); extern os_error *xfilecorediscop64_read_sectors(uint32_t, struct filecore_daddr64 *, void *, size_t, struct filecore_disc const *, void *, uint32_t *, void **, size_t *); extern os_error *xfilecore_drives(void *, int *, int *, int *); #endif /* RISC OS Error numbers */ #define error_IS_ADIR 0xa8 #define error_TOO_MANY_OPEN_FILES 0xc0 #define error_FILE_NOT_FOUND 0xd6 #ifndef __ASSEMBLER__ extern int riscos_errno(os_error *); #endif