;-----------------------------------
; intro.txt
;
; Load and run introduction.
;
; Introduction is text.
; Two GP float down the screen.
; Wait for player to press 1.
;
; intro_load_tiles - load tiles for the introduction
; intro_load_palette - load color palette #1
; intro_load_palette2 - load color palette #2
; intro_load_palette3 - load color palette #3
; intro_load_sprites - load sprites for introduction
; intro_load_background - load background for introduction
; intro_run - runt the introduction. Wait for user to press 1
; intro_move_GP1_down - Move game police #1 down 
; intro_move_GP2_down - Move game police #2 down 
; intro_move_GP1_up - Move game police #1 up 
; intro_move_GP2_up - Move game police #2 up 
;-----------------------------------

;-------------------------------
; intro_load_tiles
;
intro_load_tiles:
   PUSH BC                     ; Save registers
   PUSH DE                     ;
   PUSH HL                     ;
   PUSH AF                     ;

   LD a, $FF                   ; Low address byte
   OUT (VDP_ADDR),a            ;
   LD a, $18                   ; High address byte
   OUT (VDP_ADDR),a            ;

   LD hl, bnbw_text_tiles      ; Load text
   LD de, 36*32                ;
   CALL copy_to_vdp_loop_long  ;

   LD a, $1F                   ; Low address byte
   OUT (VDP_ADDR),a            ;
   LD a, $00                   ; High address byte
   OUT (VDP_ADDR),a            ;

   LD hl, bnbw_GP_tiles        ; Load game police
   LD de, 21*32                ;
   CALL copy_to_vdp_loop_long  ;

   POP AF                      ; Restore registers
   POP HL                      ;
   POP DE                      ;
   POP BC                      ;
   RET                         ; End subroutine

;-----------------------------------
; intro_load_palette
;
intro_load_palette:
   PUSH BC                     ; Save registers
   PUSH DE                     ;
   PUSH HL                     ;
   PUSH AF                     ;

   LD a, $00                   ; Low address byte
   OUT (VDP_ADDR),a            ;
   LD a, $C0                   ; High address byte
   OUT (VDP_ADDR),a            ;

   LD hl, intro_colors         ; Load game police
   LD b, 32                    ; 32 bytes for color
   CALL copy_to_vdp_loop       ;

   POP AF                      ; Restore registers
   POP HL                      ;
   POP DE                      ;
   POP BC                      ;
   RET                         ; End subroutine

;-----------------------------------
; intro_load_palette2
;
intro_load_palette2:
   PUSH BC                     ; Save registers
   PUSH DE                     ;
   PUSH HL                     ;
   PUSH AF                     ;

   LD a, $00                   ; Low address byte
   OUT (VDP_ADDR),a            ;
   LD a, $C0                   ; High address byte
   OUT (VDP_ADDR),a            ;

   LD hl, intro_colors2        ; Load game police
   LD b, 32                    ; 32 bytes for color
   CALL copy_to_vdp_loop       ;

   POP AF                      ; Restore registers
   POP HL                      ;
   POP DE                      ;
   POP BC                      ;
   RET                         ; End subroutine
   
;-----------------------------------
; intro_load_palette3
;
intro_load_palette3:
   PUSH BC                     ; Save registers
   PUSH DE                     ;
   PUSH HL                     ;
   PUSH AF                     ;

   LD a, $00                   ; Low address byte
   OUT (VDP_ADDR),a            ;
   LD a, $C0                   ; High address byte
   OUT (VDP_ADDR),a            ;

   LD hl, intro_colors3        ; Load game police
   LD b, 32                    ; 32 bytes for color
   CALL copy_to_vdp_loop       ;

   POP AF                      ; Restore registers
   POP HL                      ;
   POP DE                      ;
   POP BC                      ;
   RET                         ; End subroutine
   
