1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
Debug_RNG:
LD A, $mem_rng_state_1
LD HL, $9822
CALL =Print_8bit
LD A, $mem_rng_state_2
CALL =Print_8bit
RET
Initialize_RNG:
LD A, $15 ; $0c
LD $mem_rng_state_1, A
LD A, $15 ; $15
LD $mem_rng_state_2, A
RET
RNG_Step:
PUSH BC
PUSH DE
LD A, $mem_rng_state_1
LD D, A
LD A, $mem_rng_state_2
LD E, A
; state << 7
AND A
LD A, $mem_rng_state_2
LD B, A
LD A, $mem_rng_state_1
LD C, A
SRA C
RR B
LD C, $00
RR C
; result XOR state
LD A, D
XOR B
LD D, A
LD A, E
XOR C
LD E, A
; state >> 9
LD C, D
SRA C
; result XOR state
LD A, E
XOR C
LD E, A
; (state << 8) XOR state
LD A, D
XOR E
LD D, A
LD A, D
LD $mem_rng_state_1, A
LD A, E
LD $mem_rng_state_2, A
LD A, $mem_loop_frame_timer
XOR E
POP DE
POP BC
RET
RNG_Bound: ; generate a number where 0 < new_A <= Old A
PUSH BC
PUSH DE
LD B, A
CALL =RNG_Step
LD C, A
CALL =MUL
LD A, E
POP DE
POP BC
RET
|