
;----------------------------------------------------------
; level_3_load (27 lines)
level_3_load_003:
   PUSH AF                     ;

   CALL VDP_off                ; Stop VDP

   CALL load_tile_data_003     ; Load tiles
   CALL load_bg_data_003       ; Load background
   CALL load_palette_data_003  ; Load palette
   CALL initialize_score_bg3   ; Set up background in RAM
   CALL set_initial_sprites_level_3 ; Set up sprites
   CALL sprites_to_VRAM        ;

   LD a, STATE_LEVEL_3_RUN     ; Go to next state
   LD (RAM_GAME_STATE), a      ;

   LD a, LEVEL_TIMER_START     ; 99 second timer
   LD (RAM_TIME_1), a          ; Time 1
   LD (RAM_TIME_2), a          ; Time 2
   LD a, LEVEL_3_HEALTH        ;
   LD (RAM_HEALTH_1), a        ; Health

   LD a, 240                   ; Foes start 240 frames after clock starts.
   LD (RAM_FOE_1_COUNT), a     ;
   LD (RAM_FOE_2_COUNT), a     ;
   LD (RAM_FOE_3_COUNT), a     ;
   LD (RAM_FOE_4_COUNT), a     ;
   LD a, 120                   ; Foes start 120 frames after clock starts.
   LD (RAM_FOE_5_COUNT), a     ;
   LD (RAM_FOE_6_COUNT), a     ;
   LD (RAM_FOE_7_COUNT), a     ;
   LD (RAM_FOE_8_COUNT), a     ;

   LD a, $7F                   ; Enable scrolling
   LD (RAM_ENABLE_SCROLLING), a ;

   CALL copy_song_to_RAM003    ; Start a level

   CALL VDP_on                 ; Start VDP

   POP AF                      ;
   RET                         ; End subroutine 
;----------------------------------------------------------


;----------------------------------------------------------
; level_3_run_003 (9 lines)
;
; Run level 1.
; * Copy score from RAM to VRAM 
; * Make pig fly
; * Make foes and points move
; * Collision detection
; * Check for no health (game over)
; * Check for no time (level complete)
;----------------------------------------------------------
level_3_run_003:

; Copy score from RAM to VRAM
   CALL copy_score_bg          ; Copy score from RAM to VRAM

; Copy sprites from RAM to VRAM
   CALL sprites_to_VRAM        ; Copy sprites to VRAM

; Run everything that does not use VRAM
   CALL set_score_level_3      ; Set the score in RAM
   CALL run_timer_level_3      ; Count down to 00. At 00, go to next level.
   CALL pig_flight_level_3     ; Flap pig wings
   CALL move_foes_level_3      ; Move the foes
   CALL lv3_collision_detect   ; Shot hit foe?
   CALL pig_got_hit_lv3        ; Pig got hit?

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


;----------------------------------------------------------
; load_tile_data_003 (12 lines)
;
; Load tile data to $0000.
;----------------------------------------------------------
load_tile_data_003: 
   LD a, $00                   ; Low address byte
   OUT (VDP_ADDR),a            ;
   LD a, $00                   ; High address byte
   OUT (VDP_ADDR),a            ;

   LD hl, tiles_003 + 1        ; tile_data is defined below
   LD c, VDP_DATA              ; C <- $BE;   LD b, 128  

   LD e, 140                   ; Set up counter (280 tiles, 140 sets of 2 tiles)

tile_load_loopt3:
   LD b, 64                    ; Write 2 tiles (64 characters)               
   CALL copy_to_vdp_loop       ; HL -> VDP, until B goes to 0

   DEC e                       ;
   JR NZ, tile_load_loopt3     ; Loop until de is empty.

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

;----------------------------------------------------------
; load_bg_data_003 (12 lines)
;
; Load background data
;----------------------------------------------------------
load_bg_data_003: 
   LD a, $FF                   ; Low address byte
   OUT (VDP_ADDR),a            ;
   LD a, $37                   ; High address byte
   OUT (VDP_ADDR),a            ;

   LD hl, background_003       ; background_000 is defined below
   LD c, VDP_DATA              ; C <- $BE;   LD b, 128  

   LD e, 24                    ; Set up counter (24 rows)

tile_load_loopbg3:
   LD b, 64                    ; Write 1 row (64 characters)               
   CALL copy_to_vdp_loop       ; HL -> VDP, until B goes to 0

   DEC e                       ;
   JR NZ, tile_load_loopbg3    ; Loop until de is empty.

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

;----------------------------------------------------------
; load_palette_data_003 (12 lines)
;
; Load palette data.
;----------------------------------------------------------
load_palette_data_003:
   LD a, $00                   ; Low address byte
   OUT (VDP_ADDR),a            ;
   LD a, $C0                   ; High address byte
   OUT (VDP_ADDR),a            ;

   LD hl, palette_001          ; 
   LD b, 32                    ;
   CALL copy_to_vdp_loop       ; HL -> VDP, until B goes to 0

   LD hl, palette_001          ; Copy restore color
   LD de, RAM_RESTORE_COLOR    ;
   LD bc, 32                   ;
   LDIR                        ;

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


;---------------------------------------
; set_initial_sprites_level_3 (10 lines)
;
; Copy initial sprite values to RAM.
;---------------------------------------
set_initial_sprites_level_3:
   LD hl, vpos_sprites_level_3 ; VPOS
   LD de, RAM_VPOS            ; 
   LD bc, 45                  ;
   LDIR                       ;

   LD hl, hpos_sprites_level_3 ; HPOS, TILE
   LD de, RAM_HPOS            ; 
   LD bc, 89                  ;
   LDIR                       ;

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

vpos_sprites_level_3:
.db $70 ; Pig 00
.db $70 ;
.db $70 ;
.db $70 ;
.db $78 ; 
.db $78 ;
.db $78 ;
.db $78 ;
.db $00 ; Shot 1 8
.db $00 ;
.db $08 ;
.db $08 ;
.db $20 ; Foe 1 12
.db $20 ;
.db $28 ;
.db $28 ;
.db $A0 ; Foe 2 16
.db $A0 ;
.db $A8 ;
.db $A8 ;
.db $20 ; Foe 3 20
.db $20 ;
.db $28 ;
.db $28 ;
.db $A0 ; Foe 4 24
.db $A0 ;
.db $A8 ;
.db $A8 ;
.db $30 ; Foe 5 28
.db $30 ;
.db $38 ;
.db $38 ;
.db $80 ; Foe 6 32
.db $80 ;
.db $88 ;
.db $88 ;
.db $30 ; Foe 7 36
.db $30 ;
.db $38 ;
.db $38 ;
.db $80 ; Foe 8 40
.db $80 ;
.db $88 ;
.db $88 ;
.db $D0 ; Delimiter

hpos_sprites_level_3:
.db $70, $01 ; Pig 00
.db $78, $02 ;
.db $80, $03 ;
.db $88, $04 ;
.db $70, $1D ; 
.db $78, $1E ;
.db $80, $1F ;
.db $88, $00 ;
.db $00, $3B ; Shot 1 16
.db $08, $3C ;
.db $00, $45 ;
.db $08, $46 ;
.db $30, $00 ; Foe 1 24
.db $38, $00 ;
.db $30, $00 ;
.db $38, $00 ;
.db $60, $00 ; Foe 2 32
.db $68, $00 ;
.db $60, $00 ;
.db $68, $00 ;
.db $90, $00 ; Foe 3 40
.db $98, $00 ;
.db $90, $00 ;
.db $98, $00 ;
.db $C0, $00 ; Foe 4 48
.db $C8, $00 ;
.db $C0, $00 ;
.db $C8, $00 ;
.db $20, $00 ; Foe 5 56
.db $28, $00 ;
.db $20, $00 ;
.db $28, $00 ;
.db $C0, $00 ; Foe 6 64
.db $C8, $00 ;
.db $C0, $00 ;
.db $C8, $00 ;
.db $20, $00 ; Foe 7 72
.db $28, $00 ;
.db $20, $00 ;
.db $28, $00 ;
.db $C0, $00 ; Foe 8 80
.db $C8, $00 ;
.db $C0, $00 ;
.db $C8, $00 ;
.db $D0 ; Delimiter


;---------------------------------------
; initialize_score_bg3 (10 lines)
;
;---------------------------------------
initialize_score_bg3:
   LD hl, background_003 + 64  ; Initial background
   LD de, RAM_SCORE_BG         ; RAM location
   LD b, 64*2                  ; Set B

isbg_loop_003:
   LD a, (hl)                  ; Copy
   LD (de), a                  ;
   INC hl                      ; Increment
   INC de                      ; Increment
   DEC b                       ; 

   JP NZ, isbg_loop_003        ;
   RET                         ; End subroutine 
;---------------------------------------

;---------------------------------------
; copy_score_bg3 (23 lines)
;
; Copy score data from RAM to background
;---------------------------------------
copy_score_bg3:
; Copy row 1 or row 2?
   LD a, (RAM_FRAME_CTR)       ; Frame counter
   AND $01                     ; Mask all but last bit
   JP NZ, csbg3_row2            ;

