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
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
|
INCLUDE "constants.asm"
SECTION "Text Commands", ROM0[$107e]
ScrollTextUpOneLine:: ; 107e (0:107e)
; move both rows of text in the normal text box up one row
; always called twice in a row
; first time, copy the two rows of text to the "in between" rows that are usually emtpy
; second time, copy the bottom row of text into the top row of text
coord hl, TEXTBOX_X, TEXTBOX_INNERY ; top row of text
coord de, TEXTBOX_X, TEXTBOX_INNERY - 1 ; empty line above text
ld b, TEXTBOX_WIDTH * 3
.copyText
ld a, [hli]
ld [de], a
inc de
dec b
jr nz, .copyText
coord hl, TEXTBOX_INNERX, TEXTBOX_INNERY + 2
ld a, " "
ld b, TEXTBOX_INNERW
.clearText
ld [hli], a
dec b
jr nz, .clearText
ld b, $05 ; wait five frames
.waitFrame
call DelayFrame
dec b
jr nz, .waitFrame
ret
ProtectedWaitBGMap:: ; 10a0 (0:10a0)
push bc
call WaitBGMap
pop bc
ret
TextCommandProcessor:: ; 10a6 (0:10a6)
; Process a string of text commands
; at hl and write text to bc
ld a, [wTextBoxFlags]
push af
set 1, a
ld [wTextBoxFlags], a
ld a, c
ld [wTextDest], a
ld a, b
ld [wTextDest + 1], a
; fall through
NextTextCommand:: ; 10b7 (0:10b7)
ld a, [hli]
cp "@" ; terminator
jr nz, .doTextCommand
pop af
ld [wTextBoxFlags], a
ret
.doTextCommand
push hl
ld hl, TextCommands
push bc
add a
ld b, $00
ld c, a
add hl, bc
pop bc
ld a, [hli]
ld h, [hl]
ld l, a
jp hl
Text_TX_BOX:: ; 10d0 (0:10d0)
; TX_BOX
; draw a box
; little endian
; [$04][addr][height][width]
pop hl
ld a, [hli]
ld e, a
ld a, [hli]
ld d, a
ld a, [hli]
ld b, a
ld a, [hli]
ld c, a
push hl
ld h, d
ld l, e
call DrawTextBox
pop hl
jr NextTextCommand
Text_TX:: ; 10e2 (0:10e2)
; TX
; write text until "@"
; [$00]["...@"]
pop hl
ld d, h
ld e, l
ld h, b
ld l, c
call PlaceString
ld h, d
ld l, e
inc hl
jr NextTextCommand
Text_TX_RAM:: ; 10ef (0:10ef)
; text_from_ram
; write text from a ram address
; little endian
; [$01][addr]
pop hl
ld a, [hli]
ld e, a
ld a, [hli]
ld d, a
push hl
ld h, b
ld l, c
call PlaceString
pop hl
jr NextTextCommand
Text_TX_BCD:: ; 10fd (0:10fd)
; TX_BCD
; write bcd from address, typically ram
; [$02][addr][flags]
; flags: see PrintBCDNumber
pop hl
ld a, [hli]
ld e, a
ld a, [hli]
ld d, a
ld a, [hli]
push hl
ld h, b
ld l, c
ld c, a
call PrintBCDNumber
ld b, h
ld c, l
pop hl
jr NextTextCommand
Text_TX_MOVE:: ; 110f (0:110f)
; TX_MOVE
; move to a new tile
; [$03][addr]
pop hl
ld a, [hli]
ld [wTextDest], a
ld c, a
ld a, [hli]
ld [wTextDest + 1], a
ld b, a
jp NextTextCommand
Text_TX_LOW:: ; 111d (0:111d)
; TX_LOW
; write text at (1,16)
; [$05]
pop hl
coord bc, TEXTBOX_INNERX, TEXTBOX_INNERY + 2
jp NextTextCommand
; 0x1124
Text_WAIT_BUTTON:: ; 1124 (0:1124)
; TX_WAITBUTTON
; wait for button press
; show arrow
; [06]
ld a, [wLinkMode]
cp $03
jp z, Text_TX_LINK_WAIT_BUTTON
ld a, "▼"
ldcoord_a TEXTBOX_WIDTH - 2, TEXTBOX_Y + TEXTBOX_HEIGHT - 1
push bc
call ButtonSound
pop bc
ld a, "─"
ldcoord_a TEXTBOX_WIDTH - 2, TEXTBOX_Y + TEXTBOX_HEIGHT - 1
pop hl
jp NextTextCommand
Text_TX_SCROLL:: ; 113f (0:113f)
; TX_SCROLL
; pushes text up two lines and sets the BC cursor to the border tile
; below the first character column of the text box.
; [07]
ld a, "─"
ldcoord_a TEXTBOX_WIDTH - 2, TEXTBOX_Y + TEXTBOX_HEIGHT - 1
call ScrollTextUpOneLine
call ScrollTextUpOneLine
pop hl
coord bc, TEXTBOX_INNERX, TEXTBOX_INNERY + 2
jp NextTextCommand
Text_START_ASM:: ; 1151 (0:1151)
; TX_ASM
; Executes code following this command.
; Text processing is resumed upon returning.
; [08][asm...ret]
pop hl
ld de, NextTextCommand
push de
jp hl
Text_TX_NUM:: ; 1157 (0:1157)
; TX_NUM
; [$09][addr][hi:bytes lo:digits]
pop hl
ld a, [hli]
ld e, a
ld a, [hli]
ld d, a
ld a, [hli]
push hl
ld h, b
ld l, c
ld b, a
and $0f
ld c, a
ld a, b
and $f0
swap a
set 6, a
ld b, a
call PrintNumber
ld b, h
ld c, l
pop hl
jp NextTextCommand
; 0x1175
Text_TX_EXIT: ; 1175 (0:1175)
; TX_EXIT
; [$0A]
push bc
call GetJoypad
ldh a, [hJoyState]
and (A_BUTTON | B_BUTTON)
jr nz, .done
ld c, 30
call DelayFrames
.done
pop bc
pop hl
jp NextTextCommand
; 0x1189
Text_PlaySound:: ; 1189 (0:1189)
; Text_PlaySound
; [0B|0E..13] Play Sound Effects
; [14..16] Play Pokémon Cries
pop hl
push bc
dec hl
ld a, [hli]
ld b, a
push hl
ld hl, .soundTable
.loop
ld a, [hli]
cp b
jr z, .found
inc hl
inc hl
jr .loop
.found
cp $14
jr z, .playCry
cp $15
jr z, .playCry
cp $16
jr z, .playCry
push de
ld e, [hl]
inc hl
ld d, [hl]
call PlaySFX
call WaitSFX
pop de
pop hl
pop bc
jp NextTextCommand
.playCry
push de
ld e, [hl]
inc hl
ld d, [hl]
call PlayCry
pop de
pop hl
pop bc
jp NextTextCommand
.soundTable:
dbw TX_SOUND_0B, $0063
dbw TX_SOUND_12, $006B
dbw TX_SOUND_0E, $0066
dbw TX_SOUND_0F, $0067
dbw TX_SOUND_10, $0068
dbw TX_SOUND_11, $0069
dbw TX_SOUND_13, $0027
dbw TX_CRY_14, MON_NIDORINA ; or MON_LEAFY?
dbw TX_CRY_15, MON_PIGEOT
dbw TX_CRY_16, MON_JUGON
Text_TX_DOTS: ; 11e1 (0:11e1)
pop hl
ld a, [hli]
ld d, a
push hl
ld h, b
ld l, c
.loop
ld a, "…"
ld [hli], a
push de
call GetJoypad
pop de
ldh a, [hJoyState]
and (A_BUTTON | B_BUTTON)
jr nz, .next
ld c, 10
call DelayFrames
.next
dec d
jr nz, .loop
ld b, h
ld c, l
pop hl
jp NextTextCommand
Text_TX_LINK_WAIT_BUTTON:: ; 1203 (0:1203)
push bc
call ButtonSound
pop bc
pop hl
jp NextTextCommand
; 0x120c
TextCommands:: ; 120c
dw Text_TX
dw Text_TX_RAM
dw Text_TX_BCD
dw Text_TX_MOVE
dw Text_TX_BOX
dw Text_TX_LOW
dw Text_WAIT_BUTTON
dw Text_TX_SCROLL
dw Text_START_ASM
dw Text_TX_NUM
dw Text_TX_EXIT
dw Text_PlaySound
dw Text_TX_DOTS
dw Text_TX_LINK_WAIT_BUTTON
dw Text_PlaySound
dw Text_PlaySound
dw Text_PlaySound
dw Text_PlaySound
dw Text_PlaySound
dw Text_PlaySound
dw Text_PlaySound
dw Text_PlaySound
dw Text_PlaySound
|