1\ *****************************************************************************
2\ * Copyright (c) 2004, 2011 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
13: fc-abort ." FCode called abort: IP " get-ip . ( ." STACK: " .s ) depth dup 0< IF abort THEN . rdepth . cr  abort ;
14: fc-0 ." 0(lit): STACK ( S: " depth . ." R: " rdepth . ." ): " depth 0> IF .s THEN 0 ;
15: fc-1 ." 1(lit): STACK ( S: " depth . ." R: " rdepth . ." ): " depth 0> IF .s THEN 1 ;
16
17: parse-1hex 1 hex-decode-unit ;
18
19\ Adjust functions for accessing MMIO registers. According to IEEE 1275,
20\ a bus device can substitute bus-specific implementations of r*@ and r*!
21\ for use by its children, e.g. with respect to byte-order. Since PCI is
22\ little endian by default, we've got to use the little endian accessor
23\ functions for the PCI bus (some FCODE programs are expecting this behavior).
24: fc-set-pci-mmio-tokens  ( -- )
25   ['] rw@-le  0 232 set-token
26   ['] rw!-le  0 233 set-token
27   ['] rl@-le  0 234 set-token
28   ['] rl!-le  0 235 set-token
29   ['] rx@-le  0 22E set-token
30   ['] rx!-le  0 22F set-token
31;
32
33\ Set normal MMIO access token behavior:
34: fc-set-normal-mmio-tokens  ( -- )
35   ['] rw@  0 232 set-token
36   ['] rw!  0 233 set-token
37   ['] rl@  0 234 set-token
38   ['] rl!  0 235 set-token
39   ['] rx@  0 22E set-token
40   ['] rx!  0 22F set-token
41;
42
43: reset-token-table
44  FFF 0 DO ['] ferror 0 i set-token LOOP
45  ;
46
47reset-token-table
48
49' end0 0        00 set-token
50
51\ 01...0F beginning code of 2-byte FCode sequences
52
53' b(lit)      1 10 set-token
54
55' b(')        1 11 set-token
56' b(")        1 12 set-token
57' bbranch     1 13 set-token
58' b?branch    1 14 set-token
59' b(loop)     1 15 set-token
60' b(+loop)    1 16 set-token
61' b(do)       1 17 set-token
62' b(?do)      1 18 set-token
63' i           0 19 set-token
64' j           0 1A set-token
65' b(leave)    1 1B set-token
66' b(of)       1 1C set-token
67' execute     0 1D set-token
68' +           0 1E set-token
69' -           0 1F set-token
70' *           0 20 set-token
71' /           0 21 set-token
72' mod         0 22 set-token
73' and         0 23 set-token
74' or          0 24 set-token
75' xor         0 25 set-token
76' invert      0 26 set-token
77' lshift      0 27 set-token
78' rshift      0 28 set-token
79' >>a         0 29 set-token
80' /mod        0 2A set-token
81' u/mod       0 2B set-token
82' negate      0 2C set-token
83' abs         0 2D set-token
84' min         0 2E set-token
85' max         0 2F set-token
86' >r          0 30 set-token
87' r>          0 31 set-token
88' r@          0 32 set-token
89' exit        0 33 set-token
90' 0=          0 34 set-token
91' 0<>         0 35 set-token
92' 0<          0 36 set-token
93' 0<=         0 37 set-token
94' 0>          0 38 set-token
95' 0>=         0 39 set-token
96' <           0 3A set-token
97' >           0 3B set-token
98' =           0 3C set-token
99' <>          0 3D set-token
100' u>          0 3E set-token
101' u<=         0 3F set-token
102' u<          0 40 set-token
103' u>=         0 41 set-token
104' >=          0 42 set-token
105' <=          0 43 set-token
106' between     0 44 set-token
107' within      0 45 set-token
108' DROP        0 46 set-token
109' DUP         0 47 set-token
110' OVER        0 48 set-token
111' SWAP        0 49 set-token
112' ROT         0 4A set-token
113' -ROT        0 4B set-token
114' TUCK        0 4C set-token
115' nip         0 4D set-token
116' pick        0 4E set-token
117' roll        0 4F set-token
118' ?dup        0 50 set-token
119' depth       0 51 set-token
120' 2drop       0 52 set-token
121' 2dup        0 53 set-token
122' 2over       0 54 set-token
123' 2swap       0 55 set-token
124' 2rot        0 56 set-token
125' 2/          0 57 set-token
126' u2/         0 58 set-token
127' 2*          0 59 set-token
128' /c          0 5A set-token
129' /w          0 5B set-token
130' /l          0 5C set-token
131' /n          0 5D set-token
132' ca+         0 5E set-token
133' wa+         0 5F set-token
134' la+         0 60 set-token
135' na+         0 61 set-token
136' char+       0 62 set-token
137' wa1+        0 63 set-token
138' la1+        0 64 set-token
139' cell+       0 65 set-token
140' chars       0 66 set-token
141' /w*         0 67 set-token
142' /l*         0 68 set-token
143' cells       0 69 set-token
144' on          0 6A set-token
145' off         0 6B set-token
146' +!          0 6C set-token
147' @           0 6D set-token
148' fc-l@       0 6E set-token
149' fc-w@       0 6F set-token
150' fc-<w@      0 70 set-token
151' fc-c@       0 71 set-token
152' !           0 72 set-token
153' fc-l!       0 73 set-token
154' fc-w!       0 74 set-token
155' fc-c!       0 75 set-token
156' 2@          0 76 set-token
157' 2!          0 77 set-token
158' fc-move     0 78 set-token
159' fc-fill     0 79 set-token
160' comp        0 7A set-token
161' noop        0 7B set-token
162' lwsplit     0 7C set-token
163' wljoin      0 7D set-token
164' lbsplit     0 7E set-token
165' bljoin      0 7F set-token
166' wbflip      0 80 set-token
167' upc         0 81 set-token
168' lcc         0 82 set-token
169' pack        0 83 set-token
170' count       0 84 set-token
171' body>       0 85 set-token
172' >body       0 86 set-token
173' fcode-revision 0 87 set-token
174' span        0 88 set-token
175' unloop      0 89 set-token
176' expect      0 8A set-token
177' alloc-mem   0 8B set-token
178' free-mem    0 8C set-token
179' key?        0 8D set-token
180' key         0 8E set-token
181' emit        0 8F set-token
182' type        0 90 set-token
183' (cr         0 91 set-token
184' cr          0 92 set-token
185' #out        0 93 set-token
186' #line       0 94 set-token
187' hold        0 95 set-token
188' <#          0 96 set-token
189' u#>         0 97 set-token
190' sign        0 98 set-token
191' u#          0 99 set-token
192' u#s         0 9A set-token
193' u.          0 9B set-token
194' u.r         0 9C set-token
195' .           0 9D set-token
196' .r          0 9E set-token
197' .s          0 9F set-token
198' base        0 A0 set-token
199\ ' convert   0 A1 set-token            \ historical, not supported
200' $number     0 A2 set-token
201' digit       0 A3 set-token
202' -1          0 A4 set-token
203'  0          0 A5 set-token
204'  1          0 A6 set-token
205'  2          0 A7 set-token
206'  3          0 A8 set-token
207' bl          0 A9 set-token
208' bs          0 AA set-token
209' bell        0 AB set-token
210' bounds      0 AC set-token
211' here        0 AD set-token
212' aligned     0 AE set-token
213' wbsplit     0 AF set-token
214' bwjoin      0 B0 set-token
215' b(<mark)    1 B1 set-token
216' b(>resolve) 1 B2 set-token
217\ ' set-token-table   0 B3 set-token    \ historical, not supported
218\ ' set-table 0 B4 set-token            \ historical, not supported
219' new-token   0 B5 set-token
220' named-token 0 B6 set-token
221' b(:)        1 B7 set-token
222' b(value)    1 B8 set-token
223' b(variable) 1 B9 set-token
224' b(constant) 1 BA set-token
225' b(create)   1 BB set-token
226' b(defer)    1 BC set-token
227' b(buffer:)  1 BD set-token
228' b(field)    1 BE set-token
229\ ' b(code)   0 BF set-token            \ historical, not supported
230' fc-instance 1 C0 set-token
231\ ' ferror    0 C1 set-token            \ Reserved
232' b(;)        1 C2 set-token
233' b(to)       1 C3 set-token
234' b(case)     1 C4 set-token
235' b(endcase)  1 C5 set-token
236' b(endof)    1 C6 set-token
237' #           0 C7 set-token
238' #s          0 C8 set-token
239' #>          0 C9 set-token
240' external-token 0 CA set-token
241' $find       0 CB set-token
242' offset16    0 CC set-token
243' evaluate    0 CD set-token
244\             0  CE reserved
245\             0  CF reserved
246' c,          0  D0 set-token
247' w,          0  D1 set-token
248' l,          0  D2 set-token
249' ,           0  D3 set-token
250' um*         0  D4 set-token
251' um/mod      0  D5 set-token
252\             0  D6 reserved
253\             0  D7 reserved
254' d+          0  D8 set-token
255' d-          0  D9 set-token
256' get-token   0  DA set-token
257' set-token   0  DB set-token
258' state       0  DC set-token  \ possibly broken
259' compile,    0  DD set-token
260' behavior    0  DE set-token
261
262\ Tokens 0xDF to 0xEF are reserved
263
264' start0            0  F0 set-token
265' start1            0  F1 set-token
266' start2            0  F2 set-token
267' start4            0  F3 set-token
268
269\ Tokens 0xF4 to 0xFB are reserved
270
271' ferror            0  FC set-token
272' version1          0  FD set-token
273
274\ ' 4-byte-id       0  FE set-token    \ Historical, not supported
275' end1              0  FF set-token
276
277\                   0 100 set-token    \ reserved
278' dma-alloc         0 101 set-token    \ Obsolete
279' my-address        0 102 set-token
280' my-space          0 103 set-token
281\ ' memmap          0 104 set-token    \ Obsolete
282' free-virtual      0 105 set-token
283\ ' >physical       0 106 set-token    \ Obsolete
284
285\ Tokens 0x107 to 0x10e are reserved
286
287' my-params         0 10f set-token    \ Obsolete
288' property          0 110 set-token
289' encode-int        0 111 set-token
290' encode+           0 112 set-token
291' encode-phys       0 113 set-token
292' encode-string     0 114 set-token
293' encode-bytes      0 115 set-token
294' reg               0 116 set-token
295' intr              0 117 set-token    \ Obsolete
296' driver            0 118 set-token    \ Obsolete
297' model             0 119 set-token
298' device-type       0 11A set-token
299' parse-2int        0 11B set-token
300' is-install        0 11C set-token    \ for framebuffer code
301' is-remove         0 11D set-token    \ for framebuffer code
302' is-selftest       0 11E set-token    \ for framebuffer code
303' new-device        0 11F set-token
304' diagnostic-mode?  0 120 set-token
305' display-status    0 121 set-token    \ Maybe obsolete
306' memory-test-suite 0 122 set-token
307' group-code        0 123 set-token    \ Obsolete
308' mask              0 124 set-token
309' get-msecs         0 125 set-token
310' ms                0 126 set-token
311' finish-device     0 127 set-token
312' decode-phys       0 128 set-token
313\ ' push-package    0 129 set-token    \ TODO - from proposal 215
314\ ' pop-package     0 12A set-token    \ TODO - from proposal 215
315' interpose         0 12B set-token    \ Recommended practice: Interposition
316
317\ Tokens 0x12C to 0x12F are reserved
318
319' map-low           0 130 set-token
320' sbus-intr>cpu     0 131 set-token    \ Obsolete
321
322\ Tokens 0x132 to 0x14f are reserved
323
324\ The following tokens are for the framebuffer code:
325' #lines            0 150 set-token
326' #columns          0 151 set-token
327' line#             0 152 set-token
328' column#           0 153 set-token
329' inverse?          0 154 set-token
330' inverse-screen?   0 155 set-token
331\ ' frame-buffer-busy 0 156 set-token  \ Historical, not supported
332' draw-character    0 157 set-token
333' reset-screen      0 158 set-token
334' toggle-cursor     0 159 set-token
335' erase-screen      0 15A set-token
336' blink-screen      0 15B set-token
337' invert-screen     0 15C set-token
338' insert-characters 0 15D set-token
339' delete-characters 0 15E set-token
340' insert-lines      0 15F set-token
341' delete-lines      0 160 set-token
342' draw-logo         0 161 set-token
343' frame-buffer-adr  0 162 set-token
344' screen-height     0 163 set-token
345' screen-width      0 164 set-token
346' window-top        0 165 set-token
347' window-left       0 166 set-token
348\ '                   0 167 set-token  \ Reserved
349\ ' foreground-color  0 168 set-token  \ From 16-color recommended practice
350\ ' background-color  0 169 set-token  \ From 16-color recommended practice
351' default-font      0 16A set-token
352' set-font          0 16B set-token
353' char-height       0 16C set-token
354' char-width        0 16D set-token
355' >font             0 16E set-token
356' fontbytes         0 16F set-token
357
358\ Tokens 0x170 to 0x17C are obsolete fb1 functions
359\ Tokens 0x17D to 0x17F are reserved
360
361\ The following tokens are for the framebuffer code, too:
362' fb8-draw-character 0 180 set-token
363' fb8-reset-screen   0 181 set-token
364' fb8-toggle-cursor  0 182 set-token
365' fb8-erase-screen   0 183 set-token
366' fb8-blink-screen   0 184 set-token
367' fb8-invert-screen  0 185 set-token
368' fb8-insert-characters 0 186 set-token
369' fb8-delete-characters 0 187 set-token
370' fb8-insert-lines   0 188 set-token
371' fb8-delete-lines   0 189 set-token
372' fb8-draw-logo      0 18A set-token
373' fb8-install        0 18B set-token
374
375\ Tokens 0x18C to 0x18F are reserved
376\ Tokens 0x190 to 0x196 are obsolete VMEbus tokens
377\ Tokens 0x197 to 0x19F are reserved
378
379\ ' return-buffer   0 1A0 set-token       \ Historical, not supported
380\ ' xmit-packet     0 1A1 set-token       \ Historical, not supported
381\ ' poll-packet     0 1A2 set-token       \ Historical, not supported
382\                   0 1A3 set-token       \ reserved
383' mac-address       0 1A4 set-token
384
385\ Tokens 0x1A5 to 0x200 are reserved
386
387' device-name       0 201 set-token
388' my-args           0 202 set-token
389' my-self           0 203 set-token
390' find-package      0 204 set-token
391' open-package      0 205 set-token
392' close-package     0 206 set-token
393' find-method       0 207 set-token
394' call-package      0 208 set-token
395' $call-parent      0 209 set-token
396' my-parent         0 20A set-token
397' ihandle>phandle   0 20B set-token
398\                   0 20C set-token       \ reserved
399' my-unit           0 20D set-token
400' $call-method      0 20E set-token
401' $open-package     0 20F set-token
402' processor-type    0 210 set-token       \ Obsolete
403' firmware-version  0 211 set-token       \ Obsolete
404' fcode-version     0 212 set-token       \ Obsolete
405\ ' alarm           0 213 set-token       \ TODO
406' (is-user-word)    0 214 set-token
407' suspend-fcode     0 215 set-token
408' fc-abort          0 216 set-token
409' catch             0 217 set-token
410' throw             0 218 set-token
411\ ' user-abort      0 219 set-token       \ TODO
412' get-my-property   0 21A set-token
413' decode-int        0 21B set-token
414' decode-string     0 21C set-token
415' get-inherited-property 0 21D set-token
416' delete-property   0 21E set-token
417' get-package-property 0 21F set-token
418' cpeek             0 220 set-token
419' wpeek             0 221 set-token
420' lpeek             0 222 set-token
421' cpoke             0 223 set-token
422' wpoke             0 224 set-token
423' lpoke             0 225 set-token
424' lwflip            0 226 set-token
425' lbflip            0 227 set-token
426' lbflips           0 228 set-token
427\ ' adr-mask        0 229 set-token       \ Historical, not supported
428
429\ Tokens 0x22A to 0x22F are reserved
430
431' rb@               0 230 set-token
432' rb!               0 231 set-token
433fc-set-normal-mmio-tokens                 \ Set rw@, rw!, rl@, rl!, rx@ and rx!
434
435' wbflips           0 236 set-token
436' lwflips           0 237 set-token
437\ ' probe           0 238 set-token       \ Obsolete
438\ ' probe-virtual   0 239 set-token       \ Obsolete
439\                   0 23A reserved
440' child             0 23B set-token
441' peer              0 23C set-token
442' next-property     0 23D set-token
443' byte-load         0 23E set-token
444' set-args          0 23F set-token
445' left-parse-string 0 240 set-token
446
447\ 64-bit extension tokens:
448' bxjoin            0 241 set-token
449' fc-<l@            0 242 set-token
450' lxjoin            0 243 set-token
451' wxjoin            0 244 set-token
452' x,                0 245 set-token
453' fc-x@             0 246 set-token
454' fc-x!             0 247 set-token
455' /x                0 248 set-token
456' /x*               0 249 set-token
457' xa+               0 24A set-token
458' xa1+              0 24B set-token
459' xbflip            0 24C set-token
460' xbflips           0 24D set-token
461' xbsplit           0 24E set-token
462' xlflip            0 24F set-token
463' xlflips           0 250 set-token
464' xlsplit           0 251 set-token
465' xwflip            0 252 set-token
466' xwflips           0 253 set-token
467' xwsplit           0 254 set-token
468
469\                    0 255 RESERVED FCODES
470\                    ...
471\                    0 5FF RESERVED FCODES
472
473\                    0 600 VENDOR FCODES
474\                    ...
475\                    0 7FF VENDOR FCODES
476
477\                    0 800 LOCAL FCODES
478\                    ...
479\                    0 FFF LOCAL FCODES
480
481