Код:
LINE
; Bresenham's line algorithm
; de - first pixel , hl - last pixel
.lineB call .plot ; вывод начальной точки
.lineN
push hl
or a
sbc hl,de ; проверяем на нулевую длину
pop hl
ret z
.noequ ; de - y0x0 , hl - y1x1
ld a,l
ld l,#1C ; inc e
sub e ;dx x1-x0
jr nc, 1F
neg
inc l ; l=#1D - dec e : dx<0 (.Xstep)
1
ld b,a ; b = |x1-x0| (.dX)
ld a,h
ld h,#14 ; inc d
sub d ; dy y1-y0
jr nc, 1F
neg
inc h ; h=#15 - dec d : dy<0 (.Ystep)
1
ld c,a ; c = |y1-y0| (.dY)
cp b ; dx > dy ведём линию по X , dy > dx ведём линию по Y
jr c,1F
ld c,b ; меняем местами X и Y
ld b,a
ld a,h
ld h,l
ld l,a
ld a,c
1
ld (.dERR),a
ld a,b
ld (.dM),a
ld a,l
ld (.Step1),a
ld a,h
ld (.Step2),a
ld hl,0 ; err- проверка ; de - y0x0
.loopln
push bc
.Step1 inc e ;Xstep x=x+1 / x=x-1 / y=y+1 / y=y-1
ld bc,0
.dERR EQU $-2 ;dERR dY or dX
add hl,bc ; err=err+dY or err+dX
1
ld bc,0
.dM EQU $-2 ; dX or dY
bit 7,h
jr nz,1F
push hl
add hl,hl
or a
sbc hl,bc
pop hl
jr c,1F ; if (err*2 < dM) goto 1F
sbc hl,bc ; err = err-dM
.Step2 inc d ;Ystep y=y+1 / y=y-1 / x=x+1 / x=x-1
1
call .plot
pop bc
djnz .loopln
ret
.plot ; вход de: e=x , d=y
push hl,de,bc
call PLOT_SNP ; вывод точки меняется от условий
.plotADR EQU $-2
pop bc,de,hl
ret
Может кому и сгодиться на что-нибудь. Прогу вывода точек не привожу, это не существенно, там разные варианты использовались.