From a7a9ea475496801f3fd2f800f30177dd737df215 Mon Sep 17 00:00:00 2001 From: afanofosc Date: Sat, 2 Jul 2011 16:14:36 +0000 Subject: Added a new random number generator system call (RandomEx) git-svn-id: https://mindboards.svn.sourceforge.net/svnroot/mindboards/lms_nbcnxc/branches/version_131@39 c9361245-7fe8-9947-84e8-057757c4e366 --- AT91SAM7S256/Source/c_cmd.c | 49 ++++++++++++++++++++++++++++++++++++++++++++- AT91SAM7S256/Source/c_cmd.h | 1 + 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/AT91SAM7S256/Source/c_cmd.c b/AT91SAM7S256/Source/c_cmd.c index 7a81c71..80b8267 100644 --- a/AT91SAM7S256/Source/c_cmd.c +++ b/AT91SAM7S256/Source/c_cmd.c @@ -258,7 +258,7 @@ static pSysCall SysCallFuncs[SYSCALL_COUNT] = cCmdWrapMemoryManager, cCmdWrapReadLastResponse, cCmdWrapFileTell, - cCmdWrapUndefinedSysCall // 100 system call slots + cCmdWrapRandomEx // 100 system call slots // don't forget to update SYSCALL_COUNT in c_cmd.h }; @@ -9704,6 +9704,53 @@ NXT_STATUS cCmdWrapFileTell(UBYTE * ArgV[]) return (NO_ERR); } +// +//cCmdWrapRandomEx +//ArgV[0]: Seed, SLONG (in/out) +//ArgV[1]: Reseed?, UBYTE (true or false) (in) +static SLONG __random_seed = 1; +static SLONG __old_random_seed = 1; + +NXT_STATUS cCmdWrapRandomEx(UBYTE * ArgV[]) +{ + SLONG * pSeed = (SLONG*)(ArgV[0]); + if (*(ArgV[1])) + { + // reseed + if (*pSeed == 0) { + *pSeed = (SLONG)dTimerRead(); + if (*pSeed < 0) + *pSeed = 1; + } + else if (*pSeed < 0) + *pSeed = __old_random_seed; + __random_seed = *pSeed; + __old_random_seed = __random_seed; + } + else + { + /* + MINSTD + a = 16807 (with q = 127773 and r = 2836) or + better randomness + a = 48271 (with q = 44488 and r = 3399) or + a = 69621 (with q = 30845 and r = 23902) + */ +#define a 48271 +#define m 2147483647 +#define q (m / a) +#define r (m % a) + SLONG test = a * (__random_seed % q) - r * (__random_seed / q); + if (test > 0) + __random_seed = test; + else + __random_seed = test + m; + } + *pSeed = __random_seed; + + return NO_ERR; +} + NXT_STATUS cCmdWrapUndefinedSysCall(UBYTE * ArgV[]) { return (NO_ERR); diff --git a/AT91SAM7S256/Source/c_cmd.h b/AT91SAM7S256/Source/c_cmd.h index bb4891f..22f1a2e 100644 --- a/AT91SAM7S256/Source/c_cmd.h +++ b/AT91SAM7S256/Source/c_cmd.h @@ -916,6 +916,7 @@ NXT_STATUS cCmdWrapDrawFont(UBYTE * ArgV[]); NXT_STATUS cCmdWrapMemoryManager(UBYTE * ArgV[]); NXT_STATUS cCmdWrapReadLastResponse(UBYTE * ArgV[]); NXT_STATUS cCmdWrapFileTell(UBYTE * ArgV[]); +NXT_STATUS cCmdWrapRandomEx(UBYTE * ArgV[]); NXT_STATUS cCmdWrapUndefinedSysCall(UBYTE * ArgV[]); -- cgit v1.2.3