Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pret
GitHub Repository: pret/pokered
Path: blob/master/home/print_num.asm
2024 views
1
PrintNumber::
2
; Print the c-digit, b-byte value at de.
3
; Allows 2 to 7 digits. For 1-digit numbers, add
4
; the value to char "0" instead of calling PrintNumber.
5
; Flags LEADING_ZEROES and LEFT_ALIGN can be given
6
; in bits 7 and 6 of b respectively.
7
push bc
8
xor a
9
ldh [hPastLeadingZeros], a
10
ldh [hNumToPrint], a
11
ldh [hNumToPrint + 1], a
12
ld a, b
13
and $f
14
cp 1
15
jr z, .byte
16
cp 2
17
jr z, .word
18
.long
19
ld a, [de]
20
ldh [hNumToPrint], a
21
inc de
22
ld a, [de]
23
ldh [hNumToPrint + 1], a
24
inc de
25
ld a, [de]
26
ldh [hNumToPrint + 2], a
27
jr .start
28
29
.word
30
ld a, [de]
31
ldh [hNumToPrint + 1], a
32
inc de
33
ld a, [de]
34
ldh [hNumToPrint + 2], a
35
jr .start
36
37
.byte
38
ld a, [de]
39
ldh [hNumToPrint + 2], a
40
41
.start
42
push de
43
44
ld d, b
45
ld a, c
46
ld b, a
47
xor a
48
ld c, a
49
ld a, b
50
51
cp 2
52
jr z, .tens
53
cp 3
54
jr z, .hundreds
55
cp 4
56
jr z, .thousands
57
cp 5
58
jr z, .ten_thousands
59
cp 6
60
jr z, .hundred_thousands
61
62
MACRO print_digit
63
64
IF (\1) / $10000
65
ld a, \1 / $10000 % $100
66
ELSE
67
xor a
68
ENDC
69
ldh [hPowerOf10 + 0], a
70
71
IF (\1) / $100
72
ld a, \1 / $100 % $100
73
ELSE
74
xor a
75
ENDC
76
ldh [hPowerOf10 + 1], a
77
78
ld a, \1 / $1 % $100
79
ldh [hPowerOf10 + 2], a
80
81
call .PrintDigit
82
call .NextDigit
83
ENDM
84
85
; millions
86
print_digit 1000000
87
.hundred_thousands
88
print_digit 100000
89
.ten_thousands
90
print_digit 10000
91
.thousands
92
print_digit 1000
93
.hundreds
94
print_digit 100
95
96
.tens
97
ld c, 0
98
ldh a, [hNumToPrint + 2]
99
.mod
100
cp 10
101
jr c, .ok
102
sub 10
103
inc c
104
jr .mod
105
.ok
106
107
ld b, a
108
ldh a, [hPastLeadingZeros]
109
or c
110
ldh [hPastLeadingZeros], a
111
jr nz, .past
112
call .PrintLeadingZero
113
jr .next
114
.past
115
ld a, '0'
116
add c
117
ld [hl], a
118
.next
119
120
call .NextDigit
121
; ones
122
ld a, '0'
123
add b
124
ld [hli], a
125
pop de
126
dec de
127
pop bc
128
ret
129
130
.PrintDigit:
131
; Divide by the current decimal place.
132
; Print the quotient, and keep the modulus.
133
ld c, 0
134
.loop
135
ldh a, [hPowerOf10]
136
ld b, a
137
ldh a, [hNumToPrint]
138
ldh [hSavedNumToPrint], a
139
cp b
140
jr c, .underflow0
141
sub b
142
ldh [hNumToPrint], a
143
ldh a, [hPowerOf10 + 1]
144
ld b, a
145
ldh a, [hNumToPrint + 1]
146
ldh [hSavedNumToPrint + 1], a
147
cp b
148
jr nc, .noborrow1
149
150
ldh a, [hNumToPrint]
151
or 0
152
jr z, .underflow1
153
dec a
154
ldh [hNumToPrint], a
155
ldh a, [hNumToPrint + 1]
156
.noborrow1
157
158
sub b
159
ldh [hNumToPrint + 1], a
160
ldh a, [hPowerOf10 + 2]
161
ld b, a
162
ldh a, [hNumToPrint + 2]
163
ldh [hSavedNumToPrint + 2], a
164
cp b
165
jr nc, .noborrow2
166
167
ldh a, [hNumToPrint + 1]
168
and a
169
jr nz, .borrowed
170
171
ldh a, [hNumToPrint]
172
and a
173
jr z, .underflow2
174
dec a
175
ldh [hNumToPrint], a
176
xor a
177
.borrowed
178
179
dec a
180
ldh [hNumToPrint + 1], a
181
ldh a, [hNumToPrint + 2]
182
.noborrow2
183
sub b
184
ldh [hNumToPrint + 2], a
185
inc c
186
jr .loop
187
188
.underflow2
189
ldh a, [hSavedNumToPrint + 1]
190
ldh [hNumToPrint + 1], a
191
.underflow1
192
ldh a, [hSavedNumToPrint]
193
ldh [hNumToPrint], a
194
.underflow0
195
ldh a, [hPastLeadingZeros]
196
or c
197
jr z, .PrintLeadingZero
198
199
ld a, '0'
200
add c
201
ld [hl], a
202
ldh [hPastLeadingZeros], a
203
ret
204
205
.PrintLeadingZero:
206
bit BIT_LEADING_ZEROES, d
207
ret z
208
ld [hl], '0'
209
ret
210
211
.NextDigit:
212
; Increment unless the number is left-aligned,
213
; leading zeroes are not printed, and no digits
214
; have been printed yet.
215
bit BIT_LEADING_ZEROES, d
216
jr nz, .inc
217
bit BIT_LEFT_ALIGN, d
218
jr z, .inc
219
ldh a, [hPastLeadingZeros]
220
and a
221
ret z
222
.inc
223
inc hl
224
ret
225
226