Commit f22c5f04 authored by Stewart Brodie's avatar Stewart Brodie
Browse files

Added new -v4 pragma to derived swis.h header file.

  Moved template for swis.h out of asm source into separate text file.
Detail:
  s.makehswis: The text which forms the common header for the derived
    swis.h is now stored externally rather than declared inline with
    assembler directives.
  h.swisheaders: The external file containing the common header.
    Now wraps the declarations of _swi and _swix with "#pragma -v4"
    to activate the _swi/_swix parameter checking for those functions.
  Makefile: Added dependency of derived.swis on h.swisheader
Admin:
  Built and exported.  Tested with cc 5.09 and it was happy with the
  new pragma (it ignores it).  Tested with what will be cc 5.10 and
  it recognised it and started checking _swi and _swix calls.

Version 4.90. Tagged as 'RISC_OSLib-4_90'
parent 9081a0dc
......@@ -500,7 +500,7 @@ lib.arthurlib: o.arth_new_n o.arth_old_n o.ArtAsm_n o.ArtAsm_o
${LIBFILE} ${LIBFLAGS} $@ o.Arth_new_n o.Arth_old_n o.ArtAsm_n o.ArtAsm_o
# Derived headers:
derived.swis: s.makehswis
derived.swis: s.makehswis h.swisheader
${AS} ${AFLAGS} -from s.makehswis -to $@
settype $@ text
......
......@@ -5,8 +5,8 @@
GBLA Module_Version
GBLS Module_MinorVersion
GBLS Module_Date
Module_MajorVersion SETS "4.89"
Module_Version SETA 489
Module_MajorVersion SETS "4.90"
Module_Version SETA 490
Module_MinorVersion SETS ""
Module_Date SETS "01 Oct 1998"
Module_Date SETS "26 Oct 1998"
END
/* (4.89)
/* (4.90)
*
* This file is automatically maintained by srccommit, do not edit manually.
*
*/
#define Module_MajorVersion_CMHG 4.89
#define Module_MajorVersion_CMHG 4.90
#define Module_MinorVersion_CMHG
#define Module_Date_CMHG 01 Oct 1998
#define Module_Date_CMHG 26 Oct 1998
#define Module_MajorVersion "4.89"
#define Module_Version 489
#define Module_MajorVersion "4.90"
#define Module_Version 490
#define Module_MinorVersion ""
#define Module_Date "01 Oct 1998"
#define Module_Date "26 Oct 1998"
/* 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);
*/
......@@ -103,137 +103,7 @@ string2 SETS "&":CC:(:STR:value)
GET Hdr:PublicWS
; First output the file header
= "#pragma force_top_level", 10
= "#pragma include_only_once", 10
= 10
= "/*Name: swis.h", 10
= " Purpose: Generalised SWI interface", 10
= " Author: (c) Acorn Computers Ltd, 1989", 10
= " Version: 2.04 (09-Jan-1995)", 10
= " This file is automatically generated from Hdr:makehswis", 10
= "*/", 10
= 10
= "#ifndef __swis_h", 10
= "#define __swis_h", 10
= 10
= "#ifndef __kernel_h", 10
= " #include ""kernel.h""", 10
= "#endif", 10
= 10
= "#ifdef __cplusplus", 10
= "extern ""C""", 10
= "{", 10
= "#endif", 10
= 10
= "extern int _swi (int swi_no, unsigned int, ...);", 10
= 10
= "extern _kernel_oserror *_swix (int swi_no, unsigned int, ...);", 10
= 10
= "#ifdef __cplusplus", 10
= "}", 10
= "#endif", 10
= 10
= "#define _FLAGS 0x10 /*use with _RETURN() or _OUT()*/", 10
= "#define _IN(i) (1U << (i))", 10
= "#define _INR(i,j) (~0 << (i) ^ ~0 << (j) + 1)", 10
= "#define _OUT(i) ((i) != _FLAGS? 1U << 31 - (i): 1U << 21)", 10
= "#define _OUTR(i,j) (~0U >> (i) ^ ~0U >> (j) + 1)", 10
= "#define _BLOCK(i) (1U << 11 | (unsigned) (i) << 12)", 10
= "#define _RETURN(i) ((i) != _FLAGS? (unsigned) (i) << 16: 0xFU << 16)", 10
= "#define _C (1U << 29)", 10
= "#define _Z (1U << 30)", 10
= "#define _N (1U << 31)", 10
= 10
= "#define XOS_Bit (1U << 17) /*deprecated: use _swi() or _swix()*/", 10
= 10
= "/*", 10
= " * These functions provide a generic method of calling RISC OS SWIs from C or", 10
= " * C++.", 10
= " * ", 10
= " * Two functions are provided:", 10
= " * _swi for calling SWIs without setting the X bit", 10
= " * _swix which sets the X bit before calling the SWI.", 10
= " * ", 10
= " * swi_no is the number of the SWI to be called. This should never have the", 10
= " * X bit set.", 10
= " * ", 10
= " * mask is a word containing an input and output register mask, a return", 10
= " * register, and a block parameter register.", 10
= " * ", 10
= " * The arrangement of mask is as follows:", 10
= " * ", 10
= " * Bits 0 - 9: Set if R(N) is passed to the SWI.", 10
= " * Bits 22 - 31: Set if R(31-N) is output from the SWI (ie bit 31", 10
= " * corresponds to R0, bit 22 corresponds to R9).", 10
= " * Bit 21: Set if the PC (including the flags) is to be output.", 10
= " * Bits 16 - 19: Register no. to be returned from a _swi call. This is only", 10
= " * applicable to _swi as _swix always returns either 0 or an error", 10
= " * pointer.", 10
= " * Bit 11: Set if a local block parameter is to be passed to the SWI", 10
= " * Bits 12 - 15: Register number for local block parameter if bit 11 set.", 10
= " * ", 10
= " * If a register is specified as a return register (bits 16-19) it must not", 10
= " * also be specified as an output register in the output register mask", 10
= " * (bits 22-31).", 10
= " * ", 10
= " * If a register is specified as a local block parameter register it must not", 10
= " * also be specified as an input register in the input register mask", 10
= " * (bits 0-9).", 10
= " * ", 10
= " * If the PC is specified as a return register (ie bits 16-19 = 15) or as an", 10
= " * output registers (bit 21 = 1) the value returned will contain the flags in", 10
= " * bits 28 to 31 (28 = V, 29 = C, 30 = Z, 31 = N).", 10
= " * ", 10
= " * The remainder of the variadic arguments are as follows (in order):", 10
= " * ", 10
= " * The word value of each input register in order from 0 to 9 as specified by", 10
= " * bits 0 to 9 of the mask.", 10
= " * ", 10
= " * The address of a word to be written for each output register in order from", 10
= " * 0 to 9 as specified by bits 31 downto 22 of the mask.", 10
= " * ", 10
= " * The address of a word to be written with the PC value on exit from the SWI", 10
= " * if bit 21 of the register mask is set.", 10
= " * ", 10
= " * If bit 11 is set the remainder of the arguments are placed in order in a", 10
= " * parameter block and the address of the parameter block is passed to the SWI", 10
= " * in the register specified by bits 12-15.", 10
= " * ", 10
= " * The macros are as follows:", 10
= " * ", 10
= " * _IN(n) - Specifies that R(n) is used on input", 10
= " * _OUT(n) - Specifies that R(n) is output", 10
= " * _BLOCK(n) - Specifies that R(n) is a block parameter", 10
= " * _RETURN(n) - Specifies that R(n) is returned from _swi.", 10
= " * ", 10
= " * The values of the macros should be ORed together to produce the value for", 10
= " * the mask.", 10
= " * ", 10
= " * The following constants are defined", 10
= " * ", 10
= " * _FLAGS - the register containing the flags (currently 15)", 10
= " * _C - mask for the C bit in _FLAGS", 10
= " * _Z - mask for the Z bit in _FLAGS", 10
= " * _N - mask for the N bit in _FLAGS", 10
= " * ", 10
= " * Example calls:", 10
= " * ", 10
= " * _swi(OS_NewLine, 0); // Must specify 0 register mask", 10
= " * ", 10
= " * _swi(OS_Write0, _IN(0), ",34,"Hello, World",34,");", 10
= " * ", 10
= " * task_handle = _swi(Wimp_Initialise, _IN(0)|_IN(1)|_IN(2)|_RETURN(1),", 10
= " * 300, *(int *)",34,"TASK",34,", ",34,"Test",34,");", 10
= " * ", 10
= " * e = _swix(Wimp_LoadTemplate, _IN(1)|_IN(2)|_IN(3)|_IN(4)|_IN(5)|_IN(6)|", 10
= " * _OUT(2)|_OUT(6),", 10
= " * template_buffer, workspace, workspace_end, -1, ",34,"MyWind",34,", next,", 10
= " * &workspace_end, &next);", 10
= " * ", 10
= " * e = _swix(Wimp_SetExtent, _IN(0)|_BLOCK(1), w, minx, miny, maxx, maxy);", 10
= " */", 10
= 10
BIN h.swisheader
; Now output all the SWI symbols we can access
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment