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