/* $NetBSD: riscoscalls.S,v 1.12 2019/01/23 14:49:00 sborrill Exp $ */ /*- * Copyright (c) 2001 Ben Harris * Copyright (c) 2002 Reinoud Zandijk * 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. */ #include #include ENTRY(os_writec) mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 swi OS_WriteC ldmdb fp, {fp, sp, pc} ENTRY(os_new_line) mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 swi OS_NewLine ldmdb fp, {fp, sp, pc} ENTRY(os_readc) mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 swi OS_ReadC ldmdb fp, {fp, sp, pc} ENTRY(os_cli) mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 swi OS_CLI ldmdb fp, {fp, sp, pc} ENTRY(xos_cli) mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 swi XOS_CLI movvc r0, #0 ldmdb fp, {fp, sp, pc} ENTRY(os_byte) mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 swi OS_Byte teq r3, #0 strne r1, [r3] ldr r3, [fp, #4] teq r3, #0 strne r2, [r3] ldmdb fp, {fp, sp, pc} ENTRY(osbyte_read) mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 mov r1, #0 mov r2, #255 swi OS_Byte mov r0, r1 ldmdb fp, {fp, sp, pc} ENTRY(os_word) mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 swi OS_Word ldmdb fp, {fp, sp, pc} ENTRY(xosargs_read) mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 mov r3, r2 swi XOS_Args ldmdbvs fp, {fp, sp, pc} teq r3, #0 strne r2, [r3] mov r0, #0 ldmdb fp, {fp, sp, pc} ENTRY(xosargs_set) mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 swi XOS_Args movvc r0, #0 ldmdb fp, {fp, sp, pc} ENTRY(xosgbpb_write) mov ip, sp stmfd sp!, {r4, fp, ip, lr, pc} sub fp, ip, #4 mov ip, r3 mov r3, r2 mov r2, r1 mov r1, r0 mov r0, #OSGBPB_Write swi XOS_GBPB teq ip, #0 strne r3, [ip] movvc r0, #0 ldmdb fp, {r4, fp, sp, pc} ENTRY(xosgbpb_read) mov ip, sp stmfd sp!, {r4, fp, ip, lr, pc} sub fp, ip, #4 mov ip, r3 mov r3, r2 mov r2, r1 mov r1, r0 mov r0, #OSGBPB_Read swi XOS_GBPB teq ip, #0 strne r3, [ip] movvc r0, #0 ldmdb fp, {r4, fp, sp, pc} ENTRY(xosfind_close) mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 mov r1, r0 mov r0, #OSFind_Close swi XOS_Find movvc r0, #0 ldmdb fp, {fp, sp, pc} ENTRY(xosfind_open) mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 swi XOS_Find ldmdbvs fp, {fp, sp, pc} teq r3, #0 strne r0, [r3] mov r0, #0 ldmdb fp, {fp, sp, pc} ENTRY(os_get_env) mov ip, sp stmfd sp!, {r4, fp, ip, lr, pc} sub fp, ip, #4 mov r3, r0 mov r4, r1 swi OS_GetEnv teq r3, #0 strne r1, [r3] teq r4, #0 strne r2, [r4] ldmdb fp, {r4, fp, sp, pc} ENTRY(os_exit) mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 mov r2, r1 ldr r1, Labex swi OS_Exit ldmdb fp, {fp, sp, pc} Labex: .ascii "ABEX" ENTRY(os_int_off) mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 swi OS_IntOff ldmdb fp, {fp, sp, pc} ENTRY(os_enter_os) mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 swi OS_EnterOS ldmdb fp, {fp, sp, pc} ENTRY(xosmodule_alloc) mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 mov r3, r0 mov r0, #OSModule_Alloc swi XOS_Module ldmdbvs fp, {fp, sp, pc} teq r1, #0 strne r2, [r1] mov r0, #0 ldmdb fp, {fp, sp, pc} ENTRY(xosmodule_free) mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 mov r2, r0 mov r0, #OSModule_Free swi XOS_Module movvc r0, #0 ldmdb fp, {fp, sp, pc} ENTRY(xosmodule_lookup) mov ip, sp stmfd sp!, {r4-r8, fp, ip, lr, pc} sub fp, ip, #4 mov r6, r1 mov r7, r2 mov r8, r3 mov r1, r0 mov r0, #OSModule_Lookup swi XOS_Module ldmdbvs fp, {r4-r8, fp, sp, pc} teq r6, #0 strne r1, [r6] teq r7, #0 strne r2, [r7] teq r8, #0 strne r3, [r8] ldr r8, [fp, #4] teq r8, #0 strne r4, [r8] ldr r8, [fp, #8] teq r8, #0 strne r5, [r8] mov r0, #0 ldmdb fp, {r4-r8, fp, sp, pc} ENTRY(xosmodule_enumeratewithversion) mov ip, sp stmfd sp!, {r4-r10, fp, ip, lr, pc} sub fp, ip, #4 mov r7, r0 mov r8, r1 mov r9, r2 mov r10, r3 ldr r1, [r7] ldr r2, [r8] mov r0, #OSModule_EnumerateWithVersion swi XOS_Module ldmdbvs fp, {r4-r10, fp, sp, pc} str r1, [r7] str r2, [r8] teq r9, #0 strne r3, [r9] teq r9, #0 strne r3, [r9] teq r10, #0 strne r4, [r10] ldr r10, [fp, #4] teq r10, #0 strne r5, [r10] ldr r10, [fp, #8] teq r10, #0 strne r6, [r10] mov r0, #0 ldmdb fp, {r4-r10, fp, sp, pc} ENTRY(xosfscontrol_shutdown) mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 mov r0, #OSFSControl_Shutdown swi XOS_FSControl movvc r0, #0 ldmdb fp, {fp, sp, pc} ENTRY(service_pre_reset) mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 mov r1, #Service_PreReset swi OS_ServiceCall ldmdb fp, {fp, sp, pc} ENTRY(os_read_vdu_variables) mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 swi OS_ReadVduVariables ldmdb fp, {fp, sp, pc} ENTRY(xos_swi_number_from_string) mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 mov r2, r1 mov r1, r0 swi XOS_SWINumberFromString ldmdbvs fp, {fp, sp, pc} str r0, [r2] mov r0, #0 ldmdb fp, {fp, sp, pc} ENTRY(os_read_monotonic_time) mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 swi OS_ReadMonotonicTime ldmdb fp, {fp, sp, pc} ENTRY(os_read_mem_map_info) mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 mov r2, r0 mov r3, r1 swi OS_ReadMemMapInfo teq r2, #0 strne r0, [r2] teq r3, #0 strne r1, [r3] ldmdb fp, {fp, sp, pc} ENTRY(os_readsysinfo) mov ip, sp stmfd sp!, {r4-r9, fp, ip, lr, pc} sub fp, ip, #4 mov r9, r5 mov r8, r4 mov r7, r3 mov r6, r2 mov r5, r1 swi OS_ReadSysInfo teq r5, #0 strne r0, [r5] teq r6, #0 strne r1, [r6] teq r7, #0 strne r2, [r7] ldr r1, [ip, #0] teq r1, #0 strne r3, [r1] ldr r1, [ip, #4] teq r1, #0 strne r4, [r1] ldmdb fp, {r4-r9, fp, sp, pc} ENTRY(os_read_mem_map_entries) mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 swi OS_ReadMemMapEntries ldmdb fp, {fp, sp, pc} ENTRY(osmemory_read_arrangement_table_size) mov ip, sp stmfd sp!, {r4, fp, ip, lr, pc} sub fp, ip, #4 mov r3, r0 mov r4, r1 mov r0, #OSMemory_ReadArrangementTableSize swi OS_Memory cmp r3, #0 strne r1, [r3] cmp r4, #0 strne r2, [r4] ldmdb fp, {r4, fp, sp, pc} ENTRY(xosmemory_read_arrangement_table_size) mov ip, sp stmfd sp!, {r4, fp, ip, lr, pc} sub fp, ip, #4 mov r3, r0 mov r4, r1 mov r0, #OSMemory_ReadArrangementTableSize swi XOS_Memory ldmdbvs fp, {r4, fp, sp, pc} cmp r3, #0 strne r1, [r3] cmp r4, #0 strne r2, [r4] mov r0, #0 ldmdb fp, {r4, fp, sp, pc} ENTRY(osmemory_read_arrangement_table) mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 mov r1, r0 mov r0, #OSMemory_ReadArrangementTable swi OS_Memory ldmdb fp, {fp, sp, pc} ENTRY(xosmemory_read_arrangement_table) mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 mov r1, r0 mov r0, #OSMemory_ReadArrangementTable swi XOS_Memory movvc r0, #0 ldmdb fp, {fp, sp, pc} ENTRY(osmemory_page_op) mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 add r0, r0, #OSMemory_PageOp swi OS_Memory ldmdb fp, {fp, sp, pc} ENTRY(xcache_control) mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 swi XCache_Control ldmdbvs fp, {fp, sp, pc} teq r2, #0 strne r0, [r2] mov r0, #0 ldmdb fp, {fp, sp, pc} ENTRY(xfilecorediscop_read_sectors) mov ip, sp stmfd sp!, {r4, r8, fp, ip, lr, pc} sub fp, ip, #4 mov r4, r3 mov r3, r2 mov r2, r1 orr r1, r0, #FileCoreDiscOp_ReadSectors ldr r8, [fp, #4] swi XFileCore_DiscOp ldmdbvs fp, {r4, r8, fp, sp, pc} ldr r0, [fp, #8] teq r0, #0 strne r2, [r0] ldr r0, [fp, #12] teq r0, #0 strne r3, [r0] ldr r0, [fp, #16] teq r0, #0 strne r4, [r0] mov r0, #0 ldmdb fp, {r4, r8, fp, sp, pc} ENTRY(xfilecore_drives) mov ip, sp stmfd sp!, {r4-r5, r8, fp, ip, lr, pc} sub fp, ip, #4 mov r5, r3 mov r4, r2 mov r3, r1 mov r8, r0 swi XFileCore_Drives ldmdbvs fp, {r4-r5, r8, fp, sp, pc} teq r3, #0 strne r0, [r3] teq r4, #0 strne r1, [r4] teq r5, #0 strne r2, [r5] mov r0, #0 ldmdb fp, {r4-r5, r8, fp, sp, pc} ENTRY(xfilecoresectorop_read_sectors) mov ip, sp stmfd sp!, {r4, r8, fp, ip, lr, pc} sub fp, ip, #4 mov r4, r3 mov r3, r2 mov r2, r1 orr r1, r0, #FileCoreDiscOp_ReadSectors ldr r8, [fp, #4] swi XFileCore_SectorOp ldmdbvs fp, {r4, r8, fp, sp, pc} ldr r0, [fp, #8] teq r0, #0 strne r2, [r0] ldr r0, [fp, #12] teq r0, #0 strne r3, [r0] ldr r0, [fp, #16] teq r0, #0 strne r4, [r0] mov r0, #0 ldmdb fp, {r4, r8, fp, sp, pc} ENTRY(xfilecorediscop64_read_sectors) mov ip, sp stmfd sp!, {r4, r5, r8, fp, ip, lr, pc} sub fp, ip, #4 mov r4, r3 mov r3, r2 mov r2, r1 orr r1, r0, #FileCoreDiscOp_ReadSectors ldr r5, [fp, #4] ldr r8, [fp, #8] swi XFileCore_DiscOp64 ldmdbvs fp, {r4, r5, r8, fp, sp, pc} ldr r0, [fp, #12] teq r0, #0 strne r2, [r0] ldr r0, [fp, #16] teq r0, #0 strne r3, [r0] ldr r0, [fp, #20] teq r0, #0 strne r4, [r0] mov r0, #0 ldmdb fp, {r4, r5, r8, fp, sp, pc}