Obligement - L'Amiga au maximum

Dimanche 25 août 2019 - 18:11  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

 · Actualité (récente)
 · Actualité (archive)
 · Comparatifs
 · Dossiers
 · Entrevues
 · Matériel (tests)
 · Matériel (bidouilles)
 · Points de vue
 · En pratique
 · Programmation
 · Reportages
 · Quizz
 · Tests de jeux
 · Tests de logiciels
 · Tests de compilations
 · Trucs et astuces
 · Articles divers

 · Articles in english
 · Articles en d'autres langues


Twitter

Suivez-nous sur Twitter




Liste des jeux Amiga

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


Trucs et astuces

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


Glossaire

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


Galeries

 · Menu des galeries

 · BD d'Amiga Spécial
 · Caricatures Dudai
 · Caricatures Jet d'ail
 · Diagrammes de Jay Miner
 · Images insolites
 · Fin de jeux (de A à E)
 · Fin de Jeux (de F à O)
 · Fin de jeux (de P à Z)
 · Galerie de Mike Dafunk
 · Logos d'Obligement
 · Systèmes d'exploitation
 · Trombinoscope Alchimie 7
 · Vidéos


Téléchargement

 · Documents
 · Jeux
 · Logiciels
 · Magazines
 · Divers


Liens

 · Sites de téléchargements
 · Associations
 · Pages Personnelles
 · Matériel
 · Réparateurs
 · Revendeurs
 · Presse et médias
 · Programmation
 · Logiciels
 · Jeux
 · Scène démo
 · Divers


Partenaires

Annuaire Amiga

Amedia Computer

Relec

Hit Parade


A Propos

A propos d'Obligement

A Propos


Contact

David Brunet

Courriel

 


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 par exemple 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

* Offsets des fonctions dos
_LVOExamine		equ	-102
_LVOParentDir		equ	-210
_LVOLock		equ	-84
_LVOUnLock		equ	-90
_LVOWrite		equ	-48
_LVOOutput		equ	-60

* Offset 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


[Retour en haut] / [Retour aux articles]