summaryrefslogtreecommitdiffstats
path: root/qemu/roms/SLOF/slof/fs/start-up.fs
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
;