
;----------------------------------------------------------
; level_1_load (27 lines)
level_1_load_001:
   PUSH AF                     ;

   CALL VDP_off                ; Stop VDP

   CALL load_tile_data_001     ; Load tiles
   CALL load_bg_data_001       ; Load background
   CALL load_palette_data_001  ; Load palette
   CALL initialize_score_bg    ; Set up background in RAM
   CALL set_initial_sprites_level_1 ; Set up sprites
   CALL sprites_to_VRAM        ;

   LD a, STATE_LEVEL_1_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_1_HEALTH        ; 9 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_1_run_001 (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_1_run_001:

; 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
   CALL level_1_color_blink    ;

; Run everything that does not use VRAM
   CALL set_score_level_1      ; Set the score in RAM
   CALL run_timer_level_1      ; Count down to 00. At 00, go to next level.
   CALL pig_flight_level_1     ; Flap pig wings
   CALL move_foes_level_1      ; Move the foes
   CALL lv1_collision_detect   ; Shot hit foe?
   CALL pig_got_hit_lv1        ; Pig got hit?

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

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

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

   LD e, 175                   ; Set up counter (350 tiles, 175 sets of 2 tiles)

tile_load_loopt1:
   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_loopt1     ; Loop until de is empty.

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

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

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

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

tile_load_loopbg1:
   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_loopbg1    ; Loop until de is empty.

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

;----------------------------------------------------------
; load_palette_data_001 (12 lines)
;
; Load palette data.
;----------------------------------------------------------
load_palette_data_001:
   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  
;---------------------------------------

;----------------------------------------------------------
; level_1_bgfx_001 ( lines)
;
; Scanline effects for level 1.
; * Moon slow move
;----------------------------------------------------------
level_1_bgfx_001:
; Chose effect based on raster line
   PUSH AF                     ;

   LD a, (RAM_RASTER_LINE)     ; Read scanline
   CP 30                       ; Slow scroll
   CALL Z, bgfx_001_scroll_001 ;

level_1_bgfx_001_end:          ;
   POP AF                      ;
   RET                         ; End subroutine  

bgfx_001_scroll_001:
   PUSH AF                    ;
   LD a, (RAM_SCROLL_CTR)     ; Slow scroll
   OUT (VDP_ADDR),a           ; 
   LD a,$88                   ; R8 is horizontal scroll
   OUT (VDP_ADDR),a           ;
   POP AF                     ;
   RET                        ; End subroutine  

;---------------------------------------

floor_wiggle:
.db 0, 2, 6, 10, 12, 14, 14, 16, 16
.db 16, 14, 14, 10, 12, 6, 2, 0
.db -2, -6, -10, -12, -14, -14, -16, -16
.db -16, -14, -14, -12, -10, -6, -2, 0

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

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

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

;---------------------------------------
; copy_score_bg (23 lines)
;
; Copy score data from RAM to background
;---------------------------------------
copy_score_bg:
; Copy row 1 or row 2?
   LD a, (RAM_FRAME_CTR)       ; Frame counter
   AND $01                     ; Mask all but last bit
   JP NZ, csbg_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 csbg_start_copy          ;
 
; Row 2
csbg_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

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

   RET                         ; End subroutine 

tool_copy_loop:
   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_loop      ; 

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

;---------------------------------------
; set_bg_numbers_level_1 (55 lines)
;
; Translate score to background info.
;
; 7 digits for score
; 1 digit for health
; 4 digits for time
;---------------------------------------
set_score_level_1:
   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_1 ;

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

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

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

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

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

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

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

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

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

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

;---------------------------------------
; number_to_score_level_1 (240 lines)
;
; C = number
; DE = location to write to
; HL = location to write to
;---------------------------------------
number_to_score_level_1:
   LD a, c                    ; Translate
   CP 0                       ;
   JP Z, ntsl1_0              ;
   LD a, c                    ; Translate
   CP 1                       ;
   JP Z, ntsl1_1              ;
   LD a, c                    ; Translate
   CP 2                       ;
   JP Z, ntsl1_2              ;
   LD a, c                    ; Translate
   CP 3                       ;
   JP Z, ntsl1_3              ;
   LD a, c                    ; Translate
   CP 4                       ;
   JP Z, ntsl1_4              ;
   LD a, c                    ; Translate
   CP 5                       ;
   JP Z, ntsl1_5              ;
   LD a, c                    ; Translate
   CP 6                       ;
   JP Z, ntsl1_6              ;
   LD a, c                    ; Translate
   CP 7                       ;
   JP Z, ntsl1_7              ;
   LD a, c                    ; Translate
   CP 8                       ;
   JP Z, ntsl1_8              ;
   LD a, c                    ; Translate
   CP 9                       ;
   JP Z, ntsl1_9              ;

ntsl1_0:
   LD a, $71                  ; 0
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $71                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $02                  ;
   LD (de), a                 ;

   LD a, $8D                  ; 0
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $8E                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   JP ntsl1_copy_end          ;

ntsl1_1:
   LD a, $72                  ; 1
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $73                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;

   LD a, $72                  ; 1
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $04                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $73                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $04                  ;
   LD (hl), a                 ;
   JP ntsl1_copy_end          ;

ntsl1_2:
   LD a, $74                  ; 2
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $75                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;

   LD a, $8F                  ; 2
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $90                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   JP ntsl1_copy_end          ;

ntsl1_3:
   LD a, $76                  ; 3
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $77                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;

   LD a, $91                  ; 3
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $92                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   JP ntsl1_copy_end          ;

ntsl1_4:
   LD a, $78                  ; 4
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $79                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;

   LD a, $93                  ; 4
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $94                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   JP ntsl1_copy_end          ;

ntsl1_5:
   LD a, $7A                  ; 5
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $7B                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;

   LD a, $95                  ; 5
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $96                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   JP ntsl1_copy_end          ;

ntsl1_6:
   LD a, $7C                  ; 6
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $7D                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;

   LD a, $97                  ; 6
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $98                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   JP ntsl1_copy_end          ;

ntsl1_7:
   LD a, $7E                  ; 7
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $7F                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;

   LD a, $99                  ; 7
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $9A                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   JP ntsl1_copy_end          ;

ntsl1_8:
   LD a, $80                  ; 8
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $81                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;

   LD a, $9B                  ; 8
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $9C                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   JP ntsl1_copy_end          ;

ntsl1_9:
   LD a, $82                  ; 9
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $83                  ;
   LD (de), a                 ;
   INC de                     ;
   LD a, $00                  ;
   LD (de), a                 ;

   LD a, $9D                  ; 9
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $9E                  ;
   LD (hl), a                 ;
   INC hl                     ;
   LD a, $00                  ;
   LD (hl), a                 ;

ntsl1_copy_end:
   RET                        ; End subroutine   
;---------------------------------------

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

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

   CP $FF                     ; at -1? 
   JP NZ, rtlv1_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, rtlv1_skip_000      ;

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

rtlv1_skip_000:
   RET                        ; End subroutine 
;---------------------------------------

;---------------------------------------
; set_initial_sprites_level_1 (17 lines)
;
; Copy initial sprite values to RAM.
;---------------------------------------
set_initial_sprites_level_1:
   LD hl, vpos_sprites_level_1 ; VPOS
   LD de, RAM_VPOS            ; 
   LD b, 45                   ;
   CALL sisl1_copy_loop       ;

   LD hl, hpos_sprites_level_1 ; HPOS, TILE
   LD de, RAM_HPOS            ; 
   LD b, 89                   ;
   CALL sisl1_copy_loop       ;

   RET                        ; End subroutine 

sisl1_copy_loop:
   LD a, (hl)                 ; Read tile data
   LD (de), a                 ; Write to VRAM
   INC hl                     ; Increment hl
   INC de                     ; Increment de

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

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

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

   LD a, (RAM_FRAME_CTR)      ; Frame counter
   CP 0                       ; flap
   JP Z, pflv1_000            ;
   CP 15                      ; flap
   JP Z, pflv1_001            ;
   CP 30                      ; flap
   JP Z, pflv1_002            ;
   CP 45                      ; flap
   JP Z, pflv1_001            ;
   JP pflv1_end               ;

; High wing
pflv1_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, $1F                  ;
   LD (RAM_HPOS + 9), a       ;
   LD a, $20                  ;
   LD (RAM_HPOS + 11), a      ;
   LD a, $21                  ;
   LD (RAM_HPOS + 13), a      ;
   LD a, $00                  ;
   LD (RAM_HPOS + 15), a      ;
   JP pflv1_end               ;

; Middle wing
pflv1_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, $22                  ;
   LD (RAM_HPOS + 9), a       ;
   LD a, $23                  ;
   LD (RAM_HPOS + 11), a      ;
   LD a, $21                  ;
   LD (RAM_HPOS + 13), a      ;
   LD a, $00                  ;
   LD (RAM_HPOS + 15), a      ;
   JP pflv1_end               ;

; Low wing
pflv1_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, $24                  ;
   LD (RAM_HPOS + 9), a       ;
   LD a, $25                  ;
   LD (RAM_HPOS + 11), a      ;
   LD a, $21                  ;
   LD (RAM_HPOS + 13), a      ;
   LD a, $00                  ;
   LD (RAM_HPOS + 15), a      ;
   JP pflv1_end               ;

pflv1_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, $26                  ;
   LD (RAM_HPOS + 11), a      ;
   LD a, $27                  ;
   LD (RAM_HPOS + 13), a      ;
   LD a, $00                  ;
   LD (RAM_HPOS + 15), a      ;
pflv1_end:
   RET                        ; End subroutine 
;---------------------------------------

;---------------------------------------
vpos_sprites_level_1:
.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 $E0 ; Foe 1 12
.db $E0 ;
.db $E8 ;
.db $E8 ;
.db $E0 ; Foe 2 16
.db $E0 ;
.db $E8 ;
.db $E8 ;
.db $E0 ; Foe 3 20
.db $E0 ;
.db $E8 ;
.db $E8 ;
.db $E0 ; Foe 4 24
.db $E0 ;
.db $E8 ;
.db $E8 ;
.db $40 ; Foe 5 28
.db $40 ;
.db $48 ;
.db $48 ;
.db $60 ; Foe 6 32
.db $60 ;
.db $68 ;
.db $68 ;
.db $80 ; Foe 7 36
.db $80 ;
.db $88 ;
.db $88 ;
.db $A0 ; Foe 8 40
.db $A0 ;
.db $A8 ;
.db $A8 ;
.db $D0 ; Delimiter

hpos_sprites_level_1:
.db $70, $01 ; Pig 00
.db $78, $02 ;
.db $80, $03 ;
.db $88, $04 ;
.db $70, $1F ; 
.db $78, $20 ;
.db $80, $21 ;
.db $88, $00 ;
.db $00, $3F ; Shot 1 16
.db $08, $40 ;
.db $00, $59 ;
.db $08, $5A ;
.db $30, $00 ; Foe 1 24
.db $38, $00 ;
.db $30, $00 ;
.db $38, $00 ;
.db $80, $00 ; Foe 2 32
.db $88, $00 ;
.db $80, $00 ;
.db $88, $00 ;
.db $50, $00 ; Foe 3 40
.db $58, $00 ;
.db $50, $00 ;
.db $58, $00 ;
.db $B0, $00 ; Foe 4 48
.db $B8, $00 ;
.db $B0, $00 ;
.db $B8, $00 ;
.db $00, $00 ; Foe 5 56
.db $08, $00 ;
.db $00, $00 ;
.db $08, $00 ;
.db $00, $00 ; Foe 6 64
.db $08, $00 ;
.db $00, $00 ;
.db $08, $00 ;
.db $00, $00 ; Foe 7 72
.db $08, $00 ;
.db $00, $00 ;
.db $08, $00 ;
.db $00, $00 ; Foe 8 80
.db $08, $00 ;
.db $00, $00 ;
.db $08, $00 ;
.db $D0 ; Delimiter

;----------------------------------------
; move_foes_level_1 (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 - Spoon
; Foe 4 - Spoon
; Foe 5 - Cat head
; Foe 6 - Cat head
; Foe 7 - Cat head
; Foe 8 - Cat head
;----------------------------------------
move_foes_level_1:

; Foe 1 - Fork
  LD hl, RAM_FOE_1_COUNT        ;
  LD a, (hl)                    ; Termination counter expired? 
  CP $00                        ;
  JP NZ, mflv1_countdown_001    ;

  LD a, (RAM_SECOND_CTR)        ; Load state
  AND $03                       ;
  CP $00                        ; Go up
  JP Z, mflv1_up_001            ;
  CP $01                        ; Go right
  JP Z, mflv1_right_001         ;
  CP $02                        ; Go down
  JP Z, mflv1_up_001            ;
  CP $03                        ; Go left
  JP Z, mflv1_left_001          ;  

  JP mflv1_next_002             ; Go to next foe

mflv1_up_001:
  LD hl, RAM_VPOS + 12          ; Go up
  CALL lv1_up_subroutine        ;
  LD a, $16                     ;; 16 17 31 32
  LD (RAM_HPOS + 25), a         ;
  LD a, $17                     ;; 16 17 31 32
  LD (RAM_HPOS + 27), a         ;
  LD a, $31                     ;; 16 17 31 32
  LD (RAM_HPOS + 29), a         ;
  LD a, $32                     ;; 16 17 31 32
  LD (RAM_HPOS + 31), a         ;
  JP mflv1_next_002             ; Go to next foe

mflv1_right_001:
  LD hl, RAM_HPOS + 24          ; Go right
  CALL lv1_right_subroutine      ;
  LD a, $1C                     ;; 1C 1D 37 38
  LD (RAM_HPOS + 25), a         ;
  LD a, $1D                     ;; 1C 1D 37 38
  LD (RAM_HPOS + 27), a         ;
  LD a, $37                     ;; 1C 1D 37 38
  LD (RAM_HPOS + 29), a         ;
  LD a, $38                     ;; 1C 1D 37 38
  LD (RAM_HPOS + 31), a         ;
  JP mflv1_next_002             ; Go to next foe

mflv1_left_001:
  LD hl, RAM_HPOS + 24          ; Go left
  CALL lv1_left_subroutine      ;
  LD a, $1A                     ;; 1A 1B 35 36
  LD (RAM_HPOS + 25), a         ;
  LD a, $1B                     ;; 1A 1B 35 36
  LD (RAM_HPOS + 27), a         ;
  LD a, $35                     ;; 1A 1B 35 36
  LD (RAM_HPOS + 29), a         ;
  LD a, $36                     ;; 1A 1B 35 36
  LD (RAM_HPOS + 31), a         ;
  JP mflv1_next_002             ; Go to next foe

mflv1_countdown_001:
  DEC (hl)                      ; Decrement counter

  LD a, (hl)                    ; Respawn?
  CP $00                        ;
  JP NZ, mflv1_next_002         ;
  LD hl, vpos_sprites_level_1 + 12 ; Y respawn
  LD de, RAM_VPOS + 12          ;
  CALL copy_4_vpos_lv1          ;
  LD hl, hpos_sprites_level_1 + 24 ; X respawn
  LD de, RAM_HPOS + 24          ;
  CALL copy_4_hpos_lv1          ;

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

  LD a, (RAM_SECOND_CTR)        ; Load state
  AND $03                       ;
  CP $00                        ; Go up
  JP Z, mflv1_up_002            ;
  CP $01                        ; Go right
  JP Z, mflv1_left_002          ;
  CP $02                        ; Go down
  JP Z, mflv1_up_002            ;
  CP $03                        ; Go left
  JP Z, mflv1_right_002         ;  

  JP mflv1_next_003             ; Go to next foe

mflv1_up_002:
  LD hl, RAM_VPOS + 16          ; Go up
  CALL lv1_up_subroutine        ;
  LD a, $16                     ;; 16 17 31 32
  LD (RAM_HPOS + 33), a         ;
  LD a, $17                     ;; 16 17 31 32
  LD (RAM_HPOS + 35), a         ;
  LD a, $31                     ;; 16 17 31 32
  LD (RAM_HPOS + 37), a         ;
  LD a, $32                     ;; 16 17 31 32
  LD (RAM_HPOS + 39), a         ;
  JP mflv1_next_003             ; Go to next foe

mflv1_right_002:
  LD hl, RAM_HPOS + 32          ; Go right
  CALL lv1_right_subroutine      ;
  LD a, $1C                     ;; 1C 1D 37 38
  LD (RAM_HPOS + 33), a         ;
  LD a, $1D                     ;; 1C 1D 37 38
  LD (RAM_HPOS + 35), a         ;
  LD a, $37                     ;; 1C 1D 37 38
  LD (RAM_HPOS + 37), a         ;
  LD a, $38                     ;; 1C 1D 37 38
  LD (RAM_HPOS + 39), a         ;
  JP mflv1_next_003             ; Go to next foe

mflv1_left_002:
  LD hl, RAM_HPOS + 32          ; Go left
  CALL lv1_left_subroutine      ;
  LD a, $1A                     ;; 1A 1B 35 36
  LD (RAM_HPOS + 33), a         ;
  LD a, $1B                     ;; 1A 1B 35 36
  LD (RAM_HPOS + 35), a         ;
  LD a, $35                     ;; 1A 1B 35 36
  LD (RAM_HPOS + 37), a         ;
  LD a, $36                     ;; 1A 1B 35 36
  LD (RAM_HPOS + 39), a         ;
  JP mflv1_next_003             ; Go to next foe

mflv1_countdown_002:
  DEC (hl)                      ; Decrement counte
  LD a, (hl)                    ; Respawn?
  CP $00                        ;
  JP NZ, mflv1_next_003         ;
  LD hl, vpos_sprites_level_1 + 16 ; Y respawn
  LD de, RAM_VPOS + 16          ;
  CALL copy_4_vpos_lv1          ;
  LD hl, hpos_sprites_level_1 + 32 ; X respawn
  LD de, RAM_HPOS + 32          ;
  CALL copy_4_hpos_lv1          ;

;------------------------------------------
; Foe 3 - Spoon
mflv1_next_003:

  LD hl, RAM_FOE_3_COUNT        ;
  LD a, (hl)                    ; Termination counter expired? 
  CP $00                        ;
  JP NZ, mflv1_countdown_003    ;

  LD a, (RAM_SECOND_CTR)        ; Load state
  AND $03                       ;
  CP $00                        ; Go up
  JP Z, mflv1_down_003          ;
  CP $01                        ; Go right
  JP Z, mflv1_right_003         ;
  CP $02                        ; Go down
  JP Z, mflv1_down_003          ;
  CP $03                        ; Go left
  JP Z, mflv1_left_003          ;  

  JP mflv1_next_003             ; Go to next foe

mflv1_down_003:
  LD hl, RAM_VPOS + 20          ; Go up
  CALL lv1_down_subroutine      ;
  LD a, $43                     ;; 43 44 5d 5e
  LD (RAM_HPOS + 41), a         ;
  LD a, $44                     ;; 43 44 5d 5e
  LD (RAM_HPOS + 43), a         ;
  LD a, $5D                     ;; 43 44 5d 5e
  LD (RAM_HPOS + 45), a         ;
  LD a, $5E                     ;; 43 44 5d 5e
  LD (RAM_HPOS + 47), a         ;
  JP mflv1_next_004             ; Go to next foe

mflv1_right_003:
  LD hl, RAM_HPOS + 40          ; Go right
  CALL lv1_right_subroutine      ;
  LD a, $47                     ;; 47 48 61 62
  LD (RAM_HPOS + 41), a         ;
  LD a, $48                     ;; 47 48 61 62
  LD (RAM_HPOS + 43), a         ;
  LD a, $61                     ;; 47 48 61 62
  LD (RAM_HPOS + 45), a         ;
  LD a, $62                     ;; 47 48 61 62
  LD (RAM_HPOS + 47), a         ;
  JP mflv1_next_004             ; Go to next foe

mflv1_left_003:
  LD hl, RAM_HPOS + 40          ; Go left
  CALL lv1_left_subroutine      ;
  LD a, $45                     ;; 45 46 5F 60
  LD (RAM_HPOS + 41), a         ;
  LD a, $46                     ;; 45 46 5F 60
  LD (RAM_HPOS + 43), a         ;
  LD a, $5F                     ;; 45 46 5F 60
  LD (RAM_HPOS + 45), a         ;
  LD a, $60                     ;; 45 46 5F 60
  LD (RAM_HPOS + 47), a         ;
  JP mflv1_next_004             ; Go to next foe

mflv1_countdown_003:
  DEC (hl)                      ; Decrement counter
  LD a, (hl)                    ; Respawn?
  CP $00                        ;
  JP NZ, mflv1_next_004         ;
  LD hl, vpos_sprites_level_1 + 20 ; Y respawn
  LD de, RAM_VPOS + 20          ;
  CALL copy_4_vpos_lv1          ;
  LD hl, hpos_sprites_level_1 + 40 ; X respawn
  LD de, RAM_HPOS + 40          ;
  CALL copy_4_hpos_lv1          ;

;------------------------------------------
; Foe 4 - Spoon
mflv1_next_004:

  LD hl, RAM_FOE_4_COUNT        ;
  LD a, (hl)                    ; Termination counter expired? 
  CP $00                        ;
  JP NZ, mflv1_countdown_004    ;

  LD a, (RAM_SECOND_CTR)        ; Load state
  AND $03                       ;
  CP $00                        ; Go up
  JP Z, mflv1_down_004          ;
  CP $01                        ; Go right
  JP Z, mflv1_left_004          ;
  CP $02                        ; Go down
  JP Z, mflv1_down_004          ;
  CP $03                        ; Go left
  JP Z, mflv1_right_004         ;  

  JP mflv1_next_005             ; Go to next foe

mflv1_down_004:
  LD hl, RAM_VPOS + 24          ; Go up
  CALL lv1_down_subroutine      ;
  LD a, $43                     ;; 43 44 5d 5e
  LD (RAM_HPOS + 49), a         ;
  LD a, $44                     ;; 43 44 5d 5e
  LD (RAM_HPOS + 51), a         ;
  LD a, $5D                     ;; 43 44 5d 5e
  LD (RAM_HPOS + 53), a         ;
  LD a, $5E                     ;; 43 44 5d 5e
  LD (RAM_HPOS + 55), a         ;
  JP mflv1_next_005             ; Go to next foe

mflv1_right_004:
  LD hl, RAM_HPOS + 48          ; Go right
  CALL lv1_right_subroutine      ;
  LD a, $47                     ;; 47 48 61 62
  LD (RAM_HPOS + 49), a         ;
  LD a, $48                     ;; 47 48 61 62
  LD (RAM_HPOS + 51), a         ;
  LD a, $61                     ;; 47 48 61 62
  LD (RAM_HPOS + 53), a         ;
  LD a, $62                     ;; 47 48 61 62
  LD (RAM_HPOS + 55), a         ;
  JP mflv1_next_005             ; Go to next foe

mflv1_left_004:
  LD hl, RAM_HPOS + 48          ; Go left
  CALL lv1_left_subroutine      ;
  LD a, $45                     ;; 45 46 5F 60
  LD (RAM_HPOS + 49), a         ;
  LD a, $46                     ;; 45 46 5F 60
  LD (RAM_HPOS + 51), a         ;
  LD a, $5F                     ;; 45 46 5F 60
  LD (RAM_HPOS + 53), a         ;
  LD a, $60                     ;; 45 46 5F 60
  LD (RAM_HPOS + 55), a         ;
  JP mflv1_next_005             ; Go to next foe

mflv1_countdown_004:
  DEC (hl)                      ; Decrement counter
  LD a, (hl)                    ; Respawn?
  CP $00                        ;
  JP NZ, mflv1_next_005         ;
  LD hl, vpos_sprites_level_1 + 24 ; Y respawn
  LD de, RAM_VPOS + 24          ;
  CALL copy_4_vpos_lv1          ;
  LD hl, hpos_sprites_level_1 + 48 ; X respawn
  LD de, RAM_HPOS + 48          ;
  CALL copy_4_hpos_lv1          ;

;------------------------------------
; Foe 5 - Cat head
mflv1_next_005:
  LD hl, RAM_FOE_5_COUNT        ;
  LD a, (hl)                    ; Termination counter expired? 
  CP $00                        ;
  JP NZ, mflv1_countdown_005    ;

  LD a, (RAM_SECOND_CTR)        ; Load state
  AND $01                       ;
  CP $00                        ;
  JP Z, mflv1_down_005          ;
  CP $01                        ;
  JP Z, mflv1_up_005            ;

mflv1_down_005:
  LD hl, RAM_VPOS + 28          ; Vertical 
  CALL lv1_down_subroutine      ;
  LD hl, RAM_HPOS + 56          ; Horizontal 
  CALL lv1_right_subroutine     ;
  LD a, $0E                     ;; 0E 0F 29 2A
  LD (RAM_HPOS + 57), a         ;
  LD a, $0F                     ;; 0E 0F 29 2A
  LD (RAM_HPOS + 59), a         ;
  LD a, $29                     ;; 0E 0F 29 2A
  LD (RAM_HPOS + 61), a         ;
  LD a, $2A                     ;; 0E 0F 29 2A
  LD (RAM_HPOS + 63), a         ;
  JP mflv1_next_006             ; Go to next foe

mflv1_up_005:
  LD hl, RAM_VPOS + 28          ; Vertical 
  CALL lv1_up_subroutine        ;
  LD hl, RAM_HPOS + 56          ; Horizontal 
  CALL lv1_right_subroutine     ;
  LD a, $10                     ;; 10 11 2B 2C
  LD (RAM_HPOS + 57), a         ;
  LD a, $11                     ;; 10 11 2B 2C
  LD (RAM_HPOS + 59), a         ;
  LD a, $2B                     ;; 10 11 2B 2C
  LD (RAM_HPOS + 61), a         ;
  LD a, $2C                     ;; 10 11 2B 2C
  LD (RAM_HPOS + 63), a         ;
  JP mflv1_next_006             ; Go to next foe

mflv1_countdown_005:
  DEC (hl)                      ; Decrement counter
  LD a, (hl)                    ; Respawn?
  CP $00                        ;
  JP NZ, mflv1_next_006         ;
  LD hl, vpos_sprites_level_1 + 28 ; Y respawn
  LD de, RAM_VPOS + 28          ;
  CALL copy_4_vpos_lv1          ;
  LD hl, hpos_sprites_level_1 + 56 ; X respawn
  LD de, RAM_HPOS + 56          ;
  CALL copy_4_hpos_lv1          ;

;------------------------------------
; Foe 6 - Cat head
mflv1_next_006:
  LD hl, RAM_FOE_6_COUNT        ;
  LD a, (hl)                    ; Termination counter expired? 
  CP $00                        ;
  JP NZ, mflv1_countdown_006    ;

  LD a, (RAM_SECOND_CTR)        ; Load state
  AND $01                       ;
  CP $00                        ;
  JP Z, mflv1_up_006            ;
  CP $01                        ;
  JP Z, mflv1_down_006          ;

mflv1_up_006:
  LD hl, RAM_VPOS + 32          ; Vertical 
  CALL lv1_up_subroutine        ;
  LD hl, RAM_HPOS + 64          ; Horizontal 
  CALL lv1_right_subroutine     ;
  LD a, $0E                     ;; 0E 0F 29 2A
  LD (RAM_HPOS + 65), a         ;
  LD a, $0F                     ;; 0E 0F 29 2A
  LD (RAM_HPOS + 67), a         ;
  LD a, $29                     ;; 0E 0F 29 2A
  LD (RAM_HPOS + 69), a         ;
  LD a, $2A                     ;; 0E 0F 29 2A
  LD (RAM_HPOS + 71), a         ;
  JP mflv1_next_007             ; Go to next foe

mflv1_down_006:
  LD hl, RAM_HPOS + 64          ; Horizontal 
  CALL lv1_right_subroutine     ;
  LD hl, RAM_VPOS + 32          ; Vertical 
  CALL lv1_down_subroutine      ;
  LD a, $10                     ;; 10 11 2B 2C
  LD (RAM_HPOS + 65), a         ;
  LD a, $11                     ;; 10 11 2B 2C
  LD (RAM_HPOS + 67), a         ;
  LD a, $2B                     ;; 10 11 2B 2C
  LD (RAM_HPOS + 69), a         ;
  LD a, $2C                     ;; 10 11 2B 2C
  LD (RAM_HPOS + 71), a         ;
  JP mflv1_next_007             ; Go to next foe

mflv1_countdown_006:
  DEC (hl)                      ; Decrement counter
  LD a, (hl)                    ; Respawn?
  CP $00                        ;
  JP NZ, mflv1_next_007         ;
  LD hl, vpos_sprites_level_1 + 32 ; Y respawn
  LD de, RAM_VPOS + 32          ;
  CALL copy_4_vpos_lv1          ;
  LD hl, hpos_sprites_level_1 + 64 ; X respawn
  LD de, RAM_HPOS + 64          ;
  CALL copy_4_hpos_lv1          ;

;------------------------------------
; Foe 7 - Cat head
mflv1_next_007:
  LD hl, RAM_FOE_7_COUNT        ;
  LD a, (hl)                    ; Termination counter expired? 
  CP $00                        ;
  JP NZ, mflv1_countdown_007    ;

  LD a, (RAM_SECOND_CTR)        ; Load state
  AND $01                       ;
  CP $00                        ;
  JP Z, mflv1_up_007            ;
  CP $01                        ;
  JP Z, mflv1_down_007          ;

mflv1_up_007:
  LD hl, RAM_VPOS + 36          ; Vertical 
  CALL lv1_up_subroutine        ;
  LD hl, RAM_HPOS + 72          ; Horizontal 
  CALL lv1_left_subroutine      ;
  LD a, $12                     ;; 12 13 2D 2E
  LD (RAM_HPOS + 73), a         ;
  LD a, $13                     ;; 12 13 2D 2E
  LD (RAM_HPOS + 75), a         ;
  LD a, $2D                     ;; 12 13 2D 2E
  LD (RAM_HPOS + 77), a         ;
  LD a, $2E                     ;; 12 13 2D 2E
  LD (RAM_HPOS + 79), a         ;
  JP mflv1_next_008             ; Go to next foe

mflv1_down_007:
  LD hl, RAM_VPOS + 36          ; Vertical 
  CALL lv1_down_subroutine      ;
  LD hl, RAM_HPOS + 72          ; Horizontal 
  CALL lv1_left_subroutine      ;
  LD a, $14                     ;; 14 15 2F 30
  LD (RAM_HPOS + 73), a         ;
  LD a, $15                     ;; 14 15 2F 30
  LD (RAM_HPOS + 75), a         ;
  LD a, $2F                     ;; 14 15 2F 30
  LD (RAM_HPOS + 77), a         ;
  LD a, $30                     ;; 14 15 2F 30
  LD (RAM_HPOS + 79), a         ;
  JP mflv1_next_008             ; Go to next foe

mflv1_countdown_007:
  DEC (hl)                      ; Decrement counter
  LD a, (hl)                    ; Respawn?
  CP $00                        ;
  JP NZ, mflv1_next_008         ;
  LD hl, vpos_sprites_level_1 + 36 ; Y respawn
  LD de, RAM_VPOS + 36          ;
  CALL copy_4_vpos_lv1          ;
  LD hl, hpos_sprites_level_1 + 72 ; X respawn
  LD de, RAM_HPOS + 72          ;
  CALL copy_4_hpos_lv1          ;

;------------------------------------
; Foe 8 - Cat head
mflv1_next_008:

  LD hl, RAM_FOE_8_COUNT        ;
  LD a, (hl)                    ; Termination counter expired? 
  CP $00                        ;
  JP NZ, mflv1_countdown_008    ;

  LD a, (RAM_SECOND_CTR)        ; Load state
  AND $01                       ;
  CP $00                        ;
  JP Z, mflv1_down_008          ;
  CP $01                        ;
  JP Z, mflv1_up_008            ;

mflv1_down_008:
  LD hl, RAM_VPOS + 40          ; Vertical 
  CALL lv1_down_subroutine      ;
  LD hl, RAM_HPOS + 80          ; Horizontal 
  CALL lv1_left_subroutine      ;
  LD a, $12                     ;; 12 13 2D 2E
  LD (RAM_HPOS + 81), a         ;
  LD a, $13                     ;; 12 13 2D 2E
  LD (RAM_HPOS + 83), a         ;
  LD a, $2D                     ;; 12 13 2D 2E
  LD (RAM_HPOS + 85), a         ;
  LD a, $2E                     ;; 12 13 2D 2E
  LD (RAM_HPOS + 87), a         ;
  JP mflv1_next_009             ; Go to next foe

mflv1_up_008:
  LD hl, RAM_VPOS + 40          ; Vertical 
  CALL lv1_up_subroutine        ;
  LD hl, RAM_HPOS + 80          ; Horizontal 
  CALL lv1_left_subroutine      ;
  LD a, $14                     ;; 14 15 2F 30
  LD (RAM_HPOS + 81), a         ;
  LD a, $15                     ;; 14 15 2F 30
  LD (RAM_HPOS + 83), a         ;
  LD a, $2F                     ;; 14 15 2F 30
  LD (RAM_HPOS + 85), a         ;
  LD a, $30                     ;; 14 15 2F 30
  LD (RAM_HPOS + 87), a         ;
  JP mflv1_next_009             ; Go to next foe

mflv1_countdown_008:
  DEC (hl)                      ; Decrement counter
  LD a, (hl)                    ; Respawn?
  CP $00                        ;
  JP NZ, mflv1_next_009         ;
  LD hl, vpos_sprites_level_1 + 40 ; Y respawn
  LD de, RAM_VPOS + 40          ;
  CALL copy_4_vpos_lv1          ;
  LD hl, hpos_sprites_level_1 + 80 ; X respawn
  LD de, RAM_HPOS + 80          ;
  CALL copy_4_hpos_lv1          ;

mflv1_next_009:
   
   RET                        ; End subroutine 
;----------------------------------------

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

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

  RET                           ; End subroutine 

lv1usub_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
;----------------------------------------

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

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

  RET                           ; End subroutine 

lv1dsub_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
;----------------------------------------

;----------------------------------------
; lv1_right_subroutine (11 lines)
; HL = HPOS
;----------------------------------------
lv1_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 
;----------------------------------------

;----------------------------------------
; lv1_left_subroutine (11 lines)
; HL = HPOS
;----------------------------------------
lv1_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_lv1 (8 lines)
;
; HL = source
; DE = destination
;----------------------------------------
copy_4_vpos_lv1:
  LD b, 4            ;
copy_4_vpos_lv1_loop:
  LD a, (hl)         ; 
  LD (de), a         ; 
  INC hl             ;
  INC de             ;
  DEC b              ;
  JP NZ, copy_4_vpos_lv1_loop ;

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

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

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

;-----------------------------------------
; lv1_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
;-----------------------------------------
lv1_collision_detect:
  LD a, (RAM_LIGHT_GUN_READ)    ; Only detect when 
  CP $7F                        ; trigger is pulled.
  JP NZ, lv1_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, lv1_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, lv1_cd_skip_002        ;
  LD a, 240                     ; If hit, set respawn counter
  LD (RAM_FOE_1_COUNT), a       ;
  CALL  ds_lv1_add_to_score     ;
  LD hl, RAM_HPOS + 24          ;
  CALL ds_lv1_set_sprite        ;

lv1_cd_skip_002:
; Foe 2
  LD a, (RAM_FOE_2_COUNT)       ; Hit occured in this frame 
  CP 0                          ;
  JP NZ, lv1_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, lv1_cd_skip_003        ;
  LD a, 240                     ; If hit, set respawn counter
  LD (RAM_FOE_2_COUNT), a       ;
  CALL  ds_lv1_add_to_score     ;
  LD hl, RAM_HPOS + 32          ;
  CALL ds_lv1_set_sprite        ;

lv1_cd_skip_003:
; Foe 3
  LD a, (RAM_FOE_3_COUNT)       ; Hit occured in this frame 
  CP 0                          ;
  JP NZ, lv1_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, lv1_cd_skip_004        ;
  LD a, 240                     ; If hit, set respawn counter
  LD (RAM_FOE_3_COUNT), a       ;
  CALL  ds_lv1_add_to_score     ;
  LD hl, RAM_HPOS + 40          ;
  CALL ds_lv1_set_sprite        ;

lv1_cd_skip_004:
; Foe 4
  LD a, (RAM_FOE_4_COUNT)       ; Hit occured in this frame 
  CP 0                          ;
  JP NZ, lv1_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, lv1_cd_skip_005        ;
  LD a, 240                     ; If hit, set respawn counter
  LD (RAM_FOE_4_COUNT), a       ;
  CALL  ds_lv1_add_to_score     ;
  LD hl, RAM_HPOS + 48          ;
  CALL ds_lv1_set_sprite        ;

lv1_cd_skip_005:
; Foe 5
  LD a, (RAM_FOE_5_COUNT)       ; Hit occured in this frame 
  CP 0                          ;
  JP NZ, lv1_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, lv1_cd_skip_006        ;
  LD a, 240                     ; If hit, set respawn counter
  LD (RAM_FOE_5_COUNT), a       ;
  CALL  ds_lv1_add_to_score     ;
  LD hl, RAM_HPOS + 56          ;
  CALL ds_lv1_set_sprite        ;

lv1_cd_skip_006:
; Foe 6
  LD a, (RAM_FOE_6_COUNT)       ; Hit occured in this frame 
  CP 0                          ;
  JP NZ, lv1_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, lv1_cd_skip_007        ;
  LD a, 240                     ; If hit, set respawn counter
  LD (RAM_FOE_6_COUNT), a       ;
  CALL  ds_lv1_add_to_score     ;
  LD hl, RAM_HPOS + 64          ;
  CALL ds_lv1_set_sprite        ;

lv1_cd_skip_007:
; Foe 7
  LD a, (RAM_FOE_7_COUNT)       ; Hit occured in this frame 
  CP 0                          ;
  JP NZ, lv1_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, lv1_cd_skip_008        ;
  LD a, 240                     ; If hit, set respawn counter
  LD (RAM_FOE_7_COUNT), a       ;
  CALL  ds_lv1_add_to_score     ;
  LD hl, RAM_HPOS + 72          ;
  CALL ds_lv1_set_sprite        ;

lv1_cd_skip_008:
; Foe 8
  LD a, (RAM_FOE_8_COUNT)       ; Hit occured in this frame 
  CP 0                          ;
  JP NZ, lv1_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, lv1_cd_skip_009        ;
  LD a, 240                     ; If hit, set respawn counter
  LD (RAM_FOE_8_COUNT), a       ;
  CALL  ds_lv1_add_to_score     ;
  LD hl, RAM_HPOS + 80          ;
  CALL ds_lv1_set_sprite        ;

lv1_cd_skip_009:
  RET                           ; End subroutine 
;----------------------------------------

;----------------------------------------
; ds_lv1_set_sprite (17 lines)
;
; Set sprite to "1".
;----------------------------------------
; HL = target address
ds_lv1_set_sprite:
  INC hl                        ;
  LD a, $39                     ;; 39 3A 55 56
  LD (hl), a                    ;
  INC hl                        ;
  INC hl                        ;
  LD a, $3A                     ;; 39 3A 55 56
  LD (hl), a                    ;
  INC hl                        ;
  INC hl                        ;
  LD a, $55                     ;; 39 3A 55 56
  LD (hl), a                    ;
  INC hl                        ;
  INC hl                        ;
  LD a, $56                     ;; 39 3A 55 56
  LD (hl), a                    ;

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

;----------------------------------------
; ds_lv1_add_to_score (16  lines)
;
; Increment the score.
;----------------------------------------
ds_lv1_add_to_score:
  LD b, 7                       ;
  LD hl, RAM_SCORE_7            ; LSD
  INC (hl)                      ;

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

ds_lv1_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_lv1_add_to_score_end ;

  DEC b                         ;
  JP NZ, ds_lv1_add_to_score_loop ;
 
ds_lv1_add_to_score_end:
  RET                           ; End subroutine 
;----------------------------------------

;----------------------------------------
; pig_got_hit_lv1 (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_lv1:
  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, pghlv1_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, pghlv1_skip_002        ;

  CALL decrement_health_lv1     ;
  LD hl, vpos_sprites_level_1 + 12 ; Y respawn
  LD de, RAM_VPOS + 12          ;
  CALL copy_4_vpos_lv1          ;
  LD hl, hpos_sprites_level_1 + 24 ; X respawn
  LD de, RAM_HPOS + 24          ;
  CALL copy_4_hpos_lv1          ;
pghlv1_skip_002:

;-----------------------------------
; Foe 2
  LD a, (RAM_FOE_2_COUNT)       ; Hit occured in this frame 
  CP 0                          ;
  JP NZ, pghlv1_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, pghlv1_skip_003        ;

  CALL decrement_health_lv1     ;
  LD hl, vpos_sprites_level_1 + 16 ; Y respawn
  LD de, RAM_VPOS + 16          ;
  CALL copy_4_vpos_lv1          ;
  LD hl, hpos_sprites_level_1 + 32 ; X respawn
  LD de, RAM_HPOS + 32          ;
  CALL copy_4_hpos_lv1          ;
pghlv1_skip_003:

;-----------------------------------
; Foe 3
  LD a, (RAM_FOE_3_COUNT)       ; Hit occured in this frame 
  CP 0                          ;
  JP NZ, pghlv1_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, pghlv1_skip_004        ;

  CALL decrement_health_lv1     ;
  LD hl, vpos_sprites_level_1 + 20 ; Y respawn
  LD de, RAM_VPOS + 20          ;
  CALL copy_4_vpos_lv1          ;
  LD hl, hpos_sprites_level_1 + 40 ; X respawn
  LD de, RAM_HPOS + 40          ;
  CALL copy_4_hpos_lv1          ;
pghlv1_skip_004:

;-----------------------------------
; Foe 4
  LD a, (RAM_FOE_4_COUNT)       ; Hit occured in this frame 
  CP 0                          ;
  JP NZ, pghlv1_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, pghlv1_skip_005        ;

  CALL decrement_health_lv1     ;
  LD hl, vpos_sprites_level_1 + 24 ; Y respawn
  LD de, RAM_VPOS + 24          ;
  CALL copy_4_vpos_lv1          ;
  LD hl, hpos_sprites_level_1 + 48 ; X respawn
  LD de, RAM_HPOS + 48          ;
  CALL copy_4_hpos_lv1          ;
pghlv1_skip_005:

;-----------------------------------
; Foe 5
  LD a, (RAM_FOE_5_COUNT)       ; Hit occured in this frame 
  CP 0                          ;
  JP NZ, pghlv1_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, pghlv1_skip_006        ;

  CALL decrement_health_lv1     ;
  LD hl, vpos_sprites_level_1 + 28 ; Y respawn
  LD de, RAM_VPOS + 28          ;
  CALL copy_4_vpos_lv1          ;
  LD hl, hpos_sprites_level_1 + 56 ; X respawn
  LD de, RAM_HPOS + 56          ;
  CALL copy_4_hpos_lv1          ;
pghlv1_skip_006:

;-----------------------------------
; Foe 6
  LD a, (RAM_FOE_6_COUNT)       ; Hit occured in this frame 
  CP 0                          ;
  JP NZ, pghlv1_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, pghlv1_skip_007        ;

  CALL decrement_health_lv1     ;
  LD hl, vpos_sprites_level_1 + 32 ; Y respawn
  LD de, RAM_VPOS + 32          ;
  CALL copy_4_vpos_lv1          ;
  LD hl, hpos_sprites_level_1 + 64 ; X respawn
  LD de, RAM_HPOS + 64          ;
  CALL copy_4_hpos_lv1          ;
pghlv1_skip_007:

;-----------------------------------
; Foe 7
  LD a, (RAM_FOE_7_COUNT)       ; Hit occured in this frame 
  CP 0                          ;
  JP NZ, pghlv1_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, pghlv1_skip_008        ;

  CALL decrement_health_lv1     ;
  LD hl, vpos_sprites_level_1 + 36 ; Y respawn
  LD de, RAM_VPOS + 36          ;
  CALL copy_4_vpos_lv1          ;
  LD hl, hpos_sprites_level_1 + 72 ; X respawn
  LD de, RAM_HPOS + 72          ;
  CALL copy_4_hpos_lv1          ;
pghlv1_skip_008:

;-----------------------------------
; Foe 8
  LD a, (RAM_FOE_8_COUNT)       ; Hit occured in this frame 
  CP 0                          ;
  JP NZ, pghlv1_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, pghlv1_skip_009        ;

  CALL decrement_health_lv1     ;
  LD hl, vpos_sprites_level_1 + 40 ; Y respawn
  LD de, RAM_VPOS + 40          ;
  CALL copy_4_vpos_lv1          ;
  LD hl, hpos_sprites_level_1 + 80 ; X respawn
  LD de, RAM_HPOS + 80          ;
  CALL copy_4_hpos_lv1          ;
pghlv1_skip_009:

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

;----------------------------------------
; decrement_health_lv1 (15 lines)
;
; Health goes down by 1.
;----------------------------------------
decrement_health_lv1:
  LD a, (RAM_PIG_BLINK)      ;
  CP $00                     ;
  JP NZ, dhlv1_skip_000      ;
 
  CALL copy_song_to_RAM004   ; Ouch

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

dhlv1_game_over
  LD a, STATE_GAME_OVER      ;
  LD (RAM_GAME_STATE), a     ;
dhlv1_skip_000:
  RET                        ; End subroutine 
;----------------------------------------

;---------------------------------------
; level_1_color_blink (31 lines)
;
; Make floor blink.
;---------------------------------------
level_1_color_blink:
   LD a, (RAM_FRAME_CTR)      ; Blink every second
   AND $08                     ;
   CP $00                      ;
   JP NZ, lv1cb_skip_000       ;

; Color 1
   LD a, $05                   ; Low address byte
   OUT (VDP_ADDR),a            ;
   LD a, $C0                   ; High address byte
   OUT (VDP_ADDR),a            ;
   LD a, $08                   ; Read color
   OUT (VDP_DATA), a           ; Write color

; Color 2
   LD a, $0D                   ; Low address byte
   OUT (VDP_ADDR),a            ;
   LD a, $C0                   ; High address byte
   OUT (VDP_ADDR),a            ;
   LD a, $0C                   ; Read color
   OUT (VDP_DATA), a           ; Write color
   JP lv1cb_skip_001           ;

lv1cb_skip_000:
; Color 1
   LD a, $05                   ; Low address byte
   OUT (VDP_ADDR),a            ;
   LD a, $C0                   ; High address byte
   OUT (VDP_ADDR),a            ;
   LD a, $0C                   ; Read color
   OUT (VDP_DATA), a           ; Write color

; Color 2
   LD a, $0D                   ; Low address byte
   OUT (VDP_ADDR),a            ;
   LD a, $C0                   ; High address byte
   OUT (VDP_ADDR),a            ;
   LD a, $08                   ; Read color
   OUT (VDP_DATA), a           ; Write color
   JP lv1cb_skip_001           ;

lv1cb_skip_001:
   RET                         ; End subroutine 
;---------------------------------------





background_001:
.include "ppolis_level1_BG.inc"

tiles_001:
.include "ppolis_level1_T.inc"

palette_001:
.include "ppolis_level1_P.inc"