; Row 1
   LD a, $3F                   ; Low address byte
   OUT (VDP_ADDR),a            ;
   LD a, $38                   ; High address byte
   OUT (VDP_ADDR),a            ;
   LD hl, RAM_SCORE_BG         ; RAM source
   JP csbg3_start_copy          ;
 
; Row 2
csbg3_row2:
   LD a, $7F                   ; Low address byte
   OUT (VDP_ADDR),a            ;
   LD a, $38                   ; High address byte
   OUT (VDP_ADDR),a            ;
   LD hl, RAM_SCORE_BG + 64    ; RAM source

csbg3_start_copy:
   LD b, 64                    ; Write 1 row (64 characters)               
   CALL tool_copy_loop3        ; HL -> VDP, until B goes to 0

   RET                         ; End subroutine 

tool_copy_loop3:
   LD a, (hl)                 ; Read tile data
   OUT (VDP_DATA), a          ; Write to VRAM
   INC hl                     ; Increment hl

   DEC b                      ; Loop until all data is copied.
   JP NZ, tool_copy_loop3     ; 

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

;---------------------------------------
; set_score_level_3 (55 lines)
;
; Translate score to background info.
;
; 7 digits for score
; 1 digit for health
; 4 digits for time
;---------------------------------------
set_score_level_3:
   PUSH AF                    ;
   PUSH BC                    ;

   LD a, (RAM_SCORE_1)        ; Digit 1
   LD c, a                    ;
   LD de, $C306               ;
   LD hl, $C346               ;
   CALL number_to_score_level_3 ;

   LD a, (RAM_SCORE_2)        ; Digit 2
   LD c, a                    ;
   LD de, $C306 + 4           ;
   LD hl, $C346 + 4           ;
   CALL number_to_score_level_3 ;

   LD a, (RAM_SCORE_3)        ; Digit 3
   LD c, a                    ;
   LD de, $C306 + 8           ;
   LD hl, $C346 + 8           ;
   CALL number_to_score_level_3 ;

   LD a, (RAM_SCORE_4)        ; Digit 4
   LD c, a                    ;
   LD de, $C306 + 12          ;
   LD hl, $C346 + 12          ;
   CALL number_to_score_level_3 ;

   LD a, (RAM_SCORE_5)        ; Digit 5
   LD c, a                    ;
   LD de, $C306 + 16          ;
   LD hl, $C346 + 16          ;
   CALL number_to_score_level_3 ;

   LD a, (RAM_SCORE_6)        ; Digit 6
   LD c, a                    ;
   LD de, $C306 + 20          ;
   LD hl, $C346 + 20          ;
   CALL number_to_score_level_3 ;

   LD a, (RAM_SCORE_7)        ; Digit 7
   LD c, a                    ;
   LD de, $C306 + 24          ;
   LD hl, $C346 + 24          ;
   CALL number_to_score_level_3 ;

   LD a, (RAM_HEALTH_1)       ; Health
   LD c, a                    ;
   LD de, $C326               ;
   LD hl, $C366               ;
   CALL number_to_score_level_3 ;   

   LD a, (RAM_TIME_1)         ; Time 1
   LD c, a                    ;
   LD de, $C336               ;
   LD hl, $C376               ;
   CALL number_to_score_level_3 ; 

   LD a, (RAM_TIME_2)         ; Time 2
   LD c, a                    ;
   LD de, $C336 + 4           ;
   LD hl, $C376 + 4           ;
   CALL number_to_score_level_3 ; 

   POP BC                     ;
   POP AF                     ;
   RET                        ; End subroutine
;---------------------------------------

;---------------------------------------
; number_to_score_level_3 (240 lines)
;
; C = number
; DE = location to write to
; HL = location to write to
;---------------------------------------
number_to_score_level_3:
   LD a, c                    ; Translate
   CP 0                       ;
   JP Z, ntsl3_0              ;
   LD a, c                    ; Translate
   CP 1                       ;
   JP Z, ntsl3_1              ;
   LD a, c                    ; Translate
   CP 2                       ;
   JP Z, ntsl3_2              ;
   LD a, c                    ; Translate
   CP 3                       ;
   JP Z, ntsl3_3              ;
   LD a, c                    ; Translate
   CP 4                       ;
   JP Z, ntsl3_4              ;
   LD a, c                    ; Translate
   CP 5                       ;
   JP Z, ntsl3_5              ;
   LD a, c                    ; Translate
   CP 6                       ;
   JP Z, ntsl3_6              ;
   LD a, c                    ; Translate
   CP 7                       ;
   JP Z, ntsl3_7              ;
   LD a, c                    ; Translate
   CP 8                       ;
   JP Z, ntsl3_8              ;
   LD a, c                    ; Translate
   CP 9                       ;
   JP Z, ntsl3_9              ;

ntsl3_0:
   LD a, $4C                  ; 0
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $4C                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $02                  ;
   LD (de), a                 ;

   LD a, $68                  ; 0
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $69                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   JP ntsl3_copy_end          ;

ntsl3_1:
   LD a, $4D                  ; 1
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $4E                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;

   LD a, $4D                  ; 1
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $04                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $4E                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $04                  ;
   LD (hl), a                 ;
   JP ntsl3_copy_end          ;

ntsl3_2:
   LD a, $4F                  ; 2
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $50                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;

   LD a, $6A                  ; 2
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $6B                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   JP ntsl3_copy_end          ;

ntsl3_3:
   LD a, $51                  ; 3
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $52                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;

   LD a, $6C                  ; 3
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $6D                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   JP ntsl3_copy_end          ;

ntsl3_4:
   LD a, $53                  ; 4
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $54                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;

   LD a, $6E                  ; 4
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $6F                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   JP ntsl3_copy_end          ;

ntsl3_5:
   LD a, $55                  ; 5
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $56                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;

   LD a, $70                  ; 5
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $71                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   JP ntsl3_copy_end          ;

ntsl3_6:
   LD a, $57                  ; 6
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $58                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;

   LD a, $72                  ; 6
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $73                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   JP ntsl3_copy_end          ;

ntsl3_7:
   LD a, $59                  ; 7
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $5A                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;

   LD a, $74                  ; 7
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $75                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   JP ntsl3_copy_end          ;

ntsl3_8:
   LD a, $5B                  ; 8
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $5C                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;

   LD a, $76                  ; 8
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $77                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   JP ntsl3_copy_end          ;

ntsl3_9:
   LD a, $5D                  ; 9
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $5E                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;

   LD a, $78                  ; 9
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $79                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;

ntsl3_copy_end:
   RET                        ; End subroutine   
;---------------------------------------

;---------------------------------------
; run_timer_level_3 (18 lines)
;
; Count down the timer digits.
;---------------------------------------
run_timer_level_3:
   LD a, (RAM_FRAME_CTR)      ; Frame counter
   CP 59                      ; 60 frames per second
   JP NZ, rtlv3_skip_000      ;

   LD a, (RAM_TIME_2)         ; Time 2
   DEC a                      ;
   LD (RAM_TIME_2), a         ;

   CP $FF                     ; at -1? 
   JP NZ, rtlv3_skip_000      ;

   LD a, $09                  ;
   LD (RAM_TIME_2), a         ;

   LD a, (RAM_TIME_1)         ; Time 2
   DEC a                      ;
   LD (RAM_TIME_1), a         ;

   CP $FF                     ; at -1? 
   JP NZ, rtlv3_skip_000      ;

   LD a, STATE_LEVEL_4_LOAD   ; Go to next level
   LD (RAM_GAME_STATE), a     ;

rtlv3_skip_000:
   RET                        ; End subroutine 
;---------------------------------------

;---------------------------------------
; pig_flight_level_3 (83 lines)
;
; Make the pig fly.
;---------------------------------------
pig_flight_level_3:
   LD a, (RAM_PIG_BLINK)      ;
   CP $00                     ;
   JP NZ, pflv3_end2          ;

   LD a, (RAM_FRAME_CTR)      ; Frame counter
   CP 0                       ; flap
   JP Z, pflv3_000            ;
   CP 15                      ; flap
   JP Z, pflv3_001            ;
   CP 30                      ; flap
   JP Z, pflv3_002            ;
   CP 45                      ; flap
   JP Z, pflv3_001            ;
   JP pflv3_end               ;

; High wing
pflv3_000:
   LD a, $01                  ;
   LD (RAM_HPOS + 1), a       ;
   LD a, $02                  ;
   LD (RAM_HPOS + 3), a       ;
   LD a, $03                  ;
   LD (RAM_HPOS + 5), a       ;
   LD a, $04                  ;
   LD (RAM_HPOS + 7), a       ;
   LD a, $1D                  ;
   LD (RAM_HPOS + 9), a       ;
   LD a, $1E                  ;
   LD (RAM_HPOS + 11), a      ;
   LD a, $1F                  ;
   LD (RAM_HPOS + 13), a      ;
   LD a, $00                  ;
   LD (RAM_HPOS + 15), a      ;
   JP pflv3_end               ;

