Je me demandais ce que j'allais faire pour ce cours ASM, et comme
je suis loin d'ˆtre une brute de l'assembleur pur (la derniŠre
fois que j'ai fait un prog cent pour cent en ASM, c'etait de l'ASM
Z80!) je me suis dis qu'une initiation avec un exemple a l'appui
irait tres bien. Et comme c'est plus interressant de voir ce que
l'on fait, j'ai opt‚ pour un 'fire on the screen', classique mais
toujours chouette ! Je vais donc vous expliquer un peu comment ca
marche ...  Le source devrait ˆtre disponible quelques part ...ý



I] La m‚moire en mode r‚elý
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄý

La m‚moire en mode r‚el se d‚coupe en segments de 64Ko, les dix
premiers sont r‚serv‚s … la RAM de la m‚moire centrale dont la
taille est donc limit‚e a 640Ko. A la suite de la RAM se trouve
un segment de m‚moire A (10 en hexa) qui appartient … la carte
graphique et qui m‚morise le contenu de l'‚cran. Les segments
suivants sont r‚serv‚s soit pour une carte monochrome, soit pour
le BIOS. Chaque segment est lui-mˆme adress‚ par un offset.ý
En r‚sum‚, nous avons 16bits pour le segment puis 16 bits pour
l'offset, soit 32 bits qui nous permettent d'adresser 1Mo!!!ý
Zarb'ca! 1Mo=2^20 octets!!! Mais ou sont pass‚s les 12 autres !!!

Because avant le 8080, le registres d'adresse avait 16 bits (donc
65536 unit‚s soit 64Ko. A l'‚poque ils voulait pouvoir g‚rer
16 fois plus de RAM, ils leur fallait un registre d'adresse de
20bits... mais voila, … l'‚poque c'‚tait pas vraiment ‚vident ...ý
Alors, ils ont fait comme d'hab', ils ont trouv‚ l'astuce qui tue!
Le 8088 ne dispose plus d'un registre d'adresse sp‚cialis‚.ý
A chaque accŠs en m‚moire, il compose l'adresse 20 bits en
combinant deux nombres 16bits.ý

Mais comment ils font ca les bougres !!!!!ý

En fait, c'est pas trŠs compliqu‚, le segment est d‚cal‚ de 4 bits
sur la gauche, puis l'offset lui est additionn‚: ce qui nous fait
bien 20 bits en tout (16+4). Donc si on ajoute 1 au segment, cela
revient … ajouter 16 … l'offset (avec le d‚calage de 4: 1*2^4).ý

Donc pour adresser la m‚moire il faut un Segment et un offset. Et
comme nous l'avons vu plus haut la video se situe en 0A000h.ý



II] Enclenchons d‚j… un mode graphique sympa: le mode 13hý
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄý

Tout d'abord nous allons enclencher le mode 13h (320x200x256) car
sa gestion est des plus simple, pour cela il suffit d'appeler la
fonction 0 ( dans AH ) de l'interruption 10h avec le numero du
mode dans AL:ý

   ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ý
        Mov AX,0013hý
        INT 10hý
   ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙý

Oulala, komment il a fait ‡a ??? Bon, c'est vrai que ces
registres peuvent paraŒtre un peu chiant au premier abord mais
en faŒt, c'est des plus simple. Les registres de donn‚es sont
batis de la fa‡on suivante: Deux registres 8 bits forment un
registre 16 bits, et 16 bits + 16 bits = 32 bits ...ý
Enfin presque ... prenons un exemple, ‡a sera plus simple ...
Bon, AH et AL se rassemble en AX, ainsi si AH=12h et AL=34h et
bien AX=1234h ... jusque la tout va bien ...ý
Mais, les registres 32 bits ne se d‚coupe pas en deux registres
16 bits mais en UN registre 16 bits ... Zarb'Ca!ý

                |            EAX            |ý
                |      ??     |      AX     |ý
                |  ??  |  ??  |  AH  |  AL  |ý

Vous pouvez bien entendu vous servir de la partie haute de EAX,
mais indirectement avec les d‚calages par exemples (SHL et SHR)
Ainsi, pour mettre 1234h dans la partie haute de EAX:ý


    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ý
            OR  EAX,12340000hý
      ou    MOV AX,1234hý
            SHL EAX,16ý
    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙý



III] Mais comment s'est-y-que ca marche ?ý
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄý

Bon, alors c'est bien beau d'enclencher un mode graphique mais
encore faut il savoir le g‚rer. Mais vous allez voir comme c'est
simple: c'est un mode lin‚aire c'est … dire que de l'adresse 0 a
319 se trouve les 320 pixels de la premiŠre ligne, de 320 … 639
les 320 pixels de la deuxiŠme ligne, etc...ý
Donc pour poser un point aux coordonn‚es (x,y), il suffit de le
poser … l'offset:ý
  offset=x+y*320 dans le segment vid‚o:    [0A000h:x+y*320]ý

  ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ý
    MOV AX,0A000h                ; On charge le Segment Videoý
    MOV ES,AX                    ; dans le Registre ESý
  ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙý

Donc pour adresser, il suffit de charger le segment vid‚o dans un
registre de Segment(ES par ex). Mais on ne peut pas le faire
directement, il faut charger le segment dans un registre de
donn‚es puis copier ce registre dans le registre de segment.
Il faut ensuite calculer l'offset, le charger dans un registre de
donn‚es (DI par ex) et poser un octet ayant pour valeur le num‚ro
du stylo du pixel que l'on veut afficher.ý



IV] DŒtes, on peut avoir des couleurs ?ý
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄý

Nous verrons le d‚tail du feu plus loin, passons maintenant au
changement de couleur. Pour que le feu rende bien, il faut que
les couleurs soient bien rang‚es en d‚grad‚. Le changement de
couleur des stylos est trŠs simple, il faut envoyer sur le port
3C8h (grƒce … l'instruction OUT) le num‚ro du stylo dont on veut
changer la couleur, puis d'envoyer sur le port 3C9h ( OUT ) les
composantes Rouge, Vert, Bleu de la couleur. Petit d‚tail, les
composantes varient de 0 … 63, nous disposons donc de
64*64*64=262144 couleurs diff‚rentes avec une simple carte VGA.
De plus, il n'est pas n‚cessaire de r‚enclencher le num‚ro du
stylo suivant, en envoyant trois nouvelles composantes R,V,B,
le controleur comprend qu'il s'agit des composantes de la couleur
du stylo suivant.ý

  ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ý
    Mov DX,3C8h        ; adresse du controleurý
    Mov AL,255         ; on va changer la col du stylo No255ý
    Out DX,AL          ; on selectionne le styloý
    Inc DX             ; DX = 3C9hý
    Mov AL,45          ; Composante Rouge = 45ý
    Out DX,AL          ; on envoie au controleurý
    Mov AL,18          ; Composante Vert = 18ý
    Out DX,AL          ; on envoie au controleurý
    Mov AL,22          ; Composante Bleu = 22ý
    Out DX,AL          ; on envoie au controleurý
 ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙý



V] La Synchronisation Vertival, bon sang mais c'est bien sur!ý
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄý

Pour que le feu (ca vient ...) soit fluide, nous allons nous
synchroniser sur le canon … ‚lectrons: Si on met … jour le feu …
l'‚cran alors que le canon … ‚lectrons est en train d'afficher
l'image d'avant, on va rencontrer la synchro, c'est … dire que
nous verrons le d‚but de l'image d'avant et la fin de la nouvelle
image introduisant ainsi une fracture (social?) entre le haut et
le bas de l'‚cran. Pour ‚viter cela, nous allons d'abord attendre
la fin de l'affichage puis le d‚but de l'affichage pour ˆtre
certain que l'image pr‚c‚dente a ‚t‚ totalement affich‚e et
seulement alors nous afficherons la nouvelle image. Tout ce passe
sur le port 3DAh du CRTC. (lecture garce a l'intruction IN)ý

 ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ý
      Mov DX,3DAh           ; On charge le numero du portý
   VSync1:                  ; du CRTCý
      In AL,DX              ; On lit sa valeurý
      Test AL,8             ; Le bit No4 y est-il ?ý
      Jnz VSync1            ; Oui! On recommence ! ý
   VSync2:                  ; Non! On continue...ý
      In AL,DX              ; On lit sa valeurý
      Test AL,8             ; Le bit No4 y est-il ?ý
      Jz Vsync2             ; Non! On recommence! ý
 ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙý

Donc pour notre feu (NTous: enfin!!!), nous allons travailler dans
un buffer et n'acceder … cette derniŠre que pour poser le pixel.
En effet, la m‚moire vid‚o n'est pas des plus rapides et comme
nous allons faire huit accŠs en lecture, cela risqurait de p‚daler
mˆme sur une grosse b‚cane.ý



VI] Description de l'effet le plus compliqu‚ de la DemoscŠne !!!ý
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄý

En fait, nous allons r‚aliser un smooth, c'est … dire une moyenne
des points mais au lieu de reposer la moyenne au centre, nous
allons la reposer juste au dessus:ý
                                                       
2 0 2                                                2 2 2ý
3 1 3    ( 2+2 + 3+1+3 + 2+3+2 ) /8 = 2,25  => 2     3 1 3ý
2 3 2                                                2 3 2ý

Et ainsi de suite pour chaque point, or comme la palette est
intelligemment rang‚e, les couleurs sont de plus en plus sombres
plus leur num‚ro diminue, cela donne un effet de d‚grad‚ vers le
noir en montant. Vous allez me dire 'Et c'est tout ?' ... et bien
nan! il faut encore g‚n‚rer le feu proprement dit! Pour cela, il
faut des points de niveau de couleur diff‚rent pos‚s de facons
al‚atoire a l'‚cran et ainsi entretenir le feu. Et la, je dois
dire que pour g‚n‚rer des nombres al‚atoires (hum hum) qui rendent
bien … l'‚cran assez  rapidement n'a pas ‚t‚ une mince affaire,
mais heureusement j'ai eu beucoup de chance. Je suis en faŒt parti
d'une procedure diffus‚e par Jare/Iguana mais ca rendait trŠs mal
sur mon foutu feu! Alors, comme Mr Chance passait par l… ...ý

ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
     Xor CL,CL                 ; CL=0 => 256 it‚rationsý
  merdes:                      ; On va aff des cacas (cach‚es)ý
     Mov DI,Rand               ; Je recup' la derniŠre valeurý
     Add DI,1000100010001000b  ; La val que j'ADD n'est QUE belleý
     Ror DI,3                  ; en binaire, puis je ROTE tout caý
     Mov AX,DI                 ; on sauvegarde la valeur dans AXý
     And DI,511                ; et on ramŠne ca … une valeurý
     Sub DI,512-320            ; comprise entre 0 et 1280 (320*4)ý
     Shl DI,2ý

     Add AX,1100000011000000b  ; Celle la aussi elle est jolie...ý
     RoR AX,3                  ; c'est pas jolie tout ca ???ý
     Mov Rand,AX               ; on sauve la derniŠre valeurý
     or  al,00000111b          ; al toujours > 15ý
     mov ah,al                 ; on va poser 2 fois la meme colý
     Mov [64000+BX+DI],ax      ; c'est fait (… ES:[BX+64000+DI])ý
     Dec CL                    ; BX=buf, 64000=> hors de l'‚craný
     Jnz merdes                ; DI=adresse al‚atoires (hum???)ý
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

Une fois qu'on a attendu le d‚but de la synchro, que les couleurs
tir‚es al‚atoirement sont pos‚es al‚atoirement … l'‚cran, on peut
alors faire notre 'smooth montant' et tout recommencer ....ý
Et voila !ý


                                                Arrak­Sý
                                          Ki en a un peu marreý
                                           de la mise en page!ý
