ASMtrad CPC

Apprenez l'assembleur Z80

Interruptions - modes et fonctionnement.

Voici un point important: l'utilisation de la RAM supplémentaire.

Selon les différents modèles de CPC nous avons plus ou moins de RAM.

Je vous rappelle à l'occasion que le numéro du CPC vous donne son type de lecteur en premier (4=lecteur K7 ; 6=lecteur D7) et que les chiffres suivants correspondent à la quantité de RAM en Ko.
Ainsi:
4 64 Signifie lecteur K7 avec 64Ko de RAM.
6 64 Signifie lecteur D7 avec 64Ko de RAM (la loose)
6 128 Signifie Lecteur D7 avec 128Ko de RAM (le top)

On voit donc que l'on a que 2 types de quantité de RAM de série: 64Ko ou 128Ko.
Les 64Ko on l'a déjà vu c'est la RAM centrale. Donc d'office c'est simple sur 464 ou 664 on n'a que ça.

Pour les 128Ko c'est donc 64Ko de RAM standard et 64Ko de RAM supplémentaire.

Mais comment cela marche ?

C'est assez simple en fait. Le CPC fonctionne par pages de 64Ko.
D'origine on a donc une page de 64Ko c'est la RAM centrale.
Sur 6128 nous avons une deuxième page de 64Ko: la page 0.

Mais on peut en avoir plus. C'est d'ailleurs le cas avec différentes extensions mémoire, et dans le cas d'utilisation "normale" le maximum possible est 512Ko en plus de la RAM centrale soit 576Ko (mais on peut en avoir beaucoup plus en s'y prenant de façon non conventionnelle).
Pourquoi 512Ko ? Parce que la sélection de la page mémoire se fait sur 3 bits... Soit 8 pages de 64Ko possibles=512Ko.

Il faut tout de même préciser que chaque page est elle même découpée en 4 blocs de #4000 octets (16Ko) qu'on appelle des banks. C'est donc aussi le cas de la RAM centrale...

Pour chaque page, les banks seront numérotées de 0 à 3.

Voici un schéma explicatif:

RAM CPC

Nous voyons donc bien que sur 6128 nous avons une page de 64Ko en plus de la RAM centrale. Mais comment y accéder et comment cela fonctionne ?

Le cas principal pour une connexion de bank est la connexion en #4000.
En effet il n'existe pas beaucoup de solution. On ne pourra connecter une bank qu'à un seul endroit (hormis pour une exception que nous verrons plus loin).

Une bank se connecte donc toujours en #4000/#7FFF.

Concrètement, lorsque vous connectez une bank, celle-ci viendra donc remplacer la bank 1 de la RAM centrale.

Vous ne pouvez connecter qu'une bank à la fois (la encore il y a une exception mais on la verra plus loin).

Voici donc une schéma pour la connexion des deux premières bank de la page 0 histoire que vous compreniez bien:

connexion banks

Comme vous pouvez le voir on se retrouve en RAM centrale avec la bank choisie en lieu et place de la bank 1 de la RAM centrale. Et donc en #4000.
C'est comme un remplacement. Les données ne sont pas écrasées, quand vous "déconnecterez" votre bank, la RAM centrale redeviendra comme elle était.

Comment cela fonctionne-t'il ?
Tout simplement grâce au mode MMR du Gate Array dont voici le schéma:

GA-RAM-BANKs

Dans tous les cas les bits 7 et 6 sont à 1. Ce qui pour le GA signifie que vous allez faire une opération sur la RAM.

