git.y1.nz

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.