		org	25000
		


		

		CALL	INIT

		;call	INTRO
start		call	MENU
		call	INIT_VALUES
		
		call	INIT_PLAYER
		call	START_PLAYER
main_cycle	
		call	SOUND
		call	GAME_OVER
		call	KEY_TEST
		call	UPDATE
		call	UPDATE_DAMAGE
		call	UPDATE_CHEAT_CODE


		call	SHUTTLE_TEST
		call	TP_TEST
		call	ITEM_TEST

		

		call	DRAW_INVENTORY

		call	COPY_SCREEN	;     
		call	MOV_LEFT	;  
		call	MOV_RIGHT	;  


		call	UPDATE_PARTICLE
		call	UPDATE_MOB
		

		ld	a,DI_CLEAR
		call	DRAW_ITEMS
		call	DRAW_LOOT
	
		call	DRAW_PERS_FON
		call	DRAW_GUNFIRE_FON
		call	DRAW_MOB_FON
		call	DRAW_PAR_FON

		call	COPY_PERS_FON
		call	COPY_GUNFIRE_FON
		call	COPY_MOB_FON
		call	COPY_PAR_FON
		
		ld	a,DI_DRAW
		call	DRAW_ITEMS
		call	DRAW_LOOT

		call	DRAW_PERS
		call	DRAW_GUNFIRE
		call	DRAW_MOB
		call	DRAW_PARTICLE

		
		call	SWAP_SCREEN

	
		
		jr 	main_cycle


test
		ld	de,0
		ld	hl,FUEL_TXT
		ld	a,%10000010
		call	PRINT
		jr	$

;-----------------------------------------
;LOOT
;-----------------------------------------
LOOT
LOOT_ID		defb	0
LOOT_Y		defb	0
LOOT_X		defw	0
LOOT_TIME	defb	0

;-----------------------------------------
;PARTICLES
;-----------------------------------------
PARTICLES	defs	90,0


PAR_ACT		equ	0	;activity
PAR_Y		equ	1	;y
PAR_X		equ	2	;x
PAR_OLD_Y	equ	3	;y
PAR_OLD_X	equ	4	;x
PAR_FON		equ	5
PAR_DX		equ	6	; 
PAR_VEL_UP	equ	7
PAR_		equ	9



PAR_SIZE	equ	9
;-----------------------------------------
;MOB
;-----------------------------------------
MOB_ACT		defb	0	;activity
MOB_Y		defb	0	;y
MOB_X		defb	0	;x
MOB_OLD_Y	defb	0	;y
MOB_OLD_X	defb	0	;x
MOB_STEP	defb	0
MOB_NOM		defb	0
MOB_HP		defb	0



MOB_FON		defs	32,0
MOB_MAX_Y	equ	175

;-----------------------------------------
;VALUES
;-----------------------------------------
;key_flags
P_KEYS		defs	10,0
P_KEYS_COUNT	equ	10

;Level values
CURRENT_LVL	defw	0
CURRENT_RIB	defw	0
UP_LEVEL_NOM	defb	0
DN_LEVEL_NOM	defb	0
SCREEN_X	defw	0
TP_LIST		defw	0
ITEM_LIST	defw	0
LVL_WIDTH	defw	320
LVL_NOM

level_data_sz	equ	10

;Pers values
HEAD_TIMER	defb	0		;  
JETPAK_ON	defb	0
JETPAK_FUEL	defw	0		; 
MINERAL		defb	0
ORGANIC		defb	0
PERS_HP		defw	0

PERS_Y		defb	0
PERS_OLD_Y	defb	0
VEL_UP		defw	#0700
JMP_FADING	defw	#0076
VEL_DN		equ	#07
JMP_IMPULS	equ	#0dd4
PERS_X_OFFS	equ	15
		
L_WALL		defb	0		;  
R_WALL		defb	0		;  
PERS_FAZE	defb	0		;  
fly		defb	0		;  /
PERS_OLD_GFX	defb	0

;Other
WORK_TABLE	defw	0		;  
l_shifted	defw	0		;   
r_shifted	equ	l_shifted+1	;   
XOR_FLAG	defb	0		;,   
GO_FLAG		defb	0
AY_FLAG		defb	0

;-----------------------------------------
;MENU
;-----------------------------------------
MENU
	call	CLS
	call	SWAP_SCREEN

	ld	hl,TITLE	;
	ld	de,#090B
	ld	a,%10000101
	call	PRINT
	ld	hl,MENU_1	;
	ld	de,#060E
	ld	a,%10000001
	call	PRINT
	ld	hl,MENU_2	;
	ld	de,#0610
	ld	a,%10000001
	call	PRINT
	ld	hl,MENU_3	;
	ld	de,#0612
	ld	a,%10000001
	call	PRINT
	ld	hl,MENU_4	;
	ld	de,#0614
	ld	a,%10000001
	call	PRINT

F_WKP	LD	hl,T_OFF
	LD	de,#1412
	LD	A,(IS_KEMPSTON)
	and	a
	ld	a,%10000010
	JR	Z,KEMP_OF
	LD	hl,T_ON
	ld	a,%10000001
KEMP_OF	CALL	PRINT

	LD	hl,T_OFF
	LD	de,#1414
	LD	A,(AY_FLAG)
	and	a
	ld	a,%10000010
	JR	Z,AY_OF
	LD	hl,T_ON
	ld	a,%10000001
AY_OF	CALL	PRINT


	call	WAIT_PRESS_KEY
	LD	A,(HL)
	CP	#F7		;   1...5
	JR	NZ,F_WKP	;,  

	LD	A,(DE)
	CP	BIT_0		; 1
	RET	Z		; 

	PUSH	AF
	CP	BIT_1		; 2
	CALL	Z,REDEFINE_KEYS
	POP	AF


	CP	BIT_2		; 3
	JR	nz,F_AY
	LD	A,(IS_KEMPSTON)
	XOR	1		; -
	LD	(IS_KEMPSTON),A
	CALL	WAIT_RELEASE_KEYS
	JR	F_WKP

F_AY	CP	BIT_3		; 4
	JR	nz,F_WKP
	LD	A,(AY_FLAG)
	XOR	1		; -
	LD	(AY_FLAG),A
	CALL	WAIT_RELEASE_KEYS
	JR	F_WKP


	ret



;-----------------------------------------
;PROCEDURES
;-----------------------------------------


;-----------------------------------------
PORTAL_SOUND
	ld	de,#af00
PS_1	push	de
	ld	bc,100
	call	SND_FX
	pop	de
	inc	e
	dec	d
	jr	nz,PS_1
	ret


CHPOK_SOUND
	ld	de,#fff3
	ld	bc,1000
	call	SND_FX
	ret


SND_FX	ld	a,d
	ld	(b_f1+1),a
	ld	a,e
	ld	(b_f2+1),a
b_cyc	ld	a,(border)
	dec	d
	jr	nz,no_b1
b_f1	ld	d,125			;f1
	xor	16
	out	(254),A
no_b1	dec	e
	jr	nz,no_b2
b_f2	ld	e,97			;f1
	xor	16
	out	(254),A
no_b2	ld	(border),a
	dec	bc
	ld	a,b
	or	c
	jr	nz,b_cyc
	ret

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


SHADE_SCREEN
	ld	de,0
	call	ADDR_XY
	ld	a,h
	xor	%10000000
	sra	a
	sra	a
	sra	a
	and	%10000011
	or	%01011000
	ld	h,a

	ld	b,255

ss_datr	push	hl
	ld	de,768
ss_natr	ld	a,(hl)
	and	a
	jr	z,ss_ndec
	dec	a
	ld	(hl),a
ss_ndec	inc	hl
	dec	de
	ld	a,d
	or	e
	jr	nz,ss_natr
	pop	hl
	djnz	ss_datr
	ret
;----------------------------------------

GAME_OVER
	ld	a,(GO_FLAG)
	and	a
	ret	z

	call	STOP_PLAYER

	call	SHADE_SCREEN
	ld	a,1
	ld	(S_MODE+1),a
	call	CLS
	call	SWAP_SCREEN
	call	WAIT_RELEASE_KEYS
	
	ld	a,(GO_FLAG)

	cp	1
	jr	nz,go_2
	ld	a,%10000001
	ld	hl,GO1_TXT
	jr	go_end
go_2	cp	2
	jr	nz,go_3
	ld	a,%10000110
	ld	hl,GO2_TXT
	jr	go_end
go_3	cp	3
	jr	nz,go_4
	ld	a,%10000010
	ld	hl,GO3_TXT
	jr	go_end
go_4	cp	4
	jr	nz,go_5
	call	OUTRO
	jr	go_ret
go_5



	ld	a,%10000010
	ld	hl,GO_NONE	

	
go_end	call	PRINT_ABZAC

go_ret	xor	a
	ld	(S_MODE+1),a
	call	WAIT_PRESS_KEY_OR_JOY
	call	WAIT_RELEASE_KEYS
	pop	af	;    
	jp	start
;--------------------------
REDEFINE_KEYS
	call	WAIT_RELEASE_KEYS
	ld	hl,TXT_PRESS
	ld	de,#0A10
	ld	a,%10000001
	call	PRINT

	; 
	ld	hl,TXT_LEFT
	ld	de,#1210
	ld	a,%10000110
	call	PRINT
	call	WAIT_PRESS_KEY
	ld	a,(hl)
	ld	(L_PORT),a
	ld	a,(de)
	ld	(L_BIT+1),a
	call	WAIT_RELEASE_KEYS

	; 
	ld	hl,TXT_RIGHT
	ld	de,#1210
	ld	a,%10000110
	call	PRINT
	call	WAIT_PRESS_KEY
	ld	a,(hl)
	ld	(R_PORT),a
	ld	a,(de)
	ld	(R_BIT+1),a
	call	WAIT_RELEASE_KEYS

	; 
	ld	hl,TXT_UP
	ld	de,#1210
	ld	a,%10000110
	call	PRINT
	call	WAIT_PRESS_KEY
	ld	a,(hl)
	ld	(U_PORT),a
	ld	a,(de)
	ld	(U_BIT+1),a
	call	WAIT_RELEASE_KEYS

	; 
	ld	hl,TXT_DOWN
	ld	de,#1210
	ld	a,%10000110
	call	PRINT
	call	WAIT_PRESS_KEY
	ld	a,(hl)
	ld	(D_PORT),a
	ld	a,(de)
	ld	(D_BIT+1),a
	call	WAIT_RELEASE_KEYS

	; 
	ld	hl,TXT_FIRE
	ld	de,#1210
	ld	a,%10000110
	call	PRINT
	call	WAIT_PRESS_KEY
	ld	a,(hl)
	ld	(F_PORT),a
	ld	a,(de)
	ld	(F_BIT+1),a
	call	WAIT_RELEASE_KEYS

	ld	hl,MENU_2
	ld	de,#0610
	ld	a,%10000001
	call	PRINT
	ret

TXT_PRESS	DEFM	"          "
		DEFB	0
TXT_LEFT	DEFM	" "
		DEFB	0
TXT_RIGHT	DEFM	""
		DEFB	0
TXT_UP		DEFM	" "
		DEFB	0
TXT_DOWN	DEFM	"  "
		DEFB	0
TXT_FIRE	DEFM	" "
		DEFB	0



;-----------------------------------------
KEY_NAME_ADDR
	ld	hl,KEY_NAMES
	and	a
	ret	z
	ld	b,a
kna_nks	ld	a,(hl)
	inc	hl
	and	a
	jr	nz,kna_nks	
	djnz	kna_nks
	ret

