;-----------------------------------
; ending.txt
;
; Show a simple ending after X-4.
; Show full ending after 4-4.
;-----------------------------------

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

   CALL VDP_off                ; Screen off
   
; Clear background   
   CALL clear_vram_bg_only     ; Clear background

; Load tiles   
   LD a, $7F                   ; Low address byte
   OUT (VDP_ADDR),a            ;
   LD a, $1D                   ; High address byte
   OUT (VDP_ADDR),a            ;

   LD hl, ending_1_tiles       ; Load computer room tiles
   LD de, 64*32                ;
   CALL copy_to_vdp_loop_long  ;  

   LD a, $BF                   ; Low address byte
   OUT (VDP_ADDR),a            ;
   LD a, $02                   ; High address byte
   OUT (VDP_ADDR),a            ;
   LD hl, bnbw_butter_tiles    ; Load butter character   
   LD de, 108*32               ;
   CALL copy_to_vdp_loop_long  ;    

   LD hl, bread_of_legend_tiles ; Load bread of legend
   LD de, 4*32                 ;
   CALL copy_to_vdp_loop_long  ;
   
; Load background
   LD a, $FF                   ; Low address byte
   OUT (VDP_ADDR),a            ;
   LD a, $3A                   ; High address byte
   OUT (VDP_ADDR),a            ;

   LD hl, computer_room_bg     ; Load computer room
   LD de, 8*64                 ;
   CALL copy_to_vdp_loop_long  ;  
   
; Clear sprite RAM, but not player data
   CALL ending_load_menu00     ; Reset sprites   

   CALL sound_ending_sfx       ; Ending music
   
; Correct colors 
   CALL intro_load_palette     ;
   
   LD a, 0                     ;
   LD (RAM_SHOCK_CTR), a       ; Clear shock counter
   
   LD hl, RAM_GAME_STATE       ;
   INC (hl)                    ; Go to next state

   CALL VDP_on                 ; Screen on
   
   POP AF                      ; Restore registers
   POP HL                      ;
   POP DE                      ;
   POP BC                      ;
   RET                         ; End subroutine  

;--------------------------------
; ending_run_002
;
ending_run_002:
   PUSH BC                     ; Save registers
   PUSH DE                     ;
   PUSH HL                     ;
   PUSH AF                     ;
 
   LD hl, RAM_SHOCK_CTR        ; Wait 3 seconds, 180 frames
   INC (hl)                    ;
   
   LD a, (hl)                  ;
   CP 180                      ;
   JP NZ, endrun_002_skip      ;
   
   LD a, 0                     ;
   LD (hl), a                  ; Clear shock counter
   LD hl, RAM_GAME_STATE       ;
   INC (hl)                    ; Go to next state   
   
endrun_002_skip:
   POP AF                      ; Restore registers
   POP HL                      ;
   POP DE                      ;
   POP BC                      ;
   RET                         ; End subroutine  

;--------------------------------
; ending_run_003
;
ending_run_003:
   PUSH BC                     ; Save registers
   PUSH DE                     ;
   PUSH HL                     ;
   PUSH AF                     ;
  
   LD hl, RAM_VPOS             ; Move bread of legend  
   DEC (hl)                    ;
   INC hl                      ;
   DEC (hl)                    ;
   INC hl                      ;
   DEC (hl)                    ;
   INC hl                      ;
   DEC (hl)                    ;
   INC hl                      ;
   
   LD a, $00                   ; Low address byte
   OUT (VDP_ADDR), a           ;
   LD a, $C0                   ; High address byte
   OUT (VDP_ADDR), a           ;
   LD a, (RAM_FRAME_CTR)       ;
   AND $3F                     ;
   OUT (VDP_DATA), a           ; Colors blink rapidly 
   
   LD hl, RAM_SHOCK_CTR        ; Wait 2 seconds, 120 frames
   INC (hl)                    ;
   
   LD a, (hl)                  ;
   CP 120                      ;
   JP NZ, endrun_003_skip      ;
   
   LD a, 0                     ;
   LD (hl), a                  ; Clear shock counter
   LD hl, RAM_GAME_STATE       ;
   INC (hl)                    ; Go to next state   
   
endrun_003_skip:
   POP AF                      ; Restore registers
   POP HL                      ;
   POP DE                      ;
   POP BC                      ;
   RET                         ; End subroutine     
   
;----------------------------------
; ending_load_menu00
;
ending_load_menu00:
   PUSH BC                     ; Save registers
   PUSH DE                     ;
   PUSH HL                     ;
   PUSH AF                     ;

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

   LD hl, ending_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

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

   CALL VDP_off                ; Screen off

