     // xor by color channel
     if ( c1v[i] > 0 && c2v[i] > 0 ) {
       // alive in both cells, so drop this channel.
-      cv[i] = 0;
+      cv[i] = LED_OFF;
     } else {
-      // dead in one, so sum them.
-      cv[i] = c1v[i] + c2v[i];
+      // dead in one, so sum them.  unsigned type is doing some funky stuff when >255.
+      cv[i] = max(c1v[i], c2v[i]);
     }
   }
   return ( packColor(cv) );
 }
 
 // updates the automata using a modified Rule 90
-void updateRule90(Adafruit_NeoPixel &strip, uint8_t decay) {
+void updateRule90(Adafruit_NeoPixel &strip, unsigned long ttl) {
   // intialize first cell
   uint32_t cs = strip.getPixelColor(0);
   uint32_t ps = strip.getPixelColor(strip.numPixels() - 1);

#include <Adafruit_NeoPixel.h>
#include <Streaming.h>
#include <Metro.h>

// RIM of LEDs
#define RIM_PIN 6 // wire to rim DI pin.  Include a 330 Ohm resistor in series.
#define RIM_N 85 // best if divisible by 4
#define RIM_LED_TTL 3000UL // reduce intensity at each update, so this is the amount of time we can expect a pixel to last
#define RIM_UPDATE 100UL // update the automata on the rim at this interval
#define RED_SEG_OFFSET floor((float)RIM_N / 4) // sort out where the LEDs are that match the button locations, in software.  You're welcome.

// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
