Код:
defs 7&-$
PixMask defb 128,64,32,16,8,4,2,1
SetPix macro
xor a,(hl)
ld (hl),a
endm
LineTo:;(hl - x1y1)
ld de,$0000
ld (LineTo+1),hl
Line:;(hl - x1y1, de - x2y2)
ld a,d
sub a,h
jp nc,LineGm
neg
ex de,hl ;swap p1,p2
LineGm: ld d,a ;dx
ld bc,PixMask
ld a,$7
and h
add c
ld c,a
ld a,h
srl a
srl a
srl a
add a,$80
ld h,a
ld a,(bc)
ld b,a
LineDy: ld a,e
sub a,l
jp nc,LineXi
neg
LineXd: ld e,a ;dy
sub a,d
jp nc,LineYd
neg
ld (LineXdd+1),a ;dx-dy
ld a,$2D;dec l
ld (LineXmm),a
jp LineXi1
LineYd: ld (LineYdd+1),a ;dy-dx
ld a,$2D;dec l
ld (LineYy),a
ld (LineYyy),a
jp LineYi1
LineXi: ld e,a
sub a,d
jp nc,LineYi
neg
ld (LineXdd+1),a ;dx-dy
ld a,$2C;inc l
ld (LineXmm),a
LineXi1:ld c,d ;cnt
inc c
ld a,d
srl a
ld d,a
ld a,b
LineXp:SetPix
dec c
ret z
ld a,d
sub a,e
ld d,a
jp nc,LineXpp
LineXmm:dec l
ld a,b
rrc a
ld b,a
jp nc,LineXm
inc h
LineXm:SetPix
dec c
ret z
ld a,d
LineXdd:add a,$0
ld d,a
jp nc,LineXmm
LineXpp:ld a,b
rrc a
ld b,a
jp nc,LineXp
inc h
jp LineXp
LineYi: ld (LineYdd+1),a ;dy-dx
ld a,$2C;inc l
ld (LineYy),a
ld (LineYyy),a
LineYi1:ld c,e ;cnt
inc c
ld a,e
srl a
ld e,a
ld a,b
LineYp:SetPix
dec c
ret z
LineYy: inc l ;++y
ld a,e
sub a,d
ld e,a
ld a,b
jp nc,LineYp
rrc a
ld b,a
jp nc,LineYm
inc h ;++x
LineYm: SetPix
dec c
ret z
LineYyy:inc l ;++y
ld a,e
LineYdd:add a,$0
ld e,a
ld a,b
jp c,LineYp
rrc a
ld b,a
jp nc,LineYm
inc h
jp LineYm