|
16 | 16 | #include <string.h> |
17 | 17 | #include <stdlib.h> |
18 | 18 |
|
19 | | -#include <time.h> |
20 | | - |
21 | 19 | #include "jaguar.h" |
22 | 20 |
|
23 | 21 | #include "cdrom.h" |
|
35 | 33 |
|
36 | 34 | static bool frameDone; |
37 | 35 |
|
| 36 | +// Platform-independent xorshift32 PRNG for deterministic RAM initialization. |
| 37 | +// libc rand() produces different sequences on different platforms (glibc vs |
| 38 | +// macOS libsystem), which causes cross-platform baseline mismatches. |
| 39 | +static uint32_t jaguar_prng_state = 12345; |
| 40 | + |
| 41 | +void JaguarSeedPRNG(uint32_t seed) |
| 42 | +{ |
| 43 | + jaguar_prng_state = seed ? seed : 1; |
| 44 | +} |
| 45 | + |
| 46 | +uint32_t JaguarRand(void) |
| 47 | +{ |
| 48 | + jaguar_prng_state ^= jaguar_prng_state << 13; |
| 49 | + jaguar_prng_state ^= jaguar_prng_state >> 17; |
| 50 | + jaguar_prng_state ^= jaguar_prng_state << 5; |
| 51 | + return jaguar_prng_state; |
| 52 | +} |
| 53 | + |
38 | 54 | #define ALPINE_FUNCTIONS |
39 | 55 |
|
40 | 56 | // Private function prototypes |
@@ -541,12 +557,12 @@ void JaguarSetScreenPitch(uint32_t pitch) |
541 | 557 | void JaguarInit(void) |
542 | 558 | { |
543 | 559 | unsigned i; |
544 | | - // For randomizing RAM |
545 | | - srand(time(NULL)); |
| 560 | + // Reset the platform-independent PRNG for deterministic RAM fill |
| 561 | + JaguarSeedPRNG(12345); |
546 | 562 |
|
547 | 563 | // Contents of local RAM are quasi-stable; we simulate this by randomizing RAM contents |
548 | 564 | for(i=0; i<0x200000; i+=4) |
549 | | - *((uint32_t *)(&jaguarMainRAM[i])) = rand(); |
| 565 | + *((uint32_t *)(&jaguarMainRAM[i])) = JaguarRand(); |
550 | 566 |
|
551 | 567 | lowerField = false; // Reset the lower field flag |
552 | 568 | memset(jaguarMainRAM + 0x804, 0xFF, 4); |
@@ -631,8 +647,9 @@ void JaguarReset(void) |
631 | 647 |
|
632 | 648 | // Only problem with this approach: It wipes out RAM loaded files...! |
633 | 649 | // Contents of local RAM are quasi-stable; we simulate this by randomizing RAM contents |
| 650 | + JaguarSeedPRNG(12345); |
634 | 651 | for(i=8; i<0x200000; i+=4) |
635 | | - *((uint32_t *)(&jaguarMainRAM[i])) = rand(); |
| 652 | + *((uint32_t *)(&jaguarMainRAM[i])) = JaguarRand(); |
636 | 653 |
|
637 | 654 | // New timer base code stuffola... |
638 | 655 | InitializeEventList(); |
|
0 commit comments