;-----------------------------------------
START_MSG
	ld	hl,SPACE_LINE
	ld	de,#000a
	xor	a
	call	PRINT
	ld	hl,SPACE_LINE
	ld	de,#000B
	xor	a
	call	PRINT
	ld	hl,SPACE_LINE
	ld	de,#000c
	xor	a
	call	PRINT
	ret
;-----------------------------------------
END_MSG
	call	SWAP_SCREEN
	ld	c,25
em_c	push	bc
	call	SOUND
	
	ld	bc,2550
em_d1	dec	bc
	ld	a,b
	or	c
	jr	nz,em_d1
	pop	bc
	dec	c
	jr	nz,em_c
;em_c2	dec	bc
	;ld	a,b
	;or	c
	;jr	nz,em_c2
	call	SWAP_SCREEN
	ret

;-----------------------------------------
ABORT_MSG
	call	START_MSG
	ld	hl,ABORT_TXT
	ld	de,#070B
	ld	a,%00000010
	call	PRINT
	jp	END_MSG

;-----------------------------------------
NEED_KEY_MSG
	push	bc
	call	START_MSG

	ld	hl,NEED_KEY_TXT
	ld	de,#070B
	ld	a,%00000110
	call	PRINT

	pop	bc
	ld	a,c
	call	KEY_NAME_ADDR
	ld	de,#120B
	ld	a,%00000010
	call	PRINT

	jp	END_MSG

;-----------------------------------------
FIND_FUEL_MSG
	call	LOOT_SOUND
	call	START_MSG
	ld	hl,FUEL_TXT
	ld	de,#090B
	ld	a,%00000110
	call	PRINT
	; 
	ld	hl,(JETPAK_FUEL)
	call	ITOSTR
	ld	de,#120B
	ld	hl,I_STR
	ld	a,%00000010
	call	PRINT
	jp	END_MSG

;-----------------------------------------
FIND_MINE_MSG
	call	LOOT_SOUND
	call	START_MSG
	ld	hl,MINE_TXT
	ld	de,#080B
	ld	a,%00000110
	call	PRINT
	; 
	ld	hl,(MINERAL)
	ld	h,0
	call	ITOSTR
	ld	de,#120B
	ld	hl,I_STR
	ld	a,%00000010
	call	PRINT
	jp	END_MSG

;-----------------------------------------
FIND_ORGA_MSG
	call	LOOT_SOUND
	call	START_MSG
	ld	hl,ORGA_TXT
	ld	de,#080B
	ld	a,%00000110
	call	PRINT
	; 
	ld	hl,(ORGANIC)
	ld	h,0
	call	ITOSTR
	ld	de,#120B
	ld	hl,I_STR
	ld	a,%00000010
	call	PRINT
	jp	END_MSG

;-----------------------------------------
FIND_KEY_MSG
	push	bc
	call	KEY_SOUND
	call	START_MSG

	ld	hl,FOUND_KEY_TXT
	ld	de,#060B
	ld	a,%00000110
	call	PRINT

	pop	bc
	ld	a,c
	call	KEY_NAME_ADDR
	ld	de,#120B
	ld	a,%00000001
	call	PRINT

	jp	END_MSG

;-----------------------------------------
UPDATE_CHEAT_CODE
	

	ld	a,(F_PRESSED)
	and	a
	call	nz,VERIFY_CHEATS


	ld	a,(U_PRESSED)
	and	a
	jr	z,ack_1
	ld	a,1
	jr	ADD_CHEAT_KEY
ack_1	ld	a,(D_PRESSED)
	and	a
	jr	z,ack_2
	ld	a,2
	jr	ADD_CHEAT_KEY
ack_2	ld	a,(L_PRESSED)
	and	a
	jr	z,ack_3
	ld	a,3
	jr	ADD_CHEAT_KEY
ack_3	ld	a,(R_PRESSED)
	and	a
	jr	z,ack_4
	ld	a,4
	jr	ADD_CHEAT_KEY
ack_4	xor	a
	ld	(LAST_KEY),a
	ret

LAST_KEY	defb	0
;-----------------------------------------
ADD_CHEAT_KEY
	ld	b,a
	ld	a,(LAST_KEY)
	and	a
	ret	nz
	ld	a,b
	ld	(LAST_KEY),a

	ld	de,CHEAT_CODE
	ld	hl,CHEAT_CODE+1
	ldi
	ldi
	ldi
	ldi
	ldi
	ldi
	ldi
	ld	(de),a

	ret
CHEAT_CODE	defs	8,0

;-----------------------------------------
VERIFY_CHEATS
	ld	de,CHEAT_FUEL
	call	CMP_CHEAT_CODE
	jr	z,IS_CHEAT_FUEL
	ld	de,CHEAT_LIVE
	call	CMP_CHEAT_CODE
	jr	z,IS_CHEAT_LIVE		
	
	ret

CMP_CHEAT_CODE
	ld	hl,CHEAT_CODE
	ld	b,8
vc_nxt	ld	a,(de)
	xor	(hl)
	ret	nz
	inc	hl
	inc	de
	djnz	vc_nxt
	ret

IS_CHEAT_FUEL
	ld	hl,(JETPAK_FUEL)
	ld	de,255
	add	hl,de
	ld	(JETPAK_FUEL),hl
	call	FIND_FUEL_MSG
	jr	CLR_CHEAT_CODE

IS_CHEAT_LIVE
	ld	hl,60000
	ld	(PERS_HP),hl
	call	PORTAL_SOUND
	jr	CLR_CHEAT_CODE


CLR_CHEAT_CODE
	ld	b,8
	ld	hl,CHEAT_CODE
	xor	a
ccc_nxt	ld	(hl),a
	inc	hl
	djnz	ccc_nxt
	ret


CHEAT_FUEL	defb	1,1,2,2,3,3,4,4
CHEAT_LIVE	defb	3,3,4,4,1,1,2,2

;-----------------------------------------
DRAW_INVENTORY
	ld	a,(F_PRESSED)
	ld	c,a
	ld	a,(D_PRESSED)
	and	c
	ret	z

	;call	STOP_PLAYER

	call	CLS
	call	INV_CONTENT
	call	SWAP_SCREEN
;dinv_c	call	KEY_TEST
	;ld	a,(F_PRESSED)
	;ld	c,a
	;ld	a,(D_PRESSED)
	;or	c
	;jr	nz,dinv_c
	call	WAIT_RELEASE_KEYS
;wpk	call	KEY_TEST
;	ld	a,(F_PRESSED)
;	and	a
;	jr	z,wpk

	call	WAIT_PRESS_KEY_OR_JOY

	call	SWAP_SCREEN
	;call	START_PLAYER
	ret

INV_CONTENT
	;
	ld	de,#0100
	ld	hl,HP_TXT
	ld	a,6
	call	PRINT

	; HP
	ld	hl,(PERS_HP)
	call	ITOSTR
	ld	de,#0B00
	ld	hl,I_STR
	ld	a,2
	call	PRINT

	; JETPAK_FUEL
	ld	de,#0201
	ld	hl,FUEL_TXT
	ld	a,6
	call	PRINT

	; 
	ld	hl,(JETPAK_FUEL)
	call	ITOSTR
	ld	de,#0B01
	ld	hl,I_STR
	ld	a,2
	call	PRINT

	;
	ld	de,#0103
	ld	hl,MINE_TXT
	ld	a,4
	call	PRINT

	; 
	ld	hl,(MINERAL)
	ld	h,0
	call	ITOSTR
	ld	de,#0B03
	ld	hl,I_STR
	ld	a,1
	call	PRINT

	;
	ld	de,#0104
	ld	hl,ORGA_TXT
	ld	a,4
	call	PRINT

	; 
	ld	hl,(ORGANIC)
	ld	h,0
	call	ITOSTR
	ld	de,#0B04
	ld	hl,I_STR
	ld	a,1
	call	PRINT

	;  ( ?)
	ld	de,#0106
	ld	hl,KEY_TXT
	ld	a,6
	call	PRINT

	; 
	ld	a,#07
	ld	(ic_y+1),a
	ld	b,P_KEYS_COUNT
	ld	hl,KEY_NAMES
	ld	de,P_KEYS
ic_nxtn	ld	a,(de)

	push	hl
	push	de
	push	bc

ic_y	ld	de,#0100

	and	a
	jr	z,no_kprn
	ld	a,1
	call	PRINT
	ld	a,(ic_y+1)
	inc	a
	ld	(ic_y+1),a

no_kprn	pop	bc
	pop	de
	pop	hl

ic_nxts	ld	a,(hl)
	inc	hl
	and	a
	jr	nz,ic_nxts
	inc	de

	djnz	ic_nxtn

	

	ret

;-----------------------------------------
PRINT
	ld	c,a
	and	%01111111
	ld	(S_ATTR+1),a
	push	hl
	call	ADDR_XY
	ld	a,%10000000	;  =   
	and	c	
	xor	h
	ld	h,a
	ld	(SYM_AD+1),hl
	pop	hl

prt_ns	ld	a,(hl)
	and	a
	ret	z
	push	hl
	call	PRINT_SYM
	pop	hl
	inc	hl
	jr	prt_ns

;-----------------------------------------
PRINT_SYM
	ld	hl,#B60F	;rrca	or (hl) 
	ld	bc,15360
	cp	192
	jr	c,eng
	ld	bc,RUS_FONT-#600
	ld	hl,0
eng	ld	(bold),hl
	ld	l,a
	ld	h,0
	add	hl,hl
	add	hl,hl
	add	hl,hl
	add	hl,bc		; 

SYM_AD	ld	de,0		;  
	inc	de
	ld	(SYM_AD+1),de
	dec	de
	push	de
	ld	b,8
prt_s	ld	a,(hl)
bold	rrca
	or	(hl)
	ld	(de),a
	inc	hl	
	inc	d
	djnz	prt_s
	pop	de

	ld	a,d
	sra	a
	sra	a
	sra	a
	and	%10000011
	or	%01011000
	ld	d,a
S_ATTR	ld	a,0
	ld	(de),a

S_MODE	ld	a,0
	and	a
	ret	z

	inc	de
	ld	a,(de)
	and	%00111000
	xor	%10111000
	ld	(de),a

	call	IS_ANY_KEY
	ret	nz
	

	push	de
	call	CHPOK_SOUND
	pop	de
	ld	bc,#1000
s_paus	dec	bc
	ld	a,b
	or	c
	jr	nz,s_paus
	ret


