256 couleurs VGA programmation en C - Double Buffering Page Flipping, mode Unchained

  • de garder l'utilisateur de voir les objets en cours d'élaboration sur l'écran
  • pour éliminer vacillante.

Double Buffering est un concept assez simple à saisir. Au lieu de tirer directement dans la mémoire vidéo, le programme trace tout en double tampon (Figure 20a). Une fois terminé, le programme copie double tampon de mémoire vidéo en une seule fois (Figure 20B). A ce stade, le programme efface la mémoire tampon double (si nécessaire) et le processus recommence.

Figure 20. Concept de mise en mémoire tampon double.

La mise en œuvre d'un double tampon est assez simple aussi bien. Le double tampon est généralement la même taille que l'écran. En mode 0x13, le double tampon serait 64,000 octets. Lorsque le programme commence alloue de la mémoire pour le double tampon.

Ensuite, au lieu d'écrire à la mémoire vidéo, le programme écrit dans le tampon double.

Une fois terminé, le programme copie le double tampon à la mémoire vidéo (avec un examen attentif du balayage vertical pour éliminer vacillement).

L'utilisation d'un tampon double serait plus rapide si, au lieu d'avoir à copier les informations de la double tampon à la mémoire vidéo (adresse 0xA000: 0000), la carte vidéo peut être programmé pour obtenir des données vidéo directement à partir de la double tampon plutôt que de son régulière adresse (0xA000: 0000). Bien que ce n'est pas possible sur le VGA, il est proche de la façon dont fonctionne page flipping.

Avec page flipping, il doit y avoir suffisamment de mémoire vidéo pour deux écrans. Donc, si la taille de l'écran est 320x200 en 256 couleurs, 2 * 320 * 200 ou 128.000 octets de mémoire vidéo doivent être disponibles. Au lieu de dessiner à la zone visible dans la mémoire vidéo ou d'une page visible. le programme trace de la page non visible (Figure 21a). Une fois terminé, le programme permute le pointeur de la page visible avec le pointeur de la page non visible (Figure 21b). Maintenant, le programme efface la page non visible nouvellement placé (si nécessaire) et le processus recommence.

Figure 21. Page concept de retournement.

Un problème est le suivant: en mode 0x13, seulement 64 Ko de mémoire vidéo est disponible, même si la carte vidéo a plus de mémoire sur elle. Même si elle est une carte vidéo 4Mo, le mode 0x13 ne peut 64K d'accès. Il existe un moyen, cependant, en mode tweak 0x13 en mode 256 couleurs qui a un total de 256 Ko de mémoire vidéo, de sorte que page flipping est possible. Ce mode sans papier est parfois appelé « mode-x » ou « mode non chaîné. »

La carte VGA a 256K de mémoire. De nombreuses cartes SVGA ont beaucoup plus, mais même sur ces cartes, modes VGA ne peuvent accéder au premier 256K sauf pour le mode 0x13, qui ne peut 64K d'accès. La raison en est que le mode est un mode 0x13 chaîne-4, ce qui signifie essentiellement que chaque octet de mémoire selon vidéo est utilisé. La raison en est que la structure linéaire de la mémoire vidéo a permis l'accès mémoire vidéo rapide et facile. Mise hors tension mode chaîne 4 permet au programme d'accès de tous 256K de mémoire vidéo, mais implique une programmation plus compliquée.

En mode Unchained, la mémoire existe dans quatre 64K avions. Chaque plan correspond à une colonne spécifique de la mémoire vidéo: 0 plan contient des pixels 0, 4, 8, etc .; avion 1 contient des pixels 1, 5, 9, etc .; avion 2 contient les colonnes 2, 6, 10, etc .; et le plan 3 contient les colonnes 3, 7, 11, etc. (figure 22). Donc, pour tracer un pixel à la position (5,7), l'avion 1 est choisi, et le décalage est de (320 * 7 + 5) / 4 = 561.

Figure 22. Comment la mémoire vidéo se rapporte à l'écran.

Étant donné que le mode Unchained n'est pas un mode standard VGA, il ne peut pas être définie à l'aide d'un appel de fonction du BIOS. Au lieu de cela, certains registres VGA doivent être peaufiné. Il comporte deux contrôleurs VGA: le contrôleur de séquence (port 0x3C4) et le contrôleur de tube cathodique (port 0x3D4).

Les registres VGA peuvent parfois être assez complexe. Pour une liste complète des registres VGA, visitez le site en ligne PC-GPE.

