Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pret
GitHub Repository: pret/pokered
Path: blob/master/engine/math/multiply_divide.asm
1271 views
1
_Multiply::
2
ld a, $8
3
ld b, a
4
xor a
5
ldh [hProduct], a
6
ldh [hMultiplyBuffer], a
7
ldh [hMultiplyBuffer+1], a
8
ldh [hMultiplyBuffer+2], a
9
ldh [hMultiplyBuffer+3], a
10
.loop
11
ldh a, [hMultiplier]
12
srl a
13
ldh [hMultiplier], a ; (aliases: hDivisor, hMultiplier, hPowerOf10)
14
jr nc, .smallMultiplier
15
ldh a, [hMultiplyBuffer+3]
16
ld c, a
17
ldh a, [hMultiplicand+2]
18
add c
19
ldh [hMultiplyBuffer+3], a
20
ldh a, [hMultiplyBuffer+2]
21
ld c, a
22
ldh a, [hMultiplicand+1]
23
adc c
24
ldh [hMultiplyBuffer+2], a
25
ldh a, [hMultiplyBuffer+1]
26
ld c, a
27
ldh a, [hMultiplicand] ; (aliases: hMultiplicand)
28
adc c
29
ldh [hMultiplyBuffer+1], a
30
ldh a, [hMultiplyBuffer]
31
ld c, a
32
ldh a, [hProduct] ; (aliases: hProduct, hPastLeadingZeros, hQuotient)
33
adc c
34
ldh [hMultiplyBuffer], a
35
.smallMultiplier
36
dec b
37
jr z, .done
38
ldh a, [hMultiplicand+2]
39
sla a
40
ldh [hMultiplicand+2], a
41
ldh a, [hMultiplicand+1]
42
rl a
43
ldh [hMultiplicand+1], a
44
ldh a, [hMultiplicand]
45
rl a
46
ldh [hMultiplicand], a
47
ldh a, [hProduct]
48
rl a
49
ldh [hProduct], a
50
jr .loop
51
.done
52
ldh a, [hMultiplyBuffer+3]
53
ldh [hProduct+3], a
54
ldh a, [hMultiplyBuffer+2]
55
ldh [hProduct+2], a
56
ldh a, [hMultiplyBuffer+1]
57
ldh [hProduct+1], a
58
ldh a, [hMultiplyBuffer]
59
ldh [hProduct], a
60
ret
61
62
_Divide::
63
xor a
64
ldh [hDivideBuffer], a
65
ldh [hDivideBuffer+1], a
66
ldh [hDivideBuffer+2], a
67
ldh [hDivideBuffer+3], a
68
ldh [hDivideBuffer+4], a
69
ld a, $9
70
ld e, a
71
.loop
72
ldh a, [hDivideBuffer]
73
ld c, a
74
ldh a, [hDividend+1] ; (aliases: hMultiplicand)
75
sub c
76
ld d, a
77
ldh a, [hDivisor] ; (aliases: hDivisor, hMultiplier, hPowerOf10)
78
ld c, a
79
ldh a, [hDividend] ; (aliases: hProduct, hPastLeadingZeros, hQuotient)
80
sbc c
81
jr c, .next
82
ldh [hDividend], a ; (aliases: hProduct, hPastLeadingZeros, hQuotient)
83
ld a, d
84
ldh [hDividend+1], a ; (aliases: hMultiplicand)
85
ldh a, [hDivideBuffer+4]
86
inc a
87
ldh [hDivideBuffer+4], a
88
jr .loop
89
.next
90
ld a, b
91
cp $1
92
jr z, .done
93
ldh a, [hDivideBuffer+4]
94
sla a
95
ldh [hDivideBuffer+4], a
96
ldh a, [hDivideBuffer+3]
97
rl a
98
ldh [hDivideBuffer+3], a
99
ldh a, [hDivideBuffer+2]
100
rl a
101
ldh [hDivideBuffer+2], a
102
ldh a, [hDivideBuffer+1]
103
rl a
104
ldh [hDivideBuffer+1], a
105
dec e
106
jr nz, .next2
107
ld a, $8
108
ld e, a
109
ldh a, [hDivideBuffer]
110
ldh [hDivisor], a ; (aliases: hDivisor, hMultiplier, hPowerOf10)
111
xor a
112
ldh [hDivideBuffer], a
113
ldh a, [hDividend+1] ; (aliases: hMultiplicand)
114
ldh [hDividend], a ; (aliases: hProduct, hPastLeadingZeros, hQuotient)
115
ldh a, [hDividend+2]
116
ldh [hDividend+1], a ; (aliases: hMultiplicand)
117
ldh a, [hDividend+3]
118
ldh [hDividend+2], a
119
.next2
120
ld a, e
121
cp $1
122
jr nz, .okay
123
dec b
124
.okay
125
ldh a, [hDivisor] ; (aliases: hDivisor, hMultiplier, hPowerOf10)
126
srl a
127
ldh [hDivisor], a ; (aliases: hDivisor, hMultiplier, hPowerOf10)
128
ldh a, [hDivideBuffer]
129
rr a
130
ldh [hDivideBuffer], a
131
jr .loop
132
.done
133
ldh a, [hDividend+1] ; (aliases: hMultiplicand)
134
ldh [hRemainder], a ; (aliases: hDivisor, hMultiplier, hPowerOf10)
135
ldh a, [hDivideBuffer+4]
136
ldh [hQuotient+3], a
137
ldh a, [hDivideBuffer+3]
138
ldh [hQuotient+2], a
139
ldh a, [hDivideBuffer+2]
140
ldh [hQuotient+1], a ; (aliases: hMultiplicand)
141
ldh a, [hDivideBuffer+1]
142
ldh [hDividend], a ; (aliases: hProduct, hPastLeadingZeros, hQuotient)
143
ret
144
145