home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
rtsi.com
/
2014.01.www.rtsi.com.tar
/
www.rtsi.com
/
OS9
/
OSK
/
EFFO
/
pd6.lzh
/
SRC
/
kernel.h
< prev
next >
Wrap
Text File
|
1989-12-23
|
8KB
|
429 lines
/*
C BASED FORTH-83 MULTI-TASKING KERNEL DEFINITIONS
Copyright (c) 1989 by Mikael R.K. Patel
*/
/* INCLUDED SYSTEM FUNCTIONS */
#ifdef OSK
#include <strings.h>
#else
#include <string.h>
#endif
/* MISC. */
#define word short
#define TRUE -1L
#define FALSE 0L
#define NIL 0L
#define STREQ(s1, s2) ((*(char *) s1 == *(char *) s2) && \
(*(char *) s1 + 1 == *(char *) s2 + 1) && \
!(strcmp((char *) s1, (char *) s2)))
/* QUEUE DEFINITION */
typedef struct queue {
struct queue *succ, *pred;
} QUEUE;
/* TASK DEFINITION */
typedef struct {
QUEUE queue;
long status;
long *sp;
long *s0;
long *ip;
long *rp;
long *r0;
long *fp;
long *ep;
} TASK_HEADER;
typedef struct {
QUEUE queue;
long status;
long *sp;
long *s0;
long *ip;
long *rp;
long *r0;
long *fp;
long *ep;
long users[1];
} TASK;
/* TASK STATUS FIELD VALUES: ENUMERATE */
#define TERMINATED 0
#define READY 1
#define RUNNING 2
#define IOWAITING 3
#define WAITING 4
#define DELAYED 5
/* STACK MACROS */
#define sinit sp = s0
#define spop tos; tos = *sp++
#define spush(e) { *(--sp) = tos; tos = (long) e; }
#define snth(n) sp[n]
#define sdrop(n) sp += n; tos = *sp++
#define unary(op) (tos = op (tos))
#define binary(op) (tos = *sp++ op (tos))
#define ubinary(op) (tos = (unsigned long) *sp++ op (unsigned long) tos)
#define relation(op) (tos = ((*sp++ op (tos)) ? TRUE : FALSE))
#define urelation(op) (tos = ((unsigned long) *sp++ op (unsigned long) tos) ? TRUE : FALSE)
#define compare(op) (tos = (((tos) op) ? TRUE : FALSE))
#define rinit rp = r0
#define rpop *rp++
#define rpush(e) *(--rp) = (long) e
#define rnth(n) rp[n]
#define rdrop(n) rp += n
/* THREADING ALIGNMENT MACRO */
#define align(p) p = (long *) ((long) ((char *) p + 3) & -4)
/* THREADED BRANCH MACRO */
#define skip ip++
#define branch(to) ip = (long *) ((char *) ip + (to))
#define jump(to) ip = (long *) (to)
/* VOCABULARY ENTRY DEFINITION, TYPES, AND MODES */
typedef struct entry {
struct entry *link;
char *name;
long mode;
long code;
long parameter;
} ENTRY;
/* ENTRY MODE VALUES: SET */
#define NORMAL 0
#define IMMEDIATE 1
#define EXECUTION 2
#define COMPILATION 4
#define HIDDEN 6
#define PRIVATE 8
/* ENTRY CODES */
#define CODE 0
#define COLON 1
#define VARIABLE 2
#define CONSTANT 3
#define VOCABULARY 4
#define CREATE 5
#define USER 6
#define LOCAL 7
#define FORWARD 8
#define FIELD 9
#define EXCEPTION 10
/* ENTRY GENERATORS */
#define SUBR(x) ((long) (void (*) ()) (x))
#define NORMAL_CODE(name, prev, pname, subr) \
static ENTRY name = {&prev, pname, NORMAL, CODE, SUBR(subr)};
#define IMMEDIATE_CODE(name, prev, pname, subr) \
static ENTRY name = {&prev, pname, IMMEDIATE, CODE, SUBR(subr)};
#define COMPILATION_CODE(name, prev, pname, subr) \
static ENTRY name = {&prev, pname, COMPILATION, CODE, SUBR(subr)};
#define EXECUTION_CODE(name, prev, pname, subr) \
static ENTRY name = {&prev, pname, EXECUTION, CODE, SUBR(subr)};
#define COMPILATION_IMMEDIATE_CODE(name, prev, pname, subr) \
static ENTRY name = \
{&prev, pname, COMPILATION + IMMEDIATE, CODE, SUBR(subr)};
#define NORMAL_CONSTANT(name, prev, pname, val) \
static ENTRY name = {&prev, pname, NORMAL, CONSTANT, val};
#define NORMAL_VARIABLE(name, prev, pname, val) \
static ENTRY name = {&prev, pname, NORMAL, VARIABLE, val};
#define NORMAL_VOCABULARY(name, prev, pname, last) \
static ENTRY name = {&prev, pname, NORMAL, VOCABULARY, (long) &last};
/* EXTERN FORWARD DECLARATIONS */
extern long verbose;
extern long quited;
extern long running;
extern long tasking;
extern TASK *tp;
extern TASK *foreground;
extern long tos;
extern long *sp;
extern long *s0;
extern long *ip;
extern long *rp;
extern long *r0;
extern long *fp;
extern long *ep;
extern long *dictionary;
extern long *dp;
extern ENTRY forth;
TASK *maketask();
ENTRY *makeentry();
void kernel_initiate();
void kernel_finish();
void doinner();
void docommand();
void docall();
void doappend();
void doparenbranch();
void doparenqbranch();
void doparendo();
void doparenqdo();
void doparenloop();
void doparenplusloop();
void doparenliteral();
void doparendotquote();
void doparenabortquote();
void doparensemicolon();
void doparendoes();
void dothread();
void dounthread();
void doforwardmark();
void dobackwardmark();
void doforwardresolve();
void dobackwardresolve();
void dounlinklocals();
void doparenlink() ;
void doparenunlink() ;
void doparenunlinksemicolon() ;
void doparenunlinkdoes();
void doparenlocal();
void doparenlocalstore();
void doparenlocalfetch();
void doassignlocal();
void dolocalreturn();
void docurlebracket();
void doparenquote();
void doquote();
void dostringlength();
void dostringcopy();
void dostringequal();
void dostringcat();
void dostringprint();
void domalloc();
void dorealloc();
void dofree();
void doqemptyqueue();
void dointoqueue();
void dooutqueue();
void douser();
void dotask();
void doresume();
void doschedule();
void dodetach();
void doterminate();
void donewexception();
void doparenexceptionsemicolon();
void doparenexceptionunlinksemicolon();
void doparenexception();
void doexception();
void doraise();
void doboolean();
void donot();
void doand();
void door();
void doxor();
void doqwithin();
void dodup();
void dodrop();
void doswap();
void doover();
void dorot();
void dopick();
void doroll();
void doqdup();
void dotor();
void dofromr();
void docopyr();
void dodepth();
void dodots();
void dolessthan();
void doequals();
void dogreaterthan();
void dozeroless();
void dozeroequals();
void dozerogreater();
void doulessthan();
void doplus();
void dominus();
void dooneplus();
void dooneminus();
void dotwoplus();
void dotwominus();
void dotwotimes();
void doleftshift();
void dotimes();
void doumtimes();
void doumdividemod();
void dotwodivide();
void dorightshift();
void dodivide();
void domod();
void dodividemod();
void dotimesdividemod();
void dotimesdivide();
void domin();
void domax();
void doabs();
void donegate();
void dofetch();
void dostore();
void dowfetch();
void dowstore();
void docfetch();
void docstore();
void doffetch();
void dofstore();
void dobfetch();
void dobstore();
void doplusstore();
void docmove();
void docmoveup();
void dofill();
void docount();
void dodashtrailing();
void dobinary();
void dooctal();
void dodecimal();
void dohex();
void doconvert();
void dolesssharp();
void dosharp();
void dosharps();
void dohold();
void dosign();
void dosharpgreater();
void doqnumber();
void dodo();
void doqdo();
void doloop();
void doplusloop();
void doleave();
void doi();
void doj();
void doif();
void doelse();
void dothen();
void docase();
void doof();
void doendof();
void doendcase();
void dobegin();
void dountil();
void dowhile();
void dorepeat();
void doagain();
void dorecurse();
void dotailrecurse();
void doexit();
void doexecute();
void dobye();
void dodot();
void doudot();
void doascii();
void dodotquote();
void dodotparen();
void docr();
void doemit();
void dotype();
void dospace();
void dospaces();
void dokey();
void doexpect();
void doforth83();
void dointerpret();
void doquit();
void doabort();
void doabortquote();
void dohere();
void dotobody();
void dodotname();
void dosharpif();
void dosharpelse();
void dosharpthen();
void dosharpifdef();
void dosharpifundef();
void dosharpinclude();
void dosharppath();
void doparen();
void dobackslash();
void docomma();
void doallot();
void dodoes();
void doimmediate();
void doexecution();
void docompilation();
void doprivate();
void dobracketcompile();
void docompile();
void doqcompile();
void docompiling();
void doliteral();
void doleftbracket();
void dorightbracket();
void doword();
void dolast();
void dodefinitions();
void doonly();
void dorestore();
void dotick();
void dobrackettick();
void dolookup() ;
void docollision();
void dofind();
void doforget();
void dowords();
void doentry();
void doforward();
void docolon();
void dosemicolon();
void docreate();
void dovariable();
void doconstant();
void dovocabulary();
void dofield();