#include <eForth1.h>
//
// Note:
//   depends on how fast is your PC/browser, 
//   too low a refresh rate might make the display appear flickering
//
const char code[] PROGMEM =
"CREATE x $F360 , $B5F4 , $66D6 , $D770 , $F776 ,\n"   // x keeps 7-seg pin patterns of 0~9    
"CREATE d $E0$D0 , $B007 ,\n"                          // d keeps digit control  
": 7d d + C@ DUP $30F ;\n"                             // ( n -- ) set output digit
"VARIABLE vx 2 ALLOT\n"                                // vx cache pattern for 4 digits before display
": vx! 1- vx + C! ;\n"                                 // ( i -- ) update vx by index
": ?v 4 FOR DUP 10 MOD x + C@ I vx! 10 / NEXT DROP ;\n"// ( n -- ) process number into 4-digit bit patterns
": 7s DUP 7d vx + C@ DUP $1F0 OUT $20F OUT ;\n"        // ( i -- ) display i'th digit on 7-seg
"VARIABLE di\n"                                        // i is the 7-seg digit to display
": dsp di @ 1 + 3 AND DUP di ! 7s ;\n"                 // ( -- ) increment i (max 3) and display
"' dsp 80 0 TMISR\n"                                   // timer interrupt to update display every 5ms
"CREATE cnt 0 ,\n"                                     // cnt is a counter we want it value on display
": c++ cnt @ 1+ DUP 9999 > IF DROP 0 THEN DUP cnt ! ?v ;\n"  // ( -- ) increment the counter and cache patterns
"' c++ 1000 1 TMISR\n";                                // timer interrupt to update c every second

void setup() {
  Serial.begin(115200);
  while (!Serial);

  for (int i=4; i<=11; i++)  pinMode(i, OUTPUT);
  for (int i=14; i<=19; i++) pinMode(i, OUTPUT);

  ef_setup(code);
}

void loop() {
  ef_run();
}