Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pret
GitHub Repository: pret/pokered
Path: blob/master/home/print_num.asm
1270 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 print_digit 1000000
86
.hundred_thousands print_digit 100000
87
.ten_thousands print_digit 10000
88
.thousands print_digit 1000
89
.hundreds print_digit 100
90
91
.tens
92
ld c, 0
93
ldh a, [hNumToPrint + 2]
94
.mod
95
cp 10
96
jr c, .ok
97
sub 10
98
inc c
99
jr .mod
100
.ok
101
102
ld b, a
103
ldh a, [hPastLeadingZeros]
104
or c
105
ldh [hPastLeadingZeros], a
106
jr nz, .past
107
call .PrintLeadingZero
108
jr .next
109
.past
110
ld a, "0"
111
add c
112
ld [hl], a
113
.next
114
115
call .NextDigit
116
.ones
117
ld a, "0"
118
add b
119
ld [hli], a
120
pop de
121
dec de
122
pop bc
123
ret
124
125
.PrintDigit:
126
; Divide by the current decimal place.
127
; Print the quotient, and keep the modulus.
128
ld c, 0
129
.loop
130
ldh a, [hPowerOf10]
131
ld b, a
132
ldh a, [hNumToPrint]
133
ldh [hSavedNumToPrint], a
134
cp b
135
jr c, .underflow0
136
sub b
137
ldh [hNumToPrint], a
138
ldh a, [hPowerOf10 + 1]
139
ld b, a
140
ldh a, [hNumToPrint + 1]
141
ldh [hSavedNumToPrint + 1], a
142
cp b
143
jr nc, .noborrow1
144
145
ldh a, [hNumToPrint]
146
or 0
147
jr z, .underflow1
148
dec a
149
ldh [hNumToPrint], a
150
ldh a, [hNumToPrint + 1]
151
.noborrow1
152
153
sub b
154
ldh [hNumToPrint + 1], a
155
ldh a, [hPowerOf10 + 2]
156
ld b, a
157
ldh a, [hNumToPrint + 2]
158
ldh [hSavedNumToPrint + 2], a
159
cp b
160
jr nc, .noborrow2
161
162
ldh a, [hNumToPrint + 1]
163
and a
164
jr nz, .borrowed
165
166
ldh a, [hNumToPrint]
167
and a
168
jr z, .underflow2
169
dec a
170
ldh [hNumToPrint], a
171
xor a
172
.borrowed
173
174
dec a
175
ldh [hNumToPrint + 1], a
176
ldh a, [hNumToPrint + 2]
177
.noborrow2
178
sub b
179
ldh [hNumToPrint + 2], a
180
inc c
181
jr .loop
182
183
.underflow2
184
ldh a, [hSavedNumToPrint + 1]
185
ldh [hNumToPrint + 1], a
186
.underflow1
187
ldh a, [hSavedNumToPrint]
188
ldh [hNumToPrint], a
189
.underflow0
190
ldh a, [hPastLeadingZeros]
191
or c
192
jr z, .PrintLeadingZero
193
194
ld a, "0"
195
add c
196
ld [hl], a
197
ldh [hPastLeadingZeros], a
198
ret
199
200
.PrintLeadingZero:
201
bit BIT_LEADING_ZEROES, d
202
ret z
203
ld [hl], "0"
204
ret
205
206
.NextDigit:
207
; Increment unless the number is left-aligned,
208
; leading zeroes are not printed, and no digits
209
; have been printed yet.
210
bit BIT_LEADING_ZEROES, d
211
jr nz, .inc
212
bit BIT_LEFT_ALIGN, d
213
jr z, .inc
214
ldh a, [hPastLeadingZeros]
215
and a
216
ret z
217
.inc
218
inc hl
219
ret
220
221