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 : AMOS - GetDir, trouver le nom du chemin
(Article écrit par François Lionet et extrait d'Amiga News Tech - janvier 1992)
|
|
Youpie, youpla, voilà la deuxième routinette de Tonton François. La joie m'envahit et me rend tout
fébrile. Quelle excitation !
En arrivant dans le monde de l'Amiga, j'ai pris AmigaDOS en grippe, comme beaucoup de monde.
Il faut dire que la vitesse d'affichage d'un répertoire sur disquette est certainement la plus mauvaise publicité
d'AmigaDOS. Sous prétexte d'une sécurité plus grande des disques (?!? j'ai bousillé beaucoup plus de disquettes
Amiga que PC ou Atari, car elles ont besoin d'être validées !) on est obligé de passer de longues minutes à
écouter le lecteur grincer, en voyant d'afficher trois misérables noms de fichiers à la vitesse d'un escargot
asthmatique.
Si la personne responsable de cet état de fait (le programmeur initial d'AmigaDOS) voyait déferler sur lui le
potentiel de haine accumulée par les millions d'amigaïstes mécontents, il se désintègrerait immédiatement !
Quelle mauvaise publicité, donc, pour AmigaDOS. Mais la lenteur des répertoires n'est qu'une misérable façade,
cachant un système finalement très bien conçu, dont on découvre les finesses avec l'usage, et que l'on se prend
à aimer et finalement à préférer au MS-DOS !
Qui aime bien châtie bien, il reste tout de même quelques points bizarres dans le DOS. Certaines fonctions,
qui semblent pourtant indispensables, sont tout bonnement omises, comme une fonction pour obtenir
le répertoire courant. Il est tout de même primordial de savoir où l'on est pour pouvoir accéder au disque !
Quelle coïncidence, je vous propose aujourd'hui une routinette ramenant le chemin (path) complet, depuis le nom
du disque jusqu'à l'endroit d'où le programme a été lancé.
Le beau programme
Pour appeler la routinette d'aujourd'hui, vous devez :
- Ouvrir la dos.library et mettre son adresse de base dans DosBase.
- Charger A0 avec un nom de chemin pointant sur un fichier quelconque du répertoire dont vous désirez connaître
le cheminement. Une chaîne nulle ramène le nom du chemin courant.
- Charger A1 avec l'adresse d'un tampon mémoire de 128 octets minimum dans lequel sera inscrit le cheminement.
- Appeler la routinette.
Vous remarquerez que j'utilise A5 comme pointeur sur la zone de données. Pourquoi ? Pour faire du code relogeable.
On peut parfaitement utiliser les instructions "relatif PC". Le problème est qu'avec un 68000, ces instructions
ne sont valables que pour l'opérande source. En chargeant A5 avec l'adresse de la zone de données, on peut accéder
en lecture et en écriture à cette zone.
Grands avantages de ce système : plus rapide, plus court (on gagne deux octets par instruction !), réentrant
(il suffit de changer A5 et on change de zone de données). Évidemment, on perd A5, mais bon, il reste tout de
même cinq autres registres...
La belle conclusion
Qui sera aussi très courte : à plus.
*--------------------------------------------------------------------
* Routinette numéro 2
* _GetDir: trouve un nom complet de chemin.
*
* Par François Lionet, paru dans l'A.N.T. du 1er janvier 1992
*--------------------------------------------------------------------
*---------------------- Définition de variables système
* Appel du dos
DosCall MACRO
move.l a6,-(sp)
move.l DosBase-Dt(a5),a6
jsr \1(a6)
move.l (sp)+,a6
ENDM
* decalage des fonctions dos
_LVOExamine equ -102
_LVOParentDir equ -210
_LVOLock equ -84
_LVOUnLock equ -90
_LVOWrite equ -48
_LVOOutput equ -60
* decalage des fonctions EXEC
_LVOOpenLibrary equ -552
_LVOCloseLibrary equ -414
*---------------------- Démonstration
lea Dt(pc),a5 ; Base des donnees
* Ouvre le dos
move.l $4.w,a6
lea DosName-Dt(a5),a1
moveq #0,d0
jsr _LVOOpenLibrary(a6)
move.l d0,DosBase-Dt(a5) ; Une erreur est extrêmement
beq.s Err ; improbable!
* Va demander le chemin
lea PathNul-Dt(a5),a0
lea Buffer-Dt(a5),a1
bsr _GetDir
* Imprime sur le canal standart
move.b #10,0(a0,d0.l) ; Retour à la ligne
addq.l #1,d0
move.l a0,d2 ; Adresse de la chaîne
move.l d0,d3 ; Longueur
DosCall _LVOOutput ; Demande le canal de sortir,
; sans modifier D2 et D3! Astuss!
move.l d0,d1
DosCall _LVOWrite
* Ferme le dos
move.l DosBase-Dt(a5),a1
jsr _LVOCloseLibrary(a6)
* No problemo
Err moveq #0,d0
rts
*---------------------- Routinette
* En entree
* A0= Nom d'un fichier, ou pointeur
* sur une chaîne nulle pour avoir le
* répertoire courant...
* A1= Espace de 128 octets ou poker le nom
* En sortie
* A0= début du tampon mémoire
* D0= longueur de la chaîne
_GetDir
* Preparation des paramètres
movem.l a1-a3/d1-d3,-(sp)
move.l a1,a2 ; A2 est un registre préserve
lea -260(sp),sp ; Reserve un espace de travail
move.l sp,a3 ; en A3
* Demande un lock sur le point d'entrée
move.l a0,d1
moveq #-2,d2
DosCall _LVOLock
* On travaille avec la pile
clr.l -(sp) ; Marque le début
.Gd1: move.l d0,-(sp) ; Pousse le lock
move.l d0,d1 ; Demande le précédent
DosCall _LVOParentDir
tst.l d0 ; On a atteint le premier?
bne.s .Gd1 ; Non: on reboucle!
* Redescend les LOCKS en demandant leur NOM
clr.b (a2) ; Un zéro à la fin
moveq #":",d3 ; Le premier est un disque
.Gd2: move.l (sp),d1 ; On reprend les locks
beq.s .Gd5 ; Si terminé...
move.l a3,d2 ; Poke dans la pile
DosCall _LVOExamine ; Demande le nom!
tst.l d0 ; En cas de problème...
beq.s .Gd4
lea 8(a3),a1 ; On recopie le nom!
.Gd3: move.b (a1)+,(a2)+
bne.s .Gd3
move.b d3,-1(a2) ; Met : ou /
clr.b (a2) ; Marque la fin
moveq #"/",d3 ; Le seul ":" est le premier!
.Gd4 move.l (sp)+,d1 ; Il faut maintenant
DosCall _LVOUnlock ; effacer les locks!
bra.s .Gd2 ; Et on boucle!
* Point de sortie!
.Gd5 lea 260+4(sp),sp ; Efface le tampon mémoire et le "Clr"
move.l a2,d0 ; Fin de la chaîne
movem.l (sp)+,a1-a3/d1-d3 ; Restaure les registres
move.l a1,a0 ; Debut de la chaîne
sub.l a0,d0 ; Taille de la chaîne
rts
*---------------------- Pitite mignone zone de donnée
* La base des accès à la zone de donnée
Dt
DosBase dc.l 0
Buffer ds.b 128
PathNul dc.b 0
DosName dc.b "dos.library",0
even
|
|