swisheader 5.02 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
/* Copyright 1998 Acorn Computers Ltd
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#pragma force_top_level
#pragma include_only_once

/*Name:    swis.h
  Purpose: Generalised SWI interface
  Author:  (c) Acorn Computers Ltd, 1989
  Version: 2.04 (09-Jan-1995)
  This file is automatically generated from Hdr:makehswis
*/

#ifndef __swis_h
#define __swis_h

#ifndef __kernel_h
  #include "kernel.h"
#endif

#ifdef __cplusplus
extern "C"
{
#endif

#pragma -v4
extern int _swi (int swi_no, unsigned int, ...);

extern _kernel_oserror *_swix (int swi_no, unsigned int, ...);
#pragma -v0

#ifdef __cplusplus
}
#endif

#define _FLAGS     0x10 /*use with _RETURN() or _OUT()*/
#define _IN(i)     (1U << (i))
#define _INR(i,j)  (~0 << (i) ^ ~0 << (j) + 1)
#define _OUT(i)    ((i) != _FLAGS? 1U << 31 - (i): 1U << 21)
#define _OUTR(i,j) (~0U >> (i) ^ ~0U >> (j) + 1)
#define _BLOCK(i)  (1U << 11 | (unsigned) (i) << 12)
#define _RETURN(i) ((i) != _FLAGS? (unsigned) (i) << 16: 0xFU << 16)
#define _C         (1U << 29)
#define _Z         (1U << 30)
#define _N         (1U << 31)

#define XOS_Bit    (1U << 17) /*deprecated: use _swi() or _swix()*/

/*
 * These functions provide a generic method of calling RISC OS SWIs from C or
 * C++.
 *
 * Two functions are provided:
 *     _swi for calling SWIs without setting the X bit
 *     _swix which sets the X bit before calling the SWI.
 *
 * swi_no is the number of the SWI to be called. This should never have the
 * X bit set.
 *
 * mask is a word containing an input and output register mask, a return
 * register, and a block parameter register.
 *
 * The arrangement of mask is as follows:
 *
 * Bits 0 -  9:  Set if R(N) is passed to the SWI.
 * Bits 22 - 31: Set if R(31-N) is output from the SWI (ie bit 31
 *               corresponds to R0, bit 22 corresponds to R9).
 * Bit 21:       Set if the PC (including the flags) is to be output.
 * Bits 16 - 19: Register no. to be returned from a _swi call. This is only
 *               applicable to _swi as _swix always returns either 0 or an error
 *               pointer.
 * Bit 11:       Set if a local block parameter is to be passed to the SWI
 * Bits 12 - 15: Register number for local block parameter if bit 11 set.
 *
 * If a register is specified as a return register (bits 16-19) it must not
 * also be specified as an output register in the output register mask
 * (bits 22-31).
 *
 * If a register is specified as a local block parameter register it must not
 * also be specified as an input register in the input register mask
 * (bits 0-9).
 *
 * If the PC is specified as a return register (ie bits 16-19 = 15) or as an
 * output registers (bit 21 = 1) the value returned will contain the flags in
 * bits 28 to 31 (28 = V, 29 = C, 30 = Z, 31 = N).
 *
 * The remainder of the variadic arguments are as follows (in order):
 *
 * The word value of each input register in order from 0 to 9 as specified by
 * bits 0 to 9 of the mask.
 *
 * The address of a word to be written for each output register in order from
 * 0 to 9 as specified by bits 31 downto 22 of the mask.
 *
 * The address of a word to be written with the PC value on exit from the SWI
 * if bit 21 of the register mask is set.
 *
 * If bit 11 is set the remainder of the arguments are placed in order in a
 * parameter block and the address of the parameter block is passed to the SWI
 * in the register specified by bits 12-15.
 *
 * The macros are as follows:
 *
 * _IN(n)       - Specifies that R(n) is used on input
 * _OUT(n)      - Specifies that R(n) is output
 * _BLOCK(n)    - Specifies that R(n) is a block parameter
 * _RETURN(n)   - Specifies that R(n) is returned from _swi.
 *
 * The values of the macros should be ORed together to produce the value for
 * the mask.
 *
 * The following constants are defined
 *
 * _FLAGS       - the register containing the flags (currently 15)
 * _C           - mask for the C bit in _FLAGS
 * _Z           - mask for the Z bit in _FLAGS
 * _N           - mask for the N bit in _FLAGS
 *
 * Example calls:
 *
 *     _swi(OS_NewLine, 0);   // Must specify 0 register mask
 *
 *     _swi(OS_Write0, _IN(0), "Hello, World");
 *
 *     task_handle = _swi(Wimp_Initialise, _IN(0)|_IN(1)|_IN(2)|_RETURN(1),
 *                        300, *(int *)"TASK", "Test");
 *
 *     e = _swix(Wimp_LoadTemplate, _IN(1)|_IN(2)|_IN(3)|_IN(4)|_IN(5)|_IN(6)|
 *                                  _OUT(2)|_OUT(6),
 *               template_buffer, workspace, workspace_end, -1, "MyWind", next,
 *               &workspace_end, &next);
 *
 *     e = _swix(Wimp_SetExtent, _IN(0)|_BLOCK(1), w, minx, miny, maxx, maxy);
 */