From d3e265121290f0775337e2a237c39ebb9038684c Mon Sep 17 00:00:00 2001 From: giomba Date: Sun, 22 Oct 2023 11:39:02 +0200 Subject: [PATCH] Add linear feedback shift register to generate "random" numbers. --- src/lfsr.c | 14 ++++++++++++++ src/lfsr.h | 14 ++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 src/lfsr.c create mode 100644 src/lfsr.h diff --git a/src/lfsr.c b/src/lfsr.c new file mode 100644 index 0000000..d3378d0 --- /dev/null +++ b/src/lfsr.c @@ -0,0 +1,14 @@ +#include "lfsr.h" + +void lfsr_init(Lfsr *ctx, uint16_t init) { + ctx->lfsr = init; + ctx->bit = 0; +} + +uint16_t lfsr_next(Lfsr *ctx) { + ctx->bit = ((ctx->lfsr >> 0) ^ (ctx->lfsr >> 2) ^ (ctx->lfsr >> 3) ^ + (ctx->lfsr >> 5)) & + 1U; + ctx->lfsr = (ctx->lfsr >> 1) | (ctx->bit << 15); + return ctx->lfsr; +} diff --git a/src/lfsr.h b/src/lfsr.h new file mode 100644 index 0000000..6cd3770 --- /dev/null +++ b/src/lfsr.h @@ -0,0 +1,14 @@ +#ifndef LFSR_H +#define LFSR_H + +#include + +typedef struct Lfsr { + uint16_t lfsr; + uint16_t bit; +} Lfsr; + +void lfsr_init(Lfsr *ctx, uint16_t init); +uint16_t lfsr_next(Lfsr *ctx); + +#endif // LFSR_H