1 
2 /* -- Return a random value between 0 and range - 1 */
3 /* blatantly cribbed from the Maelstrom package */
4 
5 #include <config.h>
6 #include "atris.h"
7 #include <stdlib.h>
8 #include <stdio.h>
9 
10 static Uint32 randomSeed;
11 
SeedRandom(Uint32 Seed)12 void SeedRandom(Uint32 Seed)
13 {
14 	if ( ! Seed ) {
15 		srand(time(NULL));
16 		Seed = (((rand()%0xFFFF)<<16)|(rand()%0xFFFF));
17 	}
18 	randomSeed = Seed;
19 }
20 
GetRandSeed(void)21 Uint32 GetRandSeed(void)
22 {
23 	return(randomSeed);
24 }
25 
26 /* This magic is wholly the result of Andrew Welch, not me. :-) */
FastRandom(Uint16 range)27 Uint16 FastRandom(Uint16 range)
28 {
29 	Uint16 result;
30 	register Uint32 calc;
31 	register Uint32 regD0;
32 	register Uint32 regD1;
33 	register Uint32 regD2;
34 
35 	calc = randomSeed;
36 	regD0 = 0x41A7;
37 	regD2 = regD0;
38 
39 	regD0 *= calc & 0x0000FFFF;
40 	regD1 = regD0;
41 
42 	regD1 = regD1 >> 16;
43 
44 	regD2 *= calc >> 16;
45 	regD2 += regD1;
46 	regD1 = regD2;
47 	regD1 += regD1;
48 
49 	regD1 = regD1 >> 16;
50 
51 	regD0 &= 0x0000FFFF;
52 	regD0 -= 0x7FFFFFFF;
53 
54 	regD2 &= 0x00007FFF;
55 	regD2 = (regD2 << 16) + (regD2 >> 16);
56 
57 	regD2 += regD1;
58 	regD0 += regD2;
59 
60 	/* An unsigned value < 0 is always 0 */
61 	/*************************************
62 	 Not compiled:
63 	if (regD0 < 0)
64 		regD0 += 0x7FFFFFFF;
65 	 *************************************/
66 
67 	randomSeed = regD0;
68 	if ((regD0 & 0x0000FFFF) == 0x8000)
69 		regD0 &= 0xFFFF0000;
70 
71 /* -- Now that we have our pseudo random number, pin it to the range we want */
72 
73 	regD1 = range;
74 	regD1 *= (regD0 & 0x0000FFFF);
75 	regD1 = (regD1 >> 16);
76 
77 	result = regD1;
78 
79 	return result;
80 }
81