Fixed POSIX IO, (ACCEPT) now emits SPACE at end of line.
[pforth] / csrc / pf_guts.h
CommitLineData
bb6b2dcd 1/* @(#) pf_guts.h 98/01/28 1.4 */\r
2#ifndef _pf_guts_h\r
3#define _pf_guts_h\r
4\r
5/***************************************************************\r
6** Include file for PForth, a Forth based on 'C'\r
7**\r
8** Author: Phil Burk\r
9** Copyright 1994 3DO, Phil Burk, Larry Polansky, David Rosenboom\r
10**\r
11** The pForth software code is dedicated to the public domain,\r
12** and any third party may reproduce, distribute and modify\r
13** the pForth software code or any derivative works thereof\r
14** without any compensation or license. The pForth software\r
15** code is provided on an "as is" basis without any warranty\r
16** of any kind, including, without limitation, the implied\r
17** warranties of merchantability and fitness for a particular\r
18** purpose and their equivalents under the laws of any jurisdiction.\r
19**\r
20***************************************************************/\r
21\r
22/*\r
23** PFORTH_VERSION changes when PForth is modified and released.\r
24** See README file for version info.\r
25*/\r
6b91cb54 26#define PFORTH_VERSION "24"\r
bb6b2dcd 27\r
28/*\r
29** PFORTH_FILE_VERSION changes when incompatible changes are made\r
30** in the ".dic" file format.\r
31**\r
32** FV3 - 950225 - Use ABS_TO_CODEREL for CodePtr. See file "pf_save.c".\r
33** FV4 - 950309 - Added NameSize and CodeSize to pfSaveForth().\r
34** FV5 - 950316 - Added Floats and reserved words.\r
35** FV6 - 961213 - Added ID_LOCAL_PLUSSTORE, ID_COLON_P, etc.\r
36** FV7 - 971203 - Added ID_FILL, (1LOCAL@), etc., ran out of reserved, resorted.\r
37** FV8 - 980818 - Added Endian flag.\r
38*/\r
39#define PF_FILE_VERSION (8) /* Bump this whenever primitives added. */\r
40#define PF_EARLIEST_FILE_VERSION (8) /* earliest one still compatible */\r
41\r
42/***************************************************************\r
43** Sizes and other constants\r
44***************************************************************/\r
45\r
46#define TIB_SIZE (256)\r
47\r
48#ifndef FALSE\r
49 #define FALSE (0)\r
50#endif\r
51#ifndef TRUE\r
52 #define TRUE (1)\r
53#endif\r
54\r
55#define FFALSE (0)\r
56#define FTRUE (-1)\r
57#define BLANK (' ')\r
58\r
59#define FLAG_PRECEDENCE (0x80)\r
60#define FLAG_IMMEDIATE (0x40)\r
61#define FLAG_SMUDGE (0x20)\r
62#define MASK_NAME_SIZE (0x1F)\r
63\r
64/* Debug TRACE flags */\r
65#define TRACE_INNER (0x0002)\r
66#define TRACE_COMPILE (0x0004)\r
67#define TRACE_SPECIAL (0x0008)\r
68\r
69/* Numeric types returned by NUMBER? */\r
70#define NUM_TYPE_BAD (0)\r
71#define NUM_TYPE_SINGLE (1)\r
72#define NUM_TYPE_DOUBLE (2)\r
73#define NUM_TYPE_FLOAT (3)\r
74\r
75#define CREATE_BODY_OFFSET (3*sizeof(cell))\r
76\r
77/***************************************************************\r
78** Primitive Token IDS\r
79** Do NOT change the order of these IDs or dictionary files will break!\r
80***************************************************************/\r
81enum cforth_primitive_ids\r
82{\r
83 ID_EXIT = 0, /* ID_EXIT must always be zero. */\r
84/* Do NOT change the order of these IDs or dictionary files will break! */\r
85 ID_1MINUS,\r
86 ID_1PLUS,\r
87 ID_2DUP,\r
88 ID_2LITERAL,\r
89 ID_2LITERAL_P,\r
90 ID_2MINUS,\r
91 ID_2OVER,\r
92 ID_2PLUS,\r
93 ID_2SWAP,\r
94 ID_2_R_FETCH,\r
95 ID_2_R_FROM,\r
96 ID_2_TO_R,\r
97 ID_ACCEPT_P,\r
98 ID_ALITERAL,\r
99 ID_ALITERAL_P,\r
100 ID_ALLOCATE,\r
101 ID_AND,\r
102 ID_ARSHIFT,\r
103 ID_BAIL,\r
104 ID_BODY_OFFSET,\r
105 ID_BRANCH,\r
106 ID_BYE,\r
107 ID_CALL_C,\r
108 ID_CFETCH,\r
109 ID_CMOVE,\r
110 ID_CMOVE_UP,\r
111 ID_COLON,\r
112 ID_COLON_P,\r
113 ID_COMPARE,\r
114 ID_COMP_EQUAL,\r
115 ID_COMP_GREATERTHAN,\r
116 ID_COMP_LESSTHAN,\r
117 ID_COMP_NOT_EQUAL,\r
118 ID_COMP_U_GREATERTHAN,\r
119 ID_COMP_U_LESSTHAN,\r
120 ID_COMP_ZERO_EQUAL,\r
121 ID_COMP_ZERO_GREATERTHAN,\r
122 ID_COMP_ZERO_LESSTHAN,\r
123 ID_COMP_ZERO_NOT_EQUAL,\r
124 ID_CR,\r
125 ID_CREATE,\r
126 ID_CREATE_P,\r
127 ID_CSTORE,\r
128 ID_DEFER,\r
129 ID_DEFER_P,\r
130 ID_DEPTH,\r
131 ID_DIVIDE,\r
132 ID_DOT,\r
133 ID_DOTS,\r
134 ID_DO_P,\r
135 ID_DROP,\r
136 ID_DUMP,\r
137 ID_DUP,\r
138 ID_D_MINUS,\r
139 ID_D_MTIMES,\r
140 ID_D_MUSMOD,\r
141 ID_D_PLUS,\r
142 ID_D_UMSMOD,\r
143 ID_D_UMTIMES,\r
144 ID_EMIT,\r
145 ID_EMIT_P,\r
146 ID_EOL,\r
147 ID_ERRORQ_P,\r
148 ID_EXECUTE,\r
149 ID_FETCH,\r
150 ID_FILE_CLOSE,\r
151 ID_FILE_CREATE,\r
152 ID_FILE_OPEN,\r
153 ID_FILE_POSITION,\r
154 ID_FILE_READ,\r
155 ID_FILE_REPOSITION,\r
156 ID_FILE_RO,\r
157 ID_FILE_RW,\r
158 ID_FILE_SIZE,\r
159 ID_FILE_WRITE,\r
160 ID_FILL,\r
161 ID_FIND,\r
162 ID_FINDNFA,\r
163 ID_FLUSHEMIT,\r
164 ID_FREE,\r
165 ID_HERE,\r
166 ID_NUMBERQ_P,\r
167 ID_I,\r
168 ID_INCLUDE_FILE,\r
169 ID_J,\r
170 ID_KEY,\r
171 ID_LEAVE_P,\r
172 ID_LITERAL,\r
173 ID_LITERAL_P,\r
174 ID_LOADSYS,\r
175 ID_LOCAL_COMPILER,\r
176 ID_LOCAL_ENTRY,\r
177 ID_LOCAL_EXIT,\r
178 ID_LOCAL_FETCH,\r
179 ID_LOCAL_FETCH_1,\r
180 ID_LOCAL_FETCH_2,\r
181 ID_LOCAL_FETCH_3,\r
182 ID_LOCAL_FETCH_4,\r
183 ID_LOCAL_FETCH_5,\r
184 ID_LOCAL_FETCH_6,\r
185 ID_LOCAL_FETCH_7,\r
186 ID_LOCAL_FETCH_8,\r
187 ID_LOCAL_PLUSSTORE,\r
188 ID_LOCAL_STORE,\r
189 ID_LOCAL_STORE_1,\r
190 ID_LOCAL_STORE_2,\r
191 ID_LOCAL_STORE_3,\r
192 ID_LOCAL_STORE_4,\r
193 ID_LOCAL_STORE_5,\r
194 ID_LOCAL_STORE_6,\r
195 ID_LOCAL_STORE_7,\r
196 ID_LOCAL_STORE_8,\r
197 ID_LOOP_P,\r
198 ID_LSHIFT,\r
199 ID_MAX,\r
200 ID_MIN,\r
201 ID_MINUS,\r
202 ID_NAME_TO_PREVIOUS,\r
203 ID_NAME_TO_TOKEN,\r
204 ID_NOOP,\r
205 ID_NUMBERQ,\r
206 ID_OR,\r
207 ID_OVER,\r
208 ID_PICK,\r
209 ID_PLUS,\r
210 ID_PLUSLOOP_P,\r
211 ID_PLUS_STORE,\r
212 ID_QDO_P,\r
213 ID_QDUP,\r
214 ID_QTERMINAL,\r
215 ID_QUIT_P,\r
216 ID_REFILL,\r
217 ID_RESIZE,\r
218 ID_RESTORE_INPUT,\r
219 ID_ROLL,\r
220 ID_ROT,\r
221 ID_RP_FETCH,\r
222 ID_RP_STORE,\r
223 ID_RSHIFT,\r
224 ID_R_DROP,\r
225 ID_R_FETCH,\r
226 ID_R_FROM,\r
227 ID_SAVE_FORTH_P,\r
228 ID_SAVE_INPUT,\r
229 ID_SCAN,\r
230 ID_SEMICOLON,\r
231 ID_SKIP,\r
232 ID_SOURCE,\r
233 ID_SOURCE_ID,\r
234 ID_SOURCE_ID_POP,\r
235 ID_SOURCE_ID_PUSH,\r
236 ID_SOURCE_SET,\r
237 ID_SP_FETCH,\r
238 ID_SP_STORE,\r
239 ID_STORE,\r
240 ID_SWAP,\r
241 ID_TEST1,\r
242 ID_TEST2,\r
243 ID_TEST3,\r
244 ID_TICK,\r
245 ID_TIMES,\r
246 ID_TO_R,\r
247 ID_TYPE,\r
248 ID_TYPE_P,\r
249 ID_VAR_BASE,\r
250 ID_VAR_CODE_BASE,\r
251 ID_VAR_CODE_LIMIT,\r
252 ID_VAR_CONTEXT,\r
253 ID_VAR_DP,\r
254 ID_VAR_ECHO,\r
255 ID_VAR_HEADERS_BASE,\r
256 ID_VAR_HEADERS_LIMIT,\r
257 ID_VAR_HEADERS_PTR,\r
258 ID_VAR_NUM_TIB,\r
259 ID_VAR_OUT,\r
260 ID_VAR_RETURN_CODE,\r
261 ID_VAR_SOURCE_ID,\r
262 ID_VAR_STATE,\r
263 ID_VAR_TO_IN,\r
264 ID_VAR_TRACE_FLAGS,\r
265 ID_VAR_TRACE_LEVEL,\r
266 ID_VAR_TRACE_STACK,\r
267 ID_VLIST,\r
268 ID_WORD,\r
269 ID_WORD_FETCH,\r
270 ID_WORD_STORE,\r
271 ID_XOR,\r
272 ID_ZERO_BRANCH,\r
273 ID_CATCH,\r
274 ID_THROW,\r
275 ID_INTERPRET,\r
276 ID_FILE_WO,\r
277 ID_FILE_BIN,\r
278/* If you add a word here, take away one reserved word below. */\r
279#ifdef PF_SUPPORT_FP\r
280/* Only reserve space if we are adding FP so that we can detect\r
281** unsupported primitives when loading dictionary.\r
282*/\r
283 ID_RESERVED01,\r
284 ID_RESERVED02,\r
285 ID_RESERVED03,\r
286 ID_RESERVED04,\r
287 ID_RESERVED05,\r
288 ID_RESERVED06,\r
289 ID_RESERVED07,\r
290 ID_RESERVED08,\r
291 ID_RESERVED09,\r
292 ID_RESERVED10,\r
293 ID_RESERVED11,\r
294 ID_RESERVED12,\r
295 ID_RESERVED13,\r
296 ID_RESERVED14,\r
297 ID_RESERVED15,\r
298 ID_RESERVED16,\r
299 ID_FP_D_TO_F,\r
300 ID_FP_FSTORE,\r
301 ID_FP_FTIMES,\r
302 ID_FP_FPLUS,\r
303 ID_FP_FMINUS,\r
304 ID_FP_FSLASH,\r
305 ID_FP_F_ZERO_LESS_THAN,\r
306 ID_FP_F_ZERO_EQUALS,\r
307 ID_FP_F_LESS_THAN,\r
308 ID_FP_F_TO_D,\r
309 ID_FP_FFETCH,\r
310 ID_FP_FDEPTH,\r
311 ID_FP_FDROP,\r
312 ID_FP_FDUP,\r
313 ID_FP_FLITERAL,\r
314 ID_FP_FLITERAL_P,\r
315 ID_FP_FLOAT_PLUS,\r
316 ID_FP_FLOATS,\r
317 ID_FP_FLOOR,\r
318 ID_FP_FMAX,\r
319 ID_FP_FMIN,\r
320 ID_FP_FNEGATE,\r
321 ID_FP_FOVER,\r
322 ID_FP_FROT,\r
323 ID_FP_FROUND,\r
324 ID_FP_FSWAP,\r
325 ID_FP_FSTAR_STAR,\r
326 ID_FP_FABS,\r
327 ID_FP_FACOS,\r
328 ID_FP_FACOSH,\r
329 ID_FP_FALOG,\r
330 ID_FP_FASIN,\r
331 ID_FP_FASINH,\r
332 ID_FP_FATAN,\r
333 ID_FP_FATAN2,\r
334 ID_FP_FATANH,\r
335 ID_FP_FCOS,\r
336 ID_FP_FCOSH,\r
337 ID_FP_FLN,\r
338 ID_FP_FLNP1,\r
339 ID_FP_FLOG,\r
340 ID_FP_FSIN,\r
341 ID_FP_FSINCOS,\r
342 ID_FP_FSINH,\r
343 ID_FP_FSQRT,\r
344 ID_FP_FTAN,\r
345 ID_FP_FTANH,\r
346 ID_FP_FPICK,\r
347#endif\r
348/* Add new IDs by replacing reserved IDs or extending FP routines. */\r
349/* Do NOT change the order of these IDs or dictionary files will break! */\r
350 NUM_PRIMITIVES /* This must always be LAST */\r
351};\r
352\r
353\r
354\r
355/***************************************************************\r
356** THROW Codes\r
357***************************************************************/\r
358/* ANSI standard definitions needed by pForth */\r
359#define THROW_ABORT (-1)\r
360#define THROW_ABORT_QUOTE (-2)\r
361#define THROW_STACK_OVERFLOW (-3)\r
362#define THROW_STACK_UNDERFLOW (-4)\r
363#define THROW_UNDEFINED_WORD (-13)\r
364#define THROW_EXECUTING (-14)\r
365#define THROW_PAIRS (-22)\r
366#define THROW_FLOAT_STACK_UNDERFLOW ( -45)\r
367#define THROW_QUIT (-56)\r
368\r
369/* THROW codes unique to pForth */\r
370#define THROW_BYE (-256) /* Exit program. */\r
371#define THROW_SEMICOLON (-257) /* Error detected at ; */\r
372#define THROW_DEFERRED (-258) /* Not a deferred word. Used in system.fth */\r
373\r
374/***************************************************************\r
375** Structures\r
376***************************************************************/\r
377\r
378typedef struct pfTaskData_s\r
379{\r
380 cell *td_StackPtr; /* Primary data stack */\r
381 cell *td_StackBase;\r
382 cell *td_StackLimit;\r
383 cell *td_ReturnPtr; /* Return stack */\r
384 cell *td_ReturnBase;\r
385 cell *td_ReturnLimit;\r
386#ifdef PF_SUPPORT_FP\r
387 PF_FLOAT *td_FloatStackPtr;\r
388 PF_FLOAT *td_FloatStackBase;\r
389 PF_FLOAT *td_FloatStackLimit;\r
390#endif\r
391 cell *td_InsPtr; /* Instruction pointer, "PC" */\r
392 FileStream *td_InputStream;\r
393/* Terminal. */\r
394 char td_TIB[TIB_SIZE]; /* Buffer for terminal input. */\r
395 cell td_IN; /* Index into Source */\r
396 cell td_SourceNum; /* #TIB after REFILL */\r
397 char *td_SourcePtr; /* Pointer to TIB or other source. */\r
398 int32 td_LineNumber; /* Incremented on every refill. */\r
399 cell td_OUT; /* Current output column. */\r
400} pfTaskData_t;\r
401\r
402typedef struct pfNode\r
403{\r
404 struct pfNode *n_Next;\r
405 struct pfNode *n_Prev;\r
406} pfNode;\r
407\r
408/* Structure of header entry in dictionary. These will be stored in dictionary specific endian format*/\r
409typedef struct cfNameLinks\r
410{\r
411 cell cfnl_PreviousName; /* name relative address of previous */\r
412 ExecToken cfnl_ExecToken; /* Execution token for word. */\r
413/* Followed by variable length name field. */\r
414} cfNameLinks;\r
415\r
416#define PF_DICF_ALLOCATED_SEGMENTS ( 0x0001)\r
417typedef struct pfDictionary_s\r
418{\r
419 pfNode dic_Node;\r
420 uint32 dic_Flags;\r
421/* Headers contain pointers to names and dictionary. */\r
422\r
423 uint8 *dic_HeaderBaseUnaligned;\r
424\r
425 uint8 *dic_HeaderBase;\r
426 union\r
427 {\r
428 cell *Cell;\r
429 uint8 *Byte;\r
430 } dic_HeaderPtr;\r
431 uint8 *dic_HeaderLimit;\r
432/* Code segment contains tokenized code and data. */\r
433\r
434 uint8 *dic_CodeBaseUnaligned;\r
435\r
436 uint8 *dic_CodeBase;\r
437 union\r
438 {\r
439 cell *Cell;\r
440 uint8 *Byte;\r
441 } dic_CodePtr;\r
442 uint8 *dic_CodeLimit;\r
443} pfDictionary_t;\r
444\r
445/* Save state of include when nesting files. */\r
446typedef struct IncludeFrame\r
447{\r
448 FileStream *inf_FileID;\r
449 int32 inf_LineNumber;\r
450 int32 inf_SourceNum;\r
451 int32 inf_IN;\r
452 char inf_SaveTIB[TIB_SIZE];\r
453} IncludeFrame;\r
454\r
455#define MAX_INCLUDE_DEPTH (16)\r
456\r
457/***************************************************************\r
458** Prototypes\r
459***************************************************************/\r
460\r
461#ifdef __cplusplus\r
462extern "C" {\r
463#endif\r
464\r
465int pfCatch( ExecToken XT );\r
466\r
467#ifdef __cplusplus\r
468}\r
469#endif\r
470\r
471/***************************************************************\r
472** External Globals\r
473***************************************************************/\r
474extern pfTaskData_t *gCurrentTask;\r
475extern pfDictionary_t *gCurrentDictionary;\r
476extern char gScratch[TIB_SIZE];\r
477extern int32 gNumPrimitives;\r
478\r
479extern ExecToken gLocalCompiler_XT; /* CFA of (LOCAL) compiler. */\r
480extern ExecToken gNumberQ_XT; /* XT of NUMBER? */\r
481extern ExecToken gQuitP_XT; /* XT of (QUIT) */\r
482extern ExecToken gAcceptP_XT; /* XT of ACCEPT */\r
483\r
484#define DEPTH_AT_COLON_INVALID (-100)\r
485extern int32 gDepthAtColon;\r
486\r
487/* Global variables. */\r
488extern char *gVarContext; /* Points to last name field. */\r
489extern cell gVarState; /* 1 if compiling. */\r
490extern cell gVarBase; /* Numeric Base. */\r
491extern cell gVarEcho; /* Echo input from file. */\r
492extern cell gVarEchoAccept; /* Echo input from ACCEPT. */\r
493extern cell gVarTraceLevel;\r
494extern cell gVarTraceStack;\r
495extern cell gVarTraceFlags;\r
496extern cell gVarQuiet; /* Suppress unnecessary messages, OK, etc. */\r
497extern cell gVarReturnCode; /* Returned to caller of Forth, eg. UNIX shell. */\r
498\r
499extern IncludeFrame gIncludeStack[MAX_INCLUDE_DEPTH];\r
500extern int32 gIncludeIndex;\r
501/***************************************************************\r
502** Macros\r
503***************************************************************/\r
504\r
505\r
506/* Endian specific macros for creating target dictionaries for machines with\r
507\r
508** different endian-ness.\r
509\r
510*/\r
511\r
512#if defined(PF_BIG_ENDIAN_DIC)\r
513\r
514#define WRITE_FLOAT_DIC WriteFloatBigEndian\r
515#define WRITE_LONG_DIC(addr,data) WriteLongBigEndian((uint32 *)(addr),(uint32)(data))\r
516#define WRITE_SHORT_DIC(addr,data) WriteShortBigEndian((uint16 *)(addr),(uint16)(data))\r
517#define READ_FLOAT_DIC ReadFloatBigEndian\r
518#define READ_LONG_DIC(addr) ReadLongBigEndian((const uint32 *)(addr))\r
519#define READ_SHORT_DIC(addr) ReadShortBigEndian((const uint16 *)(addr))\r
520\r
521#elif defined(PF_LITTLE_ENDIAN_DIC)\r
522\r
523#define WRITE_FLOAT_DIC WriteFloatLittleEndian\r
524#define WRITE_LONG_DIC(addr,data) WriteLongLittleEndian((uint32 *)(addr),(uint32)(data))\r
525#define WRITE_SHORT_DIC(addr,data) WriteShortLittleEndian((uint16 *)(addr),(uint16)(data))\r
526#define READ_FLOAT_DIC ReadFloatLittleEndian\r
527#define READ_LONG_DIC(addr) ReadLongLittleEndian((const uint32 *)(addr))\r
528#define READ_SHORT_DIC(addr) ReadShortLittleEndian((const uint16 *)(addr))\r
529\r
530#else\r
531\r
532#define WRITE_FLOAT_DIC(addr,data) { *((PF_FLOAT *)(addr)) = (PF_FLOAT)(data); }\r
533#define WRITE_LONG_DIC(addr,data) { *((int32 *)(addr)) = (int32)(data); }\r
534#define WRITE_SHORT_DIC(addr,data) { *((int16 *)(addr)) = (int16)(data); }\r
535#define READ_FLOAT_DIC(addr) ( *((PF_FLOAT *)(addr)) )\r
536#define READ_LONG_DIC(addr) ( *((const uint32 *)(addr)) )\r
537#define READ_SHORT_DIC(addr) ( *((const uint16 *)(addr)) )\r
538\r
539#endif\r
540\r
541\r
542#define HEADER_HERE (gCurrentDictionary->dic_HeaderPtr.Cell)\r
543#define CODE_HERE (gCurrentDictionary->dic_CodePtr.Cell)\r
544#define CODE_COMMA( N ) WRITE_LONG_DIC(CODE_HERE++,(N))\r
545#define NAME_BASE (gCurrentDictionary->dic_HeaderBase)\r
546#define CODE_BASE (gCurrentDictionary->dic_CodeBase)\r
547#define NAME_SIZE (gCurrentDictionary->dic_HeaderLimit - gCurrentDictionary->dic_HeaderBase)\r
548#define CODE_SIZE (gCurrentDictionary->dic_CodeLimit - gCurrentDictionary->dic_CodeBase)\r
549\r
550#define IN_CODE_DIC(addr) ( ( ((uint8 *)(addr)) >= gCurrentDictionary->dic_CodeBase) && ( ((uint8 *)(addr)) < gCurrentDictionary->dic_CodeLimit) )\r
551\r
552#define IN_NAME_DIC(addr) ( ( ((uint8 *)(addr)) >= gCurrentDictionary->dic_HeaderBase) && ( ((uint8 *)(addr)) < gCurrentDictionary->dic_HeaderLimit) )\r
553#define IN_DICS(addr) (IN_CODE_DIC(addr) || IN_NAME_DIC(addr))\r
554\r
555/* Address conversion */\r
556#define ABS_TO_NAMEREL( a ) ((int32) (((uint8 *) a) - NAME_BASE ))\r
557#define ABS_TO_CODEREL( a ) ((int32) (((uint8 *) a) - CODE_BASE ))\r
558#define NAMEREL_TO_ABS( a ) ((char *) (((int32) a) + NAME_BASE))\r
559#define CODEREL_TO_ABS( a ) ((cell *) (((int32) a) + CODE_BASE))\r
560\r
561/* The check for >0 is only needed for CLONE testing. !!! */\r
562#define IsTokenPrimitive(xt) ((xt<gNumPrimitives) && (xt>=0))\r
563\r
564#define FREE_VAR(v) { if (v) { pfFreeMem(v); v = NULL; } }\r
565\r
566#define DATA_STACK_DEPTH (gCurrentTask->td_StackBase - gCurrentTask->td_StackPtr)\r
567#define DROP_DATA_STACK (gCurrentTask->td_StackPtr++)\r
568#define POP_DATA_STACK (*gCurrentTask->td_StackPtr++)\r
569#define PUSH_DATA_STACK(x) {*(--(gCurrentTask->td_StackPtr)) = (cell) x; }\r
570\r
571/* Force Quad alignment. */\r
572#define QUADUP(x) (((x)+3)&~3)\r
573\r
574#define MIN(a,b) ( ((a)<(b)) ? (a) : (b) )\r
575#define MAX(a,b) ( ((a)>(b)) ? (a) : (b) )\r
576\r
577\r
578#ifndef TOUCH\r
579 #define TOUCH(argument) ((void)argument)\r
580#endif\r
581\r
582/***************************************************************\r
583** I/O related macros\r
584***************************************************************/\r
585\r
586#define EMIT(c) ioEmit(c)\r
587#define EMIT_CR EMIT('\n');\r
588\r
589#define MSG(cs) pfMessage(cs)\r
590#define ERR(x) MSG(x)\r
591\r
592#define DBUG(x) /* PRT(x) */\r
593#define DBUGX(x) /* DBUG(x) */\r
594\r
595#define MSG_NUM_D(msg,num) { MSG(msg); ffDot((int32) num); EMIT_CR; }\r
596#define MSG_NUM_H(msg,num) { MSG(msg); ffDotHex((int32) num); EMIT_CR; }\r
597\r
598#define DBUG_NUM_D(msg,num) { pfDebugMessage(msg); pfDebugPrintDecimalNumber((int32) num); pfDebugMessage("\n"); }\r
599\r
600#endif /* _pf_guts_h */\r