   }
 
   bool parse_all(byte *input) {
-    for (int i = 1; i < 5; i++) if (input[i*8] != ';') return false;
+    for (int i = 1; i < 6; i++) if (input[i*8] != ';') return false;
     Dura x; x = {0, 0};
     // Manually unrolled loop
     x.parse(input, 0*9); if (!x.is_valid()) return false; t = x;

    return true;
  }

  static void init(Protocol *ps, int &pi) {
    for (int i = 0; i < DIG+ANA; i++) ps[i].init();
    for (int i = DIG; i < DIG+ANA; i++) ps[i].j = 'l';
    pi = DIG+ANA;
  }

  byte append(int &pi) {
    if (pi < PROT) {
      next = (byte)pi;
      pi++;
      return next;
    }
    else return 255;
  }
};

Protocol protocols[PROT];
int proti = DIG+ANA;
Protocol not_a_protocol = (Protocol){{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, ' ', ' ', 255, 255};



  }
}

Protocol* process_ensure_protocol(byte ch) {
  Channel *c = process_get_channel(ch);
  if (c->who != 255) return protocols + c->who;
  else if (c->zero != 255) {
    c->refresh(protocols);
    return protocols + c->who;
  }
  else if (proti < PROT) {
    c->zero = proti;
    c->who = c->zero;
    protocols[proti].init();
    proti++;
    return protocols + c->who;
  }
  else return process_get_protocol(ch);   // Defer to get for error handling
}

Protocol* process_new_protocol(byte ch) {
  Channel *c = process_get_channel(ch);
  if (proti < PROT) {
    byte old = c->who;
    while (c->who != 255) { old = c->who; c->who = protocols[c->who].next; }
    protocols[old].next = (byte)proti;
    c->who = (byte)proti;
    protocols[proti].init();
    proti++;
    return protocols + c->who;
  }
  else {
    c->who = 255;
    return process_get_protocol(ch);    // Defer to get for error handling
  }
}

void process_reset() {
  Protocol::init(protocols, proti);
  Channel::init(channels);
  erri = 0;
  alive = 0;
  runlevel = RUNSET;
}

void process_refresh() {
  if (runlevel == RUNSTOP) {
    Channel::refresh(channels, protocols);
    runlevel = RUNSET;  
  }
}

void process_start_running() {
  go_go_go();
}

void process_start_running(byte who) {
  if (who >= 'A' && who <= 'Z' && who != 'Y') {
    int i = who - 'A';
    if (who == 'Z') i -= 1;
    Channel::solo(channels, i, protocols, proti);
    process_start_running();
  }
  else {
    char tiny[3]; tiny[0] = who; tiny[1] = '\n'; tiny[2] = 0;
    error_with_message("Trying to run on unknown channel", tiny);
  }
}

void process_stop_running(byte who) {
  Channel *c = process_get_channel(who);
  if (runlevel == GOGOGO) {
    if (c->who != 255) {
      c->pin_low();
      c->runlevel = C_ZZZ;
      c->who = 255;
      if (alive > 0) alive -= 1;
      if (alive == 0) runlevel = RUNSTOP;
    }
  }
}

void process_stop_running() {
  for (int i = 0; i < DIG; i++) {
    Channel *c = channels + i;
    if (c->who != 255) {
      c->pin_low();
      c->runlevel = C_ZZZ;
      c->who = 255;
    }
  }
  alive = 0;
  runlevel = RUNSTOP;
}

void process_say_the_time() {
