1\ *****************************************************************************
2\ * Copyright (c) 2004, 2008 IBM Corporation
3\ * All rights reserved.
4\ * This program and the accompanying materials
5\ * are made available under the terms of the BSD License
6\ * which accompanies this distribution, and is available at
7\ * http://www.opensource.org/licenses/bsd-license.php
8\ *
9\ * Contributors:
10\ *     IBM Corporation - initial implementation
11\ ****************************************************************************/
12
13STRUCT
14	cell field romfs>file-header
15	cell field romfs>data
16	cell field romfs>data-size
17	cell field romfs>flags
18
19CONSTANT /romfs-lookup-control-block
20
21CREATE romfs-lookup-cb /romfs-lookup-control-block allot
22romfs-lookup-cb /romfs-lookup-control-block erase
23
24: create-filename ( string -- string\0 )
25    here >r dup 8 + allot
26    r@ over 8 + erase
27    r@ zplace r> ;
28
29: romfs-lookup ( fn-str fn-len -- data size | false )
30    create-filename romfs-base
31    romfs-lookup-cb romfs-lookup-entry call-c
32    0= IF romfs-lookup-cb dup romfs>data @ swap romfs>data-size @ ELSE
33    false THEN ;
34
35: ibm,romfs-lookup ( fn-str fn-len -- data-high data-low size | 0 0 false )
36  romfs-lookup dup
37  0= if drop 0 0 false else
38  swap dup 20 rshift swap ffffffff and then ;
39
40\ FIXME For a short time ...
41: romfs-lookup-client ibm,romfs-lookup ;
42
43\ Fixme temp implementation
44
45STRUCT
46	cell field romfs>next-off
47	cell field romfs>size
48	cell field romfs>flags
49	cell field romfs>data-off
50	cell field romfs>name
51
52CONSTANT /romfs-cb
53
54: romfs-map-file ( fn-str fn-len -- file-addr file-size )
55  romfs-base >r
56  BEGIN 2dup r@ romfs>name zcount string=ci not WHILE
57    ( fn-str fn-len ) ( R: rom-cb-file-addr )
58    r> romfs>next-off dup @ dup 0= IF 1 THROW THEN + >r REPEAT
59    ( fn-str fn-len ) ( R: rom-cb-file-addr )
60    2drop r@ romfs>data-off @ r@ + r> romfs>size @ ;
61
62\ returns address of romfs-header file
63: flash-header ( -- address | false )
64    get-flash-base 28 +         \ prepare flash header file address
65    dup rx@                     \ fetch "magic123"
66    6d61676963313233 <> IF      \ IF flash is not valid
67       drop                     \ | forget address
68       false                    \ | return false
69    THEN                        \ FI
70;
71
72CREATE bdate-str 10 allot
73: bdate2human ( -- addr len )
74  flash-header 40 + rx@ (.)
75  drop dup 0 + bdate-str 6 + 4 move
76  dup 4 + bdate-str 0 + 2 move
77  dup 6 + bdate-str 3 + 2 move
78  dup 8 + bdate-str b + 2 move
79  a + bdate-str e + 2 move
80  2d bdate-str 2 + c!
81  2d bdate-str 5 + c!
82  20 bdate-str a + c!
83  3a bdate-str d + c!
84  bdate-str 10
85;
86
87
88\ Look up a file in the ROM file system and evaluate it
89
90: included  ( fn fn-len -- )
91   2dup >r >r romfs-lookup dup IF
92      r> drop r> drop evaluate
93   ELSE
94      drop ." Cannot open file : " r> r> type cr
95   THEN
96;
97
98: include  ( " fn " -- )
99   parse-word included
100;
101
102: ?include  ( flag " fn " -- )
103   parse-word rot IF included ELSE 2drop THEN
104;
105
106: include?  ( nargs flag " fn " -- )
107   parse-word rot IF
108      rot drop included
109   ELSE
110      2drop 0 ?DO drop LOOP
111   THEN
112;
113
114
115\ List files in ROMfs
116
117: (print-romfs-file-info)  ( file-addr -- )
118   9 emit  dup b 0.r  2 spaces  dup 8 + @ 6 0.r  2 spaces  20 + zcount type cr
119;
120
121: romfs-list  ( -- )
122   romfs-base 0 cr BEGIN + dup (print-romfs-file-info) dup @ dup 0= UNTIL 2drop
123;
124