;-----------------------------------
; title_screen.txt
;
; Load and run title screen.
;
; Bread runs during the introduction.
; Segmented scrolling is enabled.
; Handle a small menu.
;
; title_screen_load - load the title screen
; title_load_menu00 - initialize menu sprites
; title_load_menu0 - "START", start at 1-1
; title_load_menu1 - difficulty
; title_load_menu2 - "CONTINUE", start at last level you died at 
; tile_run_menu - run the menu, up and down scroll through menu options
; title_start_game - "START" is selected
; title_continue_game - "CONTINUE" is selected
; title_difficulty - difficulty is changed
; title_scroll - use segmented scrolling to only scroll bottom part of screen
; title_segmented_scroll - use segmented scrolling to only scroll bottom part of screen
; title_make_bread_run - make the sprites on the screen run
;-----------------------------------

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

   CALL VDP_off                ; Screen off

; Load tiles
   LD a, $BF                   ; Low address byte
   OUT (VDP_ADDR),a            ;
   LD a, $02                   ; High address byte
   OUT (VDP_ADDR),a            ;

   LD hl, bnbw_bread_tiles     ; Load bread character
   LD de, 108*32               ;
   CALL copy_to_vdp_loop_long  ;

   LD hl, chickens_eggs_tiles  ; Load chickens and eggs
   LD de, 4*32                 ;
   CALL copy_to_vdp_loop_long  ;

   LD hl, level_1_bg_tiles2    ; Load level background tiles
   LD de, 12*32                ;
   CALL copy_to_vdp_loop_long  ;
   
   LD a, $7F                   ; Low address byte
   OUT (VDP_ADDR),a            ;
   LD a, $1D                   ; High address byte
   OUT (VDP_ADDR),a            ;

   LD hl, level_1_bg_tiles     ; Load level background tiles
   LD de, 32*32                ;
   CALL copy_to_vdp_loop_long  ;

   LD hl, title_bg_tiles       ; Load title screen background tiles
   LD de, 84*32                ;
   CALL copy_to_vdp_loop_long  ;

   LD hl, level_1_bg_tiles2    ; Load level background tiles
   LD de, 12*32                ;
   CALL copy_to_vdp_loop_long  ;
   
; Load background
   LD a, $FF                   ; Low address byte
   OUT (VDP_ADDR),a            ;
   LD a, $37                   ; High address byte
   OUT (VDP_ADDR),a            ;

   LD hl, title_background     ; Load title screen
   LD de, 24*64                ;
   CALL copy_to_vdp_loop_long  ;   
   
; Load top score
   LD a, $57                   ; Low address byte
   OUT (VDP_ADDR),a            ;
   LD a, $38                   ; High address byte
   OUT (VDP_ADDR),a            ;  
   LD a, (RAM_TOP_SCORE_4)     ;
   ADD a, 226                  ;
   OUT (VDP_DATA), a           ;
   LD a, 0                     ;
   OUT (VDP_DATA), a           ;    
   LD a, (RAM_TOP_SCORE_3)     ;
   ADD a, 226                  ;
   OUT (VDP_DATA), a           ;
   LD a, 0                     ;
   OUT (VDP_DATA), a           ;  
   LD a, (RAM_TOP_SCORE_2)     ;
   ADD a, 226                  ;
   OUT (VDP_DATA), a           ;
   LD a, 0                     ;
   OUT (VDP_DATA), a           ; 
   LD a, (RAM_TOP_SCORE_1)     ;
   ADD a, 226                  ;
   OUT (VDP_DATA), a           ;
   LD a, 0                     ;
   OUT (VDP_DATA), a           ; 
   LD a, (RAM_TOP_SCORE_0)     ;
   ADD a, 226                  ;
   OUT (VDP_DATA), a           ;
   LD a, 0                     ;
   OUT (VDP_DATA), a           ; 
   
