import "banks";

// Random Number Library
// 
// Uses a Galois Linear Feedback Shift Register to generate random numbers.
// http://en.wikipedia.org/wiki/Linear_feedback_shift_register#Galois_LFSRs
//
// [random.lo] and [random.hi] must be defined in RAM somewhere.
namespace random {
    in ram {
        var lo : u8;
        var hi : u8;
    }

    // The polynomial value is taken from here:
    //   http://users.ece.cmu.edu/~koopman/lfsr/16.txt
    let LSFR_POLYNOMIAL = 0x845F;

    // Get a pseudorandom 16-bit number.
    // Precondition:
    //   random.lo, random.hi are currently seeded to some non-zero value.
    // Return:
    //   random.lo, random.hi = result
    func next() {
        random.hi = random.hi >>> 1;
        random.lo = random.lo >>>># 1;

        if carry {
            random.lo = a = random.lo ^ LSFR_POLYNOMIAL as u8;
            random.hi = a = random.hi ^ (LSFR_POLYNOMIAL >> 8) as u8;
        }
    }
}
