home *** CD-ROM | disk | FTP | other *** search
/ PC Interdit / pc-interdit.iso / graph / segment.pas < prev    next >
Pascal/Delphi Source File  |  1994-10-04  |  2KB  |  69 lines

  1. program segment;
  2.  
  3. Uses Crt;
  4.  
  5. Var x:Word;
  6.  
  7. Procedure PutPixel(x,y,col:word);assembler;
  8. {dessine le point (x,y) en couleur col (Mode 13h)}
  9. asm
  10.   mov ax,0a000h                 {Charge le segment}
  11.   mov es,ax
  12.   mov ax,320                    {Offset = Y*320 + X}
  13.   mul y
  14.   add ax,x
  15.   mov di,ax                     {Charge l'offset}
  16.   mov al,byte ptr col           {... et la couleur}
  17.   mov es:[di],al                {puis dessine le point}
  18. End;
  19.  
  20. Procedure Line(x1,y1,x2,y2,col:Word);assembler;
  21. asm
  22.   {registres exploités :
  23.     bx/cx: parties entière/décimale de l'ordonnée y
  24.     si   : partie décimale de la pente}
  25.   mov si,x1                     {initialise x }
  26.   mov x,si
  27.   sub si,x2               {et mémorise en si la différence
  28.                                   des abscisses}
  29.  
  30.   mov ax,y1                     {initialise y (en bx) }
  31.   mov bx,ax
  32.   sub ax,y2               {et mémorise en ax la différence
  33.                                   des ordonnées}
  34.  
  35.   mov cx,100              {étend la différence des ordonnées
  36.                               pour une meilleure précision}
  37.   imul cx
  38.   idiv si    {  divise par la différence des abscisses (pente)}
  39.   mov si,ax                     {mémorise la pente en si }
  40.  
  41.   xor cx,cx      {met à zéro la partie décimale des ordonnées}
  42.  
  43. @lp:
  44.   push x           { transmet x et la partie entière }
  45.   push bx                       { de y à PutPixel      }
  46.   push col
  47.   call PutPixel
  48.  
  49.   add cx,si           {augmente la partie décimale de y }
  50.   cmp cx,100            {débordement de la partie décimale ?}
  51.   jb @no_debordmt            {non, on continue }
  52.   sub cx,100            {sinon diminue la partie décimale }
  53.   inc bx                {et augmente la partie entière}
  54.  
  55. @no_debordmt:
  56.   inc x            {incrémente x }
  57.   mov ax,x
  58.   cmp ax,x2                     {déjà terminé  ?}
  59.   jb @lp                        {non, on recommence }
  60. end;
  61.  
  62. Begin
  63.   asm  mov ax,0013h; int 10h end;{branche le mode 13h }
  64.   Line(10,10,100,50,1);         {trace un segment }
  65.   ReadLn;
  66.   Textmode(3);
  67. End.
  68.  
  69.