CODINGLES COURS DU PROFESSEUR ALI GATOR ★ LES FICHIERS BINAIRES ★

Ali Gator - 05. Les Fichiers Binaires

Voici, tant attendue, la suite que laissait présager l'étude des modes graphiques abordée le mois dernier.

Dans le cadre de notre randonnée sylvestre parmi les divers types de fichiers, intéressons-nous cette fois aux fichiers binaires.

Lorsque l'on sauvegarde un fichier Basic, le programme entier est stocké sur disquette ou cassette, sans que nous ayons à préciser sa longueur et sa localisation. C'est le système d'exploitation qui s'en charge.

Il en est tout autre pour un fichier binaire. En fait, ce n'est pas un programme, mais le contenu d'une partie de la Ram qui est sauvegardée. Très bien, si cette zone contient un programme, tans pis si elle est vide. Le CPC ne fera pas la différence, vous par contre. Donc, avant toute sauvegarde d un programme binaire, il est impératif de connaître sa position de départ et sa longueur Soit une sauvegarde du genre, SAVE “ PROG ", B, &8000, 1024

Le B, indique qu'il s'agit d'un programme binaire, &8000 est l'adresse du premier octet qui sera sauvegardé et 1024 le nombre d'octets du fichier Ainsi sera réalisée la sauvegarde de la partie mémoire comprise entre les adresses &8000 et &8400.

I - Le header

Dans notre exemple, 1024 octets sont conservés, soit 1 ko. Pourtant, le catalogue de la disquette signale 2 ko et non

1 ko. En voici la raison : en plus des 1024 octets qui composent les données du programme, le système a sauvegardé les quelques octets supplémentaires formant le « hea-
der ». Ce principe, utilisé pour tous les types de fichiers, ne se remarque qu'avec le binaire. En Basic ou ASCII en effet, nous n'avons pas une notion précise de la taille. Le header ou en-tète est un peu la carte de visite d'un programme. Ces quelques octets détiennent tous les renseignements concernant le fichier : nom. type, adresses d'implantation, d'exécution. longueur, etc. Lors d'un LOAD. les octets contenant le nom se chargent à partir de &A70A et pour

les autres renseignements. Leur lecture permet au CPC de se configurer en fonction du fichier qu'il charge et aussi de réagir à une éventuelle erreur Comme par exemple le MEMORY FULL sur un fichier binaire lorsque la commande MEMORY n'a pas été correctement fixée.

Les deux catalogueurs que vous trouverez dans la récréation du mois, découlent de la lecture du header. A noter que la sauvegarde sur disquette se contente d'un seul header alors que sur cassette chaque block possède le sien.

II - Implantation modifiable

L'adresse d'implantation d'un fichier binaire est contenue dans l'en-tète mais peut très bien être modifiée lors du chargement. Reprenons notre fichier exemple dont l'adresse d'implantation est &8000 Nous pouvons très bien le char-
ger en &5000 en faisant : MEMORY &4FFE : LOAD "PROG ", &5000 et le tour est joué

Néanmoins, ce type de manipulation doit être faite avec précaution, car rares sont les routines binaires parfaitement relogeables

Confidences intimes

Pour ma part, j'utilise ce système pour des fichiers de sprites. Lors de la création d'un jeu, je stocke les sprites à partir de l'adresse &8000 et les routines binaires en &A000. Durant l'élaboration du logiciel. toutes les modifications sont possibles suivant mes besoins. Lorsque le jeu est fini, il est très rare que l'espace entre &8000 et &A000 soit complet. Pour combler ce vide, j'agis de la sorte :

SAVE " SPRITE ",B. &8000, LG (LG étant la longueur du fichier)

Puis, je le recharge sans faire de RESET par LOAD « SPRITE », &A000 - LG Mon fichier de sprites est venu se coller sous celui de mes routines. Il ne me reste plus qu'à faire la sauvegarde définitive en un seul fichier

SAVE “ LETOUT ”, B, &A000-LG, LGTOTALE Ceci évite les colonnes entières de data remplies de « 00 » que l'on voit dans certains listings.

III - Reloger une routine

Très souvent, la seule solution consiste à réécrire la routine à l'aide d'un Assembleur. Encore faut-il maîtriser le langage machine Cependant, un petit truc sans garantie peut être tenté, à réserver aux routines courtes car les chances de succès sont alors plus importantes. Soit une routine de 100 octets débutant en &A000 à reloger en &8000. Après chargement en Ram. tentez ceci :

10 FOR H = 0 TO 99
20 A = PEEK(&A000 + H):IF A = &A0 THEN A = &80
30 POKE &8000 + H, A : NEXT
40 CALL &8000 : REM pour vérifier si cela marche

Ces quelques lignes recopient chaque octet de la routine un peu plus bas en Ram Ceux qui faisaient référence à une adresse ont été modifiés. Une instruction comme JP &A023 devient JP &8023. En revanche, une instruction comme AND B dont le code est &A0 se trouverait elle aussi modifiée Dans ce cas, le plantage est certifié ? Bref, il s'agit là d'une astuce SGDG (Sans Garantie D'Ali Gator).

IV - Obtenir les datas d'une routine

A la différence d'un fichier Basic listable, un fichier binaire ne l'est qu'avec un désassembleur. Dans une revue, un programme en langage machine à saisir se résume en une longue liste de datas généralement sous forme de codes hexadécimaux. Pour une frappe avec Amsaisie (Micro-Mag n°1), l'appui sur S effectue une sauvegarde binaire, il n'est pas inutile de savoir comment récupérer les codes hexadécimaux

Reprenons, l'exemple de notre routine de 100 octets citée plus haut. Voici la marche à suivre : 10 MODE 2 : MEMORY &9FFF : LOAD « ROUTINE », &A000

20 FOR H = &A000 TO &A000 + 99 :A$ = HEX$(PEEK(H),2) : PRINT A$ ";", ";" : NEXT S'obtiennent ainsi à l'écran les fameux codes hexadécimaux qui composent la routine. A l 'aide de la touche COPY, vous n'aurez aucune difficulté à les insérer dans des lignes de datas (prenez garde à ne pas en oublier) Le chargeur pour recréer la routine avec les datas sera du type :

10 MEMORY &9FFF :FOR H = &A000 TO &A000 + 99
20 READ A$ : POKE H,VAL("&" + A$) : NEXT

Dès lors, une sauvegarde en Basic est possible. La routine binaire devient plus facile à manier. Accès direct à son implantation et sa longueur en ligne 10 et pourquoi pas, une description de son effet en Rem

V - MEMORY et SYMBOL AFTER

Les fichiers Basic et binaires peuvent coexister grâce à la commande MEMORY qui délimite leur espace respectif L'un des impératifs de cette coexistence est que les commandes SYMBOL et SYMBOL AFTER soient lues avant la commande MEMORY . Sinon, c'est IMPROPER ARGUMENT. Celui-ci se produira quand même dès le deuxième RUN. Après la frappe d'un listing, faites RUN. Le programme lit les SYMBOLS, la commande MEMORY, mais bute un peu plus loin sur une ligne présentant une SYNTAX ERROR Après correction, un nouveau RUN provoque invariablement IMPROPER ARGUMENT sur la ligne contenant le SYMBOL AFTER

Tout simplement parce que la commande MEMORY toujours active, empêche les caractères redéfinis d aller se stocker en zone système En fait, c'est un peu plus compliqué, mais il importe seulement de connaître une des astuces qui permet d'y remédier. Si la commande MEMORY est restée active, il en est de même pour les caractères redéfinis. Donc inutile de les relire La solution la plus simple consiste à rajouter juste avant le SYMBOL AFTER, une ligne contenant un GOTO qui permettra un saut par dessus les redéfinitions. Elles ne seront donc plus un problème lors des différents RUN que nécessitent la mise au point du programme. Cette ligne sera bien sûr à supprimer après la mise au point définitive et avant la sauvegarde Après Basic et binaires, resteront les fichiers ASCII à nous mettre sous la dent.

Claude Le Moullec , MICROMAG n°5

★ EDITEUR: MICROMAG
★ ANNÉE: 1989
★ AUTEUR: CLAUDE LE MOULLEC
 

Page précédente : Ali Gator - 03. TAG et les Modes Graphiques

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » Clefs1 14 - Logiciel Interne Generalites
» Coding » Ali Gator - 10. Le nouveau discours de la méthode (Micro-Mag)
» Coding » Ali Gator - 14. Symbol & Symbol After (Micro-Mag)
» Coding Src's » Digitalised Sample Loader (Roudoudou)
» Coding » Ali Gator - 07. Les Fichiers ASCII (MicroMag)
» Coding » La page pédagogique d'hebdogiciel 083: Generalite sur les Routines
Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 565 millisecondes et consultée 901 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.