Код:
align 8
PixMask db 128, 64, 32, 16, 8, 4, 2, 1
SetPix macro
xor (hl)
ld (hl), a
endm
LineTo: ; (hl - x1y1)
ld de, 0x0000
ld (LineTo + 1), hl
Line: ; (hl - x1y1, de - x2y2)
ld a, d
sub h
jp nc, LineGm
cpl
inc a
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
or a
rra
or a
rra
or a
rra
add 0x90 + 8 ; Старший байт адреса начала экрана Специалиста
ld h, a
ld a, (bc)
ld b, a
LineDy:
ld a, e
sub l
jp nc, LineXi
cpl
inc a
LineXd:
ld e, a ; dy
sub d
jp nc, LineYd
cpl
inc a
ld (LineXdd + 1), a ; dx-dy
ld a, 0x2D ; dec l
ld (LineXmm), a
jp LineXi1
LineYd:
ld (LineYdd + 1), a ; dy-dx
ld a, 0x2D ; dec l
ld (LineYy), a
ld (LineYyy), a
jp LineYi1
LineXi:
ld e, a
sub d
jp nc, LineYi
cpl
inc a
ld (LineXdd + 1), a ; dx-dy
ld a, 0x2C ; inc l
ld (LineXmm), a
LineXi1:
ld c, d ;cnt
inc c
ld a, d
or a
rra
ld d, a
ld a, b
LineXp:
SetPix
dec c
ret z
ld a, d
sub e
ld d, a
jp nc, LineXpp
LineXmm:
dec l
ld a, b
rrca
ld b, a
jp nc, LineXm
inc h
LineXm:
SetPix
dec c
ret z
ld a, d
LineXdd:
add 0
ld d, a
jp nc, LineXmm
LineXpp:
ld a, b
rrca
ld b, a
jp nc, LineXp
inc h
jp LineXp
LineYi:
ld (LineYdd + 1), a ; dy-dx
ld a, 0x2C ; inc l
ld (LineYy), a
ld (LineYyy), a
LineYi1:
ld c, e ; cnt
inc c
ld a, e
or a
rra
ld e, a
ld a, b
LineYp:
SetPix
dec c
ret z
LineYy:
inc l ; ++y
ld a, e
sub d
ld e, a
ld a, b
jp nc, LineYp
rrca
ld b, a
jp nc, LineYm
inc h ; ++x
LineYm:
SetPix
dec c
ret z
LineYyy:
inc l ; ++y
ld a, e
LineYdd:
add 0
ld e, a
ld a, b
jp c, LineYp
rrca
ld b, a
jp nc, LineYm
inc h
jp LineYm