; Middle wing
pflv3_001:
   LD a, $05                  ;
   LD (RAM_HPOS + 1), a       ;
   LD a, $06                  ;
   LD (RAM_HPOS + 3), a       ;
   LD a, $03                  ;
   LD (RAM_HPOS + 5), a       ;
   LD a, $07                  ;
   LD (RAM_HPOS + 7), a       ;
   LD a, $20                  ;
   LD (RAM_HPOS + 9), a       ;
   LD a, $21                  ;
   LD (RAM_HPOS + 11), a      ;
   LD a, $1F                  ;
   LD (RAM_HPOS + 13), a      ;
   LD a, $00                  ;
   LD (RAM_HPOS + 15), a      ;
   JP pflv3_end               ;

; Low wing
pflv3_002:
   LD a, $08                  ;
   LD (RAM_HPOS + 1), a       ;
   LD a, $09                  ;
   LD (RAM_HPOS + 3), a       ;
   LD a, $03                  ;
   LD (RAM_HPOS + 5), a       ;
   LD a, $04                  ;
   LD (RAM_HPOS + 7), a       ;
   LD a, $22                  ;
   LD (RAM_HPOS + 9), a       ;
   LD a, $23                  ;
   LD (RAM_HPOS + 11), a      ;
   LD a, $1F                  ;
   LD (RAM_HPOS + 13), a      ;
   LD a, $00                  ;
   LD (RAM_HPOS + 15), a      ;
   JP pflv1_end               ;

pflv3_end2:
   LD a, (RAM_PIG_BLINK)      ; Make the pig blink
   DEC a                      ;
   LD (RAM_PIG_BLINK), a      ;

   LD a, $0A                  ;
   LD (RAM_HPOS + 1), a       ;
   LD a, $0B                  ;
   LD (RAM_HPOS + 3), a       ;
   LD a, $0C                  ;
   LD (RAM_HPOS + 5), a       ;
   LD a, $0D                  ;
   LD (RAM_HPOS + 7), a       ;
   LD a, $1F                  ;
   LD (RAM_HPOS + 9), a       ;
   LD a, $24                  ;
   LD (RAM_HPOS + 11), a      ;
   LD a, $25                  ;
   LD (RAM_HPOS + 13), a      ;
   LD a, $00                  ;
   LD (RAM_HPOS + 15), a      ;
pflv3_end:
   RET                        ; End subroutine 
;---------------------------------------

;----------------------------------------
; move_foes_level_3 (413 lines) 
;
; Move all 8 foes.
; 
; Each foe has two bytes in RAM that
; define it's behavior.
; byte 1 - Terminate counter
;          If zero, move as normal.
;          else, count down to zero, 
;          then respawn. 
; byte 2 - Algorithm temp byte.
;          Some movement algorithms may
;          require a state variable.
;
; RAM_FOE_1_COUNT
; RAM_FOE_1_STATE
; RAM_FOE_2_COUNT
; RAM_FOE_2_STATE
; RAM_FOE_3_COUNT
; RAM_FOE_3_STATE
; RAM_FOE_4_COUNT
; RAM_FOE_4_STATE
; RAM_FOE_5_COUNT
; RAM_FOE_5_STATE
; RAM_FOE_6_COUNT
; RAM_FOE_6_STATE
; RAM_FOE_7_COUNT
; RAM_FOE_7_STATE
; RAM_FOE_8_COUNT
; RAM_FOE_8_STATE
;
; Foe 1 - Fork
; Foe 2 - Fork
; Foe 3 - Fork
; Foe 4 - Fork
; Foe 5 - Flame
; Foe 6 - Flame
; Foe 7 - Flame
; Foe 8 - Flame
;----------------------------------------
move_foes_level_3:
; Foe 1 - Fork
  LD hl, RAM_FOE_1_COUNT        ;
  LD a, (hl)                    ; Termination counter expired? 
  CP $00                        ;
  JP NZ, mflv3_countdown_001    ;

  LD a, (RAM_SECOND_CTR)        ; Load state
  AND $03                       ;
  CP $00                        ; Go up
  JP Z, mflv3_up_001            ;
  CP $01                        ; Go right
  JP Z, mflv3_right_001         ;
  CP $02                        ; Go down
  JP Z, mflv3_up_001            ;
  CP $03                        ; Go left
  JP Z, mflv3_left_001          ;  

  JP mflv3_next_002             ; Go to next foe

mflv3_up_001:
  LD hl, RAM_VPOS + 12          ; Go up
  CALL lv3_up_subroutine        ;
  LD a, $14                     ;; 14 15 2D 2E
  LD (RAM_HPOS + 25), a         ;
  LD a, $15                     ;; 14 15 2D 2E
  LD (RAM_HPOS + 27), a         ;
  LD a, $2D                     ;; 14 15 2D 2E
  LD (RAM_HPOS + 29), a         ;
  LD a, $2E                     ;; 14 15 2D 2E
  LD (RAM_HPOS + 31), a         ;
  JP mflv3_next_002             ; Go to next foe

mflv3_right_001:
  LD hl, RAM_HPOS + 24          ; Go right
  CALL lv3_right_subroutine      ;
  LD a, $1A                     ;; 1A 1B 33 34
  LD (RAM_HPOS + 25), a         ;
  LD a, $1B                     ;; 1A 1B 33 34
  LD (RAM_HPOS + 27), a         ;
  LD a, $33                     ;; 1A 1B 33 34
  LD (RAM_HPOS + 29), a         ;
  LD a, $34                     ;; 1A 1B 33 34
  LD (RAM_HPOS + 31), a         ;
  JP mflv3_next_002             ; Go to next foe

mflv3_left_001:
  LD hl, RAM_HPOS + 24          ; Go left
  CALL lv3_left_subroutine      ;
  LD a, $18                     ;; 18 19 31 32
  LD (RAM_HPOS + 25), a         ;
  LD a, $19                     ;; 18 19 31 32
  LD (RAM_HPOS + 27), a         ;
  LD a, $31                     ;; 18 19 31 32
  LD (RAM_HPOS + 29), a         ;
  LD a, $32                     ;; 18 19 31 32
  LD (RAM_HPOS + 31), a         ;
  JP mflv3_next_002             ; Go to next foe

mflv3_countdown_001:
  DEC (hl)                      ; Decrement counter

  LD a, (hl)                    ; Respawn?
  CP $00                        ;
  JP NZ, mflv3_next_002         ;
  LD hl, vpos_sprites_level_3 + 12 ; Y respawn
  LD de, RAM_VPOS + 12          ;
  CALL copy_4_vpos_lv3          ;
  LD hl, hpos_sprites_level_3 + 24 ; X respawn
  LD de, RAM_HPOS + 24          ;
  CALL copy_4_hpos_lv3          ;

;------------------------------------------
; Foe 2 - Fork
mflv3_next_002:
  LD hl, RAM_FOE_2_COUNT        ;
  LD a, (hl)                    ; Termination counter expired? 
  CP $00                        ;
  JP NZ, mflv3_countdown_002    ;

  LD a, (RAM_SECOND_CTR)        ; Load state
  AND $03                       ;
  CP $00                        ; Go up
  JP Z, mflv3_up_002            ;
  CP $01                        ; Go right
  JP Z, mflv3_right_002         ;
  CP $02                        ; Go down
  JP Z, mflv3_up_002            ;
  CP $03                        ; Go left
  JP Z, mflv3_left_002          ;  

  JP mflv3_next_003             ; Go to next foe

mflv3_up_002:
  LD hl, RAM_VPOS + 16          ; Go up
  CALL lv3_up_subroutine        ;
  LD a, $14                     ;; 14 15 2D 2E
  LD (RAM_HPOS + 33), a         ;
  LD a, $15                     ;; 14 15 2D 2E
  LD (RAM_HPOS + 35), a         ;
  LD a, $2D                     ;; 14 15 2D 2E
  LD (RAM_HPOS + 37), a         ;
  LD a, $2E                     ;; 14 15 2D 2E
  LD (RAM_HPOS + 39), a         ;
  JP mflv3_next_003             ; Go to next foe

mflv3_right_002:
  LD hl, RAM_HPOS + 32          ; Go right
  CALL lv3_right_subroutine     ;
  LD a, $1A                     ;; 1A 1B 33 34
  LD (RAM_HPOS + 33), a         ;
  LD a, $1B                     ;; 1A 1B 33 34
  LD (RAM_HPOS + 35), a         ;
  LD a, $33                     ;; 1A 1B 33 34
  LD (RAM_HPOS + 37), a         ;
  LD a, $34                     ;; 1A 1B 33 34
  LD (RAM_HPOS + 39), a         ;
  JP mflv3_next_003             ; Go to next foe

mflv3_left_002:
  LD hl, RAM_HPOS + 32          ; Go left
  CALL lv3_left_subroutine      ;
  LD a, $18                     ;; 18 19 31 32
  LD (RAM_HPOS + 33), a         ;
  LD a, $19                     ;; 18 19 31 32
  LD (RAM_HPOS + 35), a         ;
  LD a, $31                     ;; 18 19 31 32
  LD (RAM_HPOS + 37), a         ;
  LD a, $32                     ;; 18 19 31 32
  LD (RAM_HPOS + 39), a         ;
  JP mflv3_next_003             ; Go to next foe

