Le Commodore 64 et sa mémoire vidéo

Comme tout système informatique, le C64 doit mémoriser des informations pour construire son image de sortie. On parle souvent de mémoire vidéo. (Vram)

C'est le VIC-II qui se charge de la vidéo. Et comme beaucoup d'ordinateur, la mémoire vidéo se trouve dans la RAM de l'ordinateur. (A ma connaissance seul la gamme MSX possède une VRAM dédiée dans les machines 8 bits)

Contrairement au processeur principal 6510 qui peut adresser 64ko (toute la mémoire), le VIC II ne peut adresser que 16 Ko; mais il est possible de le positionner à quatre endroits différents de la machine.

Screen Memory

Qui peut aussi être appelé Tilemap, le Screen Memory est une plage de 1000 octets qui permet de construire l'image.
Chaque octet est liés à un morceau d'écran de 8x8 pixels et son contenu pointe sur un numéro de tile à afficher. (256 tiles possibles qui sont affichables).
L'organisation du Screen Memory est linéaire. Le 1er octet correspond au bloc 0,0 le 2e octet au bloc 1,0...
Les 1000 octets donnent donc une résolution affichable de 40x25 blocs de 8 x 8 pixelsss (320x200).
Au démarrage du C64, la position du screen memory se trouve à l'offset $400 de la plage du VIC-II. (Donc a l'adresse $400 vu que le VIC-II est possitioné à l'adresse $0 au départ). Il est possible de modifier le pointeur d'offset du screen memory.

C'est le registre $D018 qui contrôle la position du screen memory.
À vrai dire c'est les 4 bits du poids fort qui contrôle son emplacement dans la plage du VIC 2. L'adresse du screen memory se calcule comme ceci : Adresse du VIC II + (valeur des 4 bits de gauche de l'adresse $D018 * 1024).
Ce qui donne 16 positions du screen memory dans la plage du VIC II.
A l'initiation de la machine, les 4 bits du registre du screen memory à pour valeur %0001. ce qui positionne le screen mémory à l'adresse $400

Color ram

La color map possède ne plage de 1000 octets à partir de l'adresse $D800 jusque en $DBE7. Chaque octet représente un blocs de 8 x 8 pixelss, et permet de choisie une couleurs entre les 16 teintes proposés par le C64. En mode "Normale" du C64 c'est la couleur du point allumés dans le bloc.

Pointeur de sprite

A partir de l'offset $07F8 du VIC-II, une plage de 8 octets représente un pointeur de pattern de sprite. La valeur dans cette octet x 64 + adresse du VIC-II donne une adresse du 1er octet de l'encodage des données du sprite.
Exemple : Si j'ai la valeur 56, et que le VIC-II n'a pas bougé, cela donne donc 56*64+0 = 3580. Le pattern de ce sprite se trouve à l'adresse 3580 (en décimal soit $E00)

Pointeur de tile

Le VIC-II à besoin de connaître l'emplacement des 256 tiles du Commodore 64. Le registre $D018 permet d'indiquer l'emplacement des tiles.
Pour être exacte, c'est les bits 1-2-3 du registre $D018 qui indique ça.
Valeur des 3 bits * 2048 + adresse du vic II est on à l'adresse de lecture du tile 0.
Par défaut les trois bits donne la valeur $010 qui pointe à l'adresse $1000 dans la ROM des caractères du c64.

Les registres de couleur

Il existe des emplacements mémoires qui permettent de mémoriser les couleurs utilisés. Les voici :

Nom Adresse Note
Cadre/Border $D020 Bordure de l'écran
Background $D021 Couleur de fond d'écran.
Background 1 $D022 Couleur pour le mode Multicouleur ou ECM.
Background 2 $D023 Couleur pour le mode Multicouleur ou ECM.
Background 3 $D024 Couleur pour le mode Multicouleur ou ECM.
Sprite Color 1 $D025 Couleur utilisée pour les sprites en mode multicouleur.
Sprite Color 2 $D026 Couleur utilisée pour les sprites en mode multicouleur.
Sprite Color $D027 à $D02E Couleur principale utilisée pour les sprites 0 à 7
Modes texte

Le C64 peut fonctionner en mode Caractère (ou tiles si vous préférés). Il existe trois modes vidéo en mode Caractères. Le mode normal, le Mode Multicouleur, et le mode étendu.

En mode normal, un tile est encodé sur 8 octets. 1 octet par ligne de 8 pixels. Chaque bit représente un point allumé et affiche la couleur associée à la color ram, ou affiche la couleur du fond d'écran si le bit = 0.
Ce qui donne que deux possibilités de couleur par blocs de 8 x 8 pixelss avec une couleur commune, celui du fond d'écran

Le mode multicolor, un tile est toujours encodé sur 8 octets. (1 octet par ligne de 8 pixelss), ceci dit, on contrôle que 4 pixels. (Le pixel est doublé dans la largeur pour atteindre du 8x8).
Chaque (2*1) pixel est controlé par 2 bits ce qui donne 4 possibilités de configuration.

Bit encodage Effet
%00 Couleur du background qui est affiché.
%01 Couleur du background 1 qui est affiché.
%10 Couleur du background 2 qui est affiché.
%11 Couleur de la color ram. (Mais que les 8 premiers couleurs)
Ce mode permet donc d'avoir quatre couleurs par blocs de 8 x 8 pixelss. 1 couleurs de la color ram sur 8 possibilités, et 3 couleurs communes à tous.

Le mode étendu : Comme en mode normale le tile est encodé sur 8 octets. 1 bit = pixel. pas de double pixel.
Si un bit est à 1, il affiche la couleur de la color ram. Si le pixel= 0 , alors il affiche la couleur de l'un des arrière-plans.
La couleur du screenback est choisie dans les 2 derniers bit sur screen memory.

Bit encodage Effet
%00xxxxxx Couleur du background qui est affiché.
%01xxxxxx Couleur du background 1 qui est affiché.
%10xxxxxx Couleur du background 2 qui est affiché.
%11xxxxxx Couleur du background 3 qui est affiché.
Ce system ne laisse que 6 bits pour choisir l'index du tiles, elle limite donc qu'une possibilité d'utilisation de 64 tiles. Tout comme le mode normale, ce mode permet seulement d'afficher que 2 couleurs par blocs de 8 x 8 pixelsss. La couleur de la color map et 1 des 4 couleurs communes au tiles.
Ce mode n'est pas compatible avec le mode Multicouleur.
Site rétro réalisé par Jean Monos • Amistrad