Entrées/Sorties

Un micro-processeur ne communique pas directement avec l'extérieur. Toutes les entrées/sorties se font par l'intermédiaire de circuits spécialisés qui déchargent ainsi le processeur de certaines tâches. Il existe des circuits spécialisés dans les différents types de connexions : série, parallèle, SCSI, IDE, USB, …. Un circuit pour une connexion série se charge par exemple de surveiller les signaux de la ligne et de le traduire en un octet disponible pour le processeur.

Adressage des circuits d'entrées/sorties

Ces différents circuits résident sur la carte mère et communiquent avec le processeur par l'intermédiaire du bus de donnée. La communication est en général à l'initiative du micro-processeur. Hormis les exceptions, ces circuits se contentent de répondre aux demandes du micro-processeur et d'exécuter ses instructions. Les circuits les plus simples ont généralement un registre de contrôle et un registre de donnée qui peuvent être lus ou chargés par le micro-processeur. Le registre de contrôle permet au micro-processeur de connaître l'état du circuit et éventuellement de le configurer. Le registre de donnée permet l'échange des données en entrée et/ou en sortie. Le micro-processeur lit dans ce registre les données en entrée et y écrit les données en sortie.

Schéma des circuits d'entrées/sorties
Circuits d'entrées/sorties

Afin de répondre aux demandes du micro-processeur, les circuits doivent être sélectionnés par celui-ci. Il existe deux méthodes classiques pour faire cet adressage. La première méthode était plutôt utilisée par les processeurs anciens alors que la seconde est plus fréquente sur les micro-processeurs modernes.

La première méthode consiste à séparer l'adressage de la mémoire et l'adressage des entrées/sorties. En plus du bus de d'adresse, il y a une ligne supplémentaire où le processeur indique s'il s'adresse à la mémoire ou aux circuits d'entrées/sorties. Cette méthode a l'avantage d'augmenter d'une certaine façon l'espace d'adressage. C'est pourquoi les premiers micro-processeurs l'utilisaient car leur espace d'adressage était souvent réduit. Cette méthode a par contre l'inconvénient de nécessiter des instructions spécifiques pour accéder aux circuits d'entrées/sorties.

Schéma d'adressage distinct
Adressage distinct des circuits d'entrées/sorties

La seconde méthode consiste à réserver une partie de l'adressage de la mémoire aux entrées/sorties. On parle d'entrées/sorties en mémoire. Cette méthode réduit donc l'espace d'adressage disponible pour la mémoire mais ce n'est pas gênant sur les micro-processeurs modernes qui disposent d'un (très) large espace d'adressage. Elle permet aussi l'utilisation des instructions de chargement et rangement pour accéder aux circuits d'entrées/sorties et de bénéficier ainsi des différents modes d'adressage. Cette méthode est toujours utilisée sur les micro-processeurs RISC car elle diminue le nombre d'instructions et simplifie le décodage de celles-ci.

Scrutation des circuits d'entrées/sorties

Lorsqu'un circuit d'entrée/sortie a reçu une donnée, le micro-processeur doit venir la lire pour la récupérer. Les buffers de ces circuits sont généralement assez petits. Ceci implique que la donnée doit être lue rapidement. Sinon, des données qui arrivent risquent d'être perdues.

Il existe essentiellement deux méthodes pour éviter que des données soient perdues. La première consiste à faire en sorte que le micro-processeur interroge régulièrement les différents circuits d'entrée/sortie pour savoir si une donnée est disponible. Cette méthode est la plus simple. Par contre, elle utilise beaucoup le micro-processeur même quand il n'a aucune entrée/sortie. La seconde utilise les interruption qui permettent aux circuit d'entrée/sortie de prévenir le micro-processeur lorsqu'une donnée est disponible. Le micro-processeur interrompt alors la tâche en cours pour lire la donnée et la placer dans un buffer en mémoire où elle est mise en attente pour une tâche.

Entrées/Sorties du LC-3

Deux circuits d'entrée/sortie sont adjoints au micro-processeur. Le premier circuit permet de connecter un clavier et le second de le relier à un terminal pour afficher du texte. Chacun de ces circuits peut par exemple être un circuit pour une connexion série.

Le micro-processeur LC-3 utilise des entrées/sorties en mémoire. Deux adresses mémoire sont réservées pour chacun des deux circuits d'entrées/sorties. Une première adresse sert pour le registre de contrôle et une seconde sert pour le registre de donnée.

Un circuit extérieur marqué Logic sur la figure ci-dessous détermine si l'adresse présente dans le registre MAR (Memory Address Register) est une adresse en mémoire ou une adresse d'un circuit d'entrée/sortie. Dans le premier cas, il active la mémoire. Dans le second cas, il active le circuit correspondant à l'adresse.

Schéma des chemins de données du LC-3
Chemins de données du LC-3 avec les entrées/sorties

Lecture et écriture d'un caractère

Lecture

Le circuit pour le clavier utilise l'adresse 0xfe00 pour le registre de contrôle et l'adresse 0xfe02 pour le registre de donnée. Le registre de contrôle permet uniquement de savoir si un caractère est disponible. La valeur du bit de poids fort (numéro 15) de ce registre indique si un caractère est disponible. La lecture de ce caractère se fait alors dans le registre de donnée. La routine ci-dessous effectue une lecture bloquante d'un caractère du clavier.

DEFINE KBSR 4xfe00      ; Registre de contrôle (Status) du clavier
DEFINE KBDR 4xfe02      ; Registre de donnée du clavier

getc:
waitkb: LDI R2,pKBSR
        BRzp waitkb
        LDI R0,pKBDR
        RET


pKBSR: .FILL KBSR       ; Pointeur sur le registre de contrôle
pKBDR: .FILL KBDR       ; Pointeur sur le registre de donnée

Écriture

Le circuit pour l'écran utilise l'adresse 0xfe04 pour le registre de contrôle et l'adresse 0xfe06 pour le registre de donnée. Le registre de contrôle permet uniquement de savoir si le dernier caractère écrit a été envoyé et si le circuit est prêt à envoyer un nouveau caractère. L'envoi d'un caractère sur une ligne série prend un certain temps. Le micro-processeur doit attendre que l'émission d'un caractère soit terminée avant d'en écrire un autre dans le registre de donnée. La valeur du bit de poids fort (numéro 15) du registre de contrôle indique si le circuit est prêt à envoyer. L'émission du caractère est initiée en l'écrivant dans le registre de donnée du circuit. La routine ci-dessous effectue une écriture bloquante d'un caractère sur l'écran.

DEFINE DPSR 4xfe04      ; Registre de contrôle (Status) de l'écran
DEFINE DPDR 4xfe06      ; Registre de donnée de l'écran

putc:
waitdp:
        LDI R2,pDPSR
        BRzp waitdp
        STI R0,pDPDR
        RET

pDPSR: .FILL DPSR       ; Pointeur sur le registre de contrôle
pDPDR: .FILL DPDR       ; Pointeur sur le registre de donnée