ref: 5a6e43e72ab8e7c505600cb7140eac97e5b8d2e1
dir: /home/random.asm/
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 [wPredefTemp + 1], a pop af rst Bankswitch ld a, [wPredefTemp + 1] ret ; 2fb1 RandomRange:: ; 2fb1 ; Return a random number between 0 and a (non-inclusive). push bc ld c, a ; b = $100 % c xor a sub c .mod sub c jr nc, .mod add c ld b, a ; Get a random number ; from 0 to $ff - b. push bc .loop call Random ld a, [hRandomAdd] ld c, a add b jr c, .loop ld a, c pop bc call SimpleDivide pop bc ret ; 2fcb