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