Retro-ingenierie d'une carte Z80 : partie 5 - test des PIOs
Bonjour à tous,
Il y a de nombreux mois, je récupérais une ancienne centrale téléphonique analogique à base de Z80. La semaine dernière je testais mes premiers programmes assembleur sur cette carte.
Depuis j'ai soudé un support ZIF pour reprogrammer l'EEPROM plus facilement.
Tester un Z80 PIO |
Cet article va se pencher sur les PIOs Z80 (Parallèle IO, Z0842004PSC) pour contrôler des sorties supplémentaires.
La rétro-ingénierie de la carte CPU nous a appris que la plupart des entrées/sorties des modules PIO sont disponibles sur le connecteur P1. C'est pour cela que j'y ai branché les LEDs+résistances (visible en haut de l'image)
Selon la nomenclature utilisée p1.PA2 correspond à:
- p1 correspond au PIO 1
- PA2 correspond au port A, sortie 2
Adresse du PIO
Le PIO se contrôle à l'aide de requête IOReq et donc des instructions assembleur IN/OUT.
Il faut donc identifier les adresses IO pour pouvoir communiquer avec le PIO1.
Adressage de PIO 1 |
Comme l'indique la partie de schéma ci-dessus, les éléments de contrôle du PIO1 sont:
- B/A alimenté avec a0 : permet de sélectionner le port A (LOW) ou port B (HIGH)
- C/D alimenté avec a1 : active le mode Command (HIGH) ou Data (LOW)
- CE alimenté avec _PIO1ce : permet d'activer le PIO sur le bus lorsque CE est LOW.
Activation du PIO
Premièrement, il faut avoir activer le PIO via son signal /CE. /CE (CE barré) indique que le PIO est activé lorsque la ligne est LOW.
Alimenté par la ligne /Y2 du 74HC138N, /Y2 est LOW lorsque ses entrées sont alimentées avec la valeur binaire A2,A1,A0 = 0,1,0 (ou 0b010 en notation Python) équivalent de la valeur décimale 2.
Les 3 entrées A2..A0 du 74HC138 (décodeur 3 vers 8) sont respectivement bits d'adresses a4..a2 . Les bit a5 à a7 sont bien évidemment à LOW. Les a1 et a0 sont attachés au PIO.
L'adresse de base du PIO est 0b00_010_a1,a0 donc 0b0001000 = 8 décimal (0x08 en hexa).
Comme nous utiliserons exclusivement le port A, a0 sera toujours LOW.
Si a1 = LOW alors nous envoyons des données au PIO.
Si a1 = HIGH alors nous envoyons des commandes au PIO.
Nous pouvons finalement définir que:
- PIO1_PortA_DATA= 0b00010100 = 8 = 0x08
- PIO1_PortA_CMD = 0b00010110 = 10= 0x0A
Code assembleur pour PIO en sortie
io.asm
J'ai commencé par définir des constantes dans un fichier séparé pour simplifier la lecture du code assembleur. A noter que les constantes relatives à RCIO font partie des premiers codes assembleurs.
; --- PIO --- ; eg: PIO2_BASE+PIO_PORTB+PIO_CMD PIO1_BASE: equ 0x08 ; Base pour PIO1 PIO2_BASE: equ 0x00 PIO3_BASE: equ 0x0C PIO_PORTA: equ 0x00 ; à ajouter à PIOx_BASE PIO_PORTB: equ 0x01 PIO_DATA: equ 0x00 ; à ajouter à PIOx_BASE PIO_CMD: equ 0x02 ; --- RCIO --- RCIO_OUTPUT: equ 0x1D RCIO_INPUT: equ 0x1C
03_pio.asm
Le programme assembleur 03_pio.asm effectue les opérations suivantes:
- Eteindre toutes les LED de la carte d'extension.
- Envoyer la commande 0x0F vers le PIO1 (port A) pour initialiser le port A en sortie
- Envoyer la donnée 0b00000101 vers PIO1 (port A) pour activer les sortie PA0 et PA2 (toutes les autres sont au niveau bas).
- Enfin activer la LED 7 de la carte d'extension RCIO (nous savons que le programme a terminé son exécution).
- L'instruction halt permet d'arrêter le CPU.
Note: l'instruction include 'io.asm' permet de charger le contenu d'un fichier assembleur dans le fichier en cours d'assemblage.
; 03_pio.asm include 'io.asm' org 0x0000 ; Point d'entrée du Z80 (reset a froid). main: ld a, $00 ; Eteindre toutes les LEDs out (RCIO_OUTPUT), a ld a,$0F ; PIO1 en mode mode 0 (Sortie) out (PIO1_BASE+PIO_PORTA+PIO_CMD),a ; set ld a,%00000101 ; mettre PA0 et PA2 à HIGH out (PIO1_BASE+PIO_PORTA+PIO_DATA),a ld a, $80 ; Allumer LED D7 out (RCIO_OUTPUT),a halt
Ressources
- Mes premiers programmes assembleur
Sur la carte Z80. Sélection du programme d'assemblage, Makefile, transfert sur EEprom. - Les sources assembleurs (GitHub MCHobby)
kicad-public-projects/HASKEL-Z80/Z80-ASM/test/ - Schéma des cartes Z80 (GitHub MCHobby)
kicad-public-projects/HASKEL-Z80/
Manuels Z80-PIO
Faites une recherche Google autour des termes suivants:
- z80 pio technical manual (36 pages)
- z80 pio user=s manual (22 pages)
Écrire un commentaire