Tous les calculs graphiques sont réalisés par le CPU, avant que le Picture Processing Unit ou 'PPU' n'en fasse le rendu. C'est un autre composant que l'on trouve à l'intérieur du DMG-CPU et qui pourrait être décrit comme une version améliorée de la puce graphique du prédécesseur (du même nom).
L'image est affichée sur un écran LCD intégré, elle a une résolution de 160×144 pixels et, dans le cas du Game Boy monochrome, affiche 4 nuances de gris (blanc, gris clair, gris foncé et noir). Comme le Game Boy original a un écran LCD vert, l'image aura une apparence verdâtre.
Si vous avez lu l'article sur la NES, vous vous souvenez peut-être que le PPU a été conçu pour se conformer au faisceau du CRT (tube cathodique). Cependant (et pour des raisons évidentes), nous avons un écran LCD dans la Game Boy. Eh bien, le nouveau PPU suit également cette méthodologie car les écrans LCD doivent également être rafraîchis. En faisant cela, cette console bénéficiera des effets basés sur CRT qui ont précédemment permis aux développeurs NES de proposer du contenu imaginatif.
Organiser le contenu
Le PPU est connecté à 8 KB de VRAM ou 'Display RAM'. Ce faisant, il fournit également un accès arbitré au CPU. Ces 8 Ko contiendront la plupart des données dont le PPU aura besoin pour effectuer les rendus. Les matériaux restants seront plutôt stockés à l'intérieur du PPU, car ils nécessitent des taux d'accès plus rapides.
Le jeu est chargé de remplir les différentes zones avec les bons types de données. De plus, le PPU expose des registres pour que le jeu puisse indiquer à la PPU comment ces données sont organisées. Cependant, il y a beaucoup de règles à suivre (vous le verrez dans les sections suivantes).
Construire l'image (frame)
Voyons comment le PPU parvient à dessiner des choses sur l'écran. À des fins de démonstration, Super Mario Land 2 sera utilisé comme exemple.
Tuiles

Plusieurs tuiles séparées par une grille.

Une seule tuile.
Le PPU utilise des tuiles comme ingrédient de base pour le rendu graphique, spécifiquement, les sprites et les arrière-plans .
Les tuiles sont uniquement des bitmaps 8x8 stockés dans la VRAM dans une région appelée Tile set ou « Tile pattern table », chaque pixel correspondant à l'une des quatre nuances de gris disponibles. En pratique, cependant, les nuances de gris sont sélectionnées grâce à une 'palette' de couleurs. Les Game Boys monochromes contiennent des registres qui définissent ces palettes. Comme expliqué précédemment, il n'y a que quatre couleurs/nuances de gris à choisir, donc un seul registre de 8 bits peut contenir une palette de quatre nuances sans problème. Cela dit, le système fournit trois registres (donc, trois palettes programmables) avec utilisation restreinte (plus de détails expliqués plus tard).
De plus, les tuiles sont regroupées en deux tables de motifs.
Pour construire l'image, les tuiles sont référencées dans un autre type de table appelé Carte de tuiles. Cette information va indiquer au PPU où il doit afficher les tuiles. Deux maps sont stockées pour construire les différentes couches de l'image.
Les prochaines sections détaillent comment les tile maps sont utilisées pour construire les couches.
La couche d''arrière-plan

Background map allouée dans la VRAM.

Surface sélectionnée de l'arrière-plan. Notez que la partie sélectionnée comprend une portion du haut, celle-ci sera recouverte par la couche Window.
La couche Background est une map de 256x256 pixels (avec des tuiles de 32x32) qui contient des tuiles statiques. Cependant, n'oubliez pas que seulement 160x144 pixels sont visibles à l'écran, c'est donc le jeu qui décide quelle partie sera sélectionnée pour l'affichage. Les jeux peuvent également déplacer la zone visible au cours du jeu, c'est ainsi que l'on obtient le Scrolling Effect (effet de défilement).
Une des deux tile maps peut être utilisée pour construire la couche de fond (background). De plus, il n'y a qu'une seule palette disponible pour cette couche.
Fenêtre

