fixes for M* and UM* from Aleksej
[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
54b27a87 26#define PFORTH_VERSION "26"\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
1cb310e6 38** FV9 - 20100503 - Added support for 64-bit CELL.\r
bb6b2dcd 39*/\r
1cb310e6 40#define PF_FILE_VERSION (9) /* Bump this whenever primitives added. */\r
41#define PF_EARLIEST_FILE_VERSION (9) /* earliest one still compatible */\r
bb6b2dcd 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
1cb310e6 76#define CREATE_BODY_OFFSET (3*sizeof(cell_t))\r
bb6b2dcd 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
82enum 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
1cb310e6 279 /* Added to support 64 bit operation. */\r
280 ID_CELL,\r
281 ID_CELLS,\r
bb6b2dcd 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
bb6b2dcd 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
380typedef struct pfTaskData_s\r
381{\r
1cb310e6 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
bb6b2dcd 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
1cb310e6 393 cell_t *td_InsPtr; /* Instruction pointer, "PC" */\r
bb6b2dcd 394 FileStream *td_InputStream;\r
395/* Terminal. */\r
396 char td_TIB[TIB_SIZE]; /* Buffer for terminal input. */\r
1cb310e6 397 cell_t td_IN; /* Index into Source */\r
398 cell_t td_SourceNum; /* #TIB after REFILL */\r
bb6b2dcd 399 char *td_SourcePtr; /* Pointer to TIB or other source. */\r
1cb310e6 400 cell_t td_LineNumber; /* Incremented on every refill. */\r
401 cell_t td_OUT; /* Current output column. */\r
bb6b2dcd 402} pfTaskData_t;\r
403\r
404typedef 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
411typedef struct cfNameLinks\r
412{\r
1cb310e6 413 cell_t cfnl_PreviousName; /* name relative address of previous */\r
bb6b2dcd 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
419typedef struct pfDictionary_s\r
420{\r
421 pfNode dic_Node;\r
1cb310e6 422 ucell_t dic_Flags;\r
bb6b2dcd 423/* Headers contain pointers to names and dictionary. */\r
424\r
1cb310e6 425 uint8_t *dic_HeaderBaseUnaligned;\r
bb6b2dcd 426\r
1cb310e6 427 uint8_t *dic_HeaderBase;\r
bb6b2dcd 428 union\r
429 {\r
1cb310e6 430 cell_t *Cell;\r
431 uint8_t *Byte;\r
bb6b2dcd 432 } dic_HeaderPtr;\r
1cb310e6 433 uint8_t *dic_HeaderLimit;\r
bb6b2dcd 434/* Code segment contains tokenized code and data. */\r
435\r
1cb310e6 436 uint8_t *dic_CodeBaseUnaligned;\r
bb6b2dcd 437\r
1cb310e6 438 uint8_t *dic_CodeBase;\r
bb6b2dcd 439 union\r
440 {\r
1cb310e6 441 cell_t *Cell;\r
442 uint8_t *Byte;\r
bb6b2dcd 443 } dic_CodePtr;\r
1cb310e6 444 uint8_t *dic_CodeLimit;\r
bb6b2dcd 445} pfDictionary_t;\r
446\r
447/* Save state of include when nesting files. */\r
448typedef struct IncludeFrame\r
449{\r
450 FileStream *inf_FileID;\r
1cb310e6 451 cell_t inf_LineNumber;\r
452 cell_t inf_SourceNum;\r
453 cell_t inf_IN;\r
bb6b2dcd 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
464extern "C" {\r
465#endif\r
466\r
467int 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
476extern pfTaskData_t *gCurrentTask;\r
477extern pfDictionary_t *gCurrentDictionary;\r
478extern char gScratch[TIB_SIZE];\r
1cb310e6 479extern cell_t gNumPrimitives;\r
bb6b2dcd 480\r
481extern ExecToken gLocalCompiler_XT; /* CFA of (LOCAL) compiler. */\r
482extern ExecToken gNumberQ_XT; /* XT of NUMBER? */\r
483extern ExecToken gQuitP_XT; /* XT of (QUIT) */\r
484extern ExecToken gAcceptP_XT; /* XT of ACCEPT */\r
485\r
486#define DEPTH_AT_COLON_INVALID (-100)\r
1cb310e6 487extern cell_t gDepthAtColon;\r
bb6b2dcd 488\r
489/* Global variables. */\r
490extern char *gVarContext; /* Points to last name field. */\r
1cb310e6 491extern cell_t gVarState; /* 1 if compiling. */\r
492extern cell_t gVarBase; /* Numeric Base. */\r
493extern cell_t gVarEcho; /* Echo input from file. */\r
494extern cell_t gVarEchoAccept; /* Echo input from ACCEPT. */\r
495extern cell_t gVarTraceLevel;\r
496extern cell_t gVarTraceStack;\r
497extern cell_t gVarTraceFlags;\r
498extern cell_t gVarQuiet; /* Suppress unnecessary messages, OK, etc. */\r
499extern cell_t gVarReturnCode; /* Returned to caller of Forth, eg. UNIX shell. */\r
bb6b2dcd 500\r
501extern IncludeFrame gIncludeStack[MAX_INCLUDE_DEPTH];\r
1cb310e6 502extern cell_t gIncludeIndex;\r
bb6b2dcd 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
1cb310e6 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
bb6b2dcd 519#define READ_FLOAT_DIC ReadFloatBigEndian\r
1cb310e6 520#define READ_CELL_DIC(addr) ReadCellBigEndian((const uint8_t *)(addr))\r
521#define READ_SHORT_DIC(addr) Read16BigEndian((const uint8_t *)(addr))\r
bb6b2dcd 522\r
523#elif defined(PF_LITTLE_ENDIAN_DIC)\r
524\r
525#define WRITE_FLOAT_DIC WriteFloatLittleEndian\r
1cb310e6 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
bb6b2dcd 528#define READ_FLOAT_DIC ReadFloatLittleEndian\r
1cb310e6 529#define READ_CELL_DIC(addr) ReadCellLittleEndian((const uint8_t *)(addr))\r
530#define READ_SHORT_DIC(addr) Read16LittleEndian((const uint8_t *)(addr))\r
bb6b2dcd 531\r
532#else\r
533\r
534#define WRITE_FLOAT_DIC(addr,data) { *((PF_FLOAT *)(addr)) = (PF_FLOAT)(data); }\r
1cb310e6 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
bb6b2dcd 537#define READ_FLOAT_DIC(addr) ( *((PF_FLOAT *)(addr)) )\r
1cb310e6 538#define READ_CELL_DIC(addr) ( *((const ucell_t *)(addr)) )\r
539#define READ_SHORT_DIC(addr) ( *((const uint16_t *)(addr)) )\r
bb6b2dcd 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
1cb310e6 546#define CODE_COMMA( N ) WRITE_CELL_DIC(CODE_HERE++,(N))\r
bb6b2dcd 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
1cb310e6 552#define IN_CODE_DIC(addr) ( ( ((uint8_t *)(addr)) >= gCurrentDictionary->dic_CodeBase) && ( ((uint8_t *)(addr)) < gCurrentDictionary->dic_CodeLimit) )\r
bb6b2dcd 553\r
1cb310e6 554#define IN_NAME_DIC(addr) ( ( ((uint8_t *)(addr)) >= gCurrentDictionary->dic_HeaderBase) && ( ((uint8_t *)(addr)) < gCurrentDictionary->dic_HeaderLimit) )\r
bb6b2dcd 555#define IN_DICS(addr) (IN_CODE_DIC(addr) || IN_NAME_DIC(addr))\r
556\r
557/* Address conversion */\r
1cb310e6 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
bb6b2dcd 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
1cb310e6 571#define PUSH_DATA_STACK(x) {*(--(gCurrentTask->td_StackPtr)) = (cell_t) x; }\r
bb6b2dcd 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
1cb310e6 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
bb6b2dcd 599\r
1cb310e6 600#define DBUG_NUM_D(msg,num) { pfDebugMessage(msg); pfDebugPrintDecimalNumber((cell_t) num); pfDebugMessage("\n"); }\r
bb6b2dcd 601\r
602#endif /* _pf_guts_h */\r