GameBoy - Ouverture et CPU (partie 1)

Voila, nous allons enfin nous pencher sur cette merveille de technologie 8-Bits... de quoi agrémenter nos connaissances générales que nous pourrons exploiter avec nos MicroControleurs.

Après avoir pas mal joué avec ma GameBoy depuis les précédents articles GameBoy, il est temps d'aller fouiller les entrailles de la bêtes.
GameBoy ouverte
A droite: nous retrouvons la partie avant de la console avec l'afficheur LCD et la nappe de raccordement avec l'arrière de la console.
A gauche: nous retrouvons l'arrière de la console avec le connecteur pour les carte GameBoy (les ROMs) et le coeur de la console.

C'est une fois entièrement démontée que l'on à accès à la partie la plus intéressante!
Les différents éléments d'une GameBoy

La carte mère

Si nous voulons nous intéresser au processeur de la GameBoy, c'est par la carte mère que nous allons commencer notre petit périple.

L'image ci-dessous (que vous pouvez agrandir) résume une bonne partie des connaissances collectée à ce jour.
Eléments principaux de la carte mère - Agrandir pour lire les détails.

Le SoC > DMG CPU

Le CPU de la GameBoy est un Sharp LR35902, CPU système 8 bits qui ressemble plus à un SoC (System On Chip) car celui-ci prend en charge des fonctionnalités qui dépassent le cadre du simple CPU.

Il prend en charge les fonctionnalités standard d'un CPU comme:
  • Le traitement CPU : bus d'adresse 16 bit, bus de données 8bit, Registres, stack pointer, program counter.
  • Gestion d'interruption : permet d'appeler des routines
  • Timer : permet de lancer des taches répétitives
  • accès à la mémoire
  • ROM de démarrage
Mais apporte également la gestion d'autre périphériques normalement gérés hors du CPU... mais ici intégré sur SoC
  • La gestion des entrées (le Joypad)
  • Le transfert série
  • Contrôleur audio (carte son)
  • PPU : Pixel Processing Unit
Mais a proprement parlé, le DMG CPU est un CPU Hybride entre:
  • Un CPU Intel 8080 : l'un des premiers vrai CPU apparu en 1974
  • Un Zilog Z80 : devenu célèbre avec le Spectrum, TRS-80 (1979)
Sharp LR35902 par rapport au 8080 et Z80

Sortie en 1989, la GameBoy s'appuie donc sur des processeurs bien éprouvé et surtout bon-marché (du point de vue licence).
Si vous prêtez attention au graphique ci-dessus, le processeur SHARP (DMG CPU) n'inclus pas toutes les fonctionnalités du Z80 et du 8080.
Seule une partie des fonctionnalités communes au Z80 et au 8080 sont supporté par le DMG-CPU. Ce socle forme le Core Feature du processeur Sharp.
Certaines instruction spécifiques au Z80 et 8080 sont même éliminé!

On notera également que certaines fonctionnalités spécifique au Z80 (non dispo sur le 8080) sont inclus. Cela concerne principalement les "Instruction Extender" (0xCB) que vous rencontrerez plus tard dans les posts.

Finalement, le DMG CPU apporte ses propres fonctionnalités (ni connues sur le 8080, ni connu sur le Z80). Cela concerne principalement la gestion audio ainsi que le PPU (Pixel Processing Unit).

Au final, nous retrouvons un DMG CPU avec des caractéristiques un peu bariolée... mais l'histoire à démontré que cela à été payant!


Nous allons maintenant nous attarder un peu plus sur les deux processeurs historique constituant le coeur du DMG-CPU.

L'Intel 8080

Le 8080 peut être qualitfié de "premier microprocesseur vraiment utilisable"!  Cette légende 8-bits est apparu dans le grand publique en 1974. Ce processeur propulsa des machines mythique comme l'Altair 8800 et le jeu Space Invaders. Son architecture à définitivement changé la façon de concevoir les ordinateurs.

