-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdelay.asm
64 lines (57 loc) · 1.3 KB
/
delay.asm
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
; this sub routine handles delayed updates
; inputs:
; delay_timer -> set how many frames an animation will take
; delay_update -> function pointer
; delay_done -> function pointer
; returns:
; a = 1 if animation just finished AND update should be skipped
; note that this has to be set by the update done handler
update_delay:
lda delay_timer
ora delay_timer+1
beq @done ; if animation timer is 0 we are done
; -1 16 bit sub
sec
sbc #$01
sta delay_timer
lda delay_timer+1
sbc #$00
sta delay_timer+1
; if it is 0 now we call done function
lda delay_timer
ora delay_timer+1
bne @not_done
lda delay_done
sta src_ptr
lda delay_done+1
sta src_ptr+1
jsr jsr_indirect
rts
@not_done:
; otherwise call update routine
lda delay_update
sta src_ptr
lda delay_update+1
sta src_ptr+1
jsr jsr_indirect
@done:
lda #$00
rts
; this sub routine aborts a delay timer
; calling delay_done
; and setting the remaining time to 0
abort_delay:
; don't do anything if timer is already 0
lda delay_timer
ora delay_timer+1
beq @no_abort
lda #$00
sta delay_timer
sta delay_timer+1
lda delay_done
sta src_ptr
lda delay_done+1
sta src_ptr+1
jsr jsr_indirect
@no_abort:
rts