;-----------------------------------------
IM2_INIT

	LD	A,195		;  JP
	LD	(#BFBF),A
	LD	HL,INTERRUPT	;   
	LD	(#BFC0),HL

	LD	HL,#BE00	;   
	LD	DE,#BE01
	LD	BC,256
	LD	(HL),191		;  #BFBF
	LD	A,H
	LDIR
	
	DI
	LD	I,A		;   
	IM	2		; 2- 
	EI
	RET

;---------------------------------
INIT_PLAYER
	di
	ld      a,(PORT_COPY)
	and	248
	ld	bc,#7FFD
        out	(c),a
	ld	de,MODULE
        call	INIT_VT
	ld      a,(PORT_COPY)
	ld	bc,#7FFD
	out	(c),a	
	ret

;---------------------------------
START_PLAYER
	ld	a,(AY_FLAG)
	and	a
	ret	z
	di
	xor	a
	ld	(MUS_MOD),a
	ei
	ret

;---------------------------------
STOP_PLAYER
	di
	ld      a,(PORT_COPY)
	and	248
	ld	bc,#7FFD
        out	(c),a
	call	MUTE_MUSIC
	ld      a,(PORT_COPY)
	ld	bc,#7FFD
	out	(c),a
	ld	a,#C9
	ld	(MUS_MOD),a
	ei
	ret

;---------------------------------
INTERRUPT
MUS_MOD	ret	;#C9


	DI
	push	ix
	push	bc
	push	hl
	push	de
	push	af



	LD      a,(PORT_COPY)
	and	248
	ld	bc,#7FFD
        out	(c),a
	call	PLAY_MUSIC
	ld      a,(PORT_COPY)
	ld	bc,#7FFD
	out	(c),a
	
	pop	af
	pop	de
	pop	hl
	pop	bc
	pop	ix
	EI
	RET
INIT_VT		equ	#C000
PLAY_MUSIC	equ	#C000+5
MUTE_MUSIC	equ	#C000+8
MODULE		equ	51310

;---------------------------------
SOUND
	PUSH	AF          ; 
	PUSH	BC          ;   
	PUSH	HL
SOUND1	LD	A,(REPEAT)
	AND	A
	;      ,   
	JR	NZ,NO_EXITI
	;LD	(BLOCKED),A
	JR	EXITI
NO_EXITI
	LD	HL,(CURADR) ;     
	LD	B,(HL)      ; 
	INC	B
	DEC	B
	;      ,    
	JR	Z,EXITI0
	INC	HL
	LD	C,(HL)      ; 
	INC	HL
	LD	(CURADR),HL ;  
	CALL	BEEP        ; 
EXITI
	POP	HL          ; 
	POP	BC
	POP	AF
	ret


	;JP	56          ;    
	;     - 
EXITI0	LD	HL,(ADREFF) ; 
	LD	(CURADR),HL ;   
	LD	HL,REPEAT
	DEC	(HL)        ;  
	JR	SOUND1
REPEAT	DEFB	0           ;  
ADREFF	DEFW	0           ;    
CURADR	DEFW	0           ;    
;BLOCKED	DEFB	0
BORDER	DEFB	0
	;  
BEEP	LD	A,(BORDER);(23634)
	;SRL	A
	;SRL	A
	;SRL	A
	;AND	7
BEEP1	XOR	16
	OUT	(254),A
	PUSH	BC
DELAY	DJNZ	DELAY
	POP	BC
	DEC	C
	JR	NZ,BEEP1
	LD	(BORDER),a
	RET
;---------------------------------
SHOT_SOUND
	LD	HL,EFF1
	JR	ON_EFF

LOOT_SOUND
	LD	HL,EFF2
	JR	ON_EFF

KEY_SOUND
	LD	HL,EFF3
	JR	ON_EFF

DAMAGE_SOUND
	LD	HL,EFF4
	JR	ON_EFF
ON_EFF	;LD	A,(BLOCKED)
	;and	a
	;RET	NZ
	LD	A,1
	;LD	(BLOCKED),A
	LD	(ADREFF),HL
	LD	(CURADR),HL
	LD	(REPEAT),A
	RET

EFF1	DEFB	2,5,0
EFF2	DEFB	10,150,50,50,100,25,150,20,200,17,250,11,255,7,0
EFF3	DEFB	60,6,60,6,60,6,60,6,60,6
	DEFB	80,6,80,6,80,6,80,6,80,6
	DEFB	100,6,100,6,100,6,100,6,100,6,0
EFF4	DEFB	120,5,140,4,0

;---------------------------------
INIT
	call	WAIT_PRESS_KEY	;  
	xor	a
	OUT	(254),A
	ld	a,%00010111
	call	SET_PAGE_MODE_A

	

	;call	INIT_PLAYER


	
	


	
	call	IM2_INIT














	; 
	ld	hl,P_HEAD
	call	FLIP_SPRITE
	ld	hl,P_CORP
	call	FLIP_SPRITE
	ld	hl,P_LEG1
	call	FLIP_SPRITE
	ld	hl,P_LEG2
	call	FLIP_SPRITE
	ld	hl,P_LEG3
	call	FLIP_SPRITE
	ld	hl,P_LEG4
	call	FLIP_SPRITE
	ld	hl,P_JET1
	call	FLIP_SPRITE
	ld	hl,P_JET2
	call	FLIP_SPRITE
	ret



;---------------------------------
INIT_VALUES
	; 
	ld	hl,ITEMS1
	call	RESTORE_ITEMS
	ld	hl,ITEMS2
	call	RESTORE_ITEMS
	ld	hl,ITEMS3
	call	RESTORE_ITEMS
	ld	hl,ITEMS4
	call	RESTORE_ITEMS
	ld	hl,ITEMS5
	call	RESTORE_ITEMS
	ld	hl,ITEMS6
	call	RESTORE_ITEMS
	
	;  
	xor	a
	ld	(GO_FLAG),a
	ld	(MINERAL),a
	ld	(ORGANIC),a
	ld	hl,P_KEYS
	ld	b,P_KEYS_COUNT
del_key	ld	(hl),a
	inc	hl
	djnz	del_key

	ld	hl,30
	ld	(JETPAK_FUEL),hl
	ld	hl,500
	ld	(PERS_HP),hl
	ld	de,0	;  ( X )
	ld	(SCREEN_X),de
	ld	b,120	;  Y 
	ld	hl,0	; 
	call	INIT_LEVEL
	
	ret

;---------------------------------
RESTORE_ITEMS
	ld	de,IT_SIZE
ri_nxt	ld	a,(hl)
	cp	255
	ret	z
	and	255 - NO_ITEM - TO_DEL
	ld	(hl),a
	add	hl,de
	jr	ri_nxt

;---------------------------------
INIT_LEVEL

	ld	a,l
	ld	(LVL_NOM),a

	ld	a,b
	ld	(PERS_OLD_Y),a
	ld	(PERS_Y),a
	
	ld	b,l
	ld	hl,levels_data
	
	xor	a
	cp	b
	jr	z,no_add_lvl
	ld	de,level_data_sz
add_lvl	add	hl,de
	djnz	add_lvl
no_add_lvl

	ld	e,(hl)
	inc	hl
	ld	d,(hl)
	inc	hl
	ld	(CURRENT_LVL),de
	
	ld	e,(hl)
	inc	hl
	ld	d,(hl)
	inc	hl
	ld	(CURRENT_RIB),de

	ld	a,(HL)
	ld	(UP_LEVEL_NOM),a
	inc	hl
	ld	a,(HL)
	ld	(DN_LEVEL_NOM),a
	inc	hl
	
	ld	e,(hl)
	inc	hl
	ld	d,(hl)
	inc	hl
	ld	(TP_LIST),de

	ld	e,(hl)
	inc	hl
	ld	d,(hl)
	ld	(ITEM_LIST),de

	ld	hl,LEFT_TABLE
	ld	(WORK_TABLE),hl
	
	call	INIT_TABLE
	
	ld	bc,(SCREEN_X)

shift	ld 	a,b			;  x
	or	c
	jr	z,no_shift
	push	bc
	call	R_ON_TABLE
	pop	bc
	dec	bc
	jr	shift

no_shift
	ld	hl,LEFT_TABLE
	ld	de,RIGHT_TABLE
	ld	bc,table_size
	ldir

	ld	hl,RIGHT_TABLE
	ld	(WORK_TABLE),hl


	ld 	b,31
fill_s	push	bc
	ld	a,31
	sub	b
	
	call	PRINT_COLUMN
	call	R_ON_TABLE

	pop	bc
	djnz	fill_s

	ld	a,31
	call	PRINT_COLUMN

	ld	hl,0
	ld	(l_shifted),hl
	ld	(l_pressed),hl

	call	SWAP_SCREEN
	call	COPY_SCREEN
	call	COPY_PERS_FON
	call	COPY_GUNFIRE_FON

	; 
	xor	a
	ld	(MOB_ACT),a
	
	; 
	ld	b,10
	ld	hl,PARTICLES
	ld	de,PAR_SIZE
	;xor	a
il_par	ld	(hl),a
	add	hl,de
	djnz	il_par

	ret

;----------------------------------
FLIP_SPRITE
	DI
	ld	b,(hl)		; 
	ld	(fs_sp+1),sp
	ld	sp,hl
	ld	de,P_SIZE
	add	hl,de
	ld	(hl),b
	inc	hl
	inc	sp

fs1	pop	de

	ld	a,d
	rra
	rl	e
	rr	d
	rl	e
	rr	d
	rl	e
	rr	d
	rl	e
	rr	d
	rl	e
	rr	d
	rl	e
	rr	d
	rl	e
	rr	d
	rl	e
	rr	d
	rl	e

	ld	(hl),e
	inc	hl
	ld	(hl),d
	inc	hl

	djnz	fs1


fs_sp	ld	sp,0
	EI
	ret

;----------------------------------
MOV_RIGHT
	ld	a,(r_wall)		;  ,  
	or	a
	ret	nz

	ld	a,(L_PRESSED)		;      ,  
	or	a
	ret	nz

	ld	a,(R_PRESSED)		;   ,  
	or	a
	ret	z

	xor	a			; ,   
	ld	(HEAD_TIMER),a

	ld	hl,PERS_SET_RIGHT
	ld	(PERS_SET_ADDR),hl

	ld	a,PERS_X_OFFS+2
	ld	(GF_X+1),a
	ld	hl,P_GUNF
	ld	(PGF_SPR+1),hl


	ld	a,30
	ld	(MOB_SPAWN_X+1),a
	ld	a,#D8
	ld	(UD_RET),a

	call	scroll_mini_left

	ld	hl,LEFT_TABLE
	ld	(WORK_TABLE),hl
	call	R_ON_TABLE
	ld	hl,RIGHT_TABLE
	ld	(WORK_TABLE),hl
	call	R_ON_TABLE

	ld	a,31
	call	PRINT_COLUMN

	ld	hl,(SCREEN_X)
	inc	hl
	ld	de,(LVL_WIDTH)
	ld	a,h
	xor	d
	jr	nz,no_cmp
	ld	a,l
	xor	e
	jr	nz,no_cmp
	ld	hl,0
no_cmp	ld	(SCREEN_X),hl
	ret

;----------------------------------
MOV_LEFT
	ld	a,(l_wall)		;  ,  
	or	a
	ret	nz

	ld	a,(R_PRESSED)		;      ,  
	or	a
	ret	nz

	ld	a,(L_PRESSED)		;   ,  
	or	a
	ret	z

	xor	a			; ,   
	ld	(HEAD_TIMER),a

	ld	hl,PERS_SET_LEFT
	ld	(PERS_SET_ADDR),hl

	ld	a,PERS_X_OFFS-1
	ld	(GF_X+1),a
	ld	hl,P_GUNF+5
	ld	(PGF_SPR+1),hl
	
	;mob
	xor	a
	ld	(MOB_SPAWN_X+1),a

	ld	a,#D0
	ld	(UD_RET),a

	call	scroll_mini_right

	ld	hl,RIGHT_TABLE
	ld	(WORK_TABLE),hl
	call	L_ON_TABLE
	ld	hl,LEFT_TABLE
	ld	(WORK_TABLE),hl
	call	L_ON_TABLE

	xor	a
	call	PRINT_COLUMN

	ld	hl,(SCREEN_X)
	ld	a,h
	or	l
	jr	nz,no_zero
	ld	hl,(LVL_WIDTH)
no_zero	dec	hl
	ld	(SCREEN_X),hl
	ret

;----------------------------------	
INIT_TABLE
	ld	ix,(WORK_TABLE)

	ld	b,0
IT1	push	bc
	
	ld	de,(CURRENT_LVL)
	call	ADDR_AFTER255
	ld	(ix+LINE_PTR),e
	ld	(ix+LINE_PTR+1),d
	ld	(ix+LINE_START),e
	ld	(ix+LINE_START+1),d
	
	ex	de,hl
	ld	b,(hl)
	inc	hl
	ld	a,(hl)
	ld	(ix+RIBBON_CNT),a
	ld	(ix+RIBBON_MAX),a
	ld	de,(CURRENT_RIB)
	call	ADDR_AFTER255
	

	ld	(ix+RIBBON_PTR),e
	ld	(ix+RIBBON_PTR+1),d
	ld	(ix+RIBBON_START),e
	ld	(ix+RIBBON_START+1),d

	ld	de,table_step
	add	ix,de
	pop	bc

	
	inc	b	
	ld	a,24
	cp	b	
	jr	nz,IT1
	
	ret

;----------------------------------
ADDR_AFTER255
	xor	a	
	cp	b	
	ret	z	
AA1	ld	a,(de)	
	inc	de	
	cp	255
	jr	nz,AA1
	djnz	AA1
	ret

;-------------------------------
PRINT_COLUMN
	ld	(attr_a+1),a
	ld	(prnt_a+1),a

	ld	e,a
	ld	d,0

	and	7
	xor	7
	rlca
	rlca
	rlca
	add	a,#86		;+RES 0,(HL)
	ld	(resbit+1),a	;RES bit,(HL)
	add	a,#40		;RES -> set
	ld	(setbit+1),a	;set bit,(HL)


	ld	a,e
	rrca
	rrca
	rrca
	and	3
	ld	e,a
	ld	hl,MINI_SCR;+3
	add	hl,de
	ld	(MS_ADDR+1),hl

AT_BIT	ld	a,%11011000
	ld	(attr_a+2),a

	ld	ix,(WORK_TABLE)

	ld	a,0
PRR0	push	af
	push	af	

	ld	l,(ix+ribbon_ptr)
	ld	h,(ix+ribbon_ptr+1)
	ld	a,(hl)			; 
	inc	hl	
	ld	b,(hl)			; 


MS_ADDR	ld	hl,0;(MINI_SCR_ADDR)
resbit	res	0,(hl)
	bit	7,b
	jr	z,PRR1
setbit	set	0,(hl)
PRR1	inc	hl	
	inc	hl	
	inc	hl	
	inc	hl	
	ld	(MS_ADDR+1),hl

	res	7,b
attr_a	ld	hl,#0000
	ld	(hl),b
	ld	de,32
	add	hl,de
	ld	(attr_a+1),hl	


	ld	l,a	
	ld	h,0
	add	hl,hl	
	add	hl,hl	
	add	hl,hl	
	ld	de,TILES
	add	hl,de

	pop	bc		;<-af
	ld	a,b
	and	%00011000	;7
PR_BIT	or	%11000000	;7
	ld	d,a		;4
	ld	a,b		;4
	rrca			;4
	rrca			;4
	rrca			;4
	and	%11100000	;7
prnt_a	or	0
	ld	e,a		;4

	ld	b,8
PRR2	ld	a,(hl)	
	ld	(de),a	
	inc	hl	
	inc	d	
	djnz	PRR2

	ld	de,table_step
	add	ix,de

	pop	af
	inc	a
	cp	24
	jr	nz,PRR0

	ret

;------------------------------
R_ON_TABLE
	ld	ix,(WORK_TABLE)

	ld	b,24
NR1	push	bc

	ld	l,(ix+ribbon_ptr)
	ld	h,(ix+ribbon_ptr+1)
	inc	hl
	inc	hl
	ld	a,(hl)	
	cp	255
	jr	nz,NR3
	dec	(ix+ribbon_cnt)
	jr	nz,NR2
	call	R_LINE_PTR
	jr	NR4
NR2	ld	l,(ix+ribbon_start)
	ld	h,(ix+ribbon_start+1)
NR3	ld	(ix+ribbon_ptr),l
	ld	(ix+ribbon_ptr+1),h


NR4	ld	de,table_step
	add	ix,de
	pop	bc
	djnz	NR1

	

	ret	

;------------------------------
L_ON_TABLE
	ld	ix,(WORK_TABLE)

	ld	b,24
pR1	push	bc


	ld	l,(ix+ribbon_ptr)
	ld	h,(ix+ribbon_ptr+1)
	dec	hl
	ld	a,(hl)
	dec	hl
	
	cp	255 
	jr	nz,pR3
	
	inc	(ix+ribbon_cnt)		;6
	ld	a,(ix+ribbon_max)	;5
	inc	a
	cp	(ix+ribbon_cnt)
	jr	nz,pR2			;max >= cnt

	call	L_LINE_PTR

	jr	pR4

pR2	
	ld	l,(ix+ribbon_start)
	ld	h,(ix+ribbon_start+1)
pr5	ld	a,(hl)
	cp	255
	jr	z,pr6
	inc	hl
	jr	pr5
pr6	dec	hl
	dec	hl

pR3	ld	(ix+ribbon_ptr),l
	ld	(ix+ribbon_ptr+1),h


pR4	ld	de,table_step
	add	ix,de
	pop	bc
	djnz	pR1

	

	ret	
	
	
;------------------------------
R_LINE_PTR
	ld	l,(ix+LINE_PTR)
	ld	h,(ix+LINE_PTR+1)
	inc	hl
	inc	hl
	ld	a,(hl)
	cp	255
	jr	nz,NLP1
	ld	l,(ix+LINE_START)
	ld	h,(ix+LINE_START+1)

NLP1	ld	(ix+LINE_PTR),l
	ld	(ix+LINE_PTR+1),h

	ld	b,(hl)	
	ld	de,(CURRENT_RIB)
	call	ADDR_AFTER255
	ld	(ix+RIBBON_PTR),e
	ld	(ix+RIBBON_PTR+1),d
	ld	(ix+RIBBON_START),e
	ld 	(ix+RIBBON_START+1),d
	inc	hl	
	ld	a,(hl)	
	ld	(ix+RIBBON_CNT),a
	ld	(ix+RIBBON_MAX),a
	ret	
	

;------------------------------
L_LINE_PTR
	
	ld	l,(ix+LINE_PTR)
	ld	h,(ix+LINE_PTR+1)

	dec	hl
	ld	a,(hl)
	dec	hl

	cp	255
	jr	nz,pLP1


	ld	l,(ix+LINE_START)
	ld	h,(ix+LINE_START+1)

plp5	ld	a,(hl)
	cp	255
	jr	z,plp6
	inc	hl
	jr	plp5
plp6	dec	hl
	dec	hl

pLP1	ld	(ix+LINE_PTR),l
	ld	(ix+LINE_PTR+1),h

	ld	b,(hl)	
	inc	b

	ld	de,(CURRENT_RIB)
	call	ADDR_AFTER255
	dec	de
	dec	de
	dec	de
	ld	(ix+RIBBON_PTR),e
	ld	(ix+RIBBON_PTR+1),d
llp4	dec	de
	ld	a,(de)
	cp	255
	jr	nz,llp4
	inc	de
	
	ld	(ix+RIBBON_START),e
	ld 	(ix+RIBBON_START+1),d
	

	inc	hl	
	ld	a,(hl)	
	ld	(ix+RIBBON_MAX),a
	ld	(ix+RIBBON_CNT),1

	ret

;----------------------------
ADD_PARTICLE
	ld	b,10
	ld	de,PAR_SIZE
	ld	ix,PARTICLES

ap_cyc	ld	a,(ix+PAR_ACT)
	and	a
	jr	z,ap_new
	add	ix,de
	djnz	ap_cyc
	ret
ap_new
	ld	(ix+PAR_ACT),2

	ld	a,14
	call	RND_255
	inc	a
	ld	(ix+PAR_VEL_UP),a
	ld	(ix+PAR_VEL_UP+1),0

	ld	a,2
	call	RND_255
	ld	(ix+PAR_DX),a

	ld	a,(MOB_X)
	ld	(ix+PAR_X),a
	ld	(ix+PAR_OLD_X),a
	ld	d,a
	
	ld	a,(MOB_Y)
	ld	(ix+PAR_Y),a
	ld	(ix+PAR_OLD_Y),a
	ld	e,a
	

	
	call	ADDR_PIX
	ld	a,(hl)
	ld	(ix+PAR_FON),a
	ret

;----------------------------
UPDATE_PARTICLE
	ld	b,10
	ld	ix,PARTICLES


up_cyc	push	bc
	ld	a,(ix+PAR_ACT)
	and	a
	jr	z,up_nxt

	;vel
	ld	h,(ix+PAR_VEL_UP)
	ld	l,(ix+PAR_VEL_UP+1)
	ld	de,#C6
	and	a	
	sbc	hl,de		;  
	jr	nc,up_pzt	;
	ld	hl,0
up_pzt	ld	(ix+PAR_VEL_UP),h
	ld	(ix+PAR_VEL_UP+1),l



	;y
	ld	a,(ix+PAR_Y)
	add	a,VEL_DN	
	sub	(ix+PAR_VEL_UP)	
	cp	192
	jr	nc,up_del
	ld	(ix+PAR_Y),a

	;x
	ld	hl,(l_shifted)
	ld	a,(ix+PAR_X)
	add	a,(ix+PAR_DX)
	add	a,l
	sub	h
	dec	a
	cp	32
	jr	nc,up_del
	ld	(ix+PAR_X),a

up_nxt	pop	bc
	ld	de,PAR_SIZE
	add	ix,de
	djnz	up_cyc
	ret

up_del	ld	(ix+PAR_ACT),3
	jr	up_nxt


;----------------------------
UPDATE_DAMAGE

	ld	a,(F_PRESSED)
	and	a
	ret	z		;  
	
	call	SHOT_SOUND

	ld	a,(MOB_ACT)
	and	a
	ret	z		;  ,    


	
	ld	a,(PERS_Y)
	add	a,12
	ld	d,a
	ld	a,(MOB_Y)
	cp	d
	ret	nc		;  
	
	add	a,16
	cp	d
	ret	c		;   


	ld	a,(MOB_X)
	cp	15
UD_RET	ret	c






	ld	a,(MOB_HP)
	dec	a
	ld	(MOB_HP),a

	jp	ADD_PARTICLE
;----------------------------
UPDATE_MOB
	ld	a,(MOB_ACT)
	and	a
	jr	nz,upd

	ld	a,50
	call	RND_255
	cp	5
	ret	nz

	ld	a,MOB_MAX_Y
	call	RND_255
	ld	(MOB_Y),a
	ld	(MOB_OLD_Y),a

MOB_SPAWN_X
	ld	a,0
	ld	(MOB_X),a
	ld	(MOB_OLD_X),a
	ld	a,1
	ld	(MOB_ACT),a
	ld	a,30
	ld	(MOB_HP),a
	ld	a,2
	call	RND_255
	ld	(MOB_NOM),a

	call	COPY_MOB_FON
	ret
upd
	ld	hl,(l_shifted)
	ld	a,(MOB_X)
	add	a,l
	sub	h
	ld	(MOB_X),a
	ld	a,(MOB_OLD_X)
	add	a,l
	sub	h
	ld	(MOB_OLD_X),a


		
	ld	a,(MOB_X)
	ld	c,a
	ld	a,(MOB_STEP)
	and	a
	jr	nz,um_decs
	ld	a,15
	cp	c
	jr	c,um_plus
	inc	c
	inc	c
um_plus	dec	c
	ld	a,5
um_decs	dec	a
	ld	(MOB_STEP),a

	ld	a,c
	ld	(MOB_X),a
	cp	31
	jr	nc,um_deact

	ld	a,(MOB_HP)
	and	a
	jr	z,um_deact

	ld	a,(MOB_Y)
	ld	b,a
	ld	a,(PERS_Y)
	sub	8
	cp	b
	jr	nc,um_yadd
	dec	b
	dec	b
um_yadd	inc	b
	ld	a,b
	ld	(MOB_Y),a

	; 
	ld	a,(MOB_X)
	cp	PERS_X_OFFS-1
	ret	c
	cp	PERS_X_OFFS+2
	ret	nc
	ld	a,(MOB_Y)
	ld	b,a
	ld	a,(PERS_Y)
	add	a,32
	cp	b
	ret	c
	sub	48
	cp	b
	ret	nc

	ld	hl,(PERS_HP)
	ld	a,h
	or	l
	jr	z,set_go
	dec	hl
	ld	(PERS_HP),hl
	call	DAMAGE_SOUND
	ret
set_go	ld	a,1
	ld	(GO_FLAG),a
	ret
um_deact
	call	DRAW_MOB_FON
	xor	a
	ld	(MOB_ACT),a
	ld	a,(LOOT_ID)
	and	a
	ret	nz	;  
	ld	a,(MOB_HP)
	and	a
	ret	nz	;  ,  


	ld	bc,(SCREEN_X)
	ld	hl,(MOB_X)
	ld	h,0
	add	hl,bc
	ld	bc,(LVL_WIDTH)
	and	a
	sbc	hl,bc
	jr	nc,x_crct
	add	hl,bc
x_crct	ld	(LOOT_X),hl
	ld	a,(MOB_Y)
	add	a,4
	ld	(LOOT_Y),a
	ld	a,100
	ld	(LOOT_TIME),a
	ld	a,ID_FUEL
	ld	(LOOT_ID),a

	ret
;----------------------------
UPDATE
	
	; 
	ld	a,(HEAD_TIMER)
	and	a
	jr	z,u_notrn
	dec	a
	ld	(HEAD_TIMER),a
u_notrn	ld	a,255
	call	RND_255
	cp	5		; 
	jr	nc,noheadt	; 
	ld	a,16
	ld	(HEAD_TIMER),a
noheadt

	; 
	ld	a,(JETPAK_ON)
	and	a
	jr	z,nojetp	;  
	ld	a,(U_PRESSED)
	and	a
	jr	z,nojetp	;  
	ld	hl,(JETPAK_FUEL)
	ld	a,h
	or	l
	jr	z,nojetp	; 
	dec	hl		; 
	ld	(JETPAK_FUEL),hl
	ld	l,0	
	ld	h,VEL_DN+3	; 
	jr	u_pzt		;   

nojetp	;  
	ld	hl,(VEL_UP)
	ld	de,(JMP_FADING)
	and	a	
	sbc	hl,de		;  
	;ld	a,#ff		;   
	;cp	h
	jr	nc,u_pzt	;
	ld	hl,0

u_pzt	ld	(VEL_UP),hl	;   
	ld	a,(VEL_UP+1)	;    
	ld	b,a	
	;ld	a,VEL_DN
	;ld	d,a	
	ld	a,(PERS_Y)
	ld	(PERS_OLD_Y),a
	ld	e,a
	add	a,VEL_DN;d	
	sub	b	
	ld	(PERS_Y),a
	cp	e		;  PERS_OLD_Y
	jr	c,no_jet_on	;    
	ld	a,(U_PRESSED)
	and	a
	jr	z,no_jet_on
	ld	a,1
	ld	(JETPAK_ON),a
no_jet_on

	call	COLLISION


	;    
	ld	a,(PERS_Y)
	cp	161
	ret	c		;PERS_Y < 161
	cp	232
	ret	nc		;PERS_Y >= 232
	cp	192
	jr	c,lvl_dn	;PERS_Y < 192

	ld	b,160		; Y 
	ld	a,(UP_LEVEL_NOM)
	cp	255
	jr	nz,uln
	ld	a,2
	ld	(GO_FLAG),a
	ret
uln	ld	h,0
	ld	l,a
	jp	INIT_LEVEL

lvl_dn
	ld	b,232		; Y 
	ld	a,(DN_LEVEL_NOM)
	cp	255
	jr	nz,dln
	ld	a,160
	ld	(PERS_Y),a

	ld	hl,(PERS_HP)
	ld	a,h
	or	l
	jr	nz,nodead
	ld	a,3
	ld	(GO_FLAG),a
nodead	dec	hl
	ld	(PERS_HP),hl
	call	DAMAGE_SOUND
	ret





dln	ld	h,0
	ld	l,a
	jp	INIT_LEVEL
	ret


;---------------------------------
SHUTTLE_TEST
	ld	a,(D_PRESSED)
	and	a
	ret	z

	ld	a,(LVL_NOM)
	and	a
	ret	nz	; 

	ld	hl,(SCREEN_X)
	ld	a,h
	or	l
	ret	nz	; 

	ld	a,(PERS_Y)
	cp	120
	ret	nz	; 

	ld	a,(MINERAL)
	ld	b,a
	ld	a,(ORGANIC)
	and	b
	cp	20
	jp	nz,ABORT_MSG
	ld	a,4
	ld	(GO_FLAG),a
	ret

;---------------------------------
TP_TEST
	
	ld	a,(D_PRESSED)
	and	a
	ret	z

	; 
	ld	hl,(TP_LIST)
tp_nxt	ld	a,255
	cp	(hl)
	ret	z		; 
	ld	a,(hl)		;ID 
	ld	(tp_key+1),a
	
	
	inc	hl

	ld	a,(PERS_Y)
	cp	(hl)
	jr	z,tp_yfind
	ld	de,7		; 
	add	hl,de
	jr	tp_nxt
tp_yfind
	;jr	$
	inc	hl
	ld	e,(hl)
	inc	hl
	ld	d,(hl)
	ld	bc,(SCREEN_X)
	ld	a,c
	xor	e
	jr	z,tp_x1find
	ld	de,5		; 
	add	hl,de
	jr	tp_nxt
tp_x1find
	;jr	$
	ld	a,b
	xor	d
	jr	z,tp_x2find
	ld	de,5
	add	hl,de
	jr	tp_nxt
tp_x2find

	ex	de,hl
tp_key	ld	bc,0
	ld	hl,P_KEYS
	add	hl,bc
	ld	a,(hl)
	ex	de,hl
	and	a
	jr	nz,tp_keyfind
	ld	de,5
	add	hl,de

	call	NEED_KEY_MSG

	jr	tp_nxt		; 


tp_keyfind
	push	hl
	call	PORTAL_SOUND
	pop	hl

	inc	hl
	ld	a,(hl)	;target_lvl
	inc	hl
	ld	b,(hl)	;target_y
	inc	hl
	ld	e,(hl)	;target_x
	inc	hl
	ld	d,(hl)
	ld	(SCREEN_X),de
	
	ld	h,0
	ld	l,a
	jp	INIT_LEVEL

;---------------------------------
ITEM_TEST
	ld	hl,LOOT
	ld	a,(hl)
	and	a
	jr	z,itms
	ld	a,(LOOT_TIME)
	dec	a
	jr	nz,l_nodel
l_del	ld	a,TO_DEL
	ld	(hl),a
	jr	itms
l_nodel	ld	(LOOT_TIME),a
	inc	hl
	call	ITEM_COLLISION
	and	a
	jr	z,itms
	ld	hl,LOOT
	ld	a,TO_DEL
	ld	(hl),a
	ld	bc,10
	ld	hl,(JETPAK_FUEL)
	add	hl,bc
	ld	(JETPAK_FUEL),hl
	call	FIND_FUEL_MSG




itms	ld	hl,(ITEM_LIST)
	ld	de,IT_SIZE
	and	a
	sbc	hl,de

it_nxt	ld	de,IT_SIZE
	add	hl,de
	ld	a,(hl)		;->id
	cp	255
	ret	z		; 
	and	%10000000
	jr	nz,it_nxt	;id + del_flag	

	;ld	de,5
	;add	hl,de
	;jr	it_nxt
;is_id
	push	hl
	inc	hl
	inc	hl		;->y
	call	ITEM_COLLISION
	pop	hl
	;ld	a,1
	and	a
	jr	z,it_nxt
	
	ld	a,(hl)
	cp	ID_KEY
	jr	z,it_key
	cp	ID_FUEL
	jr	z,it_fuel
	cp	ID_MINE
	jr	z,it_mine
	cp	ID_ORGA
	jr	z,it_orga

	jr	it_nxt

it_key	push	hl
	ld	a,(hl)
	or	TO_DEL
	ld	(hl),a
	inc	hl
	ld	b,0
	ld	c,(hl)
	;ex	de,hl
	ld	hl,P_KEYS
	add	hl,bc
	ld	a,1
	ld	(hl),a
	;ex	de,hl
	call	FIND_KEY_MSG
	pop	hl
	jr	it_nxt

it_fuel	push	hl
	ld	a,(hl)
	or	TO_DEL
	ld	(hl),a
	inc	hl
	ld	c,(hl)
	ld	b,0
	ld	hl,(JETPAK_FUEL)
	add	hl,bc
	ld	(JETPAK_FUEL),hl
	call	FIND_FUEL_MSG
	pop	hl
	jr	it_nxt

it_mine	push	hl
	ld	a,(hl)
	or	TO_DEL
	ld	(hl),a
	ld	a,(MINERAL)
	inc	a
	ld	(MINERAL),a
	call	FIND_MINE_MSG
	pop	hl
	jr	it_nxt

it_orga	push	hl
	ld	a,(hl)
	or	TO_DEL
	ld	(hl),a
	ld	a,(ORGANIC)
	inc	a
	ld	(ORGANIC),a
	call	FIND_ORGA_MSG
	pop	hl
	jr	it_nxt
;---------------------------------
ITEM_COLLISION
	;  Y
	ld	a,(PERS_Y)
	sub	8
	cp	(hl)
	jr	c,ic_yfind1	;pers_y < item_y
	xor	a
	ret			; 
ic_yfind1
	add	a,39		;  
	cp	(hl)
	jr	nc,ic_yfind2	;8 + pers_y + 31 > item_y 
	xor	a
	ret			; 
ic_yfind2

	;  X
	ex	de,hl
	ld	hl,(SCREEN_X)
	ld	bc,16
	add	hl,bc
	ld	bc,(LVL_WIDTH)
	and	a
	sbc	hl,bc
	jr	nc,ic_posi
	add	hl,bc		; x 
ic_posi	ld	b,h
	ld	c,l
	ex	de,hl		; HL  DE
	
	inc	hl		;->x
	ld	e,(hl)
	inc	hl
	ld	d,(hl)

	ld	a,c
	xor	e
	jr	z,ic_x1find
	dec	bc
	ld	a,c
	inc	bc
	xor	e
	jr	z,ic_x1find
	xor	a
	ret			; 
ic_x1find
	ld	a,b
	xor	d
	jr	z,i_x2find
	dec	bc
	ld	a,b
	xor	d
	jr	z,i_x2find
	xor	a
	ret			; 
i_x2find

	ld	a,1		;
	ret

;---------------------------------	
COLLISION
	ld	a,1
	ld	(fly),a
	ld	a,(PERS_Y)
	ld	c,a
	
	; 
	ld	hl,MINI_SCR-128+1	;  ( 32  ,  y<0)
	ld	a,191
	cp	c	
	jr	c,cl_noadd_mini		;y > 191	c > a
	ld	de,128
	add	hl,de
cl_noadd_mini

	ld	de,4
	ld	a,c
	srl	a
	srl	a
	srl	a
cl_1	and	a	
	jr	z,cl_2
	add	hl,de	
	dec	a	
	jr	cl_1
cl_2	ld	(r_WALL),a
	ld	(l_WALL),a


	ld	b,5		;5  	

	;----------
	; 
	ld	a,191
	cp	c	
	jr	c,no_ceil	;Y > 191

	ld	a,(hl)	
	and	%00000001
	ld	d,a
	inc	hl
	ld	a,(hl)
	dec	hl	
	and	%10000000
	or	d
	jr	z,no_ceil	;   
	ld	a,(PERS_Y)	;
	and	%11111000	
	add	a,8		;
	ld	(PERS_Y),a
	ld	e,0
	ld	d,VEL_DN
	ld	(VEL_UP),de	;   
	ld	de,4
	ld	b,4		; 4  

	add	hl,de		;   ( )
	ld	a,8
	add	a,c
	ld	c,a
	jr	wall	;   ,    , 
no_ceil

	;----------
	; 
	ld	a,32
	add	a,c
	cp	192	
	jr	nc,wall		;Y(A) >= 192(x)

	push	hl	;  ( )
	ld	de,16
	add	hl,de
	
	ld	a,(hl)	
	and	%00000001
	ld	d,a
	inc	hl
	ld	a,(hl)
	dec	hl	
	and	%10000000
	or	d
	jr	z,no_floor	;   
	xor	a		;
	ld	(fly),a		;  
	ld	(JETPAK_ON),a	;  
	ld	a,(PERS_Y)
	and	%11111000
	ld	(PERS_Y),a	; 
	ld	b,4		; 4  
	ld	l,0
	ld	h,VEL_DN	; 

	ld	a,(U_PRESSED)
	and	a	
	jr	z,cl_nojump	;  
	ld	hl,JMP_IMPULS	; ,  
cl_nojump
	ld	(VEL_UP),hl	; 
no_floor
	pop	hl	;  
	ld	de,4






	;----------
	; 
wall	ld	a,(VEL_UP+1)
	cp	VEL_DN
	jr	nc,wl_cyc
	dec	b	;       

wl_cyc	ld	a,191
	cp	c	
	jr	c,cl_add	;Y > 191

	bit	1,(hl)		;  
	jr	z,no_lw
	ld	a,1
	ld	(L_WALL),a
no_lw	inc	hl
	bit	6,(hl)		;  
	jr	z,no_rw
	ld	a,1
	ld	(R_WALL),a
no_rw	dec	hl

cl_add	add	hl,de		;  
	ld	a,8
	add	a,c
	ld	c,a
	djnz	wl_cyc


	ret
	
;-----------------------------
SWAP_SCREEN
	DI
	ld	a,(PORT_COPY)
	xor	%00001000
	ld	(PORT_COPY),a
	ld	bc,#7FFD
	out	(c),a
	EI
	
	ld	a,(S_SRC+2)
	xor	%10000000
	ld	(S_SRC+2),a

	ld	a,(S_DST+2)
	xor	%10000000
	ld	(S_DST+2),a
	
	ld	a,(PR_BIT+1)
	xor	%10000000
	ld	(PR_BIT+1),a

	ld	a,(AT_BIT+1)
	xor	%10000000
	ld	(AT_BIT+1),a
	
	ld	a,(AP_BIT+1)
	xor	%10000000
	ld	(AP_BIT+1),a

	ld	a,(AXY_BIT+1)
	xor	%10000000
	ld	(AXY_BIT+1),a

	ret	
PORT_COPY	defb	0
;--------------------------
SET_PAGE_MODE_A
	DI
	LD	(PORT_COPY),A
	LD	BC,#7FFD
	OUT	(C),A
	EI
	RET

;------------------------------------
DRAW_PAR_FON
	ld	b,10
	ld	ix,PARTICLES

dpf_cyc
	ld	a,(ix+PAR_ACT)
	and	a
	jr	z,dpf_nxt	; 

	cp	2
	jr	nz,no_first	;  
	ld	(ix+PAR_ACT),1
	jr	dpf_nxt		;    

no_first
	cp	3
	jr	nz,dpf_nodel
	ld	(ix+PAR_ACT),0	;  
dpf_nodel

	ld	hl,(l_shifted)
	ld	e,(ix+PAR_OLD_Y)
	ld	a,(ix+PAR_OLD_X)
	add	a,l
	sub	h


	;ld	a,(ix+PAR_OLD_Y)
	;cp	192
	;jr	nc,dpf_nxt
	;ld	e,a	

	;ld	a,(ix+PAR_OLD_X)
	cp	32
	jr	nc,dpf_nxt
	ld	d,a

	;ld	d,(ix+PAR_OLD_X)
	;ld	e,(ix+PAR_OLD_Y)
	call	ADDR_PIX

	ld	a,(ix+PAR_FON)
	ld	(hl),a

dpf_nxt	ld	de,PAR_SIZE
	add	ix,de
	djnz	dpf_cyc

	ret

;------------------------------------
COPY_PAR_FON
	ld	b,10
	ld	ix,PARTICLES

cpf_cyc
	ld	a,(ix+PAR_ACT)
	and	a
	jr	z,cpf_nxt

	;ld	a,(ix+PAR_X)
	;cp	32
	;jr	nc,cpf_nxt
	;ld	(ix+PAR_OLD_X),a
	;ld	d,a

	;ld	a,(ix+PAR_Y)
	;ld	(ix+PAR_OLD_Y),a
	;ld	e,a

	ld	d,(ix+PAR_X)
	ld	e,(ix+PAR_Y)
	ld	(ix+PAR_OLD_X),d
	ld	(ix+PAR_OLD_Y),e

	call	ADDR_PIX
	;ld	(dp_addr+1),hl

	
	ld	a,(hl)
	ld	(ix+PAR_FON),a

cpf_nxt	ld	de,PAR_SIZE
	add	ix,de
	djnz	cpf_cyc
	ret

;------------------------------------
DRAW_PARTICLE
	ld	b,10
	ld	ix,PARTICLES

dp_cyc





	ld	a,(ix+PAR_ACT)
	and	a
	jr	z,dp_nxt

	
	;ld	a,(ix+PAR_X)
	;cp	32
	;jr	nc,dp_nxt
	;ld	d,a
	;ld	a,(ix+PAR_Y)
	;ld	e,a

	ld	d,(ix+PAR_X)
	ld	e,(ix+PAR_Y)
	call	ADDR_PIX


	ld	a,24;255
	ld	(hl),a

dp_nxt	ld	de,PAR_SIZE
	add	ix,de
	djnz	dp_cyc
	ret


;------------------------------------
DRAW_MOB_FON
	ld	a,(MOB_ACT)
	and	a
	ret	z


	ld	a,(MOB_OLD_Y)
	cp	MOB_MAX_Y
	ret	nc	;y > MOB_MAX_Y

	ld	e,a
	push	de	

	ld	a,(MOB_OLD_X)
	cp	32
	jr	nc,dmf_2c
	
	ld	d,a
	call	ADDR_PIX

	ld	de,MOB_FON
	ld	b,16
dmf_nxt	ld	a,(de)
	ld	(hl),a
	inc	de
	inc	de
	call	DOWN_HL
	djnz	dmf_nxt

dmf_2c	pop	de
	ld	a,(MOB_OLD_X)
	inc	a
	cp	32
	ret	nc
	ld	d,a
	call	ADDR_PIX
	
	ld	de,MOB_FON+1
	ld	b,16
dmf_nx2	ld	a,(de)
	ld	(hl),a
	inc	de
	inc	de
	call	DOWN_HL
	djnz	dmf_nx2

	ret

;------------------------------------
COPY_MOB_FON
	ld	a,#C9
	ld	(dm_ret),a
	ld	a,(MOB_Y)
	cp	MOB_MAX_Y
	ret	nc	;y > MOB_MAX_Y

	ld	(MOB_OLD_Y),a

	ld	b,a
	ld	a,(MOB_X)
	ld	(MOB_OLD_X),a
	;cp	31
	;ret	nc

	ld	e,b
	ld	d,a
	call	ADDR_PIX
	ld	(dm_addr+1),hl

	ld	de,MOB_FON

	ld	b,16
cmf_nxt	ld	a,(hl)
	ld	(de),a
	inc	de
	inc	hl
	ld	a,(hl)
	ld	(de),a
	inc	de
	dec	hl
	call	DOWN_HL
	djnz	cmf_nxt

	xor	a
	ld	(dm_ret),a
	ret



;------------------------------------
DRAW_MOB
	ld	a,(MOB_ACT)
	and	a
	ret	z

dm_ret	nop

	ld	a,(MOB_NOM)
	rrca
	rrca
	ld	e,a
	ld	d,0
	ld	hl,S_MOB
	add	hl,de
	ld	a,(XOR_FLAG)
	and	a
	jr	z,no_faze
	ld	de,32
	add	hl,de
no_faze	ex	de,hl



dm_addr	ld	hl,0

	

	ld	b,16
dm_nxt	ld	a,(de)
	ld	(hl),a
	inc	hl
	inc	de
	ld	a,(de)
	ld	(hl),a
	dec	hl
	inc	de
	call	DOWN_HL
	djnz	dm_nxt
	ret

S_MOB	DEFB	0,0,48,12,74,82,138,81,137,145,75,210,58,220,4,224,7,224,0,0,3,192,11,208,57,156,66,66,2,64,0,0
	DEFB	0,0,2,64,2,64,0,0,1,128,115,206,138,209,148,233,167,229,64,2,3,192,11,208,17,136,34,68,36,36,0,0

	DEFB	0,0,102,100,48,66,7,238,61,248,107,240,15,252,55,228,96,134,13,48,28,184,24,24,24,24,12,48,4,32,0,0
	DEFB	50,96,16,34,10,70,103,232,157,240,11,242,31,250,103,238,0,128,29,56,56,156,49,140,97,6,96,134,64,2,64,2

	DEFB	0,0,3,240,28,252,39,250,95,254,255,255,249,207,255,127,221,91,138,49,6,128,13,184,25,136,16,140,48,134,0,194
	DEFB	0,0,3,224,12,240,19,248,23,248,47,252,60,156,63,252,45,116,38,164,2,176,29,120,49,204,35,68,22,36,4,40




;------------------------------------
DRAW_GUNFIRE_FON
	ld	a,(PERS_OLD_Y)
	add	a,12
	cp	192
	ret	nc	;y > 191

	ld	e,a
	ld	a,(PERS_OLD_GFX)
	ld	hl,(l_shifted)
	add	a,l
	sub	h
	ld	d,a
	call	ADDR_PIX

	ld	de,P_GUNF_FON

	ld	b,5
dgf_nxt	ld	a,(de)
	ld	(hl),a
	call	DOWN_HL
	inc	de
	djnz	dgf_nxt
	ret

;------------------------------------
COPY_GUNFIRE_FON
	ld	a,#C9
	ld	(dg_ret),a
	ld	a,(PERS_Y)
	add	a,12
	cp	192
	ret	nc	;y > 191

	ld	e,a
GF_X	ld	a,17
	ld	(PERS_OLD_GFX),a
	ld	d,a
	call	ADDR_PIX
	ld	(dg_addr+1),hl

	ld	de,P_GUNF_FON

	ld	b,5
cgf_nxt	ld	a,(hl)
	ld	(de),a
	call	DOWN_HL
	inc	de
	djnz	cgf_nxt

	xor	a
	ld	(dg_ret),a
	ret

;------------------------------------
DRAW_GUNFIRE
	ld	a,(F_PRESSED)
	and	a
	ret	z
	ld	a,(XOR_FLAG)
	and	a
	ret	z

dg_ret	nop

dg_addr	ld	hl,0

PGF_SPR	ld	de,P_GUNF

	ld	b,5
dg_nxt	ld	a,(de)
	ld	(hl),a
	call	DOWN_HL
	inc	de
	djnz	dg_nxt
	ret

	


;-------------------------
DRAW_PERS_FON
	ld	a,DS_NOP
	ld	(ds_mod1),a
	ld	(ds_mod2),a
	ld	hl,(l_shifted)	
	ld	a,PERS_X_OFFS
	add	a,l		;     
	sub	h		;     
	ld	d,a	
	ld	a,(PERS_OLD_Y)
	ld	e,a
	ld	hl,PERS_FON
	ld	b,32
	call	DRAW_SOURCE
	ret

;----------------------------	
COPY_PERS_FON
	ld	hl,PERS_FON
	ld	a,(PERS_Y)
	ld	b,32
cpfdn	cp	192
	jr	c,y_cpyf	;y < 192
	inc	a		; y     
	inc	hl
	inc	hl
	djnz	cpfdn		;   
	ret			;   , 0 

y_cpyf	ld	e,a	
	ld	d,PERS_X_OFFS

	push	hl
	call	ADDR_PIX
	pop	de

	;ld	de,PERS_FON
	;ld	b,32
cf1	ld	a,(hl)	
	ld	(de),a	
	inc	hl	
	inc	de	
	ld	a,(hl)	
	ld	(de),a	
	dec	hl	
	inc	de	
	call	DOWN_HL
	djnz	cf1
	ret
;----------------------------
CLR_PERS_FON
	ld	a,(PERS_Y)
	ld	b,32
cp_down	cp	192
	jr	c,y_cpf		;y < 192
	inc	a		; y     
	djnz	cp_down		;   
	ret			;   , 0 

			
y_cpf	ld	e,a	
	ld	d,PERS_X_OFFS

	call	ADDR_PIX
	
cpf1	xor	a	
	ld	(hl),a	
	inc	hl	
	ld	(hl),a		
	dec	hl	
	call	DOWN_HL
	djnz	cpf1
	ret	


;-------------------------
PERS_SET_ADDR
	defw	PERS_SET_RIGHT
PERS_SET_RIGHT
	defw	P_HEAD
	defw	P_HEAD+P_SIZE
	defw	P_CORP
	defw	P_LEG1
	defw	P_LEG2
	defw	P_LEG3
	defw	P_LEG2
	defw	P_LEG4
	defw	P_JET1
	defw	P_JET2
PERS_SET_LEFT
	defw	P_HEAD+P_SIZE
	defw	P_HEAD
	defw	P_CORP+P_SIZE
	defw	P_LEG1+P_SIZE
	defw	P_LEG2+P_SIZE
	defw	P_LEG3+P_SIZE
	defw	P_LEG2+P_SIZE
	defw	P_LEG4+P_SIZE
	defw	P_JET1+P_SIZE
	defw	P_JET2+P_SIZE

;-------------------------
DRAW_PERS
	call	CLR_PERS_FON

	; 
	ld	hl,(L_PRESSED)
	ld	a,h
	xor	l
	jr	z,dp_zf
	ld	a,(SCREEN_X)
	srl	a
	and	3
dp_zf	ld	(PERS_FAZE),a

	; 
	ld	a,DS_OR
	ld	(ds_mod1),a
	ld	(ds_mod2),a

	;  
	ld	de,4
	ld	hl,(PERS_SET_ADDR)
	ld	a,(HEAD_TIMER)
	and	a
	jr	z,dp_nohplus
	inc	hl
	inc	hl
	ld	de,2
dp_nohplus
	ld	(dp_head+1),hl
	add	hl,de

	ld	(dp_corp+1),hl
	inc	hl
	inc	hl

	ld	de,8
	ld	a,(fly)
	and	a
	jr	nz,dp_fly
	ld	a,(PERS_FAZE)
	rlca
	ld	e,a
	ld	d,0
dp_fly	add	hl,de
	ld	(dp_leg+1),hl
	
	ld	hl,(PERS_SET_ADDR)
	ld	de,16
	add	hl,de
	ld	a,(XOR_FLAG)
	xor	1
	ld	(XOR_FLAG),a
	and	a
	jr	nz,no_jets
	inc	hl
	inc	hl
no_jets	ld	(dp_jet+1),hl


	;  y
	ld	a,(PERS_FAZE)
	and	1
	ld	e,a
	ld	a,(PERS_Y)
	sub	e
	ld	(dp_hdy+1),a
	add	a,8
	ld	(dp_cy+1),a
	add	a,10
	ld	(dp_jy+1),a
	add	a,3


	; 
dp_ly	ld	e,a	
	ld	d,PERS_X_OFFS
dp_leg	ld	hl,(0)
	ld	b,(hl)
	inc	hl
	call	DRAW_SOURCE

	; 
dp_hdy	ld	e,0
	ld	d,PERS_X_OFFS
dp_head	ld	hl,(0)
	ld	b,(hl)
	inc	hl
	call	DRAW_SOURCE

	; 
dp_cy	ld	e,0
	ld	d,PERS_X_OFFS
dp_corp	ld	hl,(0)
	ld	b,(hl)
	inc	hl
	call	DRAW_SOURCE

	ld	a,(JETPAK_ON)
	ld	c,a
	ld	a,(U_PRESSED)
	and	c
	ret	z		
	ld	hl,(JETPAK_FUEL)
	ld	a,h
	or	l
	ret	z	;  

	;  
dp_jy	ld	e,0	
	ld	d,PERS_X_OFFS
dp_jet	ld	hl,(0)
	ld	b,(hl)
	inc	hl
	call	DRAW_SOURCE


	ret

;-------------------------
DRAW_LOOT
	ld	hl,LOOT
	ld	a,(hl)
	and	a
	ret	z
	cp	TO_DEL
	jr	nz,dl_ndel
	xor	a
	ld	(hl),a
dl_ndel	ld	(di_num+1),a	;  = id
	inc	hl
	call	DRAW_ITEM
	ret

;-------------------------
DRAW_ITEMS
TO_DEL		equ	%01000000
NO_ITEM		equ	%10000000
DI_CLEAR	equ	#AF	;xor	a
DI_DRAW		equ	#1A	;ld	a,(de)

	ld	(DI_MODE+1),a
	ld	hl,(ITEM_LIST)
	ld	de,IT_SIZE
	and	a
	sbc	hl,de
	
di_nxt	ld	de,IT_SIZE
	add	hl,de
	ld	a,(hl)
	cp	255		;ID
	ret	z		; 
	and	NO_ITEM
	jr	nz,di_nxt	;NO_ITEM

	ld	a,(hl)
	cp	TO_DEL		;  
	jr	c,di_ndel
	or	NO_ITEM
	ld	(hl),a
	and	255 - NO_ITEM - TO_DEL
di_ndel	ld	(di_num+1),a	;  = id

	push	hl
	inc	hl	;val
	inc	hl	;y
	call	DRAW_ITEM
	pop	hl

	jr	di_nxt


;------------------------
DRAW_ITEM
	ld	a,(hl)
	ld	(di_y+1),a
	inc	hl	;x

	ld	e,(hl)
	inc	hl
	ld	d,(hl)		; DE - x 

	ex	de,hl		; HL - x 
	ld	(di_pop+1),hl	;   
	ld	bc,(SCREEN_X)
	and	a		;  C
	sbc	hl,bc		;10 - 63 = -53
	jr	nc,di_findx1	;SCREEN_X <= x,  

	;hl < 0,  
	ld	bc,(LVL_WIDTH)
di_pop	ld	hl,0
	add	hl,bc		;LVL_WIDTH + x 
	ld	bc,(SCREEN_X)
	and	a		;  C
	sbc	hl,bc		;10+64 - 63 = 11
	ret	c		;SCREEN_X > x,  
di_findx1
	ex	de,hl		; DE  
	ld	a,d
	and	a
	ret	nz		;  256,  
	ld	a,e
	cp	32
	ret	nc		; >= 32,  

	ld	d,e		;x
di_y	ld	e,0		;y

	call	ADDR_PIX

	ex	de,hl
di_num	ld	a,0
	dec	a
	add	a,a
	add	a,a
	add	a,a
	ld	l,a
	ld	h,0
	ld	bc,ITEMS_SPRITES
	add	hl,bc
	ex	de,hl

	ld	b,8
DI_MODE	ld	a,(de)
	xor	(hl)
	ld	(hl),a
	call	DOWN_HL
	inc	de
	djnz	DI_MODE
	ret

;------------------------
DRAW_SOURCE

	ld	a,191
ds_down	cp	e
	jr	nc,y_correct	;y <= 191
	inc	hl		;  
	inc	hl
	inc	e		; y     
	djnz	ds_down		;   
	ret			;   , 0 


y_correct
	push	hl		;  
	call	ADDR_PIX	; hl  
	pop	de		; de  
ds_nl	ld	a,(de)
ds_mod1	nop
	ld	(hl),a	
	inc	hl	
	inc	de	
	ld	a,(de)
ds_mod2	nop	
	ld	(hl),a	
	dec	hl	
	inc	de	
	call	DOWN_HL
	djnz	ds_nl
	ret
DS_NOP	equ	#00
DS_OR	equ	#B6
DS_XOR	equ	#AE





;------------------------------------	
SCROLL_MINI_LEFT
	ld hl,MINI_SCR+95
	ld b,96
SML	rl (hl)
	dec hl	
	djnz SML
	ret

;------------------------------------	
SCROLL_MINI_RIGHT
	ld hl,MINI_SCR
	ld b,96
SMR	rr (hl)
	inc hl	
	djnz SMR
	ret





;-----------------------------------
CLS
	ld	de,0
	call	ADDR_XY
	ld	d,h
	inc	e
	ld	bc,6911
	xor	a
	ld	(hl),a
	ldir
	ret




	

;--------------------------------------
;TABLES
;--------------------------------------
LINE_PTR	equ	0	;2
LINE_START	equ	2	;2
RIBBON_PTR	equ	4	;2
RIBBON_START	equ	6	;2
ribbon_cnt	equ	8	;1
ribbon_max	equ	9	;1

table_size	equ	240
table_step	equ	10


RIGHT_TABLE	DEFS	table_size,0
LEFT_TABLE	DEFS	table_size,0

	
MINI_SCR	defs	96,0





;-----------------------------
LEVELS_DATA	defw	level1
		defw	ribbons1
		defb	255
		defb	1
		defw	TELEPORTS1
		defw	ITEMS1

		defw	level2
		defw	ribbons2
		defb	0
		defb	2
		defw	TELEPORTS2
		defw	ITEMS2

		defw	level3
		defw	ribbons2
		defb	1
		defb	3
		defw	TELEPORTS3
		defw	ITEMS3

		defw	level4
		defw	ribbons2
		defb	2
		defb	4
		defw	TELEPORTS4
		defw	ITEMS4

		defw	level5
		defw	ribbons2
		defb	3
		defb	5
		defw	TELEPORTS5
		defw	ITEMS5

		defw	level6
		defw	ribbons2
		defb	4
		defb	255
		defw	TELEPORTS6
		defw	ITEMS6







;--------------------------------------
;TELEPORT_LIST
;--------------------------------------
TELEPORTS0	defb	255
TELEPORTS1	defb	5		;key(1)
		defb	144		;y(1)
		defw	122		;x(2)
		defb	4		;target_lvl(1)
		defb	80		;target_y(1)
		defw	288		;target_x(2)

		defb	4		;key(1)
		defb	144		;y(1)
		defw	270		;x(2)
		defb	1		;target_lvl(1)
		defb	152		;target_y(1)
		defw	320-8		;target_x(2)
		;...
		defb	255

TELEPORTS2	defb	1		;key(1)
		defb	152		;y(1)
		defw	312		;x(2)
		defb	2		;target_lvl(1)
		defb	152		;target_y(1)
		defw	54		;target_x(2)

		defb	3		;key(1)
		defb	120		;y(1)
		defw	272		;x(2)
		defb	3		;target_lvl(1)
		defb	48		;target_y(1)
		defw	120		;target_x(2)
		;...
		defb	255

TELEPORTS3	defb	2		;key(1)
		defb	152		;y(1)
		defw	54		;x(2)
		defb	5		;target_lvl(1)
		defb	64		;target_y(1)
		defw	320-4		;target_x(2)
		;...
		defb	255


TELEPORTS4	defb	0		;key(1)
		defb	48		;y(1)
		defw	120		;x(2)
		defb	0		;target_lvl(1)
		defb	144		;target_y(1)
		defw	122		;target_x(2)

		defb	3		;key(1)
		defb	24		;y(1)
		defw	86		;x(2)
		defb	1		;target_lvl(1)
		defb	120		;target_y(1)
		defw	272		;target_x(2)

		;...
		defb	255

TELEPORTS5	defb	5		;key(1)
		defb	80		;y(1)
		defw	288		;x(2)
		defb	1		;target_lvl(1)
		defb	120		;target_y(1)
		defw	272		;target_x(2)



TELEPORTS6	defb	0		;key(1)
		defb	64		;y(1)
		defw	320-4		;x(2)
		defb	0		;target_lvl(1)
		defb	144		;target_y(1)
		defw	122		;target_x(2)

		defb	4		;key(1)
		defb	152		;y(1)
		defw	138		;x(2)
		defb	0		;target_lvl(1)
		defb	144		;target_y(1)
		defw	270		;target_x(2)

		;...
		defb	255


;--------------------------------------
;ITEM_LIST
;--------------------------------------
ID_NONE		equ	0
ID_FUEL		equ	1
ID_KEY		equ	2
ID_MINE		equ	3
ID_ORGA		equ	4
IT_SIZE		equ	5

ITEMS0	defb	255

ITEMS1
	defb	ID_KEY		;id(1)
	defb	0		;value(1)
	defb	152		;y(1)
	defw	54		;x(2)

	defb	ID_KEY		;id(1)
	defb	5		;value(1)
	defb	128		;y(1)
	defw	250		;x(2)
	
	
	defb	ID_ORGA		;id(1)
	defb	0		;value(1)
	defb	160		;y(1)
	defw	82		;x(2)

	defb	ID_ORGA		;id(1)
	defb	0		;value(2)
	defb	144		;y(1)
	defw	266		;x(2)

	defb	ID_ORGA		;id(1)
	defb	0		;value(3)
	defb	64		;y(1)
	defw	308		;x(2)

	defb	ID_MINE		;id(1)
	defb	0		;value(19)
	defb	168		;y(1)
	defw	300		;x(2)

	defb	ID_MINE		;id(1)
	defb	0		;value(20)
	defb	168		;y(1)
	defw	225		;x(2)

	;...
	defb	255

ITEMS2
	defb	ID_MINE		;id(1)
	defb	0		;value(1)
	defb	96		;y(1)
	defw	64		;x(2)
	
	defb	ID_MINE		;id(1)
	defb	0		;value(2)
	defb	72		;y(1)
	defw	148		;x(2)

	defb	ID_MINE		;id(1)
	defb	0		;value(3)
	defb	80		;y(1)
	defw	194		;x(2)

	defb	ID_MINE		;id(1)
	defb	0		;value(4)
	defb	144		;y(1)
	defw	314		;x(2)

	defb	ID_ORGA		;id(1)
	defb	0		;value(4)
	defb	64		;y(1)
	defw	221		;x(2)

	
	defb	ID_FUEL		;id(1)
	defb	255		;value(1)
	defb	168		;y(1)
	defw	186		;x(2)

	

	;...
	defb	255

ITEMS3
	defb	ID_KEY		;id(1)
	defb	4		;value(1)
	defb	128		;y(1)
	defw	246		;x(2)
	
	defb	ID_MINE		;id(1)
	defb	0		;value(5)
	defb	128		;y(1)
	defw	306		;x(2)

	defb	ID_MINE		;id(1)
	defb	0		;value(6)
	defb	152		;y(1)
	defw	194		;x(2)

	defb	ID_MINE		;id(1)
	defb	0		;value(7)
	defb	48		;y(1)
	defw	48		;x(2)

	defb	ID_ORGA		;id(1)
	defb	0		;value(5)
	defb	104		;y(1)
	defw	35		;x(2)

	defb	ID_ORGA		;id(1)
	defb	0		;value(6)
	defb	120		;y(1)
	defw	177		;x(2)

	defb	ID_ORGA		;id(1)
	defb	0		;value(7)
	defb	96		;y(1)
	defw	267		;x(2)

	defb	ID_FUEL		;id(1)
	defb	255		;value(1)
	defb	120		;y(1)
	defw	302		;x(2)

	;...
	defb	255

ITEMS4
	defb	ID_MINE		;id(1)
	defb	0		;value(8)
	defb	64		;y(1)
	defw	44		;x(2)
	
	defb	ID_MINE		;id(1)
	defb	0		;value(9)
	defb	160		;y(1)
	defw	104		;x(2)

	defb	ID_MINE		;id(1)
	defb	0		;value(10)
	defb	120		;y(1)
	defw	176		;x(2)

	defb	ID_MINE		;id(1)
	defb	0		;value(11)
	defb	168		;y(1)
	defw	195		;x(2)

	defb	ID_ORGA		;id(1)
	defb	0		;value(8)
	defb	96		;y(1)
	defw	105		;x(2)

	defb	ID_ORGA		;id(1)
	defb	0		;value(9)
	defb	40		;y(1)
	defw	311		;x(2)

	defb	ID_ORGA		;id(1)
	defb	0		;value(20)
	defb	168		;y(1)
	defw	132		;x(2)

	;...
	defb	255

ITEMS5
	defb	ID_KEY		;id(1)
	defb	1		;value(1)
	defb	168		;y(1)
	defw	6		;x(2)

	defb	ID_MINE		;id(1)
	defb	0		;value(12)
	defb	136		;y(1)
	defw	221		;x(2)

	defb	ID_MINE		;id(1)
	defb	0		;value(13)
	defb	96		;y(1)
	defw	258		;x(2)

	defb	ID_MINE		;id(1)
	defb	0		;value(14)
	defb	56		;y(1)
	defw	11		;x(2)

	defb	ID_ORGA		;id(1)
	defb	0		;value(10)
	defb	104		;y(1)
	defw	307		;x(2)

	defb	ID_ORGA		;id(1)
	defb	0		;value(11)
	defb	96		;y(1)
	defw	203		;x(2)
	
	defb	ID_ORGA		;id(1)
	defb	0		;value(12)
	defb	160		;y(1)
	defw	64		;x(2)

	defb	ID_ORGA		;id(1)
	defb	0		;value(13)
	defb	144		;y(1)
	defw	2		;x(2)

	;...
	defb	255

ITEMS6
	defb	ID_FUEL		;id(1)
	defb	255		;value(1)
	defb	176		;y(1)
	defw	37		;x(2)

	defb	ID_FUEL		;id(1)
	defb	255		;value(1)
	defb	152		;y(1)
	defw	226		;x(2)
	
	defb	ID_KEY		;id(1)
	defb	2		;value(1)
	defb	96		;y(1)
	defw	193		;x(2)

	defb	ID_KEY		;id(1)
	defb	3		;value(1)
	defb	168		;y(1)
	defw	5		;x(2)

	defb	ID_MINE		;id(1)
	defb	0		;value(15)
	defb	168		;y(1)
	defw	24		;x(2)

	defb	ID_MINE		;id(1)
	defb	0		;value(16)
	defb	160		;y(1)
	defw	65		;x(2)

	defb	ID_MINE		;id(1)
	defb	0		;value(17)
	defb	160		;y(1)
	defw	316		;x(2)

	defb	ID_MINE		;id(1)
	defb	0		;value(18)
	defb	48		;y(1)
	defw	300		;x(2)

	defb	ID_ORGA		;id(1)
	defb	0		;value(14)
	defb	144		;y(1)
	defw	2		;x(2)

	defb	ID_ORGA		;id(1)
	defb	0		;value(15)
	defb	160		;y(1)
	defw	59		;x(2)

	defb	ID_ORGA		;id(1)
	defb	0		;value(16)
	defb	176		;y(1)
	defw	70		;x(2)

	defb	ID_ORGA		;id(1)
	defb	0		;value(17)
	defb	176		;y(1)
	defw	131		;x(2)

	defb	ID_ORGA		;id(1)
	defb	0		;value(18)
	defb	168		;y(1)
	defw	312		;x(2)

	defb	ID_ORGA		;id(1)
	defb	0		;value(19)
	defb	112		;y(1)
	defw	297		;x(2)

	defb	ID_FUEL		;id(1)
	defb	255		;value(1)
	defb	160		;y(1)
	defw	256		;x(2)

	defb	ID_FUEL		;id(1)
	defb	255		;value(1)
	defb	168		;y(1)
	defw	140		;x(2)

	defb	ID_FUEL		;id(1)
	defb	255		;value(1)
	defb	80		;y(1)
	defw	17		;x(2)

	;...
	defb	255

;--------------------------------------
;ITEMS_SPRITES
;--------------------------------------
ITEMS_SPRITES
	DEFB	90,255,255,195,223,199,223,126
	;DEFB	60,66,126,195,223,199,223,255
	DEFB	60,90,102,90,90,102,90,60
	DEFB	28,38,67,133,139,215,174,92
	DEFB	62,67,151,171,151,175,126,60





;--------------------------------------
;PERS_SPRITES
;--------------------------------------
P_SIZE	equ	164+8
P_HEAD	DEFB	11, 0,0,3,224,4,24,8,4,9,252,19,252,19,204,8,200,12,72,6,72,3,240
P_CORP	DEFB	13, 16,0,32,0,32,0,64,32,68,16,143,255,159,255,159,251,199,226,97,52,50,40,31,224,31,224
P_LEG1	DEFB	11, 16,48,16,144,33,8,33,8,34,132,66,132,68,68,68,68,136,66,252,127,252,127
P_LEG2	DEFB	11, 16,32,16,32,8,64,8,64,8,64,8,64,8,64,8,128,8,192,15,224,15,224
P_LEG3	DEFB	11, 16,48,16,16,8,8,12,8,11,4,24,132,112,196,225,68,250,66,124,127,30,127
P_LEG4	DEFB	11, 16,32,16,144,8,72,8,72,16,136,33,200,50,248,62,240,30,112,12,0,0,0
P_JET1	DEFB	7, 192,0,160,0,224,0,112,0,160,0,64,0,128,0
P_JET2	DEFB	7, 192,0,224,0,96,0,128,0,64,0,0,0,32,0
P_FLIP	DEFS	164+8,0		; 


PERS_FON	defs	64,0

P_GUNF		DEFB	32,84,3,76,16
		DEFB	4,42,192,50,8
P_GUNF_FON	defs	5,0

;--------------------------------------
;INCLUDES
;--------------------------------------
	include	include\UTILS.txt
	include	include\CONTROL.txt
	include	include\RUS_FONT.txt

TILES	include	tiles\TILES.txt
	include	levels\LEVELS.txt
	include	game\INTRO.txt
	include	game\OUTRO.txt
	include	game\TEXT.txt
	include	game\copy_scr2.txt

	page	1
	defb	0
	