drawfacesbegin=$

ATMWID128=1

dfxbase=#80;xbase ;по идее при #80 должны рисоваться любые грани шириной >128 пикс (_maxjr=31, т.е. можно 256 - сделать 512?)

drawfaces
;todo процедура для каждого объекта
	ld a,(hl) ;NPOLY
	ld hy,a
	inc hl
;как отличить треугольники от четырёхугольников? размер записи одинаковый!
;по неправильному числу в 4-й вершине (тогда видимость надо по 1,2,3, с пропуском)? или в 1-й?
;пусть все будут четырёхугольниками (в случае чего совмещать первые две вершины)
drawfaces_loop
	ld de,drawpolyv1
	ldi ;перебрасываем адрес вершины (не координаты!)
	ldi
	ld de,drawpolyv4 ;TODO e или inc
	ldi
	ldi
	ld de,drawpolyv3 ;TODO e или inc
	ldi
	ldi
	ld de,drawpolyv2 ;TODO e или inc
	ldi
	ldi
	ld a,(hl) ;l
	inc hl ;skip l
	bit 7,(hl) ;visible
	push iy
	push hl ;(pointer to visible)
	call nz,DRAWPOLY ;m=visible
	pop hl ;(pointer to visible)
	pop iy
	inc hl ;skip visible
	;ld de,szpoly-9;7;1+(3*2) ;skip visible, e1,e2,e3
	;add hl,de
	dec hy
	jp nz,drawfaces_loop
	ret

;заливает односторонние
;полигоны, заданные по часовой стрелке
_maxjr=31
DRAWPOLY
;	ld (temppolycoladdr),a
;temppolycoladdr=$+1
;	ld a,(coltab)
;	 ld c,a ;штриховка
       if ATM
        ld (DRScolor),a
       else
        ld l,a
        ld h,coltab/256
        ld c,(hl) ;штриховка
       if !INTERLACE
       inc l
       ld a,(hl)
       ld (drawpoly_texturexor),a
       endif
       endif
;todo передавать координаты в регистрах
	 exx
        if 1==1
drawpolyv1=$+1
	ld hl,(0)
	 if ybase != #80
	 ld a,h
	 sub ybase-#80
	 ld h,a
	 endif
	 if dfxbase != xbase
	 ld a,l
	 add a,dfxbase-xbase
	 ld l,a
	 endif
	ld (temppolyvert),hl
drawpolyv2=$+1
	ld hl,(0)
	 if ybase != #80
	 ld a,h
	 sub ybase-#80
	 ld h,a
	 endif
	 if dfxbase != xbase
	 ld a,l
	 add a,dfxbase-xbase
	 ld l,a
	 endif
	ld (temppolyvert+2),hl
drawpolyv3=$+1
	ld hl,(0)
	 if ybase != #80
	 ld a,h
	 sub ybase-#80
	 ld h,a
	 endif
	 if dfxbase != xbase
	 ld a,l
	 add a,dfxbase-xbase
	 ld l,a
	 endif
	ld (temppolyvert+4),hl
drawpolyv4=$+1
	ld hl,(0)
	 if ybase != #80
	 ld a,h
	 sub ybase-#80
	 ld h,a
	 endif
	 if dfxbase != xbase
	 ld a,l
	 add a,dfxbase-xbase
	 ld l,a
	 endif
	ld (temppolyvert+6),hl
        endif
	ld hl,temppoly +1
	ld b,4-1 ;число вершин-1
        ;dec l
        ;LD (POLYBEG_hl),HL ;адрес копии первой вершины
	;ld a,l
	;ld (POLYBEG_l),a
        ;INC l;HL
           ;ld de,#80ff ;d=maxY, E=minY (так медленнее, т.к. лишний проход, и глюк при клипировании по Y)
        LD E,(HL) ;TODO читать из регистров
        ld D,E ;minY,maxY
        LD (DRWPOLYtopyaddr),HL ;адрес 2-го байта копии первой вершины
	ld a,l
	ld (RSBOTTm1_l),a
        INC l;HL ;TODO убрать
        ;LD (RSBOTT),HL ;адрес копии нижней вершины +2