Sur le plan technique, l'architecture d'un 8080 est simple et directe. Il propose un bus d'adresse sur 16 bits et un bus de donnée sur 8-bits ce qui permettait d'accéder à 64 Ko de mémoire (65536 octets).
Les registres (éléments fondamental de manipulation de données) proposaient:
  • Un accumulateur 8-bits,
  • Un registre de statut sur 8-bits,
  • Six registres 8-bits à usage générale
Un pointeur de pile 16-bits et un compteur d'instruction (program counter) sur 16-bits.
Par convention:
  • Le registre accumulateur est appelé "A",
  • Le registre de statut "F",
  • Les registres généraux "B", "C", "D", "E", "H" et "L"
  • Le pointeur de piles "SP" (Stack Pointer en anglais)
  • Le compteur d'instruction "PC" (Program Counter en anglais).
Architecture et les REGISTRES du 8080
Opération 16 bits:
Quelques registres généraux peuvent être utilisés par deux pour pour créer des valeurs 16 bits. En effet, certaines instructions du microcontrôleur sont orientées sur le traitement 16-bits (très pratique quand il s'agit d'accéder à la mémoire).
Le registre "HL" est en fait constitué des registres "H" et "L" et permet, par exemple, d'adresser une donnée en mémoire (ce que l'on appelle un "pointeur" en C). Les valeurs en 16 bits permettent également de faire des opération mathématique sur des valeurs dépassant 255 (codés sur 8 bits).
Un exemple d'opération 16 bits est l'ajout du registre "BC" (ou "DE",  "HL",  "SP") au registre "HL".

Registre de statut:
Le registre "F" (registre de statut)  enregistre des résultats concernant la dernière opérations exécutée. Chaque bit de ce registre à une signification particulière.
Par exemple, le bit 8 est utilisé pour "zero flag" qui est placé à 1 (set en anglais) si le résultat de la dernière instruction est égal à 0.
Les autres bits du registre "F" concernes le report, le signe, le demi-report et la parité.

Ce que DMG n'inclus pas du 8080:
Il y a de nombreuse fonctionnalités du 8080 qui ne sont pas inclus dans dans le processeur Sharp LR35902 du GameBoy.
Par exemple, le 8080 utilise des espace d'adresses différents pour les entrées/sortie; il accède à ces espaces d'adresse à l'aide des instructions IN et OUT (fonctionnalité également supporté sur le Z80).
Ces instructions ont du sens sur un 8080 ou Z80 qui sont des processeurs à usage général. Par contre, la GameBoy est un est produit très spécifique avec peu de périphériques. Plutôt que d'avoir des ports d'entrée/sortie et des instructions spécifiques, les périphériques de la Gameboy sont accessibles via des adresses mémoires (ont dit "Memory Mapped" en anglais) => moins d'interfaces, moins d'instruction = diminution du coup de fabrication

Par exemple: écrire à l'adresse mémoire 0xFF40 permet d'accéder au registre de contrôle de l'afficheur LCD. Les adresses 0xFF00 à 0xFF7F (128 octets) son réservé au mapping des périphériques.

Il faut dire que le 8080 était en compétition avec d'autres processeurs comme le 6800 de Motorola (base de la famille 680000), le 6502 de MOS Technology au coeur du célèbre commodore 64 et le Z80 de Zilog rendu célèbre par le Spectrum.

Ce n'est pas un hasard sur le Sharp LR35902 est hybride incluant également des fonctionnalités du Z80... c'est le moment de se pencher sur le Z80.

Le Zilog Z80

Ce n'est pas un hasard si le Z80 et le 8080 partage un coeur commun car le Z80 à été conçu par les mêmes ingénieurs derrière le 8080 d'Intel. Avec un binaire compatible entre le Z80 et 8080, les développeurs disposaient d'une même interface pour développer leurs solutions. Les logiciels pour 8080 pouvaient donc être exécutés sur le Z80, un choix stratégique qui fut certainement pour beaucoup dans la popularité du Z80.
Zilog a été au-delà de l'implémentation des fonctionnalités du 8080. En effet, le Z80 introduit un grand nombre de fonctionnalités et caractéristiques inédites.

Bien entendu, si le processeur Sharp LR35902 du GameBoy s'était arrêté à l'implementation du 8080 lors le DMG-CPU aurait été plus simple. Mais l'architecture Z80 à également apporté le petit coup de pouce technologique nécessaire à la popularité du GameBoy.

