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 - Test-Disks
(Article écrit par François Braün et extrait d'Amiga News Tech - février 1992)
|
|
Trop de mégadémos et de jeux sur plusieurs disquettes assument encore que seul le lecteur
DF0: est présent, alors que la plupart des possesseurs d'Amiga ont également au moins un second lecteur.
Pourtant, les ROM Kernel Manuals donnent le moyen de détecter directement, en interrogeant le matériel, le
nombre de lecteurs présents et surtout leur numéro (rappel : sur un A2000, le premier lecteur externe est DF2:
et non DF1:). Enfin, quand je dis "donnent le moyen", c'est un bien grand mot : les explications sont succinctes
(NDLR : et boggées, c'est tout de même un comble !) et aucune routine n'est présentée. Le petit programme qui suit
rattrape ce manque.
Ce que disent les RKM
D'après l'Amiga Hardware Reference Manual (Revised Edition), page 311, je cite : "un mode d'identification est
prévu pour lire un flux d'identification sériel 32 bits depuis un périphérique externe. Pour initialiser ce
mode, le moteur doit être mis en marche, puis arrêté (...). Le signal SELxB doit être inactif. Maintenant,
entrez dans une boucle dans laquelle vous activez SELxB, lisez RDY (broche 1) et désactivez SELxB. Bouclez 32
fois pour lire 32 bits de données. Le bit le plus significatif est reçu en premier." Pas génial, comme explication...
Mais en cherchant un peu plus loin, page 357 exactement, on trouve une seconde description de ce mode d'identification,
un peu plus étoffée. On y apprend que le code d'identification (ID) n'est plus sur 32 bits mais sur 16, et qu'il
y a 9 étapes à suivre pour le trouver. Enfin, on y trouve une table des ID possibles :
Cette fois-ci, la description de la marche à suivre est correcte, mais les ID sont faux (du moins les deux premiers,
je n'ai pas le matériel nécessaire pour tester les autres) : on trouve $ffff pour un lecteur Amiga 3" standard et
$0000 si aucun lecteur n'est connecté. Si quelqu'un parmi vous possède un lecteur 5" ou un lecteur haute
densité, je serais curieux de connaître leur ID.
Ce qu'il faut faire
La démarche pour le test d'identification est donc la suivante :
- Mettre MTRXD à l'état bas.
- Mettre SELxB à l'état bas ("x" est le numéro du lecteur à tester).
- Mettre SELxB à l'état haut.
- Mettre MTRXD à l'état haut.
- Mettre SELxB à l'état bas.
- Mettre SELxB à l'état haut.
- Mettre SELxB à l'état bas.
- Lire et sauver l'état de DSKRDY.
- Mettre SELxB à l'état haut.
- Répéter les pas 6 à 9 seize fois en tout.
Arrivé ici, un petit rappel des signaux n'est peut-être pas superflu :
- MTRXD : bit 7 du port B du CIA B ($bfd100).
- SEL3B : bit 6 du port B du CIA B ($bfd100).
- SEL2B : bit 5 du port B du CIA B ($bfd100).
- SEL1B : bit 4 du port B du CIA B ($bfd100).
- SEL0B : bit 3 du port B du CIA B ($bfd100).
- DSKRDY : bit 5 du port A du CIA A ($bfe001).
Le programme qui suit met en oeuvre le mode d'identification des lecteurs. La routine TestDisks
attend un seul paramètre : un tampon mémoire de 4 mots pointé par A0, dans lequel elle placera
l'ID de chacun des quatre lecteurs au maximum qu'il est possible de connecter à l'Amiga. Elle est
directement utilisable telle quelle et ne modifie aucun registre du 68000. Cette routine est compatible
avec tous les modèles d'Amiga passés et présents (on ne parie jamais sur l'avenir !) et avec
toutes les versions du Workbench (y compris le 2.0).
J'espère que cette routine aidera les programmeurs de jeux et de mégadémos à prendre en compte tous les
lecteurs qui peuvent être connectés à l'Amiga (et pas seulement DF0:) et qu'à l'avenir, leurs oeuvres
se débrouilleront toutes seules comme des grandes pour savoir d'où charger la suite du programme...
*******************************************************************
* TestDisks.s *
*******************************************************************
* Interroge le matériel pour connaître le nombre de lecteurs de *
* disquettes présents. *
*******************************************************************
* Par François Braün (Altaïr) pour Amiga NewsTech (ANT) *
*******************************************************************
* Assembler avec Devpac 2 *
*******************************************************************
opt o+,ow-,c+
INCDIR include:
INCLUDE exec/exec_lib.i
INCLUDE libraries/dos_lib.i
*******************************************************************
Demo lea DOSName(pc),a1 ; Ouvre la dos.library
moveq #0,d0 ; pour pouvoir écrire dans
move.l 4,a6 ; la fenêtre CLI courante
jsr _LVOOpenLibrary(a6)
move.l d0,d7
beq Sortie
move.l d0,a6
jsr _LVOOutput(a6)
move.l d0,d6
lea Buffer(pc),a0 ; tampon mémoire de 4 mots
bsr.s TestDisks ; Teste les lecteurs présents
lea Buffer(pc),a2 ; Affiche le tampon mémoire
moveq #3,d4 ; 4 lignes à afficher
Affiche lea OuiTxt(pc),a0
tst.w (a2)+
bne.s Oui
lea NonTxt(pc),a0
Oui moveq #'3',d0 ; Place le n° du lecteur
sub.b d4,d0 ; dans la chaine ASCII
move.b d0,2(a0)
move.l d6,d1 ; Affiche la phrase correspondante
move.l a0,d2 ; à l'état du lecteur
moveq #13,d3 ; (présent ou absent)
jsr _LVOWrite(a6)
dbra d4,Affiche ; Boucle pour tous les lecteurs
move.l d7,a1 ; Referme la dos.library
move.l 4,a6
jsr _LVOCloseLibrary(a6)
Sortie moveq #0,d0 ; Retour au CLI
rts
Buffer dc.w 0,0,0,0 ; 1 mot par lecteur possible
even
DOSName dc.b "dos.library",0
even
OuiTxt dc.b "DFx: présent",10
even
NonTxt dc.b "DFx: absent ",10
even
*******************************************************************
TestDisks:
movem.l d0-d3/a1,-(sp) ; Sauve les registres utilisés
addq.l #8,a0 ; a0 = fin du tampon mémoire parce qu'on
; teste en sens inverse (de 3 à 0)
lea $bfd100,a1 ; a1 = CIAB-PRB
moveq #2,d0 ; 3 lecteurs à tester (DF3: à DF1:)
TstDsks move.b d0,d1
addq.b #4,d1 ; d1 = bit pour DSKSELx (4 à 6)
bclr #7,(a1) ; DSKMOTOR low
bclr d1,(a1) ; DSKSELx low
bset d1,(a1) ; DSKSELx high
bset #7,(a1) ; DSKMOTOR high
bclr d1,(a1) ; DSKSELx low
moveq #0,d2 ; d2 = ID
moveq #15,d3 ; 16 tests (1 mot)
TstLoop lsl.l #1,d2
bset d1,(a1) ; DSKSELx high
bclr d1,(a1) ; DSKSELx low
btst #5,$f01(a1) ; = $bfe001 = CIAA-PRA = DSKRDY
bne.s TstNext
bset #0,d2 ; Met le bit dans l'ID
TstNext bset d1,(a1) ; DSKSELx high
dbra d3,TstLoop ; Boucle pour les 16 bits
move.w d2,-(a0) ; Place l'ID dans le tampon mémoire
dbra d0,TstDsks ; Boucle pour les 3 lecteurs
move.w d0,-(a0) ; DF0: est toujours présent !
; Et miracle, a0 pointe à nouveau
; le début du tampon mémoire !
movem.l (sp)+,d0-d3/a1 ; Récupère les registres
rts
*******************************************************************
END
|
|