home *** CD-ROM | disk | FTP | other *** search
/ PC Interdit / pc-interdit.iso / graph / bres.asm < prev    next >
Assembly Source File  |  1994-10-17  |  3KB  |  100 lines

  1. .286
  2. b equ byte ptr
  3. w equ word ptr
  4.  
  5. data segment
  6.   extrn vpage:word
  7. data ends
  8.  
  9. putpixel macro
  10.   pusha
  11.   xchg ax,bx              ;échange x et y
  12.   push ax                 ;sauve y pour usage ultérieur
  13.   mov cx,bx               ;lit x
  14.   and cx,3                ;masque le plan
  15.   mov ax,1                ;et met à 1 le bit correspondant
  16.   shl ax,cl
  17.   mov ah,2                ;registre 2 du TS
  18.   xchg ah,al
  19.   mov dx,3c4h
  20.   out dx,ax
  21.  
  22.   pop cx                  ;lit y
  23.   mov ax,80d              ;calcule l'offset de ligne
  24.   mul cx
  25.   shr bx,2                ;ajoute l'offset de colonne
  26.   add bx,ax
  27.   add bx,vpage            ;écrit dans la page courante
  28.   mov b es:[bx],3         ;et fixe la couleur
  29.  
  30.   popa
  31. endm
  32.  
  33. code segment public
  34. assume cs:code,ds:data
  35. public bline
  36. bline proc    near
  37.   push bp
  38.   push ax                 ;sauvegarde x0 
  39.   push bx                 ;et y0 
  40.   mov bx,4340h            ;prépare l'automodification
  41.   sub cx,ax               ;évalue deltax
  42.   jns deltax_ok           ;négatif ?
  43.   neg cx                  ;oui, change le signe de deltax
  44.   mov bl,48h              ;et dec ax au lieu de inc ax
  45. deltax_ok:
  46.   mov bp,sp               ;adressage de y1 sur la pile
  47.   sub dx,ss:[bp]          ;calcule deltay
  48.   jns deltay_ok           ;négatif ?
  49.   neg dx                  ;oui, change le signe de deltay
  50.   mov bh,4bh              ;et dec bx au lieu de inc bx
  51. deltay_ok:
  52.   mov si,dx               ;deltay et
  53.   or si,cx                ;deltax = 0 ?
  54.   jne ok
  55.   add sp,6                ;alors enlève ax, bx et bp  de la pile et fin
  56.   ret
  57. ok:
  58.   mov w cs:dist_pos,bx    ;écrit dec/inc ax/bx
  59.   cmp cx,dx               ;deltax >= deltay ?
  60.   jge deltax_grand
  61.   xchg cx,dx              ;non, alors échange deltax et deltay 
  62.   mov bl,90h              ;et change inc ax en nop
  63.   jmp constantes
  64. deltax_grand:
  65.   mov bh,90h              ;sinon change inc bx en nop
  66. constantes:
  67.   mov w cs:dist_neg,bx    ;écrit dec/inc ax/bx
  68.   shl dx,1                ;définit Add_2 
  69.   mov di,dx               ;sauve en di
  70.   sub dx,cx               ;définit Start-Dist 
  71.   mov bp,dx               ;et sauve en bp
  72.   mov si,bp               ;définit Add_1 
  73.   sub si,cx               ;et sauve en si
  74.   mov ax,0a000h           ;charge le segment VGA
  75.   mov es,ax
  76.   pop bx                  ;reprend les valeurs de x0 et y0 
  77.   pop ax
  78. loop_p:
  79.   putpixel                ;dessine un point
  80.   or bp,bp                ;Dist positif ?
  81.   jns dist_pos
  82. dist_neg:
  83.   inc ax                  ;x continue  (automodification éventuelle)
  84.   inc bx                  ;y continue (automodification éventuelle)
  85.   add bp,di               ;met à jour Dist 
  86.   loop loop_p             ;point suivant
  87.   jmp fini                ;c'est terminé 
  88. dist_pos:
  89.   inc ax                  ;x continue (automodification éventuelle)
  90.   inc bx                  ;y continue (automodification éventuelle)
  91.   add bp,si               ;met à jour Dist 
  92.   loop loop_p             ;point suivant
  93. fini:
  94.   pop bp
  95.   ret
  96. bline endp
  97. code ends
  98. end
  99.  
  100.