mflv3_countdown_002:
  DEC (hl)                      ; Decrement counter

  LD a, (hl)                    ; Respawn?
  CP $00                        ;
  JP NZ, mflv3_next_003         ;
  LD hl, vpos_sprites_level_3 + 16 ; Y respawn
  LD de, RAM_VPOS + 16          ;
  CALL copy_4_vpos_lv3          ;
  LD hl, hpos_sprites_level_3 + 32 ; X respawn
  LD de, RAM_HPOS + 32          ;
  CALL copy_4_hpos_lv3          ;

;------------------------------------------
; Foe 3 - Fork
mflv3_next_003:
  LD hl, RAM_FOE_3_COUNT        ;
  LD a, (hl)                    ; Termination counter expired? 
  CP $00                        ;
  JP NZ, mflv3_countdown_003    ;

  LD a, (RAM_SECOND_CTR)        ; Load state
  AND $03                       ;
  CP $00                        ; Go up
  JP Z, mflv3_up_003            ;
  CP $01                        ; Go right
  JP Z, mflv3_right_003         ;
  CP $02                        ; Go down
  JP Z, mflv3_up_003            ;
  CP $03                        ; Go left
  JP Z, mflv3_left_003          ;  

  JP mflv3_next_004             ; Go to next foe

mflv3_up_003:
  LD hl, RAM_VPOS + 20          ; Go up
  CALL lv3_up_subroutine        ;
  LD a, $14                     ;; 14 15 2D 2E
  LD (RAM_HPOS + 41), a         ;
  LD a, $15                     ;; 14 15 2D 2E
  LD (RAM_HPOS + 43), a         ;
  LD a, $2D                     ;; 14 15 2D 2E
  LD (RAM_HPOS + 45), a         ;
  LD a, $2E                     ;; 14 15 2D 2E
  LD (RAM_HPOS + 47), a         ;
  JP mflv3_next_004             ; Go to next foe

mflv3_right_003:
  LD hl, RAM_HPOS + 40          ; Go right
  CALL lv3_right_subroutine     ;
  LD a, $1A                     ;; 1A 1B 33 34
  LD (RAM_HPOS + 41), a         ;
  LD a, $1B                     ;; 1A 1B 33 34
  LD (RAM_HPOS + 43), a         ;
  LD a, $33                     ;; 1A 1B 33 34
  LD (RAM_HPOS + 45), a         ;
  LD a, $34                     ;; 1A 1B 33 34
  LD (RAM_HPOS + 47), a         ;
  JP mflv3_next_004             ; Go to next foe

mflv3_left_003:
  LD hl, RAM_HPOS + 40          ; Go left
  CALL lv3_left_subroutine      ;
  LD a, $18                     ;; 18 19 31 32
  LD (RAM_HPOS + 41), a         ;
  LD a, $19                     ;; 18 19 31 32
  LD (RAM_HPOS + 43), a         ;
  LD a, $31                     ;; 18 19 31 32
  LD (RAM_HPOS + 45), a         ;
  LD a, $32                     ;; 18 19 31 32
  LD (RAM_HPOS + 47), a         ;
  JP mflv3_next_004             ; Go to next foe

mflv3_countdown_003:
  DEC (hl)                      ; Decrement counter

  LD a, (hl)                    ; Respawn?
  CP $00                        ;
  JP NZ, mflv3_next_004         ;
  LD hl, vpos_sprites_level_3 + 20 ; Y respawn
  LD de, RAM_VPOS + 20          ;
  CALL copy_4_vpos_lv3          ;
  LD hl, hpos_sprites_level_3 + 40 ; X respawn
  LD de, RAM_HPOS + 40          ;
  CALL copy_4_hpos_lv3          ;

;------------------------------------------
; Foe 4 - Fork
mflv3_next_004:
  LD hl, RAM_FOE_4_COUNT        ;
  LD a, (hl)                    ; Termination counter expired? 
  CP $00                        ;
  JP NZ, mflv3_countdown_004    ;

  LD a, (RAM_SECOND_CTR)        ; Load state
  AND $03                       ;
  CP $00                        ; Go up
  JP Z, mflv3_up_004            ;
  CP $01                        ; Go right
  JP Z, mflv3_right_004         ;
  CP $02                        ; Go down
  JP Z, mflv3_up_004            ;
  CP $03                        ; Go left
  JP Z, mflv3_left_004          ;  

  JP mflv3_next_004             ; Go to next foe

mflv3_up_004:
  LD hl, RAM_VPOS + 24          ; Go up
  CALL lv3_up_subroutine        ;
  LD a, $14                     ;; 14 15 2D 2E
  LD (RAM_HPOS + 49), a         ;
  LD a, $15                     ;; 14 15 2D 2E
  LD (RAM_HPOS + 51), a         ;
  LD a, $2D                     ;; 14 15 2D 2E
  LD (RAM_HPOS + 53), a         ;
  LD a, $2E                     ;; 14 15 2D 2E
  LD (RAM_HPOS + 55), a         ;
  JP mflv3_next_005             ; Go to next foe

mflv3_right_004:
  LD hl, RAM_HPOS + 48          ; Go right
  CALL lv3_right_subroutine     ;
  LD a, $1A                     ;; 1A 1B 33 34
  LD (RAM_HPOS + 49), a         ;
  LD a, $1B                     ;; 1A 1B 33 34
  LD (RAM_HPOS + 51), a         ;
  LD a, $33                     ;; 1A 1B 33 34
  LD (RAM_HPOS + 53), a         ;
  LD a, $34                     ;; 1A 1B 33 34
  LD (RAM_HPOS + 55), a         ;
  JP mflv3_next_005             ; Go to next foe

mflv3_left_004:
  LD hl, RAM_HPOS + 48          ; Go left
  CALL lv3_left_subroutine      ;
  LD a, $18                     ;; 18 19 31 32
  LD (RAM_HPOS + 49), a         ;
  LD a, $19                     ;; 18 19 31 32
  LD (RAM_HPOS + 51), a         ;
  LD a, $31                     ;; 18 19 31 32
  LD (RAM_HPOS + 53), a         ;
  LD a, $32                     ;; 18 19 31 32
  LD (RAM_HPOS + 55), a         ;
  JP mflv3_next_005             ; Go to next foe

mflv3_countdown_004:
  DEC (hl)                      ; Decrement counter

  LD a, (hl)                    ; Respawn?
  CP $00                        ;
  JP NZ, mflv3_next_005         ;
  LD hl, vpos_sprites_level_3 + 24 ; Y respawn
  LD de, RAM_VPOS + 24          ;
  CALL copy_4_vpos_lv3          ;
  LD hl, hpos_sprites_level_3 + 48 ; X respawn
  LD de, RAM_HPOS + 48          ;
  CALL copy_4_hpos_lv3          ;

;------------------------------------------
; Foe 5 - Flame
mflv3_next_005:
  LD hl, RAM_FOE_5_COUNT        ;
  LD a, (hl)                    ; Termination counter expired? 
  CP $00                        ;
  JP NZ, mflv3_countdown_005    ;

  LD hl, RAM_HPOS + 56          ; Flames flicker
  CALL set_flame_sprites_lv3    ;

  LD a, (RAM_FOE_4_STATE)       ;
  CP $00                        ;
  JP Z, mflv3_downright_005     ;
  CP $01                        ;
  JP Z, mflv3_downleft_005      ;
  CP $02                        ;
  JP Z, mflv3_upleft_005        ;
  CP $03                        ;
  JP Z, mflv3_upright_005       ;

mflv3_downright_005:
  LD hl, RAM_VPOS + 28          ; Down
  CALL lv3_down_subroutine      ;
  LD hl, RAM_HPOS + 56          ; Right
  CALL lv3_right_subroutine     ;
  LD a, (RAM_HPOS + 56)         ; Hit right wall?
  CP $E0                        ;
  JP NZ, mflv3_next_006         ;
  LD a, $01                     ;
  LD (RAM_FOE_5_STATE), a       ; Change state
  JP mflv3_next_006             ;

mflv3_downleft_005:
  LD hl, RAM_VPOS + 28          ;
  CALL lv3_down_subroutine      ;
  LD hl, RAM_HPOS + 56          ;
  CALL lv3_left_subroutine      ;
  LD a, (RAM_VPOS + 28)         ; Hit floor?
  CP $C0                        ;
  JP NZ, mflv3_next_006         ;
  LD a, $02                     ;
  LD (RAM_FOE_5_STATE), a       ; Change state
  JP mflv3_next_006             ;

mflv3_upleft_005:
  LD hl, RAM_VPOS + 28          ;
  CALL lv3_up_subroutine        ;
  LD hl, RAM_HPOS + 56          ;
  CALL lv3_left_subroutine      ;
  LD a, (RAM_HPOS + 56)         ; Hit left wall?
  CP $10                        ;
  JP NZ, mflv3_next_006         ;
  LD a, $03                     ;
  LD (RAM_FOE_5_STATE), a       ; Change state
  JP mflv3_next_006             ;

