drawedgesbegin=$
;  TEdge = record
;    p1,p2: integer; //^TPoly; указывает на visible
;    v1,v2: integer; //^TVertex (counted once from poly), указывает на xscr,yscr,l
;  end;

dexbase=#80;xbase
scrbufmidH=scrbufmid/#100

drawedges
       if ATM
        ret ;TODO
       endif

;todo сгенерировать процедуру из данных фигуры
	;ld hl,edge
	;ld hy,NEDGE
	ld a,(hl) ;NEDGE
	ld hy,a
	inc hl
drawedges_loop
;hl=pointer to edge
	ld e,(hl)
	inc hl
	ld d,(hl)
	inc hl ;de=p1 (^TPoly)
	ld a,(de) ;p1.visible
	ld c,a
	ld e,(hl)
	inc hl
	ld d,(hl)
	inc hl ;de=p2 (^TPoly)
	ld a,(de) ;p2.visible
	or c
	jp p,drawedges_skip ;both polygons invisible - don't draw

	ld c,(hl)
	inc hl
	ld b,(hl)
	inc hl ;bc=v1 (^TVertex)
	ld a,(bc) ;x1 = v1.xscr
	ld d,a;e,a ;x1
	inc bc
	ld a,(bc) ;y1 = v1.yscr
	ld e,a;d,a ;y1

	ld c,(hl)
	inc hl
	ld b,(hl)
	inc hl ;bc=v2 (^TVertex) ;через hl не ускорить

	push hl ;pointer to intersect

	ld a,(bc) ;x2 = v2.xscr
	ld h,a;l,a ;x2
	inc bc
	ld a,(bc) ;y2 = v2.yscr
	ld l,a;h,a ;y2 ;через hl не ускорить

	call line

	pop hl ;pointer to intersect

	;ld de,MAXLIGHT*2 ;skip intersect
	;add hl,de
	jp drawedges_ok
drawedges_skip
	ld de,2*2;+(MAXLIGHT*2) ;skip v1,v2,intersect
	add hl,de
	;jp drawedges_ok
drawedges_ok
	dec hy
	jp nz,drawedges_loop
	ret

;linesdrawn
;	db 0
line
	if LINEEX
line_opcode=$
	ex de,hl
	endif
	;call linepp
	;jp copyscreen
;linepp
	;ld a,(linesdrawn)
	;inc a
	;ld (linesdrawn),a
;de=xy1
;hl=xy2
	;ld a,e
	;and l
	;ret p ;выход, если оба y невидимые (todo для scrhgt=128)
	ld a,e
	sub scrbuf&#ff
	cp scrhgt
	jp c,linego
	ld a,l
	sub scrbuf&#ff
	cp scrhgt
	ret nc ;оба y невидимые
linego
	;ld a,d
	;and e
	;and h ;чтобы за границу экрана заходили только короткие линии
	;and l ;
	;ret p ;простейший вариант клипирования по x и y (или call m,line_withsprite)
	if SMALLLINES
