]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - sys/boot/forth/delay.4th
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / sys / boot / forth / delay.4th
1 \ Copyright (c) 2008-2015 Devin Teske <dteske@FreeBSD.org>
2 \ All rights reserved.
3
4 \ Redistribution and use in source and binary forms, with or without
5 \ modification, are permitted provided that the following conditions
6 \ are met:
7 \ 1. Redistributions of source code must retain the above copyright
8 \    notice, this list of conditions and the following disclaimer.
9 \ 2. Redistributions in binary form must reproduce the above copyright
10 \    notice, this list of conditions and the following disclaimer in the
11 \    documentation and/or other materials provided with the distribution.
12
13 \ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14 \ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 \ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 \ ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 \ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 \ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 \ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 \ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 \ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 \ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 \ SUCH DAMAGE.
24
25 \ $FreeBSD$
26
27 marker task-delay.4th
28
29 vocabulary delay-processing
30 only forth also delay-processing definitions
31
32 2  constant delay_default \ Default delay (in seconds)
33 3  constant etx_key       \ End-of-Text character produced by Ctrl+C
34 13 constant enter_key     \ Carriage-Return character produce by ENTER
35 27 constant esc_key       \ Escape character produced by ESC or Ctrl+[
36
37 variable delay_tstart     \ state variable used for delay timing
38 variable delay_delay      \ determined configurable delay duration
39 variable delay_cancelled  \ state variable for user cancellation
40 variable delay_showdots   \ whether continually print dots while waiting
41
42 only forth definitions also delay-processing
43
44 : delay_execute ( -- )
45
46         \ make sure that we have a command to execute
47         s" delay_command" getenv dup -1 = if
48                 drop exit 
49         then
50
51         \ read custom time-duration (if set)
52         s" loader_delay" getenv dup -1 = if
53                 drop          \ no custom duration (remove dup'd bunk -1)
54                 delay_default \ use default setting (replacing bunk -1)
55         else
56                 \ make sure custom duration is a number
57                 ?number 0= if
58                         delay_default \ use default if otherwise
59                 then
60         then
61
62         \ initialize state variables
63         delay_delay !          \ stored value is on the stack from above
64         seconds delay_tstart ! \ store the time we started
65         0 delay_cancelled !    \ boolean flag indicating user-cancelled event
66
67         false delay_showdots ! \ reset to zero and read from environment
68         s" delay_showdots" getenv dup -1 <> if
69                 2drop \ don't need the value, just existance
70                 true delay_showdots !
71         else
72                 drop
73         then
74
75         \ Loop until we have exceeded the desired time duration
76         begin
77                 25 ms \ sleep for 25 milliseconds (40 iterations/sec)
78
79                 \ throw some dots up on the screen if desired
80                 delay_showdots @ if
81                         ." ." \ dots visually aid in the perception of time
82                 then
83
84                 \ was a key depressed?
85                 key? if
86                         key \ obtain ASCII value for keystroke
87                         dup enter_key = if
88                                 -1 delay_delay ! \ break loop
89                         then
90                         dup etx_key = swap esc_key = OR if
91                                 -1 delay_delay !     \ break loop
92                                 -1 delay_cancelled ! \ set cancelled flag
93                         then
94                 then
95
96                 \ if the time duration is set to zero, loop forever
97                 \ waiting for either ENTER or Ctrl-C/Escape to be pressed
98                 delay_delay @ 0> if
99                         \ calculate elapsed time
100                         seconds delay_tstart @ - delay_delay @ >
101                 else
102                         -1 \ break loop
103                 then
104         until
105
106         \ if we were throwing up dots, throw up a line-break
107         delay_showdots @ if
108                 cr
109         then
110
111         \ did the user press either Ctrl-C or Escape?
112         delay_cancelled @ if
113                 2drop \ we don't need the command string anymore
114         else
115                 evaluate \ evaluate/execute the command string
116         then
117 ;
118
119 only forth definitions