; Load new tiles   
   LD a, $7F                   ; Low address byte
   OUT (VDP_ADDR),a            ;
   LD a, $1D                   ; High address byte
   OUT (VDP_ADDR),a            ;

   LD hl, ending_2_tiles       ; Load computer room tiles
   LD de, 64*32                ;
   CALL copy_to_vdp_loop_long  ;  

   LD a, $00                   ; Low address byte
   OUT (VDP_ADDR), a           ;
   LD a, $C0                   ; High address byte
   OUT (VDP_ADDR), a           ;
   LD a, 0                     ;
   OUT (VDP_DATA), a           ; Colors blink rapidly 
   
   LD a, 0                     ;
   LD (RAM_SHOCK_CTR), a       ; Clear shock counter
   
   LD hl, RAM_GAME_STATE       ;
   INC (hl)                    ; Go to next state

   CALL VDP_on                 ; Screen on
   
   POP AF                      ; Restore registers
   POP HL                      ;
   POP DE                      ;
   POP BC                      ;
   RET                         ; End subroutine     

;--------------------------------
; ending_run_005
;
ending_run_005:
   PUSH BC                     ; Save registers
   PUSH DE                     ;
   PUSH HL                     ;
   PUSH AF                     ;
 
   LD hl, RAM_SHOCK_CTR        ; Wait 3 seconds, 180 frames
   INC (hl)                    ;
   
   LD a, (hl)                  ;
   CP 180                      ;
   JP NZ, endrun_005_skip      ;
   
   LD a, 0                     ;
   LD (hl), a                  ; Clear shock counter
   LD a, 3                     ;
   LD (RAM_GAME_STATE), a      ; Return to next level
   
   LD a, (RAM_LEVEL_A)         ; Major level is 5?  
   CP 5                        ; Then go to final ending
   JP NZ, endrun_005_skip      ;

   LD a, 15                    ;
   LD (RAM_GAME_STATE), a      ; Final ending     
   
endrun_005_skip:
   POP AF                      ; Restore registers
   POP HL                      ;
   POP DE                      ;
   POP BC                      ;
   RET                         ; End subroutine  

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

   CALL VDP_off                ; Screen off

; Load new tiles   
   LD a, $1F                   ; Low address byte
   OUT (VDP_ADDR),a            ;
   LD a, $00                   ; 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, bnbw_butter_tiles    ; Load butter character
   LD de, 108*32               ;
   CALL copy_to_vdp_loop_long  ;
   
; Reload tiles (they get over-written in ending)
   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  ;

; Initial background load

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

   CALL level_x_new_high_score ; Check high score one last time

; Show score and high score
; 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           ;    
   
; Load sprites   
   LD hl, endend_sp_vpos       ; Load vpos
   LD de, RAM_VPOS             ;
   LD b, 25                    ; 12+12+1
   CALL copy_to_RAM_loop       ;

   LD hl, endend_sp_hpos       ; Load hpos
   LD de, RAM_HPOS             ;
   LD b, 49                    ; 24+24+1
   CALL copy_to_RAM_loop       ;   

   CALL intro_load_palette2    ; Sun set

   CALL sound_ending_sfx       ; Ending screen music
   
   LD hl, RAM_GAME_STATE       ;
   INC (hl)                    ; Go to next state

   CALL VDP_on                 ; Screen on
   
   POP AF                      ; Restore registers
   POP HL                      ;
   POP DE                      ;
   POP BC                      ;
   RET                         ; End subroutine   

;--------------------------------
; ending_run_007
;
; There is now way out of this state!
; The user must press reset!
;
ending_run_007:
   PUSH BC                     ; Save registers
   PUSH DE                     ;
   PUSH HL                     ;
   PUSH AF                     ;  
   
   LD a, (RAM_FRAME_CTR)       ;
   AND $18                     ;
   CP $08                      ;
   JP Z, end_run_007_run_002   ;
   CP $10                      ;
   JP Z, end_run_007_run_001   ;
   CP $18                      ;
   JP Z, end_run_007_run_003   ;
   
; Load sprites  
end_run_007_run_001: 
   LD hl, endend_sp_hpos       ; Load hpos
   LD de, RAM_HPOS             ;
   LD b, 49                    ; 24+24+1
   CALL copy_to_RAM_loop       ;  
   JP end_run_007_skip         ;
   
; Load sprites   
end_run_007_run_002: 
   LD hl, endend_sp_hpos2      ; Load hpos
   LD de, RAM_HPOS             ;
   LD b, 49                    ; 24+24+1
   CALL copy_to_RAM_loop       ;  
   JP end_run_007_skip         ;
   
; Load sprites   
end_run_007_run_003: 
   LD hl, endend_sp_hpos3      ; Load hpos
   LD de, RAM_HPOS             ;
   LD b, 49                    ; 24+24+1
   CALL copy_to_RAM_loop       ;     
   JP end_run_007_skip         ;

end_run_007_skip:   
   CALL title_scroll           ; Scroll the screen

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

   