1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
[look at this]
color rb 1
xmax rw 1
x1 dw 1
y1 dw 1
x2 dw 1
y2 dw 1
dinc1 rw 1
dinc2 rw 1
deltamin rw 1
deltamax rw 1
line:
mov cx,1
mov dx,[xmax]
mov ax,[x2]
sub ax,[x1]
jge @f
neg ax
neg cx
@@:
mov bx,[y2]
sub bx,[y1]
jge @f
neg bx
neg dx
@@:
mov [deltamax],bx
mov [deltamin],ax
mov [dinc1],dx
mov [dinc2],cx
cmp ax,bx
jl @f
mov [deltamax],ax
mov [deltamin],bx
mov [dinc1],cx
mov [dinc2],dx
@@:
mov di,[y1]
shl di,2
add di,[y1]
shl di,6
add di,[x1]
mov cx,[deltamax] ***********************
shr cx,1 ****c'est ici l'init de la ligne, modulus
; cette valeur peut etre calculée par le ratio ligne apparente, ligne cachée au debut, et a la fin.
mov dl,[color]
mov ax,[deltamax] ***********************
inc ax **** et ici, c'est le compteur de base
;*****************************************
;boucle de traçage de la ligne, le must de la vitesse.
;***** mais ne teste pas les sorties d'ecran. donc risqué.
; c'est pour ça qui faut faire un calcul de coordonées.
;avec un petit test rapide pour voir si la ligne sort de l'ecran ou non, car si elle sort pas, pas besoin de recalculer.
@@:
mov [es:di],dl
dec ax
je @f
add di,[dinc1]
add cx,[deltamin]
cmp cx,[deltamax]
jl @b
sub cx,[deltamax]
add di,[dinc2]
jmp @b
@@:
;*************************
cette boucle est le resultat final, sans tests de debordement.
ret |