Tracer un pixel en mode chaîné est un peu peu plus fastidieux que cela est en mode 0x13, parce que le plan approprié doit être sélectionné. Pour sélectionner un plan, écrire 2 avion au registre de masque carte VGA, où plane est une valeur de 0 à 3 (figure 23).

Figure 23. Sélection d'un plan avec le registre de masque de la carte.

Le registre de masque de la carte se trouve à l'index 2 du contrôleur de séquence. Pour sélectionner le registre de masque de la carte, écrivez 2 à l'adresse du contrôleur de séquence sur le port 0x3C4. Ensuite, le masque de la carte se trouve au port de données du contrôleur de séquence sur le port 0x3C5.

En mode 0x13, le décalage est calculé comme 320y + x. Etant donné que la mémoire en mode chaîné est disposée dans quatre plans, le décalage en mode chaîné est calculé en tant que (Figure 22).

Si une valeur autre qu'une puissance de deux a été utilisé pour sélectionner un plan, seraient sélectionnés plusieurs plans. Par exemple, si 13 (binaire 1101) ont été utilisés, les avions 0, 2, et 3 seraient sélectionnés. Cela signifie que chaque plan sélectionné est écrit avec la valeur de couleur. Une utilisation en est l'écran de compensation rapide. Si chaque plan est sélectionné, seulement 16 000 octets doivent être écrits, au lieu de 64.000 comme en mode 0x13.

Tout d'abord, mettre en place deux variables de taille mot pour garder la trace des pages visibles et non visibles. Ce sont des décalages dans la mémoire vidéo.

Ensuite, faites tout le dessin à la page non visible. Par exemple, si un pixel devait être tracée:

Quand tout le dessin est terminé, il est temps de changer les pages. Le nouveau décalage est défini par deux registres du contrôleur de tube cathodique. La première, 0x0C, fixe les 8 bits supérieurs de l'offset, et le second, 0x0D, fixe les plus basses 8 bits.

Voici quelques points à considérer lors de l'utilisation flipping page:

  • Si le programme utilisait les interruptions, il serait souhaitable de désactiver les interruptions avant que la page a été retournée et les réactiver par la suite. Si une interruption est survenue au mauvais moment, l'écran pourrait être déformé temporairement.
  • Lorsque les registres de décalage sont modifiés, la page flip ne se produit pas jusqu'à la fin de la prochaine retraçage vertical. Donc, après que la page est retournée, le programme devrait attendre la fin du balayage vertical avant de tirer à la page non visible.

Dans le programme suivant, au lieu de se référer aux pages aussi visibles et non visibles se réfère à eux comme visuel et actif. Il tire des boules animés (Figure 24) autour de l'écran à l'aide à la fois le double buffering et page flipping, et génère ensuite les résultats. Par défaut, ce dessin huit balles; peut être établi un nombre unique de balles en spécifiant un numéro à l'invite de commande. Dans cet exemple, 16 balles ont été tirées en utilisant la commande unchain 16.

Ayant du mal à la compilation ou l'exécution du programme? Voir la page Dépannage.

Figure 25. Sortie de unchain.exe.

Bien que flipping page en mode Unchained a été plus rapide que le double tampon en mode 0x13 dans cet exemple, il est toujours plus rapide. Ce programme a été créé pour prouver un point: en fonction du nombre de pixels tirés et le nombre de SORT () s « s ou outpw () » utilisé en mode Unchained, le mode 0x13 peut encore être plus rapide. Le programme a été testé (en ignorant le balayage vertical) sur différents nombres d'objets pour montrer la relation (figure 26).

Figure 26. Mode Unchained est pas toujours plus rapide.

L'un des raisons mode 0x13 est parfois plus rapide que le mode Unchained est que pour chaque trame, le plan sélectionné est modifié quatre fois pour chaque objet de balle. Le programme aurait été créé pour sélectionner le plan seulement quatre fois par trame, ce qui aurait des performances accrues, en raison de déclarations sont très lentes SORT () 's et outpw (). Lors de la conception d'un programme pour le mode Unchained, le nombre de SORT () 's et outpw () est utilisée doit être limitée à aussi peu que possible.

Ce programme montre différents modes déchaînées. Il prend en charge des largeurs de 320 et 360, et les hauteurs de 200, 400, 240 et 480, donc il y a un total de huit combinaisons. Réglage du mode que vous voulez est fait comme ceci:

Le programme démontre également bitmaps plans, ce qui accélère un peu les choses. Assurez-vous de télécharger ghosts.bmp pour obtenir le programme de travail.

Ayant du mal à la compilation ou l'exécution du programme? Voir la page Dépannage.