| \ tag: Other FCode functions |
| \ |
| \ this code implements IEEE 1275-1994 ch. 5.3.7 |
| \ |
| \ Copyright (C) 2003 Stefan Reinauer |
| \ |
| \ See the file "COPYING" for further information about |
| \ the copyright and warranty status of this work. |
| \ |
| |
| \ The current diagnostic setting |
| defer _diag-switch? |
| |
| |
| \ |
| \ 5.3.7 Other FCode functions |
| \ |
| |
| hex |
| |
| \ 5.3.7.1 Peek/poke |
| |
| defer (peek) |
| :noname |
| execute true |
| ; to (peek) |
| |
| : cpeek ( addr -- false | byte true ) |
| ['] c@ (peek) |
| ; |
| |
| : wpeek ( waddr -- false | w true ) |
| ['] w@ (peek) |
| ; |
| |
| : lpeek ( qaddr -- false | quad true ) |
| ['] l@ (peek) |
| ; |
| |
| defer (poke) |
| :noname |
| execute true |
| ; to (poke) |
| |
| : cpoke ( byte addr -- okay? ) |
| ['] c! (poke) |
| ; |
| |
| : wpoke ( w waddr -- okay? ) |
| ['] w! (poke) |
| ; |
| |
| : lpoke ( quad qaddr -- okay? ) |
| ['] l! (poke) |
| ; |
| |
| |
| \ 5.3.7.2 Device-register access |
| |
| : rb@ ( addr -- byte ) |
| ; |
| |
| : rw@ ( waddr -- w ) |
| ; |
| |
| : rl@ ( qaddr -- quad ) |
| ; |
| |
| : rb! ( byte addr -- ) |
| ; |
| |
| : rw! ( w waddr -- ) |
| ; |
| |
| : rl! ( quad qaddr -- ) |
| ; |
| |
| : rx@ ( oaddr - o ) |
| state @ if |
| h# 22e get-token if , else execute then |
| else |
| h# 22e get-token drop execute |
| then |
| ; immediate |
| |
| : rx! ( o oaddr -- ) |
| state @ if |
| h# 22f get-token if , else execute then |
| else |
| h# 22f get-token drop execute |
| then |
| ; immediate |
| |
| \ 5.3.7.3 Time |
| |
| \ Pointer to OBP tick value updated by timer interrupt |
| variable obp-ticks |
| |
| \ Dummy implementation for platforms without a timer interrupt |
| 0 value dummy-msecs |
| |
| : get-msecs ( -- n ) |
| \ If obp-ticks pointer is set, use it. Otherwise fall back to |
| \ dummy implementation |
| obp-ticks @ 0<> if |
| obp-ticks @ |
| else |
| dummy-msecs dup 1+ to dummy-msecs |
| then |
| ; |
| |
| : ms ( n -- ) |
| get-msecs + |
| begin dup get-msecs < until |
| drop |
| ; |
| |
| : alarm ( xt n -- ) |
| 2drop |
| ; |
| |
| : user-abort ( ... -- ) ( R: ... -- ) |
| ; |
| |
| |
| \ 5.3.7.4 System information |
| 0003.0000 value fcode-revision ( -- n ) |
| |
| : mac-address ( -- mac-str mac-len ) |
| ; |
| |
| |
| \ 5.3.7.5 FCode self-test |
| : display-status ( n -- ) |
| ; |
| |
| : memory-test-suite ( addr len -- fail? ) |
| ; |
| |
| : mask ( -- a-addr ) |
| ; |
| |
| : diagnostic-mode? ( -- diag? ) |
| \ Return the NVRAM diag-switch? setting |
| _diag-switch? |
| ; |
| |
| \ 5.3.7.6 Start and end. |
| |
| \ Begin program with spread 0 followed by FCode-header. |
| : start0 ( -- ) |
| 0 fcode-spread ! |
| offset16 |
| fcode-header |
| ; |
| |
| \ Begin program with spread 1 followed by FCode-header. |
| : start1 ( -- ) |
| 1 to fcode-spread |
| offset16 |
| fcode-header |
| ; |
| |
| \ Begin program with spread 2 followed by FCode-header. |
| : start2 ( -- ) |
| 2 to fcode-spread |
| offset16 |
| fcode-header |
| ; |
| |
| \ Begin program with spread 4 followed by FCode-header. |
| : start4 ( -- ) |
| 4 to fcode-spread |
| offset16 |
| fcode-header |
| ; |
| |
| \ Begin program with spread 1 followed by FCode-header. |
| : version1 ( -- ) |
| 1 to fcode-spread |
| fcode-header |
| ; |
| |
| \ Cease evaluating this FCode program. |
| : end0 ( -- ) |
| true fcode-end ! |
| ; immediate |
| |
| \ Cease evaluating this FCode program. |
| : end1 ( -- ) |
| end0 |
| ; |
| |
| \ Standard FCode number for undefined FCode functions. |
| : ferror ( -- ) |
| ." undefined fcode# encountered." cr |
| true fcode-end ! |
| ; |
| |
| \ Pause FCode evaluation if desired; can resume later. |
| : suspend-fcode ( -- ) |
| \ NOT YET IMPLEMENTED. |
| ; |
| |
| |
| \ Evaluate FCode beginning at location addr. |
| |
| \ : byte-load ( addr xt -- ) |
| \ \ this word is implemented in feval.fs |
| \ ; |
| |
| \ Set address and arguments of new device node. |
| : set-args ( arg-str arg-len unit-str unit-len -- ) |
| ?my-self drop |
| |
| depth 1- >r |
| " decode-unit" ['] $call-parent catch if |
| 2drop 2drop |
| then |
| |
| my-self ihandle>phandle >dn.probe-addr \ offset |
| begin depth r@ > while |
| dup na1+ >r ! r> |
| repeat |
| r> 2drop |
| |
| my-self >in.arguments 2@ free-mem |
| strdup my-self >in.arguments 2! |
| ; |
| |
| : dma-alloc |
| s" dma-alloc" $call-parent |
| ; |