beastie.4th revision 215016
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 215016 2010-11-08 21:50:45Z 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" hint.acpi.0.rsdp" getenv
145	dup -1 = if
146		drop false exit
147	then
148	2drop
149	s" hint.acpi.0.disabled" getenv
150	dup -1 <> if
151		s" 0" compare 0<> if
152			false exit
153		then
154	else
155		drop
156	then
157	true
158;
159
160: printmenuitem ( -- n )
161	menuidx @
162	1+ dup
163	menuidx !
164	menuY @ + dup menuX @ swap at-xy
165	menuidx @ .
166	menuX @ 1+ swap at-xy
167	menubllt @ emit
168	menuidx @ 48 +
169;
170
171: beastie-menu ( -- )
172	0 menuidx !
173	dot menubllt !
174	8 menuY !
175	5 menuX !
176	clear
177	46 4 print-logo
178	42 20 2 2 box
179	13 6 at-xy ." Welcome to FreeBSD!"
180	printmenuitem ."  Boot FreeBSD [default]" bootkey !
181	s" arch-i386" environment? if
182		drop
183		printmenuitem ."  Boot FreeBSD with ACPI " bootacpikey !
184		acpienabled? if
185			." disabled"
186		else
187			." enabled"
188		then
189	else
190		-2 bootacpikey !
191	then
192	printmenuitem ."  Boot FreeBSD in Safe Mode" bootsafekey !
193	printmenuitem ."  Boot FreeBSD in single user mode" bootsinglekey !
194	printmenuitem ."  Boot FreeBSD with verbose logging" bootverbosekey !
195	printmenuitem ."  Escape to loader prompt" escapekey !
196	printmenuitem ."  Reboot" rebootkey !
197	menuX @ 20 at-xy
198	." Select option, [Enter] for default"
199	menuX @ 21 at-xy
200	s" or [Space] to pause timer    " dup 2 - promptwidth !
201	type
202;
203
204: tkey
205	seconds +
206	begin 1 while
207		over 0<> if
208			dup seconds u< if
209				drop
210				-1
211				exit
212			then
213			menuX @ promptwidth @ + 21 at-xy dup seconds - .
214		then
215		key? if
216			drop
217			key
218			exit
219		then
220	50 ms
221	repeat
222;
223
224set-current
225
226: beastie-start
227	s" beastie_disable" getenv
228	dup -1 <> if
229		s" YES" compare-insensitive 0= if
230			exit
231		then
232	else
233		drop
234	then
235	beastie-menu
236	s" autoboot_delay" getenv
237	dup -1 = if
238		drop
239		10
240	else
241		2dup s" -1" compare 0= if
242			0 boot
243		then
244		0 s>d 2swap >number 2drop drop
245	then
246	begin
247		dup tkey
248		0 25 at-xy
249		dup 32 = if nip 0 swap then
250		dup -1 = if 0 boot then
251		dup 13 = if 0 boot then
252		dup bootkey @ = if 0 boot then
253		dup bootacpikey @ = if
254			acpienabled? if
255				s" 1" s" hint.acpi.0.disabled" setenv
256				s" 1" s" loader.acpi_disabled_by_user" setenv
257			else
258				s" 0" s" hint.acpi.0.disabled" setenv
259			then
260			0 boot
261		then
262		dup bootsafekey @ = if
263			s" arch-i386" environment? if
264				drop
265				s" 1" s" hint.acpi.0.disabled" setenv
266				s" 1" s" loader.acpi_disabled_by_user" setenv
267				s" 1" s" hint.apic.0.disabled" setenv
268			then
269			s" 0" s" hw.ata.ata_dma" setenv
270			s" 0" s" hw.ata.atapi_dma" setenv
271			s" 0" s" hw.ata.wc" setenv
272			s" 0" s" hw.eisa_slots" setenv
273			s" 1" s" hint.kbdmux.0.disabled" setenv
274			0 boot
275		then
276		dup bootverbosekey @ = if
277			s" YES" s" boot_verbose" setenv
278			0 boot
279		then
280		dup bootsinglekey @ = if
281			s" YES" s" boot_single" setenv
282			0 boot
283		then
284		dup escapekey @ = if
285			2drop
286			s" NO" s" autoboot_delay" setenv
287			exit
288		then
289		rebootkey @ = if 0 reboot then
290	again
291;
292
293previous
294