Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pret
GitHub Repository: pret/pokered
Path: blob/master/macros/scripts/events.asm
1271 views
1
;\1 = event index
2
;\2 = return result in carry instead of zero flag
3
MACRO CheckEvent
4
DEF event_byte = ((\1) / 8)
5
ld a, [wEventFlags + event_byte]
6
7
IF _NARG > 1
8
IF ((\1) % 8) == 7
9
add a
10
ELSE
11
REPT ((\1) % 8) + 1
12
rrca
13
ENDR
14
ENDC
15
ELSE
16
bit (\1) % 8, a
17
ENDC
18
ENDM
19
20
21
;\1 = event index
22
MACRO CheckEventReuseA
23
IF event_byte != ((\1) / 8)
24
DEF event_byte = ((\1) / 8)
25
ld a, [wEventFlags + event_byte]
26
ENDC
27
28
bit (\1) % 8, a
29
ENDM
30
31
32
;\1 = event index
33
;\2 = event index of the last event used before the branch
34
MACRO CheckEventAfterBranchReuseA
35
DEF event_byte = ((\2) / 8)
36
IF event_byte != ((\1) / 8)
37
DEF event_byte = ((\1) / 8)
38
ld a, [wEventFlags + event_byte]
39
ENDC
40
41
bit (\1) % 8, a
42
ENDM
43
44
45
;\1 = reg
46
;\2 = event index
47
;\3 = event index this event is relative to (optional, this is needed when there is a fixed flag address)
48
MACRO EventFlagBit
49
IF _NARG > 2
50
ld \1, ((\3) % 8) + ((\2) - (\3))
51
ELSE
52
ld \1, (\2) % 8
53
ENDC
54
ENDM
55
56
57
;\1 = reg
58
;\2 = event index
59
MACRO EventFlagAddress
60
DEF event_byte = ((\2) / 8)
61
ld \1, wEventFlags + event_byte
62
ENDM
63
64
65
;\1 = event index
66
MACRO CheckEventHL
67
DEF event_byte = ((\1) / 8)
68
ld hl, wEventFlags + event_byte
69
bit (\1) % 8, [hl]
70
ENDM
71
72
73
;\1 = event index
74
MACRO CheckEventReuseHL
75
IF event_byte != ((\1) / 8)
76
DEF event_byte = ((\1) / 8)
77
ld hl, wEventFlags + event_byte
78
ENDC
79
80
bit (\1) % 8, [hl]
81
ENDM
82
83
84
; dangerous, only use when HL is guaranteed to be the desired value
85
;\1 = event index
86
MACRO CheckEventForceReuseHL
87
DEF event_byte = ((\1) / 8)
88
bit (\1) % 8, [hl]
89
ENDM
90
91
92
;\1 = event index
93
;\2 = event index of the last event used before the branch
94
MACRO CheckEventAfterBranchReuseHL
95
DEF event_byte = ((\2) / 8)
96
IF event_byte != ((\1) / 8)
97
DEF event_byte = ((\1) / 8)
98
ld hl, wEventFlags + event_byte
99
ENDC
100
101
bit (\1) % 8, [hl]
102
ENDM
103
104
105
;\1 = event index
106
MACRO CheckAndSetEvent
107
DEF event_byte = ((\1) / 8)
108
ld hl, wEventFlags + event_byte
109
bit (\1) % 8, [hl]
110
set (\1) % 8, [hl]
111
ENDM
112
113
114
;\1 = event index
115
MACRO CheckAndResetEvent
116
DEF event_byte = ((\1) / 8)
117
ld hl, wEventFlags + event_byte
118
bit (\1) % 8, [hl]
119
res (\1) % 8, [hl]
120
ENDM
121
122
123
;\1 = event index
124
MACRO CheckAndSetEventA
125
ld a, [wEventFlags + ((\1) / 8)]
126
bit (\1) % 8, a
127
set (\1) % 8, a
128
ld [wEventFlags + ((\1) / 8)], a
129
ENDM
130
131
132
;\1 = event index
133
MACRO CheckAndResetEventA
134
ld a, [wEventFlags + ((\1) / 8)]
135
bit (\1) % 8, a
136
res (\1) % 8, a
137
ld [wEventFlags + ((\1) / 8)], a
138
ENDM
139
140
141
;\1 = event index
142
MACRO SetEvent
143
DEF event_byte = ((\1) / 8)
144
ld hl, wEventFlags + event_byte
145
set (\1) % 8, [hl]
146
ENDM
147
148
149
;\1 = event index
150
MACRO SetEventReuseHL
151
IF event_byte != ((\1) / 8)
152
DEF event_byte = ((\1) / 8)
153
ld hl, wEventFlags + event_byte
154
ENDC
155
156
set (\1) % 8, [hl]
157
ENDM
158
159
160
;\1 = event index
161
;\2 = event index of the last event used before the branch
162
MACRO SetEventAfterBranchReuseHL
163
DEF event_byte = ((\2) / 8)
164
IF event_byte != ((\1) / 8)
165
DEF event_byte = ((\1) / 8)
166
ld hl, wEventFlags + event_byte
167
ENDC
168
169
set (\1) % 8, [hl]
170
ENDM
171
172
173
; dangerous, only use when HL is guaranteed to be the desired value
174
;\1 = event index
175
MACRO SetEventForceReuseHL
176
DEF event_byte = ((\1) / 8)
177
set (\1) % 8, [hl]
178
ENDM
179
180
181
;\1 = event index
182
;\2 = event index
183
;\3, \4, ... = additional (optional) event indices
184
MACRO SetEvents
185
SetEvent \1
186
REPT _NARG - 1
187
SetEventReuseHL \2
188
SHIFT
189
ENDR
190
ENDM
191
192
193
;\1 = event index
194
MACRO ResetEvent
195
DEF event_byte = ((\1) / 8)
196
ld hl, wEventFlags + event_byte
197
res (\1) % 8, [hl]
198
ENDM
199
200
201
;\1 = event index
202
MACRO ResetEventReuseHL
203
IF event_byte != ((\1) / 8)
204
DEF event_byte = ((\1) / 8)
205
ld hl, wEventFlags + event_byte
206
ENDC
207
208
res (\1) % 8, [hl]
209
ENDM
210
211
212
;\1 = event index
213
;\2 = event index of the last event used before the branch
214
MACRO ResetEventAfterBranchReuseHL
215
DEF event_byte = ((\2) / 8)
216
IF event_byte != ((\1) / 8)
217
DEF event_byte = ((\1) / 8)
218
ld hl, wEventFlags + event_byte
219
ENDC
220
221
res (\1) % 8, [hl]
222
ENDM
223
224
225
; dangerous, only use when HL is guaranteed to be the desired value
226
;\1 = event index
227
MACRO ResetEventForceReuseHL
228
DEF event_byte = ((\1) / 8)
229
res (\1) % 8, [hl]
230
ENDM
231
232
233
;\1 = event index
234
;\2 = event index
235
;\3 = event index (optional)
236
MACRO ResetEvents
237
ResetEvent \1
238
REPT _NARG - 1
239
ResetEventReuseHL \2
240
SHIFT
241
ENDR
242
ENDM
243
244
245
;\1 = start
246
;\2 = end
247
MACRO SetEventRange
248
DEF event_start_byte = ((\1) / 8)
249
DEF event_end_byte = ((\2) / 8)
250
251
IF event_end_byte < event_start_byte
252
FAIL "Incorrect argument order in SetEventRange."
253
ENDC
254
255
IF event_start_byte == event_end_byte
256
ld a, [wEventFlags + event_start_byte]
257
or (1 << (((\2) % 8) + 1)) - (1 << ((\1) % 8))
258
ld [wEventFlags + event_start_byte], a
259
ELSE
260
DEF event_fill_start = event_start_byte + 1
261
DEF event_fill_count = event_end_byte - event_start_byte - 1
262
263
IF ((\1) % 8) == 0
264
DEF event_fill_start -= 1
265
DEF event_fill_count += 1
266
ELSE
267
ld a, [wEventFlags + event_start_byte]
268
or $ff - ((1 << ((\1) % 8)) - 1)
269
ld [wEventFlags + event_start_byte], a
270
ENDC
271
272
IF ((\2) % 8) == 7
273
DEF event_fill_count += 1
274
ENDC
275
276
IF event_fill_count == 1
277
ld hl, wEventFlags + event_fill_start
278
ld [hl], $ff
279
ENDC
280
281
IF event_fill_count > 1
282
ld a, $ff
283
ld hl, wEventFlags + event_fill_start
284
285
REPT event_fill_count - 1
286
ld [hli], a
287
ENDR
288
289
ld [hl], a
290
ENDC
291
292
IF ((\2) % 8) == 0
293
ld hl, wEventFlags + event_end_byte
294
set 0, [hl]
295
ELSE
296
IF ((\2) % 8) != 7
297
ld a, [wEventFlags + event_end_byte]
298
or (1 << (((\2) % 8) + 1)) - 1
299
ld [wEventFlags + event_end_byte], a
300
ENDC
301
ENDC
302
ENDC
303
ENDM
304
305
306
;\1 = start
307
;\2 = end
308
;\3 = assume a is 0 if present
309
MACRO ResetEventRange
310
DEF event_start_byte = ((\1) / 8)
311
DEF event_end_byte = ((\2) / 8)
312
313
IF event_end_byte < event_start_byte
314
FAIL "Incorrect argument order in ResetEventRange."
315
ENDC
316
317
IF event_start_byte == event_end_byte
318
ld a, [wEventFlags + event_start_byte]
319
and ~((1 << (((\2) % 8) + 1)) - (1 << ((\1) % 8))) & $ff
320
ld [wEventFlags + event_start_byte], a
321
ELSE
322
DEF event_fill_start = event_start_byte + 1
323
DEF event_fill_count = event_end_byte - event_start_byte - 1
324
325
IF ((\1) % 8) == 0
326
DEF event_fill_start -= 1
327
DEF event_fill_count += 1
328
ELSE
329
ld a, [wEventFlags + event_start_byte]
330
and ~($ff - ((1 << ((\1) % 8)) - 1)) & $ff
331
ld [wEventFlags + event_start_byte], a
332
ENDC
333
334
IF ((\2) % 8) == 7
335
DEF event_fill_count += 1
336
ENDC
337
338
IF event_fill_count == 1
339
ld hl, wEventFlags + event_fill_start
340
ld [hl], 0
341
ENDC
342
343
IF event_fill_count > 1
344
ld hl, wEventFlags + event_fill_start
345
346
; force xor a if we just to wrote to it above
347
IF (_NARG < 3) || (((\1) % 8) != 0)
348
xor a
349
ENDC
350
351
REPT event_fill_count - 1
352
ld [hli], a
353
ENDR
354
355
ld [hl], a
356
ENDC
357
358
IF ((\2) % 8) == 0
359
ld hl, wEventFlags + event_end_byte
360
res 0, [hl]
361
ELSE
362
IF ((\2) % 8) != 7
363
ld a, [wEventFlags + event_end_byte]
364
and ~((1 << (((\2) % 8) + 1)) - 1) & $ff
365
ld [wEventFlags + event_end_byte], a
366
ENDC
367
ENDC
368
ENDC
369
ENDM
370
371
372
; returns whether both events are set in Z flag
373
; This is counter-intuitive because the other event checks set the Z flag when
374
; the event is not set, but this sets the Z flag when the event is set.
375
;\1 = event index 1
376
;\2 = event index 2
377
;\3 = try to reuse a (optional)
378
MACRO CheckBothEventsSet
379
IF ((\1) / 8) == ((\2) / 8)
380
IF (_NARG < 3) || (((\1) / 8) != event_byte)
381
DEF event_byte = ((\1) / 8)
382
ld a, [wEventFlags + ((\1) / 8)]
383
ENDC
384
and (1 << ((\1) % 8)) | (1 << ((\2) % 8))
385
cp (1 << ((\1) % 8)) | (1 << ((\2) % 8))
386
ELSE
387
; This case doesn't happen in the original ROM.
388
IF ((\1) % 8) == ((\2) % 8)
389
push hl
390
ld a, [wEventFlags + ((\1) / 8)]
391
ld hl, wEventFlags + ((\2) / 8)
392
and [hl]
393
cpl
394
bit ((\1) % 8), a
395
pop hl
396
ELSE
397
push bc
398
ld a, [wEventFlags + ((\1) / 8)]
399
and (1 << ((\1) % 8))
400
ld b, a
401
ld a, [wEventFlags + ((\2) / 8)]
402
and (1 << ((\2) % 8))
403
or b
404
cp (1 << ((\1) % 8)) | (1 << ((\2) % 8))
405
pop bc
406
ENDC
407
ENDC
408
ENDM
409
410
411
; returns the complement of whether either event is set in Z flag
412
;\1 = event index 1
413
;\2 = event index 2
414
;\3 = try to reuse a (optional)
415
MACRO CheckEitherEventSet
416
IF ((\1) / 8) == ((\2) / 8)
417
IF (_NARG < 3) || (((\1) / 8) != event_byte)
418
DEF event_byte = ((\1) / 8)
419
ld a, [wEventFlags + ((\1) / 8)]
420
ENDC
421
and (1 << ((\1) % 8)) | (1 << ((\2) % 8))
422
ELSE
423
; This case doesn't happen in the original ROM.
424
IF ((\1) % 8) == ((\2) % 8)
425
push hl
426
ld a, [wEventFlags + ((\1) / 8)]
427
ld hl, wEventFlags + ((\2) / 8)
428
or [hl]
429
bit ((\1) % 8), a
430
pop hl
431
ELSE
432
push bc
433
ld a, [wEventFlags + ((\1) / 8)]
434
and (1 << ((\1) % 8))
435
ld b, a
436
ld a, [wEventFlags + ((\2) / 8)]
437
and (1 << ((\2) % 8))
438
or b
439
pop bc
440
ENDC
441
ENDC
442
ENDM
443
444
445
; for handling fixed event bits when events are inserted/removed
446
;\1 = event index
447
;\2 = fixed flag bit
448
MACRO AdjustEventBit
449
IF ((\1) % 8) != (\2)
450
add ((\1) % 8) - (\2)
451
ENDC
452
ENDM
453
454