;Mars

	if 1==1
IMVEC=#8000;#be00
IMSTACK=#8140;#bf40
ON_INT=#8181;#bfbf
STACK=ON_INT
	else
IMSTACK=#ff40;#bf40
IMVEC=#3bff;#be00
ON_INT=#ff80;#bfbf
STACK=ON_INT
	endif

basetime=192
endtime=-1;(5*192)

timer=23728

bright=64
bgcolor=7+bright;#3e+bright

chmhgt=32
chmwid=64

scrtop=#4800;#4080
attrtop=#5900;#5880

C2P=1 ;1=4x4, 2=4x2 (mirrored), 3=color chunks (mirrored, requires #xx80..#xxff in #c080..#ffff)

C2PMIRROR=1 ;optional for 4x4 (112 t slower), always 1 (automatically) for others
C2PGFX=2 ;for 4x4: 1=diamond (fastest), 2=noise, 3=triangle, 4=dot, 5=inverse dot

C2PFIX=1 ;for 4x2: fix every second line of solid color
C2PBLUR=1 ;for 4x2: blur bytes

COLORCODE=3 ;for color chunks: 0=WHITE,1=RED,2=CYAN,3=GREEN
GRASS=0;1 ;for color chunks and GREEN: 1=0-G-Y-W instead of 0-B-G-W

;4x4 (64x32) = 73000..73848
;4x2 (64x32) = 44368 t (C2PFIX=0), 45170 t (C2PFIX=1)
;color chunks (64x32) = 190000..196000

;у всех c2p общая система вызовов: mkc2p, c2p, chmap_cls
;но внутренние метки у всех разные (в том числе есть дублёры названий mkc2p, c2p, chmap_cls)
;в будущем надо будет вызывать дублёры вызовов c2p через керналь mkc2p, c2p, chmap_cls
;chmap, chmwid, chmhgt пока у всех общие. объявить в каждом c2p свои или передавать настройки через mkc2p?
;(пока сделана только попытка отделить chmap_color для color chunks и chmap_old для прочих)


	if C2P==3 ;color chunks
SINGLEBYTE=0
C2PCOLOR=1
C2PMIRROR=1
	else
SINGLEBYTE=1
C2PCOLOR=0
	if C2P==2 ;4x2
C2PMIRROR=1
	else ;4x4
;C2PMIRROR=0;1
	endif
	endif

	if C2P==2 ;4x2
C2P4X2=1
	else
C2P4X2=0
	endif

	if C2P4X2
BLANKCHUNK=#ff;#fe ;#fe для c2p_old или SINGLEBYTE=0
	else
BLANKCHUNK=#fe
	endif

	if C2PCOLOR
;tex1=#c000 ;todo сюда таблицы (128 байт на строку вместо 256)
;tex2=#c040 ;
;tchgfx=#c180
tattr=#c0c0
chmap_color=#6044;#6044 ;128x32 (и боковины по 32, т.е. по 16 чанков) + запас на стек
chmapto=chmap_color;#6044 ;64x32
chmapattr=chmap_color-#42;#6002 ;64x32 (лежат в обратном порядке до #6041) + запас на стек
;chmapfree=#60c4; если без боковин; #60e4 ;30x32 (или нет свободного места, если боковины по 32 чанка)
	endif

;TODO remove
mkc2p_old_buf=#4000 ;#44
mkc2p_old_curbuf=mkc2p_old_buf+#44 ;4

chmap_old=#de90 ;64x32(34?) #82..#dd, brim=14
chdata_old=chmap_old

	if C2PCOLOR
chmap=chmap_color
	else
chmap=chmap_old
	endif

layers=16;24

	device pentagon1024

	org #6100
begin
	xor a
	out (#fe),a
	;ld (#5d10),a
	;ld (iy+1),#cc
	;ld sp,STACK

	ld hl,wasnextpart
	ld d,#c0
storenextpart0
	ld e,0
	ld bc,128
	ldir
	inc d
	bit 7,h
	jr z,storenextpart0


	ld hl,module
	call pt3player.INIT

	;ld hl,wasimer
	;ld de,ON_INT
	;ld bc,szimer
	;ldir
	if IMVEC==#3bff
           ;LD hl,#c9fb
           ;LD (#fff4),hl
	   ld a,#c3
	   ld (#fff4),a
           ld hl,ON_INT
           ld (#fff5),hl
	   ld a,#18
	   ld (#ffff),a
	ld a,IMVEC/256
	else
           ;ld hl,ON_INT
           ;ld (IMVEC+255),hl
	ld hl,IMVEC
	ld a,h
	ld d,ON_INT/256
	ld (hl),d
	inc l
	jr nz,$-2
	inc h
	ld (hl),d
	endif
	ld i,a
	im 2
	;ei 

;init
	call mkc2p
	
	ld de,basetime-3;96
waitmain0
	ld hl,(timer)
	or a
	sbc hl,de
	;jr c,waitmain0

	ld hl,#5800
	ld de,#5801
	ld (hl),l;#3e+bright;7
	ld bc,767
	ldir ;зачерняем, чтобы не было кривых атрибутов

	ld hl,#4000
	ld de,#4001
	ld a,6
prefill_0
	if 1==0
	ld (hl),#11
	else
	ld (hl),#ff
	endif
	ld bc,#200
	ldir
	if 1==0
	ld (hl),#22
	else
	ld (hl),#ff
	endif
	ld b,2;bc,#200
	ldir
	dec a
	jr nz,prefill_0

	halt
	ld hl,#5801
	ld de,#5802
	ld (hl),bgcolor ;#3e+bright;7
	dec hl
	ld (hl),bgcolor;-bright
	ld bc,766
	ldir

	jp maingo

	if C2PCOLOR
	include "c2p_color_init.asm"
	else
	 if C2P4X2
	include "c2p_4x2_init.asm"
	 else
	include "c2p_4x4_init.asm"
	 endif
	endif

wasnextpart
	include "megaLZunpack.asm"
wasnextpartdata
	;incbin "..\48kvectorcar\purecode.c.mlz"
;sznextpart=$-wasnextpart
	
;=====================================
	ds ON_INT-$
	;org #8000
wasimer
	disp ON_INT
	ld (imstack),sp
	ld sp,IMSTACK
	push af
	push bc
	push de
	push hl
	
	ld hl,(imstack)
	ld de,imjp
	ldi
	ldi
	ld (imstack),hl
	
	ld hl,(timer)
	inc hl
	ld (timer),hl
	
	push ix
	ex af,af'
	push af
	;push iy ;not used by the replayer
	call pt3player.PLAY
	;pop iy ;not used by the replayer
	pop af
	ex af,af'
	pop ix

	ld hl,wasdrawmarslinestack
	ld de,drawmarslinestack
	ld bc,szdrawmarslinestack
imerldir=$
	ldir

	pop hl
	pop de
	pop bc
	pop af
imstack=$+1
	ld sp,0
	ei
imjp=$+1
	jp 0
;timer
	;dw 0
	ent
szimer=$-wasimer

	include "pt3play.asm"
module
	incbin "testmusic.pt3"

maingo
	ld hl,(timer)
	ld (oldtimer),hl
	;jp mainloop

mainloop

	if 1==1 ;не затемнять
	ld a,%00001110 ;max light
	else ;затемнять
	if 1==0
	;затемнять, когда мы низко

	ld a,(curz)
	sub #40
	jr nc,$+3
	xor a
	cp #80
	jr c,$+4
	ld a,#7f
	or %10000000
	rrca
	rrca
	rrca
	rrca

	else
	;затемнять, когда мы низко, а перед нами сравнительно высоко (т.е. большой угол)

	ld a,(cury)
	call getheight
	ld e,a ;высота под нами (inv)
	ld a,(cury)
	add a,3
	call getheight
	;a=высота перед нами (inv)
	sub e
	;cy=1: тот самый тёмный уклон	
	jr c,$+4
	ld a,#ff
	;a<0 (нет уклона: -1)
	add a,a
	jr c,$+3
	xor a
	;add a,a
	;jr c,$+3
	;xor a

	if 1==1
	ld d,a ;d=уклон подчёркнутый (inv)
	ld a,e ;высота под нами (inv)
	srl a
	cpl ;высота под нами
	;sub #80
	;jr nc,$+3
	;xor a
	;add a,a
	add a,d ;d=уклон подчёркнутый
	jr c,$+3
	xor a
	;a=высота под нами минус уклон
	endif

	add a,#30
	jr nc,$+3
	sbc a,a
oldlightlevel=$+1
	ld e,0
	ld (oldlightlevel),a
	add a,e
	rra
	rrca
	rrca
	rrca
	rrca
	and %00001110
	jr nz,$+4
	add a,2
	endif
	endif

curbg=$+1
	;ld de,%1111111010111110 ;%11LLLLL0 ;%10CCCCC0 (ccLLL) GREEN
	;ld de,%1111111010011110 ;%11LLLLL0 ;%10CCCCC0 (ccLLL) RED
	;ld de,%1111111010101110 ;%11LLLLL0 ;%10CCCCC0 (ccLLL) CYAN
	;ld de,%1111111010001110 ;%11LLLLL0 ;%10CCCCC0 (ccLLL) WHITE
	ld de,%1111111010001110+(COLORCODE*#10)
	xor e
	and %00001110
	xor e
	ld e,a

	call chmap_cls

	call drawmars ;182357

	;halt
	call c2p ;190000..196000 for color chunks

	ld hl,(timer)
oldtimer=$+1
	ld de,0
	ld (oldtimer),hl
	or a
	sbc hl,de
	jp z,mainloop
	ld b,l
	call moveall
	djnz $-3
	ld hl,(timer)
	ld de,endtime-28;20
	ld (oldtimer),hl
	or a
	sbc hl,de
	jp c,mainloop
quit
	ld hl,0
	ld (imerldir),hl

	;di
	ld de,wasnextpart
	ld h,#c0
restorenextpart0
	ld l,0
	ld bc,128
	ldir
	inc h
	bit 7,d
	jr z,restorenextpart0
	ld hl,wasnextpartdata
	ld de,#a200
	push de
	;di
	jp wasnextpart;#5b00


moveall
	ld a,64
	add a,0
	ld ($-1),a
	ld hl,cury
	jr nc,$+3
	inc (hl)

	ld a,37
	add a,0
	ld ($-1),a
	ld hl,curxphase
	jr nc,$+3
	 inc (hl)
curxphase=$+1
	ld hl,tsin;tscalesinx
	ld a,(hl)
	;add a,a
	;add a,a
	sra a
	;sra a
	ld (curx),a

	ret

;%%%%%%%%%%%%%%%%%% MARS %%%%%%%%%%%%%%%%%%%%%%
getheight
	add a,4
	ld l,a
	ld h,tsiny/256
	ld a,(curx)
	ld c,a ;c=curx
	ld a,(hl) ;siny
;curz:=119-4*func_sinx(0,curx,siny)) = 150 + 4*(tscalesinx[0,curx+4*siny] + tscalesinx[0,(2*curx+1*siny)])
	ld b,a ;siny
	add a,c ;+curx
	add a,c ;+curx
	ld l,a
	ld h,tscalesinx/256
	ld a,b ;siny
	add a,a
	add a,a ;*4
	add a,c ;+curx
	ld b,(hl) ;=#ef..#11
	ld l,a
	ld a,(hl) ;=#ef..#11
	add a,b ;max=#22
	add a,2*#11
	;a=0..#22
	add a,a
	add a,a
	jr nc,$+3
	sbc a,a
	;a=0..#ff
	ret

drawmars:
;siny:=func_siny(cury+(DIST+LAYERSTEP)) = tsiny[cury+4]
	ld a,(cury)
	call getheight
	cpl
	;add a,119+1-50
	;jr nc,$+3
	;sbc a,a
	ld (curz),a

	ld b,layers
drawmars0
	push bc
	push hl
;disty:=dists[layer]
	ld hl,dists
	ld a,layers
	sub b
	;ld a,b
	;dec a
	ld (layer),a
	add a,a
	ld c,a
	ld b,0
	add hl,bc
	ld d,(hl) ;d=disty
	;ld a,(hl)
	;ld (disty),a
;scale:=(DIST/4)/disty
	inc hl
	ld c,(hl) ;c=iscale
	;рассчитаем basey=curz*scale=curz*scale/1024
	ld hl,0
curz=$+1
	ld a,120;170 ;100..220
	dup 8
	rla
	jr nc,$+3
	add hl,bc
	add hl,hl
	edup
	;h=curz*scale/256
	org $-1 ;h=curz*scale/512
	srl h ;h=curz*scale/1024
	srl h ;h=curz*scale/1024 (неправильно рассчитал?)
	ld a,h
	add a,6+(chmap/256)
	ld ly,a ;ly=basey+(chmap/256)

	;рассчитаем bc'=xstep=disty/8
	;ld a,(disty)
	;ld b,a
	ld b,d ;disty
	xor a
	 ld e,a
	srl b
	rra
	srl b
	rra
	srl b
	rra
	ld c,a
	;рассчитаем ix=xcounter=curx-(CHWID div 2)*xstep + 4*siny
;(CHWID div 2)*xstep = 32*xstep = disty*4
cury=$+1
	ld a,#c0;0
;disty=$+1
	add a,d ;disty
	ex de,hl
	;ld a,(disty)
	;ld h,a
	;ld l,0
	add hl,hl
	add hl,hl
	ex de,hl
curx=$+2
	ld hl,220*256
	sbc hl,de
	;push hl
;siny:=tsiny[(cury+disty)mod 256]
	ld e,a
	ld d,tsiny/256
	ld a,(de) ;siny
	ld d,a
	add a,a
	add a,a
	add a,h
	ld hx,a
	ld e,0
	ld lx,e
	;add hl,de
	;add hl,de
	;add hl,de
	;add hl,de
	;push hl
	;pop ix
	;рассчитаем hl'=x2counter=2*(curx-(CHWID div 2)*xstep) + 1*siny
	;pop hl
	add hl,hl
	add hl,de
	;рассчитаем de'=x2step=xstep*2
	ld d,b
	ld e,c
	sla e
	rl d
	exx
	;рассчитаем d=tscalesinx/256+layer
layer=$+1
	ld a,0
	add a,tscalesinx/256
	ld d,a
	ld h,d
	call drawmarsline
	pop hl
	inc h
	pop bc
	dec b
	jp nz,drawmars0
	ret

;всего 24 ряда
;в 18-м с конца ряду: longest=3
;...
;в 15-м с конца ряду: longest=4
;...
;в 12-м с конца ряду: longest=5 (можно 4?)
;...
;в 8-м с конца ряду: longest=4
;в 7-м с конца ряду: longest=5 (можно 4?)
;в 6-м с конца ряду: longest=5
 ;досюда можно рисовать простым циклом
 ;а дальше с помощью сравнения:
;в 5-м с конца ряду: longest=6
;в 4-м с конца ряду: longest=7
;в предпредпоследнем ряду: longest=10
;в предпоследнем ряду: longest=12
;в последнем ряду: longest=11

;%11LLLLL0 10CCCCC0 (+inc) to light+hue LC1=%11ccLLL1, hue %11RGCld0
;CCCCC=
;00lll - W
;01lll - R
;10lll - C
;11lll - G

;a=d=tscalesinx/256+layer

	;if 1==1
	;универсальный вариант с простым циклом:
drawmarsline
	;ld a,(layer)
	cp 8+(tscalesinx/256)
	jp c,drawmarslinefront
	;ld a,d
	ld (curtscalesinx),a
	if SINGLEBYTE
	ld c,0+(chmap&255)+(chmwid)
	else
	ld c,1+(chmap&255)+(chmwid*2)
	endif
	ld (drawmarslinesp),sp
	ld sp,drawmarslinestack
drawmarsline0
	if SINGLEBYTE
	dec c
	else
	dec c
	dec c
	endif
	exx
	add ix,bc ;xcounter
	add hl,de ;x2counter
	ld a,h
	exx
	ld l,a
	ld e,hx
	ld a,(de)
	add a,(hl)
	add a,ly
	   ;cp #80
 	   ;ret nc
	ld b,a
	 ld a,(bc)
	 cp BLANKCHUNK;%11111110
	 ret nz
	ld d,tsinx/256
	ld h,d
	ld a,(de)
	add a,(hl)
	if SINGLEBYTE
	if 0==1;C2P4X2
	 add a,12
	 jr nc,$+3
	 sbc a,a
	 cp #fe
	 jr c,$+4
	 ld a,#fc
	else
	sra a
	endif
	if BLANKCHUNK==%11111110
	and #fe
	else
	or #01
	endif
	endif
	 ld l,a ;color
;a=%11LLLLL0
drawmarsline1
	dup 4
	ld a,l
	ld (bc),a
	inc b
	ld a,(bc)
	cp BLANKCHUNK;%11111110
	jr nz,drawmarslineldskip
	edup
	jp drawmarsline1
drawmarslineldskip
curtscalesinx=$+1
	ld d,0
	ld h,d
	ret
drawmarslineq
drawmarslinesp=$+1
	ld sp,0
	ret

	ds 30 ;запас на прерывание
drawmarslinestack
	dup chmwid-1
	dw drawmarsline0
	edup
	dw drawmarslineq

wasdrawmarslinestack
	dup chmwid-1
	dw drawmarsline0
	edup
	dw drawmarslineq
szdrawmarslinestack=$-wasdrawmarslinestack

drawmarslinefront
	ld a,d
	ld (frontcurtscalesinx),a
	if SINGLEBYTE
	ld c,0+(chmap&255)+(chmwid-1)
	else
	ld c,1+(chmap&255)+((chmwid-1)*2)
	endif
	ld hy,chmwid/2
	exx
	sla c
	rl b
	sla e
	rl d
drawmarslinefront0
	add ix,bc ;xcounter
	add hl,de ;x2counter
	ld a,h
	exx
	ld l,a
	ld e,hx
	ld a,(de)
	add a,(hl)
	add a,ly
	if chmap>=#8000 ;SINGLEBYTE
	;cp chmap/256;#de
	;jp c,drawmarslinefrontskip
	jp p,drawmarslinefrontskip
	else
	jp m,drawmarslinefrontskip
	endif
	ld b,a
	ld d,tsinx/256
	ld h,d
	ld a,(de)
	add a,(hl)
	if SINGLEBYTE
	if 0==1;C2P4X2
	 add a,12
	 jr nc,$+3
	 sbc a,a
	 cp #fe
	 jr c,$+4
	 ld a,#fc
	else
	sra a
	endif
	if BLANKCHUNK==%11111110
	and #fe
	else
	or #01
	endif
	endif
	 ld e,a ;color
	;a=%11LLLLL0
	  ld h,b
	  ld l,c ;??? без него не работает даже с SINGLEBYTE
	  ld a,BLANKCHUNK;%11111110
drawmarslinefront1
	if SINGLEBYTE
	dup 10/2
	cp (hl)
	jr nz,drawmarslinefrontldskip
	ld (hl),e
	dec l ;!!!
	ld (hl),e
	inc h
	cp (hl)
	jr nz,drawmarslinefrontldskip
	ld (hl),e
	inc l ;ld l,c
	ld (hl),e
	inc h
	edup
	else
	dup 10/2
	cp (hl)
	jr nz,drawmarslinefrontldskip
	ld (hl),e
	dec l ;!!!
	dec l ;!!!
	ld (hl),e
	inc h
	cp (hl)
	jr nz,drawmarslinefrontldskip
	ld (hl),e
	ld l,c
	ld (hl),e
	inc h
	edup
	endif
	jp drawmarslinefront1
drawmarslinefrontldskip
frontcurtscalesinx=$+1
	ld d,0
	ld h,d
drawmarslinefrontskip
	if SINGLEBYTE
	dec c
	dec c
	else
	ld a,c
	sub 4
	ld c,a
	endif
	dec hy
	exx
	jp nz,drawmarslinefront0
	ret

	;endif

	if C2PCOLOR
	include "c2p_color.asm"
	else
	 if C2P4X2
	include "c2p_4x2.asm"
	 else
	include "c2p_4x4.asm"
	 endif
	endif


dists
;dist,scale
	INCBIN "mkmars\dists.dat"

	ALIGN 256
tsin
	INCBIN "cos.$c!"
tsinx
	INCBIN "mkmars\tsinx.dat"
tsiny
	INCBIN "mkmars\tsiny.dat"
;tsinx2
	;INCBIN "mkmars\tsinx2.dat"
tscalesinx
	INCBIN "mkmars\tscalesinx.dat"

activeend

	
end

	display "End=",end
	display "Free after end=",/d,#c000-end
	display "Size ",/d,end-begin," bytes"
	
	savebin "code.c",begin,end-begin
	
	LABELSLIST "..\us\user.l"