mflv3_upright_005:
  LD hl, RAM_VPOS + 28          ;
  CALL lv3_up_subroutine        ;
  LD hl, RAM_HPOS + 56          ;
  CALL lv3_right_subroutine     ;
  LD a, (RAM_VPOS + 28)         ; Hit ceiling?
  CP $20                        ;
  JP NZ, mflv3_next_006         ;
  LD a, $00                     ;
  LD (RAM_FOE_4_STATE), a       ; Change state
  JP mflv3_next_006             ;

mflv3_countdown_005:
  DEC (hl)                      ; Decrement counter

  LD a, (hl)                    ; Respawn?
  CP $00                        ;
  JP NZ, mflv3_next_006         ;
  LD hl, vpos_sprites_level_3 + 28 ; Y respawn
  LD de, RAM_VPOS + 28          ;
  CALL copy_4_vpos_lv3          ;
  LD hl, hpos_sprites_level_3 + 56 ; X respawn
  LD de, RAM_HPOS + 56          ;
  CALL copy_4_hpos_lv3          ;

;------------------------------------------
; Foe 6 - Flame
mflv3_next_006:
  LD hl, RAM_FOE_6_COUNT        ;
  LD a, (hl)                    ; Termination counter expired? 
  CP $00                        ;
  JP NZ, mflv3_countdown_006    ;

  LD hl, RAM_HPOS + 64          ; Flames flicker
  CALL set_flame_sprites_lv3    ;

  LD a, (RAM_FOE_6_STATE)       ;
  CP $00                        ;
  JP Z, mflv3_downright_006     ;
  CP $01                        ;
  JP Z, mflv3_downleft_006      ;
  CP $02                        ;
  JP Z, mflv3_upleft_006        ;
  CP $03                        ;
  JP Z, mflv3_upright_006       ;

mflv3_downright_006:
  LD hl, RAM_VPOS + 32          ; Down
  CALL lv3_down_subroutine      ;
  LD hl, RAM_HPOS + 64          ; Right
  CALL lv3_right_subroutine     ;
  LD a, (RAM_HPOS + 64)         ; Hit right wall?
  CP $E0                        ;
  JP NZ, mflv3_next_007         ;
  LD a, $01                     ;
  LD (RAM_FOE_6_STATE), a       ; Change state
  JP mflv3_next_007             ;

mflv3_downleft_006:
  LD hl, RAM_VPOS + 32          ;
  CALL lv3_down_subroutine      ;
  LD hl, RAM_HPOS + 64          ;
  CALL lv3_left_subroutine      ;
  LD a, (RAM_VPOS + 32)         ; Hit floor?
  CP $C0                        ;
  JP NZ, mflv3_next_007         ;
  LD a, $02                     ;
  LD (RAM_FOE_6_STATE), a       ; Change state
  JP mflv3_next_007             ;

mflv3_upleft_006:
  LD hl, RAM_VPOS + 32          ;
  CALL lv3_up_subroutine        ;
  LD hl, RAM_HPOS + 64          ;
  CALL lv3_left_subroutine      ;
  LD a, (RAM_HPOS + 64)         ; Hit left wall?
  CP $10                        ;
  JP NZ, mflv3_next_007         ;
  LD a, $03                     ;
  LD (RAM_FOE_6_STATE), a       ; Change state
  JP mflv3_next_007             ;

mflv3_upright_006:
  LD hl, RAM_VPOS + 32          ;
  CALL lv3_up_subroutine        ;
  LD hl, RAM_HPOS + 64          ;
  CALL lv3_right_subroutine     ;
  LD a, (RAM_VPOS + 32)         ; Hit ceiling?
  CP $20                        ;
  JP NZ, mflv3_next_007         ;
  LD a, $00                     ;
  LD (RAM_FOE_6_STATE), a       ; Change state
  JP mflv3_next_007             ;

mflv3_countdown_006:
  DEC (hl)                      ; Decrement counter

  LD a, (hl)                    ; Respawn?
  CP $00                        ;
  JP NZ, mflv3_next_007         ;
  LD hl, vpos_sprites_level_3 + 32 ; Y respawn
  LD de, RAM_VPOS + 32          ;
  CALL copy_4_vpos_lv3          ;
  LD hl, hpos_sprites_level_3 + 64 ; X respawn
  LD de, RAM_HPOS + 64          ;
  CALL copy_4_hpos_lv3          ;

;------------------------------------------
; Foe 7 - Flame
mflv3_next_007:
  LD hl, RAM_FOE_7_COUNT        ;
  LD a, (hl)                    ; Termination counter expired? 
  CP $00                        ;
  JP NZ, mflv3_countdown_007    ;

  LD hl, RAM_HPOS + 72          ; Flames flicker
  CALL set_flame_sprites_lv3    ;

  LD a, (RAM_FOE_7_STATE)       ;
  CP $00                        ;
  JP Z, mflv3_downright_007     ;
  CP $01                        ;
  JP Z, mflv3_downleft_007      ;
  CP $02                        ;
  JP Z, mflv3_upleft_007        ;
  CP $03                        ;
  JP Z, mflv3_upright_007       ;

mflv3_downright_007:
  LD hl, RAM_VPOS + 36          ; Down
  CALL lv3_down_subroutine      ;
  LD hl, RAM_HPOS + 72          ; Right
  CALL lv3_right_subroutine     ;
  LD a, (RAM_HPOS + 72)         ; Hit right wall?
  CP $E0                        ;
  JP NZ, mflv3_next_008         ;
  LD a, $01                     ;
  LD (RAM_FOE_7_STATE), a       ; Change state
  JP mflv3_next_008             ;

mflv3_downleft_007:
  LD hl, RAM_VPOS + 36          ;
  CALL lv3_down_subroutine      ;
  LD hl, RAM_HPOS + 72          ;
  CALL lv3_left_subroutine      ;
  LD a, (RAM_VPOS + 36)         ; Hit floor?
  CP $C0                        ;
  JP NZ, mflv3_next_008         ;
  LD a, $02                     ;
  LD (RAM_FOE_7_STATE), a       ; Change state
  JP mflv3_next_008             ;

mflv3_upleft_007:
  LD hl, RAM_VPOS + 36          ;
  CALL lv3_up_subroutine        ;
  LD hl, RAM_HPOS + 72          ;
  CALL lv3_left_subroutine      ;
  LD a, (RAM_HPOS + 72)         ; Hit left wall?
  CP $10                        ;
  JP NZ, mflv3_next_008         ;
  LD a, $03                     ;
  LD (RAM_FOE_7_STATE), a       ; Change state
  JP mflv3_next_008             ;

mflv3_upright_007:
  LD hl, RAM_VPOS + 36          ;
  CALL lv3_up_subroutine        ;
  LD hl, RAM_HPOS + 72          ;
  CALL lv3_right_subroutine     ;
  LD a, (RAM_VPOS + 36)         ; Hit ceiling?
  CP $20                        ;
  JP NZ, mflv3_next_008         ;
  LD a, $00                     ;
  LD (RAM_FOE_7_STATE), a       ; Change state
  JP mflv3_next_008             ;

mflv3_countdown_007:
  DEC (hl)                      ; Decrement counter

  LD a, (hl)                    ; Respawn?
  CP $00                        ;
  JP NZ, mflv3_next_008         ;
  LD hl, vpos_sprites_level_3 + 36 ; Y respawn
  LD de, RAM_VPOS + 36          ;
  CALL copy_4_vpos_lv3          ;
  LD hl, hpos_sprites_level_3 + 72 ; X respawn
  LD de, RAM_HPOS + 72          ;
  CALL copy_4_hpos_lv3          ;

;------------------------------------------
; Foe 8 - Flame
mflv3_next_008:
  LD hl, RAM_FOE_8_COUNT        ;
  LD a, (hl)                    ; Termination counter expired? 
  CP $00                        ;
  JP NZ, mflv3_countdown_008    ;

  LD hl, RAM_HPOS + 80          ; Flames flicker
  CALL set_flame_sprites_lv3    ;

  LD a, (RAM_FOE_8_STATE)       ;
  CP $00                        ;
  JP Z, mflv3_downright_008     ;
  CP $01                        ;
  JP Z, mflv3_downleft_008      ;
  CP $02                        ;
  JP Z, mflv3_upleft_008        ;
  CP $03                        ;
  JP Z, mflv3_upright_008       ;

mflv3_downright_008:
  LD hl, RAM_VPOS + 40          ; Down
  CALL lv3_down_subroutine      ;
  LD hl, RAM_HPOS + 80          ; Right
  CALL lv3_right_subroutine     ;
  LD a, (RAM_HPOS + 80)         ; Hit right wall?
  CP $E0                        ;
  JP NZ, mflv3_next_009         ;
  LD a, $01                     ;
  LD (RAM_FOE_8_STATE), a       ; Change state
  JP mflv3_next_009             ;

mflv3_downleft_008:
  LD hl, RAM_VPOS + 40          ;
  CALL lv3_down_subroutine      ;
  LD hl, RAM_HPOS + 80          ;
  CALL lv3_left_subroutine      ;
  LD a, (RAM_VPOS + 40)         ; Hit floor?
  CP $C0                        ;
  JP NZ, mflv3_next_009         ;
  LD a, $02                     ;
  LD (RAM_FOE_8_STATE), a       ; Change state
  JP mflv3_next_009             ;