;x=#80..#ff ;так не зашкалим по H
;y=#80..#ff
	ld a,d ;x1 (МОЖНО PATCH)
	sub h ;a=dx=-31..+31
	 ;jp line_slow
	 cp 8
	 ;ret p
	 jp p,line_slow_p
	 cp -7
	 ;ret m
	 jp m,line_slow_m
	add a,jumptable_center/256 ;#a0xx..#dfxx - таблица джампов (todo b,c=const? можно после ld h,a поставить add a,32=const)
	ld h,a
	ld a,e ;y1 (МОЖНО PATCH)
	sub l ;a=dy=-31..+31
	 ;cp 32
	 ;ret p
	 ;cp -31
	 ;ret m
	add a,a ;a=2*dy=-62..+62
	 ;ret pe ;overflow (не надо вызов медленной процедуры?)
	 jp pe,line_slow_dx ;overflow
	add a,a ;a=4*dy=-124..+124
	 ;ret pe ;overflow (не надо вызов медленной процедуры?)
	 ;ret p ;если таблица переходов совмещена с экранным буфером (а можно наоборот совместить процедуры линий с экранным буфером)
	 jp pe,line_slow_dx ;overflow
	ld l,a ;4*dy
 ;cp -4*8
 ;jp m,line_slow_dy
 ;cp +4*8
 ;jp p,line_slow_dy
	ld c,d ;для восстановления
	if xbase==#c0
	sra d
	else
	 if (xbase==#80)&&(scrbufmidH==#e0)
	 scf
	 rr d
	 else
	 ld a,d
	 add a,0+((scrbufmidH*4)&#ff)-dexbase
	 scf
	 rra
	 ld d,a
	 endif
	endif
	jp (hl) ;там jp drawspr_thisangle (с выходом в line_slow_dy)
	;<рисуем> 00
	;ret
	;0x
	;sra h
	;jr nc 00
	;<рисуем> 01
	;ret
	;<рисуем> 10
	;ret
;drawspr_thisangle
	;ex de,hl
	;l=y=#80..#ff (т.к. рисуем только чётные строки для моушн блура)
	;h=x=#80..#ff (точность 2 пикселя)
	;;;sra h
	;jr nc 0x
	;sra h
	;jr nc 10
	;hl=scrbuf+...: h=f(x)=#e0..#ff,l=f(y)=#80..#ff, в остальные l засунуть таблицу умножения 32x128? или таблица умножения 64x64 в таблице джампов?
	;<рисуем> 11
	;ret

line_slow_dy
;сейчас d запорчен
	ld d,c
;сейчас a=l'=(e-l)*4
;надо l=e-(l'/4)
	sra a
	sra a
	sub e
	neg
	ld l,a
line_slow_dx
;сейчас h'=d-h+jumptable_center/256
;надо h=d-h'+jumptable_center/256
	ld a,d
	sub h
	add a,jumptable_center/256
	ld h,a
	endif ;SMALLLINES

;line_slow
	if dexbase != xbase
	ld a,h
	add a,#ff&(dexbase-xbase)
	ld h,a
	ld a,d
	add a,#ff&(dexbase-xbase)
	ld d,a
	else
	ld a,d ;x1 (МОЖНО PATCH)
	endif
	sub h ;a=dx=-31..+31
;de=xy1
;hl=xy2
;x=#80..#ff ;так не зашкалим по H
;y=#80..#ff
;a=dx
	if dexbase==#c0
	jp p,line_slow_p ;при CY глюки на правой границе экрана
	else
	 ;if dexbase==0
	 ;jp po,line_slow_p
	 ;else ;#80
	 jr nc,line_slow_p
	 ;endif
	endif
line_slow_m
	ex de,hl
	neg
line_slow_p
	ld d,a ;dx>=0
	
;клипирование слева
	ld a,h ;xleft
	;or a
	;jp m,line_slow_clipq ;левый край линии в экране
	 cp dexbase-#40
	 ;if dexbase==0
	 ;jp po,line_slow_clipq ;левый край линии в экране
	 ;else ;#80,#c0
	 jr nc,line_slow_clipq ;левый край линии в экране
	 ;endif
	if dexbase==#c0
	cp dexbase-#80
	ret m ;jp m,line_slow_clipq ;это переполнение вправо, а не влево
	endif
;надо посчитать:
;dx'=h+dx-128 (=>0)
;dy'=dy*dx'/dx=(e-l)*dx'/dx
;h=128
;l=e-dy'=e-(e-l)*dx'/dx
	ld b,d ;dx
	add a,d ;dx
	;ret p ;вся линия левее экрана
	;sub 128
	 sub dexbase-#40
	if dexbase==#c0
	ret m ;вся линия левее экрана
	else
	 ;if dexbase==0
	 ;ret pe ;вся линия левее экрана
	 ;else ;#80
	 ret c ;вся линия левее экрана
	 ;endif
	endif
	ld d,a ;new dx (=>0)
	 ret m ;new dx=>0 ;jp m,0 ;не спасает от выскакивания вершин на центр (причём глюк был и при dx!=0)
	if 1==0
	call div8 ;a=a/b (=>0) =dx'/dx
	else
	ld c,1
	dup 6
	cp b
	jr c,$+3 ;CY: a<b (0 в частное, не вычитать)
	sub b ;вычитать!
	rl c
	add a,a
	edup ;27.5 (реально меньше, т.к. при переполнении вероятность jr меньше)
	cp b
	ld a,c
	rla ;a=255(=-1)..128(=-128), а нужно 0..127
	cpl ;a=0..127
	endif
	 ;or a
	 ;jp m,0
	ex af,af' ;'
	ld a,e
	sub l
	ld c,a
	rla
	sbc a,a
	ld b,a ;bc=dy
	ex af,af' ;'
	add a,a
	;call __MULPLUS ;hl=+-bc*a
;+0.7 * 0.7 = +0.15
;BC * A = HL
        LD HL,1;0 ;1 для правильного округления (будем брать H)
       DUP 7
        ADD A,A
        jr nc,$+3
        ADD HL,BC
        ADD HL,HL
       EDUP 
	ld a,e
	sub h
	sub h
	ld l,a
	ld h,dexbase-#40;128
line_slow_clipq
;
	 sla d ;dx
          jr nc,$+4
          ld d,0xff ;иначе линии шире экрана показывались как короткие

	ld a,h ;x*2+#80
	 ld (line_slow_bitpatch),a
	if dexbase==#c0
	sra h
	sra h
        ld a,h
	else
	;add a,0+((scrbufmidH*4)&#ff)-dexbase
	;ld h,a
	;scf
	;rr h
	;sra h
        ;a = #40..#bf
        srl a ;#20..#5f
        srl a ;#10..#2f
        add a,scrbufmidH-(dexbase/4)
        ld h,a
       if scrbuf<#8000
        ret m ;
       endif
	endif
        
;костыль, чтобы избежать запарывания таблиц
        cp scrbuf/256
        ret c
        
line_slow_bitpatch=$+1
	 ld a,(tbit)
	 ld c,a ;bit
;e=dy=-31..+31?
	  if ybase != #80
	  ld a,l
	  sub ybase-#80
	  ld b,a
	  ld a,e
	  sub ybase-#80
	  sub b
	  else
	ld a,e
	sub l
	  endif
	jr nc,sHORN_dypos
	;jp p,sHORN_dypos ;иначе глюки на нижней границе экрана
	neg
	ld e,a ;dy>=0
	CP d ;dx
	JR NC,msHORNV ;dy>=dx, dx<=dy
;msHORNH ;
	LD A,d
	LD B,d ;dx
	INC B ;dx+1 pixels
	CPL 
	;SCF ;уже CY=1 
	RRA ;mym:=256-(dx div 2)
	 ex af,af' ;'
	 ld a,(hl)
msHORNH0
	or c
	rrc c
	jp nc,msHORNincx1q
	 ld (hl),a
	inc h
       if scrbuf<#8000
        ret m ;
       endif
	 ld a,(hl)
msHORNincx1q
	ex af,af' ;'
	ADD A,e ;mym:=mym+dy
	JP NC,msHORNHexQ
	SUB d ;mym:=mym-dx
	 ex af,af' ;'
	 ld (hl),a
	dec l
	  ;ret p ;Y clipping
	 ld a,(hl)
	DJNZ msHORNH0
	ret;JP sHORNQ
msHORNHexQ
	 ex af,af' ;'
	DJNZ msHORNH0
	 ld (hl),a
	ret;JP sHORNQ
msHORNV ;
	LD B,e ;dy
	INC B ;dy+1 pixels
	CPL
	SCF ;CY=1
	RRA ;xm:=256-(dy div 2)
msHORNV0
	ex af,af' ;'
	ld a,(hl)
	or c
	ld (hl),a
	ex af,af' ;'
	ADD A,d ;xm:=xm+dx
	JP NC,msHORNVQ
	SUB e ;xm:=xm-dy {dy<>0!!!}
	rrc c
	jp nc,msHORNVQ
	inc h
       if scrbuf<#8000
        ret m ;
       endif
msHORNVQ
	dec l
	  ;ret p ;Y clipping
	DJNZ msHORNV0 
	ret

sHORN_dypos
	ld e,a ;dy
	CP d ;dx
	JR NC,sHORNV ;dy>=dx, dx<=dy
;sHORNH ;
	LD A,d
	LD B,d ;dx
	INC B ;dx+1 pixels
	CPL 
	;SCF ;уже CY=1 
	RRA ;mym:=256-(dx div 2)
	 ex af,af' ;'
	 ld a,(hl)
sHORNH0
	or c
	rrc c
	jp nc,sHORNincx1q
	 ld (hl),a
	inc h
       if scrbuf<#8000
        ret m ;
       endif
	 ld a,(hl)
sHORNincx1q
	ex af,af' ;'
	ADD A,e ;mym:=mym+dy
	JP NC,sHORNHexQ
	SUB d ;mym:=mym-dx
	 ex af,af' ;'
	 ld (hl),a
	inc l
	  ;ret p ;Y clipping
	 ld a,(hl)
	DJNZ sHORNH0
	 ;ld (hl),a
	ret;JP sHORNQ
sHORNHexQ
	 ex af,af' ;'
	DJNZ sHORNH0
	 ld (hl),a
	ret;JP sHORNQ
sHORNV ;
	LD B,e ;dy
	INC B ;dy+1 pixels
	CPL
	SCF ;CY=1
	RRA ;xm:=256-(dy div 2)
sHORNV0
	ex af,af' ;'
	ld a,(hl)
	or c
	ld (hl),a
	ex af,af' ;'
	ADD A,d ;xm:=xm+dx
	JP NC,sHORNVQ
	SUB e ;xm:=xm-dy {dy<>0!!!}
	rrc c
	jp nc,sHORNVQ
	inc h
       if scrbuf<#8000
        ret m ;
       endif
sHORNVQ
	inc l
	  ;ret p ;Y clipping
	DJNZ sHORNV0 
	ret

	;.ALIGN 256
	BEGIN256 256
tbit
	dup 64;32
	;db 128,64,32,16,8,4,2,1
	db 128,32,8,2
	edup
	END256

	display "drawedges size=",$-drawedgesbegin
