\ ------------------------------------------------------------------------- \ SBus encode/decode unit \ ------------------------------------------------------------------------- : decode-unit-sbus ( str len -- id lun ) ascii , left-split ( addr-R len-R addr-L len-L ) parse-hex -rot parse-hex swap ; : encode-unit-sbus ( id lun -- str len) swap pocket tohexstr " ," pocket tmpstrcat >r rot pocket tohexstr r> tmpstrcat drop ; \ Convert sbus unit (from decode-unit) to physical address using \ sbus node ranges property : sbus-unit>addr ( phys.lo phys.hi -- phys.lo phys.hi -1 | 0 ) " ranges" my-self ihandle>phandle get-package-property 0= if ( phys.lo phys.hi prop prop-len ) begin 2over swap drop 0 swap \ force phys.lo to zero for matching 2swap ( unit.phys.lo unit.phys.hi 0 phys.hi res prop prop-len ) 0 -rot ( unit.phys.lo unit.phys.hi res prop prop-len ) 2 0 do decode-int -rot >r >r ( unit.phys.lo unit.phys.hi res phys.x -- R: prop-len prop ) rot ( unit.phys.lo res phys.x phys.hi ) = if 1+ then ( unit.phys.lo res ) r> r> ( unit.phys.lo res prop prop-len ) loop rot ( prop prop-len res ) 2 = if \ did we match the unit address? if so, return the physical address decode-phys 2swap 2drop 2swap ( unit.phys.lo unit.phys.hi phys.lo phys.hi ) drop 0 d+ \ force unit.phys.hi to zero and add address for final offset -1 exit else decode-phys 2drop decode-int drop \ drop the size and carry on then dup 0= until 2drop 2drop 0 then ; : map-in-sbus ( phys.lo phys.hi size ) >r sbus-unit>addr if r@ " map-in" $call-parent then r> drop ; : map-out-sbus ( virt size ) " map-out" $call-parent ; \ ------------------------------------------------------------------------- \ SBus probe \ ------------------------------------------------------------------------- : probe-self-sbus ( arg-adr arg-len reg-adr reg-len fcode-adr fcode-len -- ) 0 to probe-fcode? ['] decode-unit-sbus catch if 2drop 2drop 2drop 2drop exit then h# 10000 map-in-sbus dup cpeek if dup h# f1 = swap h# fd = or if new-device >r set-args r> dup 1 byte-load finish-device -1 to probe-fcode? else nip nip nip nip ." Invalid FCode start byte" cr then else nip nip nip nip then h# 10000 map-out-sbus ;