Annotation of qemu/roms/openbios/forth/device/device.fs, revision 1.1.1.1

1.1       root        1: \ tag: Package creation and deletion
                      2: \ 
                      3: \ this code implements IEEE 1275-1994 
                      4: \ 
                      5: \ Copyright (C) 2003, 2004 Samuel Rydh
                      6: \ 
                      7: \ See the file "COPYING" for further information about
                      8: \ the copyright and warranty status of this work.
                      9: \ 
                     10: 
                     11: variable device-tree
                     12: 
                     13: \ make defined words globally visible
                     14: \ 
                     15: : external ( -- )
                     16:   active-package ?dup if
                     17:     >dn.methods @ set-current
                     18:   then
                     19: ;
                     20: 
                     21: \ make the private wordlist active (not an OF word)
                     22: \ 
                     23: : private ( -- )
                     24:   active-package ?dup if
                     25:     >r
                     26:     forth-wordlist r@ >dn.methods @ r@ >dn.priv-methods @ 3 set-order
                     27:     r> >dn.priv-methods @ set-current
                     28:   then
                     29: ;
                     30: 
                     31: \ set activate package and make the world visible package wordlist
                     32: \ the current one.
                     33: \ 
                     34: : active-package! ( phandle -- )
                     35:   dup to active-package
                     36:   \ locally defined words are not available
                     37:   ?dup if
                     38:     forth-wordlist over >dn.methods @ 2 set-order
                     39:     >dn.methods @ set-current
                     40:   else
                     41:     forth-wordlist dup 1 set-order set-current
                     42:   then
                     43: ;
                     44: 
                     45: 
                     46: \ new-device ( -- )
                     47: \ 
                     48: \ Start new package, as child of active package.
                     49: \ Create a new device node as a child of the active package and make the 
                     50: \ new node the active package. Create a new instance and make it the current
                     51: \ instance; the instance that invoked new-device becomes the parent instance 
                     52: \ of the new instance.
                     53: \ Subsequently, newly defined Forth words become the methods of the new node 
                     54: \ and newly defined data items (such as types variable, value, buffer:, and 
                     55: \ defer) are allocated and stored within the new instance.
                     56: 
                     57: : new-device ( -- )
                     58:   align-tree dev-node.size alloc-tree >r
                     59:   active-package
                     60:   dup r@ >dn.parent !
                     61: 
                     62:   \ ( parent ) hook up at the end of the peer list
                     63:   ?dup if
                     64:     >dn.child
                     65:     begin dup @ while @ >dn.peer repeat
                     66:     r@ swap !
                     67:   else
                     68:     \ we are the root node!
                     69:     r@ to device-tree
                     70:   then
                     71: 
                     72:   \ ( -- ) fill in device node stuff
                     73:   inst-node.size r@ >dn.isize !
                     74: 
                     75:   \ create two wordlists
                     76:   wordlist r@ >dn.methods !
                     77:   wordlist r@ >dn.priv-methods !
                     78:   
                     79:   \ initialize template data
                     80:   r@ >dn.itemplate
                     81:   r@ over >in.device-node !
                     82:   my-self over >in.my-parent !
                     83: 
                     84:   \ make it the active package and current instance
                     85:   to my-self
                     86:   r@ active-package!
                     87:   
                     88:   \ swtich to public wordlist
                     89:   external
                     90:   r> drop
                     91: ;
                     92: 
                     93: \ helpers for finish-device (OF does not actually define words
                     94: \ for device node deletion)
                     95: 
                     96: : (delete-device) \ ( phandle )
                     97:   >r
                     98:   r@ >dn.parent @
                     99:   ?dup if
                    100:     >dn.child    \ ( &first-child )
                    101:     begin dup @ r@ <> while @ >dn.peer repeat
                    102:     r@ >dn.peer @ swap !
                    103:   else
                    104:     \ root node
                    105:     0 to device-tree
                    106:   then
                    107: 
                    108:   \ XXX: free any memory related to this node.
                    109:   \ we could have a list with free device-node headers...
                    110:   r> drop
                    111: ;
                    112: 
                    113: : delete-device \ ( phandle )
                    114:   >r 
                    115:   \ first, get rid of any children
                    116:   begin r@ >dn.child @ dup while
                    117:     (delete-device)
                    118:   repeat
                    119:   drop
                    120:   
                    121:   \ then free this node
                    122:   r> (delete-device)
                    123: ;
                    124: 
                    125: \ finish-device ( -- )
                    126: \ 
                    127: \ Finish this package, set active package to parent.
                    128: \ Complete a device node that was created by new-device, as follows: If the
                    129: \ device node has no "name" property, remove the device node from the device 
                    130: \ tree. Otherwise, save the current values of the current instance's 
                    131: \ initialized data items within the active package for later use in
                    132: \ initializing the data items of instances created from that node. In any 
                    133: \ case, destroy the current instance, make its parent instance the current
                    134: \ instance, and select the parent node of the device node just completed, 
                    135: \ making the parent node the active package again.
                    136: 
                    137: : finish-device \ ( -- )
                    138:   my-self
                    139:   dup >in.device-node @ >r
                    140:   >in.my-parent @ to my-self
                    141: 
                    142:   ( -- )
                    143:   r@ >dn.parent @ active-package!
                    144:   s" name" r@ get-package-property if
                    145:     \ delete the node (and any children)
                    146:     r@ delete-device
                    147:   else
                    148:     2drop
                    149:     \ node OK
                    150:   then
                    151:   r> drop
                    152: ;
                    153: 
                    154: 
                    155: \ helper function which creates and initializes an instance.
                    156: \ open is not called. The current instance is not changed.
                    157: \ 
                    158: : create-instance ( phandle -- ihandle|0 )
                    159:   dup >dn.isize @ ['] alloc-mem catch if 2drop 0 exit then
                    160:   >r
                    161:   \ we need to save the size in order to be able to release it properly
                    162:   dup >dn.isize @ r@ >in.alloced-size !
                    163: 
                    164:   \ clear memory (we only need to clear the head; all other data is copied)
                    165:   r@ inst-node.size 0 fill
                    166:   
                    167:   ( phandle R: ihandle )
                    168: 
                    169:   \ instantiate data
                    170:   dup >dn.methods @ r@ instance-init
                    171:   dup >dn.priv-methods @ r@ instance-init
                    172: 
                    173:   \ instantiate 
                    174:   dup >dn.itemplate r@ inst-node.size move
                    175:   r@ r@ >in.instance-data !
                    176:   my-self r@ >in.my-parent !
                    177:   drop
                    178: 
                    179:   r>
                    180: ;
                    181: 
                    182: \ helper function which tears down and frees an instance
                    183: : destroy-instance ( ihandle )
                    184:   ?dup if
                    185:     \ free arguments
                    186:     dup >in.arguments 2@ free-mem
                    187:     \ and the instance block
                    188:     dup >in.alloced-size @
                    189:     free-mem
                    190:   then
                    191: ;

unix.superglobalmegacorp.com

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