Date: Mon, 12 Nov 2012 10:47:39 -0800 From: Devin Teske <devin.teske@fisglobal.com> To: Peter Jeremy <peter@rulingia.com> Cc: Adrian Chadd <adrian@freebsd.org>, Devin Teske <dteske@freebsd.org>, freebsd-current@freebsd.org Subject: Re: HEADS UP: Forth Optimizations Message-ID: <FE3CFE32-04C2-499D-8DE5-4B11CAEE87B4@fisglobal.com> In-Reply-To: <20121112013000.GD5594@server.rulingia.com> References: <A0A46155-0969-459E-BCD6-4AA7B8B371BE@fisglobal.com> <20121112013000.GD5594@server.rulingia.com>
next in thread | previous in thread | raw e-mail | index | archive | help
--Apple-Mail=_769728F7-62D7-41E2-9431-E82F021FEFE6
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset="us-ascii"
On Nov 11, 2012, at 5:30 PM, Peter Jeremy wrote:
> On 2012-Nov-10 16:53:10 -0800, Devin Teske <devin.teske@fisglobal.com> wr=
ote:
>> Can someone help review this for the commit log?
>=20
> I've had a look through the proposed patch and my comments follow.
> Other than that, it looks good to me.
>=20
Thanks Peter!
Replies inline below.
>> Index: menu-commands.4th
>> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
>> --- menu-commands.4th (revision 242835)
>> +++ menu-commands.4th (working copy)
> ...
>> @@ -185,21 +240,21 @@ variable root_state
> ...
>> s" set kernel=3D${kernel_prefix}${kernel[N]}${kernel_suffix}"
>> - \ command to assemble full kernel-path
>> - -rot tuck 36 + c! swap \ replace 'N' with array index value
>> - evaluate \ sets $kernel to full kernel-path
>> + 36 +c! \ replace 'N' with ASCII numeral
>> + evaluate
>=20
> I think the "sets $kernel to full kernel-path" comment is worth keeping.
>=20
Updated, thx.
>> s" set root=3D${root_prefix}${root[N]}${root_suffix}"
>> - \ command to assemble root image-path
>> - -rot tuck 30 + c! swap \ replace 'N' with array index value
>> - evaluate \ sets $kernel to full kernel-path
>> + 30 +c! \ replace 'N' with ASCII numeral
>> + evaluate
>=20
> Likewise, this could do with a (corrected) comment that it sets $root
> to the full path to root.
>=20
Likewise, updated.
>> Index: menu.4th
>> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
>> --- menu.4th (revision 242835)
>> +++ menu.4th (working copy)
>> @@ -184,18 +223,15 @@ create init_text8 255 allot
>>=20
>> \ base name of environment variable
>> loader_color? if
>> - s" ansi_caption[x]"
>> + dup ansi_caption[x]
>> else
>> - s" menu_caption[x]"
>> + dup menu_caption[x]
>> then=09
>=20
> Could this be simplified to
>=20
> =3D dup
> =3D loader_color? if
> =3D ansi_caption[x]
> =3D else
> =3D menu_caption[x]
> =3D then=09
>=20
Sure, done. Actually, found two occurrences of this that I corrected.
> Or, at a higher level, should this whole block be pulled into a new
> word (along with similar words for toggled_{ansi,text}[x] and
> {ansi,menu}_caption[x][y]?
>=20
I looked at the uses where ansi* is used in place of non-ansi* and it's not=
just within loader_color? blocks (that was in-fact the minority of cases).=
Cooking it down further would make things more complicated I fear.
If I come up with a cute way to simplify this, I'll try it out in another c=
ommit.
>> @@ -227,36 +263,26 @@ create init_text8 255 allot
> ...
>> getenv dup -1 <> if
>> \ Assign toggled text to menu caption
>=20
> Some comments on stack contents around here would make it somewhat
> easier to follow what is going on.
>=20
Done. I also made updates to cycle_menuitem for similarly-dense code.
>> @@ -329,19 +340,18 @@ create init_text8 255 allot
> ...
>> \ This is highly unlikely to occur, but to make
>> \ sure that things move along smoothly, allocate
>> \ a temporary NULL string
>>=20
>> + drop ( getenv cruft )
>> s" "
>> then
>> then
>=20
> Is this the memory leak? If so, can I suggest that this be commited
> separately since it is a simple change and is distinct from the other
> changes you are proposing.
You got it. Committed as r242923
>=20
>> @@ -357,14 +367,14 @@ create init_text8 255 allot
>> \=20
>> \ Let's perform what we need to with the above.
>>=20
>> - \ base name of menuitem caption var
>> + \ Assign array value text to menu caption
>> + 4 pick
>=20
> According to the docementation just above this hunk, there are only 4
> items on the stack, so "4 pick" seems wrong, though it is consistent
> with my understanding of the old code. The "2 pick [char] 0" you
> added earlier seems to similarly be out-by-one, though consistent.
>=20
My mistake was that the comments need to be updated to say C-Addr/U not C-A=
ddr (the C-Addr/U counts to make 5 items on the stack, satisfying the "4 pi=
ck"). I've updated the comment to reflect the stack contents more accuratel=
y.
>> @@ -521,17 +528,20 @@ create init_text8 255 allot
>>=20
>> \ If this is the ACPI menu option, act accordingly.
>> dup menuacpi @ =3D if
>> - acpimenuitem ( -- C-Addr/U | -1 )
>> + dup acpimenuitem ( n -- n n c-addr/u | n n -1 )
>> + dup -1 <> if
>> + 13 +c! ( n n c-addr/u -- n ) \ replace 'x'
>=20
> I think the stack here should be ( n n c-addr/u -- n c-addr/u )
>=20
Good catch! Updated.
>> @@ -950,100 +914,43 @@ create init_text8 255 allot
>>=20
>> 49 \ Iterator start (loop range 49 to 56; ASCII '1' to '8')
>> begin
>> - \ Unset variables in-order of appearance in menu.4th(8)
>=20
> Does the order matter? I notice you've changed it.
No, order doesn't matter. It was just a comment to myself.
Since I've re-ordered things, the axiom is no longer true.
Please find an updated patch attached (as patch.txt) with the aforementione=
d changes.
--=20
Devin
_____________
The information contained in this message is proprietary and/or confidentia=
l. If you are not the intended recipient, please: (i) delete the message an=
d all copies; (ii) do not disclose, distribute or use the message in any ma=
nner; and (iii) notify the sender immediately. In addition, please be aware=
that any message addressed to our domain is subject to archiving and revie=
w by persons other than the intended recipient. Thank you.
--Apple-Mail=_769728F7-62D7-41E2-9431-E82F021FEFE6
Content-Disposition: attachment; filename="patch.txt"
Content-Type: text/plain; name="patch.txt"
Content-Transfer-Encoding: quoted-printable
Index: menu-commands.4th
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- menu-commands.4th (revision 242835)
+++ menu-commands.4th (working copy)
@@ -31,6 +31,10 @@ include /boot/menusets.4th
variable kernel_state
variable root_state
=20
+\=20
+\ ACPI
+\=20
+
: acpi_enable ( -- )
s" set acpi_load=3DYES" evaluate \ XXX deprecated but harmless
s" set hint.acpi.0.disabled=3D0" evaluate
@@ -58,9 +62,38 @@ variable root_state
TRUE \ loop menu again
;
=20
+\=20
+\ Safe Mode
+\=20
+
+: safemode_enabled? ( -- flag )
+ s" kern.smp.disabled" getenv -1 <> dup if
+ swap drop ( c-addr flag -- flag )
+ then
+;
+
+: safemode_enable ( -- )
+ s" set kern.smp.disabled=3D1" evaluate
+ s" set hw.ata.ata_dma=3D0" evaluate
+ s" set hw.ata.atapi_dma=3D0" evaluate
+ s" set hw.ata.wc=3D0" evaluate
+ s" set hw.eisa_slots=3D0" evaluate
+ s" set kern.eventtimer.periodic=3D1" evaluate
+ s" set kern.geom.part.check_integrity=3D0" evaluate
+;
+
+: safemode_disable ( -- )
+ s" kern.smp.disabled" unsetenv
+ s" hw.ata.ata_dma" unsetenv
+ s" hw.ata.atapi_dma" unsetenv
+ s" hw.ata.wc" unsetenv
+ s" hw.eisa_slots" unsetenv
+ s" kern.eventtimer.periodic" unsetenv
+ s" kern.geom.part.check_integrity" unsetenv
+;
+
: init_safemode ( N -- N )
- s" kern.smp.disabled" getenv -1 <> if
- drop ( n c-addr -- n ) \ unused
+ safemode_enabled? if
toggle_menuitem ( n -- n )
then
;
@@ -70,25 +103,10 @@ variable root_state
=20
\ Now we're going to make the change effective
=20
- s" toggle_stateN @" \ base name of toggle state var
- -rot 2dup 12 + c! rot \ replace 'N' with ASCII numeral
-
- evaluate 0=3D if
- s" kern.smp.disabled" unsetenv
- s" hw.ata.ata_dma" unsetenv
- s" hw.ata.atapi_dma" unsetenv
- s" hw.ata.wc" unsetenv
- s" hw.eisa_slots" unsetenv
- s" kern.eventtimer.periodic" unsetenv
- s" kern.geom.part.check_integrity" unsetenv
+ dup toggle_stateN @ 0=3D if
+ safemode_disable
else
- s" set kern.smp.disabled=3D1" evaluate
- s" set hw.ata.ata_dma=3D0" evaluate
- s" set hw.ata.atapi_dma=3D0" evaluate
- s" set hw.ata.wc=3D0" evaluate
- s" set hw.eisa_slots=3D0" evaluate
- s" set kern.eventtimer.periodic=3D1" evaluate
- s" set kern.geom.part.check_integrity=3D0" evaluate
+ safemode_enable
then
=20
menu-redraw
@@ -96,9 +114,26 @@ variable root_state
TRUE \ loop menu again
;
=20
+\=20
+\ Single User Mode
+\=20
+
+: singleuser_enabled? ( -- flag )
+ s" boot_single" getenv -1 <> dup if
+ swap drop ( c-addr flag -- flag )
+ then
+;
+
+: singleuser_enable ( -- )
+ s" set boot_single=3DYES" evaluate
+;
+
+: singleuser_disable ( -- )
+ s" boot_single" unsetenv
+;
+
: init_singleuser ( N -- N )
- s" boot_single" getenv -1 <> if
- drop ( n c-addr -- n ) \ unused
+ singleuser_enabled? if
toggle_menuitem ( n -- n )
then
;
@@ -109,21 +144,35 @@ variable root_state
=20
\ Now we're going to make the change effective
=20
- s" toggle_stateN @" \ base name of toggle state var
- -rot 2dup 12 + c! rot \ replace 'N' with ASCII numeral
-
- evaluate 0=3D if
- s" boot_single" unsetenv
+ dup toggle_stateN @ 0=3D if
+ singleuser_disable
else
- s" set boot_single=3DYES" evaluate
+ singleuser_enable
then
=20
TRUE \ loop menu again
;
=20
+\=20
+\ Verbose Boot
+\=20
+
+: verbose_enabled? ( -- flag )
+ s" boot_verbose" getenv -1 <> dup if
+ swap drop ( c-addr flag -- flag )
+ then
+;
+
+: verbose_enable ( -- )
+ s" set boot_verbose=3DYES" evaluate
+;
+
+: verbose_disable ( -- )
+ s" boot_verbose" unsetenv
+;
+
: init_verbose ( N -- N )
- s" boot_verbose" getenv -1 <> if
- drop ( n c-addr -- n ) \ unused
+ verbose_enabled? if
toggle_menuitem ( n -- n )
then
;
@@ -134,18 +183,19 @@ variable root_state
=20
\ Now we're going to make the change effective
=20
- s" toggle_stateN @" \ base name of toggle state var
- -rot 2dup 12 + c! rot \ replace 'N' with ASCII numeral
-
- evaluate 0=3D if
- s" boot_verbose" unsetenv
+ dup toggle_stateN @ 0=3D if
+ verbose_disable
else
- s" set boot_verbose=3DYES" evaluate
+ verbose_enable
then
=20
TRUE \ loop menu again
;
=20
+\=20
+\ Escape to Prompt
+\=20
+
: goto_prompt ( N -- N FALSE )
=20
s" set autoboot_delay=3DNO" evaluate
@@ -158,11 +208,12 @@ variable root_state
FALSE \ exit the menu
;
=20
+\=20
+\ Cyclestate (used by kernel/root below)
+\=20
+
: init_cyclestate ( N K -- N )
- over ( n k -- n k n )
- s" cycle_stateN" ( n k n -- n k n c-addr u )
- -rot tuck 11 + c! swap ( n k n c-addr u -- n k c-addr u )
- evaluate ( n k c-addr u -- n k addr )
+ over cycle_stateN ( n k -- n k addr )
begin
tuck @ ( n k addr -- n addr k c )
over <> ( n addr k c -- n addr k 0|-1 )
@@ -174,6 +225,10 @@ variable root_state
2drop ( n k addr -- n )
;
=20
+\
+\ Kernel
+\=20
+
: init_kernel ( N -- N )
kernel_state @ ( n -- n k )
init_cyclestate ( n k -- n )
@@ -185,21 +240,21 @@ variable root_state
=20
\ Now we're going to make the change effective
=20
- s" cycle_stateN" \ base name of array state var
- -rot 2dup 11 + c! rot \ replace 'N' with ASCII numeral
- evaluate \ translate name into address
- @ \ dereference address into value
+ dup cycle_stateN @
dup kernel_state ! \ save a copy for re-initialization
48 + \ convert to ASCII numeral
=20
s" set kernel=3D${kernel_prefix}${kernel[N]}${kernel_suffix}"
- \ command to assemble full kernel-path
- -rot tuck 36 + c! swap \ replace 'N' with array index value
- evaluate \ sets $kernel to full kernel-path
+ 36 +c! \ replace 'N' with ASCII numeral
+ evaluate \ sets $kernel to full kernel-path
=20
TRUE \ loop menu again
;
=20
+\=20
+\ Root
+\=20
+
: init_root ( N -- N )
root_state @ ( n -- n k )
init_cyclestate ( n k -- n )
@@ -211,21 +266,21 @@ variable root_state
=20
\ Now we're going to make the change effective
=20
- s" cycle_stateN" \ base name of array state var
- -rot 2dup 11 + c! rot \ replace 'N' with ASCII numeral
- evaluate \ translate name into address
- @ \ dereference address into value
+ dup cycle_stateN @
dup root_state ! \ save a copy for re-initialization
48 + \ convert to ASCII numeral
=20
s" set root=3D${root_prefix}${root[N]}${root_suffix}"
- \ command to assemble root image-path
- -rot tuck 30 + c! swap \ replace 'N' with array index value
- evaluate \ sets $kernel to full kernel-path
+ 30 +c! \ replace 'N' with ASCII numeral
+ evaluate \ sets $root to full root-path
=20
TRUE \ loop menu again
;
=20
+\=20
+\ Menusets
+\=20
+
: goto_menu ( N M -- N TRUE )
menu-unset
menuset-loadsetnum ( n m -- n )
Index: menu.4th
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- menu.4th (revision 242923)
+++ menu.4th (working copy)
@@ -116,6 +116,48 @@ create init_text6 255 allot
create init_text7 255 allot
create init_text8 255 allot
=20
+: +c! ( N C-ADDR/U K -- C-ADDR/U )
+ 3 pick 3 pick ( n c-addr/u k -- n c-addr/u k n c-addr )
+ rot + c! ( n c-addr/u k n c-addr -- n c-addr/u )
+ rot drop ( n c-addr/u -- c-addr/u )
+;
+
+: menukeyN ( N -- ADDR ) s" menukeyN" 7 +c! evaluate ;
+: init_stateN ( N -- ADDR ) s" init_stateN" 10 +c! evaluate ;
+: toggle_stateN ( N -- ADDR ) s" toggle_stateN" 12 +c! evaluate ;
+: cycle_stateN ( N -- ADDR ) s" cycle_stateN" 11 +c! evaluate ;
+: init_textN ( N -- C-ADDR ) s" init_textN" 9 +c! evaluate ;
+
+: str_loader_menu_title ( -- C-ADDR/U ) s" loader_menu_title" ;
+: str_loader_menu_timeout_x ( -- C-ADDR/U ) s" loader_menu_timeout_x" ;
+: str_loader_menu_timeout_y ( -- C-ADDR/U ) s" loader_menu_timeout_y" ;
+: str_menu_init ( -- C-ADDR/U ) s" menu_init" ;
+: str_menu_timeout_command ( -- C-ADDR/U ) s" menu_timeout_command" ;
+: str_menu_reboot ( -- C-ADDR/U ) s" menu_reboot" ;
+: str_menu_acpi ( -- C-ADDR/U ) s" menu_acpi" ;
+: str_menu_options ( -- C-ADDR/U ) s" menu_options" ;
+: str_menu_optionstext ( -- C-ADDR/U ) s" menu_optionstext" ;
+
+: str_menu_init[x] ( -- C-ADDR/U ) s" menu_init[x]" ;
+: str_menu_command[x] ( -- C-ADDR/U ) s" menu_command[x]" ;
+: str_menu_caption[x] ( -- C-ADDR/U ) s" menu_caption[x]" ;
+: str_ansi_caption[x] ( -- C-ADDR/U ) s" ansi_caption[x]" ;
+: str_menu_keycode[x] ( -- C-ADDR/U ) s" menu_keycode[x]" ;
+: str_toggled_text[x] ( -- C-ADDR/U ) s" toggled_text[x]" ;
+: str_toggled_ansi[x] ( -- C-ADDR/U ) s" toggled_ansi[x]" ;
+: str_menu_caption[x][y] ( -- C-ADDR/U ) s" menu_caption[x][y]" ;
+: str_ansi_caption[x][y] ( -- C-ADDR/U ) s" ansi_caption[x][y]" ;
+
+: menu_init[x] ( N -- C-ADDR/U ) str_menu_init[x] 10 +c! =
;
+: menu_command[x] ( N -- C-ADDR/U ) str_menu_command[x] 13 +c! =
;
+: menu_caption[x] ( N -- C-ADDR/U ) str_menu_caption[x] 13 +c! =
;
+: ansi_caption[x] ( N -- C-ADDR/U ) str_ansi_caption[x] 13 +c! =
;
+: menu_keycode[x] ( N -- C-ADDR/U ) str_menu_keycode[x] 13 +c! =
;
+: toggled_text[x] ( N -- C-ADDR/U ) str_toggled_text[x] 13 +c! =
;
+: toggled_ansi[x] ( N -- C-ADDR/U ) str_toggled_ansi[x] 13 +c! =
;
+: menu_caption[x][y] ( N M -- C-ADDR/U ) str_menu_caption[x][y] 16 +c! =
13 +c! ;
+: ansi_caption[x][y] ( N M -- C-ADDR/U ) str_ansi_caption[x][y] 16 +c! =
13 +c! ;
+
: arch-i386? ( -- BOOL ) \ Returns TRUE (-1) on i386, FALSE (0) =
otherwise.
s" arch-i386" environment? dup if
drop
@@ -172,10 +214,7 @@ create init_text8 255 allot
\ ASCII numeral equal to user-selected menu item must be on the =
stack.
\ We do not modify the stack, so the ASCII numeral is left on =
top.
=20
- s" init_textN" \ base name of buffer
- -rot 2dup 9 + c! rot \ replace 'N' with ASCII num
-
- evaluate c@ 0=3D if
+ dup init_textN c@ 0=3D if
\ NOTE: no need to check toggle_stateN since the first =
time we
\ are called, we will populate init_textN. Further, we =
don't
\ need to test whether menu_caption[x] (ansi_caption[x] =
when
@@ -183,19 +222,16 @@ create init_text8 255 allot
\ called if the caption was NULL.
=20
\ base name of environment variable
+ dup ( n -- n n ) \ key pressed
loader_color? if
- s" ansi_caption[x]"
+ ansi_caption[x]
else
- s" menu_caption[x]"
+ menu_caption[x]
then=09
- -rot 2dup 13 + c! rot \ replace 'x' with ASCII =
numeral
-
getenv dup -1 <> if
=20
- s" init_textN" \ base name of buffer
- 4 pick \ copy ASCII num to top
- rot tuck 9 + c! swap \ replace 'N' with ASCII =
num
- evaluate
+ 2 pick ( n c-addr/u -- n c-addr/u n )
+ init_textN ( n c-addr/u n -- n c-addr/u c-addr )
=20
\ now we have the buffer c-addr on top
\ ( followed by c-addr/u of current caption )
@@ -227,67 +263,49 @@ create init_text8 255 allot
\ negate the toggled state so that we reverse the flow on =
subsequent
\ calls.
=20
- s" toggle_stateN @" \ base name of toggle state var
- -rot 2dup 12 + c! rot \ replace 'N' with ASCII numeral
-
- evaluate 0=3D if
+ dup toggle_stateN @ 0=3D if
\ state is OFF, toggle to ON
=20
- \ base name of toggled text var
+ dup ( n -- n n ) \ key pressed
loader_color? if
- s" toggled_ansi[x]"
+ toggled_ansi[x]
else
- s" toggled_text[x]"
+ toggled_text[x]
then
- -rot 2dup 13 + c! rot \ replace 'x' with ASCII num
-
getenv dup -1 <> if
\ Assign toggled text to menu caption
-
- \ base name of caption var
+ 2 pick ( n c-addr/u -- n c-addr/u n ) \ key =
pressed
loader_color? if
- s" ansi_caption[x]"
+ ansi_caption[x]
else
- s" menu_caption[x]"
+ menu_caption[x]
then
- 4 pick \ copy ASCII num to top
- rot tuck 13 + c! swap \ replace 'x' with =
ASCII num
-
- setenv \ set new caption
+ setenv
else
\ No toggled text, keep the same caption
-
- drop
+ drop ( n -1 -- n ) \ getenv cruft
then
=20
true \ new value of toggle state var (to be stored =
later)
else
\ state is ON, toggle to OFF
=20
- s" init_textN" \ base name of initial text =
buffer
- -rot 2dup 9 + c! rot \ replace 'N' with ASCII =
numeral
- evaluate \ convert string to c-addr
- count \ convert c-addr to c-addr/u
+ dup init_textN count ( n -- n c-addr/u )
=20
- \ base name of caption var
+ \ Assign init_textN text to menu caption
+ 2 pick ( n c-addr/u -- n c-addr/u n ) \ key pressed
loader_color? if
- s" ansi_caption[x]"
+ ansi_caption[x]
else
- s" menu_caption[x]"
+ menu_caption[x]
then
- 4 pick \ copy ASCII num to top
- rot tuck 13 + c! swap \ replace 'x' with ASCII =
numeral
+ setenv
=20
- setenv \ set new caption
- false \ new value of toggle state var (to be stored =
below)
+ false \ new value of toggle state var (to be stored =
below)
then
=20
\ now we'll store the new toggle state (on top of stack)
- s" toggle_stateN" \ base name of toggle state var
- 3 pick \ copy ASCII numeral to top
- rot tuck 12 + c! swap \ replace 'N' with ASCII numeral
- evaluate \ convert string to addr
- ! \ store new value
+ over toggle_stateN !
;
=20
: cycle_menuitem ( N -- N ) \ cycles through array of choices for a =
menuitem
@@ -295,28 +313,23 @@ create init_text8 255 allot
\ ASCII numeral equal to user-selected menu item must be on the =
stack.
\ We do not modify the stack, so the ASCII numeral is left on =
top.
=20
- s" cycle_stateN" \ base name of array state var
- -rot 2dup 11 + c! rot \ replace 'N' with ASCII numeral
+ dup cycle_stateN dup @ 1+ \ get value and increment
=20
- evaluate \ we now have a pointer to the proper variable
- dup @ \ resolve the pointer (but leave it on the stack)
- 1+ \ increment the value
-
\ Before assigning the (incremented) value back to the pointer,
\ let's test for the existence of this particular array element.
\ If the element exists, we'll store index value and move on.
\ Otherwise, we'll loop around to zero and store that.
=20
- dup 48 + \ duplicate Array index and convert to ASCII numeral
+ dup 48 + ( n addr k -- n addr k k' )
+ \ duplicate array index and convert to ASCII numeral
=20
- \ base name of array caption text
+ 3 pick swap ( n addr k k' -- n addr k n k' ) \ (n,k') as (x,y)
loader_color? if
- s" ansi_caption[x][y]" =20
+ ansi_caption[x][y]
else
- s" menu_caption[x][y]" =20
+ menu_caption[x][y]
then
- -rot tuck 16 + c! swap \ replace 'y' with Array index
- 4 pick rot tuck 13 + c! swap \ replace 'x' with menu choice
+ ( n addr k n k' -- n addr k c-addr/u )
=20
\ Now test for the existence of our incremented array index in =
the
\ form of $menu_caption[x][y] ($ansi_caption[x][y] with =
loader_color
@@ -325,49 +338,47 @@ create init_text8 255 allot
getenv dup -1 =3D if
\ No caption set for this array index. Loop back to =
zero.
=20
- drop ( getenv cruft )
- drop ( incremented array index )
- 0 ( new array index that will be stored later )
+ drop ( n addr k -1 -- n addr k ) \ getenv cruft
+ drop 0 ( n addr k -- n addr 0 ) \ new value to store =
later
=20
- \ base name of caption var
+ 2 pick [char] 0 ( n addr 0 -- n addr 0 n 48 ) \ (n,48) =
as (x,y)
loader_color? if
- s" ansi_caption[x][0]"
+ ansi_caption[x][y]
else
- s" menu_caption[x][0]"
+ menu_caption[x][y]
then
- 4 pick rot tuck 13 + c! swap \ replace 'x' with menu =
choice
-
+ ( n addr 0 n 48 -- n addr 0 c-addr/u )
getenv dup -1 =3D if
\ This is highly unlikely to occur, but to make
\ sure that things move along smoothly, allocate
\ a temporary NULL string
=20
- drop ( getenv cruft )
- s" "
+ drop ( n addr 0 -1 -- n addr 0 ) \ getenv cruft
+ s" " ( n addr 0 -- n addr 0 c-addr/u )
then
then
=20
\ At this point, we should have the following on the stack (in =
order,
\ from bottom to top):
\=20
- \ N - Ascii numeral representing the menu choice =
(inherited)
- \ Addr - address of our internal cycle_stateN variable
- \ N - zero-based number we intend to store to the above
- \ C-Addr - string value we intend to store to menu_caption[x]
- \ (or ansi_caption[x] with loader_color enabled)
+ \ n - Ascii numeral representing the menu choice =
(inherited)
+ \ addr - address of our internal cycle_stateN variable
+ \ k - zero-based number we intend to store to the =
above
+ \ c-addr/u - string value we intend to store to =
menu_caption[x]
+ \ (or ansi_caption[x] with loader_color enabled)
\=20
\ Let's perform what we need to with the above.
=20
- \ base name of menuitem caption var
+ \ Assign array value text to menu caption
+ 4 pick ( n addr k c-addr/u -- n addr k c-addr/u n )
loader_color? if
- s" ansi_caption[x]"
+ ansi_caption[x]
else
- s" menu_caption[x]"
+ menu_caption[x]
then
- 6 pick rot tuck 13 + c! swap \ replace 'x' with menu choice
- setenv \ set the new caption
+ setenv
=20
- swap ! \ update array state variable
+ swap ! ( n addr k -- n ) \ update array state variable
;
=20
: acpipresent? ( -- flag ) \ Returns TRUE if ACPI is present, FALSE =
otherwise
@@ -401,15 +412,15 @@ create init_text8 255 allot
acpipresent? if
acpienabled? if
loader_color? if
- s" toggled_ansi[x]"
+ str_toggled_ansi[x]
else
- s" toggled_text[x]"
+ str_toggled_text[x]
then
else
loader_color? if
- s" ansi_caption[x]"
+ str_ansi_caption[x]
else
- s" menu_caption[x]"
+ str_menu_caption[x]
then
then
else
@@ -427,7 +438,7 @@ create init_text8 255 allot
: menu-create ( -- )
=20
\ Print the frame caption at (x,y)
- s" loader_menu_title" getenv dup -1 =3D if
+ str_loader_menu_title getenv dup -1 =3D if
drop s" Welcome to FreeBSD"
then
24 over 2 / - 9 at-xy type=20
@@ -436,7 +447,7 @@ create init_text8 255 allot
\ constructed dynamically -- as this function could conceivably =
set
\ the remaining environment variables to construct the menu =
entirely).
\=20
- s" menu_init" getenv dup -1 <> if
+ str_menu_init getenv dup -1 <> if
evaluate
else
drop
@@ -461,7 +472,7 @@ create init_text8 255 allot
\ Initialize the ACPI option status.
\=20
0 menuacpi !
- s" menu_acpi" getenv -1 <> if
+ str_menu_acpi getenv -1 <> if
c@ dup 48 > over 57 < and if ( '1' <=3D c1 <=3D '8' )
menuacpi !
arch-i386? if acpipresent? if
@@ -469,10 +480,7 @@ create init_text8 255 allot
\ Set menu toggle state to active state
\ (required by generic toggle_menuitem)
\=20
- menuacpi @
- s" acpienabled? toggle_stateN !"
- -rot tuck 25 + c! swap
- evaluate
+ acpienabled? menuacpi @ toggle_stateN !
then then
else
drop
@@ -483,7 +491,7 @@ create init_text8 255 allot
\ Initialize the menu_options visual separator.
\=20
0 menuoptions !
- s" menu_options" getenv -1 <> if
+ str_menu_options getenv -1 <> if
c@ dup 48 > over 57 < and if ( '1' <=3D c1 <=3D '8' )
menuoptions !
else
@@ -503,7 +511,7 @@ create init_text8 255 allot
\ If the "Options:" separator, print it.
dup menuoptions @ =3D if
\ Optionally add a reboot option to the menu
- s" menu_reboot" getenv -1 <> if
+ str_menu_reboot getenv -1 <> if
drop
s" Reboot" printmenuitem menureboot !
true menurebootadded !
@@ -513,7 +521,7 @@ create init_text8 255 allot
menurow @ 2 + menurow !
menurow @ menuY @ +
at-xy
- s" menu_optionstext" getenv dup -1 <> if
+ str_menu_optionstext getenv dup -1 <> if
type
else
drop ." Options:"
@@ -522,17 +530,21 @@ create init_text8 255 allot
=20
\ If this is the ACPI menu option, act accordingly.
dup menuacpi @ =3D if
- acpimenuitem ( -- C-Addr/U | -1 )
+ dup acpimenuitem ( n -- n n c-addr/u | n n -1 )
+ dup -1 <> if
+ 13 +c! ( n n c-addr/u -- n c-addr/u )
+ \ replace 'x' with n
+ else
+ swap drop ( n n -1 -- n -1 )
+ over menu_command[x] unsetenv
+ then
else
\ make sure we have not already initialized this =
item
- s" init_stateN"
- -rot 2dup 10 + c! rot \ repace 'N'
- evaluate dup @ 0=3D if
+ dup init_stateN dup @ 0=3D if
1 swap !
=20
\ If this menuitem has an initializer, =
run it
- s" menu_init[x]"
- -rot 2dup 10 + c! rot \ replace 'x'
+ dup menu_init[x]
getenv dup -1 <> if
evaluate
else
@@ -542,35 +554,24 @@ create init_text8 255 allot
drop
then
=20
+ dup
loader_color? if
- s" ansi_caption[x]"
+ ansi_caption[x]
else
- s" menu_caption[x]"
+ menu_caption[x]
then
then
=20
- ( C-Addr/U | -1 )
dup -1 <> if
- \ replace 'x' with current iteration
- -rot 2dup 13 + c! rot
- =20
\ test for environment variable
getenv dup -1 <> if
- printmenuitem ( C-Addr/U -- N )
- =20
- s" menukeyN !" \ generate cmd to store =
result
- -rot 2dup 7 + c! rot
- =20
- evaluate
+ printmenuitem ( c-addr/u -- n )
+ dup menukeyN !
else
drop
then
else
drop
-
- s" menu_command[x]"
- -rot 2dup 13 + c! rot ( replace 'x' )
- unsetenv
then
=20
1+ dup 56 > \ add 1 to iterator, continue if less than =
57
@@ -579,7 +580,7 @@ create init_text8 255 allot
=20
\ Optionally add a reboot option to the menu
menurebootadded @ true <> if
- s" menu_reboot" getenv -1 <> if
+ str_menu_reboot getenv -1 <> if
drop \ no need for the value
s" Reboot" \ menu caption (required by =
printmenuitem)
=20
@@ -597,45 +598,22 @@ create init_text8 255 allot
\=20
: menu-timeout-update ( N -- )
=20
- dup 9 > if ( N N 9 -- N )
- drop ( N -- )
- 9 ( maximum: -- N )
- then
+ \ Enforce minimum/maximum
+ dup 9 > if drop 9 then
+ dup 0 < if drop 0 then
=20
- dup 0 < if ( N N 0 -- N )
- drop ( N -- )
- 0 ( minimum: -- N )
- then
+ s" Autoboot in N seconds. [Space] to pause" ( n -- n c-addr/u )
=20
- 48 + ( convert single-digit numeral to ASCII: N 48 -- N )
+ 2 pick 0> if
+ rot 48 + -rot ( n c-addr/u -- n' c-addr/u ) \ convert to =
ASCII
+ 12 +c! ( n' c-addr/u -- c-addr/u ) \ replace =
'N' above
=20
- s" Autoboot in N seconds. [Space] to pause" ( N -- N Addr C )
-
- 2 pick 48 - 0> if ( N Addr C N 48 -- N Addr C )
-
- \ Modify 'N' (Addr+12) above to reflect time-left
-
- -rot ( N Addr C -- C N Addr )
- tuck ( C N Addr -- C Addr N Addr )
- 12 + ( C Addr N Addr -- C Addr N Addr2 )
- c! ( C Addr N Addr2 -- C Addr )
- swap ( C Addr -- Addr C )
-
- menu_timeout_x @
- menu_timeout_y @
- at-xy ( position cursor: Addr C N N -- Addr C )
-
- type ( print message: Addr C -- )
-
- else ( N Addr C N -- N Addr C )
-
- menu_timeout_x @
- menu_timeout_y @
- at-xy ( position cursor: N Addr C N N -- N Addr C )
-
- spaces ( erase message: N Addr C -- N Addr )
- 2drop ( N Addr -- )
-
+ menu_timeout_x @ menu_timeout_y @ at-xy \ position =
cursor
+ type ( c-addr/u -- ) \ print message
+ else
+ menu_timeout_x @ menu_timeout_y @ at-xy \ position =
cursor
+ spaces ( n c-addr/u -- n c-addr ) \ erase message
+ 2drop ( n c-addr -- )
then
=20
0 25 at-xy ( position cursor back at bottom-left )
@@ -683,7 +661,7 @@ create init_text8 255 allot
\ (user did not cancel by =
pressing ANY
\ key)
=20
- s" menu_timeout_command" getenv =
dup
+ str_menu_timeout_command getenv =
dup
-1 =3D if
drop \ clean-up
else
@@ -766,7 +744,7 @@ create init_text8 255 allot
0 menu_timeout_enabled ! \ start with automatic timeout disabled
=20
\ check indication that automatic execution after delay is =
requested
- s" menu_timeout_command" getenv -1 <> if ( Addr C -1 -- | Addr )
+ str_menu_timeout_command getenv -1 <> if ( Addr C -1 -- | Addr )
drop ( just testing existence right now: Addr -- )
=20
\ initialize state variables
@@ -802,7 +780,7 @@ create init_text8 255 allot
=20
menu_timeout_enabled @ 1 =3D if
\ read custom column position (if set)
- s" loader_menu_timeout_x" getenv dup -1 =3D if
+ str_loader_menu_timeout_x getenv dup -1 =3D if
drop \ no custom column position
menu_timeout_default_x \ use default =
setting
else
@@ -814,7 +792,7 @@ create init_text8 255 allot
menu_timeout_x ! ( store value on stack from =
above )
=20
\ read custom row position (if set)
- s" loader_menu_timeout_y" getenv dup -1 =3D if
+ str_loader_menu_timeout_y getenv dup -1 =3D if
drop \ no custom row position
menu_timeout_default_y \ use default =
setting
else
@@ -853,13 +831,9 @@ create init_text8 255 allot
=20
49 \ Iterator start (loop range 49 to 56; ASCII '1' to =
'8')
begin
- s" menukeyN @"
+ dup menukeyN @
+ rot tuck =3D if
=20
- \ replace 'N' with current iteration
- -rot 2dup 7 + c! rot
-
- evaluate rot tuck =3D if
-
\ Adjust for missing ACPI menuitem on =
non-i386
arch-i386? true <> menuacpi @ 0<> and if
menuacpi @ over 2dup < -rot =3D =
or
@@ -869,13 +843,8 @@ create init_text8 255 allot
then
then
=20
- \ base env name for the value (x is a =
number)
- s" menu_command[x]"
-
- \ Copy ASCII number to string at offset =
13
- -rot 2dup 13 + c! rot
-
\ Test for the environment variable
+ dup menu_command[x]
getenv dup -1 <> if
\ Execute the stored procedure
evaluate
@@ -910,16 +879,14 @@ create init_text8 255 allot
\=20
\ Check for menu keycode shortcut(s)
\=20
- s" menu_keycode[x]"
- -rot 2dup 13 + c! rot
+ dup menu_keycode[x]
getenv dup -1 =3D if
drop
else
?number 0<> if
rot tuck =3D if
swap
- s" menu_command[x]"
- -rot 2dup 13 + c! rot
+ dup menu_command[x]
getenv dup -1 <> if
evaluate
0=3D if
@@ -951,100 +918,43 @@ create init_text8 255 allot
=20
49 \ Iterator start (loop range 49 to 56; ASCII '1' to '8')
begin
- \ Unset variables in-order of appearance in menu.4th(8)
+ dup menu_init[x] unsetenv \ menu initializer
+ dup menu_command[x] unsetenv \ menu command
+ dup menu_caption[x] unsetenv \ menu caption
+ dup ansi_caption[x] unsetenv \ ANSI caption
+ dup menu_keycode[x] unsetenv \ menu keycode
+ dup toggled_text[x] unsetenv \ toggle_menuitem =
caption
+ dup toggled_ansi[x] unsetenv \ toggle_menuitem ANSI =
caption
=20
- s" menu_caption[x]" \ basename for caption variable
- -rot 2dup 13 + c! rot \ replace 'x' with current =
iteration
- unsetenv \ not erroneous to unset unknown =
var
-
- s" menu_command[x]" \ command basename
- -rot 2dup 13 + c! rot \ replace 'x'
- unsetenv
-
- s" menu_init[x]" \ initializer basename
- -rot 2dup 10 + c! rot \ replace 'x'
- unsetenv
-
- s" menu_keycode[x]" \ keycode basename
- -rot 2dup 13 + c! rot \ replace 'x'
- unsetenv
-
- s" ansi_caption[x]" \ ANSI caption basename
- -rot 2dup 13 + c! rot \ replace 'x'
- unsetenv
-
- s" toggled_text[x]" \ toggle_menuitem caption =
basename
- -rot 2dup 13 + c! rot \ replace 'x'
- unsetenv
-
- s" toggled_ansi[x]" \ toggle_menuitem ANSI caption =
basename
- -rot 2dup 13 + c! rot \ replace 'x'
- unsetenv
-
- s" menu_caption[x][y]" \ cycle_menuitem caption
- -rot 2dup 13 + c! rot \ replace 'x'
- 48 -rot
+ 48 \ Iterator start (inner range 48 to 57; ASCII '0' to =
'9')
begin
- 16 2over rot + c! \ replace 'y'
- 2dup unsetenv
-
- rot 1+ dup 57 > 2swap rot
+ \ cycle_menuitem caption and ANSI caption
+ 2dup menu_caption[x][y] unsetenv
+ 2dup ansi_caption[x][y] unsetenv
+ 1+ dup 57 >
until
- 2drop drop
+ drop \ inner iterator
=20
- s" ansi_caption[x][y]" \ cycle_menuitem ANSI caption
- -rot 2dup 13 + c! rot \ replace 'x'
- 48 -rot
- begin
- 16 2over rot + c! \ replace 'y'
- 2dup unsetenv
+ 0 over menukeyN ! \ used by menu-create, =
menu-display
+ 0 over init_stateN ! \ used by menu-create
+ 0 over toggle_stateN ! \ used by toggle_menuitem
+ 0 over init_textN c! \ used by toggle_menuitem
+ 0 over cycle_stateN ! \ used by cycle_menuitem
=20
- rot 1+ dup 57 > 2swap rot
- until
- 2drop drop
-
- s" 0 menukeyN !" \ basename for key association =
var
- -rot 2dup 9 + c! rot \ replace 'N' with current =
iteration
- evaluate \ assign zero (0) to key assoc. =
var
-
- s" 0 init_stateN !" \ used by menu-create
- -rot 2dup 12 + c! rot \ replace 'N'
- evaluate
-
- s" 0 toggle_stateN !" \ used by toggle_menuitem
- -rot 2dup 14 + c! rot \ replace 'N'
- evaluate
-
- s" 0 cycle_stateN !" \ used by cycle_menuitem
- -rot 2dup 13 + c! rot \ replace 'N'
- evaluate
-
- s" 0 init_textN c!" \ used by toggle_menuitem
- -rot 2dup 11 + c! rot \ replace 'N'
- evaluate
-
1+ dup 56 > \ increment, continue if less than 57
until
drop \ iterator
=20
- \ unset the timeout command
- s" menu_timeout_command" unsetenv
+ str_menu_timeout_command unsetenv \ menu timeout command
+ str_menu_reboot unsetenv \ Reboot menu option =
flag
+ str_menu_acpi unsetenv \ ACPI menu option flag
+ str_menu_options unsetenv \ Options separator flag
+ str_menu_optionstext unsetenv \ separator display text
+ str_menu_init unsetenv \ menu initializer
=20
- \ clear the "Reboot" menu option flag
- s" menu_reboot" unsetenv
0 menureboot !
-
- \ clear the ACPI menu option flag
- s" menu_acpi" unsetenv
0 menuacpi !
-
- \ clear the "Options" menu separator flag
- s" menu_options" unsetenv
- s" menu_optionstext" unsetenv
0 menuoptions !
-
- \ clear the menu initializer
- s" menu_init" unsetenv
;
=20
\ This function both unsets menu variables and visually erases the menu =
area
--Apple-Mail=_769728F7-62D7-41E2-9431-E82F021FEFE6--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?FE3CFE32-04C2-499D-8DE5-4B11CAEE87B4>
