	org	32768
	di

	ld	a,%00010111
	call	SET_PAGE_MODE_A
	
	
	

	call	INIT_TABLE

	;--------
	ld	ix,LINE_TABLE
	ld	b,24
fs	push	bc
	call	PRINT_32_SPRITE
	ld	de,lt_size
	add	ix,de
	pop	bc
	djnz	fs
	;--------

	
	

strt

col	ld	bc,384
right	push	bc
	
	call	SWAP_SCREEN
	call	SCROLL2
	
	ld	ix,LINE_TABLE
	ld	b,24
nxt_ln	push	bc
	call	PRINT_NEXT_SPRITE
	pop	bc
	ld	de,lt_size
	add	ix,de
	djnz	nxt_ln
	call	DRAW
	

	pop	bc
	dec	bc
	ld	a,b
	or	c
	jr	nz,right
	call	INIT_TABLE
	ld	hl,416
	ld	(col+1),hl
	jr	strt



mar_y	defb	143
old_y	defb	143
mar_vel	defw	#1e00
vel_dn	defb	#0f

;----------------------------
update
	ld	hl,(mar_vel)
	ld	de,#c0
	and	a
	sbc	hl,de
	ld	a,h
	or	l
	jr	nz,upd1
	ld	hl,#1e00
upd1	ld	(mar_vel),hl


	ld	a,(mar_vel+1)
	ld	b,a
	ld	a,(vel_dn)
	ld	d,a
	ld	a,(mar_y)
	ld	(old_y),a
	add	a,d
	sub	b
	ld	(mar_y),a
	ret
	

;---------------------------------
;  : e a,    
INIT_TABLE
	ld	ix,LINE_TABLE
	ld	b,0
nxt_line
	push	bc
	ld	de,LEVEL
	call	ADDR_AFTER255
	
	ld	(IX+line_ptr),e
	ld	(IX+line_ptr+1),d

	call	NEXT_LINE_PTR
	pop	bc

	call	SCR_ADDR
	ld	(IX+print_addr),l
	ld	(IX+print_addr+1),h
	ld	(IX+attr_addr),e
	ld	(IX+attr_addr+1),d

	ld	de,lt_size
	add	ix,de
	inc	b
	ld	a,24
	cp	b
	jr	nz,nxt_line
	ret

;---------------------------------
;   
PRINT_NEXT_SPRITE
	ld	l,(IX+ribbon_ptr)
	ld	h,(IX+ribbon_ptr+1)
nxt_rib
	ld	a,(hl)			; 
	cp	255			; ?
	jr	nz,no_endrib
					;
	dec	(IX+ribbon_cnt)
	call	z,NEXT_LINE_PTR		; ,  
	ld	l,(IX+ribbon_start)
	ld	h,(IX+ribbon_start+1)
	ld	(IX+ribbon_ptr),l
	ld	(IX+ribbon_ptr+1),h
	jr	nxt_rib
no_endrib
	; A  
	inc	hl
	ld	b,(hl)
	ld	l,a
	ld	h,0
	push	hl
	;ld	de,spr_attribs
	;add	hl,de
	;ld	a,(hl)
	ld	l,(IX+attr_addr)
	ld	h,(IX+attr_addr+1)
S_AA	set	7,h
	ld	(hl),b
	pop	hl
	
	add	hl,hl	
	add	hl,hl
	add	hl,hl			;x8
	ld	de,sprites
	add	hl,de			; 

	ld	e,(IX+print_addr)
	ld	d,(IX+print_addr+1)
S_PA	set	7,d
	ld	b,8
nxt_b	ld	a,(hl)
	ld	(de),a
	inc	hl
	inc	d
	djnz	nxt_b

	ld	l,(IX+ribbon_ptr)
	ld	h,(IX+ribbon_ptr+1)
	inc	hl
	inc	hl
	ld	(IX+ribbon_ptr),l
	ld	(IX+ribbon_ptr+1),h

	ret

;---------------------------------
; 32    c  
PRINT_32_SPRITE
	ld	l,(IX+ribbon_ptr)
	ld	h,(IX+ribbon_ptr+1)
	ld	d,(IX+print_addr+1)
	set	7,d
	ld	a,(IX+print_addr)
	and	224
	ld	e,a

	ld	b,32
