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 - conversion de fichier en données ASCII
(Article écrit par Crystal Chip et extrait d'A-News (Amiga News) - juin 1990)
|
|
Bien souvent, dans un source assembleur, on a besoin d'importer des données se trouvant dans un fichier binaire.
Or, le format des données doit être le suivant : dc.x $xxxx..,$xxxx..,$xxxx..,$xxxx.., etc.
C'est pourquoi j'ai écrit cette commande, nommée "data", qui permet la conversion d'un fichier quelconque au
format "dc.x".
Data s'utilise à partir du CLI. Sa syntaxe est la suivante :
Data [>Destination] <FichierSource> <b.w.l>
|
Il est nécessaire de préciser l'extension (en minuscule) : "b" pour "byte", "w" pour "word" et "l" pour "long".
Si l'on ne précise rien d'autre que le fichier et l'extension, la conversion s'effectura sur l'écran. Pour sauver
le résultat de la conversion, il suffit d'employer le symbole de redirection ">" et de préciser le nom du fichier
destination, exemple :
Data >Destination Source w
|
La possibilité de redirection ainsi offerte permet d'accroître la puissance de la routine sans lui ajouter
la moindre ligne de code. On peut ainsi rediriger la sortie sur l'imprimante (pourquoi pas ?), en écrivant :
Attention, dans le cas d'une redirection, si une erreur survient, elle ne sera pas affichée à l'écran, mais dans
le fichier destination ! Que cette commande vous soit utile !
ExecBase = $4
OldOpenLibrary = -408
CloseLibrary = -414
Open = -30
Close = -36
Read = -42
Write = -48
Output = -60
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 OldOpenLibrary(a6) ;Ouveture 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 Inexestant
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 ;Addresse 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) ;sil 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 CloseLibrary(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 OldOpenLibrary(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
FileHandle:
dc.l 0
Data:
dc.l 0
NbOctets:
dc.w 2
Cpt:
dc.w 0
DosLib:
dc.b 'dos.library',0
even
File:
dcb.b 80,0
* blk.b 80,0
even
Nb:
dc.b 0
even
Nombre:
dc.b 8
even
Ligne:
dc.b ' dc.'
Suffix:
dc.b 'w '
Ligne2:
dcb 50,0
Syntaxe:
dc.b 10,'USAGE: data [>Dest_File] ',10,10,0
even
NotFound:
dc.b 10,'File Not Found !',10,10,0
END
|
|