
ExecBase    =  4
OldOpenLib  = -408
CloseLib    = -414
Output      = -60
Write       = -48
Open        = -30
Close       = -36
Read        = -42


Main:
	movem.l	D1-D7/A0-A6,-(SP)	; Sauvegarde des registres
	subq.w	#1,D0
	beq	Erreur			; Erreur : paramètres inexistants
NoSpace:				; Suppression des espaces
	cmpi.b	#32,(A0)+
	bne.s	Param1
	dbf	D0,NoSpace
	bra	Erreur			; Erreur : paramètres insuffisants
Param1:
	lea	File,A1
	subq.l	#1,A0
Found:
	move.b	(A0)+,(A1)+		; Récupération nom du fichier source
	cmpi.b	#32,(A0)
	beq.s	NoSpace2
	dbf	D0,Found
	bra	Erreur			; Erreur : paramètres insuffisants
NoSpace2:				; Suppression des espaces
	cmpi.b	#32,(A0)+
	bne.s	Param2
	dbf	D0,NoSpace2
	bra	Erreur			; Erreur : paramètres insuffisants
Param2:
	move.b	-1(A0),Suffix		; Récupération de l'extension
	cmpi.b	#32,(A0)
	beq.s	Label1
	cmpi.b	#10,(A0)
	bne	Erreur			; Erreur : paramètres invalides
Label1:
	cmpi.b	#'w',Suffix
	beq.s	Label3
	cmpi.b	#'b',Suffix
	bne.s	Label2
	move.b	#12,Nombre		; 12 Données par ligne
	move.w	#1,NbOctets
	bra.s	Label3

Label2:
	cmpi.b	#'l',Suffix
	bne	Erreur			; Erreur : paramètres invalides
	move.b	#5,Nombre		; 5 Données par ligne
	move.w	#4,NbOctets
Label3:
	move.l	ExecBase,A6
	lea	DosLib,A1
	moveq	#0,D0
	jsr	OldOpenLib(A6)		; Ouverture de la Dos Library
	move.l	D0,DosBase
	move.l	D0,A6
	jsr	Output(A6)
	move.l	D0,StdOut		; Adresse de la structure de sortie
	move.l	#1005,D2		; Old Mode
	move.l	#File,D1		; Fichier à ouvrir
	jsr	Open(A6)
	move.l	D0,FileHandle
	beq	NoFile			; Erreur : Fichier Inexistant
	move.w	NbOctets,D2		; Calcul du compteur
	add.w	D2,D2			; de boucle de la
	subq.w	#1,D2			; conversion héxadécimale
	move.w	D2,Cpt			; (2, 4, ou 8 chiffres)
	moveq	#0,D5			; RAZ du compteur de data par ligne
Lecture:
	move.l	FileHandle,D1
	move.l	#Data,D2		; Adresse du tampon de lecture
	moveq	#0,D3
	move.w	NbOctets,D3		; Nb d'octets à lire
	jsr	Read(A6)
	tst.w	D0			; Fin de fichier ?
	beq.s	LastLine		; Oui, c'est la dernière ligne
	move.b	D0,Nb			; Nb d'octets lus
	tst.b	D5			; On entame une nouvelle ligne ?
	bne.s	Suite			; Non !
	lea	Ligne2,A5
Suite:
	move.l	Data,D0			; Donnée à traduire
	bsr	Bin2Hex			; Conversion Binaire -> Hexa
	bra.s	Lecture			; Donnée suivante !

LastLine:
	tst.b	D5			; La dernière ligne est elle vide ?
	beq.s	Sortie			; Oui, alors on sort
	move.b	#10,(A5)+		; Sinon on l'affiche
	move.b	#0,(A5)
	move.w	NbOctets,D2
	subq.l	#1,A5
Boucle:
	cmp.b	Nb,D2			; On complète la dernière
	beq.s	DispLine		; donnée avec des zéros
	move.b	#48,-(A5)		; s'il y a lieu :
	move.b	#48,-(A5)		; par exemple, pour afficher en
	subq.b	#1,D2			; mots longs un fichier au
	bra.s	Boucle			; nombre d'octets impair

DispLine:
	lea	Ligne,A0
	bsr	Affiche
Sortie:	
	move.l	FileHandle,D1
	jsr	Close(A6)
Fin:
	move.l	ExecBase,A6
	move.l	DosBase,A1
	jsr	CloseLib(A6)
	movem.l	(SP)+,D1-D7/A0-A6	; Réinitialisation des registres
	clr.l	D0			; Annulation du drapeau d'erreur
	rts				; Retour au système

Erreur:					; Affichage de la syntaxe
	move.l	ExecBase,A6		; de la commande
	lea	DosLib,A1
	moveq	#0,D0
	jsr	OldOpenLib(A6)
	move.l	D0,DosBase
	move.l	D0,A6
	jsr	Output(A6)
	move.l	D0,StdOut
	lea	Syntaxe,A0
	bsr	Affiche
	bra.s	Fin

NoFile:					; Affichage du message d'erreur
	lea	NotFound,A0		; de fichier non trouvé
	bsr	Affiche
	bra.s	Fin

Affiche:
	move.l	A0,D2
	moveq	#0,D3
NextCar:
	addq.b	#1,D3			; Calcul du nombre de caractères
	tst.b	(A0)+			; de la chaine à afficher
	bne.s	NextCar
	subq.b	#1,D3
	move.l	StdOut,D1
	jsr	Write(A6)		; (file, buffer, length) (D1, D2, D3)
	rts

Bin2Hex:				; (Nombre binaire D0)
	tst.b	D5			; Est-ce la première valeur ? 
	beq.s	NoComma			; Oui, donc pas de virgule devant
	move.b	#',',(A5)+
NoComma:	
	move.b	#'$',(A5)+
	move.l	D0,D1
	move.w	Cpt,D2			; Cpt = 2, 4 ou 8 chiffres
Hexa1:
	rol.l	#4,D1			; Conversion par Quartets
	move.b	D1,D0
	andi.b	#$F,D0
	addi.b	#48,D0
	cmpi.b	#58,D0			; Est-ce un chiffre (0-9) ?
	blt.s	Hexa2
	addq.b	#7,D0			; Non, c'est une lettre (A-F)
Hexa2:
	move.b	D0,(A5)+
	dbf	D2,Hexa1
	addq.b	#1,D5
	cmp.b	Nombre,D5		; La ligne n'est pas complète
	bne.s	Suivant			; donc on continue
	move.b	#10,(A5)+		; Sinon on l'affiche
	move.b	#0,(A5)
	lea	Ligne,A0
	bsr	Affiche
	moveq	#0,D5			; RAZ du compteur de data par ligne
Suivant:
	rts

DosBase:
	dc.l	0
StdOut:
	dc.l	0
DosLib:
	dc.b	'dos.library',0
	even
File:
	blk.b	80,0
FileHandle:
	dc.l	0
Data:
	dc.l	0
Nb:
	dc.b	0
Nombre:
	dc.b	8
NbOctets:
	dc.w	2
Cpt:
	dc.w	0
Ligne:
	dc.b	'	dc.'
Suffix:
	dc.b	'w	'
Ligne2:
	blk.b	50,0
Syntaxe:
	dc.b	10,'  USAGE: DATA [>Dest_File] <File_Name> <b.w.l>',10,10,0
	even
NotFound:
	dc.b	10,'  File Not Found !',10,10,0 
