dos33fsprogs/demos/second/irq_wait.s

95 lines
1.7 KiB
ArmAsm

;============================
; wait for music pattern
; also check for keypress
;============================
; pattern # in A
wait_for_pattern:
cmp current_pattern_smc+1
bcc done_check_pattern_done ; blt
beq done_check_pattern_done ; ble
lda KEYPRESS
bpl done_check_pattern_notdone
bit KEYRESET
jmp done_check_pattern_done
;============================
; setup timeout of A seconds
;============================
setup_timeout:
sta SECOND_COUNTDOWN
lda #0
sta IRQ_COUNTDOWN
rts
;===========================
; countodown second timeout
; also check for keypress
;===========================
; carry set = done
check_timeout:
; check keyboard first
lda KEYPRESS
bpl timeout_not_keypress
bit KEYRESET
; lda #0 ; reset, is this necessary?
; sta IRQ_COUNTDOWN
; sta SECOND_COUNTDOWN
jmp done_check_timeout_done
timeout_not_keypress:
lda IRQ_COUNTDOWN
bne done_check_timeout_notdone
irq_countdown_zero:
lda SECOND_COUNTDOWN
beq done_check_timeout_done
; otherwise we need to decrement and update
dec SECOND_COUNTDOWN
lda #50
sta IRQ_COUNTDOWN
done_check_pattern_notdone:
done_check_timeout_notdone:
clc
rts
done_check_pattern_done:
done_check_timeout_done:
sec
rts
;==========================
; busy wait A * 1 50Hz tick
;==========================
wait_ticks:
sta IRQ_COUNTDOWN
wait_tick_loop:
lda IRQ_COUNTDOWN
bne wait_tick_loop
wait_tick_done:
rts
;====================
; busy wait A seconds
;====================
; exit early if key pressed
wait_seconds:
tax
wait_seconds_loop:
lda #50 ; wait 1s
jsr wait_ticks
lda KEYPRESS
bmi wait_seconds_done
dex
bpl wait_seconds_loop
wait_seconds_done:
bit KEYRESET
rts