#lang staapl/pic18 \ -*- forth -*- provide-all \ noise generators using polynomials in GF[2] modulo a prime P[x] \ : contains coefficients of the current polynomial n[x] \ 1:: are the coefficients of polynomial P[x] \ the noise generator calculates n[x] -> x n[x] mod P[x], by performing \ a shift, followed by a conditional XOR which performs the modulo. \ setting the lower bits of c1 to zero allows the use of different \ degrees then 16, giving GF[2^n] for all n <= 24 variable n0 variable n1 \ state variable c0 variable c1 \ polynomial coefficients macro \ shift the register to carry : rand-shift clc n0 rot<c rand-shift c? if rand-fold then ; : init-rand \ init noise state: this the primitive polynomial mathematica \ gives for field = GF[65536] #xD7 c0 ! -1 n0 ! #x50 c1 ! -1 n1 ! ; \ fixed 8 bit rng TOS state update, constant duration == 3 cycles this \ shaves off one cycle by using rotate, and cancelling out the bit if \ it's one. the 0x1C below is from the polynomial 0x11D. : rng< rot<< odd? if #x1C xor then ; forth : randbyte 0 8 \ get 8 fresh random bits : randbits for rand>c rot<