{************************************************
                 Hugo Eti‚vant
     http://www.multimania.com/cyberzoide/
      e-mail : cyberzoide@multimania.com
      (pour une aide en Turbo Pascal 7.0)
*************************************************

Unit‚ graphique pour la manipulation de 256 couleurs
Dans un programme, il est n‚cessaire de :

- d‚clarer l'unit‚ "Graph256"

- initialiser le mode graphique par la commande "InitGraph256"

- utiliser les commandes disponibles :

           - Palette(c,r,v,b : Byte) ;
             Pour modifier la palette.
             Utilis‚e en boucle, elle permet de faire de beaux d‚grad‚s.

           - Pixel(x,y : Word ; c : Byte) ;
             Pour afficher un point de coordonn‚es (x,y) et de couleur c
             comprise entre 0 et 255. AprŠs, la palette peut ˆtre modifi‚e.

           - Rectangle(a,b,c,d,e : Word) ;
             Pour afficher un rectangle de coordon‚es a,b,c,d (similaire
             … la proc‚dure de l'unit‚ "Graph") et de couleur e.

- fermer le mode graphique par : "CloseGraph256" }

UNIT Graph256 ;


INTERFACE

USES Dos,Crt ;   {unit‚s utilis‚es}
PROCEDURE InitGraph256 ;
PROCEDURE CloseGraph256 ;
PROCEDURE Palette(c,r,v,b : Byte) ;
PROCEDURE Screen(mode : Byte) ;
PROCEDURE Pixel(x,y : Word ; c : Byte) ;
PROCEDURE Rectangle(a,b,c,d,e : Word) ;
VAR i : Integer ;   {variable globale}


IMPLEMENTATION

PROCEDURE InitGraph256;
BEGIN
 Screen(19); {choix d'un mode d'‚cran}
END;

PROCEDURE CloseGraph256;
BEGIN
 Screen(3);  {retour mode co80}
END;

PROCEDURE Palette(c,r,v,b : byte) ; {proc‚dure param‚tr‚e}
{r,v,b : intensit‚ des 3 couleurs primaires
 c : num‚ro de la couleur [0..255] }
VAR reg : registers ;  {variable locale}
BEGIN
 reg.ax:=$1010;
 reg.bx:=c;   {num‚ro de la couleur [0..255]}
 reg.cl:=r;   {intensit‚ du rouge [0..63]}
 reg.ch:=v;   {intensit‚ du vert [0..63]}
 reg.dh:=b;   {intensit‚ du bleu [0..63]}
 intr($10,reg); {interruption Dos vers le microprocesseur 8086}
END;

PROCEDURE Screen(mode : byte) ; {proc‚dure param‚tr‚e}
VAR reg : registers; {d‚claration de la variable locale}
BEGIN
 reg.ah:=0;
 reg.al:=mode;  {d‚finition de l'‚cran}
 intr ($10,reg); {interruption Dos vers le microprocesseur}
END;

PROCEDURE Pixel(x,y : word ; c : byte) ; {proc‚dure param‚tr‚e}
{x,y : coordonn‚es du point … afficher et c : sa couleur [0..255] }
BEGIN
 mem[$A000:x+320*y]:=c; {accŠs … un segment de m‚moire}
END;

PROCEDURE Rectangle(a,b,c,d,e : word) ; {proc‚dure param‚tr‚e}
{cr‚ation d'un rectangle de coordonn‚es a,b,c,d et de couleur e }
VAR i : integer;  {variable locale}
BEGIN
 FOR i:=b TO d DO         {trace les deux c“t‚s verticaux}
     BEGIN
     Pixel(a,i,e);
     Pixel(c,i,e);
     END;
 FOR i:=a TO c DO         {trace les deux c“t‚s horizontaux}
     BEGIN
     Pixel(i,b,e);
     Pixel(i,d,e);
     END;
END;

BEGIN
END.


