diff options
Diffstat (limited to 'common/random.asm')
-rw-r--r-- | common/random.asm | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/common/random.asm b/common/random.asm new file mode 100644 index 000000000..0f46da9e4 --- /dev/null +++ b/common/random.asm @@ -0,0 +1,76 @@ +Random: ; 2f8c +; A simple hardware-based random number generator (RNG). + +; Two random numbers are generated by adding and subtracting +; the divider to the respective values every time it's called. + +; The divider is a register that increments at a rate of 16384Hz. +; For comparison, the Game Boy operates at a clock speed of 4.2MHz. + +; Additionally, an equivalent function is executed in VBlank. + +; This leaves a with the value in hRandomSub. + + push bc + + ld a, [rDIV] + ld b, a + ld a, [hRandomAdd] + adc b + ld [hRandomAdd], a + + ld a, [rDIV] + ld b, a + ld a, [hRandomSub] + sbc b + ld [hRandomSub], a + + pop bc + ret +; 2f9f + +BattleRandom: ; 2f9f +; _BattleRandom lives in another bank. + +; It handles all RNG calls in the battle engine, allowing +; link battles to remain in sync using a shared PRNG. + + ld a, [hROMBank] + push af + ld a, BANK(_BattleRandom) + rst Bankswitch + + call _BattleRandom + + ld [$cfb6], a + pop af + rst Bankswitch + ld a, [$cfb6] + ret +; 2fb1 + + +Function2fb1: ; 2fb1 + push bc + ld c, a + xor a + sub c +.asm_2fb5 + sub c + jr nc, .asm_2fb5 + add c + ld b, a + push bc +.asm_2fbb + call Random + ld a, [hRandomAdd] + ld c, a + add b + jr c, .asm_2fbb + ld a, c + pop bc + call SimpleDivide + pop bc + ret +; 2fcb + |