P32S1	push	bc

P32S2	ld	a,(hl)			; 
	cp	255			; ?
	jr	nz,P32S3
	;------
	push	de			; 
	dec	(IX+ribbon_cnt)
	call	z,NEXT_LINE_PTR		; ,  
	ld	l,(IX+ribbon_start)	;   
	ld	h,(IX+ribbon_start+1)
	pop	de
	;------
	jr	P32S2			
P32S3
	; A  
	inc	hl
	ld	b,(hl)			; 
	push	hl			;ribbon_ptr
	
	ld	l,a
	ld	h,0

	push	hl			; 
	;push	de			; 

	ld	a,e			
	and	31
	ld	c,a			; 
	;ld	de,spr_attribs
	;add	hl,de
	;ld	b,(hl)			; 
	ld	h,(IX+attr_addr+1)
	set	7,h			;  7 
	ld	a,(IX+attr_addr)
	and	224
	or	c			;    
	ld	l,a
	ld	(hl),b			;  

	;pop	de			; 
	pop	hl			; 
	
	add	hl,hl	
	add	hl,hl
	add	hl,hl			;x8
	push	de			; 
	ld	de,SPRITES
	add	hl,de			; 
	pop	de			; 
	
	push	de			; 
	ld	b,8
P32S4	ld	a,(hl)
	ld	(de),a
	inc	hl
	inc	d
	djnz	P32S4

	pop	de			; 
	inc	de

	pop	hl			;ribbon_ptr
	inc	hl
	pop	bc
	djnz	P32S1

	ld	(IX+ribbon_ptr),l
	ld	(IX+ribbon_ptr+1),h
	ret

;---------------------------------
;         
NEXT_LINE_PTR
	ld	l,(IX+line_ptr)
	ld	h,(IX+line_ptr+1)

	ld	b,(hl)

	

	ld	de,RIBBONS
	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
	inc	hl
	ld	(IX+line_ptr),l
	ld	(IX+line_ptr+1),h
	ret
;---------------------------------
;   255   b
ADDR_AFTER255
	
	xor	a
	cp	b
	ret	z
nxt_de	ld	a,(de)
	inc	de
	cp	255
	jr	nz,nxt_de
	djnz	nxt_de
	ret

;---------------------------------
; 
SCROLL
	ld	hl,(S_SRC)
	ld	de,(S_DST)
	ld	bc,6911
	ldir
	ret

;---------------------------------
; 2
SCROLL2
S_SRC	ld	hl,#4001	;10
	ld	(S_SRC1+1),hl	;16
S_DST	ld	hl,#C000	;10
	ld	de,16		;10
	add	hl,de		;11
	ld	(S_DST1+1),hl	;16
	ld	(SAVE_SP+1),sp	;20
	ld	b,216		;7	= 100

S_SRC1	LD	SP,0		;10
	POP	HL		;10
	POP	DE		;10
	POP	AF		;10
	POP	IX		;14
	POP	IY		;14
	EXX			;4
	POP	HL		;10
	POP	DE		;10
	POP	BC		;10
	LD	(S_SRC2+1),SP	;20	= 122
                                        
S_DST1	LD	SP,0		;10
	PUSH	BC		;11
	PUSH	DE		;11
	PUSH	HL		;11	
	EXX			;4
	PUSH	IY		;15
	PUSH	IX		;15
	PUSH	AF		;11	
	PUSH	DE		;11
	PUSH	HL		;11
	
	ld	hl,32		;10
	add	hl,sp		;11
	LD	(S_DST2+1),hl	;16	= 147

S_SRC2	LD	SP,0		;10
	POP	HL		;10
	POP	DE		;10
	POP	AF		;10
	POP	IX		;14
	POP	IY		;14
	EXX			;4
	POP	HL		;10
	POP	DE		;10
	POP	BC		;10
	LD	(S_SRC1+1),SP	;20	= 122
                                        
