★ CODING ★ AMSLIVE ★ AMSLIVE n°15 - PEPE YVES ET MAMI GRECQUE ★ |
AMSLIVE n°15 - PPI / PSG | Coding Amslive |
Je me suis rendu aux meetings et compte que le fonctionnement du couple PPI (8255) / PSG (AY-3-891 2) était mal perçu. Ce qui suit éclairera je l'espère les programmeurs mais aussi ceux désirant mieux savoir comment marche leur machine (le CPC ! Laissez votre épouse tranquile !). Je n'allais pas rater la rédaction d'un article sous protext que je n'ai pas Semword, ni refuser un calembourg venu du tréfond de je ne sais quoi (c'est vraiment trop tréfond). PPI - PARALLELE PORT INTERFACE Grâce à Siou et son gros calumet (NSNN : Je confirme !), vous savez tout du port imprimante. Un latch "gèle" la donnée envoyée sur le bus du Z80, pour la rendre accessible sur le port, quand bien même le bus ne contient plus du tout cette donnée. Eh bien, le PPI effectue en gros le même travail (du moins, dans son mode de fonctionnement 0), sur 3 ports de 8 bits (appelé À, B, et Q. "Seule différence", les ports peuvent aussi se (ire. (NDSNIM : c'est marqué sur leur groin !) Pour déterminer le port désire, on utilisera les adresses #F4xx, #F5xx ou #F6x> respectivement. La commande (sélectior lecture/écriture justement, et choix di mode de fonctionnement) se fait quant à elle via #F7xx. A QUOI CA SERT ? Dans le CPC, le PPI permet d'accéder à plusieurs composants et signaux externes sans électronique de décodage d'adresse supplémentaire. Il s'agit simplement, comme son nom l'indique, d'une interface. Il n'y a aucun protocole particulier à respecter, aucune histoire de validation (dans le mode 0 je reprécise). Dans les contrées de l'ouest oriental, pour endormir les enfants (et les esprits), on raconte une vieille histoire, comme quoi certaines routines mal programmées de test clavier ne répondaient plus sur CPC+. Si la conséquence est réelle (plus de scanning clavier), la faute est à imputer au CPC+ qui émule mal le PPI et non aux routines. Explications : L'état d'une ligne clavier (8 petits bits qui renseignent suri l'état de 8 touches) passe par l'AY-8912 (le processeur sonore, qui joue là le même rôle que le PPI !). L'AY comprend 4 modes de fonctionnement : Un numéro de registre ou une donnée se transmettent via le port A du PPI. Quant au (hou ha !) mode, il se définit grâce aux broches BDIR et BC1 de l'AY, relié aux bits 7 et 6 (respectivement) du port C. Ok? Voici comment charger la donnée Y dans le registre X. 1 - Envoie de X dans port A 2 - BDIR/BC1 3 - BDIR/BC1 4 - Envoi de Y dans port A 5 - BDIR/BC1 6 - BDIR/BC1 Comme on le voit, le cas 00 n'est pas une validation mais un état qui permet de modifier le port A en toute sécurité. Pour scanner une ligne clavier, il faut sélectionner le registre 14, et le lire via le port A, ce qu'on résume ainsi : 1 - Port A 2 - BDIR/BC1 <-1/1 3 - BDIR/BC1 <-0/0 4 - Registre de commande 5 - BDIR/BC1 6 - Lecture du port A. 7 - BDIR/BC1 8 - Reg. corn. Or, lors de l'accès au registre de commande, le PPI met à zéro tous les ports (donc le port C, donc BDIR et BC1). La notice INTEL l'indique en toutes lettres. Cette particularité ne se révèle pas forcément utile, néanmoins elle existe. Les programmeurs se sont aperçus qu'on pouvait négliger les étapes 3 et 7. Ca ne respecte plus tout à fait le timing AY, mais ça marche ! Sur +, le PPI émulé ne fait pas la remise à zéro. S'il n'y a plus l'étape 3, l'AY se trouve toujours en mode "sélection de registre" lorsque le port A est mis en entrée pour le PPI. Or, il reste un court instant aussi en entrée pour l'AY, et une valeur indéterminée est alors prise comme registre. Ainsi, c'est un registre bidon qui est sélectionné, et sa lecture ne donne plus du tout le résultat escompté. SAMPLE COMME BONJOUR ! Le faisceau de la connaissance ayant balayé un mythe de plus, passons maintenant à quelques détails pratiques. Lorsqu'on souhaite envoyer plusieurs données de suite sur le même registre (quand on joue un sample par exemple), on est tenté de laisser PAY en mode écriture, sans le laisser se reposer. Et ça ne fonctionne pas. Là encore, la réponse figure dans la notice du composant : Write Data Puise Width max = 10 us Autrement dit, l'AY ne peut rester en écriture que 10 us. Sinon, il se passe une drôle de chose, que l'on ne pensait rencontrer que dans les jardins enchantés de Puppyland : les autres registres que celui sélectionné se voient petit à petit ANDer avec les données qu'on envoie. Tous les canaux s'ouvrent (mixés avec le générateur de bruit) et votre sample devient tellement dégueulasse que Shap s'en retourne dans sa tombe. Comment ? Shap n'est point décédé ? Ah ! Ca doit être la poste qui fait mal son travail, alors. LA SURPRISE DU CHEF ! Pour vous consoler, voici une astuce permettant de gagner quelques cycles, quand on doit mettre à jour plusieurs registres : — il suffit de passer directement de l'état d'écriture à celui de sélection de registre. Bien zûr, un mauvais registre est alors momentanément sélectionné, mais peu importe, on rétablit en plaçant la bonne valeur. UN DERNIER POUR LA ROUTE ? Je vous sens friands de tous ces détails. Alors voilà une info de plus sur l'AY ; il ne connaît pas la période 0. Pour lui, elle équivaut à une période de 1. Les registres 6 et 11/12 en témoignent. Ainsi donc par conséquent, quand on joue un sample sans fermer le canal sur la voie correspondante, il est proutomixé avec une fréquence (inaudible) de 62.5 kHz. Remarquez, il sera alors joué moins fort. Cette propriété avait déjà été soulignée par Zik. Elle reste valable pour les sons produits par le générateur d'enveloppe. Et pour terminer, le dicton du jour : Quand RAM7 passe à la maison, il en sort toujours quelque chose de bon. LE MOT CLE DU MOIS : Décodage d'adresse : dispositif à base de portes logiques (NON ET, etc) déterminant à partir d'une adresse (binaire) si tel ou tel composant est... adressé.
|