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

235 lines
3.8 KiB
Forth

\ 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!
;
defer (dma-alloc)
defer (dma-free)
defer (dma-map-in)
defer (dma-map-out)
defer (dma-sync)