;------------------------------------
; intro_load_sprites (to RAM)
;
intro_load_sprites:
   PUSH BC                     ; Save registers
   PUSH DE                     ;
   PUSH HL                     ;
   PUSH AF                     ;

   LD hl, intro_sprites_vpos   ; Load vpos
   LD de, RAM_VPOS             ;
   LD b, 43                    ; 
   CALL copy_to_RAM_loop       ;

   LD hl, intro_sprites_hpos   ; Load vpos
   LD de, RAM_HPOS             ;
   LD b, 85                    ; 
   CALL copy_to_RAM_loop       ;

   POP AF                      ; Restore registers
   POP HL                      ;
   POP DE                      ;
   POP BC                      ;
   RET                         ; End subroutine

;------------------------------------
; intro_load_background (to RAM)
;
intro_load_background:
   PUSH BC                     ; Save registers
   PUSH DE                     ;
   PUSH HL                     ;
   PUSH AF                     ;

   LD a, $3F                   ; Low address byte
   OUT (VDP_ADDR),a            ;
   LD a, $38                   ; High address byte
   OUT (VDP_ADDR),a            ;

   LD hl, intro_bg             ; Load text
   LD de, 17*64                ;
   CALL copy_to_vdp_loop_long  ;

   POP AF                      ; Restore registers
   POP HL                      ;
   POP DE                      ;
   POP BC                      ;
   RET                         ; End subroutine

;-----------------------------------
; intro_run
;
intro_run:
   PUSH BC                       ; Save registers
   PUSH DE                       ;
   PUSH HL                       ;
   PUSH AF                       ;

; Move GP down. 
   CALL intro_move_GP1_down      ;
   CALL intro_move_GP2_down      ;

; Go to next screen if button is pressed.
   IN a, (PORT_INPUT1)           ;
   BIT 4, a                      ; Look for button 1
   JP NZ, ir_all_done            ;

   LD a, (RAM_CONTROLLER_1_PREV) ;
   BIT 4, a                      ; Look for button 1
   JP Z, ir_all_done             ;

   LD hl, RAM_GAME_STATE         ; Load title screen       
   INC (hl)                      ;
   IN a, (PORT_INPUT1)           ;
   LD (RAM_CONTROLLER_1_PREV), a ;

ir_all_done:
   POP AF                        ; Restore registers
   POP HL                        ;
   POP DE                        ;
   POP BC                        ;
   RET                           ; End subroutine

;------------------------------------
; intro_move_GP1_down
;
intro_move_GP1_down:
   PUSH BC                     ; Save registers
   PUSH DE                     ;
   PUSH HL                     ;
   PUSH AF                     ;

   LD hl, RAM_VPOS             ;
   LD b, 21                    ;

imGP1d_loop:
   INC (hl)                    ;
   INC hl                      ;
   DEC b                       ;
   JP NZ,imGP1d_loop           ;

; Avoid $D0!   
   LD a, (RAM_VPOS + 20)       ;   
   CP $D0                      ; Avoid! SMS stops writing sprites at delimiter.
   JP NZ, imGP1d_end           ;
   
   LD a, $D1                   ; Skip over delimiter
   LD hl, RAM_VPOS             ;
   LD b, 7                     ;

imGP1d_loop2:   
   LD (hl), a                  ; Skip over delimiter
   INC hl                      ;
   LD (hl), a                  ;
   INC hl                      ;
   LD (hl), a                  ;
   INC hl                      ;
   ADD a, 8                    ;
   DEC b                       ;
   JP NZ, imGP1d_loop2         ;

imGP1d_end:   
   POP AF                      ; Restore registers
   POP HL                      ;
   POP DE                      ;
   POP BC                      ;
   RET                         ; End subroutine

;------------------------------------
; intro_move_GP2_down
;
intro_move_GP2_down:
   PUSH BC                     ; Save registers
   PUSH DE                     ;
   PUSH HL                     ;
   PUSH AF                     ;

; Go down    
   LD hl, RAM_VPOS + 21        ;
   LD b, 21                    ;

imGP2d_loop:
   INC (hl)                    ;
   INC hl                      ;
   DEC b                       ;
   JP NZ,imGP2d_loop           ;

