CODINGApprendre pas à pas la programmation en assembleur Z80 ★ Premiers programmes (briques indispensables) ★

Utilisation de la RAM étendue

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" ? ].

★ ANNÉE: 2025
★ AUTEUR: Roudoudou

Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.732-desktop/c
Page créée en 691 millisecondes et consultée 14 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.