;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; File Name    : invdef.asm
; Purpose      : Space Invaders Application Default State Manager
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;DO NOT MODIFY THE FOLLOWING SUBROUTINE DEFINITION;;;;;;;;;;;;;;;;;

                IF @DEF('SUBROUTINE')
                    UNDEF SUBROUTINE
                ENDIF
                DEFINE  SUBROUTINE      "'invdef'"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Module Name : invDefaultStateManager
; Description : Space Invaders Application Default State Manager.
; Assumptions : Display is cleared on first time entry into the state.
; Input(s)    : CORECurrentEvent  - system event to be processed
;               COREEventArgument - event extra information
; Output(s)   : None
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                GLOBAL  invDefaultStateManager

invDefaultStateManager:

                ld      A, [CORECurrentEvent]

                cp      A, #COREEVENT_DISPLAY_UPDATE_STPRES
                jr      Z, invBackgroundMovement

                ; Check if state entry event.
                cp      A, #INV_STATEENTRY
                jr      Z, invDefaultStateStateEntryEvent

                ; Check if mode depress event.
                cp      A, #INV_MODEDEPRESS
                jr      Z, invDefaultStateModeDepressEvent

                ; Check if crown set event.
                cp      A, #INV_CROWNSET
                jr      Z, invDefaultPulledCrownEvent

                cp      A, #COREEVENT_CW_EDGE_TRAILING
                jr      Z, invMoveShipRight

                cp      A, #COREEVENT_CCW_EDGE_TRAILING
                jr      Z, invMoveShipLeft

                cp      A, #COREEVENT_STARTSPLITDEPRESS
                jr      Z, invFireMissile

;                cp      A, #COREEVENT_STOPRESETDEPRESS
;                jr      Z, invTestAlienMissile

                ;TODO: Add more events detection here
                ;There are more events, add your own as needed

                ret


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;; EVENT HANDLERS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ; CROWN SET
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

invDefaultPulledCrownEvent:

                ld      B, #INVYOUROCKSETSTATE
                CORE_REQ_STATE_CHANGE
                ret


invDefaultStateModeDepressEvent:

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

                CORE_REQ_MODE_CHANGE_NEXT
                ret


invDefaultStateStateEntryEvent:

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

                LCD_SET_SCROLLING_CONTRAST
				CORE_SET_AUTORETURN

                ;display number of ship available/left
                ld      L, #DM5_S
                ld      IX, #LCDUPPERDMCOL1
                LCD_DISP_SMALL_PROP_WIDTH_DM_CHAR

                ld      HL, [CORECurrentASDAddress]
                add     HL, #INVSHIPAVAILABLEOFFSET
                ld      L, [HL]
                ld      IX, #LCDUPPERDMCOL9
                LCD_DISP_SMALL_PROP_WIDTH_DM_CHAR

                ; start our background timing generator
                ld      HL, [CORECurrentASDAddress]
                ld      A, [HL]
                KSTP_ENABLE_DISP_UPD_EVENT
                ret

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


            GLOBAL invBackgroundMovement
invBackgroundMovement:

                ld      HL, #INVDisplayStatus
                bit     [HL], #bINVShipState
                jr      NZ, invContinueWithBackgroundEvent1

                ; ship was hit, decrement number of ships
                ld      HL, [CORECurrentASDAddress]
                add     HL, #INVSHIPAVAILABLEOFFSET
                dec     [HL]

                ; ship was hit, so go to the state that handles the big blast
                ld      B, #INVSHIPHITSTATE
                CORE_REQ_STATE_CHANGE_NO_CLEAR_DISPLAY
                ret


invContinueWithBackgroundEvent1:

                ld      HL, #INVDisplayStatus
                bit     [HL], #(bINVAlien0State|bINVAlien1State|bINVAlien2State)
                jr      NZ, invContinueWithBackgroundEvent2

                ;destroyed all alien ships in the current wave
                ld      B, #INVVICTORYSTATE
                CORE_REQ_STATE_CHANGE_NO_CLEAR_DISPLAY
                ret



invContinueWithBackgroundEvent2:


                ;update new positions of the hero ship and alien ships
                car     invUpdatePositions

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ; display ship
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ld      HL, #INVDisplayStatus
                bit     [HL], #bINVShipState
                jr      Z, dispShipExit

                ld      IY, #INVShipPosX
                car     invDisplayShip

dispShipExit:

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ;display enemy 1
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                ld      HL, #INVDisplayStatus
                bit     [HL], #bINVAlien0State
                jr      Z, dispAlien0Exit

                ld      IY, #INVAlien0PosX
                car     invDisplayAlien

dispAlien0Exit:

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ;display enemy 2
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                ld      HL, #INVDisplayStatus
                bit     [HL], #bINVAlien1State
                jr      Z, dispAlien1Exit

                ld      IY, #INVAlien1PosX
                car     invDisplayAlien

