summaryrefslogtreecommitdiff
path: root/home/toolgear.asm
blob: 38a4c1c3008e1c67ab91bb2e65916f917b7ca1a7 (plain)
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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
INCLUDE "constants.asm"

SECTION "home/toolgear.asm", ROM0

; local charmap, global charmap won't apply
; see https://github.com/gbdev/rgbds/issues/265#issuecomment-395229694
newcharmap local
	charmap "0", $66
	charmap "1", $67
	charmap "2", $68
	charmap "3", $69
	charmap "4", $6a
	charmap "5", $6b
	charmap "6", $6c
	charmap "7", $6d
	charmap "8", $6e
	charmap "9", $6f
	; if debug coords shown
	charmap "A", $70
	charmap "B", $71
	charmap "C", $72
	charmap "D", $73
	charmap "E", $74
	charmap "F", $75
	; small kana aren't actively loaded

	; if clock shown
	charmap ":", $70
	charmap "日", $71
	charmap "月", $72
	charmap "火", $73
	charmap "水", $74
	charmap "木", $75
	charmap "金", $76
	charmap "土", $77
	charmap "⚡", $78 ; power
	charmap "☎", $79 ; mobile

	; active frame
	charmap "┌", $79 ; only if debug coords shown
	charmap "─", $7a
	charmap "┐", $7b
	charmap "│", $7c
	charmap "└", $7d
	charmap "┘", $7e
	charmap " ", $7f

EnableToolgear::
	ld hl, wd153
	res TOOLGEAR_COORDS_F, [hl]
	ld hl, wToolgearFlags
	set TOOLGEAR_COORDS_F, [hl]
	ret

DisableToolgear::
	ld hl, wToolgearFlags
	res SHOW_TOOLGEAR_F, [hl]
	xor a
	ldh [hLCDCPointer], a
	ret

InitToolgearBuffer::
	xor a
	ldh [hBGMapMode], a
	ld hl, wToolgearFlags
	bit SHOW_TOOLGEAR_F, [hl]
	jr z, .hide_window

	res HIDE_TOOLGEAR_F, [hl]
	call LoadToolgearGraphics

	bgcoord hl, 0, 0, wToolgearBuffer
	ld a, "─"
	ld bc, SCREEN_WIDTH
	call ByteFill

	bgcoord hl, 0, 1, wToolgearBuffer
	ld a, " "
	ld bc, SCREEN_WIDTH
	call ByteFill

	call UpdateToolgear

	ld hl, vBGMap1
	ld bc, $4 ; 4 tiles = 2 rows
	bgcoord de, 0, 0, wToolgearBuffer
	call Get2bpp

	ld a, $80
	ldh [hLCDCPointer], a
	ld a, $80
	ldh [rWY], a
	ldh [hWY], a
	ret

.hide_window
	xor a
	ldh [hLCDCPointer], a
	ld a, $90
	ldh [rWY], a
	ldh [hWY], a
	ret

UpdateToolgear::
; Prepares a buffer for the clock display, which in the Debug ROM is displayed on the bottom of the screen.
; This function is called every frame, and loads special tiles into the $66-$7a space.
	bgcoord hl, 0, 1, wToolgearBuffer
	ld bc, SCREEN_WIDTH
	ld a, " "
	call ByteFill

	ld hl, wd153
	bit TOOLGEAR_COORDS_F, [hl]
	jr z, .debug_show_time

	ld hl, wXCoord
	bgcoord de, 4, 1, wToolgearBuffer
	ld c, 1
	call .printHex
	ld hl, wYCoord
	bgcoord de, 8, 1, wToolgearBuffer
	ld c, 1
	call .printHex
	ret

.debug_show_time
	ld hl, hRTCHours
	bgcoord de, 0, 1, wToolgearBuffer
	call .printDec
	ld hl, hRTCMinutes
	bgcoord de, 3, 1, wToolgearBuffer
	call .printDec
	ldh a, [hRTCDays]
	and 7
	add "日" ; Sunday
	ldbgcoord_a 6, 1, wToolgearBuffer
	ld a, "⚡" ; power
	ldbgcoord_a 9, 1, wToolgearBuffer
	inc a ; mobile
	ldbgcoord_a 11, 1, wToolgearBuffer
	ldh a, [hRTCSeconds]
	and 1
	ret z

	ld a, ":"
	ldbgcoord_a 2, 1, wToolgearBuffer
	ret

.printHex::
; .printHex
; print c hexadecimal digits from hl to de
; clobbers: a, b
	ld a, [hli]
	ld b, a
	swap a
	call .printDigit
	ld a, b
	call .printDigit
	dec c
	jr nz, .printHex
	ret

.printDec::
; .printDec
; print c decimal digits from hl to de
; clobbers: a, b
	ld a, [hli]
	ld b, 0
.mod10:
	inc b
	sub 10
	jr nc, .mod10
	dec b
	add 10
	push af
	ld a, b
	call .printDigit
	pop af
	call .printDigit
	ret

.printDigit::
; .printDigit
; print a hexadecimal digit for value in a to de
	and $f
	add "0"
	ld [de], a
	inc de
	ret