aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorafanofosc2011-07-02 16:14:36 +0000
committerNicolas Schodet2011-07-04 00:37:04 +0200
commita7a9ea475496801f3fd2f800f30177dd737df215 (patch)
tree5af1c74292cd228f671508104e10241cefe1db50
parentf6a7a27faf5edb01a18d27e2f369e939cf99e521 (diff)
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
-rw-r--r--AT91SAM7S256/Source/c_cmd.c49
-rw-r--r--AT91SAM7S256/Source/c_cmd.h1
2 files changed, 49 insertions, 1 deletions
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[]);