FTB1    INC l;HL
        LD A,(HL) ;Y
        CP E ;minY
        ;jp p,FTB1nmin
;(for ybase=#80)
	JR NC,FTB1nmin;TOP
        LD E,A
	ld (DRWPOLYtopyaddr),HL ;адрес 2-го байта копии верхней вершины
        INC l;HL
        DJNZ FTB1
        JR FTBQ
FTB1nmin
        CP D ;maxY
        ;jp m,FTBnmax
;(for ybase=#80)
	JR C,FTBnmax
        LD D,A
	;ld (RSBOTT),HL;BOTTOM ;адрес копии нижней вершины +2
	ld a,l
	ld (RSBOTTm1_l),a
FTBnmax
        INC l;HL
        DJNZ FTB1
FTBQ    
        LD A,D ;maxY=Ybottom
        CP E ;minY=Ytop
        RET Z ;Ymin=Ymax означает нулевую высоту => выход
	;sub #40 ;ybase-#c0
	;cp (scrbuf&#ff)-#40
;(for ybase=#80)
	 cp ybase-(scrhgt/2)
	ret c ;Ybottom выше верха экрана
        ;LD (POLYEND_hl),HL ;адрес после последнего байта полигона
	;ld a,l
	;ld (POLYEND_l),a
DRWPOLYtopyaddr=$+1
	LD HL,0 ;адрес 2-го байта копии верхней вершины
	ld a,e;(hl) ;Y
	;cp #40 ;ybase-#c0
	;ret c
	;cp (scrbuf&#ff)+scrhgt
;(for ybase=#80)
	 cp ybase+(scrhgt/2)
	ret nc ;Ytop ниже низа экрана

       if 0;ATM
;d=maxY=Ybottom
;e=minY=Ytop
       ;ld e,ybase+1
       ;ld d,ybase+10
       ;jr $
        ld a,ybase-(scrhgt/2)
        cp e
        jr c,$+3
        ld e,a
         ;cp d
         ;jr c,$+3
         ;ld d,a
        ld a,ybase+(scrhgt/2)-1
        cp d
        jr nc,$+3
        ld d,a
         ;cp e
         ;jr nc,$+3
         ;ld e,a
;d=maxY=Ybottom
;e=minY=Ytop
       dec l
       ld a,(hl)
       srl a
        ld l,a;7 ;x/2
        ld a,e
        add a,scrhgt/2-ybase
        ld h,a ;y
        
        ld a,d
        sub e
        ret z
        ld b,a ;hgt
       ;ld a,h
       ;cp 0xc0
       ;jr nc,$
       ld a,h
       add a,b
       cp 0xc0+1
       jr nc,$
        ld c,5 ;wid/2
        ld a,r
        ld e,a
;h=y, l=x/2
;b=hgt,c=wid (/2)
;e=gfx byte
        jp climgega_xy
       endif

	 if ybase != #80
	 add a,ybase-#80
	 endif
        EXX 
        ;LD HL,(DRWPOLYtopyaddr) ;адрес 2-го байта копии верхней вершины
        LD e,a;(HL) ;Y
       if !INTERLACE
       rra
       jr c,drawpoly_noxortexture
       ld a,(hl)
       xor c
       ld c,a
drawpoly_noxortexture
       endif

       if !ATM
	ld h,tleftmask/256
       endif
        EXX 
        DEC l;HL ;адрес копии верхней вершины
        LD (LSPTR),HL
        LD (RSPTR),HL

        CALL RSECT ;TRACE RIGHT, THINK ABOUT ENDPOINT(=ZF) ;расчёт нового BC

        ;RET Z
        ;CALL LSECT
	jp LSECTlrKEEP

       if !ATM
	.ALIGN 256
	dup 32
	jr DRSNO2 ;overflow
	edup
DRSNO2	jp DRSNO ;overflowe
coltab
	db #00,#00
	db #44,#55 ;#41
	db #55,#ff ;#5a
	db #dd,#aa ;#d7
	db #55,#55 ;#50
	db #cc,#ff ;#c3
	db #ff,#00
        
       if 0;!INTERLACE
        nop
        db #00
        db #55
        db #ff
        db #aa
        db #55
        db #ff
        db #00
       endif
       endif
        
temppoly
;temppolycol1
;	db #55 ;штриховка
;temppolycol2
;	db #aa ;штриховка2
	;db 4;3 ;число вершин
temppolyvert
;4 вершины (или хватит 3?)
;drawpolyv1
	dw 0
;drawpolyv2
	dw 0
;drawpolyv3
	dw 0
;drawpolyv4
	dw 0
temppolyvertend

       if ATM
DRSLOOPATM
       dup 128/4
        ld (hl),a ;0x0000
        set 6,h
        ld (hl),a ;0x4000
        add hl,bc ;bc=0xe000
        ld (hl),a ;0x2000
        set 6,h
        ld (hl),a ;0x6000
        add hl,de ;de=0xa001
       edup
        org $-1
       endif

       if !ATM
	ds 121-($&#ff)
       endif 
DRSRSECT
	ld ly,a
	;ld (_LY),a
	call RSECT ;устанавливает HY, проверяет выход (Z)
	jr nz,lrKEEP
	ret
DRSNSAME ;если лев. и прав. стороны в одном байте
;scr = (scr^c)&(~m|b)^c = ~(~(scr^c)|~(~m|b))^c = ((scr^~c)|(m&~b))^~c
       if !ATM ;TODO расчёт scraddr и запись туда
	ld a,(hl);h
	cpl
	or b;l
	ld l,a
	 ld a,(de)
	 xor c ;texture
	 and l
	 xor c ;texture
	 ld (de),a
       endif
	inc e ;Y
	exx
	add hl,de ;left
	add ix,bc ;right
	dec hy
	jp nz,DRS1_ ;переход чаще, чем мимо
DRSKEEP
	ld a,ly
	;ld a,(_LY)
lrSUBn=$+1
	sub 0
lrJC=$
	jr c,DRSRSECT
	ld hy,a
LSECTlrKEEP ;первый вход (RSECT уже посчитан)
	call LSECT ;устанавливает LY
lrKEEP
	ld a,ly
	;ld a,(_LY)
	 cp hy
	 ld a,48 ;JNC => RSECT
	 jr nc,lrKEEPL
;LY опустошится раньше => LSECT
	ld a,hy
	ld hy,ly;0
;_LY=$-1
;	ld (_LY),a
        ld ly,a
	 ld a,56 ;JC => LSECT
lrKEEPL
	 ld (lrJC),a
	 ld a,hy
	 dec a ;чтобы LY не обнулилось при SUB
	 ld (lrSUBn),a
	jp DRS1_
	;display $-DRSKEEP
	;display 256-(2*_maxjr+2+1)-($&#ff)
       if !ATM
	ds 256-(2*_maxjr+2+1)-($&#ff) +1 ;+1 для neg/skip вместо cpl
DRSLOOP
	dup _maxjr
	ld (de),a ;texture
	dec d ;inc d
	edup
	 ld a,(de)
	 xor c ;texture
	 and b;l;%11100000 ;h;%00000111
	 xor c ;texture
	 ld (de),a
       endif
DRSNO
	inc e ;Y
	  ;ret z ;выгодно, если прижать экран снизу к #xx00? но тогда трудно считать видимость
	exx
	add hl,de ;left
	add ix,bc ;right
	dec hy
	jr z,DRSKEEP ;с b в теории выигрыш 4t(5t для SAME) на строку, но на практике проигрыш (не хватает регистра)
;HL=XL   DE=dXL
;IX=XR   BC=dXR
;LY=hgtL/R HY=hgtR/L
;DE'=screen (D=X) ;e'=Y
DRS1_
	ld a,h
	exx
;a=h'=XL
	;117t тактов тут ~ 16800t на сцене из 5 кубиков
	;1t ~ 144t
       if ATM
	ld l,a ;XL
	ld h,tx/256
	ld d,(hl) ;beginx (клипирование по X)
	 ld a,hx ;XR
	ld l,a
	ld a,(hl) ;endx (клипирование по X)
        ld l,a ;endx
	sub d ;beginx
	jp z,DRSNSAME ;если лев. и прав. стороны в одном байте
	jr c,DRSNO ;c при neg/cpl  ;ret c ;overflow??? (при патче jr убирание выигрывает 5 тактов, но даёт глюк из-за левой маски)

       else ;!ATM

	ld l,a
       if !INTERLACE
       ld a,c
drawpoly_texturexor=$+1
       xor 0xaa
       ld c,a
       endif
	ld b,(hl) ;leftmask
	inc h
	ld a,(hl) ;endx (клипирование по X)
	 ld d,hx ;XR
	ld l,d
	ld d,(hl) ;beginx (клипирование по X)
	dec h
	sub d ;beginx
	jp z,DRSNSAME ;если лев. и прав. стороны в одном байте
	jr nc,DRSNO ;c при neg/cpl  ;ret c ;overflow??? (при патче jr убирание выигрывает 5 тактов, но даёт глюк из-за левой маски)
       endif
      
      if ATM
       push de ;e=Y
;патч ret
        inc h ;ld h,tfilladdr/256 ;TODO inc h
	   ld c,(hl)
          if ATMWID128
           inc l
          else
           inc h
          endif
	   ld b,(hl)
       push bc
       ld a,0xc9 ;"ret"
       ld (bc),a
;найти адрес входа
        ld l,d ;beginx
          if ATMWID128
	   ld a,(hl)
	   ld (DRSjr),a
           inc l
	   ld a,(hl)
	   ld (DRSjr+1),a
          else
	   ld a,(hl)
	   ld (DRSjr+1),a
           dec h
	   ld a,(hl)
	   ld (DRSjr),a
          endif
;рассчитать начальный hl по e(Y) и beginx
        inc h ;ld h,ty/256 ;TODO inc h
        ld l,e ;y
        ld a,(hl) ;lsb(y)
        inc h
        ld l,d ;beginx
        add a,(hl) ;lsb(x)
        ld c,a
          if ATMWID128
        inc l
          else
        inc h
          endif
        adc a,(hl) ;hsb(x)
        sub c
        ld l,e ;y
        inc h
        add a,(hl) ;hsb(y)
        ld h,a
        ld l,c

DRScolor=$+1
	ld a,2 ;texture
        ld bc,0xe000 ;TODO убрать
        ld de,0xa001
DRSjr=$+1
	call DRSLOOPATM ;отрисовка байтов
       pop hl
       ld (hl),0x77 ;"ld (hl),a"
       pop de ;e=Y
        jp DRSNO
      
      else ;!ATM
	   add a,a
	   ld (DRSjr),a
	 ld a,(de)
	 xor c ;texture
	cpl
	 or (hl);h;~%00000111 ;l;%11100000
	cpl
	 xor c ;texture
	 ld (de),a
	 dec d;inc d
	ld a,c ;texture
DRSjr=$+1
	jp DRSLOOP ;отрисовка байтов
;один сканлайн 1+1+1 = 234t
;один сканлайн 1+0+1 = 223t
;один сканлайн 1(L=R)= 167t
      endif








;TRACE RIGHT, THINK ABOUT ENDPOINT(=ZF)
;расчёт нового BC
RSECT
        PUSH HL,DE
RSPTR=$+1
        LD HL,0
RSECTloop  
        LD C,(HL)
        INC l;HL; X1
        LD B,(HL)
	ld a,l
RSBOTTm1_l=$+1
	cp 0 ;адрес копии нижней вершины +1 (проверка младшего байта)
        JR Z,RSECTQ ;выход из RSECT (заодно и из полигона, т.к. Z)
;POLYEND_l=$+1
	cp 0+(temppolyvertend&#ff)-1 ;адрес после последнего байта полигона (проверка младшего байта или терминатора)
        JR NZ,$+2+2
;POLYBEG_hl=$+1
	 ld l,0+(temppolyvert&#ff)-1 ;адрес копии первой вершины полигона
        INC l;HL; Y1
	LD E,(HL)
        INC l;HL; X2
        LD A,(HL)
        DEC l;HL; Y2
        SUB B ;Y1
        JR Z,RSECTloop
        ;jp m,RSECT4 ;JR C,RSECT4 ;выход из полигона? когда такое может быть до RSBOTT?
        LD (RSPTR),HL
        LD L,A
	ld hy,a ;DY
        LD A,E
        SUB C;DX CF=SIGN
;FASTDIV 8/8=8.8
;HL(SGN)=A(SGN)/L  CF=SIGN
        CALL FDIVB ;138..333t

        LD HX,C
	ld LX,#80 ;центр пикселя
        OR 1;LX ;NZ (не выходим из полигона)
        LD B,H
	ld C,L

RSECTQ  POP DE,HL
        RET 
;RSECT4  POP DE,HL,HL
;        RET ;JR DRSEX

;TRACE LEFT
;расчёт нового DE
LSECT
        PUSH BC
LSPTR=$+1
        LD HL,0
LSECT1  LD C,(HL)
        INC l;HL; X1
        LD B,(HL)
        DEC l;HL; Y1
	ld a,l
POLYBEG_l=$+1
	cp temppolyvert&#ff ;адрес начала полигона (проверка младшего байта или терминатора)
        JR NZ,$+2+3
POLYEND_hl=$+1
	 ld hl,temppolyvertend ;адрес после последнего байта полигона
	DEC l;HL
        LD A,(HL); Y2
        DEC l;HL
        LD E,(HL); X2
        SUB B
        JR Z,LSECT1
        ;jp m,LSECTQ ;JR C,LSECT3 ;выход из полигона (если убрать, то глючный байт внизу полигона)
;(for ybase=#80)
       jp c,LSECTQ ;JR C,LSECT3 ;выход из полигона (если убрать, то глючный байт внизу полигона)
        LD (LSPTR),HL
        LD L,A
	ld LY,A;     DY
	;ld (_LY),A
        LD A,E
        SUB C;DX CF=SIGN
;FASTDIV 8/8=8.8
;HL(SGN)=A(SGN)/L  CF=SIGN
        CALL FDIVB ;было 138..333t (стало 130..300t)
        EX DE,HL
        LD H,C
        LD L,#80 ;центр пикселя

        POP BC
        RET 
LSECTQ  POP BC,HL
        RET ;JP DRSEX

;FASTDIV 8/8=8.8
;HL(SGN)=A(SGN)/L  S=SIGN
FDIVB
	if dfxbase==#c0
	jp m,FDIVBNEG ;CY нельзя для вычитания знаковых
	else
	 ;if dfxbase==0
	 ;jp pe,FDIVBNEG
	 ;else ;#80
	 jr c,FDIVBNEG ;должно работать для +-255
	 ;endif
	endif
        
       if 0;!INTERLACE
        ;display "TBLOG2=",TBLOG2 ;там значения для -128..+127
;CY=0 (dfxbase=#80)
       jp p,FDIVBPOSpp
       rra
       srl l
FDIVBPOSpp
       endif
        LD H,TBLOG2/256
        LD E,(HL)
        INC H
        LD D,(HL)
        LD L,A
        LD A,(HL)
        DEC H
        ADD A,8
        LD L,(HL)
        LD H,A
        SBC HL,DE ;=LOG(A/L)
        JP P,DIVC1
DIVCZ   LD HL,0 ;LOG<0 => результат <1 =0
        RET 
DIVC1   LD A,H
	 ;ld D,A
        LD H,TB2X/256
        LD L,(HL)
        LD H,1
        cp 8 ;SUB 8
	 cpl
        JR NC,DIVC2
         ;LD A,7
         ;SUB D
	 add a,8
        LD ($+4),A
        JR NZ,$
       DUP 7
        ADD HL,HL
       EDUP 
        LD L,H
	ld H,0
        RET 
DIVC2    ;LD A,#0F
         ;SUB D
	 add a,#10
        LD ($+4),A
        JR NZ,$
       DUP 7
        ADD HL,HL
       EDUP 
        RET 

FDIVBNEG
       if 0;!INTERLACE
;CY=1 (dfxbase=#80)
       jp p,FDIVBNEGpp
       rra
       srl l
FDIVBNEGpp
       endif
	NEG
        LD H,TBLOG2/256
        LD E,(HL)
        INC H
        LD D,(HL)
        LD L,A
        LD A,(HL)
        DEC H
        ADD A,8
        LD L,(HL)
        LD H,A
        SBC HL,DE ;=LOG(A/L)
        JP M,DIVCZ ;LOG<0 => результат <1 =0
        LD A,H
	 ;ld D,A
        LD H,TB2X/256
        LD L,(HL)
        LD H,1
        CP 8 ;SUB 8
	 cpl
        JR NC,DIVCN2
         ;LD A,7
         ;SUB D
	 add a,8
        LD ($+4),A
        JR NZ,$
       DUP 7
        ADD HL,HL
       EDUP 
        LD A,h
        CPL 
        LD L,A
        ld h,-1
        INC HL
        RET 
DIVCN2   ;LD A,#0F
         ;SUB D
	 add a,#10
        LD ($+4),A
        JR NZ,$
       DUP 7
        ADD HL,HL
       EDUP 
        XOR A
        SUB L
        LD L,A
        SBC A,H
        SUB L
        LD H,A
        RET 

       if ATM
       if ATMWID128
        BEGIN256 768
       else
        BEGIN256 1024
       endif
ty
;lsb(y)
      dup (256-scrhgt)/2
       db (scrbase+(40*200))&0xff
      edup
_=0
      dup scrhgt
       db (scrbase+(40*_))&0xff
_=_+1
      edup
      dup (256-scrhgt)/2
       db (scrbase+(40*200))&0xff
      edup
;lsb(xcropped)
       if ATMWID128
_=0
      dup 128/4
       db _,scrbase/256
       db _,scrbase/256+0x40
       db _,scrbase/256+0x20
       db _,scrbase/256+0x60
_=_+1
      edup
       else ;!ATMWID128
_=0
      dup 128/4
       db _
       db _
       db _
       db _
_=_+1
      edup
      dup 128
       db 0
      edup
;hsb(xcropped)
      dup 256/4
       db scrbase/256
       db scrbase/256+0x40
       db scrbase/256+0x20
       db scrbase/256+0x60
      edup
       endif ;!ATMWID128
;hsb(y)
      dup (256-scrhgt)/2
       db (scrbase+(40*200))/256
      edup
_=0
      dup scrhgt
       db (scrbase+(40*_))/256
_=_+1
      edup
      dup (256-scrhgt)/2
       db (scrbase+(40*200))/256
      edup
	END256
       endif

       if ATM
       if ATMWID128
        BEGIN256 256
tfilladdr
_=DRSLOOPATM
       dup 256/8
        dw (_)
        dw (_+3)
        dw (_+5)
        dw (_+8)
_=_+10
       edup
	END256
       else ;!ATMWID128
        BEGIN256 512
tfilladdr
_=DRSLOOPATM
       dup 256/4
        db (_)&0xff
        db (_+3)&0xff
        db (_+5)&0xff
        db (_+8)&0xff
_=_+10
       edup
_=DRSLOOPATM
       dup 256/4
        db (_)/256
        db (_+3)/256
        db (_+5)/256
        db (_+8)/256
_=_+10
       edup
        END256
       endif
       
       endif ;ATM

       if !ATM
	BEGIN256 #200
	macro TLEFTMASK_LEFTINVISIBLE
;слева за экраном
	dup 64
	db #00
	edup
	endm
	macro TLEFTMASK_LEFTVISIBLE
;в экране
_=#00 ;левый пиксель экрана
	dup 64/4
	;db #00,#c0,#f0,#fc
	db _,#e0,#f8,#fe
_=#80
	edup
	endm
	macro TLEFTMASK_RIGHTVISIBLE
;в экране
	dup 64/4
	;db #00,#c0,#f0,#fc
	db #80,#e0,#f8,#fe
	edup
	org $-1
	db #ff ;правый пиксель экрана
	endm
	macro TLEFTMASK_RIGHTINVISIBLE
;справа за экраном
	dup 64
	db #ff
	edup
	endm

tleftmask
	if dfxbase==#c0
	TLEFTMASK_RIGHTINVISIBLE
	TLEFTMASK_LEFTINVISIBLE
	TLEFTMASK_LEFTVISIBLE
	TLEFTMASK_RIGHTVISIBLE
	else
	if dfxbase==0
	TLEFTMASK_RIGHTVISIBLE
	TLEFTMASK_RIGHTINVISIBLE
	TLEFTMASK_LEFTINVISIBLE
	TLEFTMASK_LEFTVISIBLE
	else ;#80
	TLEFTMASK_LEFTINVISIBLE
	TLEFTMASK_LEFTVISIBLE
	TLEFTMASK_RIGHTVISIBLE
	TLEFTMASK_RIGHTINVISIBLE
	endif
	endif
;;;;;;;;;;;;;;;;;;;
	macro TX_LEFTINVISIBLE
;слева за экраном
	dup 64
	db scrbuf/#100
	edup
	endm
	macro TX_LEFTVISIBLE
;в экране
_=scrbuf/#100
	dup 64/4
	db _,_,_,_
_=_+1
	edup
	endm
	macro TX_RIGHTVISIBLE
;в экране
_=scrbufmid/#100
	dup 64/4
	db _,_,_,_
_=_+1
	edup
	endm
	macro TX_RIGHTINVISIBLE
;справа за экраном
	dup 64
	db scrbuf/#100+#1f
	edup
	endm
	
tx
	if dfxbase==#c0
	TX_RIGHTINVISIBLE
	TX_LEFTINVISIBLE
	TX_LEFTVISIBLE
	TX_RIGHTVISIBLE
	else
	if dfxbase==0
	TX_RIGHTVISIBLE
	TX_RIGHTINVISIBLE
	TX_LEFTINVISIBLE
	TX_LEFTVISIBLE
	else ;#80
	TX_LEFTINVISIBLE
	TX_LEFTVISIBLE
	TX_RIGHTVISIBLE
	TX_RIGHTINVISIBLE
	endif
	endif

	END256
       endif ;!ATM

       if ATM
	BEGIN256 256
tx
       dup 64
        db 0
       edup
_=0
          if ATMWID128
       dup 128
        db _*2
_=_+1
       edup
          else
       dup 128
        db _
_=_+1
       edup
          endif
          if ATMWID128
       dup 64
        db 127*2
       edup       
          else
       dup 64
        db 127
       edup       
          endif
	END256
       endif

	BEGIN256 512
TBLOG2
	ds 512 ;log2(X)
	END256
	
	BEGIN256 256
TB2X
	ds 256 ;(2^X)-1 (0<X<1)
	END256

	display "drawfaces size=",$-drawfacesbegin
