Revenir au plan du site

Comment utiliser la mémoire étendue sur CPC/Plus/GX ?

Vous savez déjà (si vous avez lu les précédents articles) que l'Amstrad CPC est capable de gérer 4Mo de ROM sans bidouille mais il est aussi capable de gérer 2Mo sans bidouille aucune. On peut trouver certains émulateurs capables de monter jusqu'à 4Mo et de telles extensions physiques existent mais elles présentent l'inconvénient de devoir être programmées de façon particulière pour éviter de déclencher d'autres périphériques. Restons sur 2Mo ce qui est déjà largement au dessus du standard communément admis de 512ko d'extension.

De la même façon qu'avec les ROM, la mémoire étendue n'est accessible QUE par le Z80. Il n'est pas possible de commuter des pages mémoires et espérer que le contenu graphique de votre écran change.

Contrairement à la ROM étendue d'un CPC qui ne peut se connecter qu'en #C000, la RAM étendue d'un CPC a une préférence pour l'espace d'adressage #4000-#7FFF. C'est bien car cela n'interfère pas avec la ROM, mais en même temps, ça nous restreint sacrément si on utilise le Basic! Travaillant en assembleur, nous ne sommes pas concernés par ces histoires et c'est tant mieux.

Il existe d'autres commutations disponibles pour lesquelles on trouve des utilités graphiques ou système. Vous avez peut-être déjà entendu parler des "modes" #C1, #C2 ou #C3 

Ce ne sont pas exactement des modes. Comme le résume la page Gate Array du site Quasar, le MMR (Memory Mapping Register) est scindé en 3 zones.
bit valeur fonction
71 Adresser le MMR dans le Gate Array
61
5n Numéro de slot 64K étendu à utiliser (nnn de 0 à 7)
4n
3n
2c Type de configuration de la mémoire (ccc de 0 à 7)
1c
0c

En regardant ce tableau, on remarque rapidement que les fameux "modes" qui vont de #C0 à #C7 correspondent aux 7 types de configuration mémoire de la page de mémoire étendue 0 et le "C" correspond au MMR.

La fonction 0 correspond à la désactivation du mapping, le résultat est identique avec toutes les pages! Ainsi, vous n'êtes pas obligé d'utiliser #7FC0 pour remettre la mémoire en état par défaut. Les autres combinaisons sont valides : #7FC0, #7FC8, #7FD0, #7FD8, #7FE0, #7FE8, #7FF0 et #7FF8 (que vous ayiez ou non une extension branchée c'est OK).

La fonction 1 connecte la 3è bank de 16k du slot étendu nnn de 64K en #C000-#FFFF

La fonction 2 connecte l'ensemble du slot étendu nnn de 64k en #0000-#FFFF

La fonction 3 connecte la 3è bank de 16k du slot étendu nnn de 64K en #C000-#FFFF (analogue à la fonction 1) MAIS aussi bascule la RAM centrale #C000-#FFFF vers #4000-#7FFF ce qui permet facilement de gérer un page flipping (nous y reviendrons un jour).

Les fonction 4,5,6 et 7 connectent respectivement la 1è, 2è, 3è ou 4è bank de 16k du slot étendu nnn dans la zone #4000-#7FFF


Puisqu'un schéma est souvent plus parlant qu'un long discours, voici un résumé visuel des commutations possibles avec une extension de 128k (soit 192k au total pour le CPC).
RAM centrale
64K
Page étendue 0
64K
Page étendue 1
64K
0 (n°logique 0)0 (n°logique 4)0 (n°logique 8)
1 (n°logique 1)1 (n°logique 5)1 (n°logique 9)
2 (n°logique 2)2 (n°logique 6)2 (n°logique 10)
3 (n°logique 3)3 (n°logique 7)3 (n°logique 11)

valeur du MMR Slot étendu Fonction Mapping logique Z80 Note
#C0 Slot 0 DISABLE (0) Bank 0 | Bank 1 | Bank 2 | Bank 3 Mémoire par défaut
#C1 Slot 0 UPPER3 (1) Bank 0 | Bank 1 | Bank 2 | Bank 7
#C2 Slot 0 ALLSLOT (2) Bank 4 | Bank 5 | Bank 6 | Bank 7
#C3 Slot 0 UPPER3FLIP (3) Bank 0 | Bank 3 | Bank 2 | Bank 7
#C4 Slot 0 BANK0 (4) Bank 0 | Bank 4 | Bank 2 | Bank 3
#C5 Slot 0 BANK1 (5) Bank 0 | Bank 5 | Bank 2 | Bank 3
#C6 Slot 0 BANK2 (6) Bank 0 | Bank 6 | Bank 2 | Bank 3
#C7 Slot 0 BANK3 (7) Bank 0 | Bank 7 | Bank 2 | Bank 3
#C8 Slot 1 DISABLE (0) Bank 0 | Bank 1 | Bank 2 | Bank 3 Mémoire par défaut quel que soit le slot!
#C9 Slot 1 UPPER3 (1) Bank 0 | Bank 1 | Bank 2 | Bank 11
#CA Slot 1 ALLSLOT (2) Bank 8 | Bank 9 | Bank 10 | Bank 11
#CB Slot 1 UPPER3FLIP (3) Bank 0 | Bank 3 | Bank 2 | Bank 11 Bank logique 3 en #4000 quel que soit le slot!
#CC Slot 1 BANK0 (4) Bank 0 | Bank 8 | Bank 2 | Bank 3
#CD Slot 1 BANK1 (5) Bank 0 | Bank 9 | Bank 2 | Bank 3
#CE Slot 1 BANK2 (6) Bank 0 | Bank 10 | Bank 2 | Bank 3
#CF Slot 1 BANK3 (7) Bank 0 | Bank 11 | Bank 2 | Bank 3

Et comme il n'est pas spécialement visuel d'utiliser ce registre au dessus de 64k de mémoire étendue, je vous propose une petite macro. Vous renommez les paramètres à votre convenance hein...
DISABLE equ 0
UPPER3 equ 1
ALLSLOT equ 2
UPPER3FLIP equ 3
BANK0 equ 4
BANK1 equ 5
BANK2 equ 6
BANK3 equ 7
macro MMR,slot,config
ld bc,#7FC0+(slot & 7)<<3) | (config & 7)
mend



Maintenant que le cadre est posé, on peut passer à un cas d'utilisation pratique dans l'article [ suivant ] ou si vous êtes chauds, vous pouvez aussi regarder [ comment initier le mode "#C2" ? ].