Created
August 15, 2012 16:57
-
-
Save Melvar/3361575 to your computer and use it in GitHub Desktop.
The code running the countdown timer in the Wrenched! show, written by Tahg (Vaht), copied down, formatted and commented by Melvar Chen.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
VARIABLE Ticks \ seconds | |
VARIABLE Tocks \ minutes | |
VARIABLE TickInterval \ TICKs *between* seconds | |
19 TickInterval ! | |
CREATE Digits \ bit patterns for digits 0-9 on the seven-segment displays | |
63 , 6 , 219 , 207 , 230 , 237 , 253 , 7 , 255 , 239 , | |
\ these I have a bit of trouble understanding: bits 0 to 5 appear to be as | |
\ expected, but for the center bar *both* bits 6 and 7 are set. | |
: Digit ( n addr -- ) \ sets the 7-segment display at addr to digit of n | |
IOXADDR ! CELLS Digits + @ IOX! ; | |
: Number ( n -- ) \ sets the two 7-segment displays to the digits of n | |
10 /MOD 4 Digit 3 Digit ; | |
: Tock ( -- ) \ process change of minute | |
Tocks @ 1 - Tocks ! \ decrement minutes | |
Tocks @ Number \ display new minutes | |
14 10 DO I IOXADDR ! 32767 IOX! LOOP \ set “second hand” ring all on | |
59 Ticks ! ; \ reset seconds | |
: Tick ( ) \ process one second | |
TickInterval @ TICKS \ wait time between seconds | |
Ticks @ 15 /MOD \ get quarter-minutes and additional seconds | |
10 + IOXADDR ! \ select ioexpander by quarter-minute | |
1 SWAP << 1- IOX! \ sets the low <add.secs.> bits of output quarter-ring | |
Tocks @ 0 = IF Ticks @ Number THEN \ if 0 minutes left, display seconds | |
Ticks @ 1 - DUP Ticks ! 0 < IF Tock THEN ; \ decrement seconds, if < 0 then change minute | |
: Clear ( -- ) \ clears the RS latches on the buttons | |
15 IOXADDR ! 7 IOX! 10 TICKS 0 IOX! ; | |
: isStop ( -- stop ) \ gets whether the Stop button was pressed | |
15 IOXADDR ! IOX@ 2 AND 0= ; | |
: Set ( mins -- ) \ set the minutes left | |
DUP 99 > IF DROP 0 THEN \ if minutes > 99, replace with 0 | |
Tocks ! 0 Ticks ! \ set minutes, set seconds to zero | |
14 10 DO I IOXADDR ! 0 IOX! LOOP \ set “second hand” ring all off | |
Tocks @ Number ; \ display minutes | |
: Run ( -- ) \ run the timer through its whole time | |
15 IOXADDR ! 32768 IOX! \ sets the mysterious black signal on (it’s connected to a lever, apparently) | |
Tocks @ 60 * Ticks @ + \ calculate total seconds | |
0 ?DO \ for each second (never if none) | |
isStop IF UNLOOP EXIT \ if stop was pressed, break and return | |
ELSE Tick THEN LOOP \ otherwise process a second | |
14 10 DO I IOXADDR ! 0 IOX! LOOP \ set “second hand” ring all off | |
3 IOXADDR ! 192 IOX! 4 IOXADDR ! 192 IOX! ; \ set the 2 7-segment displays to -- | |
: Cycle ( -- ) \ start the clock if start was pressed | |
15 IOXADDR ! IOX@ DUP Clear \ reads the buttons and clears them | |
1 AND 0= IF CR ." Running" Run THEN \ if start was pressed, say so and call Run | |
4 AND 0= IF CR ." Reset" Clear 30 Set THEN \ if reset was pressed, clear the buttons and set to thirty minutes | |
Clear ; \ clear the buttons | |
: Start ( -- ) \ infinitely loop Cycle, break if stop was pressed | |
BEGIN 10 TICKS isStop IF Clear EXIT THEN Cycle AGAIN ; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment