PROGRAMMATION GRAPHIQUE

 

Ben me voila donc avec mon super article qui tue la vie qui tue la mort ! Je vais donc côzer de programmation graphique à coups de petits trucs pas supers -et qui font grincer des dents les 'killers ASM' ;)- ...

Il ne faut pas prendre ce que je vais vous montrer, découvrir, enseigner ;) au pied de la lettre: cet article a un seul but: VOUS FAIRE DEMARRER ! Vous sortir du marasme dans lequel vous vous trouvez ... héhéhé .

Donc voila... Pas d'affolement si vous êtes un programmeur hors pair cet article n'est poâ du tout fait pour égarer les brebis du droit chemin qu'est la programmation à grands coups de OUTs et autres MOVs !

Pour ceux que cet article va interresser sachez que les mecs cités plus hauts ont quand même raison (hein Rixed ?;*) ...Je vous soumettrais sûrement une initiation à la programmation assembleur ...Mais nous sommes pour l'instant au début l'asm c'est pour plus tard ! Na !

Bon on y va ... Ok ? Bon puisque vous en êtes arrivé là j'admet que cet article vous interresse et je continue sur ma lancée qui va vous emmener sur une lancée épique: celle de la programmation graphique !!! Tadadadaaaaaaa ! (Aaaah je m'aime !;))

Bon c'est parti !

 

1- Modes VIDEOS & Co

Z'en faites pôa c'est poa compliqué du tout du tout pfff mais puisque je vous le dis ! Pfff...) C'est simple: Là vous êtes dans un mode où vous lisez du texte comme à la normale... Ben ce mode c'est le mode courant de votre ordi (celui qui est présent lorsque devant vos yeux ébahis votre ordinateur prend vie ;]) . Ce mode à le doux nom de mode 3h. Woooa mais d'où il sort ça le mec ?? Ben c'est simple: j'en sais rien du tout, c'est son nom ! Et puis ... Bon je continue. Ben comme lorsque vous appelez votre chien Tobby il se ramène devant vous bavant et un os dans la bouche, ben votre ordi quand vous appelez le mode 3h il se met en mode texte (un peu comme le chien mais sans l'os).

Bon là je suppose que vous avez pigé: le mode 3h est le mode courant on l'où peut lire etc etc ... le mode texte quoi.

Mais y a un truc qui vous chiffonne: pourquoi donc un H après le 3 ?? Réponse: Parcheque ché la marque de la notation hexadécimale. (Ah je vous avait prévenu c'est pour les débutants !).

Petit intermède sur la notation hexadécimale:

Notation décimale Notation héxadecimale
1 01h
2 02h
3 03h
4 04h
5 05h
6 06h
7 07h
8 08h
9 09h
10 0Ah
11 0Bh
12 0Ch
13 0Dh
14 0Eh
15 0Fh

ND Stessy : Il est de rigeur de faire précéder toute notation Hexadécimale d'un zéro, notemment pour éviter les confusions avec une chaine alpha- numérique : BAC vs 0BACh

Hé hé hé marrant non ...Mais je suppose que vous connaissiez déjà cette notation ...Non ? Bon ok je continue ...mais un peu pour la route quoi ;) ... Bon ben c'est la notation qui est la plus souvent utilisée en informatique avec la notation décimale qui vous est déjà familière (sinon je peux rien pour vous) ...Et comme le problème de la distinction s'est posée ben on met la lettre h aprés les chiffres (ou lettres héhé) de la notation hexadecimale. La notation en défaut est la notation décimale. (vous vous seriez sûrement rendu compte du contraire nan ? héhé ...meuuuh si)

Ok bon ben 14 ca c'est décimal et 0Eh ca c'est ... hexadecimal (par contre éh ne l'est poâ du tout ;])! Wooa vous progressez viiite ! M'enfin c'était juste un petit intermède vous vous occuperez de ce problème un peu plus tard pour l'instant vous n'en aurez poâ besoin sauf quelques cas isolés (cet intermède était destiné à vous éclaircir quand on allait aborder ...CA voir plus bas)

Ok pour le mode 03h et la notation hexadecimale ...Mais on veux faire de la programmation graphique (héhé que c'est pompeux) !!

Ok ben le mode graphique que je vais vous montrer est le mode le plus simple pour programmer des points des machins qui bougent et tout et tout ...

 

2- L'Antique Mode 13h

Bon fô tout de suite que vous sachiez qu'il existe des modes videos hypers variés et que certains se prètent à la programmation graphique bien mieux que le mode 13h ! (hé hé àa c'est pour Rixed !) Je citerais le trés fameux mode X (aucun rapport avec Canal +) Nous ferons nos armes sur ce mode 13h.

Bon on regarde le h ... On regarde un peu plus haut sur la notation hexadecimale et on converti en decimal ... Mmmmmh ca fait combien ca ?? Mff au moins oui ...arf plus ...Non ? Quoi ? Ah ? Bof ... 19 ? Ah ...Bon ... Décu !? héhé fallait bien que vous le sachiez non ?

C'est fou comme on en est quasiment au même point ...Hein ? Bon si on veux s'amuser il faudra bien un jour passer dans ce mode 13h ...Bon (tiens encore un ?) je vais vous donner la réponse ...Si vous ne connaissez rien du tout à l'assembleur (m'enfin pour ce qu'on va faire fô pas trop être câlé ...) ben va falloir prendre au pied de la lettre ce que je vais vous dévoiler ..;)

Tamtam tam tadaaaaaam !

	Mov ah,0h
        Mov Al,13h
        Int 10h

Voila ... Hé hé hé c'est pourri hein ? Ben je sais çà déçoit ...héhéhéhé . Bon je vous explique: Au début je vous avait parlé de tobby qu'on appelait pour qu'il revienne? hein ? Ben pour l'ordinateur c'est pareil qu'avec tobby sauf que disons que l'ordi est sourd et qu'il faut lui crier dans les oreilles son nom: 13h .

Ben voila je lui crie dans son oreille 13h avec mes Mov ah,0h Mov al,13h et mon Int 10h .

Pfff c'est poâ simple à expliquer ... Bon je me lance (je crois que l'alégorie du chien a foiré nan !?) Bon l'ordinateur a une bibliothèque de routines (des petits programmes) dans sa mémoire (en fait elle viennent du BIOS et du DOS) ...

Et pour les ranger on les a réunis dans différentes parties ... la partie 1, 2, 3 ...etc etc (y en a un paquet). Ben pour appeler les modes videos il faut passer par ces petites routines . Celle qui nous interresse est rangée dans la partie gestion vidéo c'est la 10h (tiens encore de l'hexadécimal ?). C'est ce que l'on appelle les interruptions.

Mais -encore une difficulté tout à fait surmontable- il y a encore un rangement dans les parties: ce sont les fonctions, celle que l'on veux pour l'instant est la fonction modification du mode vidéo la 0h.

Bon là y a de quoi s'embrouiller pour le nouveau venu dans le monde 'majik' de la programmation, je résume, Y a :

(Si vous voulez vous renseiger sur ces fameuses interruptions ...il y a plein de programmes ou de fichiers textes dans le domaine public qui sont en circulation ...Sinon vous avez le bon vieux Marabout 'Aide mémoire des interruptions du DOS')

Bon ca va ...Vous avez retrouvé vos esprits ? Bon y fo quand même lui dire quel mode on veut à cette fonction 0h de l'INT 10h quand même ... Ben c'est la dernière ligne que l'on ai poâ etudiée qui trinque: c'est le Mov al,13h.

Mais que veux dire Mov ?

Pfff THE question ... Bon c'est de l'assembleur (tiens mais vous savez donc faire de l'assembleur ?? Ben ca alors je m'en savais poâ capable !) et c'est super simple ! To move: bouger donc Mov ah,0h ca veux dire 'bouger 0h dans Ah' et mov al,13h 'Bouger 13h dans al' ... Bon éh ! C'est simple la nan ?

Là toute confusion va être stopée nette: MOV Destination,Source ... Hé hé hé fortiche hein ?

Mais pourquoi mettons 0h dans ah et 13h dans al ??

Ben la faudra attendre l'initation à l'assembleur ! Prenez ca comme ca vient mais souvenez vous : Ah c'est pour le nom de la fonction (ici 0h) ...

hé j'espère que vous commencez à comprendre parceque là je fais quand même de la méthode Coué !) et al c'est pour donner l'ordre sur quelle chose vous voulez que la fonction agisse . (c'est assez ambigüe d'expliquer ca si on explique pas un max de choses à côté bon promis je vous ferais çà un jour)

        Donc      Mov ah,0h
        Mov al,13h
        Int 10h

Ca vous met en mode 13h c'est à dire le ... Quoi ca y est ??On va pouvoir s'amuser ?? Ben vi ... Yaouuuuuuuuh je suis en mode 13euuuuuuh je suis en mode 13euuuuuh ;)) Tant que j'y suis une précision qui je n'en doute pas (quoique ...) ne vous aura pas echappée: on met les movs avant l'int !! C'est necessaire !

 

3- On fait Koâ Quand on y est ??

D'abord moi je suis content parceque j'ai expliqué le plus embétant et maintenant on va pouvoir vraiment s'amuser ! Vous ben vous allez pouvoir voir des machins sur votre écran qui pour l'instant est tout rempli de bafouilles d'un mec qui veux vous initier à la programmation graphique ! Allez un peu de patience la suite arrive !

Bon d'abord il faut que vous sachiez que vous avez du pot d'avoir une carte VGA (ou sVGA) car les autres cartes (CGA et EGA) étaient trés prenantes à programmer ! Z'en foutez ...Bon.

Bon le mode 13h est le mode graphique qui est le plus largement utilisé ... La majeure partie des jeux auxquels vous jouez ont été programmé dans ce mode. Ce mode autorise 256 couleurs simultanément dans une palette de couleur de plus de 260 000 couleurs ... Donc z'avez le choix quoi . (Ah ben si zut !) Y a 320 pixel de large sur 200 de haut . Donc en gros c'est un quadrillage avec 320 carreaux de large et 200 de haut que vous pouvez colorier a votre guise, ou bien tagger ou j ...et puis j'm'en fout moa ! ;))

En gros y a largement de quoi vous amuser comme des petits fours (oups petits fous pardon !)

Ok on est content on peut se mettre en mode 13h ... Mais comment mettre un point ? Vous voulez la reponse maintenant ? Oui ? Ben non ! Hu hu hu va falloir attendre un peu les expliquations suivantes:

Bon vous en faites poa la fin arrive ... Vous z'allez l'avoir ce point sur votre écran !!!

 

4- Les TABLEAUX (et zôtres ARRAYS)

Alors on dit que les tableaux c'est les ARRAYs OK ? Bon là on va y aller mollo (vous me direz que depuis le début on a quand même poâ trop forcé nan ? Et je parie d'ailleurs que ca va en irriter plus d'un ...M'enfin j'écris cette bafouille pour ceux qui débutent donc .... J'ai les circonstances exténuantes ..Oups atténuantes pardon)

Bon d'abord le langage de programmation Pascal lui donne pour nom ARRAY . C'est déjà un bon début ... Mmmmm comment je pourrais définir les tableaux ? Ben en fait ca peux être défini de la façon suivante : ....Nan . Si... a= ARRAY[1..3456] of Byte ben ça défini une zone mémoire de 3456 cases (j'ai choisi ce nombre au pif bien sur vous pouvez mettre autant que pascal le peut c'est à dire 64000) ou l'on peut mettre des machins comme des bytes (des nombres de 0 a 255) ! Mais les cases sont disposées en ' une ligne ' !! Alors que -apparement- POA l'écran Bouououououuuuuuu ...

Bon on prend l'écran: il fait 320 pixels de large sur 200 de haut ... On peux donc dire qu'il y a 320 fois 200 = 64000 cases . Ok ?

Tiens au fait les mecs qui ont fait les ordis ont mis le repère orthonormé (ca veux dire que le repère est en angle droit) dans un sens biscornu : l'origine est en haut à gauche !!!!! Fou non ? (Ah lala ces mecs dans la silicon valley sont jamais allé à l'école ou quoi ???)

        (0,0)  +---------------------------------------+  (319,0)
               |                                       |
               |                                       |
               |                                       |
               |                                       |
               |                                       |
               |                                       |
               |                                       |
               |                                       |
               |                                       |
               |                                       |
      (0,199)  +---------------------------------------+  (319,199)

Oups Halte là Mogar !!!! He Oh pourquoi 319 au lieu de 320 comme tu nous a dis ? Pareil pour 199 avec 200 ?? Heiiin ? Repoooooonds ! Côze (là c'est d'langliche ;]) le 0 compte pour une case car elle peut être remplie de couleur ! Donc le 199 et le 319 sont bien à leur place aux quatres extrémités de votre plan-écran .

Satisfait de la réponse ? Oui ? On continue ? Ok ça roule...

Bon si on en revient à notre tableau ça serait bien de dire ...'Bon ordi tu mets de la couleur rouge dans la case de coordonnées (23,176) et qu'ça saute !' Ben y a un blème: les tableaux simples ne marchent pas comme çà ! (il y en a qui marchent comme ça mais sont pourris pour afficher des points et puis on ne peux pas s'en servir pour l'affichage dans le repère écran -toc-).Pourquoi ? Parceque on s'amuse pour l'instant avec des ARRAY 'en une ligne' ! Pffff mais nooon. ...

Allez hop tu nous donnes quoi comme truc de rechange ? Vous z'allez peut-etre pôâ âîmêr:

        On fait 320*y + x  ... (???) Vous voulez que je recommence ?
        On fait 320*y + x  .

Bon je vous ai habitué à vous expliquer le tout du tout de tout ce que l'on a fait ...Tout ? non pas tout parceque partout les toutous ...euh les tous .... Bon enfin pas tout partout ok mais c'est pas tout il reste des tous à écrire: tout tout tout tout ... Voila c'est tout fait .

Bon alors le x c'est l'axe des abscisses (l'axe horizontal) et le y l'axe des ordonnées (vertical) ...

Alors d'ou vient cette formule ?

Je sais pas trop comment vous l'expliquer alors je vais tenter de vous schématiser le concept de la mort ! Hé hé hé c'est trop simple donc compliqué à expliquer (Pff Rixed je t'envie les choses compliquées que tu expliques héhéhé c'est tellement plus simple ! ;])

Bon allons-y:

On prend un écran de 5 pixels de large et de 2 de haut Allez hop on dessine !

        +--------+----------+---------+--------+--------+     x
        |   1a   |    2a    |   3a    |   4a   |   5a   |
        +--------+----------+---------+--------+--------+     x
        |   1b   |    2b    |   3b    |   4b   |   4c   |
        +--------+----------+---------+--------+--------+     x
        y

Je sais c'est pas fameux mais ça ira pour expliquer le tout ! Na ... Donc revenons à ce que nous étudions: les tableaux ARRAY en 'ligne' celui qui est la haut -celui du tableau bébé- . Bon celui-ci peut donc être représenté de la manière suivante:

        +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
        | 1=1a| 2=2a| 3=3a| 4=4a| 5=5a| 6=1b| 7=2b| 8=3b| 9=4b|10=5b|
        +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+

Je sais pas si vous voyez ou je veux en venir ... Quelle relation pourrions nous trouver pour qu'avec une ordonnée et une abscisse on puisse retrouver le nombre du tableau en ligne dans le tableau en ...tableau ...héhé ...hein ? Bon je sens que ca vous emm ... de réflechir ... Je vous refile le truc (qui n'en est même pas un d'ailleurs) mais le comprendre est essentiel !!!

D'abord dans le premier tableau comment peut on arriver aux cases de la seconde ligne ? Ben en fait c'est simple on prend le tableau en ligne on compte 5 cases (le nombre de cases comptant la première ligne du tableau en 'tableau' le premier) et hop on est dans la seconde ligne du premier tableau !

Arriver à la case du premier tableau (x,y)= (5*y + x)ème case du second tableau.

C'est pas simple à expliquer mais réflechissez y et vous verrez la simplicité de ce machin ... c'est même pas des maths c'est du bon sens ! Je n'ai donc pas fait une explication simple à suivre ...Elle n'est la QUE pour vous mettre dans la voie pour comprendre le fonctionnement ... Hé oui vous avez un peu à réfléchir !

Bon on extrapole à votre écran chéri: il faut que vous vous déplaciez de 320 cases fois le nombre de cases vers le bas que vous voulez pour vous y retrouver ... Ajoutez y une pincée de décalage vers la droite c'est à dire plus x et HOP WOAAAA j'y suis le point qui à pour coordonnées (x,y) est en fait la représentation en array tableau de la case 320*y+x du tableau en ligne !!!

Pffff j'en ai pour mes doigts bousillés d'expliquer çà !

Bon il reste à expliquer le MEM[$A000: ...] parceque les ARRAY du type ligne je n'y reviens PLUS c'est trop pourri à expliquer !!

Ok c'est parti pour le MEM[machin: truc]... En fait sa vraie forme est MEM[$A000:320*y+x]:=couleur .

Ce machin étrange n'est ni plus ni moins que votre .... Ecran ... huhuhu si si votre écran avec les cases et tout et tout (promis je recommence pas avec les tout) même que c'est un array en ligne !

Aaaaah c'est donc que c'est pour ca que tu nous a dis ce que c'était que ces foutus machins hypers simples à capter ?? Ben vi ...

Sauf que la y a deux trucs qui ont changé: y a un $A000 sorti d'on ne sais où... et ce := couleur (mais là on suppose quand même ce que ca va être) ...

