Suivez-nous sur Mastodon

|
|
|
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
|
|
|
|
En pratique : Conseils de programmation du lecteur de disquette Amiga
(Article écrit par Bryce Nesbitt et extrait de ZINE - octobre 1990)
|
|
Attention aux programmeurs du lecteur de disquette
Les règles pour programmer correctement le matériel du lecteur de disquette par Bryce Nesbitt, un
développeur de l'Amiga. Cet article traite de la manière de programmer correctement le matériel
du lecteur de disquette avec quelques exemples en assembleur. Pour plus d'informations sur les
lecteurs de disquette, lisez aussi l'article sur les
conseils utilisation d'un
lecteur de disquette Amiga.
Droit d'auteur 1988 Commodore-Amiga, Inc.
Ces informations sont fournies "en l'état" ; aucune garantie n'est donnée.
Toute utilisation se fait à vos risques et périls. Aucune responsabilité n'est assumée.
La reproduction est autorisée, à condition que cette notice soit conservée.
|
Il existe de très beaux jeux pour Amiga qui ignorent le système d'exploitation et prennent le
contrôle de la machine. Cette pratique est déconseillée, mais autorisée. Certains de ces jeux
utilisent le matériel du lecteur de disquette d'une manière incorrecte. Une telle utilisation
est *non acceptable*.
Pire encore, certains livres publiés par de grands éditeurs préconisent une utilisation incorrecte
du matériel du lecteur de disquette. Dans l'intérêt des vendeurs de logiciels, de Commodore,
des revendeurs, des clients et de l'Amiga, cela doit cesser.
Commodore utilise des lecteurs de disquette fabriqués par plusieurs vendeurs différents. Ces
fournisseurs améliorent ou modernisent souvent leurs gammes de lecteurs de disquette, ce qui rend
généralement les anciens modèles indisponibles. Pour cette raison, il est impossible pour un
développeur de tester tous les types de lecteurs possibles. Pour pouvoir travailler avec ce
large éventail de lecteurs, certaines règles doivent être respectées. Pour simplifier le respect
de ces règles, voici un code source complet et prêt à l'emploi. Trois fonctions sont fournies pour
implémenter correctement les trois opérations du lecteur les plus critiques. Ce code peut être
inséré directement dans un chargeur existant, sans tracas ni désordre.
- MOTORON : met le moteur en marche et attend correctement que le lecteur
atteigne sa vitesse maximale.
- MOTOROFF : éteint et désélectionne tous les lecteurs.
- STEPHEAD : fait avancer la tête, et attend correctement le délai d'attente de
3,0 millisecondes avec n'importe quelle vitesse du processeur.
- TEST : programme de test montrant l'utilisation des fonctions ci-dessus.
* opt l+,c+,w-
;
; Fonctions de bas niveau "prise de contrôle de la machine" du lecteur de disquette.
;
;*** À N'UTILISER QUE LORSQUE VOUS AVEZ PRIS LE CONTRÔLE DE LA MACHINE ***
;
; Écrit par Bryce Nesbitt,
; Commodore-Amiga, Inc.
; Aucun droit d'auteur n'est revendiqué.
;
;*** Fonctions visibles de l'extérieur
XDEF MOTORON ;Met le moteur 0 en marche et attente de READY.
XDEF MOTOROFF ;Arrête tous les moteurs du lecteur.
XDEF STEPHEADS ;Fait avancer la tête du lecteur et attend correctement.
;*** Emplacements des registres d'E/S codés en dur
CIAA_PRA EQU $BFE001 ;Port "A" sur CIA "A"
CIAB_PRB EQU $BFD100 ;Port "B" sur CIA "B"
CIAA_TALO EQU $BFE401 ;Chronomètre A bas
CIAA_TAHI EQU $BFE501 ;Chronomètre A haut
CIAA_ICR EQU $BFED01 ;Registre de contrôle des interruptions
CIAA_CRA EQU $BFEE01 ;Contrôle du chronomètre A
|
;;;;;;; MOTORON ;;;;;;;
;
;Éteint les moteurs des lecteurs 1 à 3, puis active le lecteur 0. Cette fonction
;revient quand l'unité 0 est activée et tourne à pleine vitesse. Si l'unité 0 est
;déjà en train de tourner, cette fonction revient très rapidement. Les lignes de
;direction et les lignes latérales ne sont pas modifiées.
;
MOTORON:
or.b #$F9,CIAB_PRB ;Met la ligne du moteur à l'arrêt, désélectionne tous
;les lecteurs et désactive la ligne STEP.
and.b #$8F,CIAB_PRB ;Sélectionne les lecteurs 1 à 3 pour qu'ils voient
;le réglage de l'arrêt du moteur.
or.b #$70,CIAB_PRB ;Désélectionne les lecteurs 1 à 3
and.b #$7F,CIAB_PRB ;Règle le moteur sur ON. Ceci doit être fait
;*AVANT* de sélectionner les lecteurs !
and.b #$F7,CIAB_PRB ;Sélectionne le lecteur 0. Le lecteur "se souviendra"
;du réglage du moteur, si le moteur était déjà activé,
;rien ne se passe.
motor_wait
btst.b #5,CIAA_PRA ;Vérifie la ligne READY
bne.s motor_wait ;Occupé - attend que le lecteur soit prêt
rts
|
;;;;;;; MOTOROFF ;;;;;;;
;
;Coupe tous les moteurs des lecteurs.
;
MOTOROFF:
or.b #$F8,CIAB_PRB ;Désélectionne tous les lecteurs et met la ligne
;moteur sur OFF
and.b #$87,CIAB_PRB ;Sélectionne tous les lecteurs pour qu'ils voient
;le nouveau réglage du moteur.
or.b #$F8,CIAB_PRB ;Désélectionne tous les lecteurs
rts
|
;;;;;;; STEPHEADS ;;;;;;;
;
;D0 doit contenir zéro pour faire avancer les têtes du lecteur vers l'intérieur,
;et -1 pour faire avancer les têtes vers l'extérieur de la disquette. Les têtes
;se déplacent dans la direction indiquée.
;
;Les têtes fonctionneront dans la direction indiquée. Après le pas, cette fonction
;fonction effectuera une attente indépendante du processeur pour le délai requis de
;3,0 millisecondes. Notez que certains lecteurs de disquette n'ont pas besoin de
;3,0 millisecondes, mais que d'autres en ont besoin. Il n'est pas sûr de sortir un
;produit commercial avec un délai d'attente plus court.
;
;Notez que la ligne STEP doit toujours commencer à l'état haut, être pulsée à l'état
;bas, puis revenir à l'état haut.
;
;En utilisant cette méthode de temporisation et des interruptions, il est
;facile de créer un chargeur qui continue à se charger pendant que votre musique
;de fond est jouée.
;
STEPHEADS:
and.b #2,d0 ;Supprime les bits de déchets
or.b d0,CIAB_PRB ;Définit le registre de direction FIRST
;(essaye d'être un peu lent à propos de l'impulsion de la ligne de pas)
bclr.b #0,CIAB_PRB ;Impulsion basse de la ligne STEP
bset.b #0,CIAB_PRB ;Renvoie la ligne STEP haute
;
;Utilise la puce du chronomètre pour gaspiller 3 millisecondes.
;
;Les fréquences du cristal de base de l'Amiga sont :
; NTSC 28,318181 MHz
; PAL 28,37516 MHz
;Les deux chronomètres 16 bits sur les puces 8520 décomptent chacun à 1/10e
;de l'horloge du processeur, soit 0,715909 MHz. Cela donne 1,3968255
;microsecondes par décompte. En PAL, le compte à rebours est un peu
;plus lent, soit 0,709379 MHz.
;
;Pour attendre 1/100e de seconde, il faudrait attendre 10 ,000 microsecondes.
;Le registre du chronomètre serait réglé sur (10 000/1,3968255=7159).
;
;Pour attendre 3 millisecondes, il faut attendre 3000 microsecondes.
;Le registre serait réglé sur (3000/1,3968255=2148).
;
;Voir le manuel de référence du matériel pour plus d'informations sur les puces 8520.
;----Setup (ne doit vraiment être fait qu'une fois)
move.w #$7fff,$dff09a ;Tue les interruptions de toutes les puces spécialisées
;----Ceci met le chronomètre A en mode "un coup" (one-shot).
move.b CIAA_CRA,d0 ;Met en place le registre de contrôle A
and.b #%000000,d0 ;Ne met pas à la poubelle le drapeau 60/50Hz
or.b #%001000,d0 ;ou les bits de direction série
move.b d0,CIAA_CRA
move.b #%111111,CIAA_ICR ;Efface toutes les interruptions du 8520
;----end setup
;----Set time (octet de poids faible puis octet de poids fort)
move.b #(2148&255),CIAA_TALO ;Masque la partie basse
move.b #(2148>>8),CIAA_TAHI ;Décale la partie haute de 8 bits
;----Attend le compte à rebours du chronomètre
busy_wait: btst.b #0,CIAA_ICR ;Attend le drapeau d'expiration du chronomètre
beq.s busy_wait
rts
|
;;;;;;; TEST ;;;;;;;
;
; Programme de test rapide et sauvage
;
* INCDIR "inc:"
INCLUDE "exec/types.i"
INCLUDE "exec/ables.i"
XREF _LVODisable
TEST: move.l 4,a6
jsr _LVODisable(a6)
bsr MOTORON
moveq #10,d3 ;Dix recherches complètes avant la fin
fullseek:
bset.b #1,CIAB_PRB ;Règle la direction à OUTWARD
moveq #80-1,d2 ;80 pistes
test4 bsr STEPHEADS
btst.b #4,CIAA_PRA ;Vérifie le capteur de la piste 00
dbeq d2,test4 ;Décrémentation et branchement jusqu'à ce que
;EQual ou jusqu'à ce que le compte soit dépassé
moveq #80-1,d2
bclr.b #1,CIAB_PRB ;Règle la direction sur INWARD
test3 bsr STEPHEADS
dbra d2,test3
dbra d3,fullseek
bsr MOTOROFF
fish bra.s fish
;
; Nous avons tué le système d'exploitation, de sorte que ce testeur ne se termine jamais
;
|
|