From 6e2ab11578a1f3a07933b8f712b7e20413506ae4 Mon Sep 17 00:00:00 2001 From: Dreaded_X Date: Sat, 16 Jan 2021 01:34:57 +0100 Subject: [PATCH] Added hardware random option and added function to set seed --- Makefile | 2 +- include/random.h | 8 ++++++++ src/random.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ src/random.s | 31 ------------------------------- 4 files changed, 57 insertions(+), 32 deletions(-) create mode 100644 src/random.c delete mode 100644 src/random.s diff --git a/Makefile b/Makefile index 2399ec0..01be640 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ ASFLAGS = -plosgff SRC = \ src/crt0.s \ src/bios.s \ -src/random.s \ +src/random.c \ src/console.c \ OBJ_1 = $(notdir $(SRC:.c=.rel)) diff --git a/include/random.h b/include/random.h index 8406e3d..02f36fa 100644 --- a/include/random.h +++ b/include/random.h @@ -1,3 +1,11 @@ #include "types.h" +// Get a pseudo random number uint8_t random(); +// Set the seed for the random number generator +void random_set_seed(uint8_t seed); + +// Get a random number from hardware +uint8_t random_hw(); + + diff --git a/src/random.c b/src/random.c new file mode 100644 index 0000000..63d6d91 --- /dev/null +++ b/src/random.c @@ -0,0 +1,48 @@ +#include "random.h" + +uint8_t random_seed; + +// Fast RND +// +// An 8-bit pseudo-random number generator, +// using a similar method to the Spectrum ROM, +// - without the overhead of the Spectrum ROM. +// +// R = random number seed +// an integer in the range [1, 256] +// +// R -> (33*R) mod 257 +// +// S = R - 1 +// an 8-bit unsigned integer + +uint8_t random() __naked { + __asm + ld a, (_random_seed) + ld b, a + + rrca ; multiply by 32 + rrca + rrca + xor #0x1f + + add a, b + sbc a, #255 ; carry + + ld (_random_seed), a + ld l, a + ret + __endasm; +} + +void random_set_seed(uint8_t seed) { + random_seed = seed; +} + +uint8_t random_hw() __naked { + __asm + in a, (0x09) + ld l, a + ret + __endasm; +} diff --git a/src/random.s b/src/random.s deleted file mode 100644 index b504040..0000000 --- a/src/random.s +++ /dev/null @@ -1,31 +0,0 @@ -; Fast RND -; -; An 8-bit pseudo-random number generator, -; using a similar method to the Spectrum ROM, -; - without the overhead of the Spectrum ROM. -; -; R = random number seed -; an integer in the range [1, 256] -; -; R -> (33*R) mod 257 -; -; S = R - 1 -; an 8-bit unsigned integer - - .area _CODE - -_random:: - ld a, (_random_seed) - ld b, a - - rrca ; multiply by 32 - rrca - rrca - xor #0x1f - - add a, b - sbc a, #255 ; carry - - ld (_random_seed), a - ld l, a - ret