Map Window affichée. Le jeu l'active sur les dernières lignes de balayage. Par conséquent, seules les premières lignes sont affichées en bas de l'écran.
La couche Window est une couche de 160x144 pixels contenant des tuiles affichées au-dessus de l'arrière-plan (background) et des sprites. Cette couche ne défile pas.
La carte de tuiles restante peut être affectée à la couche Window, elle partage également la même palette avec la couche Background.
En somme, cela peut sembler être une fonctionnalité stupide. Comme la fenêtre n'a pas de transparence et occulte donc complètement l'arrière-plan, vous pouvez vous demander 'À quoi sert-elle ?'. Eh bien, les couches Background et Window peuvent être utilisées simultanément à différentes parties de l'écran. Cela est destiné à afficher des informations principalement en bas de l'écran, mais alors que sur la NES cela nécessitait de réaliser des écritures complexes et chronométrées, le PPU de la Game Boy peut le gérer automatiquement.
Ainsi, les jeux l'utilisent normalement pour afficher les statistiques des joueurs, les scores et autres informations 'toujours actives'.
Sprites
Les sprites sont des tuiles qui peuvent se déplacer indépendamment sur l'écran. Ils peuvent également se chevaucher et apparaître derrière l'arrière-plan (background), l'élément visible sera déterminé en fonction d'un attribut de priorité.
Cette couche a également une couleur supplémentaire disponible/requise : Transparent. Ils ne peuvent donc afficher que trois nuances de gris au lieu de quatre. Heureusement, cette couche en particulier est fournie avec deux palettes dédiées parmi lesquelles choisir.
La Mémoire d'Attribut d'Objet ou 'OAM' est une carte stockée à l'intérieur du PPU qui spécifie les tuiles qui seront utilisées comme sprites. Au lieu d'utiliser une carte de tuiles, les sprites sont définis dans l'OAM. Les jeux remplissent généralement cette région en appelant l'unité OAM DMA trouvée à l'intérieur de la puce, le DMA récupère les données de la RAM principale ou de la ROM du jeu et les envoie à l'OAM. Maintenant, pendant que le DMA est en cours, le CPU ne peut pas accéder à la mémoire externe (d'où l'importance d'utiliser la HRAM pendant cette période).
En plus de l'index de tuile, chaque entrée contient les attributs suivants : position X-Y, palette choisie, priorité et indicateurs de retournement (permettant de faire pivoter la tuile verticalement et horizontalement).
Le PPU est limité au rendu jusqu'à dix sprites par ligne de balayage et jusqu'à 40 par frame, le dépassement de cette limite aura pour conséquence que ces sprites ne seront pas dessinés.
Résultat
Une fois que la frame est terminée, il est temps de passer à la suivante ! Toutefois, le processeur ne peut pas modifier les tables pendant que le PPU est en train de les lire depuis la VRAM, c'est pourquoi le système prévoit un ensemble d'interruptions déclenchées lorsque le PPU est inactif. On peut retrouver ce comportement chez la NES.
Lorsqu'une seule ligne de balayage est terminée, la période de Horizontal Blank commence. Cela permet de jouer avec la partie du cadre qui n'a pas encore été dessinée.
Lorsque toutes les lignes de balayage sont terminées, la période de Vertical Blank commence, et une interruption dédiée est appelée. Le jeu peut maintenant mettre à jour l'affichage pour la frame suivante.
Il existe un état supplémentaire appelé OAM search qui est déclenché au début de la ligne de balayage ; à ce stade, le PPU traite quels sprites seront affichés dans cette ligne de balayage, pour que le jeu puisse mettre à jour n'importe quelle région, sauf l'OAM.
Secrets et limitations
L'inclusion de la couche Window et d'interruptions supplémentaires a permis l'apparitions de nouveaux types de contenus et d'effets.
Effet de vacillement

Video - The Legend of Zelda: Link's Awakening (1993). divulgâcheurs !
Les « horizontal interrupts » ont permis de modifier la frame avant d'être terminée. Cela signifie qu'une valeur de défilement différente pourrait être appliquée à chaque ligne, ce qui se traduit par un décalage de chaque ligne de la trame à des vitesses différentes.
Cela a permis d'obtenir un intéressant effet de vacillement (je ne suis pas sûr que ce soit son nom officiel).
Les ajouts de couleurs
Le PPU de la Game Boy Color se comporte comme un super-ensemble de l'original. Vous allez maintenant voir quels sont les ajouts du soi-disant modèle 'Color' de cette marque.
Modes de fonctionnement

The Legend of Zelda: Link's Awakening DX (1998).
Un jeu hybride Game Boy Color fonctionnant en mode CGB.

Super Mario Land 2, vu depuis une Game Boy Color. Ce dernier ajoute une palette colorisée et fonctionne en mode DMG.
Pour commencer, pour des raisons de compatibilité, le nouveau PPU a deux modes de fonctionnement. Pourtant, Nintendo voulait que les utilisateurs de Color voient des améliorations même avec les jeux uniquement en monochrome. Par conséquent, les deux modes de fonctionnement sont les suivants :
- Mode CGB: Mode PPU étendu avec toutes les améliorations visuelles qui composent les nouveaux jeux Game Boy Color.
- Mode DMG : Mode traditionnel avec tous les extras désactivés. Cependant, vous verrez dans la section 'Système d'exploitation' que les jeux en monochrome sont néanmoins améliorés avec des palettes de couleurs.
Organiser le (nouveau) contenu
La carte mère CGB abrite maintenant 16 KB de VRAM au lieu de cela, ce qui est le double de la quantité de VRAM originale. En raison des limitations d'adressage du CPU, cette nouvelle disposition est mise en œuvre sous la forme de deux banques de 8 KB, avec un nouveau registre (appelé VBK) agissant comme un commutateur. De l'autre côté, le PPU peut accéder aux deux banques en même temps. En fin de compte, cela signifie que les programmeurs n'ont besoin de remplir les banques de VRAM qu'avec l'aide de VBK, puis de spécifier dans la carte de tuiles la banque où se trouve la tuile, afin que le PPU puisse s'occuper du reste.
Cela étant dit, que pouvez-vous faire avec la VRAM supplémentaire ? Beaucoup de choses :
- Stockez deux fois plus de tuiles.
- Stockez plus de palettes, qui offrent également une gamme de couleurs plus large.
- Étendre l'espace des métadonnées de tuile pour coder plus d'effets et adresser des palettes supplémentaires.
Les visuels
Grâce au nouveau PPU, les programmeurs peuvent maintenant définir des palettes de couleurs avec 32 768 couleurs parmi lesquelles choisir.
Premièrement, les développeurs doivent maintenant peupler une nouvelle zone appelée Palette Memory, qui stocke jusqu'à seize palettes de couleurs (la moitié pour l'arrière-plan et la fenêtre, la moitié pour les sprites) qui codent quatre couleurs . Chaque entrée s'inscrit dans une valeur de 16 bits (2 octets) et seuls 15 bits sont utilisés. La Palette Memory n'est pas adressée par le CPU, cependant, un nouveau registre est utilisé comme tampon pour écrire sur cette mémoire (une méthodologie trouvée dans le Super Nintendo). En général, c'est ainsi que le CPU définit les palettes.
Cela dit, les tuiles d'arrière-plan et de fenêtre peuvent faire référence à l'une de ces huit palettes. Il en va de même pour les tuiles Sprite, sauf qu'elles sont contraintes à des palettes de trois couleurs, une entrée étant réservée pour la couleur 'transparente'.
L'espace supplémentaire
Ensuite, Les ensembles de tuiles sont maintenant deux fois plus grands. Ainsi, les programmeurs peuvent stocker le double de tuiles en VRAM. Les cartes de tuiles d'arrière-plan/fenêtre ont également été étendues, ce qui a pour conséquence que des métadonnées supplémentaires sont encodées. Par conséquent, l'extension des capacités de ces couches. Par exemple, leurs tuiles peuvent maintenant être retournées horizontalement et verticalement, ce qui évite au jeu de stocker des graphiques dupliqués en VRAM (ce qui, à son tour, peut être exploité pour dessiner un contenu plus unique).
De plus, le CPU CGB regroupe également une unité DMA supplémentaire, qui peut copier le contenu du Game Pak ou de la WRAM vers la VRAM. Il fonctionne en deux modes :
- DMA à usage général : Le transfert aura lieu à tout moment et le DMA aura la priorité sur tout autre accès à la mémoire. Les programmeurs doivent donc être prudents quant à l'utilisation de ce composant (c'est-à-dire pendant ou en dehors de la numérisation) et comment (la quantité de données à copier), car une mauvaise utilisation peut entraîner un déchirement de l'écran (l'accès à la VRAM sera bloqué pendant le transfert).
- DMA de balayage horizontal (H-Blank) : Le transfert n'aura lieu que pendant les périodes de H-Blank. Cela évite les artefacts à l'écran, mais ne peut transférer du contenu que par lots de 16 octets, et fait des pauses pendant le balayage LCD.
Une fois de plus, cette unité offre aux programmeurs de nouvelles possibilités pour fournir un contenu plus riche, car elle profite des périodes initialement laissées pour l'inactivité.