dispAlien1Exit:

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ;display enemy 3
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                ld      HL, #INVDisplayStatus
                bit     [HL], #bINVAlien2State
                jr      Z, dispAlien2Exit

                ld      IY, #INVAlien2PosX
                car     invDisplayAlien

dispAlien2Exit:



                ; update missile positions
                car     invUpdateMissilePosition

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ;display ship missile
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                ld      HL, #INVDisplayStatus
                bit     [HL], #bINVShipMissleState
                jr      Z, dispMissileExit

                ld      IY, #INVShipMissilePosX
                car     invDisplayMissile

dispMissileExit:

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ;display alien missile 0
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                ld      HL, #INVDisplayStatus
                bit     [HL], #bINVAlienMissle0State
                jr      Z, dispAlienMissile0Exit

                ld      IY, #INVAlien0MissilePosX
                car     invDisplayMissile
                
dispAlienMissile0Exit:              

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ;display alien missile 1
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                ld      HL, #INVDisplayStatus
                bit     [HL], #bINVAlienMissle1State
                jr      Z, dispAlienMissile1Exit

                ld      IY, #INVAlien1MissilePosX
                car     invDisplayMissile
                
dispAlienMissile1Exit:              


                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ;display alien missile 2
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                ld      HL, #INVDisplayStatus
                bit     [HL], #bINVAlienMissle2State
                jr      Z, dispAlienMissile2Exit

                ld      IY, #INVAlien2MissilePosX
                car     invDisplayMissile
                
dispAlienMissile2Exit:              


                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ; Allow Alien 0 to fight back
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                ld      HL, #INVDisplayStatus
                bit     [HL], #bINVAlien0State
                jr      Z, invTestAlienMissile0NotAllowed
                bit     [HL], #bINVAlienMissle0State
                jr      NZ, invTestAlienMissile0NotAllowed

                car     invAllowMissileToFire
                jr      Z, invTestAlienMissile0NotAllowed

                ;setup missile start position
                ld      A, [INVAlien0PosX]
                inc     A
                ld      [INVAlien0MissilePosX], A
                ld      A, [INVAlien0PosY]
                inc     A
                inc     A
                ld      [INVAlien0MissilePosY], A

                ;activate alien missile -- FIRE AWAY
                or      [HL], #bINVAlienMissle0State

invTestAlienMissile0NotAllowed:



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ; Allow Alien 1 to fight back
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                ld      HL, #INVDisplayStatus
                bit     [HL], #bINVAlien1State
                jr      Z, invTestAlienMissile1NotAllowed
                bit     [HL], #bINVAlienMissle1State
                jr      NZ, invTestAlienMissile1NotAllowed

                car     invAllowMissileToFire
                jr      Z, invTestAlienMissile1NotAllowed

                ;setup missile start position
                ld      A, [INVAlien1PosX]
                inc     A
                ld      [INVAlien1MissilePosX], A
                ld      A, [INVAlien1PosY]
                inc     A
                inc     A
                ld      [INVAlien1MissilePosY], A

                ;activate alien missile -- FIRE AWAY
                or      [HL], #bINVAlienMissle1State

invTestAlienMissile1NotAllowed:


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ; Allow Alien 2 to fight back
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                ld      HL, #INVDisplayStatus
                bit     [HL], #bINVAlien2State
                jr      Z, invTestAlienMissile2NotAllowed
                bit     [HL], #bINVAlienMissle2State
                jr      NZ, invTestAlienMissile2NotAllowed

                car     invAllowMissileToFire
                jr      Z, invTestAlienMissile2NotAllowed

                ;setup missile start position
                ld      A, [INVAlien2PosX]
                inc     A
                ld      [INVAlien2MissilePosX], A
                ld      A, [INVAlien2PosY]
                inc     A
                inc     A
                ld      [INVAlien2MissilePosY], A

                ;activate alien missile -- FIRE AWAY
                or      [HL], #bINVAlienMissle2State

invTestAlienMissile2NotAllowed:


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



                ret



invAllowMissileToFire:

                CORE_GENERATE_RANDOM_NUMBER
                cp      A, #128
                bit     A, #1
                ret




                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

            GLOBAL invMoveShipLeft
invMoveShipLeft:

                ld      A, #0FFH
                ld      [INVShipDirection], A
                ret

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

            GLOBAL invMoveShipRight
invMoveShipRight:

                ld      A, #01H
                ld      [INVShipDirection], A
                ret


                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

            GLOBAL invFireMissile

invFireMissile:

                ld      HL, #INVDisplayStatus
                bit     [HL], #bINVShipMissleState
                jr      NZ, invFireMissleNotAllowed

                ;setup missile start position
                ld      A, [INVShipPosX]
                inc     A
                ld      [INVShipMissilePosX], A
                ld      A, #10
                ld      [INVShipMissilePosY], A

                ;activate missile -- FIRE AWAY
                or      [HL], #bINVShipMissleState

invFireMissleNotAllowed:

                ret