Le Z80 à ajouté quelques belles fonctionnalités au Sharp LR35902. Parmi celles adoptées, il y a cette instruction spéciale 0xCB ("Instruction Extender") qui permet accéder a un ensemble de 256 instructions supplémentaires.

Fonctionnement du processeur
Le 8080 et Z80 étant compatible, nous allons commencer par le fonctionnement normal du processeur.
Le fonctionnement est basé sur la façon dont le processeur lit et exécute les octets du programme disponible dans la mémoire (dont une partie correspond à la ROM disponible sur la cartouche).
  • L'octet est lu dans la mémoire à la position indiquée par le registre Program Counter ("PC"). "PC" est un pointeur vers une adresse mémoire!
  • En fonction de la valeur lue (dite OPCODE) le CPU exécute une insctruction plutôt qu'une autre tels que défini dans le CPU lui même.
  • L'exécution d'une instruction s'appuie sur des données complémentaires (appelée opérandes) lu en mémoire et dépendant de l'instruction en cours d'exécution sur le CPU. Ces opérandes sont, bien entendu, des octets et le nombre nécessaire à l'exécution de l'instruction dépend de l'instruction.
  • Une fois l'instruction exécutée, le registre "PC" est incrémenté du nombre d'octet correspondant à la taille de l'instruction exécutée (donc OPCODE + opérandes)
  • Le processeur est prêt à lire l'octet de l'instruction suivante.
Voici l'exemple concret de "INX B" que l'on retrouve dans la table des instructions 8080 (pastraiser.com)
Source: i8080_opcodes

Au croisement de la ligne 0x et colonne x3, nous avons l'opcode "INX B". Avec ligne et colonne, nous pouvons recomposer la valeur de l'octet correspondant au code de l'instruction qui est 03 en hexadécimale (0x03 pour être préçis pour éviter toute ambiguïté).

Les deux valeurs en dessous 1 et 5 correspondent respectivement à:
  • La longueur de l'instruction : 1 octet... donc pas d'opérande pour cette instruction
  • Nbre de cycle pour l'exécution: 5 cycles d'horloge
Les tirets en troisième ligne indique les bits (Flag) du registre de "Statut" altérés par l'instruction (ici aucun bit altéré).

INX B: correspond à "Increment Extended B", incrémentation de 1 du registre "B", l'extended fait référence à l'incrémentation étendue... sous-entendu sur 16bits. C'est donc les registres "BC" qui sont concernés.

Instruction Extender
Dans le cas du 8080 d'Intel et du Z80 de Zilog, la façon d'interpréter les octets en mémoire est tels que le premier octet lu correspond toujours à l'instruction à l'OPCODE (code opération=instruction a exécuter).

Comme vu juste avant, cet OPCODE fait toutjours 1 octets de long, ce qui limite le nombre d'instructions disponible à 256 (0 à 255).
Maintenant, conformément à la sémantique de l'instruction en cours d'exécution, les octets suivant l'OPCODE sont interprétés commes des opérandes de l'instruction.

Une des instructions spéciales du Z80 est l'OPCODE 0xCB (non utilisé sur un 8080) est interprété comme une Intruction Extender (extension d'instruction).
Cela offre un accès à un nouvel ensemble complet de 256 instructions.
L'opérande entre 0 et 255 (0x00 et 0xFF) correspond donc l'instruction étendue à exécuter.

Le Sharp LR35902 à donc adopté toute une série d'instruction très utiles.
Si l'intruction extender du Z80 offre des services tels que la manipulation de bits sur les registres et la mémoire, déplacement de blocks, recherche d'octets, etc.
Sur le Sharp LR35902, seules les instructions de manipulation des bits sont reprises.

Bien que le Z80 dipose également d'un système d'interruption flexible, de deux deux registres spéciaux IY et IX, ainsi qu'un second ensemble de registre (pour gagner du temps). Aucune de ces fonctionnalités ne sont intégrées au processeur Sharp LR35902.

Ressources

Voici quelques ressources en relation avec cet article:

Aucun commentaire