Levons le voile pudique qui a été lancé sur cet ancêtre le MEM !! (eh oui faudra vous en débarrasser quand vous vous mettrez à l'assembleur ;] mais pour l'instant il est tres utile). Le :=Couleur dis à Pascal (nan pas lui l'ôtre le langage ! Pfffffff ...) de mettre de la couleur -apellée ici pour l'occasion (tres spéciale je dois dire huhu) couleur - dans la case choisie avec la formule 320*y+x ...bon arrêtons de dire case pour dire pixel ca fait plus branché ! Et puis fô pôa oublier que dans quelques dizaines de lignes vous serez capable de faire des machins qui rendent super !

Reste plus que le $A000 ... Ca y en a être quoi ? C'est simple (mais de toute façon tout ce que j'explique ici est EXTREMENT simple n'oubliez quand meme poâ que ca y en a être une initiation !!) Ah oui je disais que c'était simple: $A000 c'est l'adresse de départ de votre écran .

Bip bip ???? Adresse écran ? Ah tiens on peux lui ecrire ?? Meuuuh non c'est pour dire que l'array en ligne commence là (là c'est à $A000) car sinon pshit tout ce qu'il y a sur l'écran est envolé verschwunden !

 

P'tite Conclusion à tout çà

Lorsque je demande à Pascal (le langage pas l'ôtre, z'abusez là !!) de faire MEM[$A000:320*y+x]:=63 ben il me met un point bleu au point sur l'écran d'ordonnée (x,y) .

C'est tout.

Allez hop hop hop un p'tit programme OK ?

                                                                     
      PROGRAM Point;      {C'est facultatif c'est seulement le     }   
                          {nom du programme}                           
                                                                       
      VAR  x,y:Integer    {Je déclare les variables x et y comme   }   
                          {des variables integer. En gros je dis   }   
                          {à pascal que x et y existent et que l'on}   
                          {peut mettre dedans des chiffres de-32768}   
                          {a +32768  voilà. Euh ces chiffres c'est }   
                          {pas au pif donc attendre le cours sur   }   
                          {l'ASSEMBLEUR}                               
                                                                       
      BEGIN               {le programme a proprement parler débute }   
                          {là et je le dis à Pascal}                   
                                                                       
      x:= 150;            {mettez les valeurs que vous voulez ethop}   
      y:= 150;            {un point !}                                 
                                                                       
      ASM                 {Bon ben on fait une excursion dans l'asm}   
                          {comme on a appris et on le dit, sinon   }   
                          {foirage total ! ;)}                         
                                                                       
        Mov Ah,0h                                                      
        Mov Al,13h        {on se met en mode graphique, le mode 13h}   
        INT 10h                                                        
                                                                       
      END;                                                             
                                                                       
      MEM[$A000:320*y+x]:=63; {on met un pixel de couleur bleue:=63}   
                              {au point de coordonnées (x,y)}          
                                                                       
      ASM                {Bon ben on refait une excursion dans l'asm}  
                         {comme on a appris et on le dit sinon ben  }  
                         {on revient poâ dans le mode texte chéri du}  
                         {dos et du prompt ;)}                         
        Mov Ah,0h                                                      
        Mov Al,3h        {on se met en mode texte, le mode 3h}         
        INT 10h                                                        
                                                                       
      END;                                                             
                                                                       
      END.               {Cette ligne c'est pour PASCAL: c'est ICI  }  
                         {que se termine le programme}                 

Ca y est !! On y est arrivé à mettre ce fameux point sur l'écran sans utiliser une formule toute trouvée ne sachant poâ d'ou elle vient et commençant à comprendre les modes vidéos ... Pas cool çà ?

Maintenant que vous savez tout çà ...LE MONDE EST A VOUS (sans jeux de maux) !

Le point a été fait ... Qu'en est il de la ligne droite ?? Ben oui il parait qu'elle est formée de plein de points non ? Si si ... Pour cela on utilise une méthode simplissime: regardez plutôt:

                                                                      
      Program lignehorizontale;                                        
      Var x:Integer;                                                   
          y:Integer;                                                   
      BEGIN                                                            
      y:=150;                     {mettez la valeur que vous voulez}   
                                                                       
      ASM                                                              
         Mov Ah,0h                {Mode 13h}                           
         mov Al,13h                                                    
         Int 10h                                                       
      END;                                                             
                                                                       
      For x:=0 to 319 do          {la commence la boucle}              
         BEGIN                                                         
          MEM[$A000:320*y+x]:=63;                                      
         END;                                                          
      ASM                                                              
         Mov Ah,0h                {mode 03h}                           
         mov Al,3h                                                     
         Int 10h                                                       
      END;                                                             
                                                                       
      END.                                                             

Bon la je sais pas si tout le monde suit ... Qui est largué ? Commençons par le commencement:

La déclaration des variable :

x est declarée comme étant Integer . Cela veut dire que x peut prendre des valeurs comprises entre -32768 a +32768 . Je ne peux pas prendre byte car les bytes sont des nombres de 0 a 255! Or notre boucle fait 320 fois son boulot: conclusion il ne peut y avoir une variable de type byte. Il n'en est pas de meme pour y car y peut prendre des valeurs de 0 à 199 donc y est une variable de type byte... Bon en fait ca sert pas à grand chose sauf à laisser de la mémoire .Mais il faut prendre de bonnes Zabitudes dès le départ nan ?

Le for x:=0 to 319 do :

Bon çà c'est une boucle.Une boucle est de la forme :

        "For quelquechose=truc to machin do
          Begin
            Faire un machin
            + un autre machin
            + un biere ..euh non deux !
            + etc ...
          End;"

Grâce au for quelquechose= etc la ligne faire un machin + un autre est refaite Machin-truc fois !

Mais voyons plutôt sur notre exemple:

On commence avec un x qui est égal a 0 ben oui for x:=0 to ...Il commence donc bien par 0 ? Ok ...

Si x=0 ca veut dire que notre pixel est à gauche de l'écran. Normal. Ok. Notre ligne a été exécutée donc on revient encore sur MEM[truc:chouette]:=63 mais avec un x qui maintenant est égal à 1 ! Et oui c'est notre for x:=0 to 319 qui à marché car lorsque les instructions qui se trouvent entre le begin et le end juste dessous le for etc eh bien le x est INCREMENTE c'est à dire qu'on lui rajoute un 1 ! Et on repart de plus belle.

Ben voila la ligne est faite car l'ordonnée (y) ne changeant pas et y allant de 0 a 319 nous obtenons une zolie ligne bleue (couleur 63)! Nous avons obtenu en fait 320 points qui ont tous pour ordonnée y (la valeur que vous avez mise) et pour qui seul l'abscisse change (x en l'occurence). J'arrête parceque là j'en fait peut-etre un peu trop non ?

Ok donc vous pouvez faire une ligne droite verticale !

C'est pas formidable ca ? Vous savez maintenant comment faire -mais vraiment, on ne vous l'aura pas donné tout cuit on vous l'aura expliqué (-bien- çà j'en sais rien) de fond en comble !- des points et des lignes droites ! Vous devriez être capable de TOUT RETROUVER PAR VOUS-MEME!

Eh mais c'est quand même pas donné à tout le monde ! Ne serait-ce que savoir comment ça fonctionne ! Mais attendez de voir quand vous vous amuserez à changer les couleurs ! Ca va être d'enfer ! Hé hé hé ....

 

5- Les COULEURS ! Yeah!

Yeaaaah on avance nan ? Pas cool ca ? Bon là encore on va y aller mollo car il va falloir que vous fassiez un petit Zeffort d'abstraction . Allez hop c'est parti !

        ASM
          Mov ah,10h
          Mov al,10h
          Mov bx,une-couleur
          Mov dh,un-chiffre
          Mov ch,un-autre-chiffre
          Mov cl,encore-un-autre-chiffre
          int 10h
        END;

Bon Ok ? Ca ressemble pas mal à la routine Asm pour se mettre en mode graphique et en mode texte nan ? Et d'après ce que vous savez des Interruptions et des fonctions vous pouvez déjà deviner ce que c'est: Le mov ah,10h ça veux dire que l'on veut la fonction 10h de l'interruption 10h (la dernière ligne). Aïe mais c'est quoi les autres lignes alors ??

Eh bien c'est pas bien compliqué le mov al,10h veut dire que l'on appelle la sous-fonction 10h de la fonction 10h de l'interruption 10H (y a aucun jeu de mots ici !!!C'est vrai !). Si je demande cette sous fonction 10h c'est que la fonction 10h elle même recouvre plusieurs sous fonctions donc il est nécessaire de dire laquelle nous voulons pour que l'ordinateur le sache (ben oui pourquoi il prendrait la 10h plutôt que la 12h ?Hein ?Si on lui dit poâ il peut quand même pas deviner !)

Si vous voulez savoir la fonction 10h de l'INT 10h a 20 sous-fonctions !! Mais comment je sais tout cà moi ??? Et bien c'est simple je l'ai lu dans les aides mémoires des interruptions Donc il n'y a rien à comprendre il faut seulement le savoir que la sous-fonction patati de la fonction patata de l'interruption Albert (ben oui albert ;) ...) fait ça et ça ...

Ok qu'est-ce qu'elle fait cette sous fonction là ? Hé hé hé là réponse va vous paraître barbare: cette sous fonction charge un registre de couleur DAC . Woaaaa j'ai tout pigé ! :(( Z'en faites pas ca veut dire en gros que l'on change la couleur d'une couleur (???) Si si vous allez comprendre tout de suite ...

Les couleurs que vous voyez sur vos écrans sont innombrables (en fait si elles sont 'nombrables' mais enfin la n'est poâ du tout le question) mais elle ne sont faites qu'à partir de 3 couleurs : Le Rouge , le Vert et le Bleu ca fait RVB ... Ca vous dit pas quelque chose ?

Tant pis ...Mais souvenez de RVB quand vous serez balèze en programmation et que vous vous documenterez dans des bouquins ou dans des fichiers qui ne seront pas là pour vous initier vous vous en rapellerez .

Grouin grouin mais on n'en est pas encore là du tout ! Allez hop les pieds sur terre ! L'aventure n'est pas du tout finie !

je disais donc -avant de m'être interrompu- que les couleurs etait en fait faites (héhé) avec d'autres couleurs le Rouge le vert et le bleu mais avec des intensités différentes .

L'intensité la moins forte est la 0 et celle qui est la plus forte est le 63 ...

On reflechi dans sa tête et HOP idée de génie on comprend comment la couleur noire est affichée ...

Hé hé on met tout simplement l'intensité 0 aux trois couleurs . C'est tout ... Et pour le blanc on fout les couleurs au max ... Hé hé hé c'est chouettos nan?

Et la on en revient à

        Mov bx,une-couleur
        Mov dh,un-chiffre
        Mov ch,un-autre-chiffre
        Mov cl,encore-un-autre-chiffre

et oui ces lignes sont tout simplement destinées à mettre les intensités que vous avez choisies pour les couleurs R,V et B pour faire changer une couleur donnée !

Ainsi Mov Bx,Une-Couleur est fait pour dire à l'ordinateur quelle couleur vous voulez changer.

Mov Dh,Truc est fait pour mettre l'intensité de la couleur Rouge
Mov Ch,Truc2 est fait pour mettre l'intensité de la couleur Verte
Mov Cl,Truc3 est fait pour mettre l'intensité de la couleur Bleue

Je sais pas si vous réalisez tout ce que l'on peux faire avec ce machin !!!!! C'est absolument faramineux comme truc !!!! Un pitit exemple ? Ok ? Bon vous avez déjà maté des démos ... Oui ? Oui .Vous avez souvent des espèces de Flashs ? Ca a un effet super hein ?Eh bien maintenant vous êtes capable d'en faire !!! Si si.. Je vous montre ?

                                                                    
      PROGRAM Flash-Woaa-merci-Reporter!;                             
                                                                      
      VAR I:Byte;       {<- BYTE !!! Trés Important !! je me gourre}  
                        {souvent là}                                  
          x,y:Integer;                                                
                                                                      
      BEGIN                                                           
                                                                      
      ASM                                                             
        Mov Ah,0h                                                     
        Mov al,13h                                                    
        INT 10h                                                       
      END;                                                            
                                                                      
      For x:=0 to 319 do                                              
        For y:=0 to 199 do                                            
          Begin                                                       
          MEM[$A000:320*y+x]:=0; {on rempli l'écran de la couleur 0}  
          End;                   {couleur 0 =Noir}                    
                                                                      
                                                                      
      For i:=0 to 63 do                                               
        Begin                                                         
        ASM                                                           
            Mov ah,10h                                                
            Mov al,10h                                                
            Mov bx,0                       {Je vais changer le noir} }
            Mov dh,i                                                  
            Mov ch,i                                                  
            Mov cl,i                                                  
            Int 10h                                                   
        END;                                                          
        END;                                                          
                                                                      
      For i:=63 downto 0 do                                           
        Begin                                                         
        ASM                                                           
            Mov ah,10h                                                
            Mov al,10h                                                
            Mov bx,0               {Je vais encore changer le noir}   
            Mov dh,i                                                  
            Mov ch,i                                                  
            Mov cl,i                                                  
            Int 10h                                                   
        END;                                                          
        END;                                                          
                                                                      
      ASM                                                             
        Mov Ah,0h                                                     
        Mov Al,03h                                                    
        Int 10h                                                       
      END;                                                            
                                                                      
      END.                                                            

Vous avez compris ce que j'ai fait ? Normalement vous devriez ... M'enfin pour ceux qui n'ont pas compris j'explique:

J'ai commencé par me mettre en mode graphique (bon ca vous avez capté je suppose) puis j'ai rempli l'ecran de noir -la couleur 0- car j'ai fait en fait 319 lignes vericales de gauche à droite donc j'ai bien rempli l'écran de noir . Et ensuite j'ai écrit la routine pour changer la composition de la couleur 0 ... Et pour cela j'y ai mis un For i: etc etc ... Qu'ai je donc fait là ??

C'est tout simple: j'ai demandé à l'ordinateur de mettre le noir a 0,0,0 (R=0,V=0,B=0) puis a 1,1,1 ensuite a 2,2,2 : j'ai donc un effet de flash 'montant'.

Enfin j'ai fait la même chose mais avec un For i:=63 downto 0 ! Ben c'est pareil que pour en haut sauf que je pars du blanc pour arriver au noir ... On obtient donc un flash qui 'croit' et qui 'décroit' !

Et c'est super rapide hein ?? Ca y en a être pas coool ??(Mais dès que vous saurez faire de l'ASM pur et dur vous aurez d'autres methodes plus meilleures bonnes ...huhuhu)

Bien entendu j'ai remis le mode texte à la fin ...

Grouin grouin ... Vous en dites quoi de ce programme ? Il est bien non ?

Bon on va repartir dans le monde des interruptions et des fonctions et des sous fonctions !! Allez Hop hop hop !!

Bon on sait comment changer la couleur d'une couleur (pouark elle est pourrie comme phrase ! ;]) mais comment sait-on quelles sont les valeurs de la RVB pour une couleur donnée ?? On demande à Mogar et Hop El problemo is finished ! ;)

Ok Regardez çà:

                                                                          
     Program  Quel-RVB-pour-Quelle-Couleur;                                 
                                                                            
     Var Rouge,vert,bleu:Byte;                                              
                                                                            
     ASM                                                                    
       Mov Ah,10h                                                           
       Mov al,15h                                                           
       Mov BX,Numero-de-la-couleur;                                         
       INT 10h                                                              
       Mov Rouge,Dh                                                         
       Mov Vert,Ch                                                          
       Mov Bleu,Cl                                                          
     END;                                                                   
                                                                            
     Writeln('couleur ',a,', intensites respectives des couleurs sont:');   
     Writeln('Rouge: ',rouge);                                              
     Writeln('Vert:  ',vert);                                               
     Writeln('Bleu:  ',Bleu);                                               
                                                                            
     END.                                                                   

??? Bip bip ??? Mais c'est quoi ca ??? Tu nous avais pourtant dit de mettre d'abord les mov et ensuite les INTs nan ? Bon Ok je vous ai menti huhu ;) Mais maintenant je vais vous expliquer pourquoi ...Oh et puis non j'ai la flemme ... Ah ah ah meuuh non je vais pas vous laisser dans une telle situation ...Héhé Quoi que ... ;))

Bon en fait tout est normal dans cette routine, elle marche . Mais déja attachons nous a ce VAR rouge,vert,bleu:Byte ...

Ils sont ici parceque -hé mais c'est la première fois pour vous!- on va recevoir des données !

Et on va les placer dans Rouge, Vert et Bleu ... Et bien sûr ces données sont des chiffres entre 0 et 63 donc ce sont des BYTES !

Alors ici j'ai appelé la sous fonction 15h de la fonction 10h de l'interruption 10h... Et comme paramètre d'entrée j'ai mis la couleur que nous voulons étudier ...C'est le rôle du Mov BX,Numero-De-La-Couleur.

Ca fait qu'on a bien :

        Mov Ah,10h
        Mov al,15h
        Mov BX,Numero-de-la-couleur;
        INT 10h

Le Int est bien a la fin !

Bon et le reste ? Oui oui ca arrive ! Apres avoir demander à l'ordi la sous fonction patati et patate (nan patata pardon) pour la couleur machin, il cherche les intensités des couleurs RVB de la couleur qu'on lui a demandé ... Et ces intensités il les met dans Dh pour le rouge, Ch pour le vert et Cl pour le bleu...

Avec nos

	
	Mov Rouge,Dh
        Mov Vert,Ch
        Mov Bleu,Cl

On les récupère ! c'est tout ! Quoi demander de plus ? C'est pas cool ca ?

Et la encore cette routine amène de nombreuses applications !!! Allez demandez vous ce que l'on peux en faire ... C'est pas super compliqué ...

Grâce à çà on peut sauvegarder des palettes et se servir au cours d'un programme de divers palettes !! Donc en fait on est plus (dans une certaine limite quand même) limité par les couleurs !

Je vous montre comment on fait pour sauvegarder la pallette courante ?

PROGRAM Sauve-Pallette VAR Rouge,vert,bleu:Byte; a:Integer; palette:= ARRAY[0.255,1..3] of byte {On peut ecrire la meme} | {chose sous des formes } {differentes} BEGIN For a:=1 to 255 do Begin ASM Mov Ah,10h Mov al,15h Mov BX,a INT 10h Mov Rouge,Dh Mov Vert,Ch Mov Bleu,Cl END; Palette[A][1]:=Rouge; Palette[A][2]:=Vert; Palette[A][3]:=Bleu; End; END.

Et hop voila que votre palette est sauvegardée dans la variable de type tableau en 'tableau' . Mais est-ce que vous comprenez tout ? Là je me le demande car nous avons devant vos yeux Zébahis une nouvelle forme de tableau ARRAY: les tableaux (les vrais de vrai cette fois ci huhuhu ;])

Allez une petite représentation du tableau Palette que j'ai créé:

        +------+---------+----------+---------+
        |      |    1    |     2    |     3   |
        +------+---------+----------+---------+
        |   1  |         |          |         |
        |   2  |         |          |         |
        |   3  |         |          |         |
        |   4  |         |          |         |
        |   5  |         |          |         |
        |   6  |         |          |         |
        |   7  |         |          |         |
        |   8  |         |          |         |
        |   9  |         |          |         |
        ...

Ainsi de suite jusqu'a 255 ! Vous pigez ? Les 1,2 ,3 ... en lignes pour le numéro de la couleur a sauvegarder et les colonnes pour sauvegarder les brillances des couleurs RVB ... C'est-y pas simple ? Si vous avez pas compris c'est que la simplicité de ce machin vous a simplement echappée ... Z'en faite poâ ca va passer .

Donc le palette[A][1]:=rouge demande à l'ordi de mettre la brillance dans la première colonne ([1]) de la couleur de numéro a ([a]) ... C'est tout ! Je sais pas si il faut que j'aille plus loin car je vois pas de difficultée ! (donc pour ceux qui n'ont pas encore pigé ...Desolé ... @;])

Ok mais comment restaurer notre Fantaaaaaaaaaaaaaaaaaaaaaastique pallette ?
A question idiote réponse sensée (Ah tient c'est pas le dicton ? ah ? Bon ...)

Regardez plutôt mais je suis sur que vous en auriez fait autant (Au fait je rapelle que les programmes que je vous montre et démontre ne sont que des exemples pour vous permettre de vous faire comprendre l'optimisation ca c'est pour vous ...Hé hé hé mais je peux déja vous dire qu'il y a des machins pour faire aller beaucoup plus vite l'ordi ...)

Voila, avec cette bafouille vous pouvez faire un MAX de trucs assez sympa ... Je vous laisse en vous disant que l'on apprend à programmer en tapant du code, et pis même que c'est vrai, Na !

 

Me Contacter

        Vous pouvez me contacter sur

        * ABYSS BBS au 46-26-95-39
        (du 2400 au 14400 bauds)
        (5 CD On-Lines,1.5 Go de Disque Dur, plus de 120 confs)
        les mails sont adressés à Florent Ramiere...

        *  sur MONGOLO au 46-77-09-62 ... BAL Mogar

        *  sur    36-14 TEASER ...BAL Mogar

        *  par E-mail    ramier_f@epita.fr

        Vous  pouvez aussi me contacter par courrier pour m'envoyer
        vos   oeuvres  (çà  me  ferait  vraiment  plaisir  de  voir
        comment  vous  vous  êtes  depatouillé de mes explications)

        Florent Ramiere
        1 Avenue de Paris
        78000 Versailles

 

Bon allez hop je vous laisse ! Bye !