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:

  1. Eteindre toutes les LED de la carte d'extension.
  2. Envoyer la commande 0x0F vers le PIO1 (port A) pour initialiser le port A en sortie
  3. Envoyer la donnée 0b00000101 vers PIO1 (port A) pour activer les sortie PA0 et PA2 (toutes les autres sont au niveau bas).
  4. Enfin activer la LED 7 de la carte d'extension RCIO (nous savons que le programme a terminé son exécution).
  5. 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

Manuels Z80-PIO

Faites une recherche Google autour des termes suivants:

  • z80 pio technical manual (36 pages)
  • z80 pio user=s manual (22 pages)

 

Aucun commentaire