blob: f1488fa3804688d1e03bc7ff4c343d9f964122c8 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
|
\ *****************************************************************************
\ * Copyright (c) 2004, 2008 IBM Corporation
\ * All rights reserved.
\ * This program and the accompanying materials
\ * are made available under the terms of the BSD License
\ * which accompanies this distribution, and is available at
\ * http://www.opensource.org/licenses/bsd-license.php
\ *
\ * Contributors:
\ * IBM Corporation - initial implementation
\ ****************************************************************************/
: (boot) ( -- )
s" Executing following boot-command: "
boot-command $cat nvramlog-write-string-cr
s" boot-command" evaluate \ get boot command
['] evaluate catch ?dup IF \ and execute it
." boot attempt returned: "
abort"-str @ count type cr
nip nip \ drop string from 1st evaluate
throw
THEN
;
\ Note: The following ESC sequences has to be handled:
\ 1B 4F 50
\ 1B 5B 31 31 7E
\ Reads and converts the function key.
\ key = F1 -- n = 1
: (function-key) ( -- n )
key? IF
key CASE
50 OF 1 ENDOF
7e OF 1 ENDOF
dup OF 0 ENDOF
ENDCASE
THEN
;
\ Checks if an ESC sequence occurs.
: (esc-sequence) ( -- n )
key? IF
key CASE
4f OF (function-key) ENDOF
5b OF
key key (function-key) ENDOF
dup OF 0 ENDOF
ENDCASE
THEN
;
: (s-pressed) ( -- )
s" An 's' has been pressed. Entering Open Firmware Prompt"
nvramlog-write-string-cr
;
: (boot?) ( -- )
of-prompt? not auto-boot? and IF
(boot)
THEN
;
#include "sms/sms-load.fs"
\ Watchdog will be rearmed during load if use-load-watchdog variable is TRUE
TRUE VALUE use-load-watchdog?
1 value my-boot-dev
1 value digit-val
0 value boot-dev-no
: boot-selected
1 to my-boot-dev
BEGIN parse-word dup WHILE
boot-dev-no my-boot-dev = IF
s" boot " 2swap $cat
['] evaluate catch ?dup IF \ and execute it
." boot attempt returned: "
abort"-str @ count type cr
throw
THEN
0 0 load-list 2!
UNLOOP EXIT
ELSE
2drop
THEN
my-boot-dev 1 + to my-boot-dev
REPEAT 2drop 0 0 load-list 2!
(boot)
;
: boot-start
\ Remove multiple F12 key presses if any
BEGIN key? WHILE
key drop
REPEAT
decimal
BEGIN parse-word dup WHILE
my-boot-dev (u.) s" . " $cat type 2dup type ." : " de-alias type cr
my-boot-dev 1 + to my-boot-dev
REPEAT 2drop 0 0 load-list 2!
cr BEGIN KEY dup emit
dup isdigit IF
dup 30 - to digit-val
boot-dev-no a * digit-val + to boot-dev-no
THEN
d = UNTIL
boot-dev-no my-boot-dev < IF
s" boot-selected " s" $bootdev" evaluate $cat strdup evaluate
ELSE
." Invalid choice!" cr
THEN
hex
;
: boot-menu-start
." Select boot device:" cr cr
s" boot-start " s" $bootdev" evaluate $cat strdup evaluate
;
: boot-menu-enabled? ( -- true|false )
s" qemu,boot-menu" get-chosen IF
decode-int 1 = IF
2drop TRUE EXIT
THEN
2drop
THEN
FALSE
;
: f12-pressed?
34 = >r 32 = r> and IF
TRUE
ELSE
FALSE
THEN
;
: start-it ( -- )
key? IF
key CASE
[char] s OF (s-pressed) ENDOF
1b OF
(esc-sequence) CASE
1 OF
console-clean-fifo
f12-pressed? boot-menu-enabled? and IF
boot-menu-start
ELSE
(boot?)
THEN
ENDOF
dup OF (boot?) ENDOF
ENDCASE
ENDOF
dup OF (boot?) ENDOF
ENDCASE
ELSE
(boot?)
THEN
disable-watchdog FALSE to use-load-watchdog?
.banner
;
|