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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
/* Copyright 1996 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.
*/
/* hostsys.h: specify details of host system when compiling CLIB */
/* Copyright (C) A.C. Norman and A. Mycroft */
/* version 0.01a, amalgamates norcrosys+sysdep: */
/* soon rationalise to armsys.h, s370sys.h etc */
/* The tests of #ifdef ARM must go one day. */
#ifndef __hostsys_h
#define __hostsys_h
#include <stdio.h>
#undef MACHINE
#ifdef __arm
# ifndef __ARM
# define __ARM 1
# endif
#endif
#ifdef __ARM
/* The following lines could be a #include "armsys.h" etc. */
# ifndef PLUS_APRM
/* ordinary ARM */
# define BYTESEX_EVEN 1
# else
/* Apple ARM */
# define BYTESEX_ODD 1
# endif
# define MACHINE "ARM"
#endif
#ifdef __ACW
# define BYTESEX_EVEN 1
# define MACHINE "ACW"
#endif
#ifdef __ibm370
# define BYTESEX_ODD 1
# define MACHINE "370"
#endif
#ifndef MACHINE
# error -D__ibm370 assumed
# define __ibm370 1
# define BYTESEX_ODD 1
# define MACHINE "370"
#endif
#define memclr(p,n) memset(p,0,n)
#ifdef __ibm370
# define MAXSTORE 0x00ffffff /* used only by alloc.c */
#else /* not right! */
# define MAXSTORE 0x03ffffff /* used only by alloc.c */
# define HOST_LACKS_ALLOC 1
#endif
#ifdef __ARM /* fpe2 features stfp/ldfp ops */
# define HOST_HAS_BCD_FLT 1
# ifndef SOFTWARE_FLOATING_POINT
# define HOST_HAS_TRIG 1 /* and ieee trig functions */
# endif
#endif
extern char *_strerror(int n, char *v);
/* The same as strerror, except that if an error message must be constructed
* this is done into the array v.
*/
extern int _interrupts_off;
extern void _raise_stacked_interrupts(void);
extern void _postmortem(char *msg, int mflag);
extern void _mapstore(void);
extern void _write_profile(char *filename);
extern void _sysdie(const char *s);
extern void _init_alloc(void), _initio(char *,char *,char *),
_terminateio(void), _lib_shutdown(void), _signal_init(void),
_exit_init(void);
extern void _armsys_lib_init(void);
extern int _signal_real_handler(int sig);
#ifndef __size_t
#define __size_t 1
typedef unsigned int size_t; /* see <stddef.h> */
#endif
extern void *_sys_alloc(size_t n);
extern void _init_user_alloc(void);
extern void _terminate_user_alloc(void);
extern void _sys_msg(const char *);
extern void _exit(int n);
#ifdef __ARM
typedef int FILEHANDLE;
#define TTYFILENAME ":tt"
extern int _osgbpb(int op, int fh, void *base, int len, int extra);
extern int _ttywrite(const unsigned char *buf, unsigned int len, int flag);
extern int _ttyread(unsigned char *buff, int size, int flag);
extern double _ldfp(void *x);
extern void _stfp(double d, void *p);
#endif
#ifdef __ibm370
# if ('A' == 193)
# define atoe(x) (x) /* ebcdic already. */
# define etoa(x) (x)
# else
# define atoe(x) _atoe[x] /* else translate text files etc. */
# define etoa(x) _etoa[x]
# endif
extern char _etoa[], _atoe[];
extern void _abend(int);
extern void *_svc_getmain(int);
extern void _svc_freemain(void *, int);
struct _svcwto { short len, mcsflags;
char msg[80];
short desccode, routcde; };
extern void _svc_wto(const struct _svcwto *);
struct _svctime { int csecs; int yday/* 0-365 */; int year; };
extern void _svc_time(struct _svctime *);
extern void _svc_stimer(int);
extern unsigned _svc_ttimer(void); /* units of 1/38400 sec */
/* the following lines use "struct NIOPBASE" instead of "NIOPBASE" to */
/* to reduce syntactic confusion if "niopbase.h" not included */
typedef struct NIOPBASE *FILEHANDLE;
extern int _io_call(int fn, struct NIOPBASE *p, int arg), _io_r0;
extern struct _svcwto _io_emsg; /* beware only 64 bytes thereof */
#endif
#ifndef SOFTWARE_FLOATING_POINT
# ifdef __ibm370
# define IBMFLOAT 1
# else
# define IEEE 1
/* IEEE floating point format assumed. */
# ifdef __ARM
/* For the current ARM floating point system that Acorn use the first */
/* word of a floating point value is the one containing the exponent. */
# undef OTHER_WORD_ORDER_FOR_FP_NUMBERS
# define DO_NOT_SUPPORT_UNNORMALIZED_NUMBERS 1
# endif
# endif
#endif
/* I/O stuff... */
extern FILEHANDLE _sys_open(const char *name, int openmode);
/* openmode is a bitmap, whose bits have the following significance ... */
/* most correspond directly to the ANSI mode specification - the */
/* exception is OPEN_T, an extension which requests timestamp update. */
/* This is really a sop to implementation laziness: what is intended is */
/* that the timestamp should be updated if the file is written to or */
/* otherwise modified. But that is known only when the file is closed */
/* and RISC OS has no 'set timestamp given filehandle' operation and the */
/* name by which the file was opened may no longer be valid at the time */
/* of its close. */
#define OPEN_R 0
#define OPEN_W 4
#define OPEN_A 8
#define OPEN_B 1
#define OPEN_PLUS 2
#define OPEN_T 16
extern int _sys_close(FILEHANDLE fh);
/* result is 0 or an error indication */
extern int _sys_write(FILEHANDLE fh, const unsigned char *buf, unsigned len, int mode);
/* result is number of characters not written (ie non-0 denotes a */
/* failure of some sort) or a negative error indicator. */
extern int _sys_read(FILEHANDLE fh, unsigned char *buf, unsigned len, int mode);
/* result is number of characters not read (ie len - result _were_ read),*/
/* or negative to indicate error or EOF. */
/* _sys_iserror(result) distinguishes between the two possibilities. */
/* (Redundantly, since on EOF it is required that (result & ~0x80000000) */
/* is the number of characters unread). */
extern int _sys_istty(FILE *);
/* Return true if the argument file is connected to a terminal. */
/* Used to: provide default unbuffered behaviour (in the absence of a */
/* setbuf call). */
/* disallow seek */
extern int _sys_seek(FILEHANDLE fh, long pos);
/* Position the file at offset pos from its beginning. */
/* Result is >= 0 if OK, negative for an error. */
extern int _sys_ensure(FILEHANDLE fh);
/* Flush any OS buffers associated with fh, ensuring that the file is */
/* up to date on disc. (Only required if HOSTOS_NEEDSENSURE; see above) */
/* Result is >= 0 if OK, negative for an error. */
extern long _sys_flen(FILEHANDLE fh);
/* Return the current length of the file fh (or a negative error */
/* indicator). Required to convert fseek(, SEEK_END) into (, SEEK_START)*/
/* as required by _sys_seek. */
#ifdef __ARM
#define NONHANDLE (-1)
extern void _sys_tmpnam_(char *name, int sig);
/* Return the name for temporary file number sig in the buffer name. */
extern char *_hostos_error_string(int no, char *buf);
#endif
#ifdef __ibm370
#define NONHANDLE ((FILEHANDLE)0)
#define _sys_istty_(fh) (((DCB *)(fh))->DCBDEVT==DCBDVTRM)
#define _sys_seek_(fh, pos) (_sysdie("Unimplemented fseek"), 0)
#define _sys_flen_(fh) (_sysdie("Unimplemented filelen"), 0)
extern int _sys_write_(FILEHANDLE fh, unsigned char *buf, int len, int mode);
extern int _sys_read_(FILEHANDLE fh, unsigned char *buf, int len, int mode);
extern int _sys_close_(FILEHANDLE fh);
#define _sys_tmpnam_(name, sig) sprintf(name, "$.tmp.x%.8x", sig)
#endif
/* The following code is NOT PORTABLE but can stand as a prototype for */
/* whatever makes sense on other machines. */
#ifdef IBMFLOAT
/* This version works with IBM 360 floating point. */
#ifdef BYTESEX_EVEN
typedef union {struct {int mhi:24, x:7, s:1; unsigned mlo; } i;
double d; } fp_number;
#else
typedef union {struct {int s:1, x:7, mhi:24; unsigned mlo; } i;
double d; } fp_number;
#endif
#else
#ifndef OTHER_WORD_ORDER_FOR_FP_NUMBERS
/* This version works with the ARM floating point emulator - it may have */
/* to be reworked when or if floating point hardware is installed */
# ifdef BYTESEX_EVEN
typedef union {struct {int mhi:20, x:11, s:1; unsigned mlo; } i;
double d; } fp_number;
# else
typedef union {struct {int s:1, x:11, mhi:20; unsigned mlo; } i;
double d; } fp_number;
# endif
#else /* OTHER_WORD_ORDER_FOR_FP_NUMBERS */
# ifdef BYTESEX_EVEN
typedef union {struct {unsigned mlo; int mhi:20, x:11, s:1; } i;
double d; } fp_number;
# else
typedef union {struct {unsigned mlo; int s:1, x:11, mhi:20; } i;
double d; } fp_number;
# endif
#endif /* OTHER_WORD_ORDER_FOR_FP_NUMBERS */
#endif
/* the object of the following macro is to adjust the floating point */
/* variables concerned so that the more significant one can be squared */
/* with NO LOSS OF PRECISION. It is only used when there is no danger */
/* of over- or under-flow. */
/* This code is NOT PORTABLE but can be modified for use elsewhere */
/* It should, however, serve for IEEE and IBM FP formats. */
#define _fp_normalize(high, low) \
{ fp_number temp; /* access to representation */ \
double temp1; \
temp.d = high; /* take original number */ \
temp.i.mlo = 0; /* make low part of mantissa 0 */ \
temp1 = high - temp.d; /* the bit that was thrown away */ \
low += temp1; /* add into low-order result */ \
high = temp.d; \
}
/* The next line is not very nice, but since I want to declare a */
/* function of type (FILE *) is seems to be needed. If you do not */
/* want <stdio.h> included, tough luck! */
/* Note also the use of __system_io to alter the amount of detail */
/* revealed by <stdio.h>. */
#include <stdio.h>
extern FILE *_fopen_string_file(const char *data, int length);
#if defined __ARM && defined SHARED_C_LIBRARY
# define _call_client_0(f) \
_kernel_call_client(0, 0, 0, (_kernel_ccproc *)(f))
# define _call_client_1(f,a) \
_kernel_call_client((int)(a), 0, 0, (_kernel_ccproc *)(f))
# define _call_client_2(f,a,b) \
_kernel_call_client((int)(a), (int)(b), 0, (_kernel_ccproc *)(f))
# define _call_client_3(f,a,b,c) \
_kernel_call_client((int)(a), (int)(b), (int)(c), (_kernel_ccproc *)(f))
#else
# define _call_client_0(f) (*(f))()
# define _call_client_1(f,a) (*(f))(a)
# define _call_client_2(f,a,b) (*(f))((a), (b))
# define _call_client_3(f,a,b,c) (*(f))((a), (b), (c))
#endif
#ifdef DEFAULT_TEXT
extern char *_kernel_getmessage(char *msg, char *tag);
#else
extern char *_kernel_getmessage(char *tag);
#define _kernel_getmessage(msg, tag) _kernel_getmessage(tag)
#endif
extern char *decimal_point;
extern int __counter( void );
#endif
/* end of hostsys.h */