/* avalanche.c
Génère une trace de la propagation
de la valeur d'un bit à 1 dans tGFSR32x4  */

#include <stdio.h>

typedef unsigned int U32;

#define MACRO_tGFSR32x4_SHFT(current, last, ptr) \
  current ^= last;        \
  current ^= ptr;         \
  t = current;            \
  current >>= 1;          \
  t &= 0x01010101;        \
  current &= 0x7F7F7F7F;  \
  t <<= 4;                \
  current ^= t;           \
  t <<= 3;                \
  current ^= t;

unsigned char binaire[]="        ";

int bin(U32 n) {
  int i, j=0;

  for (i=7; i>=0; i--) {
    if (n & 1) {
      j++;
      binaire[i] = 150;
    }
    else
      binaire[i] = ' ';
    n>>=1;
  }

  printf(binaire);
  return j;
}

#define PAS(a, b, c, d)  cycle++; bin(a); bin(b); bin(c); bin(d); putchar(255);

int main() {
  U32 r0=128, r1=0, r2=0, r3=0, t;
  int cycle=0;

  do {
    PAS(r0, r3, r2, r1); MACRO_tGFSR32x4_SHFT(r0, r3, 0)
    PAS(r1, r0, r3, r2); MACRO_tGFSR32x4_SHFT(r1, r0, 0)
    PAS(r2, r1, r0, r3); MACRO_tGFSR32x4_SHFT(r2, r1, 0)
    PAS(r3, r2, r1, r0); MACRO_tGFSR32x4_SHFT(r3, r2, 0)
  } while (cycle<1000);

  return r0;
}
