;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Copyright (c) 2002 TIMEX Corporation.
; 
; This document is the property of, and contains information proprietary to
; TIMEX Corporation.  It is to be returned upon request.  Reproduction by any
; means, disclosure, or use of its contents for other than the expressed
; purpose for which it is loaned, without the written consent of TIMEX
; Corporation, is strictly prohibited.
;
; File Name    : demodef.asm
; Purpose      : Demo Application Default State Manager
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Module Name : demoDefaultStateManager
; Description : Demo Application Default State Manager.
; Assumptions : None
; Input(s)    : None
; Output(s)   : None
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

        IF @DEF('SUBROUTINE')
            UNDEF SUBROUTINE
        ENDIF
        DEFINE  SUBROUTINE      "'demoDefaultStateManager'"

        GLOBAL  demoDefaultStateManager

demoDefaultStateManager:

                ld      A, [CORECurrentEvent]

                ; Check if timeout done event.
                cp      A, #DEMO_TIMEOUTDONE
                jr      Z, demoDefaultStateTimeoutDoneEvent

                ; Check if state entry event.
                cp      A, #DEMO_STATEENTRY
                jr      Z, demoDefaultStateStateEntryEvent

                ; Check if start/split depress event.
                cp      A, #DEMO_STARTSPLITDEPRESS
                jr      Z, demoDefaultStateStartSplitDepressEvent

                ; Check if stop/reset depress event.
                cp      A, #DEMO_STOPRESETDEPRESS
                jr      Z, demoDefaultStateStopResetDepressEvent

                ; Check if mode depress event.
                cp      A, #DEMO_MODEDEPRESS
                jr      Z, demoDefaultStateModeDepressEvent

                ; Check if crown set event.
                cp      A, #DEMO_CROWNSET
                jr      NZ, demoDefaultStateExit

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ; CROWN SET
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
            
                ld      B, #DEMOSETSTATE
                CORE_REQ_STATE_CHANGE

demoDefaultStateExit:

                ret


demoDefaultStateStateEntryEvent:

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ; STATE ENTRY
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                ; disable any events generated by the CW and CCW mechanism
                CORE_ALLOW_KEYS (bCOREModeSwitch|bCOREStopResetSwitch|bCOREStartSplitSwitch)

                ; Suspend ring event.  Not used in this state.
                ;CORE_SUSPEND_RING_EVENTS

                ; enable events to be passed whenever a seconds data is detected
                ld      A,  [COREPTZIndex]
                KTOD_ENABLE_DISP_UPD_SEC_EVENT

                ; always set DEMOScreenIndex to the first screen
                ld      L, #0
                ld      [DEMOScreenIndex], L


                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ; Common screen display
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

demoCommonScreenDisplay:

                ; turn off LCD drive module to reduce power consumption
                LCD_DRIVE_OFF
                ;or      [BR:@LOW(OutPortR1)], #bR14

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ; Check to clear the display
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                ld      L, [DEMOScreenIndex]
                ld      IX, #demoClearDisplayList
                ld      A, [IX + L]
                cp      A, #0
                jr      Z, demoClearScreenNotRequired

                cp      A, #1
                jr      NZ, demoClearScreenSelection1

                ; the new screen to be displayed requires a clear screen
                LCD_CLR_DISPLAY
                jr      demoClearScreenNotRequired

demoClearScreenSelection1:

                cp      A, #2
                jr      NZ, demoClearScreenSelection2

                ; the new screen to be displayed requires a clear screen
                LCD_CLEAR_MAIN_DM
                ;jr     demoClearScreenNotRequired

demoClearScreenSelection2:
demoClearScreenNotRequired:


                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ; display the required screen
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                car     demoDisplayScreen



                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ; determine the timeout duration required
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                ld      L, [DEMOScreenIndex]
                ld      IX, #demoTimeoutRequired
                ld      A, [IX + L]
                ld      [DEMOSecondCounter], A

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ; increment display the required screen
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                ld      A, [DEMOScreenIndex]
                inc     A
                cp      A, #(demoClearDisplayListEnd - demoClearDisplayList)
                jr      C, demoScreenIndexOkay
                ld      A, #0

demoScreenIndexOkay:
                ld      [DEMOScreenIndex], A
                ret


demoDefaultStateStartSplitDepressEvent:
demoDefaultStateStopResetDepressEvent:

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ; START/SPLIT DEPRESS
                ; STOP/RESET DEPRESS
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                jr      demoCommonScreenDisplay


demoDefaultStateModeDepressEvent:

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ; MODE DEPRESS
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                CORE_REQ_MODE_CHANGE_NEXT
                ret


demoDefaultStateTimeoutDoneEvent:

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ; TIMEOUT DONE
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                ld      HL, #DEMOSecondCounter
                dec     [HL]
                jr      Z, demoCommonScreenDisplay
                ret
