Le Commodore 64 et sa mémoire video

Comme tous system informatique, le C64 doit mémoriser des informations pour construire son image de sortie. On parle souvent de mémoire video. (Vram)

C'est le VIC II qui travaille pour la video. Et comme beaucoup d'ordinateur, la VRAM se trouve dans la RAM de l'ordinateur. (A ma connaissance seul la game MSX possède une VRAM qui est dédiés dans les machines 8 bits)

Contrairement au processeur principale 6510 qui peut adresse 64ko (toute la mémoire), le VIC II ne peut adresse que 16ko; mais il est possible de le positionner à 4 endroit différent de la machine.

Screen Memory

Qui peut aussi être appellé 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 pixel et son contenu pointe sur un numero de tile à afficher. (256 possibilités de tiles qui sont affichables).
L'organisation du Screen Memory est linéaire. Le 1er octet corespond au bloc 0,0 le 2em octet au bloc 1,0...
Les 1000 octets donne donc une résolution affichable de 40x25 bloc de 8x8 pixels (320x200).
Au demarage du C64, la position du screen memory se trouve à l'offset $400 de la plage du vicII. (Donc a l'adresse $400 vu que le vicII 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 controle la position du screen memory.
A vrais dire c'est les 4 bits du poid fort qui controle 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 bloc de 8x8 pixel, et permet de choisis 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 vicII, une plage de 8 octets représente un pointeur de patern de sprite. La valeur dans cette octet x 64 + adresse du vicII donne une adresse du 1er octet de l'encodage des data du sprite.
Exemple : Si j'ai la valeur 56, et que le vicII n'a pas bougé, cela donne donc 56*64+0 = 3580. Le patern de ce sprite se trouve à l'adresse 3580 (en decimal soit $E00)

Pointeur de tile

Le Vic II à besoin de connaitre 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.
Valeurs des 3 bits * 2048 + adresse du vic II est on à l'adresse de lecture du tile 0.
Par defaut les trois bits donne la valeur $010 qui pointe à l'adresse $1000 dans la ROM des charactères du c64.

Les Registres de couleur

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

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é pour les sprites en mode multicouleur.
Sprite Color 2 $D026 Couleur utilisé pour les sprites en mode multicouleur.
Sprite Color $D027 à $D02E Couleur principale utilisé pour les sprites 0 à 7
Mode "Texte"

Le C64 peut fonctionner en mode Charactère (ou tiles si vous préférés). Il existe Trois mode video en mode Charactères. Le Mode Normale, le Mode Multicouleur, et le mode etendue.

En mode normal, un tile est encodé sur 8 octets. 1 octet par ligne de 8 pixel. Chaque bit représente un point allumé et affiche la couleur associé à la color ram, ou affiche la couleur du fond d'écran si le bit = 0.
Ce qui donne que 2 possibilités de couleur par bloc de 8x8 pixel 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 pixels), ceci dit, on controle 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 4 couleurs par bloc de 8x8 pixel. 1 couleurs de la color ram sur 8 posibilités, et 3 couleurs communs à tous.

Le mode etendu : 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 couleurs d'un des trois screenback.
La couleur du screenback est choisis 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 bloc de 8x8 pixels. La couleur de la color map et 1 des 4 couleurs communs au tiles.
Ce mode n'est pas compatible avec le mode Multicouleur.
Site réalisé par Jean Monos