; Load most recent score
   LD a, $71                   ; Low address byte
   OUT (VDP_ADDR),a            ;
   LD a, $38                   ; High address byte
   OUT (VDP_ADDR),a            ;    
   LD a, (RAM_SCORE_4)         ;
   ADD a, 226                  ;  
   OUT (VDP_DATA), a           ;
   LD a, 0                     ;
   OUT (VDP_DATA), a           ;    
   LD a, (RAM_SCORE_3)         ;
   ADD a, 226                  ;  
   OUT (VDP_DATA), a           ;
   LD a, 0                     ;
   OUT (VDP_DATA), a           ; 
   LD a, (RAM_SCORE_2)         ;
   ADD a, 226                  ;  
   OUT (VDP_DATA), a           ;
   LD a, 0                     ;
   OUT (VDP_DATA), a           ; 
   LD a, (RAM_SCORE_1)         ;
   ADD a, 226                  ;  
   OUT (VDP_DATA), a           ;
   LD a, 0                     ;
   OUT (VDP_DATA), a           ; 
   LD a, (RAM_SCORE_0)         ;
   ADD a, 226                  ;  
   OUT (VDP_DATA), a           ;
   LD a, 0                     ;
   OUT (VDP_DATA), a           ; 
   
   CALL sound_title_start_sfx  ; Title screen music
   
; Increment game state
   LD hl, RAM_GAME_STATE       ; Run title screen       
   INC (hl)                    ;   

; Load sprites
   CALL title_load_menu00      ;

; Correct colors 
   CALL intro_load_palette     ;
   
   CALL VDP_on                 ; Screen on

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


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

   LD hl, title_sp_vpos        ; Load vpos
   LD de, RAM_VPOS             ;
   LD b, 9 + 12                ; 
   CALL copy_to_RAM_loop       ;

   LD hl, title_sp_hpos0       ; Load vpos
   LD de, RAM_HPOS             ;
   LD b, 17 + 24               ; 
   CALL copy_to_RAM_loop       ;   

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

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

   LD hl, title_sp_hpos0       ; Load hpos
   LD de, RAM_HPOS             ;
   LD b, 16                    ; 
   CALL copy_to_RAM_loop       ;   

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

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

   LD a, (RAM_DIFFICULTY)      ;
   CP 16                       ;
   JP NZ, tlm1_skip1           ; 
   LD hl, title_sp_hpos1       ; Load hpos EASY
   JP tlm1_skip3               ;
   
tlm1_skip1:
   CP 32                       ;     
   JP NZ, tlm1_skip2           ;    
   LD hl, title_sp_hpos1a      ; Load hpos HARDER
   JP tlm1_skip3               ;  
   
tlm1_skip2:
   LD hl, title_sp_hpos1b      ; Load hpos BAD IDEA  

tlm1_skip3:   
   LD de, RAM_HPOS             ;
   LD b, 16                    ; 
   CALL copy_to_RAM_loop       ;   

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

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

   LD hl, title_sp_hpos2       ; Load hpos
   LD de, RAM_HPOS             ;
   LD b, 16                    ; 
   CALL copy_to_RAM_loop       ;   

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

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

   CALL title_make_bread_run   ; Make Bread run

; Change display
   LD a, (RAM_MENU_STATE)      ; Display based on state
   AND $03                     ;
   CP 0                        ;
   CALL Z, title_load_menu0    ; START
   CP 1                        ;
   CALL Z, title_load_menu1    ; SOUND
   CP 2                        ;
   CALL Z, title_load_menu2    ; CONTINUE
   CP 3                        ;
   CALL Z, title_load_menu1    ; SOUND

; Scroll through menu options
   LD a, (RAM_CONTROLLER_1_PREV) ;
   BIT 0, a                    ; No previous U  
   JP Z, tr_skip0              ;  

   IN a, (PORT_INPUT1)         ;
   BIT 0, a                    ; Look for Up
   JP NZ, tr_skip0             ;

   LD hl, RAM_MENU_STATE       ; Change menu state      
   DEC (hl)                    ;
   CALL sound_select_sfx       ;
   
