Revenir au plan du site
Instructions d'entrée-sortie
Il est possible de lire ou d'écrire sur un port mémoire. Pour la petite anecdote, sur l'Amstrad CPC, les ingénieurs ont inversés les bits de poids fort avec les bits de poids faible du port d'entrée/sortie par économie, rendant inutilisables toutes les fonctions entrée/sortie de répétition qu'offre le Z80. Le processeur Z80 est conçu pour un design qui utilise le port pointé par le registre C alors qu'Amstrad a créé un design qui utilise le registre B pour pointer le port. Comme les instructions de répétition utilisent le registre B comme compteur, il faut pouvoir réajuster le registre B à chaque itération.
OUT
Le OUT est l'instruction élémentaire pour envoyer une donnée sur un port I/O. Elle ne s'utilise qu'avec les registres 8 bits non spéciaux. Malgré que le CPC utilise un design différent d'exploitation du Z80, la syntaxe assembleur traditionnelle continue de faire référence au registre C mais il faut garder en tête que le CPC est capable de réaliser des I/O sur 16 bits (par exemple pour le FDC ou le moteur du lecteur de disquette).
OUT (C),A
OUT (C),B
OUT (C),C
OUT (C),D
OUT (C),E
OUT (C),H
OUT (C),L
OUT (C),0
OUT (im8),A
|
L'instruction OUT (im8),A envoie la valeur A sur l'adresse formée par A*256+im8, elle n'est utilisable en pratique sur CPC qu'avec la valeur #FF pour limiter les effets secondaires sur les périphériques externes. D'après l'article de Toms dans son article de 64Nops n°1, l'instruction est utilisable pour presque toutes les couleurs (si vous voulez faire des split-rasters de 3 nops au lieu de 4). Évitez d'utiliser les encres Basic 2, 9, 10, 18 et 19 ou en code hardware, les encres #75, #76, #66, #72 et #71!
L'instruction OUT (C),0 est spécifique aux Z80 utilisés dans le CPC et n'est pas compatible avec des modèles CMOS dans lesquels il enverra 255!
OUTI
Cette instruction est une instruction groupée d'envoi de donnée depuis le tableau pointé par HL avec une post-incrémentation.
OUTI ; décrementer B*, envoyer la valeur de (HL) sur le port C, incrémenter HL
|
*Il est important de noter que le registre B est décrémenté AVANT d'envoyer la valeur de (HL) sur le port contrairement à ce qu'on peut le lire dans beaucoup d'ouvrages. L'ordre a une importance car comme sur l'Amstrad le port de sortie est le port B, si on veut envoyer une valeur sur le port B, il faut la pré-incrémenter!
- Le flag P/V est mis à zéro si BC vaut zéro après l'appel à OUTI
OTIR
Cette instruction répète le OUTI tant que B est supérieur à zéro. C'est inutilisable sur CPC.
- Le flag P/V vaut zéro à la fin d'exécution du OTIR
OUTD
Analogue à l'instruction OUTI mais décrémente HL.
OTDR
Analogue à l'instruction OTIR mais décrémente HL et est tout autant inutilisable.
IN
C'est l'instruction élémentaire pour lire une valeur sur le port I/O. Elle ne s'utilise qu'avec les registres 8 bits non spéciaux.
IN A,(C)
IN B,(C)
IN C,(C)
IN D,(C)
IN E,(C)
IN H,(C)
IN L,(C)
IN 0,(C)
IN A,(im8)
|
Les flags sont modifiés en fonction du résultat renvoyé :
- flag S si la valeur lue est négative
- flag Z si la valeur lue est zéro
- flag P si le total des bits de la valeur lue est pair
INI
Cette instruction est une instruction groupée de récupération de donnée vers le tableau pointé par HL avec une post-incrémentation.
INI ; récupérer la valeur du port (C) et la mettre dans (HL), décrémenter B, incrémenter HL, positionner les flags HPNC au besoin
|
- N=1
- flag Z si B vut zéro après décrémentation
IND
Analogue à l'instruction INI mais avec une décrémentation d'HL.
INIR et INDR
Aussi inutilisables que OTIR et OTDR, rien à voir, circulez!