summaryrefslogtreecommitdiffstats
path: root/qemu/roms/SLOF/slof/fs/start-up.fs
diff options
context:
space:
mode:
Diffstat (limited to 'qemu/roms/SLOF/slof/fs/start-up.fs')
-rw-r--r--qemu/roms/SLOF/slof/fs/start-up.fs171
1 files changed, 171 insertions, 0 deletions
diff --git a/qemu/roms/SLOF/slof/fs/start-up.fs b/qemu/roms/SLOF/slof/fs/start-up.fs
new file mode 100644
index 000000000..f1488fa38
--- /dev/null
+++ b/qemu/roms/SLOF/slof/fs/start-up.fs
@@ -0,0 +1,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
+;