Код:
Test3:;(x1=0, y1=0, x2=255, y2=0..255)
ld de,$FF00 ;dx-dy=255 dy=0
Test3_0:
ld hl,$8000 ;x1=0, y1=0
ld bc,$7F20 ;err=dx/2=127 cnt=256/8=32
push de
ld a,b
call LineX01
pop de
dec d ;--(dx-dy)
inc e ;++dy
jp nz,Test3_0
ret
SubPos macro lab
sub a,e ;err-=dy
jp c, lab
endm
SubNeg macro lab
sub a,e ;err-=dy
jp nc, lab
endm
AddNeg macro lab
add a,d ;err+=dx-dy
jp c, lab
endm
AddPos macro lab
add a,d ;err+=dx-dy
jp nc, lab
endm
Ymove macro
inc l
endm
SetPix1 macro m1
ld a,m1
xor a,(hl)
ld (hl),a
endm
SetPix2 macro m1,m2
SetPix1 m1
Ymove
SetPix1 m2
endm
SetPix3 macro m1,m2,m3
SetPix2 m1,m2
Ymove
SetPix1 m3
endm
SetPix4 macro m1,m2,m3,m4
SetPix2 m1,m2
Ymove
SetPix2 m3,m4
endm
DecRetZ macro
inc h ;inc x
dec c ;dec cnt
ret z
endm
;+0+1-4+2-3-5-7-6+
;+1-4+2-3-5-7-6+0+
LineX00:SubPos LineX71
LineX01:SubPos LineX72
LineX02:SubPos LineX33
LineX03:SubPos LineX14
LineX04:ld b,a
SetPix1 $F0
ld a,b
LineX15:SubPos LineX76
LineX16:SubPos LineX77
LineX17:SubPos LineX38
LineX18:SubNeg LineX09
LineX19:ld b,a
SetPix2 $0E,$01
ld a,b
DecRetZ
LineX40:AddNeg LineX01
LineX41:Ymove
AddNeg LineX02
LineX42:AddPos LineX73
LineX43:SubPos LineX54
LineX44:ld b,a
SetPix2 $80,$70
ld a,b
LineX25:SubPos LineX76
LineX26:SubPos LineX77
LineX27:SubNeg LineX08
LineX28:AddPos LineX39
LineX29:ld b,a
SetPix2 $0C,$03
ld a,b
DecRetZ
LineX30:SubPos LineX71
LineX31:SubPos LineX72
LineX32:SubNeg LineX03
LineX33:AddNeg LineX24
LineX34:ld b,a
SetPix3 $C0,$20,$10
ld a,b
LineX55:AddNeg LineX06
LineX56:Ymove
AddNeg LineX07
LineX57:AddPos LineX78
LineX58:SubNeg LineX49
LineX59:ld b,a
SetPix3 $08,$06,$01
ld a,b
DecRetZ
LineX70:AddNeg LineX01
LineX71:Ymove
AddNeg LineX02
LineX72:AddNeg LineX43
LineX73:AddNeg LineX64
LineX74:ld b,a
SetPix4 $80,$40,$20,$10
ld a,b
LineX65:AddNeg LineX06
LineX66:Ymove
AddNeg LineX07
LineX67:AddNeg LineX48
LineX68:AddPos LineX79
LineX69:ld b,a
SetPix3 $08,$04,$03
ld a,b
DecRetZ
LineX10:SubPos LineX71
LineX11:SubPos LineX72
LineX12:SubPos LineX33
LineX13:SubNeg LineX04
LineX14:ld b,a
SetPix2 $E0,$10
ld a,b
LineX45:AddNeg LineX06
LineX46:Ymove
AddNeg LineX07
LineX47:AddPos LineX78
LineX48:SubPos LineX59
LineX49:ld b,a
SetPix2 $08,$07
ld a,b
DecRetZ
LineX20:SubPos LineX71
LineX21:SubPos LineX72
LineX22:SubNeg LineX03
LineX23:AddPos LineX34
LineX24:ld b,a
SetPix2 $C0,$30
ld a,b
LineX35:SubPos LineX76
LineX36:SubPos LineX77
LineX37:SubNeg LineX08
LineX38:AddNeg LineX29
LineX39:ld b,a
SetPix3 $0C,$02,$01
ld a,b
DecRetZ
LineX50:AddNeg LineX01
LineX51:Ymove
AddNeg LineX02
LineX52:AddPos LineX73
LineX53:SubNeg LineX44
LineX54:ld b,a
SetPix3 $80,$60,$10
ld a,b
LineX75:AddNeg LineX06
LineX76:Ymove
AddNeg LineX07
LineX77:AddNeg LineX48
LineX78:AddNeg LineX69
LineX79:ld b,a
SetPix4 $08,$04,$02,$01
ld a,b
DecRetZ
LineX60:AddNeg LineX01
LineX61:Ymove
AddNeg LineX02
LineX62:AddNeg LineX43
LineX63:AddPos LineX74
LineX64:ld b,a
SetPix3 $80,$40,$30
ld a,b
LineX05:SubPos LineX76
LineX06:SubPos LineX77
LineX07:SubPos LineX38
LineX08:SubPos LineX19
LineX09:ld b,a
SetPix1 $0F
ld a,b
inc h
dec c
jp nz,LineX00
ret