4cade/src/ui.wait.a
2020-04-01 11:57:21 -04:00

97 lines
3.2 KiB
Plaintext

;License:MIT
;(c) 2018-2020 by 4am
;
; UI functions for doing things then waiting, or waiting then doing things
;
; - ExecuteTransitionAt6000AndWait
; - ExecuteTransitionAt6400AndWait
; - ExecuteTransitionAtA000AndWait
; - ExecuteTransitionAndWait
; - WaitForKeyFor30Seconds
; - CoverFade
ExecuteTransitionAt6000AndWait
ldy #$60
+HIDE_NEXT_2_BYTES
ExecuteTransitionAt6400AndWait
ldy #$64
+HIDE_NEXT_2_BYTES
ExecuteTransitionAtA000AndWait
ldy #$A0
; /!\ execution falls through here to ExecuteTransitionAndWait
;------------------------------------------------------------------------------
; ExecuteTransitionAndWait
; call transition effect code (address passed in) and wait a period of time
; or until the user presses a key
;
; in: A/Y = address of transition effect code
; out: all flags and registers clobbered
;------------------------------------------------------------------------------
ExecuteTransitionAndWait
lda #0
+ST16 @j+1
@j jsr $FDFD ; SMC call transition effect code
ldx #$20 ; picture is showing so now we wait
- lda #0
jsr WaitForKeyWithTimeout
bmi +
dex
bpl -
+ lda KBD
cmp #$95
bne WAITRTS
bit CLEARKBD
WAITRTS rts
;------------------------------------------------------------------------------
; WaitForKeyFor30Seconds
; does what it says on the tin
;
; in: none
; out: if user presses a key before the timer runs out, exits with A = key
; and X/Y preserved
; otherwise exits via MegaAttractMode and everything is clobbered
;------------------------------------------------------------------------------
WaitForKeyFor30Seconds
lda #$16 ; initialize timeout counters
sta Timeout
sta Timeout+1
sta Timeout+2
@loop
lda KBD
bmi WAITRTS
inc RNDSEED+1 ; these are only ever incremented, never
bne + ; reset (may be used as a pseudorandom
inc RNDSEED ; seed)
+
dec Timeout
bne @loop
dec Timeout+1
bne @loop
dec Timeout+2
bne @loop
; /!\ execution falls through here to CoverFade
;------------------------------------------------------------------------------
; CoverFade
; load cover file and execute a specific transition effect on it
;
; in: none
; out: exits via MegaAttractMode and everything is clobbered
;------------------------------------------------------------------------------
CoverFade
jsr ForceHGRMode
jsr LoadCoverOffscreen
jsr ShowOtherPage
lda OffscreenPage
beq CoverFade
jsr LoadFile ; load transition effect code at $6000
!word kFXDirectory
!word kCoverFadeFile
!word $6000
jsr $6000 ; call transition effect
jmp MegaAttractMode ; exit via mega attract mode
!if (RELBASE != $2000) and (>WaitForKeyFor30Seconds != >*) {
!error "WaitForKeyFor30Seconds crossed a page (", WaitForKeyFor30Seconds, " to ", *
}