#include <nanoFORTH.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 =
": ini 12 FOR 1 I 1 + PIN NXT ; ini FGT ini\n"         // set pin 2~13 to OUTPUT
"VAR x 8 ALO\n"                                        // x keeps 7-seg pin patterns of 0~9
"$F360 x ! $B5F4 x 2 + ! $66D6 x 4 + !\n"
"$D770 x 6 + ! $F776 x 8 + !\n"                        
"VAR d 2 ALO\n"                                        // d keeps digit control pin patterns
"$3834 d ! $2C1C d 2 + !\n"                            
": 7d d + C@ DUP $10C OUT $230 OUT ;\n"                // ( n -- ) set output digit
"VAR vx 2 ALO\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 / NXT DRP ;\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
"VAR i\n"                                              // i is the 7-seg digit to display
": dsp i @ 1 + 3 AND DUP i ! 7s ;\n"                   // ( -- ) increment i (max 3) and display
"80 0 TMI dsp\n"                                       // timer interrupt to update display every 5ms
"VAR cnt 0 cnt !\n"                                    // cnt is a counter we want it value on display
": c++ cnt @ 1 + DUP 9999 > IF DRP 0 THN DUP cnt ! ?v ;\n"  // ( -- ) increment the counter and cache patterns
"1000 1 TMI c++\n"                                     // timer interrupt to update c every second
"1 TME\n";                                             // start counting (enable timer interrupt)

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

void loop() {
  n4_run();
}