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 >
Text File  |  1989-12-23  |  8KB  |  429 lines

  1. /*
  2.   C BASED FORTH-83 MULTI-TASKING KERNEL DEFINITIONS
  3.  
  4.   Copyright (c) 1989 by Mikael R.K. Patel
  5.  
  6. */
  7.  
  8.  
  9. /* INCLUDED SYSTEM FUNCTIONS */
  10.  
  11. #ifdef OSK
  12. #include <strings.h>
  13. #else
  14. #include <string.h>
  15. #endif
  16.  
  17. /* MISC. */
  18.  
  19. #define word short
  20.  
  21. #define TRUE -1L
  22. #define FALSE 0L
  23. #define NIL 0L
  24.  
  25. #define STREQ(s1, s2) ((*(char *) s1 == *(char *) s2) && \
  26.                       (*(char *) s1 + 1 == *(char *) s2 + 1) && \
  27.                       !(strcmp((char *) s1, (char *) s2)))
  28.  
  29.  
  30. /* QUEUE DEFINITION */
  31.  
  32. typedef struct queue {
  33.     struct queue *succ, *pred;
  34. } QUEUE;
  35.  
  36.  
  37. /* TASK DEFINITION */
  38.  
  39. typedef struct {
  40.     QUEUE queue;
  41.     long status;
  42.     long *sp;
  43.     long *s0;
  44.     long *ip;
  45.     long *rp;
  46.     long *r0;
  47.     long *fp;
  48.     long *ep;
  49. } TASK_HEADER;
  50.  
  51. typedef struct {
  52.     QUEUE queue;
  53.     long status;
  54.     long *sp;
  55.     long *s0;
  56.     long *ip;
  57.     long *rp;
  58.     long *r0;
  59.     long *fp;
  60.     long *ep;
  61.     long users[1];
  62. } TASK;
  63.  
  64.  
  65. /* TASK STATUS FIELD VALUES: ENUMERATE */
  66.  
  67. #define TERMINATED 0
  68. #define READY 1
  69. #define RUNNING 2
  70. #define IOWAITING 3
  71. #define WAITING 4
  72. #define DELAYED 5
  73.  
  74.  
  75. /* STACK MACROS */
  76.  
  77. #define sinit sp = s0
  78. #define spop tos; tos = *sp++
  79. #define spush(e) { *(--sp) = tos; tos = (long) e; }
  80. #define snth(n) sp[n]
  81. #define sdrop(n) sp += n; tos = *sp++
  82.  
  83. #define unary(op) (tos = op (tos))
  84. #define binary(op) (tos = *sp++ op (tos))
  85. #define ubinary(op) (tos = (unsigned long) *sp++ op (unsigned long) tos)
  86. #define relation(op) (tos = ((*sp++ op (tos)) ? TRUE : FALSE))
  87. #define urelation(op) (tos = ((unsigned long) *sp++ op (unsigned long) tos) ? TRUE : FALSE)
  88. #define compare(op) (tos = (((tos) op) ? TRUE : FALSE))
  89.  
  90. #define rinit rp = r0
  91. #define rpop *rp++
  92. #define rpush(e) *(--rp) = (long) e
  93. #define rnth(n) rp[n]
  94. #define rdrop(n) rp += n    
  95.  
  96.  
  97. /* THREADING ALIGNMENT MACRO */
  98.  
  99. #define align(p) p = (long *) ((long) ((char *) p + 3) & -4)
  100.  
  101.  
  102. /* THREADED BRANCH MACRO */
  103.  
  104. #define skip ip++
  105. #define branch(to) ip = (long *) ((char *) ip + (to))
  106. #define jump(to) ip = (long *) (to)
  107.  
  108.     
  109. /* VOCABULARY ENTRY DEFINITION, TYPES, AND MODES */
  110.  
  111. typedef struct entry {
  112.     struct entry *link;
  113.     char *name;
  114.     long mode;
  115.     long code;
  116.     long parameter;
  117. } ENTRY;
  118.  
  119.  
  120. /* ENTRY MODE VALUES: SET */
  121.  
  122. #define NORMAL 0
  123. #define IMMEDIATE 1
  124. #define EXECUTION 2
  125. #define COMPILATION 4
  126. #define HIDDEN 6
  127. #define PRIVATE 8
  128.  
  129.  
  130. /* ENTRY CODES */
  131.  
  132. #define CODE 0
  133. #define COLON 1
  134. #define VARIABLE 2
  135. #define CONSTANT 3
  136. #define VOCABULARY 4
  137. #define CREATE 5
  138. #define USER 6
  139. #define LOCAL 7
  140. #define FORWARD 8
  141. #define FIELD 9
  142. #define EXCEPTION 10
  143.  
  144.  
  145. /* ENTRY GENERATORS */
  146.  
  147. #define SUBR(x) ((long) (void (*) ()) (x))
  148.  
  149. #define NORMAL_CODE(name, prev, pname, subr) \
  150.     static ENTRY name = {&prev, pname, NORMAL, CODE, SUBR(subr)};
  151.  
  152. #define IMMEDIATE_CODE(name, prev, pname, subr) \
  153.     static ENTRY name = {&prev, pname, IMMEDIATE, CODE, SUBR(subr)};
  154.  
  155. #define COMPILATION_CODE(name, prev, pname, subr) \
  156.     static ENTRY name = {&prev, pname, COMPILATION, CODE, SUBR(subr)};
  157.  
  158. #define EXECUTION_CODE(name, prev, pname, subr) \
  159.     static ENTRY name = {&prev, pname, EXECUTION, CODE, SUBR(subr)};
  160.  
  161. #define COMPILATION_IMMEDIATE_CODE(name, prev, pname, subr) \
  162.     static ENTRY name = \
  163.         {&prev, pname, COMPILATION + IMMEDIATE, CODE, SUBR(subr)};
  164.  
  165. #define NORMAL_CONSTANT(name, prev, pname, val) \
  166.     static ENTRY name = {&prev, pname, NORMAL, CONSTANT, val};
  167.  
  168. #define NORMAL_VARIABLE(name, prev, pname, val) \
  169.     static ENTRY name = {&prev, pname, NORMAL, VARIABLE, val};
  170.  
  171. #define NORMAL_VOCABULARY(name, prev, pname, last) \
  172.     static ENTRY name = {&prev, pname, NORMAL, VOCABULARY, (long) &last};
  173.  
  174.  
  175. /* EXTERN FORWARD DECLARATIONS */
  176.  
  177. extern long verbose;
  178. extern long quited;
  179. extern long running;
  180. extern long tasking;
  181.  
  182. extern TASK *tp;
  183. extern TASK *foreground;
  184.  
  185. extern long tos;
  186. extern long *sp;
  187. extern long *s0;
  188.  
  189. extern long *ip;
  190. extern long *rp;
  191. extern long *r0;
  192.  
  193. extern long *fp;
  194. extern long *ep;
  195.  
  196. extern long *dictionary;
  197. extern long *dp;
  198.  
  199. extern ENTRY forth;
  200.  
  201. TASK  *maketask();
  202. ENTRY *makeentry();
  203.  
  204. void kernel_initiate();
  205. void kernel_finish();
  206.  
  207. void doinner();
  208. void docommand();
  209. void docall();
  210. void doappend();
  211. void doparenbranch();
  212. void doparenqbranch();
  213. void doparendo();
  214. void doparenqdo();
  215. void doparenloop();
  216. void doparenplusloop();
  217. void doparenliteral();
  218. void doparendotquote();
  219. void doparenabortquote();
  220. void doparensemicolon();
  221. void doparendoes();
  222. void dothread();
  223. void dounthread();
  224. void doforwardmark();
  225. void dobackwardmark();
  226. void doforwardresolve();
  227. void dobackwardresolve();
  228. void dounlinklocals();
  229. void doparenlink()  ;
  230. void doparenunlink()  ;
  231. void doparenunlinksemicolon() ;
  232. void doparenunlinkdoes();
  233. void doparenlocal();
  234. void doparenlocalstore();
  235. void doparenlocalfetch();
  236. void doassignlocal();
  237. void dolocalreturn();
  238. void docurlebracket();
  239. void doparenquote();
  240. void doquote();
  241. void dostringlength();
  242. void dostringcopy();
  243. void dostringequal();
  244. void dostringcat();
  245. void dostringprint();
  246. void domalloc();
  247. void dorealloc();
  248. void dofree();
  249. void doqemptyqueue();
  250. void dointoqueue();
  251. void dooutqueue();
  252. void douser();
  253. void dotask();
  254. void doresume();
  255. void doschedule();
  256. void dodetach();
  257. void doterminate();
  258. void donewexception();
  259. void doparenexceptionsemicolon();
  260. void doparenexceptionunlinksemicolon();
  261. void doparenexception();
  262. void doexception();
  263. void doraise();
  264. void doboolean();
  265. void donot();
  266. void doand();
  267. void door();
  268. void doxor();
  269. void doqwithin();
  270. void dodup();
  271. void dodrop();
  272. void doswap();
  273. void doover();
  274. void dorot();
  275. void dopick();
  276. void doroll();
  277. void doqdup();
  278. void dotor();
  279. void dofromr();
  280. void docopyr();
  281. void dodepth();
  282. void dodots();
  283. void dolessthan();
  284. void doequals();
  285. void dogreaterthan();
  286. void dozeroless();
  287. void dozeroequals();
  288. void dozerogreater();
  289. void doulessthan();
  290. void doplus();
  291. void dominus();
  292. void dooneplus();
  293. void dooneminus();
  294. void dotwoplus();
  295. void dotwominus();
  296. void dotwotimes();
  297. void doleftshift();
  298. void dotimes();
  299. void doumtimes();
  300. void doumdividemod();
  301. void dotwodivide();
  302. void dorightshift();
  303. void dodivide();
  304. void domod();
  305. void dodividemod();
  306. void dotimesdividemod();
  307. void dotimesdivide();
  308. void domin();
  309. void domax();
  310. void doabs();
  311. void donegate();
  312. void dofetch();
  313. void dostore();
  314. void dowfetch();
  315. void dowstore();
  316. void docfetch();
  317. void docstore();
  318. void doffetch();
  319. void dofstore();
  320. void dobfetch();
  321. void dobstore();
  322. void doplusstore();
  323. void docmove();
  324. void docmoveup();
  325. void dofill();
  326. void docount();
  327. void dodashtrailing();
  328. void dobinary();
  329. void dooctal();
  330. void dodecimal();
  331. void dohex();
  332. void doconvert();
  333. void dolesssharp();
  334. void dosharp();
  335. void dosharps();
  336. void dohold();
  337. void dosign();
  338. void dosharpgreater();
  339. void doqnumber();
  340. void dodo();
  341. void doqdo();
  342. void doloop();
  343. void doplusloop();
  344. void doleave();
  345. void doi();
  346. void doj();
  347. void doif();
  348. void doelse();
  349. void dothen();
  350. void docase();
  351. void doof();
  352. void doendof();
  353. void doendcase();
  354. void dobegin();
  355. void dountil();
  356. void dowhile();
  357. void dorepeat();
  358. void doagain();
  359. void dorecurse();
  360. void dotailrecurse();
  361. void doexit();
  362. void doexecute();
  363. void dobye();
  364. void dodot();
  365. void doudot();
  366. void doascii();
  367. void dodotquote();
  368. void dodotparen();
  369. void docr();
  370. void doemit();
  371. void dotype();
  372. void dospace();
  373. void dospaces();
  374. void dokey();
  375. void doexpect();
  376. void doforth83();
  377. void dointerpret();
  378. void doquit();
  379. void doabort();
  380. void doabortquote();
  381. void dohere();
  382. void dotobody();
  383. void dodotname();
  384. void dosharpif();
  385. void dosharpelse();
  386. void dosharpthen();
  387. void dosharpifdef();
  388. void dosharpifundef();
  389. void dosharpinclude();
  390. void dosharppath();
  391. void doparen();
  392. void dobackslash();
  393. void docomma();
  394. void doallot();
  395. void dodoes();
  396. void doimmediate();
  397. void doexecution();
  398. void docompilation();
  399. void doprivate();
  400. void dobracketcompile();
  401. void docompile();
  402. void doqcompile();
  403. void docompiling();
  404. void doliteral();
  405. void doleftbracket();
  406. void dorightbracket();
  407. void doword();
  408. void dolast();
  409. void dodefinitions();
  410. void doonly();
  411. void dorestore();
  412. void dotick();
  413. void dobrackettick();
  414. void dolookup() ;
  415. void docollision();
  416. void dofind();
  417. void doforget();
  418. void dowords();
  419. void doentry();
  420. void doforward();
  421. void docolon();
  422. void dosemicolon();
  423. void docreate();
  424. void dovariable();
  425. void doconstant();
  426. void dovocabulary();
  427. void dofield();
  428.  
  429.