Skip to content

Instantly share code, notes, and snippets.

@Melvar
Created August 15, 2012 16:57
Show Gist options
  • Save Melvar/3361575 to your computer and use it in GitHub Desktop.
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.
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