mflv3_upleft_008:
  LD hl, RAM_VPOS + 40          ;
  CALL lv3_up_subroutine        ;
  LD hl, RAM_HPOS + 80          ;
  CALL lv3_left_subroutine      ;
  LD a, (RAM_HPOS + 80)         ; Hit left wall?
  CP $10                        ;
  JP NZ, mflv3_next_009         ;
  LD a, $03                     ;
  LD (RAM_FOE_8_STATE), a       ; Change state
  JP mflv3_next_009             ;

mflv3_upright_008:
  LD hl, RAM_VPOS + 40          ;
  CALL lv3_up_subroutine        ;
  LD hl, RAM_HPOS + 80          ;
  CALL lv3_right_subroutine     ;
  LD a, (RAM_VPOS + 40)         ; Hit ceiling?
  CP $20                        ;
  JP NZ, mflv3_next_009         ;
  LD a, $00                     ;
  LD (RAM_FOE_8_STATE), a       ; Change state
  JP mflv3_next_009             ;

mflv3_countdown_008:
  DEC (hl)                      ; Decrement counter

  LD a, (hl)                    ; Respawn?
  CP $00                        ;
  JP NZ, mflv3_next_009         ;
  LD hl, vpos_sprites_level_3 + 40 ; Y respawn
  LD de, RAM_VPOS + 40          ;
  CALL copy_4_vpos_lv3          ;
  LD hl, hpos_sprites_level_3 + 80 ; X respawn
  LD de, RAM_HPOS + 80          ;
  CALL copy_4_hpos_lv3          ;

mflv3_next_009:
  RET                           ; End subroutine 
;----------------------------------------


;----------------------------------------
; lv3_up_subroutine (8 lines)
; HL = VPOS
;----------------------------------------
lv3_up_subroutine:
  LD a, (hl)                    ; $20 to $C0
  CP $20                        ;
  JP Z, lv3usub_001             ;

  DEC (hl)                      ;
  INC hl                        ;
  DEC (hl)                      ;
  INC hl                        ;
  DEC (hl)                      ;
  INC hl                        ;
  DEC (hl)                      ;

  RET                           ; End subroutine 

lv3usub_001:  
  LD a, $C0                     ; $20 to $C0
  LD (hl), a                    ;
  INC hl                        ;
  LD a, $C0                     ;
  LD (hl), a                    ;
  INC hl                        ;
  LD a, $C8                     ;
  LD (hl), a                    ;
  INC hl                        ;
  LD a, $C8                     ;
  LD (hl), a                    ;

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

;----------------------------------------
; lv3_down_subroutine (8 lines)
; HL = VPOS
;----------------------------------------
lv3_down_subroutine:
  LD a, (hl)                    ; $C0 to $20
  CP $C0                        ;
  JP Z, lv3dsub_001             ;

  INC (hl)                      ;
  INC hl                        ;
  INC (hl)                      ;
  INC hl                        ;
  INC (hl)                      ;
  INC hl                        ;
  INC (hl)                      ;

  RET                           ; End subroutine 

lv3dsub_001:
  LD a, $20                     ; $C0 to $20
  LD (hl), a                    ;
  INC hl                        ;
  LD a, $20                     ;
  LD (hl), a                    ;
  INC hl                        ;
  LD a, $28                     ;
  LD (hl), a                    ;
  INC hl                        ;
  LD a, $28                     ;
  LD (hl), a                    ;

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

;----------------------------------------
; lv3_right_subroutine (11 lines)
; HL = HPOS
;----------------------------------------
lv3_right_subroutine:
  INC (hl)                      ;
  INC hl                        ;
  INC hl                        ;
  INC (hl)                      ;
  INC hl                        ;
  INC hl                        ;
  INC (hl)                      ;
  INC hl                        ;
  INC hl                        ;
  INC (hl)                      ;
  
  RET                           ; End subroutine 
;----------------------------------------

;----------------------------------------
; lv3_left_subroutine (11 lines)
; HL = HPOS
;----------------------------------------
lv3_left_subroutine:
  DEC (hl)                      ;
  INC hl                        ;
  INC hl                        ;
  DEC (hl)                      ;
  INC hl                        ;
  INC hl                        ;
  DEC (hl)                      ;
  INC hl                        ;
  INC hl                        ;
  DEC (hl)                      ;
  
  RET                           ; End subroutine 
;----------------------------------------

;----------------------------------------
; copy_4_vpos_lv3 (8 lines)
;
; HL = source
; DE = destination
;----------------------------------------
copy_4_vpos_lv3:
  LD b, 4            ;
copy_4_vpos_lv3_loop:
  LD a, (hl)         ; 
  LD (de), a         ; 
  INC hl             ;
  INC de             ;
  DEC b              ;
  JP NZ, copy_4_vpos_lv3_loop ;

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

;----------------------------------------
; copy_4_hpos_lv3 (10 lines)
;
; HL = source
; DE = destination
;----------------------------------------
copy_4_hpos_lv3:
  LD b, 4            ;
copy_4_hpos_lv3_loop:
  LD a, (hl)         ; 
  LD (de), a         ; 
  INC hl             ;
  INC de             ;
  INC hl             ;
  INC de             ;
  DEC b              ;
  JP NZ, copy_4_hpos_lv3_loop ;

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

;----------------------------------------
; set_flame_sprites_lv3 (49 lines)
;
; HL = destination
;----------------------------------------
set_flame_sprites_lv3:
  INC hl                        ;

  LD a, (RAM_FRAME_CTR)         ;
  AND $30                       ;
  CP $00                        ;
  JP Z, flame_1_000             ;
  CP $20                        ;
  JP Z, flame_1_001             ;

  LD a, $0E                     ;; 0E 0F 27 28
  LD (hl), a                    ;
  INC hl                        ;
  INC hl                        ;
  LD a, $0F                     ;; 0E 0F 27 28
  LD (hl), a                    ;
  INC hl                        ;
  INC hl                        ;
  LD a, $27                     ;; 0E 0F 27 28
  LD (hl), a                    ;
  INC hl                        ;
  INC hl                        ;
  LD a, $28                     ;; 0E 0F 27 28
  LD (hl), a                    ;
  JP sfslv3_end                 ;

flame_1_000:
  LD a, $10                     ;; 10 11 29 2A
  LD (hl), a                    ;
  INC hl                        ;
  INC hl                        ;
  LD a, $11                     ;; 10 11 29 2A
  LD (hl), a                    ;
  INC hl                        ;
  INC hl                        ;
  LD a, $29                     ;  10 11 29 2A
  LD (hl), a                    ;
  INC hl                        ;
  INC hl                        ;
  LD a, $2A                     ;; 10 11 29 2A
  LD (hl), a                    ;
  JP sfslv3_end                 ;

flame_1_001:
  LD a, $12                     ;; 12 13 2B 2C
  LD (hl), a                    ;
  INC hl                        ;
  INC hl                        ;
  LD a, $13                     ;; 12 13 2B 2C
  LD (hl), a                    ;
  INC hl                        ;
  INC hl                        ;
  LD a, $2B                     ;; 12 13 2B 2C
  LD (hl), a                    ;
  INC hl                        ;
  INC hl                        ;
  LD a, $2C                     ;; 12 13 2B 2C
  LD (hl), a                    ;

sfslv3_end:
  RET                           ; End subroutine 
;----------------------------------------


;-----------------------------------------
; lv3_collision_detect (135 lines)
;
; Did the light gun hit a target?
;
; RAM_COLL_X1
; RAM_COLL_X2
; RAM_COLL_Y1
; RAM_COLL_Y2
; RAM_COLL_RESULT
; CALL xy_collision_detect
;-----------------------------------------
lv3_collision_detect:
  LD a, (RAM_LIGHT_GUN_READ)    ; Only detect when 
  CP $7F                        ; trigger is pulled.
  JP NZ, lv3_cd_skip_009        ;

  LD a, (RAM_VPOS + 8)          ;
  LD (RAM_COLL_Y1), a           ; Shot Y
  LD a, (RAM_HPOS + 16)         ;
  LD (RAM_COLL_X1), a           ; Shot X

; Foe 1
  LD a, (RAM_FOE_1_COUNT)       ; Hit occured in this frame 
  CP 0                          ;
  JP NZ, lv3_cd_skip_002        ;

  LD a, (RAM_VPOS + 12)         ;
  LD (RAM_COLL_Y2), a           ; Foe 1 Y
  LD a, (RAM_HPOS + 24)         ;
  LD (RAM_COLL_X2), a           ; Foe 1 X
  CALL xy_collision_detect      ;

  LD a, (RAM_COLL_RESULT)       ; Hit? 
  CP $7F                        ;
  JP NZ, lv3_cd_skip_002        ;
  LD a, 240                     ; If hit, set respawn counter
  LD (RAM_FOE_1_COUNT), a       ;
  CALL  ds_lv3_add_to_score     ;
  LD hl, RAM_HPOS + 24          ;
  CALL ds_lv3_set_sprite        ;

