beastie.4th revision 212338
1\ Copyright (c) 2003 Scott Long <scottl@freebsd.org>
2\ Copyright (c) 2003 Aleksander Fafula <alex@fafula.com>
3\ All rights reserved.
4\
5\ Redistribution and use in source and binary forms, with or without
6\ modification, are permitted provided that the following conditions
7\ are met:
8\ 1. Redistributions of source code must retain the above copyright
9\    notice, this list of conditions and the following disclaimer.
10\ 2. Redistributions in binary form must reproduce the above copyright
11\    notice, this list of conditions and the following disclaimer in the
12\    documentation and/or other materials provided with the distribution.
13\
14\ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15\ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16\ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17\ ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18\ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19\ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20\ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21\ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22\ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23\ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24\ SUCH DAMAGE.
25\
26\ $FreeBSD: head/sys/boot/forth/beastie.4th 212338 2010-09-08 20:10:29Z jhb $
27
28marker task-beastie.4th
29
30include /boot/screen.4th
31include /boot/frames.4th
32
33hide
34
35variable menuidx
36variable menubllt
37variable menuX
38variable menuY
39variable promptwidth
40
41variable bootkey
42variable bootacpikey
43variable bootsafekey
44variable bootverbosekey
45variable bootsinglekey
46variable escapekey
47variable rebootkey
48
4946 constant dot
50
51\ The BSD Daemon.  He is 19 rows high and 34 columns wide
52: beastie-logo ( x y -- )
532dup at-xy ."               [1;31m,        ," 1+
542dup at-xy ."              /(        )`" 1+
552dup at-xy ."              \ \___   / |" 1+
562dup at-xy ."              /- [37m_[31m  `-/  '" 1+
572dup at-xy ."             ([37m/\/ \[31m \   /\" 1+
582dup at-xy ."             [37m/ /   |[31m `    \" 1+
592dup at-xy ."             [34mO O   [37m) [31m/    |" 1+
602dup at-xy ."             [37m`-^--'[31m`<     '" 1+
612dup at-xy ."            (_.)  _  )   /" 1+
622dup at-xy ."             `.___/`    /       " 1+
632dup at-xy ."               `-----' /" 1+
642dup at-xy ."  [33m<----.[31m     __ / __   \" 1+
652dup at-xy ."  [33m<----|====[31mO)))[33m==[31m) \) /[33m====|" 1+
662dup at-xy ."  [33m<----'[31m    `--' `.__,' \" 1+
672dup at-xy ."               |        |" 1+
682dup at-xy ."                \       /       /\" 1+
692dup at-xy ."           [36m______[31m( (_  / \______/" 1+
702dup at-xy ."         [36m,'  ,-----'   |" 1+
71at-xy ."         `--{__________) [0m"
72;
73
74: beastiebw-logo ( x y -- )
75	2dup at-xy ."              ,        ," 1+
76	2dup at-xy ."             /(        )`" 1+
77	2dup at-xy ."             \ \___   / |" 1+
78	2dup at-xy ."             /- _  `-/  '" 1+
79	2dup at-xy ."            (/\/ \ \   /\" 1+
80	2dup at-xy ."            / /   | `    \" 1+
81	2dup at-xy ."            O O   ) /    |" 1+
82	2dup at-xy ."            `-^--'`<     '" 1+
83	2dup at-xy ."           (_.)  _  )   /" 1+
84	2dup at-xy ."            `.___/`    /" 1+
85	2dup at-xy ."              `-----' /" 1+
86	2dup at-xy ." <----.     __ / __   \" 1+
87	2dup at-xy ." <----|====O)))==) \) /====" 1+
88	2dup at-xy ." <----'    `--' `.__,' \" 1+
89	2dup at-xy ."              |        |" 1+
90	2dup at-xy ."               \       /       /\" 1+
91	2dup at-xy ."          ______( (_  / \______/" 1+
92	2dup at-xy ."        ,'  ,-----'   |" 1+
93	     at-xy ."        `--{__________)"
94;
95
96: fbsdbw-logo ( x y -- )
97	2dup at-xy ."      ______" 1+
98	2dup at-xy ."     |  ____| __ ___  ___ " 1+
99	2dup at-xy ."     | |__ | '__/ _ \/ _ \" 1+
100	2dup at-xy ."     |  __|| | |  __/  __/" 1+
101	2dup at-xy ."     | |   | | |    |    |" 1+
102	2dup at-xy ."     |_|   |_|  \___|\___|" 1+
103	2dup at-xy ."      ____   _____ _____" 1+
104	2dup at-xy ."     |  _ \ / ____|  __ \" 1+
105	2dup at-xy ."     | |_) | (___ | |  | |" 1+
106	2dup at-xy ."     |  _ < \___ \| |  | |" 1+
107	2dup at-xy ."     | |_) |____) | |__| |" 1+
108	2dup at-xy ."     |     |      |      |" 1+
109	     at-xy ."     |____/|_____/|_____/"
110;
111
112: print-logo ( x y -- )
113	s" loader_logo" getenv
114	dup -1 = if
115		drop
116		fbsdbw-logo
117		exit
118	then
119	2dup s" fbsdbw" compare-insensitive 0= if
120		2drop
121		fbsdbw-logo
122		exit
123	then
124	2dup s" beastiebw" compare-insensitive 0= if
125		2drop
126		beastiebw-logo
127		exit
128	then
129	2dup s" beastie" compare-insensitive 0= if
130		2drop
131		beastie-logo
132		exit
133	then
134	2dup s" none" compare-insensitive 0= if
135		2drop
136		\ no logo
137		exit
138	then
139	2drop
140	fbsdbw-logo
141;
142
143: acpienabled? ( -- flag )
144	s" acpi_load" getenv
145	dup -1 = if
146		drop false exit
147	then
148	s" YES" compare-insensitive 0<> if
149		false exit
150	then
151	s" hint.acpi.0.disabled" getenv
152	dup -1 <> if
153		s" 0" compare 0<> if
154			false exit
155		then
156	else
157		drop
158	then
159	true
160;
161
162: printmenuitem ( -- n )
163	menuidx @
164	1+ dup
165	menuidx !
166	menuY @ + dup menuX @ swap at-xy
167	menuidx @ .
168	menuX @ 1+ swap at-xy
169	menubllt @ emit
170	menuidx @ 48 +
171;
172
173: beastie-menu ( -- )
174	0 menuidx !
175	dot menubllt !
176	8 menuY !
177	5 menuX !
178	clear
179	46 4 print-logo
180	42 20 2 2 box
181	13 6 at-xy ." Welcome to FreeBSD!"
182	printmenuitem ."  Boot FreeBSD [default]" bootkey !
183	s" arch-i386" environment? if
184		drop
185		printmenuitem ."  Boot FreeBSD with ACPI " bootacpikey !
186		acpienabled? if
187			." disabled"
188		else
189			." enabled"
190		then
191	else
192		-2 bootacpikey !
193	then
194	printmenuitem ."  Boot FreeBSD in Safe Mode" bootsafekey !
195	printmenuitem ."  Boot FreeBSD in single user mode" bootsinglekey !
196	printmenuitem ."  Boot FreeBSD with verbose logging" bootverbosekey !
197	printmenuitem ."  Escape to loader prompt" escapekey !
198	printmenuitem ."  Reboot" rebootkey !
199	menuX @ 20 at-xy
200	." Select option, [Enter] for default"
201	menuX @ 21 at-xy
202	s" or [Space] to pause timer    " dup 2 - promptwidth !
203	type
204;
205
206: tkey
207	seconds +
208	begin 1 while
209		over 0<> if
210			dup seconds u< if
211				drop
212				-1
213				exit
214			then
215			menuX @ promptwidth @ + 21 at-xy dup seconds - .
216		then
217		key? if
218			drop
219			key
220			exit
221		then
222	50 ms
223	repeat
224;
225
226set-current
227
228: beastie-start
229	s" beastie_disable" getenv
230	dup -1 <> if
231		s" YES" compare-insensitive 0= if
232			exit
233		then
234	else
235		drop
236	then
237	beastie-menu
238	s" autoboot_delay" getenv
239	dup -1 = if
240		drop
241		10
242	else
243		2dup s" -1" compare 0= if
244			0 boot
245		then
246		0 s>d 2swap >number 2drop drop
247	then
248	begin
249		dup tkey
250		0 25 at-xy
251		dup 32 = if nip 0 swap then
252		dup -1 = if 0 boot then
253		dup 13 = if 0 boot then
254		dup bootkey @ = if 0 boot then
255		dup bootacpikey @ = if
256			acpienabled? if
257				s" acpi_load" unsetenv
258				s" 1" s" hint.acpi.0.disabled" setenv
259				s" 1" s" loader.acpi_disabled_by_user" setenv
260			else
261				s" YES" s" acpi_load" setenv
262				s" 0" s" hint.acpi.0.disabled" setenv
263			then
264			0 boot
265		then
266		dup bootsafekey @ = if
267			s" arch-i386" environment? if
268				drop
269				s" acpi_load" unsetenv
270				s" 1" s" hint.acpi.0.disabled" setenv
271				s" 1" s" loader.acpi_disabled_by_user" setenv
272				s" 1" s" hint.apic.0.disabled" setenv
273			then
274			s" 0" s" hw.ata.ata_dma" setenv
275			s" 0" s" hw.ata.atapi_dma" setenv
276			s" 0" s" hw.ata.wc" setenv
277			s" 0" s" hw.eisa_slots" setenv
278			s" 1" s" hint.kbdmux.0.disabled" setenv
279			0 boot
280		then
281		dup bootverbosekey @ = if
282			s" YES" s" boot_verbose" setenv
283			0 boot
284		then
285		dup bootsinglekey @ = if
286			s" YES" s" boot_single" setenv
287			0 boot
288		then
289		dup escapekey @ = if
290			2drop
291			s" NO" s" autoboot_delay" setenv
292			exit
293		then
294		rebootkey @ = if 0 reboot then
295	again
296;
297
298previous
299