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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
_Multiply::
ld a, $8
ld b, a
xor a
ldh [hProduct], a
ldh [hMultiplyBuffer], a
ldh [hMultiplyBuffer+1], a
ldh [hMultiplyBuffer+2], a
ldh [hMultiplyBuffer+3], a
.loop
ldh a, [hMultiplier]
srl a
ldh [hMultiplier], a ; (aliases: hDivisor, hMultiplier, hPowerOf10)
jr nc, .smallMultiplier
ldh a, [hMultiplyBuffer+3]
ld c, a
ldh a, [hMultiplicand+2]
add c
ldh [hMultiplyBuffer+3], a
ldh a, [hMultiplyBuffer+2]
ld c, a
ldh a, [hMultiplicand+1]
adc c
ldh [hMultiplyBuffer+2], a
ldh a, [hMultiplyBuffer+1]
ld c, a
ldh a, [hMultiplicand] ; (aliases: hMultiplicand)
adc c
ldh [hMultiplyBuffer+1], a
ldh a, [hMultiplyBuffer]
ld c, a
ldh a, [hProduct] ; (aliases: hProduct, hPastLeadingZeros, hQuotient)
adc c
ldh [hMultiplyBuffer], a
.smallMultiplier
dec b
jr z, .done
ldh a, [hMultiplicand+2]
sla a
ldh [hMultiplicand+2], a
ldh a, [hMultiplicand+1]
rl a
ldh [hMultiplicand+1], a
ldh a, [hMultiplicand]
rl a
ldh [hMultiplicand], a
ldh a, [hProduct]
rl a
ldh [hProduct], a
jr .loop
.done
ldh a, [hMultiplyBuffer+3]
ldh [hProduct+3], a
ldh a, [hMultiplyBuffer+2]
ldh [hProduct+2], a
ldh a, [hMultiplyBuffer+1]
ldh [hProduct+1], a
ldh a, [hMultiplyBuffer]
ldh [hProduct], a
ret
_Divide::
xor a
ldh [hDivideBuffer], a
ldh [hDivideBuffer+1], a
ldh [hDivideBuffer+2], a
ldh [hDivideBuffer+3], a
ldh [hDivideBuffer+4], a
ld a, $9
ld e, a
.loop
ldh a, [hDivideBuffer]
ld c, a
ldh a, [hDividend+1] ; (aliases: hMultiplicand)
sub c
ld d, a
ldh a, [hDivisor] ; (aliases: hDivisor, hMultiplier, hPowerOf10)
ld c, a
ldh a, [hDividend] ; (aliases: hProduct, hPastLeadingZeros, hQuotient)
sbc c
jr c, .next
ldh [hDividend], a ; (aliases: hProduct, hPastLeadingZeros, hQuotient)
ld a, d
ldh [hDividend+1], a ; (aliases: hMultiplicand)
ldh a, [hDivideBuffer+4]
inc a
ldh [hDivideBuffer+4], a
jr .loop
.next
ld a, b
cp $1
jr z, .done
ldh a, [hDivideBuffer+4]
sla a
ldh [hDivideBuffer+4], a
ldh a, [hDivideBuffer+3]
rl a
ldh [hDivideBuffer+3], a
ldh a, [hDivideBuffer+2]
rl a
ldh [hDivideBuffer+2], a
ldh a, [hDivideBuffer+1]
rl a
ldh [hDivideBuffer+1], a
dec e
jr nz, .next2
ld a, $8
ld e, a
ldh a, [hDivideBuffer]
ldh [hDivisor], a ; (aliases: hDivisor, hMultiplier, hPowerOf10)
xor a
ldh [hDivideBuffer], a
ldh a, [hDividend+1] ; (aliases: hMultiplicand)
ldh [hDividend], a ; (aliases: hProduct, hPastLeadingZeros, hQuotient)
ldh a, [hDividend+2]
ldh [hDividend+1], a ; (aliases: hMultiplicand)
ldh a, [hDividend+3]
ldh [hDividend+2], a
.next2
ld a, e
cp $1
jr nz, .okay
dec b
.okay
ldh a, [hDivisor] ; (aliases: hDivisor, hMultiplier, hPowerOf10)
srl a
ldh [hDivisor], a ; (aliases: hDivisor, hMultiplier, hPowerOf10)
ldh a, [hDivideBuffer]
rr a
ldh [hDivideBuffer], a
jr .loop
.done
ldh a, [hDividend+1] ; (aliases: hMultiplicand)
ldh [hRemainder], a ; (aliases: hDivisor, hMultiplier, hPowerOf10)
ldh a, [hDivideBuffer+4]
ldh [hQuotient+3], a
ldh a, [hDivideBuffer+3]
ldh [hQuotient+2], a
ldh a, [hDivideBuffer+2]
ldh [hQuotient+1], a ; (aliases: hMultiplicand)
ldh a, [hDivideBuffer+1]
ldh [hDividend], a ; (aliases: hProduct, hPastLeadingZeros, hQuotient)
ret
|