tr_skip0:
   LD a, (RAM_CONTROLLER_1_PREV) ;
   BIT 1, a                    ; No previous D  
   JP Z, tr_skip1              ;  

   IN a, (PORT_INPUT1)         ;
   BIT 1, a                    ; Look for Down
   JP NZ, tr_skip1             ;

   LD hl, RAM_MENU_STATE       ; Change menu state      
   INC (hl)                    ;
   CALL sound_select_sfx       ;
   
   IN a, (PORT_INPUT1)           ;
   LD (RAM_CONTROLLER_1_PREV), a ;

tr_skip1:
; Check for selection
   LD a, (RAM_CONTROLLER_1_PREV) ;
   BIT 4, a                    ; No previous 1
   JP Z, tr_skip2              ; 

   IN a, (PORT_INPUT1)         ;
   BIT 4, a                    ; Look for 1
   JP NZ, tr_skip2             ;

   LD a, (RAM_MENU_STATE)      ; Display based on state
   AND $03                     ;
   CP 0                        ;
   CALL Z, title_start_game    ; START 

   LD a, (RAM_MENU_STATE)      ; Display based on state
   AND $01                     ;
   CP 1                        ;
   CALL Z, title_difficulty    ; EASY HARD PAIN
   
   LD a, (RAM_MENU_STATE)      ; Display based on state
   AND $03                     ;
   CP 2                        ;
   CALL Z, title_continue_game ; CONTINUE 
   
tr_skip2:
   POP AF                      ; Restore registers
   POP HL                      ;
   POP DE                      ;
   POP BC                      ;
   RET                         ; End subroutine

;------------------------------------
; title_start_game
; 
title_start_game:
   PUSH BC                     ; Save registers
   PUSH DE                     ;
   PUSH HL                     ;
   PUSH AF                     ;
   
   LD hl, RAM_GAME_STATE       ; Load level 1       
   INC (hl)                    ;
   CALL reset_scroll           ; Fix scrolling

   IN a, (PORT_INPUT1)           ; Prevent from going to 
   LD (RAM_CONTROLLER_1_PREV), a ; next transition immediately
	  
	  
   LD a, 3                     ; Set number of lives
   LD (RAM_LIVES), a           ;
   LD a, 0                     ; Reset score
   LD (RAM_SCORE_0), a         ;
   LD (RAM_SCORE_1), a         ;
   LD (RAM_SCORE_2), a         ;
   LD (RAM_SCORE_3), a         ;
   LD (RAM_SCORE_4), a         ;
   LD (RAM_SCROLL_CTR), a      ; Scroll
   LD a, 1                     ; Set level
   LD (RAM_LEVEL_A), a         ;
   LD (RAM_LEVEL_B), a         ;
   LD hl, $3801                ; Address of column to write to
   LD (RAM_COLUMN_ADDR), hl    ; 2 bytes
   LD a, 20*8                  ; Initial floor table value
   LD b, 32                    ;
   LD hl, RAM_FLOOR_TABLE      ; 
initft_0:
   LD (hl), a                  ; Initialize floor table
   INC hl                      ;
   DEC b                       ;
   JP NZ, initft_0             ;
   LD a, 5                     ; Initial player column (0-31)
   LD (RAM_PLAYER_X_COLUMN), a ; Player X-coordinate (sprite 53)    
   
   POP AF                      ; Restore registers
   POP HL                      ;
   POP DE                      ;
   POP BC                      ;
   RET                         ; End subroutine

