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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
|
; converts the two-digit BCD number provided in a to text (ascii) format,
; writes them to [wStringBuffer] and [wStringBuffer + 1], and to the BGMap0 address at bc
WriteTwoDigitBCDNumber:
push hl
push bc
push de
ld hl, wStringBuffer
push hl
push bc
call WriteBCDNumberInTextFormat
pop bc
call BCCoordToBGMap0Address
pop hl
ld b, 2
call JPHblankCopyDataHLtoDE
pop de
pop bc
pop hl
ret
; converts the one-digit BCD number provided in the lower nybble of a to text
; (ascii) format, and writes it to [wStringBuffer] and to the BGMap0 address at bc
WriteOneDigitBCDNumber:
push hl
push bc
push de
ld hl, wStringBuffer
push hl
push bc
call WriteBCDDigitInTextFormat
pop bc
call BCCoordToBGMap0Address
pop hl
ld b, 1
call JPHblankCopyDataHLtoDE
pop de
pop bc
pop hl
ret
; converts the four-digit BCD number provided in h and l to text (ascii) format,
; writes them to [wStringBuffer] through [wStringBuffer + 3], and to the BGMap0 address at bc
WriteFourDigitBCDNumber:
push hl
push bc
push de
ld e, l
ld d, h
ld hl, wStringBuffer
push hl
push bc
ld a, d
call WriteBCDNumberInTextFormat
ld a, e
call WriteBCDNumberInTextFormat
pop bc
call BCCoordToBGMap0Address
pop hl
ld b, 4
call JPHblankCopyDataHLtoDE
pop de
pop bc
pop hl
ret
; given two BCD digits in the two nybbles of register a,
; write them in text (ascii) format to hl (most significant nybble first).
; numbers above 9 end up converted to half-width font tiles.
WriteBCDNumberInTextFormat:
push af
swap a
call WriteBCDDigitInTextFormat
pop af
; fallthrough
; given a BCD digit in the (lower nybble) of register a, write it in text (ascii)
; format to hl. numbers above 9 end up converted to half-width font tiles.
WriteBCDDigitInTextFormat:
and $0f
add "0"
cp "9" + 1
jr c, .write_num
add $07
.write_num
ld [hli], a
ret
; converts the one-byte number at a to text (ascii) format,
; and writes it to [wStringBuffer] and the BGMap0 address at bc
WriteOneByteNumber:
push bc
push hl
ld l, a
ld h, $00
ld de, wStringBuffer
push de
push bc
ld bc, -100
call TwoByteNumberToText.get_digit
ld bc, -10
call TwoByteNumberToText.get_digit
ld bc, -1
call TwoByteNumberToText.get_digit
pop bc
call BCCoordToBGMap0Address
pop hl
ld b, 3
call JPHblankCopyDataHLtoDE
pop hl
pop bc
ret
; converts the two-byte number at hl to text (ascii) format,
; and writes it to [wStringBuffer] and the BGMap0 address at bc
WriteTwoByteNumber:
push bc
ld de, wStringBuffer
push de
call TwoByteNumberToText
call BCCoordToBGMap0Address
pop hl
ld b, 5
call JPHblankCopyDataHLtoDE
pop bc
ret
; convert the number at hl to text (ascii) format and write it to de
TwoByteNumberToText:
push bc
ld bc, -10000
call .get_digit
ld bc, -1000
call .get_digit
ld bc, -100
call .get_digit
ld bc, -10
call .get_digit
ld bc, -1
call .get_digit
xor a ; TX_END
ld [de], a
pop bc
ret
.get_digit
ld a, "0" - 1
.subtract_loop
inc a
add hl, bc
jr c, .subtract_loop
ld [de], a
inc de
ld a, l
sub c
ld l, a
ld a, h
sbc b
ld h, a
ret
|