; Avoid $D0!   
   LD a, (RAM_VPOS + 41)       ;   
   CP $D0                      ; Avoid! SMS stops writing sprites at delimiter.
   JP NZ, imGP2d_end           ;
   
   LD a, $D1                   ; Skip over delimiter
   LD hl, RAM_VPOS + 21        ;
   LD b, 7                     ;

imGP2d_loop2:   
   LD (hl), a                  ; Skip over delimiter
   INC hl                      ;
   LD (hl), a                  ;
   INC hl                      ;
   LD (hl), a                  ;
   INC hl                      ;
   ADD a, 8                    ;
   DEC b                       ;
   JP NZ, imGP2d_loop2         ;
   
imGP2d_end:   
   POP AF                      ; Restore registers
   POP HL                      ;
   POP DE                      ;
   POP BC                      ;
   RET                         ; End subroutine

;------------------------------------
; intro_move_GP1_up
;
intro_move_GP1_up:
   PUSH BC                     ; Save registers
   PUSH DE                     ;
   PUSH HL                     ;
   PUSH AF                     ;
; Go up or down?
   LD a, (RAM_FOE_STATE_1)     ;
   CP 0                        ; Down
   JP Z, imGP1001              ;
   CP $7F                      ; Up
   JP Z, imGP1002              ; 
   
; Go down 
imGP1001:   
   LD hl, RAM_VPOS             ;
   LD b, 21                    ;

imGP1d_loopuu0:
   INC (hl)                    ;
   INC hl                      ;
   DEC b                       ;
   JP NZ,imGP1d_loopuu0        ;

   LD a, (RAM_VPOS + 20)       ;
   CP $CF                      ;
   JP NZ, imGP1d_enduu         ;

   LD a, $7F                   ;
   LD (RAM_FOE_STATE_1), a     ;
   
   JP imGP1d_enduu             ; End 
      
; Go up 
imGP1002:   
   LD hl, RAM_VPOS             ;
   LD b, 21                    ;

imGP1d_loopuu1:
   DEC (hl)                    ;
   INC hl                      ;
   DEC b                       ;
   JP NZ,imGP1d_loopuu1        ;
   
   LD a, (RAM_VPOS)            ;
   CP 0                        ;
   JP NZ, imGP1d_enduu         ;

   LD a, $00                   ;
   LD (RAM_FOE_STATE_1), a     ;
   
imGP1d_enduu:   
   POP AF                      ; Restore registers
   POP HL                      ;
   POP DE                      ;
   POP BC                      ;
   RET                         ; End subroutine  
   
;------------------------------------
; intro_move_GP2_up
;
intro_move_GP2_up:
   PUSH BC                     ; Save registers
   PUSH DE                     ;
   PUSH HL                     ;
   PUSH AF                     ;
; Go up or down?
   LD a, (RAM_FOE_STATE_2)     ;
   CP 0                        ; Down
   JP Z, imGP2001              ;
   CP $7F                      ; Up
   JP Z, imGP2002              ; 
   
; Go down 
imGP2001:   
   LD hl, RAM_VPOS + 21        ;
   LD b, 21                    ;

imGP2d_loopuu0:
   INC (hl)                    ;
   INC hl                      ;
   DEC b                       ;
   JP NZ,imGP2d_loopuu0        ;

   LD a, (RAM_VPOS + 41)       ;
   CP $CF                      ;
   JP NZ, imGP2d_enduu         ;

   LD a, $7F                   ;
   LD (RAM_FOE_STATE_2), a     ;
   
   JP imGP2d_enduu             ; End 
      
; Go up 
imGP2002:   
   LD hl, RAM_VPOS + 21        ;
   LD b, 21                    ;

imGP2d_loopuu1:
   DEC (hl)                    ;
   INC hl                      ;
   DEC b                       ;
   JP NZ,imGP2d_loopuu1        ;
   
   LD a, (RAM_VPOS + 21)       ;
   CP 0                        ;
   JP NZ, imGP2d_enduu         ;

   LD a, $00                   ;
   LD (RAM_FOE_STATE_2), a     ;
   
imGP2d_enduu:   
   POP AF                      ; Restore registers
   POP HL                      ;
   POP DE                      ;
   POP BC                      ;
   RET                         ; End subroutine   