/* kernel.h
 * Copyright (C) Acorn Computers Ltd., 1989
 * Copyright (C) Codemist Ltd., 1989
 */
#ifndef __kernel_h
#define __kernel_h
#ifndef __size_t
#define __size_t 1
 typedef unsigned int size_t; 
#endif
typedef struct {
 int r[10]; 
}_kernel_swi_regs;
typedef struct {
 int load, exec; 
 int start, end; 
}_kernel_osfile_block;
typedef struct {
 void * dataptr; 
 int nbytes, fileptr;
 int buf_len; 
 char * wild_fld; 
}_kernel_osgbpb_block;
typedef struct {
 int errnum; 
 char errmess[252]; 
}_kernel_oserror;
typedef struct stack_chunk {
 unsigned long sc_mark; 
 struct stack_chunk *sc_next, *sc_prev;
 unsigned long sc_size;
 int (*sc_deallocate)();
}_kernel_stack_chunk;
extern _kernel_stack_chunk *_kernel_current_stack_chunk(void);
extern void _kernel_setreturncode(unsigned code);
extern void _kernel_exit(int);
extern void _kernel_exittraphandler(void);
#define _kernel_HOST_UNDEFINED -1
#define _kernel_BBC_MOS1_0 0
#define _kernel_BBC_MOS1_2 1
#define _kernel_BBC_ACW 2
#define _kernel_BBC_MASTER 3
#define _kernel_BBC_MASTER_ET 4
#define _kernel_BBC_MASTER_COMPACT 5
#define _kernel_ARTHUR 6
#define _kernel_SPRINGBOARD 7
#define _kernel_A_UNIX 8
extern int _kernel_hostos(void);
extern int _kernel_fpavailable(void);
extern _kernel_oserror *_kernel_swi(int no, _kernel_swi_regs *in, _kernel_swi_regs *out);
extern char *_kernel_command_string(void);
#define _kernel_ERROR (-2)
extern int _kernel_osbyte(int op, int x, int y);
extern int _kernel_osrdch(void);
extern int _kernel_oswrch(int ch);
extern int _kernel_osbget(unsigned handle);
extern int _kernel_osbput(int ch, unsigned handle);
extern int _kernel_osgbpb(int op, unsigned handle, _kernel_osgbpb_block *inout);
extern int _kernel_osword(int op, int *data);
extern int _kernel_osfind(int op, char *name);
extern int _kernel_osfile(int op, const char *name, _kernel_osfile_block *inout);
extern int _kernel_osargs(int op, unsigned handle, int arg);
extern int _kernel_oscli(const char *s);
extern _kernel_oserror *_kernel_last_oserror(void);
extern _kernel_oserror *_kernel_getenv(const char *name, char *buffer, unsigned size);
extern _kernel_oserror *_kernel_setenv(const char *name, const char *value);
extern int _kernel_system(const char *string, int chain);
extern unsigned _kernel_alloc(unsigned minwords, void **block);
typedef void freeproc(void *);
typedef void * allocproc(unsigned);
extern void _kernel_register_allocs(allocproc *malloc, freeproc *free);
extern int _kernel_escape_seen(void);
typedef union {
 struct {int s:1, u:16, x: 15; unsigned mhi, mlo; } i;
 int w[3]; } _extended_fp_number;
typedef struct {
 int r4, r5, r6, r7, r8, r9;
 int fp, sp, pc, sl;
 _extended_fp_number f4, f5, f6, f7; } _kernel_unwindblock;
extern int _kernel_unwind(_kernel_unwindblock *inout, char **language);
extern char *_kernel_procname(int pc);
extern char *_kernel_language(int pc);
extern unsigned _kernel_udiv(unsigned divisor, unsigned dividend);
extern unsigned _kernel_urem(unsigned divisor, unsigned dividend);
extern unsigned _kernel_udiv10(unsigned dividend);
extern int _kernel_sdiv(int divisor, int dividend);
extern int _kernel_srem(int divisor, int dividend);
extern int _kernel_sdiv10(int dividend);
typedef enum { NotHandled, Handled } _kernel_HandledOrNot;
typedef struct {
 int regs [16];
}_kernel_registerset;
typedef struct {
 int regs [10];
}_kernel_eventregisters;
typedef void (*PROC) (void);
typedef _kernel_HandledOrNot (*_kernel_trapproc) (int code, _kernel_registerset *regs);
typedef _kernel_HandledOrNot (*_kernel_eventproc) (int code, _kernel_registerset *regs);
typedef struct {
 int size;
 int codestart, codeend;
 char *name;
 PROC (*InitProc)(void);
 PROC FinaliseProc;
 _kernel_trapproc TrapProc;
 _kernel_trapproc UncaughtTrapProc;
 _kernel_eventproc EventProc;
 _kernel_eventproc UnhandledEventProc;
 void (*FastEventProc) (_kernel_eventregisters *);
 int (*UnwindProc) (_kernel_unwindblock *inout, char **language);
 char * (*NameProc) (int pc);
}_kernel_languagedescription;
typedef int _kernel_ccproc(int, int, int);
extern int _kernel_call_client(int a1, int a2, int a3, _kernel_ccproc callee);
extern int _kernel_client_is_module(void);
extern int _kernel_processor_mode(void);
extern void _kernel_irqs_on(void);
extern void _kernel_irqs_off(void);
extern int _kernel_irqs_disabled(void);
extern void *_kernel_RMAalloc(size_t size);
extern void *_kernel_RMAextend(void *p, size_t size);
extern void _kernel_RMAfree(void *p);
#endif
