historical/m0-applesillicon.git/xnu-qemu-arm64-5.1.0/roms/openbios/forth/device/feval.fs
2024-01-16 11:20:27 -06:00

100 lines
2 KiB
Forth

\ 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
;