home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC Interdit
/
pc-interdit.iso
/
graph
/
bres.asm
< prev
next >
Wrap
Assembly Source File
|
1994-10-17
|
3KB
|
100 lines
.286
b equ byte ptr
w equ word ptr
data segment
extrn vpage:word
data ends
putpixel macro
pusha
xchg ax,bx ;échange x et y
push ax ;sauve y pour usage ultérieur
mov cx,bx ;lit x
and cx,3 ;masque le plan
mov ax,1 ;et met à 1 le bit correspondant
shl ax,cl
mov ah,2 ;registre 2 du TS
xchg ah,al
mov dx,3c4h
out dx,ax
pop cx ;lit y
mov ax,80d ;calcule l'offset de ligne
mul cx
shr bx,2 ;ajoute l'offset de colonne
add bx,ax
add bx,vpage ;écrit dans la page courante
mov b es:[bx],3 ;et fixe la couleur
popa
endm
code segment public
assume cs:code,ds:data
public bline
bline proc near
push bp
push ax ;sauvegarde x0
push bx ;et y0
mov bx,4340h ;prépare l'automodification
sub cx,ax ;évalue deltax
jns deltax_ok ;négatif ?
neg cx ;oui, change le signe de deltax
mov bl,48h ;et dec ax au lieu de inc ax
deltax_ok:
mov bp,sp ;adressage de y1 sur la pile
sub dx,ss:[bp] ;calcule deltay
jns deltay_ok ;négatif ?
neg dx ;oui, change le signe de deltay
mov bh,4bh ;et dec bx au lieu de inc bx
deltay_ok:
mov si,dx ;deltay et
or si,cx ;deltax = 0 ?
jne ok
add sp,6 ;alors enlève ax, bx et bp de la pile et fin
ret
ok:
mov w cs:dist_pos,bx ;écrit dec/inc ax/bx
cmp cx,dx ;deltax >= deltay ?
jge deltax_grand
xchg cx,dx ;non, alors échange deltax et deltay
mov bl,90h ;et change inc ax en nop
jmp constantes
deltax_grand:
mov bh,90h ;sinon change inc bx en nop
constantes:
mov w cs:dist_neg,bx ;écrit dec/inc ax/bx
shl dx,1 ;définit Add_2
mov di,dx ;sauve en di
sub dx,cx ;définit Start-Dist
mov bp,dx ;et sauve en bp
mov si,bp ;définit Add_1
sub si,cx ;et sauve en si
mov ax,0a000h ;charge le segment VGA
mov es,ax
pop bx ;reprend les valeurs de x0 et y0
pop ax
loop_p:
putpixel ;dessine un point
or bp,bp ;Dist positif ?
jns dist_pos
dist_neg:
inc ax ;x continue (automodification éventuelle)
inc bx ;y continue (automodification éventuelle)
add bp,di ;met à jour Dist
loop loop_p ;point suivant
jmp fini ;c'est terminé
dist_pos:
inc ax ;x continue (automodification éventuelle)
inc bx ;y continue (automodification éventuelle)
add bp,si ;met à jour Dist
loop loop_p ;point suivant
fini:
pop bp
ret
bline endp
code ends
end