| \ tag: FCode evaluator |
| \ |
| \ this code implements an fcode evaluator |
| \ as described in IEEE 1275-1994 |
| \ |
| \ Copyright (C) 2003 Stefan Reinauer |
| \ |
| \ See the file "COPYING" for further information about |
| \ the copyright and warranty status of this work. |
| \ |
| |
| defer init-fcode-table |
| |
| : alloc-fcode-table |
| 4096 cells alloc-mem to fcode-table |
| ?fcode-verbose if |
| ." fcode-table at 0x" fcode-table . cr |
| then |
| init-fcode-table |
| ; |
| |
| : free-fcode-table |
| fcode-table 4096 cells free-mem |
| 0 to fcode-table |
| ; |
| |
| : (debug-feval) ( fcode# -- fcode# ) |
| \ Address |
| fcode-stream 1 - . ." : " |
| |
| \ Indicate if word is compiled |
| state @ 0<> if |
| ." (compile) " |
| then |
| dup fcode>xt cell - lfa2name type |
| dup ." [ 0x" . ." ]" cr |
| ; |
| |
| : (feval) ( -- ?? ) |
| begin |
| fcode# |
| ?fcode-verbose if |
| (debug-feval) |
| then |
| fcode>xt |
| dup flags? 0<> state @ 0= or if |
| execute |
| else |
| , |
| then |
| fcode-end @ until |
| |
| \ If we've executed incorrect FCode we may have reached the end of the FCode |
| \ program but still be in compile mode. Make sure that if this has happened |
| \ then we switch back to immediate mode to prevent internal OpenBIOS errors. |
| tmp-comp-depth @ -1 <> if |
| -1 tmp-comp-depth ! |
| tmp-comp-buf @ @ here! |
| 0 state ! |
| then |
| ; |
| |
| : byte-load ( addr xt -- ) |
| ?fcode-verbose if |
| cr ." byte-load: evaluating fcode at 0x" over . cr |
| then |
| |
| \ save state |
| >r >r fcode-push-state r> r> |
| |
| \ set fcode-c@ defer |
| dup 1 = if drop ['] c@ then \ FIXME: uses c@ rather than rb@ for now... |
| to fcode-c@ |
| dup to fcode-stream-start |
| to fcode-stream |
| 1 to fcode-spread |
| false to ?fcode-offset16 |
| alloc-fcode-table |
| false fcode-end ! |
| |
| \ protect against stack overflow/underflow |
| 0 0 0 0 0 0 depth >r |
| |
| ['] (feval) catch if |
| cr ." byte-load: exception caught!" cr |
| then |
| |
| s" fcode-debug?" evaluate if |
| depth r@ <> if |
| cr ." byte-load: warning stack overflow, diff " depth r@ - . cr |
| then |
| then |
| |
| r> depth! 3drop 3drop |
| |
| free-fcode-table |
| |
| \ restore state |
| fcode-pop-state |
| ; |