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 |
90975d26 |
26 | #define PFORTH_VERSION "27"\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 |
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 |
1cb310e6 |
279 | /* Added to support 64 bit operation. */\r |
280 | ID_CELL,\r |
281 | ID_CELLS,\r |
81dfa5e0 |
282 | /* DELETE-FILE */\r |
283 | ID_FILE_DELETE,\r |
bb6b2dcd |
284 | /* If you add a word here, take away one reserved word below. */\r |
285 | #ifdef PF_SUPPORT_FP\r |
286 | /* Only reserve space if we are adding FP so that we can detect\r |
287 | ** unsupported primitives when loading dictionary.\r |
288 | */\r |
289 | ID_RESERVED01,\r |
290 | ID_RESERVED02,\r |
291 | ID_RESERVED03,\r |
292 | ID_RESERVED04,\r |
293 | ID_RESERVED05,\r |
294 | ID_RESERVED06,\r |
295 | ID_RESERVED07,\r |
296 | ID_RESERVED08,\r |
297 | ID_RESERVED09,\r |
298 | ID_RESERVED10,\r |
299 | ID_RESERVED11,\r |
300 | ID_RESERVED12,\r |
301 | ID_RESERVED13,\r |
bb6b2dcd |
302 | ID_FP_D_TO_F,\r |
303 | ID_FP_FSTORE,\r |
304 | ID_FP_FTIMES,\r |
305 | ID_FP_FPLUS,\r |
306 | ID_FP_FMINUS,\r |
307 | ID_FP_FSLASH,\r |
308 | ID_FP_F_ZERO_LESS_THAN,\r |
309 | ID_FP_F_ZERO_EQUALS,\r |
310 | ID_FP_F_LESS_THAN,\r |
311 | ID_FP_F_TO_D,\r |
312 | ID_FP_FFETCH,\r |
313 | ID_FP_FDEPTH,\r |
314 | ID_FP_FDROP,\r |
315 | ID_FP_FDUP,\r |
316 | ID_FP_FLITERAL,\r |
317 | ID_FP_FLITERAL_P,\r |
318 | ID_FP_FLOAT_PLUS,\r |
319 | ID_FP_FLOATS,\r |
320 | ID_FP_FLOOR,\r |
321 | ID_FP_FMAX,\r |
322 | ID_FP_FMIN,\r |
323 | ID_FP_FNEGATE,\r |
324 | ID_FP_FOVER,\r |
325 | ID_FP_FROT,\r |
326 | ID_FP_FROUND,\r |
327 | ID_FP_FSWAP,\r |
328 | ID_FP_FSTAR_STAR,\r |
329 | ID_FP_FABS,\r |
330 | ID_FP_FACOS,\r |
331 | ID_FP_FACOSH,\r |
332 | ID_FP_FALOG,\r |
333 | ID_FP_FASIN,\r |
334 | ID_FP_FASINH,\r |
335 | ID_FP_FATAN,\r |
336 | ID_FP_FATAN2,\r |
337 | ID_FP_FATANH,\r |
338 | ID_FP_FCOS,\r |
339 | ID_FP_FCOSH,\r |
340 | ID_FP_FLN,\r |
341 | ID_FP_FLNP1,\r |
342 | ID_FP_FLOG,\r |
343 | ID_FP_FSIN,\r |
344 | ID_FP_FSINCOS,\r |
345 | ID_FP_FSINH,\r |
346 | ID_FP_FSQRT,\r |
347 | ID_FP_FTAN,\r |
348 | ID_FP_FTANH,\r |
349 | ID_FP_FPICK,\r |
350 | #endif\r |
351 | /* Add new IDs by replacing reserved IDs or extending FP routines. */\r |
352 | /* Do NOT change the order of these IDs or dictionary files will break! */\r |
353 | NUM_PRIMITIVES /* This must always be LAST */\r |
354 | };\r |
355 | \r |
356 | \r |
357 | \r |
358 | /***************************************************************\r |
359 | ** THROW Codes\r |
360 | ***************************************************************/\r |
361 | /* ANSI standard definitions needed by pForth */\r |
362 | #define THROW_ABORT (-1)\r |
363 | #define THROW_ABORT_QUOTE (-2)\r |
364 | #define THROW_STACK_OVERFLOW (-3)\r |
365 | #define THROW_STACK_UNDERFLOW (-4)\r |
366 | #define THROW_UNDEFINED_WORD (-13)\r |
367 | #define THROW_EXECUTING (-14)\r |
368 | #define THROW_PAIRS (-22)\r |
369 | #define THROW_FLOAT_STACK_UNDERFLOW ( -45)\r |
370 | #define THROW_QUIT (-56)\r |
371 | \r |
372 | /* THROW codes unique to pForth */\r |
373 | #define THROW_BYE (-256) /* Exit program. */\r |
374 | #define THROW_SEMICOLON (-257) /* Error detected at ; */\r |
375 | #define THROW_DEFERRED (-258) /* Not a deferred word. Used in system.fth */\r |
376 | \r |
377 | /***************************************************************\r |
378 | ** Structures\r |
379 | ***************************************************************/\r |
380 | \r |
381 | typedef struct pfTaskData_s\r |
382 | {\r |
1cb310e6 |
383 | cell_t *td_StackPtr; /* Primary data stack */\r |
384 | cell_t *td_StackBase;\r |
385 | cell_t *td_StackLimit;\r |
386 | cell_t *td_ReturnPtr; /* Return stack */\r |
387 | cell_t *td_ReturnBase;\r |
388 | cell_t *td_ReturnLimit;\r |
bb6b2dcd |
389 | #ifdef PF_SUPPORT_FP\r |
390 | PF_FLOAT *td_FloatStackPtr;\r |
391 | PF_FLOAT *td_FloatStackBase;\r |
392 | PF_FLOAT *td_FloatStackLimit;\r |
393 | #endif\r |
1cb310e6 |
394 | cell_t *td_InsPtr; /* Instruction pointer, "PC" */\r |
bb6b2dcd |
395 | FileStream *td_InputStream;\r |
396 | /* Terminal. */\r |
397 | char td_TIB[TIB_SIZE]; /* Buffer for terminal input. */\r |
1cb310e6 |
398 | cell_t td_IN; /* Index into Source */\r |
399 | cell_t td_SourceNum; /* #TIB after REFILL */\r |
bb6b2dcd |
400 | char *td_SourcePtr; /* Pointer to TIB or other source. */\r |
1cb310e6 |
401 | cell_t td_LineNumber; /* Incremented on every refill. */\r |
402 | cell_t td_OUT; /* Current output column. */\r |
bb6b2dcd |
403 | } pfTaskData_t;\r |
404 | \r |
405 | typedef struct pfNode\r |
406 | {\r |
407 | struct pfNode *n_Next;\r |
408 | struct pfNode *n_Prev;\r |
409 | } pfNode;\r |
410 | \r |
411 | /* Structure of header entry in dictionary. These will be stored in dictionary specific endian format*/\r |
412 | typedef struct cfNameLinks\r |
413 | {\r |
1cb310e6 |
414 | cell_t cfnl_PreviousName; /* name relative address of previous */\r |
bb6b2dcd |
415 | ExecToken cfnl_ExecToken; /* Execution token for word. */\r |
416 | /* Followed by variable length name field. */\r |
417 | } cfNameLinks;\r |
418 | \r |
419 | #define PF_DICF_ALLOCATED_SEGMENTS ( 0x0001)\r |
420 | typedef struct pfDictionary_s\r |
421 | {\r |
422 | pfNode dic_Node;\r |
1cb310e6 |
423 | ucell_t dic_Flags;\r |
bb6b2dcd |
424 | /* Headers contain pointers to names and dictionary. */\r |
425 | \r |
b3ad2602 |
426 | ucell_t dic_HeaderBaseUnaligned;\r |
bb6b2dcd |
427 | \r |
b3ad2602 |
428 | ucell_t dic_HeaderBase;\r |
429 | ucell_t dic_HeaderPtr;\r |
430 | ucell_t dic_HeaderLimit;\r |
bb6b2dcd |
431 | /* Code segment contains tokenized code and data. */\r |
b3ad2602 |
432 | ucell_t dic_CodeBaseUnaligned;\r |
b3ad2602 |
433 | ucell_t dic_CodeBase;\r |
bb6b2dcd |
434 | union\r |
435 | {\r |
1cb310e6 |
436 | cell_t *Cell;\r |
437 | uint8_t *Byte;\r |
bb6b2dcd |
438 | } dic_CodePtr;\r |
b3ad2602 |
439 | ucell_t dic_CodeLimit;\r |
bb6b2dcd |
440 | } pfDictionary_t;\r |
441 | \r |
442 | /* Save state of include when nesting files. */\r |
443 | typedef struct IncludeFrame\r |
444 | {\r |
445 | FileStream *inf_FileID;\r |
1cb310e6 |
446 | cell_t inf_LineNumber;\r |
447 | cell_t inf_SourceNum;\r |
448 | cell_t inf_IN;\r |
bb6b2dcd |
449 | char inf_SaveTIB[TIB_SIZE];\r |
450 | } IncludeFrame;\r |
451 | \r |
452 | #define MAX_INCLUDE_DEPTH (16)\r |
453 | \r |
454 | /***************************************************************\r |
455 | ** Prototypes\r |
456 | ***************************************************************/\r |
457 | \r |
458 | #ifdef __cplusplus\r |
459 | extern "C" {\r |
460 | #endif\r |
461 | \r |
462 | int pfCatch( ExecToken XT );\r |
463 | \r |
464 | #ifdef __cplusplus\r |
465 | }\r |
466 | #endif\r |
467 | \r |
468 | /***************************************************************\r |
469 | ** External Globals\r |
470 | ***************************************************************/\r |
471 | extern pfTaskData_t *gCurrentTask;\r |
472 | extern pfDictionary_t *gCurrentDictionary;\r |
473 | extern char gScratch[TIB_SIZE];\r |
1cb310e6 |
474 | extern cell_t gNumPrimitives;\r |
bb6b2dcd |
475 | \r |
476 | extern ExecToken gLocalCompiler_XT; /* CFA of (LOCAL) compiler. */\r |
477 | extern ExecToken gNumberQ_XT; /* XT of NUMBER? */\r |
478 | extern ExecToken gQuitP_XT; /* XT of (QUIT) */\r |
479 | extern ExecToken gAcceptP_XT; /* XT of ACCEPT */\r |
480 | \r |
481 | #define DEPTH_AT_COLON_INVALID (-100)\r |
1cb310e6 |
482 | extern cell_t gDepthAtColon;\r |
bb6b2dcd |
483 | \r |
484 | /* Global variables. */\r |
b3ad2602 |
485 | extern cell_t gVarContext; /* Points to last name field. */\r |
1cb310e6 |
486 | extern cell_t gVarState; /* 1 if compiling. */\r |
487 | extern cell_t gVarBase; /* Numeric Base. */\r |
488 | extern cell_t gVarEcho; /* Echo input from file. */\r |
489 | extern cell_t gVarEchoAccept; /* Echo input from ACCEPT. */\r |
490 | extern cell_t gVarTraceLevel;\r |
491 | extern cell_t gVarTraceStack;\r |
492 | extern cell_t gVarTraceFlags;\r |
493 | extern cell_t gVarQuiet; /* Suppress unnecessary messages, OK, etc. */\r |
494 | extern cell_t gVarReturnCode; /* Returned to caller of Forth, eg. UNIX shell. */\r |
bb6b2dcd |
495 | \r |
496 | extern IncludeFrame gIncludeStack[MAX_INCLUDE_DEPTH];\r |
1cb310e6 |
497 | extern cell_t gIncludeIndex;\r |
bb6b2dcd |
498 | /***************************************************************\r |
499 | ** Macros\r |
500 | ***************************************************************/\r |
501 | \r |
502 | \r |
503 | /* Endian specific macros for creating target dictionaries for machines with\r |
504 | \r |
505 | ** different endian-ness.\r |
506 | \r |
507 | */\r |
508 | \r |
509 | #if defined(PF_BIG_ENDIAN_DIC)\r |
510 | \r |
511 | #define WRITE_FLOAT_DIC WriteFloatBigEndian\r |
1cb310e6 |
512 | #define WRITE_CELL_DIC(addr,data) WriteCellBigEndian((uint8_t *)(addr),(ucell_t)(data))\r |
513 | #define WRITE_SHORT_DIC(addr,data) Write16BigEndian((uint8_t *)(addr),(uint16_t)(data))\r |
bb6b2dcd |
514 | #define READ_FLOAT_DIC ReadFloatBigEndian\r |
1cb310e6 |
515 | #define READ_CELL_DIC(addr) ReadCellBigEndian((const uint8_t *)(addr))\r |
516 | #define READ_SHORT_DIC(addr) Read16BigEndian((const uint8_t *)(addr))\r |
bb6b2dcd |
517 | \r |
518 | #elif defined(PF_LITTLE_ENDIAN_DIC)\r |
519 | \r |
520 | #define WRITE_FLOAT_DIC WriteFloatLittleEndian\r |
1cb310e6 |
521 | #define WRITE_CELL_DIC(addr,data) WriteCellLittleEndian((uint8_t *)(addr),(ucell_t)(data))\r |
522 | #define WRITE_SHORT_DIC(addr,data) Write16LittleEndian((uint8_t *)(addr),(uint16_t)(data))\r |
bb6b2dcd |
523 | #define READ_FLOAT_DIC ReadFloatLittleEndian\r |
1cb310e6 |
524 | #define READ_CELL_DIC(addr) ReadCellLittleEndian((const uint8_t *)(addr))\r |
525 | #define READ_SHORT_DIC(addr) Read16LittleEndian((const uint8_t *)(addr))\r |
bb6b2dcd |
526 | \r |
527 | #else\r |
528 | \r |
529 | #define WRITE_FLOAT_DIC(addr,data) { *((PF_FLOAT *)(addr)) = (PF_FLOAT)(data); }\r |
1cb310e6 |
530 | #define WRITE_CELL_DIC(addr,data) { *((cell_t *)(addr)) = (cell_t)(data); }\r |
531 | #define WRITE_SHORT_DIC(addr,data) { *((int16_t *)(addr)) = (int16_t)(data); }\r |
bb6b2dcd |
532 | #define READ_FLOAT_DIC(addr) ( *((PF_FLOAT *)(addr)) )\r |
1cb310e6 |
533 | #define READ_CELL_DIC(addr) ( *((const ucell_t *)(addr)) )\r |
534 | #define READ_SHORT_DIC(addr) ( *((const uint16_t *)(addr)) )\r |
bb6b2dcd |
535 | \r |
536 | #endif\r |
537 | \r |
538 | \r |
539 | #define HEADER_HERE (gCurrentDictionary->dic_HeaderPtr.Cell)\r |
540 | #define CODE_HERE (gCurrentDictionary->dic_CodePtr.Cell)\r |
1cb310e6 |
541 | #define CODE_COMMA( N ) WRITE_CELL_DIC(CODE_HERE++,(N))\r |
bb6b2dcd |
542 | #define NAME_BASE (gCurrentDictionary->dic_HeaderBase)\r |
543 | #define CODE_BASE (gCurrentDictionary->dic_CodeBase)\r |
544 | #define NAME_SIZE (gCurrentDictionary->dic_HeaderLimit - gCurrentDictionary->dic_HeaderBase)\r |
545 | #define CODE_SIZE (gCurrentDictionary->dic_CodeLimit - gCurrentDictionary->dic_CodeBase)\r |
546 | \r |
1cb310e6 |
547 | #define IN_CODE_DIC(addr) ( ( ((uint8_t *)(addr)) >= gCurrentDictionary->dic_CodeBase) && ( ((uint8_t *)(addr)) < gCurrentDictionary->dic_CodeLimit) )\r |
bb6b2dcd |
548 | \r |
1cb310e6 |
549 | #define IN_NAME_DIC(addr) ( ( ((uint8_t *)(addr)) >= gCurrentDictionary->dic_HeaderBase) && ( ((uint8_t *)(addr)) < gCurrentDictionary->dic_HeaderLimit) )\r |
bb6b2dcd |
550 | #define IN_DICS(addr) (IN_CODE_DIC(addr) || IN_NAME_DIC(addr))\r |
551 | \r |
552 | /* Address conversion */\r |
a80283a7 |
553 | #define ABS_TO_NAMEREL( a ) ((cell_t) (((ucell_t) a) - NAME_BASE ))\r |
554 | #define ABS_TO_CODEREL( a ) ((cell_t) (((ucell_t) a) - CODE_BASE ))\r |
555 | #define NAMEREL_TO_ABS( a ) ((ucell_t) (((cell_t) a) + NAME_BASE))\r |
556 | #define CODEREL_TO_ABS( a ) ((ucell_t) (((cell_t) a) + CODE_BASE))\r |
bb6b2dcd |
557 | \r |
558 | /* The check for >0 is only needed for CLONE testing. !!! */\r |
559 | #define IsTokenPrimitive(xt) ((xt<gNumPrimitives) && (xt>=0))\r |
560 | \r |
a80283a7 |
561 | #define FREE_VAR(v) { if (v) { pfFreeMem((void *)(v)); v = 0; } }\r |
bb6b2dcd |
562 | \r |
563 | #define DATA_STACK_DEPTH (gCurrentTask->td_StackBase - gCurrentTask->td_StackPtr)\r |
564 | #define DROP_DATA_STACK (gCurrentTask->td_StackPtr++)\r |
565 | #define POP_DATA_STACK (*gCurrentTask->td_StackPtr++)\r |
1cb310e6 |
566 | #define PUSH_DATA_STACK(x) {*(--(gCurrentTask->td_StackPtr)) = (cell_t) x; }\r |
bb6b2dcd |
567 | \r |
568 | /* Force Quad alignment. */\r |
569 | #define QUADUP(x) (((x)+3)&~3)\r |
570 | \r |
571 | #define MIN(a,b) ( ((a)<(b)) ? (a) : (b) )\r |
572 | #define MAX(a,b) ( ((a)>(b)) ? (a) : (b) )\r |
573 | \r |
574 | \r |
575 | #ifndef TOUCH\r |
576 | #define TOUCH(argument) ((void)argument)\r |
577 | #endif\r |
578 | \r |
579 | /***************************************************************\r |
580 | ** I/O related macros\r |
581 | ***************************************************************/\r |
582 | \r |
583 | #define EMIT(c) ioEmit(c)\r |
584 | #define EMIT_CR EMIT('\n');\r |
585 | \r |
586 | #define MSG(cs) pfMessage(cs)\r |
587 | #define ERR(x) MSG(x)\r |
588 | \r |
589 | #define DBUG(x) /* PRT(x) */\r |
590 | #define DBUGX(x) /* DBUG(x) */\r |
591 | \r |
1cb310e6 |
592 | #define MSG_NUM_D(msg,num) { MSG(msg); ffDot((cell_t) num); EMIT_CR; }\r |
593 | #define MSG_NUM_H(msg,num) { MSG(msg); ffDotHex((cell_t) num); EMIT_CR; }\r |
bb6b2dcd |
594 | \r |
1cb310e6 |
595 | #define DBUG_NUM_D(msg,num) { pfDebugMessage(msg); pfDebugPrintDecimalNumber((cell_t) num); pfDebugMessage("\n"); }\r |
bb6b2dcd |
596 | \r |
597 | #endif /* _pf_guts_h */\r |