Revenir au plan du site

Les ports d'entrée/sortie sur le CPC

On parle souvent d'envoyer une valeur à un port (j'utilise aussi cette expression). Cette expression est correcte. Par contre, quand on parle "du" port de tel ou tel composant, il y a de grandes chances que ça soit faux. On devrait plutôt parler du "port idéal" ou de "un des ports" de ce composant.

Les composants et périphériques réagissent à des état sur leurs broches et le décodage est (à ma connaissance) toujours partiel.

Si vous regardez les trois premiers du tableau (enfin surtout le PAL et la X-MEM), ils ont le même port idéal mais il n'y en a qu'un seul des deux qui contrôle que le bit 8 soit à 1. C'est la différence entre le gestionnaire de mémoire étendue du 6128 (le PAL) et la X-MEM. Le PAL réagira autant au port #7F00 qu'au port #7E00 alors que la X-MEM ne réagira pas au second.

La conséquence directe, c'est que si vous faites un OUT &7F??,&C4, tout le monde va connecter sa page 4 mais la X-MEM va prendre le dessus sur le CPC. Et si vous utilisez un OUT &7E??,&C4, le PAL va réagir, pas la X-MEM et vous pourrez utiliser 512K+64K de mémoire étendue +64K de mémoire centrale.

Bref, les périphériques réagissent à toute adresse qui correspond aux états renseignés dans ce tableau. Les ports "idéaux" ne sont qu'indicatifs et destinés à éviter d'adresser plusieurs périphériques en même temps.

Le CPC décode les ports sur 16 bits (tous les ordinateurs ne font pas ça, coucou l'Oric!) via le registre BC mais les bits du registre C sont réservés aux extensions par convention (le FDC et la commande moteur sont des extensions du CPC). Toutes les extensions sont supposées respecter le bit 10 à zéro , sauf les extensions mémoire puisque...

...puisque sinon aucun accès habituellement utilisé avec le port #7F ne serait fonctionnel. Ceci pour dire que quand aucun bit n'a a être renseigné dans le registre C, vous pouvez vous en servir pour envoyer la donnée et faire un seul LD pour charger "port idéal"+"donnée".

BREF, à moins de vouloir réaliser des optimisations ultra spécifiques, utilisez les ports idéaux sans vous prendre la tête!
Composants et périphériques   Port  
idéal
Bits décodés sur le CPC
  Valeur du registre B     Valeur du registre C  
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
PAL/MMU #7F00 0
Y-MEM #7E00 0 0
X-MEM #7F00 0 1
CRTC sélection de registre #BC00 0 00
CRTC écriture de registre #BD00 0 01
CRTC registre de status (Type 1) #BE00 0 10
CRTC lecture de registre #BF00 0 11
Sélection de la ROM haute #DF00 0
Imprimante / DigiBlaster #EF00 0
PPI port A #F400 0 00
PPI port B #F500 0 01
PPI port C #F600 0 10
PPI registre de contrôle #F700 0 11
FDC registre de status (lecture) #FB7E 0 10 0
FDC envoi de données #FB7F 0 10
FDC réception de données #FB7F 0 10 1
Commande moteur des lecteurs #FA7F 0 00
PlayCity #F88n 1111100 1000rrrr
MultiPlay #F89n 1111100 1 1rrrr
Souris Kempston (Boutons) #FAEF 0 0 0
Souris Kempston (position X) #FBEE 0 1 0 0
Souris Kempston (position Y) #FBEF 0 1 0 1
Les périphériques "externes" doivent respecter le bit 10 à zéro

Vous pouvez trouver plus de définitions de ports/décodages d'adresses sur [ cpcWiki.eu ]