         // Update data bus
         setMX7219Reg(MX7219_DIGIT_0 + 4, MX7219_FONT[data_bus & 0xF]);
         setMX7219Reg(MX7219_DIGIT_0 + 5, MX7219_FONT[(data_bus>>4) & 0xF]);
-        break;
 
-    case 1:
-        showWord(demo_loop_count % displayWordCount);
-        break;
-    }
-
-    // Update status bits
-    setMX7219Reg(MX7219_DIGIT_0 + 6, status_bits);
-
-    // Update triggers
-    mode_trigger.update(mode_switch.state() == HIGH);
-    select_trigger.update(select_switch.state() == HIGH);
-
-    if(mode_trigger.triggered()) {
-        demo_mode = (demo_mode + 1) % 2;
-        mode_trigger.clear();
-    }
-
-    if(select_trigger.triggered()) {
-        address_bus += 1;
-        select_trigger.clear();
+        if(select_trigger.triggered()) {
+            address_bus += 1;
+            data_bus += 7;
+            select_trigger.clear();
+        }
+    } else {
+        // Show running dots
+        int point = (millis() >> 7) % 6;
+        for(int digit=0; digit<6; ++digit) {
+            setMX7219Reg(MX7219_DIGIT_0 + digit, (point == (5-digit)) ? 0x80 : 0x00);
+        }
     }
 
     if(next_demo_loop_at < millis()) {
+        status_bits += 1;
+
         next_demo_loop_at = millis() + DEMO_LOOP_PERIOD;
         demo_loop_count += 1;
-
-        status_bits <<= 1;
-        if(status_bits == 0) {
-            status_bits = 1;
-        }
     }
 }
 

    mode_switch.poll();
    select_switch.poll();

    switch(demo_mode) {
    case 0:
        // Update address bus
        setMX7219Reg(MX7219_DIGIT_0 + 0, MX7219_FONT[address_bus & 0xF]);
        setMX7219Reg(MX7219_DIGIT_0 + 1, MX7219_FONT[(address_bus>>4) & 0xF]);


// HACK: demo
unsigned long next_demo_loop_at;
const long DEMO_LOOP_PERIOD = 100; // milliseconds
unsigned long demo_loop_count;

DebouncedSwitch mode_switch(BTN_MODE);
DebouncedSwitch select_switch(BTN_SELECT);
