<-Précédent Retour à l'accueil Contact : etienne"point"sauvage"at"gmail.com Suivant->
  1. Du foutoir
  2. De l'affichage de texte
    1. affiche_chaine
    2. nombre_vers_chaine
  3. Des modes graphiques
    1. Saut au début, optionnel
    2. P'tit message pour ne pas perdre la main
    3. Demande d'informations sur le VESA BIOS EXTENSION
    4. Traitement de ces informations
    5. Choix du mode graphique
    6. Passage dans le mode choisi
    7. Affichage de points
    8. Affichage de droites
    9. Affichage d'un alphabet
  4. Du code

    Assembleur : reconstruction

    Depuis la création du secteur d'amorçage au chapitre précédent, je ne veux pas dire qu'on n'a plus rien, mais peu s'en faut. Les routines sont un peu bringuebalantes, tout ça. Cela nécessite une petite remise à niveau.

  1. Du foutoir
  2. Il faut avouer ce qui est : il devient rude de retrouver quoi que ce soit dans le code. NASM permet de s'y retrouver un peu mieux en séparant le code en plusieurs fichiers. La directive %include "[nom du fichier]" permet d'insérer à cet endroit le contenu du fichier spécifié.

  3. De l'affichage de texte
  4. Les routines d'affichage de texte ont été déportées dans un fichier "affichageTexte.asm". Il y a deux fonctions : une fonction qui affiche une chaîne de caractères à l'écran "affiche_chaine", et une fonction qui transforme un nombre en chaîne de caractères "nombre_vers_chaine". Il faut garder à l'esprit que ces fonctions ont vocation à disparaître, puisqu'elles fonctionnent en mode texte, qui disparaît rapidement. Elles sont reprises du chapitre 3, clarifiées, déboguées et ainsi de suite.

    1. affiche_chaine
    2. Cette fonction affiche la chaîne de caractères pointée par si et se terminant par le caractère 0, aussi appelé caractère nul, de valeur numérique 0. Elle suppose que l'écran mesure 80 caractères de large sur 25 de haut. En cas de débordement, elle efface la page et continue son écriture en haut. Elle ne connaît que deux caractères non affichables : le 0 et le 13, respectivement marqueur de fin de chaîne et retour à la ligne.

      ;Affiche à l'écran une chaîne de caractères
      affiche_chaine:
      push ax
      push bx
      push cx
      push dx
      xor bh, bh; RAZ de bh, qui stocke la page d'affichage
      mov ah, 0x03
      int 0x10; appel de l'interruption BIOS qui donne la position du curseur, stockée dans dx
      mov cx, 1; nombre de fois où l'on va afficher un caractère
      affiche_suivant:
      lodsb
      or al, al;on compare al à zéro pour s'arrêter
      jz fin_affiche_suivant
      cmp al, 13
      je nouvelle_ligne
      mov ah, 0x0A;on affiche le caractère courant cx fois
      int 0x10
      inc dl; on passe à la colonne suivante pour la position du curseur
      cmp dl, 80
      jne positionne_curseur
      nouvelle_ligne:
      inc dh; on passe à la ligne suivante
      xor dl, dl; colonne 0
      cmp dh, 25
      jb positionne_curseur
      xor dh, dh
      mov ah, 0x02;on positionne le curseur
      int 0x10
      mov cx, 25*80
      mov ah, 0x0A;on affiche le caractère courant cx fois
      mov al, ' '
      int 0x10
      mov cx, 1
      positionne_curseur:
      mov ah, 0x02;on positionne le curseur
      int 0x10
      jmp affiche_suivant
      fin_affiche_suivant:
      pop dx
      pop cx
      pop bx
      pop ax
      ret

    3. nombre_vers_chaine
    4. Cette fonction écrit dans la chaîne pointée par di le nombre contenu dans ax.

      ;écrit dans la chaîne pointée par DI le nombre contenu dans AX
      ;si CL est à un, on écrit un caractère terminal
      ;CH contient le nombre minimal de caractères à utiliser
      ;BL contient la base
      nombre_vers_chaine:
      push bx
      push dx
      push cx
      xor bh, bh
      mov cl, 1
      stocke_digit:
      xor dx, dx
      div bx
      push dx ;sauve le reste dans la pile
      inc cl
      or ax, ax
      jne stocke_digit
      ;Les digits sont stockés dans la pile
      inc bh ;
      ajout_zero:
      cmp ch, cl
      jb clearCH
      push ' '-'A'+10
      inc cl
      jmp ajout_zero
      clearCH:
      xor ch, ch
      ;Affichage du chiffre
      boucle_digit:
      dec bh
      loop affiche_digit
      pop cx ; on récupère le paramètre bx
      test cl, 0b1 ; s'il est à 1, on écrit un caractère terminal
      jz depile
      mov byte [di], 0
      depile:
      pop dx
      pop bx
      ret

      affiche_digit:
      pop ax
      cmp ax, 10
      jae dixPlus
      add ax, '0'
      stosb ; met AL dans l'octet pointé par DI et incrémente DI
      jmp boucle_digit
      dixPlus:
      add ax, 'A' - 10
      stosb
      jmp boucle_digit
      ;fin nombre_vers_chaine

  5. Des modes graphiques
  6. Pour faire une sorte de séance de révision, nous allons retravailler les graphiques du chapitre 5. Reprenons tout le déroulement du programme :

    1. Saut au début, optionnel
    2. P'tit message pour ne pas perdre la main
    3. Demande d'informations sur le VESA BIOS EXTENSION
    4. Traitement de ces informations
    5. Choix du mode graphique
    6. Passage dans le mode choisi
    7. Affichage de points
    8. Affichage de droites
    9. Affichage d'un alphabet

  7. Du code