summaryrefslogtreecommitdiff
path: root/engine/sprites.asm
blob: b9267d667f7e932e1d4ab393e5a4bcd380f90105 (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
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
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
ClearAnimatedObjects: ; 8d174
	ld hl, $c508 ; 23:5174
	ld bc, $c1 ; 23:5177
.loop
	ld [hl], $0 ; 23:517a
	inc hl ; 23:517c
	dec bc ; 23:517d
	ld a, c ; 23:517e
	or b ; 23:517f
	jr nz, .loop ; 23:5180
	ret ; 23:5182

PlayAnimatedObjectationsAndDelayFrame: ; 8d182
	call PlayAnimatedObjectations ; 23:5183
	call $32e ; DelayFrame ; 23:5186
	ret ; 23:5189

PlayAnimatedObjectations: ; 8d189
	push hl ; 23:518a
	push de ; 23:518b
	push bc ; 23:518c
	push af ; 23:518d

	ld a, $0 ; 23:518e
	ld [$c5bd], a ; 23:5190
	call DoNextFrameForAllSprites ; 23:5193

	pop af ; 23:5196
	pop bc ; 23:5197
	pop de ; 23:5198
	pop hl ; 23:5199
	ret ; 23:519a

DoNextFrameForAllSprites: ; 8d19b
	ld hl, $c51c ; 23:519b
	ld e, $a ; 23:519e
.loop
	ld a, [hl] ; 23:51a0
	and a ; 23:51a1
	jr z, .skip_capacity_check ; 23:51a2
	ld c, l ; 23:51a4
	ld b, h ; 23:51a5
	push hl ; 23:51a6
	push de ; 23:51a7
	call DoAnimFrame ; 23:51a8
	call UpdateAnimFrame ; 23:51ab
	pop de ; 23:51ae
	pop hl ; 23:51af
	jr c, .cancel ; 23:51b0
.skip_capacity_check
	ld bc, $10 ; 23:51b2
	add hl, bc ; 23:51b5
	dec e ; 23:51b6
	jr nz, .loop ; 23:51b7
	ld a, [$c5bd] ; 23:51b9
	ld l, a ; 23:51bc
	ld h, $c3 ; 23:51bd
.loop2
	ld a, l ; 23:51bf
	cp $a0 ; 23:51c0
	jr nc, .cancel ; 23:51c2
	xor a ; 23:51c4
	ld [hli], a ; 23:51c5
	jr .loop2 ; 23:51c6

.cancel
	ret ; 23:51c8

DoNextFrameForFirst16Sprites: ; 8d1c9
	ld hl, $c51c ; 23:51c9
	ld e, $a ; 23:51cc
.loop
	ld a, [hl] ; 23:51ce
	and a ; 23:51cf
	jr z, .skip_capacity_check ; 23:51d0
	ld c, l ; 23:51d2
	ld b, h ; 23:51d3
	push hl ; 23:51d4
	push de ; 23:51d5
	call DoAnimFrame ; 23:51d6
	call UpdateAnimFrame ; 23:51d9
	pop de ; 23:51dc
	pop hl ; 23:51dd
	jr c, .cancel ; 23:51de
.skip_capacity_check
	ld bc, $10 ; 23:51e0
	add hl, bc ; 23:51e3
	dec e ; 23:51e4
	jr nz, .loop ; 23:51e5
	ld a, [$c5bd] ; 23:51e7
	ld l, a ; 23:51ea
	ld h, $c3 ; 23:51eb
.loop2
	ld a, l ; 23:51ed
	cp $40 ; 23:51ee
	jr nc, .cancel ; 23:51f0
	xor a ; 23:51f2
	ld [hli], a ; 23:51f3
	jr .loop2 ; 23:51f4

.cancel
	ret ; 23:51f6

_InitSpriteAnimStruct:: ; 8d1f7
	push de ; 23:51f7
	push af ; 23:51f8
	ld hl, $c51c ; 23:51f9
	ld e, $a ; 23:51fc
.loop
	ld a, [hl] ; 23:51fe
	and a ; 23:51ff
	jr z, .found ; 23:5200
	ld bc, $10 ; 23:5202
	add hl, bc ; 23:5205
	dec e ; 23:5206
	jr nz, .loop ; 23:5207
	pop af ; 23:5209
	pop de ; 23:520a
	scf ; 23:520b
	ret ; 23:520c

.found ; 8d20d
	ld c, l ; 23:520d
	ld b, h ; 23:520e
	ld hl, $c5bc ; 23:520f
	inc [hl] ; 23:5212
	ld a, [hl] ; 23:5213
	and a ; 23:5214
	jr nz, .initialized ; 23:5215
	inc [hl] ; 23:5217
.initialized
	pop af ; 23:5218
	ld e, a ; 23:5219
	ld d, $0 ; 23:521a
	ld hl, AnimatedObjectSeqData ; 23:521c
	add hl, de ; 23:521f
	add hl, de ; 23:5220
	add hl, de ; 23:5221
	ld e, l ; 23:5222
	ld d, h ; 23:5223
	ld hl, $0 ; 23:5224
	add hl, bc ; 23:5227
	ld a, [$c5bc] ; 23:5228
	ld [hli], a ; 23:522b
	ld a, [de] ; 23:522c
	ld [hli], a ; 23:522d
	inc de ; 23:522e
	ld a, [de] ; 23:522f
	ld [hli], a ; 23:5230
	inc de ; 23:5231
	ld a, [de] ; 23:5232
	call GetAnimatedObjectVTile ; 23:5233
	ld [hli], a ; 23:5236
	pop de ; 23:5237
	ld hl, $4 ; 23:5238
	add hl, bc ; 23:523b
	ld a, e ; 23:523c
	ld [hli], a ; 23:523d
	ld a, d ; 23:523e
	ld [hli], a ; 23:523f
	xor a ; 23:5240
	ld [hli], a ; 23:5241
	ld [hli], a ; 23:5242
	xor a ; 23:5243
	ld [hli], a ; 23:5244
	ld [hli], a ; 23:5245
	dec a ; 23:5246
	ld [hli], a ; 23:5247
	xor a ; 23:5248
	ld [hli], a ; 23:5249
	ld [hli], a ; 23:524a
	ld [hli], a ; 23:524b
	ld [hli], a ; 23:524c
	ld [hl], a ; 23:524d
	ld a, c ; 23:524e
	ld [$c5c0], a ; 23:524f
	ld a, b ; 23:5252
	ld [$c5c1], a ; 23:5253
	ret ; 23:5256

DeinitializeSprite: ; 8d257
	ld hl, $0 ; 23:5257
	add hl, bc ; 23:525a
	ld [hl], $0 ; 23:525b
	ret ; 23:525d

UpdateAnimFrame: ; 8d25e
	call InitAnimatedObjectBuffer ; 23:525e
	call GetAnimatedObjectFrame ; 23:5261
	cp $fd ; 23:5264
	jr z, .done ; 23:5266
	cp $fc ; 23:5268
	jr z, .delete ; 23:526a
	call GetFrameOAMPointer ; 23:526c
	ld a, [$c5c2] ; 23:526f
	add [hl] ; 23:5272
	ld [$c5c2], a ; 23:5273
	inc hl ; 23:5276
	ld a, [hli] ; 23:5277
	ld h, [hl] ; 23:5278
	ld l, a ; 23:5279
	push bc ; 23:527a
	ld a, [$c5bd] ; 23:527b
	ld e, a ; 23:527e
	ld d, $c3 ; 23:527f
	ld a, [hli] ; 23:5281
	ld c, a ; 23:5282
.loop
	ld a, [$c5c4] ; 23:5283
	ld b, a ; 23:5286
	ld a, [$c5c6] ; 23:5287
	add b ; 23:528a
	ld b, a ; 23:528b
	ld a, [$c5c7] ; 23:528c
	add b ; 23:528f
	ld b, a ; 23:5290
	call AddOrSubtractX ; 23:5291
	add b ; 23:5294
	ld [de], a ; 23:5295
	inc hl ; 23:5296
	inc de ; 23:5297
	ld a, [$c5c3] ; 23:5298
	ld b, a ; 23:529b
	ld a, [$c5c5] ; 23:529c
	add b ; 23:529f
	ld b, a ; 23:52a0
	ld a, [$c5c8] ; 23:52a1
	add b ; 23:52a4
	ld b, a ; 23:52a5
	call AddOrSubtractY ; 23:52a6
	add b ; 23:52a9
	ld [de], a ; 23:52aa
	inc hl ; 23:52ab
	inc de ; 23:52ac
	ld a, [$c5c2] ; 23:52ad
	add [hl] ; 23:52b0
	ld [de], a ; 23:52b1
	inc hl ; 23:52b2
	inc de ; 23:52b3
	call GetSpriteOAMAttr ; 23:52b4
	ld [de], a ; 23:52b7
	inc hl ; 23:52b8
	inc de ; 23:52b9
	ld a, e ; 23:52ba
	ld [$c5bd], a ; 23:52bb
	cp $a0 ; 23:52be
	jr nc, reached_the_end ; 23:52c0
	dec c ; 23:52c2
	jr nz, .loop ; 23:52c3
	pop bc ; 23:52c5
	jr .done ; 23:52c6

.delete
	call DeinitializeSprite ; 23:52c8
.done
	and a ; 23:52cb
	ret ; 23:52cc

reached_the_end
	pop bc ; 23:52cd
	scf ; 23:52ce
	ret ; 23:52cf

AddOrSubtractX: ; 8d2d0
	push hl ; 23:52d0
	ld a, [hl] ; 23:52d1
	ld hl, $c5c0 ; 23:52d2
	bit 6, [hl] ; 23:52d5
	jr z, .ok ; 23:52d7
	add a, $8 ; 23:52d9
	xor $ff ; 23:52db
	inc a ; 23:52dd
.ok
	pop hl ; 23:52de
	ret ; 23:52df

AddOrSubtractY: ; 8d2e0
	push hl ; 23:52e0
	ld a, [hl] ; 23:52e1
	ld hl, $c5c0 ; 23:52e2
	bit 5, [hl] ; 23:52e5
	jr z, .ok ; 23:52e7
	add a, $8 ; 23:52e9
	xor $ff ; 23:52eb
	inc a ; 23:52ed
.ok
	pop hl ; 23:52ee
	ret ; 23:52ef

GetSpriteOAMAttr: ; 8d2f0
	ld a, [$c5c0] ; 23:52f0
	ld b, a ; 23:52f3
	ld a, [hl] ; 23:52f4
	xor b ; 23:52f5
	and $e0 ; 23:52f6
	ld b, a ; 23:52f8
	ld a, [hl] ; 23:52f9
	and $1f ; 23:52fa
	or b ; 23:52fc
	ret ; 23:52fd

InitAnimatedObjectBuffer: ; 8d2fe
	xor a ; 23:52fe
	ld [$c5c0], a ; 23:52ff
	ld hl, $3 ; 23:5302
	add hl, bc ; 23:5305
	ld a, [hli] ; 23:5306
	ld [$c5c2], a ; 23:5307
	ld a, [hli] ; 23:530a
	ld [$c5c3], a ; 23:530b
	ld a, [hli] ; 23:530e
	ld [$c5c4], a ; 23:530f
	ld a, [hli] ; 23:5312
	ld [$c5c5], a ; 23:5313
	ld a, [hli] ; 23:5316
	ld [$c5c6], a ; 23:5317
	ret ; 23:531a

GetAnimatedObjectVTile: ; 8d31b
	push hl ; 23:531b
	push bc ; 23:531c
	ld hl, $c508 ; 23:531d
	ld b, a ; 23:5320
	ld c, $a ; 23:5321
.loop
	ld a, [hli] ; 23:5323
	cp b ; 23:5324
	jr z, .ok ; 23:5325
	inc hl ; 23:5327
	dec c ; 23:5328
	jr nz, .loop ; 23:5329
	xor a ; 23:532b
	jr .done ; 23:532c

.ok
	ld a, [hl] ; 23:532e
.done
	pop bc ; 23:532f
	pop hl ; 23:5330
	ret ; 23:5331

Function8d332: ; 8d332
	ld hl, $1 ; 23:5332
	add hl, bc ; 23:5335
	ld [hl], a ; 23:5336
	ld hl, $8 ; 23:5337
	add hl, bc ; 23:533a
	ld [hl], $0 ; 23:533b
	ld hl, $a ; 23:533d
	add hl, bc ; 23:5340
	ld [hl], $ff ; 23:5341
	ret ; 23:5343

GetAnimatedObjectFrame: ; 8d344
.loop
	ld hl, $8 ; 23:5344
	add hl, bc ; 23:5347
	ld a, [hl] ; 23:5348
	and a ; 23:5349
	jr z, .next_frame ; 23:534a
	dec [hl] ; 23:534c
	call .GetPointer ; 23:534d
	ld a, [hli] ; 23:5350
	push af ; 23:5351
	jr .okay ; 23:5352

.next_frame
	ld hl, $a ; 23:5354
	add hl, bc ; 23:5357
	inc [hl] ; 23:5358
	call .GetPointer ; 23:5359
	ld a, [hli] ; 23:535c
	cp $fe ; 23:535d
	jr z, .restart ; 23:535f
	cp $ff ; 23:5361
	jr z, .repeat_last ; 23:5363
	push af ; 23:5365
	ld a, [hl] ; 23:5366
	push hl ; 23:5367
	and $3f ; 23:5368
	ld hl, $9 ; 23:536a
	add hl, bc ; 23:536d
	add [hl] ; 23:536e
	ld hl, $8 ; 23:536f
	add hl, bc ; 23:5372
	ld [hl], a ; 23:5373
	pop hl ; 23:5374
.okay
	ld a, [hl] ; 23:5375
	and $c0 ; 23:5376
	srl a ; 23:5378
	ld [$c5c0], a ; 23:537a
	pop af ; 23:537d
	ret ; 23:537e

.repeat_last ; 8d37f
	xor a ; 23:537f
	ld hl, $8 ; 23:5380
	add hl, bc ; 23:5383
	ld [hl], a ; 23:5384
	ld hl, $a ; 23:5385
	add hl, bc ; 23:5388
	dec [hl] ; 23:5389
	dec [hl] ; 23:538a
	jr .loop ; 23:538b

.restart
	xor a ; 23:538d
	ld hl, $8 ; 23:538e
	add hl, bc ; 23:5391
	ld [hl], a ; 23:5392
	dec a ; 23:5393
	ld hl, $a ; 23:5394
	add hl, bc ; 23:5397
	ld [hl], a ; 23:5398
	jr .loop ; 23:5399

.GetPointer
	ld hl, $1 ; 23:539b
	add hl, bc ; 23:539e
	ld e, [hl] ; 23:539f
	ld d, $0 ; 23:53a0
	ld hl, AnimatedObjectFrameData ; 23:53a2
	add hl, de ; 23:53a5
	add hl, de ; 23:53a6
	ld e, [hl] ; 23:53a7
	inc hl ; 23:53a8
	ld d, [hl] ; 23:53a9
	ld hl, $a ; 23:53aa
	add hl, bc ; 23:53ad
	ld l, [hl] ; 23:53ae
	ld h, $0 ; 23:53af
	add hl, hl ; 23:53b1
	add hl, de ; 23:53b2
	ret ; 23:53b3

GetFrameOAMPointer: ; 8d3b4
	ld e, a ; 23:53b4
	ld d, $0 ; 23:53b5
	ld hl, AnimatedObjectOAMData ; 23:53b7
	add hl, de ; 23:53ba
	add hl, de ; 23:53bb
	add hl, de ; 23:53bc
	ret ; 23:53bd

BrokenGetStdGraphics: ; 8d3be
	push hl ; 23:53be
	ld l, a ; 23:53bf
	ld h, $0 ; 23:53c0
	add hl, hl ; 23:53c2
	add hl, hl ; 23:53c3
	ld de, $6666 ; 23:53c4
	add hl, de ; 23:53c7
	ld c, [hl] ; 23:53c8
	inc hl ; 23:53c9
	ld b, [hl] ; 23:53ca
	inc hl ; 23:53cb
	ld e, [hl] ; 23:53cc
	inc hl ; 23:53cd
	ld d, [hl] ; 23:53ce
	pop hl ; 23:53cf
	push bc ; 23:53d0
	call $dfe ; Request2bpp ; 23:53d1
	pop bc ; 23:53d4
	ret ; 23:53d5

AnimatedObjectSeqData: ; 8d3d6
	db $01, $01, $00
	db $04, $04, $00
	db $05, $05, $00
	db $06, $06, $00
	db $07, $07, $00
	db $08, $08, $00
	db $09, $09, $01
	db $0a, $09, $01
	db $0b, $0a, $01
	db $0d, $0b, $01
	db $10, $0c, $01
	db $12, $0d, $02
	db $13, $0e, $02
	db $14, $0f, $02
	db $15, $0e, $02
	db $16, $10, $00
	db $0d, $11, $01
	db $10, $12, $01
	db $09, $13, $01
	db $0b, $14, $01
	db $1a, $15, $05
	db $1c, $16, $06
	db $1d, $17, $06
	db $1e, $18, $06
	db $1f, $19, $07
	db $20, $1a, $07
	db $22, $1b, $07
	db $1a, $1c, $05
	db $23, $00, $00
	db $24, $1d, $08
	db $24, $1e, $08
	db $24, $1f, $08
	db $25, $20, $00
	db $27, $00, $00
	db $28, $21, $00
	db $29, $22, $00
	db $2a, $22, $00
	db $2b, $23, $00
	db $2c, $24, $00
	db $2d, $00, $00
	db $2f, $25, $00
	db $30, $00, $00
	db $2f, $27, $00
	db $31, $00, $00
	db $36, $29, $00
	db $37, $00, $00
	db $32, $23, $00

INCLUDE "engine/sprite_anims.asm"
INCLUDE "data/sprite_engine.asm"

Sprites_Cosine:
	add a, $10 ; 23:668a
Sprites_Sine:
	and $3f ; 23:668c
	cp $20 ; 23:668e
	jr nc, .negative ; 23:6690
	call .ApplySineWave ; 23:6692
	ld a, h ; 23:6695
	ret ; 23:6696

.negative
	and $1f ; 23:6697
	call .ApplySineWave ; 23:6699
	ld a, h ; 23:669c
	xor $ff ; 23:669d
	inc a ; 23:669f
	ret ; 23:66a0

.ApplySineWave:
	ld e, a ; 23:66a1
	ld a, d ; 23:66a2
	ld d, $0 ; 23:66a3
	ld hl, .sinewave ; 23:66a5
	add hl, de ; 23:66a8
	add hl, de ; 23:66a9
	ld e, [hl] ; 23:66aa
	inc hl ; 23:66ab
	ld d, [hl] ; 23:66ac
	ld hl, $0 ; 23:66ad
.multiply
	srl a ; 23:66b0
	jr nc, .even ; 23:66b2
	add hl, de ; 23:66b4
.even
	sla e ; 23:66b5
	rl d ; 23:66b7
	and a ; 23:66b9
	jr nz, .multiply ; 23:66ba
	ret ; 23:66bc

.sinewave ; 8e75d
	sine_wave $100

AnimateEndOfExpBar:
	ldh a, [$ffe9] ; 23:66fd
	ld de, EndOfExpBarGFX ; 23:66ff
	and a ; 23:6702
	jr z, .got_gfx ; 23:6703
	ld de, SGBEndOfExpBarGFX ; 23:6705
.got_gfx
	ld hl, VTiles0 tile $00 ; 23:6708
	lb bc, BANK(EndOfExpBarGFX), 1 ; 23:670b
	call $dfe ; Request2bpp ; 23:670e
	ld c, $8 ; 23:6711
	ld d, $0 ; 23:6713
.loop
	push bc ; 23:6715
	call .AnimateFrame ; 23:6716
	call $32e ; DelayFrame ; 23:6719
	pop bc ; 23:671c
	inc d ; 23:671d
	inc d ; 23:671e
	dec c ; 23:671f
	jr nz, .loop ; 23:6720
	call $30ff ; ClearSprites ; 23:6722
	ret ; 23:6725

.AnimateFrame
	ld hl, $c300 ; 23:6726
	ld c, $8 ; 23:6729
.anim_loop
	ld a, c ; 23:672b
	and a ; 23:672c
	ret z ; 23:672d
	dec c ; 23:672e
	ld a, c ; 23:672f
	sla a ; 23:6730
	sla a ; 23:6732
	sla a ; 23:6734
	push af ; 23:6736
	push de ; 23:6737
	push hl ; 23:6738
	call Sprites_Sine ; 23:6739
	pop hl ; 23:673c
	pop de ; 23:673d
	add a, $68 ; 23:673e
	ld [hli], a ; 23:6740
	pop af ; 23:6741
	push de ; 23:6742
	push hl ; 23:6743
	call Sprites_Cosine ; 23:6744
	pop hl ; 23:6747
	pop de ; 23:6748
	add a, $54 ; 23:6749
	ld [hli], a ; 23:674b
	ld a, $0 ; 23:674c
	ld [hli], a ; 23:674e
	ld a, $6 ; 23:674f
	ld [hli], a ; 23:6751
	jr .anim_loop ; 23:6752

EndOfExpBarGFX:
	dr $8e754, $8e764

SGBEndOfExpBarGFX:
	dr $8e764, $8e774

ClearAnimatedObjects2
	push hl ; 23:6774
	push de ; 23:6775
	push bc ; 23:6776
	push af ; 23:6777
	ld hl, $c508 ; 23:6778
	ld bc, $c1 ; 23:677b
.loop
	ld [hl], $0 ; 23:677e
	inc hl ; 23:6780
	dec bc ; 23:6781
	ld a, c ; 23:6782
	or b ; 23:6783
	jr nz, .loop ; 23:6784
	pop af ; 23:6786
	pop bc ; 23:6787
	pop de ; 23:6788
	pop hl ; 23:6789
	ret ; 23:678a
; 8e78a