Mise � jour : 04 Fevrier 1997 .

Page en perp�tuelle construction !

ATTENTION !!!


Cette page devra �tre consomm�e avec mod�ration ! Les techniques de programmation avanc�es qui vous seront enseign�es - avec en plus possibilit� de t�l�chargement ! - risquent de vous rendre insomniaque ...
UN CONSEIL : R�glez votre r�veil � 2h du matin : Il vous indiquera qu'il faut d'urgence vous coucher !!!


Et voici un premier programme , pour vous faire patienter , qui int�ressera plus d'un :
Comment piloter la sortie parall�le de son PC ? (Sortie imprimante)
Voici tout d'abord le programme . Le source et un sch�ma �lectronique simple sera disponible en t�l�chargement.

program CENTRONIC;

{ Programme Pascal pour envoyer des donn�es sur le port parall�le }
{ 12/08/96 Hoareau Bertrand }
uses CRT;
VAR I:longint;
j,valeur:byte;
a:char;

procedure init_port;assembler;
ASM
    mov DX,037bh {Registre de controle}
    mov Al,080h
    out DX,Al {initialisation}
End;


Procedure envoie(data:byte);assembler;
ASM
    mov DX,0378h {L'adresse du port centronic �tant 0378h sur mon PC}
    mov Al,data
    out DX,Al {envoie data }
End;

Begin
    clrscr;
    init_port; writeln('Tapez ECHAP pour sortir');
    writeln;
    valeur:=255; {Pour mettre � 1 D0 � D7}
    repeat
      writeln('Mise � 1 des sorties :');
      envoie(valeur); {Mise � 1 des sorties d0 � d7}
      a:=readkey;
      writeln('Mise � z�ro des sorties:');
      envoie(0); {Mise � zero des sorties d0 � d7}
      a:=readkey;
    until ord(a)=27;

    {Note: Pour activer sortie d0: Valeur:= 1;
          d1: Valeur:= 2;
          d2: Valeur:= 4;
          d3: Valeur:= 8;
          dn: valeur:= 2^n;
    Si vous voulez activer sortie d0 et d1 , Valeur = 1+2=3 }
end.

T�l�chargement !
Le source CENTRON.PAS
Le sch�ma �lectronique



Pixel, palette, sprite,scrolling,synchro

Avant de se lancer dans les modes graphiques du PC, il faut comprendre la signification des termes Pixels, Palette et Sprite.
Dans le mode VGA 256 couleurs, chaque pixel (point sur l'�cran) occupe 1 octet (8bits) en m�moire.
Cet octet ne donne pas directement les 3 composantes RVB de la couleur mais pointe dans une table � 256 (2^8) entr�es appel�e Palette de couleur.

Un sprite est un bloc de pixels rectangulaire , mais certains pixels sont transparents , ce qui permet de faire apparaitre le fond du d�cor. G�n�ralement la couleur de transparence utilis�e est le noir (Couleur 0 dans la palette). Une routine charg�e d'afficher un sprite � l'�cran va scruter le bloc , pixel par pixel , et afficher uniquement les pixels qui ne sont pas noirs .

Le scrolling est l'art de faire d�filer un �cran, c'est � dire de d�placer les objets graphiques de 1 ou plusieurs pixels vers le haut/bas (scrolling vertical) ou la droite/gauche (scrolling horizontal).
Le scrolling demande beaucoup de ressources machines et les zones critiques de l'algorithme de scroll doivent etre programm�es en assembleur pour obtenir de bons r�sultats.

La synchronisation VBL est une notion capitale � comprendre. Un gros probl�me, lorsque l'on anime des objets � l'�cran (scrolling, sprite) est que l'image est d�form�e ou scintille d�sagr�ablement . Pour �liminer ce probl�me il faut synchroniser l'affichage des �l�ments graphiques avec le retour vertical du canon � �lectrons qui balaye l'�cran et utiliser un �cran logique (m�thode du double �cran que nous verrons plus tard).
Un top VBL est d�clench� � chaque fois que le rayon a atteint l'extr�mit� inf�rieure droite de l'�cran et qu'il est ramen� sur la premi�re ligne en haut � gauche de l'�cran. J'utilise d'ailleurs la synchro VBL pour r�aliser mes tempos. C'est la seule garantie en turbo pascal sur PC pour obtenir une tempo qui est � peu pr�s la m�me quelque soit le PC utilis� (du 286 au pentium). L'instruction Delay du T.Pascal est � proscrire!

Et voici le programme (assembleur) tr�s cours qui vous permet de vous synchroniser avec le balayage �cran :

WaitRetrace proc pascal far

    mov dx,3dah
    wait1:
    in al,dx
    test al,8h
    jnz wait1
    wait2:
    in al,dx
    test al,8h
    jz wait2
    ret

Note : On a deux boucles afin d'�tre s�r qu'on a bien attendu 1 retour entier de balayage �cran (la premi�re boucle pouvant tr�s bien commencer au moment ou le retour se termine (=fin) ...)


LE MODE 13h du BIOS


Le mode 13h est un mode qui permet d'afficher facilement un point sur l'�cran. Au niveau m�moire, l'espace � adresser commence au segment A000. A chaque pixel sur l'�cran correspond un octet (en m�moire) qui repr�sente sa couleur (L'octet est en fait un pointeur sur une couleur de la palette). Les adresses se suivent dans l'ordre de balayage du rayon cathodique.
Ainsi , point (0,0) correspond � un offset de 0, le point (0,1) � un offset de 320 etc jusqu'au point (319,199) = offset 63999.
(Je rappelle qu'ici l'offset est le d�placement par rapport � l'adresse de base de l'�cran c-a-d A000)

Tout pixel a donc une adresse de formule : offset = Y*320+X.
Pour allumer un point en mode 13h, il suffit donc de faire un Poke A000h+offset , couleur.

Il faut tout de m�me savoir que l'adressage lin�aire du mode 13h n'est en fait qu'une simulation. En r�alit� la carte VGA reconvertit l'adresse lin�aire en une adresse de plans. Les deux lignes d'adresses inf�rieures (bit 0 et 1 de l'offset) servent � s�lectionner sur quel plan nous allons �crire. Les 6 bits restants (2 � 7) repr�sentent l'adresse � l'int�rieur du plan , apr�s mise � 0 des bits 0 et 1. (Cela entraine un gaspillage de place car il alors impossible d'adresser tous les octets du plan de bit , mais c'est le prix � payer (sur Atari c'est pas aussi mer...))

Voici un petit programme simple qui fait d�filer des �toiles en utilisant le mode 13h.
Program Defil_etoiles;

Uses Crt;
Var Etoiles:Array[0..500] of Record
                              x,y,Plan:Integer;
                            End;
  nb_et:Word;

Procedure PutPixel(x,y,col:word);assembler;
{dessine le point (x,y) en couleur col (Mode 13h)}
asm
  mov ax,0a000h          {charge le segment}
  mov es,ax
  mov ax,320             {offset = Y*320 + X}
  mul y
  add ax,x
  mov di,ax              {charge l'offset }
  mov al,byte ptr col    {charge la couleur}
  mov es:[di],al         {et place le point}
End;

Begin
  Randomize;                  {initialise le g�n�rateur de nombres al�atoires}
  asm mov ax,13h; int 10h End;    {d�clenche le mode 13h }
  Repeat                          {ex�cution une fois par dessin d'�cran}
    For nb_et:=0 to 500 do Begin  {nouvelle position pour chaque �toile}
      With Etoiles[nb_et] do Begin
        PutPixel(x,y,0);          {efface l'ancien pixel}
        Dec(x,Plan shr 5 + 1);    {effectue le d�placement}
        if x <= 0 Then Begin      {sortie � gauche  ?}
          x:=319;                 {alors r�initialisation }
          y:=Random(200);
          Plan:=Random(256);
        End;
        PutPixel(x,y,Plan shr 4 + 16);  {dessine le nouveau pixel}
      End;
    End;
    delay(100);
  Until KeyPressed;             {continue jusqu'� ce qu'on frappe une touche}
  TextMode(3);
End.

Vous avez donc l� d�j� le moyen d'adresser la m�moire vid�o et de dessiner ce que vous voulez !!!
En attendant la suite , amusez vous bien !
(nous reviendrons aussi sur ces histoires de plans assez compliqu�s � comprendre)
T�l�chargement !
ETOILES.PAS



Le mode 13h, c'est bien, mais nous allons tout de suite voir un deuxi�me mode , le Mode X. Non, d�sol� , c'est pas de l'affichage porno , c'est simplement un autre mode graphique qui nous permettra de ne plus faire de gaspillage m�moire (ouf), qui est plus rapide que le mode 13h et permet l'utilisation de PAGES , pour un affichage sans scintillement. Pour les sources pascal, un peu de patience, il faut que je fasse le tri dans tous mes programmes et routines pour pouvoir pr�senter quelque chose de clair, sans quoi vous risqueriez de vous prendre la t�te ...

LE MODE X



Le Mode X en programmation graphique d�signe une autre m�thode pour �crire (ou lire) en m�moire vid�o.
La m�moire vid�o du PC est divis� en 4 plans (comme dans les mode 13h) . Ces 4 plans, accessibles pour le programmeur en lecture ou �criture, sont exploit�s parall�lement lorsqu'une image est affich�e � l'�cran, autrement dit les donn�es en provenance de ces 4 plans sont lues simultan�ment par le processeur video.
En mode X, les plans sont remplis sans trou (contrairement au mode 13h) . Voil�, graphiquement, comment cela se pr�sente :

Pour afficher un point en mode X, il faut toujours conna�tre le num�ro du plan et l'offset (d�placement) par rapport au d�but plan s�lectionn�.
La formule est :
plan = X mod 4 (donne le reste)
offset = Y*80 + X div 4

LES PAGES ECRANS


Nous allons parler maintenant des pages �crans , � ne pas confondre avec les plans de bits.
Lorsque vous affichez une image � l'�cran, la qualit� est parfaite. Lorsque vous essayez de faire un peu d'animation en affichant successivement plusieurs images , les choses se gatent. Que vous soyez sous windows ou sous dos , sur atari, amiga ou pc , vous �tes confront� toujours au m�me probl�me : Scintillement, d�chirement, sensation d�sagr�able de transparence, voir disparition partielle de l'image. Le probl�me est d� � 2 causes essentielles:
1) Lorsque vous affichez une nouvelle image, vous ne savez pas ou se trouve le canon � �lectron de votre �cran : moralit� , si ce dernier est au milieu de l'�cran, la nouvelle image sera dessin�e � partir du milieu alors que l'ancienne sera toujours pr�sente dans la partie haute de votre �cran , d'o� impression de d�chirement.
2) M�me si vous vous synchronisez avec le balayage �cran (VBL) afin de renouveller l'image au moment ou votre canon � �lectron est tout en bas de l'�cran , vous n'aurez pas le temps en un retour balayage (c-a-d temps mis par le canon pour se repositionner en haut � gauche de l'�cran) de mettre � jour votre nouvelle image (m�me avec un pentium ...)
La solution � ce probl�me se nomme " XBIOS(5,Adresse_logique,Adresse_physique, r) " sur Atari , " WingG " sous Windows 95, "double buffering" en Java ... ( A ce propos, je me demande si c'est pas �� qui fatigue Microsoft Explorer 3.0, car lorsque j'utilise cette technique pour emp�cher le scintillement des images de mes puzzles JAVA , Microsoft explorer 3.0 est incapable d'afficher quoi que ce soit contrairement � Netscape 3.0 !!! )
Tout est bas� sur le m�me principe, � savoir : l'utilisation de 2 �crans , c-a-d de 2 zones en m�moire pour dessiner et afficher notre image. Le principe est simple : La nouvelle image sera dessin�e sur un �cran puis l'autre, alternativement. Pendant que le processeur calcule et dessine la nouvelle image sur un �cran, le second �cran est lui affich� . Ensuite on permute les deux �crans (en se synchonisant au VBL �cran) , le processeur dessine alors sur le second �cran pendant que le premier est affich� puis � nouveau permutation ...etc ....
L'op�ration de permutation est tr�s rapide puisqu'il suffit simplement de changer une adresse pour indiquer au processeur Vid�o la nouvelle adresse de la page �cran.
Nous allons donc utiliser ce principe sous Dos , avec Turbo Pascal pour faire des animations . L'espace m�moire Vid�o dont nous disposons permet de loger 4 pages �crans en mode X en 320*200 en 256 couleurs (R�solution dite VGA) .
Bon la r�solution n'est pas terrible, c'est vrai, mais si vous connaissez un bon dessinateur , il pourra en jouant sur la palette des couleurs, donner une qualit� finale tr�s acceptable ! N'oubliez pas que de nombreux jeux r�cents offrent toujours la r�solution VGA, car lorsque les calculs sont complexes (3D textur�e temps r�el par exemple) m�me un pentium peut ramer !!! Un bon jeux, c'est avant tout un bon sc�nario et une bonne jouabilit� !
A suivre !


Captur� par MemoWeb � partir de http://www.guetali.fr/home/creole/Confirme.htm le 10/02/97