gbdk-2020 | GameBoy Development Kit |
| download: https://git.y1.nz/archives/gbdk.tar.gz | |
| README | Files | Log | Refs | LICENSE |
gbdk-lib/include/rand.h
1 /** @file rand.h
2 Random generator using the linear congruential method
3
4 @author Luc Van den Borre
5 */
6 #ifndef RAND_INCLUDE
7 #define RAND_INCLUDE
8
9 #include <types.h>
10 #include <stdint.h>
11
12 /** Initalise the pseudo-random number generator.
13
14 @param seed The value for initializing the random number generator.
15
16 The seed should be different each time, otherwise the same pseudo-random
17 sequence will be generated.
18
19 One way to do this is sampling (@ref DIV_REG) up to 2 times (high byte of
20 seed value then the low byte) at variable, non-deterministic points in time
21 (such as when the player presses buttons on the title screen or in a menu).
22
23 It only needs to be called once to be initialized.
24
25 @see rand(), randw()
26 */
27 #if defined(__PORT_sm83) || defined(__PORT_mos6502)
28 void initrand(uint16_t seed) OLDCALL;
29 #elif defined(__PORT_z80)
30 void initrand(uint16_t seed) Z88DK_FASTCALL;
31 #endif
32
33 #define RAND_MAX 255
34 #define RANDW_MAX 65535
35
36 /** The random number seed is stored in __rand_seed and can be
37 saved and restored if needed.
38
39 \code{.c}
40 // Save
41 some_uint16 = __rand_seed;
42 ...
43 // Restore
44 __rand_seed = some_uint16;
45 \endcode
46 */
47 extern uint16_t __rand_seed;
48
49 /** Returns a random byte (8 bit) value.
50
51 @ref initrand() should be used to initialize the random number generator before using rand()
52 */
53 #if defined(__PORT_sm83)
54 uint8_t rand(void) OLDCALL PRESERVES_REGS(b, c);
55 #elif defined(__PORT_z80)
56 uint8_t rand(void) OLDCALL PRESERVES_REGS(b, c, iyh, iyl);
57 #elif defined(__PORT_mos6502)
58 uint8_t rand(void);
59 #endif
60
61 /** Returns a random word (16 bit) value.
62
63 @ref initrand() should be used to initialize the random number generator before using rand()
64 */
65 #if defined(__PORT_sm83)
66 uint16_t randw(void) OLDCALL PRESERVES_REGS(b, c);
67 #elif defined(__PORT_z80)
68 uint16_t randw(void) OLDCALL PRESERVES_REGS(b, c, iyh, iyl);
69 #elif defined(__PORT_mos6502)
70 uint16_t randw(void);
71 #endif
72
73 /** Random generator using the linear lagged additive method
74
75 @param seed The value for initializing the random number generator.
76
77 Note: initarand() calls @ref initrand() with the same seed value, and
78 uses @ref rand() to initialize the random generator.
79
80 @see initrand() for suggestions about seed values, arand()
81 */
82 #if defined(__PORT_sm83) || defined(__PORT_mos6502)
83 void initarand(uint16_t seed) OLDCALL;
84 #elif defined(__PORT_z80)
85 void initarand(uint16_t seed) Z88DK_FASTCALL;
86 #endif
87
88 /** Returns a random number generated with the linear lagged additive method.
89
90 @ref initarand() should be used to initialize the random number generator before using arand()
91 */
92 #if defined(__PORT_sm83)
93 uint8_t arand(void) OLDCALL PRESERVES_REGS(b, c);
94 #elif defined(__PORT_z80)
95 uint8_t arand(void) OLDCALL PRESERVES_REGS(b, c, iyh, iyl);
96 #elif defined(__PORT_mos6502)
97 uint8_t arand(void);
98 #endif
99
100 #endif
This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.