<-Précédent Retour à l'accueil Contact : etienne"point"sauvage"at"gmail.com Suivant->
  1. De la limite
  2. Au-delà des limites
  3. D'autres ruses
  4. Du code

    Assembleur : au delà de 0x13

    Dessiner, c'est bien. Après tout, on commence à dessiner avant d'écrire, nous autres mortels. Continuons donc le dessin. Nous savons dessiner des droites en mode VGA, c'est à dire en 320 par 200. Mais les ordinateurs peuvent faire beaucoup mieux en résolution : du 1280 par 1024 ne devrait pas faire peur à un PC du XXIème siècle. Essayons.

  1. De la limite
  2. Notre processeur est utilisé en 16 bits. Sans subtilité, nous pouvons manipuler des nombres qui vont gaillardement jusque 65535. Mais pas plus. Pareil pour les adresses. On peut adresser 65536 octets en mémoire. Or, un octet étant une couleur (en mode 256 couleurs), on peut donc écrire 65536 points à l'écran en une seule passe. Quand on se rend compte que 320 par 200, ça fait 64000, on se dit qu'un bête 800 par 600 va nécessiter de la ruse.

  3. Au-delà des limites
  4. M. VESA, que nous avons déjà rencontré au chapitre précédent, y a pensé. Et il s'est dit, comme ça, que nous écrirons l'écran toujours aux mêmes adresses, donc, pas plus de 65536 octets d'un coup. L'idée est donc de couper l'écran en morceaux de 64 ko, et de demander à la carte graphique de changer de morceau. Comme ça, nous, on ne fait des choses que sur un seul morceau de 64 ko, et on dit à la carte graphique : ça c'est le morceau 0, ça c'est le morceau 6, etc. Pour changer de morceau, on appelle l'interruption 0x10 (le gestionnaire d'affichage), la fonction 0x4F (VESA), sous-fonction 0x05, avec BH à zéro et le numéro du morceau dans DX.

    Au fait, pourquoi le numéro du morceau dans DX ?

    Tiens, oui, pourquoi ?

    Vous allez voir, c'est bien fait.

    Si si, c'est intelligent.

    Pourquoi dans DX ?

    Aucune idée ?

    Comment on calcule le numéro du morceau ?

    Vi. Tout à fait. On utilise la formule : Y * largeur de la ligne + X, avec (X, Y) coordonnées du point à afficher. Or Y * largeur de la ligne va donner un résultat supérieur à 65536. Et l'opération de multiplication dans le processeur va mettre dans DX, quand ça dépasse 65535, le nombre de fois qu'il y a 65536 dans notre résultat. Et ce nombre de fois qu'il y a 65536, c'est précisément notre numéro de morceau ! Il n'y a donc qu'à appeler la sous-fonction 0x05 avec le résultat de la multiplication, et le tour est joué. Elle est pas belle, la vie ?

    Bon.

    En fait, c'est pas vrai.

    On peut changer de morceau d'écran en cours de ligne. Sinon, ce n'est pas drôle. Si on a une retenue à l'ajout de l'abscisse, c'est qu'on change de morceau en cours de route. ADC (ADd with Carry) sur DX nous mettra alors sur le bon morceau d'écran.

  5. D'autres ruses
  6. Pour demander une nouvelle résolution, on passe son numéro. Il y a pourtant une petite subtilité : si on demande le mode brutalement, VESA va mettre le contenu de l'écran à 0. Si on n'en a pas besoin, il faut ajouter 0x8000 au numéro du mode : VESA ne fera pas de nettoyage.

    D'autre part, on change rarement de morceau d'écran. En stockant dans une variable le numéro du morceau courant, on pourra ne demander le changement que lorsque le morceau d'écran du point à afficher est différent de celui stocké précédemment.

    Plus drôle encore : il arrive que la longueur de la ligne soit, en mémoire, plus grande que celle affichée. C'est notamment le cas lorsque le nombre de points à l'écran est différent de multiples de 65536. En gros, ça veut dire qu'il y a des points non affichés. Ces points non affichés sont situés en bout de ligne. Pour faire nos calculs, nous n'allons pas utiliser le nombre de points par ligne affichés, mais le nombre d'octets par ligne.

  7. Du code
  8. Le code de ce chapitre se trouve ici :

    VESA.asm

    Il y a des morceaux de code commentés, et des bidules que nous verrons plus tard.