S_DST2	LD	SP,0		;10
	PUSH	BC		;11
	PUSH	DE		;11
	PUSH	HL		;11	
	EXX			;4
	PUSH	IY		;15
	PUSH	IX		;15
	PUSH	AF		;11	
	PUSH	DE		;11
	PUSH	HL		;11
	
	ld	hl,32		;10
	add	hl,sp		;11
	LD	(S_DST1+1),hl	;16	= 147

	djnz	S_SRC1		;13	551 / 32 = 17.2
				

SAVE_SP	ld	sp,0		;10
	;~119126  (ldir ~ 145152  -   21,8%)
	ret
	
;---------------------------------
SCR_ADDR
	; 31  	
	ld	a,b
	and	%00011000
	or	%01000000	;+16384
	ld	h,a
	ld	a,b
	rrca
	rrca
	rrca
	ld	d,a		;  
	or	%00011111	;+31
	ld	l,a

	;   
	ld	e,l		;  
	ld	a,d
	and	%00000011
	or	%01011000	;+22528
	ld	d,a

	ret

;---------------------------------
;  B
BIND_PAGE_B
	DI
	LD	B,A
	LD      A,(#5B5C)
	AND	248
	OR	B
	LD	(#5B5C),A
	LD	BC,#7FFD
        OUT	(C),A
	;EI
        RET

;--------------------------
; 
SWAP_SCREEN
	;DI
	LD      A,(#5B5C)
	xor	8
	LD	(#5B5C),A
	LD	BC,#7FFD
        OUT	(C),A
	;EI

	ld	a,(S_SRC+2)
	xor	128
	ld	(S_SRC+2),a
	ld	a,(S_DST+2)
	xor	128
	ld	(S_DST+2),a

	ld	a,(S_PA+1)
	xor	8		;SET 6,D <-> SET 7,D
	ld	(S_PA+1),a
	ld	a,(S_AA+1)
	xor	8		;SET 6,H <-> SET 7,H
	ld	(S_AA+1),a

	ld	a,(A_P1+1)
	xor	8		;SET 6,H <-> SET 7,H
	ld	(A_P1+1),a

	

        RET

;--------------------------
; 
SET_PAGE_MODE_A
	;DI
	LD	(#5B5C),A
	LD	BC,#7FFD
	OUT	(C),A
	;EI
	RET
;--------------------------
DOWN	INC	H
	LD	A,H
	AND	#07
	RET	NZ
	LD	A,L
	ADD	A,#20
	LD	L,A
	RET	C
	LD	A,H
	SUB	#08
	LD	H,A
	RET

;---------------------------
ADR_PIX
	LD	A,E	;E-Y	
	AND	A
	RRA
	SCF
	RRA
	AND	A
	RRA
	XOR	E
	AND	#F8
	XOR	E
	OR	#40
	LD	H,A
A_P1	set	7,h
	LD	A,D
	RLCA
	RLCA
	RLCA
	XOR	E
	AND	#C7
	XOR	E
	RLCA
	RLCA
	LD	L,A
	RET
;----------------------------
DRAW
	call	update

	ld	a,(old_y)
	ld	e,a
	ld	d,32
	call	ADR_PIX
	ld	de,FON_SRC
	call	DRAW_SRC


	ld	a,(mar_y)
	ld	e,a
	ld	d,40
	call	ADR_PIX
	call	COPY_FON

	ld	de,MARIO
	call	DRAW_SRC


	ret


;----------------------------
DRAW_SRC
	ld	b,32
DS1	ld	a,(de)
	ld	(hl),a
	inc	hl
	inc	de
	ld	a,(de)
	ld	(hl),a
	dec	hl
	inc	de
	call	DOWN
	djnz	DS1
	ret
;----------------------------
COPY_FON
	push	hl
	ld	de,FON_SRC
	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
	djnz	CF1
	pop	hl
	ret		


LINE_TABLE	DEFS	288,0

LINE_ptr	equ	0	;2 -        
ribbon_ptr	equ	2	;2 -      
ribbon_start	equ	4	;2 -    
print_addr	equ	6	;2 -  
attr_addr	equ	8	;2 -  
ribbon_cnt	equ	10	;1 -    

lt_size		equ	11	;    


LEVEL
	DEFB	11,19,8,1,11,17,8,2,11,29,8,1,11,16,8,2,11,29,8,1,11,16,8,2,11,29,8,1,11,7,8,3,11,6,8,2,11,25,255
	DEFB	11,18,9,1,12,1,10,1,11,15,9,1,12,2,10,1,11,27,9,1,12,1,10,1,11,14,9,1,12,2,10,1,11,27,9,1,12,1,10,1,11,14,9,1,12,2,10,1,11,27,9,1,12,1,10,1,11,5,9,1,12,3,10,1,11,4,9,1,12,2,10,1,11,24,255
	DEFB	11,9,8,1,11,8,13,1,15,1,14,1,11,7,8,3,11,5,13,1,15,2,14,1,11,17,8,1,11,9,13,1,15,1,14,1,11,6,8,3,11,5,13,1,15,2,14,1,11,17,8,1,11,9,13,1,15,1,14,1,11,6,8,3,11,5,13,1,15,2,14,1,11,17,8,1,11,9,13,1,15,1,14,1,11,5,13,1,15,3,14,1,11,4,13,1,15,2,14,1,11,13,29,1,31,1,11,9,255
	DEFB	11,8,9,1,12,1,10,1,11,16,9,1,12,3,10,1,11,24,9,1,12,1,10,1,11,16,9,1,12,3,10,1,11,24,9,1,12,1,10,1,11,16,9,1,12,3,10,1,11,24,9,1,12,1,10,1,11,43,30,1,11,9,255
	DEFB	11,8,13,1,15,1,14,1,11,16,13,1,15,3,14,1,11,24,13,1,15,1,14,1,11,16,13,1,15,3,14,1,11,24,13,1,15,1,14,1,11,16,13,1,15,3,14,1,11,24,13,1,15,1,14,1,11,43,32,1,11,9,255
	DEFB	11,198,32,1,11,9,255
	DEFB	11,22,3,1,11,57,2,8,11,3,2,3,3,1,11,14,3,1,11,11,2,3,11,4,2,1,3,2,2,1,11,56,27,2,11,8,32,1,11,9,255
	DEFB	11,22,4,1,11,57,2,8,11,3,2,3,4,1,11,14,4,1,11,11,2,3,11,4,2,1,4,2,2,1,11,56,28,2,11,8,32,1,11,9,255
	DEFB	11,187,27,3,11,8,32,1,11,9,255
	DEFB	11,187,28,3,11,8,32,1,11,9,255
	DEFB	11,186,27,4,11,8,32,1,11,9,255
	DEFB	11,186,28,4,11,8,32,1,11,9,255
	DEFB	11,185,27,5,11,8,32,1,11,4,36,3,11,2,255
	DEFB	11,185,28,5,11,8,32,1,11,4,2,3,11,2,255
	DEFB	11,16,3,1,11,3,2,1,3,1,2,1,3,1,2,1,11,21,5,1,11,9,5,1,11,18,2,1,3,1,2,1,11,14,2,1,11,5,2,2,11,4,3,1,11,2,3,1,11,2,3,1,11,5,2,1,11,10,2,2,11,6,27,1,11,2,27,1,11,10,27,2,11,2,27,1,11,12,2,2,3,1,2,1,11,12,27,6,11,8,32,1,11,4,33,1,2,1,34,1,11,2,255
	DEFB	11,16,4,1,11,3,2,1,4,1,2,1,4,1,2,1,11,21,6,1,11,9,6,1,11,18,2,1,4,1,2,1,11,14,2,1,11,5,2,2,11,4,4,1,11,2,4,1,11,2,4,1,11,5,2,1,11,10,2,2,11,6,28,1,11,2,28,1,11,10,28,2,11,2,28,1,11,12,2,2,4,1,2,1,11,12,28,6,11,8,32,1,11,4,33,1,2,1,34,1,11,2,255
	DEFB	11,38,5,1,11,6,7,1,11,9,7,1,11,77,27,2,11,2,27,2,11,8,27,3,11,2,27,2,11,26,27,7,11,8,32,1,11,3,36,1,2,3,36,1,11,1,255
	DEFB	11,2,20,1,11,35,6,1,11,6,7,1,11,2,20,1,11,6,7,1,11,39,20,1,11,37,28,2,11,2,28,2,11,4,20,1,11,3,28,3,11,2,28,2,11,26,28,7,11,4,20,1,11,3,32,1,11,3,2,5,11,1,255
	DEFB	11,1,21,1,26,1,23,1,11,24,5,1,11,8,7,1,11,6,7,1,11,1,21,1,26,1,23,1,11,5,7,1,11,38,21,1,26,1,23,1,11,35,27,3,11,2,27,3,11,2,21,1,26,1,23,1,11,1,27,4,11,2,27,3,11,5,5,1,11,14,5,1,11,1,27,8,11,3,21,1,26,1,23,1,11,2,32,1,11,3,2,2,35,1,2,2,11,1,255
	DEFB	11,1,22,1,18,1,24,1,11,13,20,1,11,10,6,1,11,8,7,1,11,6,7,1,11,1,22,1,18,1,24,1,11,5,7,1,11,6,20,1,11,31,22,1,18,1,24,1,11,13,20,1,11,21,28,3,11,2,28,3,11,2,22,1,18,1,24,1,11,1,28,4,11,2,28,3,11,3,20,1,11,1,6,1,11,14,6,1,11,1,28,8,11,3,22,1,18,1,24,1,11,2,32,1,11,3,2,2,35,1,2,2,11,1,255
	DEFB	21,1,26,1,18,1,25,1,23,1,11,7,16,3,11,1,21,1,26,1,23,1,11,5,16,1,11,3,7,1,11,8,7,1,11,2,16,1,11,3,7,1,21,1,26,1,18,1,25,1,23,1,11,4,7,1,11,1,16,3,11,1,21,1,26,1,23,1,11,5,16,1,11,17,16,1,11,5,21,1,26,1,18,1,25,1,23,1,11,7,16,3,11,1,21,1,26,1,23,1,11,5,16,1,11,13,27,4,16,2,27,4,21,1,26,1,18,1,25,1,27,5,11,2,27,4,11,1,21,1,26,1,23,1,7,1,11,3,16,1,11,10,7,1,27,9,11,2,21,1,26,1,18,1,25,1,23,1,11,1,27,1,11,3,2,2,35,1,2,2,11,1,255
	DEFB	22,1,18,3,24,1,11,6,17,1,18,3,19,1,22,1,18,1,24,1,11,4,17,1,18,1,19,1,11,2,7,1,11,8,7,1,11,1,17,1,18,1,19,1,11,2,7,1,22,1,18,3,24,1,11,4,7,1,17,1,18,3,19,1,22,1,18,1,24,1,11,4,17,1,18,1,19,1,11,15,17,1,18,1,19,1,11,4,22,1,18,3,24,1,11,6,17,1,18,3,19,1,22,1,18,1,24,1,11,4,17,1,18,1,19,1,11,12,28,4,18,2,28,4,22,1,18,3,28,5,11,2,28,4,19,1,22,1,18,1,24,1,7,1,11,2,17,1,18,1,19,1,11,9,7,1,28,9,11,2,22,1,18,3,24,1,11,1,28,1,11,3,2,2,35,1,2,2,19,1,255
	DEFB	0,69,11,2,0,15,11,3,0,64,11,2,0,53,255
	DEFB	1,69,11,2,1,15,11,3,1,64,11,2,1,53,255


RIBBONS
	DEFB	0,16,1,16,255
	DEFB	16,16,17,16,255
	DEFB	30,16,30,16,255
	DEFB	9,48,10,48,255
	DEFB	25,48,26,48,255
	DEFB	6,38,7,38,0,38,8,38,255
	DEFB	22,38,23,38,0,38,24,38,255
	DEFB	27,14,28,38,0,38,29,14,255
	DEFB	2,15,3,15,255
	DEFB	0,15,4,15,255
	DEFB	5,15,0,15,255
	DEFB	0,15,0,15,255
	DEFB	0,56,0,56,255
	DEFB	0,15,18,15,255
	DEFB	21,15,0,15,255
	DEFB	19,15,20,15,255
	DEFB	2,12,3,12,255
	DEFB	0,15,4,12,255
	DEFB	0,32,0,32,255
	DEFB	5,12,0,15,255
	DEFB	11,12,12,12,255
	DEFB	0,15,13,12,255
	DEFB	13,12,0,32,255
	DEFB	14,12,0,15,255
	DEFB	0,32,14,12,255
	DEFB	15,32,0,32,255
	DEFB	0,32,15,32,255
	DEFB	31,40,32,40,255
	DEFB	33,40,34,40,255
	DEFB	0,8,14,57,255
	DEFB	14,57,0,8,255
	DEFB	37,60,0,8,255
	DEFB	38,12,0,8,255
	DEFB	30,16,0,7,255
	DEFB	0,7,30,16,255
	DEFB	0,7,0,7,255
	DEFB	35,10,36,10,255



SPRITES
	DEFB	0,0,0,0,0,0,0,0
	DEFB	64,65,65,65,81,94,65,65
	DEFB	0,3,7,31,31,31,57,119
	DEFB	0,192,224,224,244,190,222,254
	DEFB	0,7,15,31,31,127,127,63
	DEFB	0,16,176,240,250,254,254,252
	DEFB	0,127,3,115,115,115,115,115
	DEFB	0,255,240,246,246,246,246,246
	DEFB	0,254,0,86,46,86,46,86
	DEFB	85,128,32,135,15,142,14,134
	DEFB	86,1,5,193,225,113,113,241
	DEFB	0,0,0,0,0,7,63,255
	DEFB	0,0,0,0,0,224,252,255
	DEFB	1,3,7,15,31,63,127,255
	DEFB	128,192,224,240,248,252,254,255
	DEFB	2,7,7,7,55,50,48,48
	DEFB	0,0,192,48,15,1,1,126
	DEFB	65,65,129,129,1,1,3,126
	DEFB	27,13,6,7,0,0,0,0
	DEFB	255,191,28,192,243,126,28,0
	DEFB	191,127,61,131,199,255,60,0
	DEFB	248,252,254,254,248,96,0,0
	DEFB	115,115,115,115,115,115,0,0
	DEFB	246,246,246,246,246,246,0,0
	DEFB	46,86,46,86,46,86,0,0
	DEFB	1,129,0,129,1,160,0,255
	DEFB	113,65,193,1,65,197,1,255
	DEFB	31,23,31,23,31,23,31,23
	DEFB	251,251,251,251,251,251,251,251
	DEFB	184,88,184,88,184,88,184,88
	DEFB	255,2,2,2,255,32,32,32
	DEFB	128,64,32,16,13,10,5,10
	DEFB	1,3,7,15,95,175,95,175
	DEFB	5,10,5,10,31,63,127,255
	DEFB	95,175,95,175,247,251,253,254
	DEFB	248,248,248,248,0,216,216,216
	DEFB	29,29,29,29,0,31,31,31
	DEFB	0,124,214,146,186,238,254,56
	DEFB	3,3,3,3,3,3,3,3
MARIO
	DEFB 3,240
	DEFB 15,208
	DEFB 31,208
	DEFB 31,254
	DEFB 28,144
	DEFB 38,204
	DEFB 38,2
	DEFB 96,34
	DEFB 96,252
	DEFB 112,124
	DEFB 24,0
	DEFB 8,32
	DEFB 11,208
	DEFB 27,216
	DEFB 59,220
	DEFB 123,222
	DEFB 115,206
	DEFB 243,207
	DEFB 240,15
	DEFB 244,47
	DEFB 144,9
	DEFB 144,9
	DEFB 80,10
	DEFB 32,4
	DEFB 32,4
	DEFB 65,130
	DEFB 66,66
	DEFB 68,34
	DEFB 68,34
	DEFB 60,60
	DEFB 252,63
	DEFB 252,63
FON_SRC
	defs	64,0


print_bc
	CALL	11563
	CALL	11747
	jr	$
	page	6
	defb	0