Ensuite l'important c'est le bit 2 (pour ça que je vous l'ai mis en vert).
Celui-ci permet de choisir soit le mode "standard" de connexion d'une bank (ce dont je vous ai parlé au dessus).
Soit le mode "spécial" permettant d'utiliser un des cas particulier ou de déconnecter les banks.

Le mode "standard"...

Notre valeur envoyée au GA aura donc les bits 7 ; 6 et 2 = 1.
Les bits 5;4 et 3 correspondent au numéro de page. Ce numéro de page vaut 0 pour la première page supplémentaire.
Comme on l'a vu plus haut sur 6128 on a une seule page en plus. La 0.
Restent les bits 0 et 1 qui correspondent au numéro de la bank (0 à 3).

Pour connecter notre bank 0 de la page 0 nous devront donc envoyer au GA: %11000100
Ce qui en hexadecimal correspond à #C4.

Pour chaque bank:
bank 0: %11000100=#C4
bank 1: %11000101=#C5
bank 2: %11000110=#C6
bank 3: %11000111=#C7

En basic vous pouvez donc connecter une bank en tapant simplement (cas pour la bank 0):

OUT &7F00,&C4

En assembleur:

LD BC,#7FC4:OUT (C),C

Pour la déconnexion et remise de la RAM centrale dans son état normal il faudra envoyer (cf schéma): %11000000=#C0

Voila pour la connexion de base. Voyons donc quelques modes spéciaux...

MODES SPÉCIAUX:

Pour ces 3 modes, le bit 2 sera donc à 0

MODE %01:

Voyons le premier: %11ppp001 ou ppp reste le numéro de page de la RAM supplémentaire.

La description nous dit: BANK 3 de la page ppp connectée en #C000/#FFFF.

C'est un cas intéressant. Comme je le disais plus haut les banks se connectent normalement en #4000.
Et bien l'une des exceptions c'est justement la bank 3 de chaque page.
Pour celle-ci nous avons la possibilité de la connecter normalement en #4000, mais aussi via ce mode spécial en #C000.
Et c'est bien pratique quand on doit envoyer par exemple du gfx à un écran situé en #4000 !!!

MODE %10: Flipping total.

Deuxième mode: %11ppp010: page ppp connectée en #0000/#FFFF.

Ce mode peut être très intéressant lorsque l'on veut par exemple utiliser toute la RAM centrale en vidéo.
En effet et pour rappel, le CRTC lui se fout totalement de la configuration de la RAM. Pour lui seule la RAM centrale existe et elle est linéaire.
Ainsi que vous connectiez des banks ou pas, le CRTC l'ignorera et dans tous les cas affichera ce qui se trouve en ram centrale et rien d'autre.

Dans le cas présent, ce mode de flipping total permet de connecter toutes les banks de la page ppp de façon linéaires et qui se suivent.

Ainsi on aura donc:
la bank 0 de la page 0 de ram suplémentaire en #0000
la bank 1 de la page 0 de ram suplémentaire en #4000
la bank 2 de la page 0 de ram suplémentaire en #8000
la bank 3 de la page 0 de ram suplémentaire en #C000

Dans le concept ce n'est pas plus compliqué que cela. Dans l'utilisation ca l'est un peu plus.

Imaginons notre code en #8000.
Lorsque celui-ci va envoyer au GA la sélection du mode flipping total, en #8000 nous aurons immédiatement la bank 2 de connectée...
Plantage assuré sauf si vous avez bien prévu le truc.

L'astuce consiste à mettre votre routine à l'avance en bank 1.
Vous connectez donc la bank 1 de façon normale (#C5). Et vous sautez dans votre code contenu dans celle-ci (JP #4000 par exemple).
Votre routine pourra alors sans soucis passer en flipping total puisque à l’exécution de celui-ci, la bank 1 sera mise en #4000... vous y étiez déjà :)

Attention aussi aux interruptions... n'oubliez pas qu'en standard le Z80 sautera en #0038. Hors cela correspondra à la bank 0 supplémentaire !!!

MODE %11:

Bank 3 de la page ppp connectée en #C000 ET bank 3 de la RAM centrale connectée en #4000 !!!

L'interet de ce mode c'est essentiellement le fait qu'il déplace la bank 3 de la RAM centrale (normalement en #C000) en #4000.

Vous n'y voyez peut-être pas d'interet et pourtant...
L'interet est dans le double buffering !
Vous pourrez n'avoir qu'une seule routine d'affichage fonctionnant en #4000 et d'alterner donc la bank 1 et la bank 3 de la RAM centrale à cet endroit.