;License:MIT ;(c) 2018-2020 by 4am ; ; UI functions for doing things then waiting, or waiting then doing things ; ; - ExecuteTransitionAt6000AndWait ; - ExecuteTransitionAtA000AndWait ; - ExecuteTransitionAndWait ; - WaitForKeyFor30Seconds ; - CoverFade ExecuteTransitionAt6000AndWait ldy #$60 +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 sta WRITEMAINMEM ; several transition effects exit with ; auxmem writeable so we reset it here 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 LoadIndexedFile ; load transition effect code at $6000 !word $6000 !word kCoverFadeRecord jsr $6000 ; call transition effect jmp MegaAttractMode ; exit via mega attract mode !if (RELBASE != $2000) and (>WaitForKeyFor30Seconds != >*) { !error "WaitForKeyFor30Seconds crossed a page (", WaitForKeyFor30Seconds, " to ", * }