;------------------------------------
; title_continue_game
; 
title_continue_game:
   PUSH BC                     ; Save registers
   PUSH DE                     ;
   PUSH HL                     ;
   PUSH AF                     ;
   
   LD hl, RAM_GAME_STATE       ; Load level 1       
   INC (hl)                    ;
   CALL reset_scroll           ; Fix scrolling

   IN a, (PORT_INPUT1)           ; Prevent from going to 
   LD (RAM_CONTROLLER_1_PREV), a ; next transition immediately
  
   LD a, 3                     ; Set number of lives
   LD (RAM_LIVES), a           ;
   LD a, 0                     ; Reset score
   LD (RAM_SCORE_0), a         ;
   LD (RAM_SCORE_1), a         ;
   LD (RAM_SCORE_2), a         ;
   LD (RAM_SCORE_3), a         ;
   LD (RAM_SCORE_4), a         ;
   LD (RAM_SCROLL_CTR), a      ; Scroll

; Do NOT set level - continue
   
   LD hl, $3801                ; Address of column to write to
   LD (RAM_COLUMN_ADDR), hl    ; 2 bytes
   LD a, 20*8                  ; Initial floor table value
   LD b, 32                    ;
   LD hl, RAM_FLOOR_TABLE      ; 
initft_03:
   LD (hl), a                  ; Initialize floor table
   INC hl                      ;
   DEC b                       ;
   JP NZ, initft_03            ;
   LD a, 5                     ; Initial player column (0-31)
   LD (RAM_PLAYER_X_COLUMN), a ; Player X-coordinate (sprite 53)    
   
   POP AF                      ; Restore registers
   POP HL                      ;
   POP DE                      ;
   POP BC                      ;
   RET                         ; End subroutine

;--------------------------------
; title_difficulty
;   
title_difficulty:   
   PUSH BC                     ; Save registers
   PUSH DE                     ;
   PUSH HL                     ;
   PUSH AF                     ;
   
   LD a, (RAM_DIFFICULTY)      ; 16 -> 32
   CP 16                       ;
   JP NZ, tdiff_next1          ;
   LD a, 32                    ;
   LD (RAM_DIFFICULTY), a      ;
   JP tdiff_end                ;
   
tdiff_next1:
   CP 32                       ; 32 -> 64
   JP NZ, tdiff_next2          ;
   LD a, 64                    ;
   LD (RAM_DIFFICULTY), a      ;
   JP tdiff_end                ;
   
tdiff_next2:
   LD a, 16                    ; 64 -> 16
   LD (RAM_DIFFICULTY), a      ;  
   
tdiff_end:   
   POP AF                      ; Restore registers
   POP HL                      ;
   POP DE                      ;
   POP BC                      ;
   RET                         ; End subroutine

   
;----------------------------------------
; title_scroll 
; 
;----------------------------------------
title_scroll:
   LD a, (RAM_SCROLL_CTR)     ; Load scroll counter
   INC a                      ;
   LD (RAM_SCROLL_CTR), a     ; Scroll

   OUT (VDP_ADDR),a           ; 
   LD a,$88                   ; R8 is horizontal scroll
   OUT (VDP_ADDR),a           ;

   RET                        ; End subroutine
;----------------------------------------

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

   IN a, (PORT_VLINE)          ; Read current scanline
   CP 15                       ; Stop scroll (16 - 1)
   CALL Z, reset_scroll        ;

   IN a, (PORT_VLINE)          ; Read current scanline
   CP 111                      ; ((16 * 7) - 1)
   CALL Z, title_scroll        ;

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

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

   LD a, (RAM_FRAME_CTR)       ;
   AND $18                     ;
   CP $08                      ;
   JP Z, tmbr_frame_1          ;
   CP $10                      ;
   JP Z, tmbr_frame_2          ;
   CP $18                      ;
   JP Z, tmbr_frame_1          ;
   
tmbr_frame_0:
   LD hl, title_run_frame_0    ; Load vpos 
   JP tmbr_go                  ;

tmbr_frame_1:
   LD hl, title_run_frame_1    ; Load vpos 
   JP tmbr_go                  ;

tmbr_frame_2:
   LD hl, title_run_frame_2    ; Load vpos 

tmbr_go:
   LD de, RAM_HPOS + 16        ;
   LD b, 24                    ; 
   CALL copy_to_RAM_loop       ;  

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