lv3_cd_skip_002:
; Foe 2
  LD a, (RAM_FOE_2_COUNT)       ; Hit occured in this frame 
  CP 0                          ;
  JP NZ, lv3_cd_skip_003        ;

  LD a, (RAM_VPOS + 16)         ;
  LD (RAM_COLL_Y2), a           ; Foe 2 Y
  LD a, (RAM_HPOS + 32)         ;
  LD (RAM_COLL_X2), a           ; Foe 2 X
  CALL xy_collision_detect      ;

  LD a, (RAM_COLL_RESULT)       ; Hit? 
  CP $7F                        ;
  JP NZ, lv3_cd_skip_003        ;
  LD a, 240                     ; If hit, set respawn counter
  LD (RAM_FOE_2_COUNT), a       ;
  CALL  ds_lv3_add_to_score     ;
  LD hl, RAM_HPOS + 32          ;
  CALL ds_lv3_set_sprite        ;

lv3_cd_skip_003:
; Foe 3
  LD a, (RAM_FOE_3_COUNT)       ; Hit occured in this frame 
  CP 0                          ;
  JP NZ, lv3_cd_skip_004        ;

  LD a, (RAM_VPOS + 20)         ;
  LD (RAM_COLL_Y2), a           ; Foe 3 Y
  LD a, (RAM_HPOS + 40)         ;
  LD (RAM_COLL_X2), a           ; Foe 3 X
  CALL xy_collision_detect      ;

  LD a, (RAM_COLL_RESULT)       ; Hit? 
  CP $7F                        ;
  JP NZ, lv3_cd_skip_004        ;
  LD a, 240                     ; If hit, set respawn counter
  LD (RAM_FOE_3_COUNT), a       ;
  CALL  ds_lv3_add_to_score     ;
  LD hl, RAM_HPOS + 40          ;
  CALL ds_lv3_set_sprite        ;

lv3_cd_skip_004:
; Foe 4
  LD a, (RAM_FOE_4_COUNT)       ; Hit occured in this frame 
  CP 0                          ;
  JP NZ, lv3_cd_skip_005        ;

  LD a, (RAM_VPOS + 24)         ;
  LD (RAM_COLL_Y2), a           ; Foe 4 Y
  LD a, (RAM_HPOS + 48)         ;
  LD (RAM_COLL_X2), a           ; Foe 4 X
  CALL xy_collision_detect      ;

  LD a, (RAM_COLL_RESULT)       ; Hit? 
  CP $7F                        ;
  JP NZ, lv3_cd_skip_005        ;
  LD a, 240                     ; If hit, set respawn counter
  LD (RAM_FOE_4_COUNT), a       ;
  CALL  ds_lv3_add_to_score     ;
  LD hl, RAM_HPOS + 48          ;
  CALL ds_lv3_set_sprite        ;

lv3_cd_skip_005:
; Foe 5
  LD a, (RAM_FOE_5_COUNT)       ; Hit occured in this frame 
  CP 0                          ;
  JP NZ, lv3_cd_skip_006        ;

  LD a, (RAM_VPOS + 28)         ;
  LD (RAM_COLL_Y2), a           ; Foe 5 Y
  LD a, (RAM_HPOS + 56)         ;
  LD (RAM_COLL_X2), a           ; Foe 5 X
  CALL xy_collision_detect      ;

  LD a, (RAM_COLL_RESULT)       ; Hit? 
  CP $7F                        ;
  JP NZ, lv3_cd_skip_006        ;
  LD a, 240                     ; If hit, set respawn counter
  LD (RAM_FOE_5_COUNT), a       ;
  CALL  ds_lv3_add_to_score     ;
  LD hl, RAM_HPOS + 56          ;
  CALL ds_lv3_set_sprite        ;

lv3_cd_skip_006:
; Foe 6
  LD a, (RAM_FOE_6_COUNT)       ; Hit occured in this frame 
  CP 0                          ;
  JP NZ, lv3_cd_skip_007        ;

  LD a, (RAM_VPOS + 32)         ;
  LD (RAM_COLL_Y2), a           ; Foe 6 Y
  LD a, (RAM_HPOS + 64)         ;
  LD (RAM_COLL_X2), a           ; Foe 6 X
  CALL xy_collision_detect      ;

  LD a, (RAM_COLL_RESULT)       ; Hit? 
  CP $7F                        ;
  JP NZ, lv3_cd_skip_007        ;
  LD a, 240                     ; If hit, set respawn counter
  LD (RAM_FOE_6_COUNT), a       ;
  CALL  ds_lv3_add_to_score     ;
  LD hl, RAM_HPOS + 64          ;
  CALL ds_lv3_set_sprite        ;

lv3_cd_skip_007:
; Foe 7
  LD a, (RAM_FOE_7_COUNT)       ; Hit occured in this frame 
  CP 0                          ;
  JP NZ, lv3_cd_skip_008        ;

  LD a, (RAM_VPOS + 36)         ;
  LD (RAM_COLL_Y2), a           ; Foe 7 Y
  LD a, (RAM_HPOS + 72)         ;
  LD (RAM_COLL_X2), a           ; Foe 7 X
  CALL xy_collision_detect      ;

  LD a, (RAM_COLL_RESULT)       ; Hit? 
  CP $7F                        ;
  JP NZ, lv3_cd_skip_008        ;
  LD a, 240                     ; If hit, set respawn counter
  LD (RAM_FOE_7_COUNT), a       ;
  CALL  ds_lv3_add_to_score     ;
  LD hl, RAM_HPOS + 72          ;
  CALL ds_lv3_set_sprite        ;

lv3_cd_skip_008:
; Foe 8
  LD a, (RAM_FOE_8_COUNT)       ; Hit occured in this frame 
  CP 0                          ;
  JP NZ, lv3_cd_skip_009        ;

  LD a, (RAM_VPOS + 40)         ;
  LD (RAM_COLL_Y2), a           ; Foe 8 Y
  LD a, (RAM_HPOS + 80)         ;
  LD (RAM_COLL_X2), a           ; Foe 8 X
  CALL xy_collision_detect      ;

  LD a, (RAM_COLL_RESULT)       ; Hit? 
  CP $7F                        ;
  JP NZ, lv3_cd_skip_009        ;
  LD a, 240                     ; If hit, set respawn counter
  LD (RAM_FOE_8_COUNT), a       ;
  CALL  ds_lv3_add_to_score     ;
  LD hl, RAM_HPOS + 80          ;
  CALL ds_lv3_set_sprite        ;

lv3_cd_skip_009:
  RET                           ; End subroutine 
;----------------------------------------


;----------------------------------------
; ds_lv3_set_sprite (17 lines)
;
; Set sprite to "1".
;----------------------------------------
; HL = target address
ds_lv3_set_sprite:
  INC hl                        ;
  LD a, $37                     ;; 37 38 42 43
  LD (hl), a                    ;
  INC hl                        ;
  INC hl                        ;
  LD a, $38                     ;; 37 38 42 43
  LD (hl), a                    ;
  INC hl                        ;
  INC hl                        ;
  LD a, $42                     ;; 37 38 42 43
  LD (hl), a                    ;
  INC hl                        ;
  INC hl                        ;
  LD a, $43                     ;; 37 38 42 43
  LD (hl), a                    ;

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

;----------------------------------------
; ds_lv3_add_to_score (16  lines)
;
; Increment the score by 10.
;----------------------------------------
ds_lv3_add_to_score:
  LD b, 7                       ;
  LD hl, RAM_SCORE_6            ; LSD
  INC (hl)                      ;

  LD a, (hl)                    ;
  CP 10                         ; 10 = 1, 0
  JP NZ, ds_lv3_add_to_score_end ;

ds_lv3_add_to_score_loop:
  LD a, 0                       ; 
  LD (hl), a                    ;

  DEC hl                        ; Next digit
  INC (hl)                      ;

  LD a, (hl)                    ;
  CP 10                         ; 10 = 1, 0
  JP NZ, ds_lv3_add_to_score_end ;

  DEC b                         ;
  JP NZ, ds_lv3_add_to_score_loop ;
 
ds_lv3_add_to_score_end:
  RET                           ; End subroutine 
;----------------------------------------


;----------------------------------------
; pig_got_hit_lv3 (149 lines) 
;
; Did pig get hit?
;    Decrement health
;    Set pig invincibility counter
;    Decrement counter
;    If counter is 0, can get hit again
;----------------------------------------
pig_got_hit_lv3:
  LD a, (RAM_VPOS + 1)          ;
  LD (RAM_COLL_Y1), a           ; Pig Y
  LD a, (RAM_HPOS + 2)          ;
  LD (RAM_COLL_X1), a           ; Pig X

