Annotation of qemu/roms/openbios/forth/system/ciface.fs, revision 1.1

1.1     ! root        1: 
        !             2: 0 value ciface-ph
        !             3: 
        !             4: dev /openprom/
        !             5: new-device
        !             6: " client-services" device-name
        !             7: 
        !             8: active-package to ciface-ph
        !             9: 
        !            10: \ -------------------------------------------------------------
        !            11: \ private stuff
        !            12: \ -------------------------------------------------------------
        !            13: 
        !            14: private
        !            15: 
        !            16: variable callback-function
        !            17: 
        !            18: : ?phandle ( phandle -- phandle )
        !            19:   dup 0= if ." NULL phandle" -1 throw then
        !            20: ;
        !            21: : ?ihandle ( ihandle -- ihandle )
        !            22:   dup 0= if ." NULL ihandle" -2 throw then
        !            23: ;
        !            24: 
        !            25: \ copy and null terminate return string
        !            26: : ci-strcpy ( buf buflen str len -- len )
        !            27:   >r -rot dup
        !            28:   ( str buf buflen buflen R: len )
        !            29:   r@ min swap
        !            30:   ( str buf n buflen R: len )
        !            31:   over > if
        !            32:     ( str buf n )
        !            33:     2dup + 0 swap c!
        !            34:   then
        !            35:   move r>
        !            36: ;
        !            37: 
        !            38: 0 value memory-ih
        !            39: 0 value mmu-ih
        !            40: 
        !            41: :noname ( -- )
        !            42:   " /chosen" find-device
        !            43: 
        !            44:   " mmu" active-package get-package-property 0= if
        !            45:     decode-int nip nip to mmu-ih
        !            46:   then
        !            47: 
        !            48:   " memory" active-package get-package-property 0= if
        !            49:     decode-int nip nip to memory-ih
        !            50:   then
        !            51:   device-end
        !            52: ; SYSTEM-initializer
        !            53: 
        !            54: : safetype
        !            55:   ." <" dup cstrlen dup 20 < if type else 2drop ." BAD" then ." >"
        !            56: ;
        !            57: 
        !            58: \ -------------------------------------------------------------
        !            59: \ public interface
        !            60: \ -------------------------------------------------------------
        !            61: 
        !            62: external
        !            63: 
        !            64: \ -------------------------------------------------------------
        !            65: \ 6.3.2.1 Client interface
        !            66: \ -------------------------------------------------------------
        !            67: 
        !            68: \ returns -1 if missing
        !            69: : test ( name -- 0|-1 )
        !            70:   dup cstrlen ciface-ph find-method
        !            71:   if drop 0 else -1 then
        !            72: ;
        !            73: 
        !            74: \ -------------------------------------------------------------
        !            75: \ 6.3.2.2 Device tree
        !            76: \ -------------------------------------------------------------
        !            77: 
        !            78: : peer peer ;
        !            79: : child child ;
        !            80: : parent parent ;
        !            81: 
        !            82: : getproplen ( name phandle -- len|-1 )
        !            83:   over cstrlen swap
        !            84:   ?phandle get-package-property
        !            85:   if -1 else nip then
        !            86: ;
        !            87: 
        !            88: : getprop ( buflen buf name phandle -- size|-1 )
        !            89:   \ detect phandle == -1 
        !            90:   dup -1 = if
        !            91:     2drop 2drop -1 exit
        !            92:   then
        !            93: 
        !            94:   \ return -1 if phandle is 0 (MacOS actually does this)
        !            95:   ?dup 0= if drop 2drop -1 exit then
        !            96:  
        !            97:   over cstrlen swap
        !            98:   ?phandle get-package-property if 2drop -1 exit then
        !            99:   ( buflen buf prop proplen )
        !           100:   >r swap rot r>
        !           101:   ( prop buf buflen proplen )
        !           102:   dup >r min move r>
        !           103: ;
        !           104: 
        !           105: \ 1 OK, 0 no more prop, -1 prev invalid
        !           106: : nextprop ( buf prev phandle -- 1|0|-1 )
        !           107:   >r
        !           108:   dup 0= if 0 else dup cstrlen then
        !           109: 
        !           110:   ( buf prev prev_len )
        !           111:   0 3 pick c!
        !           112:   
        !           113:   \ verify that prev exists (overkill...)
        !           114:   dup if
        !           115:     2dup r@ get-package-property if
        !           116:       r> 2drop 2drop -1 exit
        !           117:     else
        !           118:       2drop
        !           119:     then
        !           120:   then
        !           121:   
        !           122:   ( buf prev prev_len )
        !           123: 
        !           124:   r> next-property if
        !           125:     ( buf name name_len )
        !           126:     dup 1+ -rot ci-strcpy drop 1
        !           127:   else
        !           128:     ( buf )
        !           129:     drop 0
        !           130:   then
        !           131: ;
        !           132: 
        !           133: : setprop ( len buf name phandle -- size )
        !           134:   3 pick >r
        !           135:   >r >r swap encode-bytes  \ ( prop-addr prop-len  R: phandle name ) 
        !           136:   r> dup cstrlen r>
        !           137:   (property)
        !           138:   r>
        !           139: ;
        !           140: 
        !           141: : finddevice ( dev_spec -- phandle|-1 )
        !           142:   dup cstrlen
        !           143:   \ ." FIND-DEVICE " 2dup type
        !           144:   find-dev 0= if -1 then
        !           145:   \ ." -- " dup . cr
        !           146: ;
        !           147: 
        !           148: : instance-to-package ( ihandle -- phandle )
        !           149:   ?ihandle ihandle>phandle
        !           150: ;
        !           151: 
        !           152: : package-to-path ( buflen buf phandle -- length )
        !           153:   \ XXX improve error checking
        !           154:   dup 0= if 3drop -1 exit then
        !           155:   >r swap r>
        !           156:   get-package-path
        !           157:   ( buf buflen str len )
        !           158:   ci-strcpy
        !           159: ;
        !           160: 
        !           161: : canon ( buflen buf dev_specifier -- len )
        !           162:   dup cstrlen find-dev if
        !           163:     ( buflen buf phandle )
        !           164:     package-to-path
        !           165:   else
        !           166:     2drop -1
        !           167:   then
        !           168: ;
        !           169: 
        !           170: : instance-to-path ( buflen buf ihandle -- length )
        !           171:   \ XXX improve error checking
        !           172:   dup 0= if 3drop -1 exit then
        !           173:   >r swap r>
        !           174:   get-instance-path
        !           175:   \ ." INSTANCE: " 2dup type cr dup .
        !           176:   ( buf buflen str len )
        !           177:   ci-strcpy
        !           178: ;
        !           179: 
        !           180: : instance-to-interposed-path ( buflen buf ihandle -- length )
        !           181:   \ XXX improve error checking
        !           182:   dup 0= if 3drop -1 exit then
        !           183:   >r swap r>
        !           184:   get-instance-interposed-path
        !           185:   ( buf buflen str len )
        !           186:   ci-strcpy
        !           187: ;
        !           188: 
        !           189: : call-method ( ihandle method -- xxxx catch-result )
        !           190:   dup 0= if ." call of null method" -1 exit then
        !           191:   dup >r
        !           192:   dup cstrlen
        !           193:   \ ." call-method " 2dup type cr
        !           194:   rot ?ihandle ['] $call-method catch dup if
        !           195:     \ not necessary an error but very useful for debugging...
        !           196:     ." call-method " r@ dup cstrlen type ." : exception " dup . cr
        !           197:   then
        !           198:   r> drop
        !           199: ;
        !           200: 
        !           201: 
        !           202: \ -------------------------------------------------------------
        !           203: \ 6.3.2.3 Device I/O
        !           204: \ -------------------------------------------------------------
        !           205: 
        !           206: : open ( dev_spec -- ihandle|0 )
        !           207:   dup cstrlen open-dev
        !           208: ;
        !           209: 
        !           210: : close ( ihandle -- )
        !           211:   close-dev
        !           212: ;
        !           213: 
        !           214: : read ( len addr ihandle -- actual )
        !           215:   >r swap r>
        !           216:   dup ihandle>phandle " read" rot find-method
        !           217:   if swap call-package else 3drop -1 then
        !           218: ;
        !           219: 
        !           220: : write ( len addr ihandle -- actual )
        !           221:   >r swap r>
        !           222:   dup ihandle>phandle " write" rot find-method
        !           223:   if swap call-package else 3drop -1 then
        !           224: ;
        !           225: 
        !           226: : seek ( pos_lo pos_hi ihandle -- status )
        !           227:   dup ihandle>phandle " seek" rot find-method
        !           228:   if swap call-package else 3drop -1 then
        !           229: ;
        !           230: 
        !           231: 
        !           232: \ -------------------------------------------------------------
        !           233: \ 6.3.2.4 Memory
        !           234: \ -------------------------------------------------------------
        !           235: 
        !           236: : claim ( align size virt -- baseaddr|-1 )
        !           237:   -rot swap
        !           238:   ciface-ph " cif-claim" rot find-method
        !           239:   if execute else 3drop -1 then
        !           240: ;
        !           241: 
        !           242: : release ( size virt -- )
        !           243:   swap
        !           244:   ciface-ph " cif-release" rot find-method
        !           245:   if execute else 2drop -1 then
        !           246: ;
        !           247: 
        !           248: \ -------------------------------------------------------------
        !           249: \ 6.3.2.5 Control transfer
        !           250: \ -------------------------------------------------------------
        !           251: 
        !           252: : boot ( bootspec -- )
        !           253:   ." BOOT"
        !           254: ;
        !           255: 
        !           256: : enter ( -- )
        !           257:   ." ENTER"
        !           258: ;
        !           259: 
        !           260: \ exit ( -- ) is defined later (clashes with builtin exit)
        !           261: 
        !           262: : chain ( virt size entry args len -- )
        !           263:   ." CHAIN"
        !           264: ;
        !           265: 
        !           266: \ -------------------------------------------------------------
        !           267: \ 6.3.2.6 User interface
        !           268: \ -------------------------------------------------------------
        !           269: 
        !           270: : interpret ( xxx cmdstring -- ??? catch-reult )
        !           271:   dup cstrlen
        !           272:   \ ." INTERPRETE: --- " 2dup type
        !           273:   ['] evaluate catch dup if
        !           274:     \ this is not necessary an error...
        !           275:     ." interpret: exception " dup . ." caught" cr
        !           276: 
        !           277:     \ Force back to interpret state on error, otherwise the next call to
        !           278:     \ interpret gets confused if the error occurred in compile mode
        !           279:     0 state !
        !           280:   then
        !           281:   \ ." --- " cr
        !           282: ;
        !           283: 
        !           284: : set-callback ( newfunc -- oldfunc )
        !           285:   callback-function @
        !           286:   swap
        !           287:   callback-function !
        !           288: ;
        !           289: 
        !           290: \ : set-symbol-lookup ( sym-to-value -- value-to-sym ) ;
        !           291: 
        !           292: 
        !           293: \ -------------------------------------------------------------
        !           294: \ 6.3.2.7 Time
        !           295: \ -------------------------------------------------------------
        !           296: 
        !           297: \ : milliseconds ( -- ms ) ;
        !           298: 
        !           299: 
        !           300: \ -------------------------------------------------------------
        !           301: \ arch?
        !           302: \ -------------------------------------------------------------
        !           303: 
        !           304: : start-cpu ( xxx xxx xxx --- )
        !           305:   ." Start CPU unimplemented" cr
        !           306:   3drop
        !           307: ;
        !           308: 
        !           309: \ -------------------------------------------------------------
        !           310: \ special
        !           311: \ -------------------------------------------------------------
        !           312: 
        !           313: : exit ( -- )
        !           314:   ." EXIT"
        !           315:   outer-interpreter
        !           316: ;
        !           317: 
        !           318: [IFDEF] CONFIG_PPC
        !           319: \ PowerPC Microprocessor CHRP binding
        !           320: \ 10.5.2. Client Interface
        !           321: 
        !           322: ( cstring-method phandle -- missing )
        !           323: 
        !           324: : test-method
        !           325:        swap dup cstrlen rot
        !           326:        find-method 0= if -1 else drop 0 then
        !           327: ;
        !           328: [THEN]
        !           329: 
        !           330: finish-device
        !           331: device-end
        !           332: 
        !           333: 
        !           334: \ -------------------------------------------------------------
        !           335: \ entry point
        !           336: \ -------------------------------------------------------------
        !           337: 
        !           338: : client-iface ( [args] name len -- [args] -1 | [rets] 0 )
        !           339:   ciface-ph find-method 0= if -1 exit then
        !           340:   catch ?dup if
        !           341:     cr ." Unexpected client interface exception: " . -2 cr exit
        !           342:   then
        !           343:   0
        !           344: ;
        !           345: 
        !           346: : client-call-iface ( [args] name len -- [args] -1 | [rets] 0 )
        !           347:   ciface-ph find-method 0= if -1 exit then
        !           348:   execute
        !           349:   0
        !           350: ;

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.