ASMtrad CPC

Apprenez l'assembleur Z80

Adresser un périphérique.

Avoir un Z80 c'est bien, mais s'il est tout seul ça ne sert pas à grand chose.

Aussi, celui-ci est donc accompagné de divers périphériques comme le Gate Array; le CRTC ou encore le PPI...

Le but de cet article est d'une part de vous expliquer grossièrement comment fonctionne la chose; puis de vous expliquer comment adresser ces périphériques.

La liste des périphériques existants étant longue, on ne donnera ici que ceux intégrés (oubliez donc les cartes d'extensions).

Adresser un périphérique se fait de deux façons: Soit vous le lisez; soit vous lui envoyez des données.
Il s'agit donc soit de IN; soit de OUT.
Ces opérations sont donc appelées I/O (pour IN/OUT...).

Lors d'une IO, le Z80 place le registre C sur les 8 bits de poids faible du bus d'adresse. B est lui placé sur le poids fort.
Ainsi, le couple BC forme l'adresse du périphérique que l'on souhaite adresser.

Pour chaque périphérique, nous avons donc quelques bits significatifs. Les autres bits seront mis à 1.

Voici donc un schémas de ces quelques ports:

ports cpc

Comme vous pouvez le voir, pour la plupart des ports, seul le poids fort compte. Le registre C est donc libre pour y mettre ce qui vous plait.

Comme je l'ai dit, hormis les bits significatifs, nous avons des bits qui ne sont pas spécifiques au port adressé.
Ceux-ci sont mis à 1 par défaut dans le but de n'adresser qu'un seul périphérique, mais finalement ce n'est pas toujours le cas et le risque est bien d'adresser plusieurs périphériques à la fois.

Imaginons que vous adressiez le Gate Array pour changer vos couleurs.

Vous utilisez donc le port #7F00.

On commencera donc par:LD BC,#7F00:OUT (C),C ;pour sélectionner l'encre 0.

Mais certains voulant faire des splits raster plus courts ont trouvé le moyen d'utiliser l'instruction OUTI.
Cette instruction est bien pratique pour ce cas, car pointe automatiquement sur une table de couleurs qu'elle incrémente en plus à chaque instruction OUTI.

OUI MAIS !!! OUTI décrémente aussi B...

Hors regardons bien:

#7F00: %01111111 : Le GA (et le pal) sont sélectionnés. Tout est OK
#7E00: %01111110 : idem, pas de soucis.
#7D00: %01111101 : toujours rien de spécial.
#7C00: %01111100 : pour l'instant ca marche comme sur des roulettes... Pour l'instant ...
#7B00: %01111011 : tout va bien.
#7A00: %01111010 : OHHHHHH Le lecteur de D7 c'est allumé !!!

Regardons y de plus près...

Le bits 15 et 14 sont à 0 et 1. Le GA est donc bien sélectionné.
Mais regardez les bits 10 et 8: 0 et 0...
Et si on regarde en plus notre registre C, le bit 7 est lui aussi à 0 !!!

Regardez #FA7F: Commande moteur du FDC: bits 10 ; 8 et 7 à 0 !!! On remplis donc bien aussi cette condition !!!

Ainsi, ET le GA ET le FDC sont sélectionnés !!!

C'est un exemple parmi quelques autres. Vous pourrez aussi envoyer à la fois au PSG et à l'imprimante des données par exemple.