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)12void 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)21Uint32 GetRandSeed(void) 22 { 23 return(randomSeed); 24 } 25 26 /* This magic is wholly the result of Andrew Welch, not me. :-) */ FastRandom(Uint16 range)27Uint16 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