;-----------------------------------
; Foe 1
  LD a, (RAM_FOE_1_COUNT)       ; Hit occured in this frame 
  CP 0                          ;
  JP NZ, pghlv3_skip_002        ;

  LD a, (RAM_VPOS + 12)         ;
  LD (RAM_COLL_Y2), a           ; Foe 1 Y
  LD a, (RAM_HPOS + 24)         ;
  LD (RAM_COLL_X2), a           ; Foe 1 X
  CALL xy_collision_detect16    ;

  LD a, (RAM_COLL_RESULT)       ; Hit? 
  CP $7F                        ;
  JP NZ, pghlv3_skip_002        ;

  CALL decrement_health_lv3     ;
  LD hl, vpos_sprites_level_3 + 12 ; Y respawn
  LD de, RAM_VPOS + 12          ;
  CALL copy_4_vpos_lv3          ;
  LD hl, hpos_sprites_level_3 + 24 ; X respawn
  LD de, RAM_HPOS + 24          ;
  CALL copy_4_hpos_lv3          ;
pghlv3_skip_002:

;-----------------------------------
; Foe 2
  LD a, (RAM_FOE_2_COUNT)       ; Hit occured in this frame 
  CP 0                          ;
  JP NZ, pghlv3_skip_003        ;

  LD a, (RAM_VPOS + 16)         ;
  LD (RAM_COLL_Y2), a           ; Foe 1 Y
  LD a, (RAM_HPOS + 32)         ;
  LD (RAM_COLL_X2), a           ; Foe 1 X
  CALL xy_collision_detect16    ;

  LD a, (RAM_COLL_RESULT)       ; Hit? 
  CP $7F                        ;
  JP NZ, pghlv3_skip_003        ;

  CALL decrement_health_lv3     ;
  LD hl, vpos_sprites_level_3 + 16 ; Y respawn
  LD de, RAM_VPOS + 16          ;
  CALL copy_4_vpos_lv3          ;
  LD hl, hpos_sprites_level_3 + 32 ; X respawn
  LD de, RAM_HPOS + 32          ;
  CALL copy_4_hpos_lv3          ;
pghlv3_skip_003:

;-----------------------------------
; Foe 3
  LD a, (RAM_FOE_3_COUNT)       ; Hit occured in this frame 
  CP 0                          ;
  JP NZ, pghlv3_skip_004        ;

  LD a, (RAM_VPOS + 20)         ;
  LD (RAM_COLL_Y2), a           ; Foe 1 Y
  LD a, (RAM_HPOS + 40)         ;
  LD (RAM_COLL_X2), a           ; Foe 1 X
  CALL xy_collision_detect16    ;

  LD a, (RAM_COLL_RESULT)       ; Hit? 
  CP $7F                        ;
  JP NZ, pghlv3_skip_004        ;

  CALL decrement_health_lv3     ;
  LD hl, vpos_sprites_level_3 + 20 ; Y respawn
  LD de, RAM_VPOS + 20          ;
  CALL copy_4_vpos_lv3          ;
  LD hl, hpos_sprites_level_3 + 40 ; X respawn
  LD de, RAM_HPOS + 40          ;
  CALL copy_4_hpos_lv3          ;
pghlv3_skip_004:

;-----------------------------------
; Foe 4
  LD a, (RAM_FOE_4_COUNT)       ; Hit occured in this frame 
  CP 0                          ;
  JP NZ, pghlv3_skip_005        ;

  LD a, (RAM_VPOS + 24)         ;
  LD (RAM_COLL_Y2), a           ; Foe 1 Y
  LD a, (RAM_HPOS + 48)         ;
  LD (RAM_COLL_X2), a           ; Foe 1 X
  CALL xy_collision_detect16    ;

  LD a, (RAM_COLL_RESULT)       ; Hit? 
  CP $7F                        ;
  JP NZ, pghlv3_skip_005        ;

  CALL decrement_health_lv3     ;
  LD hl, vpos_sprites_level_3 + 24 ; Y respawn
  LD de, RAM_VPOS + 24          ;
  CALL copy_4_vpos_lv3          ;
  LD hl, hpos_sprites_level_3 + 48 ; X respawn
  LD de, RAM_HPOS + 48          ;
  CALL copy_4_hpos_lv3          ;
pghlv3_skip_005:

;-----------------------------------
; Foe 5
  LD a, (RAM_FOE_5_COUNT)       ; Hit occured in this frame 
  CP 0                          ;
  JP NZ, pghlv3_skip_006        ;

  LD a, (RAM_VPOS + 28)         ;
  LD (RAM_COLL_Y2), a           ; Foe 1 Y
  LD a, (RAM_HPOS + 56)         ;
  LD (RAM_COLL_X2), a           ; Foe 1 X
  CALL xy_collision_detect16    ;

  LD a, (RAM_COLL_RESULT)       ; Hit? 
  CP $7F                        ;
  JP NZ, pghlv3_skip_006        ;

  CALL decrement_health_lv3     ;
  LD hl, vpos_sprites_level_3 + 28 ; Y respawn
  LD de, RAM_VPOS + 28          ;
  CALL copy_4_vpos_lv3          ;
  LD hl, hpos_sprites_level_3 + 56 ; X respawn
  LD de, RAM_HPOS + 56          ;
  CALL copy_4_hpos_lv3          ;
pghlv3_skip_006:

;-----------------------------------
; Foe 6
  LD a, (RAM_FOE_6_COUNT)       ; Hit occured in this frame 
  CP 0                          ;
  JP NZ, pghlv3_skip_007        ;

  LD a, (RAM_VPOS + 32)         ;
  LD (RAM_COLL_Y2), a           ; Foe 1 Y
  LD a, (RAM_HPOS + 64)         ;
  LD (RAM_COLL_X2), a           ; Foe 1 X
  CALL xy_collision_detect16    ;

  LD a, (RAM_COLL_RESULT)       ; Hit? 
  CP $7F                        ;
  JP NZ, pghlv3_skip_007        ;

  CALL decrement_health_lv3     ;
  LD hl, vpos_sprites_level_3 + 32 ; Y respawn
  LD de, RAM_VPOS + 32          ;
  CALL copy_4_vpos_lv3          ;
  LD hl, hpos_sprites_level_3 + 64 ; X respawn
  LD de, RAM_HPOS + 64          ;
  CALL copy_4_hpos_lv3          ;
pghlv3_skip_007:

;-----------------------------------
; Foe 7
  LD a, (RAM_FOE_7_COUNT)       ; Hit occured in this frame 
  CP 0                          ;
  JP NZ, pghlv3_skip_008        ;

  LD a, (RAM_VPOS + 36)         ;
  LD (RAM_COLL_Y2), a           ; Foe 1 Y
  LD a, (RAM_HPOS + 72)         ;
  LD (RAM_COLL_X2), a           ; Foe 1 X
  CALL xy_collision_detect16    ;

  LD a, (RAM_COLL_RESULT)       ; Hit? 
  CP $7F                        ;
  JP NZ, pghlv3_skip_008        ;

  CALL decrement_health_lv3     ;
  LD hl, vpos_sprites_level_3 + 36 ; Y respawn
  LD de, RAM_VPOS + 36          ;
  CALL copy_4_vpos_lv3          ;
  LD hl, hpos_sprites_level_3 + 72 ; X respawn
  LD de, RAM_HPOS + 72          ;
  CALL copy_4_hpos_lv3          ;
pghlv3_skip_008:

;-----------------------------------
; Foe 8
  LD a, (RAM_FOE_8_COUNT)       ; Hit occured in this frame 
  CP 0                          ;
  JP NZ, pghlv3_skip_009        ;

  LD a, (RAM_VPOS + 40)         ;
  LD (RAM_COLL_Y2), a           ; Foe 1 Y
  LD a, (RAM_HPOS + 80)         ;
  LD (RAM_COLL_X2), a           ; Foe 1 X
  CALL xy_collision_detect16    ;

  LD a, (RAM_COLL_RESULT)       ; Hit? 
  CP $7F                        ;
  JP NZ, pghlv3_skip_009        ;

  CALL decrement_health_lv3     ;
  LD hl, vpos_sprites_level_3 + 40 ; Y respawn
  LD de, RAM_VPOS + 40          ;
  CALL copy_4_vpos_lv3          ;
  LD hl, hpos_sprites_level_3 + 80 ; X respawn
  LD de, RAM_HPOS + 80          ;
  CALL copy_4_hpos_lv3          ;
pghlv3_skip_009:

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

;----------------------------------------
; decrement_health_lv3 (15 lines)
;
; Health goes down by 1.
;----------------------------------------
decrement_health_lv3:
  LD a, (RAM_PIG_BLINK)      ;
  CP $00                     ;
  JP NZ, dhlv3_skip_000      ;

  CALL copy_song_to_RAM004   ; Ouch

  LD a, (RAM_HEALTH_1)       ; Health 1
  DEC a                      ;
  CP $00                     ; At 0 health?
  JP Z, dhlv3_game_over      ;
  LD (RAM_HEALTH_1), a       ;
  LD a, 60                   ; 2 second pig blink
  LD (RAM_PIG_BLINK), a      ;
  JP  dhlv3_skip_000         ;

dhlv3_game_over
  LD a, STATE_GAME_OVER      ;
  LD (RAM_GAME_STATE), a     ;
dhlv3_skip_000:
  RET                        ; End subroutine 
;----------------------------------------

background_003:
.include "ppolis_level3_BG.inc"

tiles_003:
.include "ppolis_level3_T.inc"

