delay.4th revision 238431
1\ Copyright (c) 2008-2011 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: head/sys/boot/forth/delay.4th 238431 2012-07-14 01:45:35Z dteske $ 26 27marker task-delay.4th 28 292 constant delay_default \ Default delay (in seconds) 303 constant etx_key \ End-of-Text character produced by Ctrl+C 3113 constant enter_key \ Carriage-Return character produce by ENTER 3227 constant esc_key \ Escape character produced by ESC or Ctrl+[ 33 34variable delay_tstart \ state variable used for delay timing 35variable delay_delay \ determined configurable delay duration 36variable delay_cancelled \ state variable for user cancellation 37variable delay_showdots \ whether continually print dots while waiting 38 39: delay_execute ( -- ) 40 41 \ make sure that we have a command to execute 42 s" delay_command" getenv dup -1 = if 43 drop exit 44 then 45 46 \ read custom time-duration (if set) 47 s" loader_delay" getenv dup -1 = if 48 drop \ no custom duration (remove dup'd bunk -1) 49 delay_default \ use default setting (replacing bunk -1) 50 else 51 \ make sure custom duration is a number 52 ?number 0= if 53 delay_default \ use default if otherwise 54 then 55 then 56 57 \ initialize state variables 58 delay_delay ! \ stored value is on the stack from above 59 seconds delay_tstart ! \ store the time we started 60 0 delay_cancelled ! \ boolean flag indicating user-cancelled event 61 62 false delay_showdots ! \ reset to zero and read from environment 63 s" delay_showdots" getenv dup -1 <> if 64 2drop \ don't need the value, just existance 65 true delay_showdots ! 66 else 67 drop 68 then 69 70 \ Loop until we have exceeded the desired time duration 71 begin 72 25 ms \ sleep for 25 milliseconds (40 iterations/sec) 73 74 \ throw some dots up on the screen if desired 75 delay_showdots @ if 76 ." ." \ dots visually aid in the perception of time 77 then 78 79 \ was a key depressed? 80 key? if 81 key \ obtain ASCII value for keystroke 82 dup enter_key = if 83 -1 delay_delay ! \ break loop 84 then 85 dup etx_key = swap esc_key = OR if 86 -1 delay_delay ! \ break loop 87 -1 delay_cancelled ! \ set cancelled flag 88 then 89 then 90 91 \ if the time duration is set to zero, loop forever 92 \ waiting for either ENTER or Ctrl-C/Escape to be pressed 93 delay_delay @ 0> if 94 \ calculate elapsed time 95 seconds delay_tstart @ - delay_delay @ > 96 else 97 -1 \ break loop 98 then 99 until 100 101 \ if we were throwing up dots, throw up a line-break 102 delay_showdots @ if 103 cr 104 then 105 106 \ did the user press either Ctrl-C or Escape? 107 delay_cancelled @ if 108 2drop \ we don't need the command string anymore 109 else 110 evaluate \ evaluate/execute the command string 111 then 112; 113