Obligement - L'Amiga au maximum

Vendredi 06 juin 2025 - 12:16  

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


Réseaux sociaux

Suivez-nous sur X




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,
ALL


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
Pubs pour matériels
Systèmes d'exploitation
Trombinoscope Alchimie 7
Vidéos


Téléchargement

Documents
Jeux
Logiciels
Magazines
Divers


Liens

Associations
Jeux
Logiciels
Matériel
Magazines et médias
Pages personnelles
Réparateurs
Revendeurs
Scène démo
Sites de téléchargement
Divers


Partenaires

Annuaire Amiga

Amedia Computer

Relec


A Propos

A propos d'Obligement

A Propos


Contact

David Brunet

Courriel

 


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 :

Assembleur

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 :
  1. Mettre MTRXD à l'état bas.
  2. Mettre SELxB à l'état bas ("x" est le numéro du lecteur à tester).
  3. Mettre SELxB à l'état haut.
  4. Mettre MTRXD à l'état haut.
  5. Mettre SELxB à l'état bas.
  6. Mettre SELxB à l'état haut.
  7. Mettre SELxB à l'état bas.
  8. Lire et sauver l'état de DSKRDY.
  9. Mettre SELxB à l'état haut.
  10. 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


[Retour en haut] / [Retour aux articles]