Suivez-nous sur X
|
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
ALL
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Programmation : Assembleur - Utilisation des CIA pour le lecteur de disquette
(Article écrit par Loïc Far et extrait d'Amiga News Tech - juillet 1991)
|
|
Le Complex Interface Adapter, CIA pour les intimes, n'est pas seulement un super-chronomètre, comme certains
auraient pu le penser suite à notre article du mois dernier. C'est également par lui que
le système contrôle les quatre lecteurs de disquette connectables à l'Amiga.
Bien entendu, notre brave petit CIA ne fait pas tout ; il se contente d'assister le DMA disque, en démarrant
le(s) moteur(s), en déplaçant la tête de lecture/écriture, en choisissant la face active et en fournissant
au système l'état de certaines broches, indispensable au bon fonctionnement du DOS. Ce qui n'est déjà pas si mal.
Le DMA disque se charge, quant à lui, lorsque le lecteur est fin prêt, de la lecture ou de l'écriture
des données. Il est capable de synchroniser la lecture avec un mot de contrôle, appelé "SyncWord",
usuellement égal à $4489, pour garantir l'alignement des données en mémoire. Le type de codage couramment
utilisé est le MFM (comme sur IBM PC ou Atari ST), mais le contrôleur de disquette peut également lire
des disquettes codées en GCR (comme sur l'ancêtre Apple II). Il paraît même qu'il serait capable de
lire des disquettes 5"1/4 Commodore 64, mais je n'ai jamais eu l'occasion de vérifier !
Encore les CIA ?
Ce sont en fait les deux CIA qui participent à cette tâche ; 4 bits du port A du CIA A
(adresse $bfe001, faut-il le rappeler ?) servent d'indicateurs, tandis que carrément 8 bits du
port B du CIA B (adresse $bfd100) contrôlent les lecteurs. Pour simplifier, le CIA A est utilisé
en entrée et le CIA B en sortie.
Les tableaux donnés le mois dernier ne faisaient que rapidement état de ces bits ; les voici
à nouveau, en plus détaillé pour le propos qui nous intéresse.
CIA A, port A ($bfe001). Utilisé en entrée
Bit |
Nom |
Fonction |
5 |
RDY |
Disk Ready. Ce bit passe à 0 quand le moteur du lecteur sélectionné tourne à sa pleine vitesse. |
4 |
TRACK0 |
Track Zero Detect. Ce bit passe à 0 quand la tête de lecture/écriture est positionnée sur la piste 0. |
3 |
WPRO |
Write Protected. Ce bit passe à 0 si la disquette présente dans le lecteur est protégée en écriture |
2 |
CHNG |
Disk Change. Ce bit passe à 0 quand on retire la disquette du lecteur. Il ne repasse à 1 que lorsque
qu'une disquette est à nouveau insérée et qu'une impulsion STEP a été transmise. |
CIA B, port B ($bfd100). Utilisé en sortie
Bit |
Nom |
Fonction |
7 |
MTR |
Disk Motor Control. Voir note 1. |
6 |
SEL3 |
Sélectionne le lecteur 3 (DF3:) si présent. |
5 |
SEL2 |
Sélectionne le lecteur 2 (DF2:) si présent. |
4 |
SEL1 |
Sélectionne le lecteur 1 (DF1:) si présent. |
3 |
SEL0 |
Sélectionne le lecteur 0 (DF0:) si présent. |
2 |
SIDE |
Sélectionne la face. Voir note 2. |
1 |
DIR |
Sélectionne la direction de déplacement de la tête. Voir note 3. |
0 |
STEP |
Envoie une impulsion de déplacement à la tête. Voir note 4. |
Tous ces signaux, exceptés SIDE et DIR, sont actifs à l'état bas (0).
Note 1 : ce signal est un peu particulier ; il n'a pas d'action immédiate, mais n'est reçu
par le lecteur que lorsque celui-ci est sélectionné par SEL3-SEL0. De fait, pour démarrer ou
arrêter le moteur d'un lecteur donné, il faut d'abord positionner MTR selon l'opération choisie
puis sélectionner le lecteur en question.
Note 2 : SIDE doit être maintenu pendant 100 microsecondes avant une opération d'écriture,
et pendant au moins 1,3 milliseconde entre une écriture et un changement de face. 0 sélectionne
la face supérieure, 1 la face inférieure.
Note 3 : 0 sélectionne un déplacement vers le centre du disque (la piste 0 est située à
l'extérieur du disque). Ce signal doit être mis avant l'impulsion STEP. Deux instructions du
microprocesseur sont donc nécessaires.
Note 4 : l'impulsion STEP doit toujours être rapide : inactif, actif, inactif. Les
lecteurs Amiga se déplacent d'une piste à l'autre en un maximum de 3 millisecondes. D'autres
lecteurs peuvent être plus rapides, d'autres encore plus lents. Lors d'un changement de direction,
un minimum de 18 millisecondes est nécessaire entre les deux impulsions STEP.
Attention : messieurs les démomakers, soyez sympas, pensez à ceux qui ont un tout petit peu gonflé
leur Amiga ! Avec ma 68020 de compétition, les trois-quarts des démos en chargement par piste
(track-loading) refusent de tourner sur mon ordinateur, simplement parce que les délais logiciels
(décrémentation d'un compteur) s'exécutent plus rapidement ! Vous avez quatre chronomètres
à votre disposition dans les CIA, utilisez-en au moins un pour régler les différents délais
nécessaires à la mécanique...
Petits exemples rapides
Pour tous ces exemples, on considère qu'a5 contient l'adresse de base du CIA B,
et a4, celle du CIA A. Je vous conseille, pour des raisons de lisibilité, d'utiliser les
labels définis dans "hardware/cia.i" et de laisser Devpac supprimer pour vous les
décalages inutiles (Cf. ciapra qui est égal à 0).
Démarrage du moteur de DF0: :
Arrêt du moteur de DF0: :
Recherche de la piste 0 du lecteur sélectionné :
Avance la tête de lecture dans la direction indiquée par DIR :
Produit un délai suffisamment grand entre deux STEP. Totalement en désaccord avec ce
que j'ai dit plus haut, cette petite routine utilise un délai logiciel, alors qu'il
faudrait programmer un chronomètre (timer) pour trois millisecondes.
Teste si le lecteur sélectionné est prêt à lire ou à écrire :
La place étant limitée, vous retrouverez toutes ces routines, ainsi que d'autres,
dans le programme d'exemple du prochain numéro. Nous en profiterons pour programmer
un véritable délai totalement compatible, en utilisant nos connaissances sur les
chronomètres du CIA, engrangées le mois dernier. D'ici là, essayez de vous documenter
sur le codage MFM, vous verrez, ce n'est pas triste.
|