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 - 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 :

Data >prt: Source w

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



[Retour en haut] / [Retour aux articles]