APPLICATIONS ★ SAVE, LOAD, RUN & CO - PARTIE II ★

Edito Save Load Run And Co 2

LES FICHIERS BAK

Reprenez la disquette où vous avez sauvegardé ESSAI.BAS, insérez-la dans le lecteur et tapez LOADM ESSAI" (+ ENTER) pour le charger en mémoire. Cela fait, vous pouvez afficher à l'écran les
lignes de programme par LIST. Au fait, LIST après LOAD ne fonctionne en principe qu'avec les fichiers de type Basic, quoique... Mais n'anticipons pas. Maintenant, tapez à nouveau SAVEMESSAIH (+ ENTER). A quoi ça peut servir de sauvegarder 2 fois le même programme ? C'est qu'entre les 2, aidé par les commandes LIST et EDIT, vous avez la possibilité de compléter et de modifier le programme, en un mot de fractionner vote travail en plusieurs séances de saisie. Là aussi, patience... Faites maintenant CAT. Sur le catalogue affiché apparaissent côte à côte les fichiers ESSAI.BAS et ESSAI.BAK. D'où sort-il, celui-là ? C'est tout simplement la première version du fichier ESSAI, que dans sa grande mansuétude le système a conservé en renommant son extension.

En effet, 2 fichiers portant à la fois le même nom et la même extension ne peuvent coexister sur disque (même si l'extension est celle attribuée par défaut par le système), à l'intérieur d'un même sous-répertoire (USER). Dans ce cas, le fichier existant déjà sur disquette est renommé en fichier BAK (de BackUp, qu'on peut traduire par Archive), et le fichier à sauver le remplace. Si vous sauvez plusieurs fois de suite le même fichier Basic, seule la dernière version figure avec l'extension BAS ; l'avant-dernière porte l'extension BAK, et toutes les précédentes sont effacées, suivant le principe de non-coexistence de 2 fichiers portant exactement la même désignation (No d'USER, nom et extension). A quoi servent donc ces fichiers BAK ? En cas de remords (pas trop tardif, quand même). Si vous vous rendez compte que la dernière version de votre programme est moins bonne que l'avant-dernière, vous chargez t'avant-der-nière version par LOAD"ESSAI.BAK", par exemple ; attention, ici il faut préciser l'extension, sinon c'est l'autre version qui sera chargée. Puis vous la sauvegardez par SAVE"ESSAI". Au catalogue, vous avez toujours ESSAI.BAS et ESSAI.BAK, mais vous avez inversé les 2 versions.

Si ça ne vous paraît pas clair, créez un fichier ESSAI avec la ligne 10 déjà vue. Après sauvegarde, mettez-le à jour en tapant une seconde ligne d'instructions (20) et sauvegardez sous le même nom. Visualisez les fichiers ESSAI.BAS et ESSAI.BAK par LOAD et LIST, puis effectuez la manip proposée, et visualisez à nouveau.

MORCELLEMENT DES FICHIERS

Ces sauvegardes successives, avec effacement automatique de l'avant-avant-dernière version, ne sont pas sans conséquences sur la répartition physique des fichiers sur la disquette.
L'effacement d'un fichier, qu'il soit automatique ou volontaire, via une commande appropriée que je vous
exposerai en temps utile, n'efface en fait rien du tout. Surprenant, non ? Je m'explique : physiquement, l'enregistrement est toujours là. Mais le système l'a marqué d'une manière spéciale : il lui a affecté le numéro d'USER 229, non accessible directement. Cette innoncente manipulation a pour effet :

  • d'empêcher le système de lire le nom du fichier au catalogue,
  • de rendre disponibles les secteurs occupés sur la disquette par le fichier, ainsi que sa place au catalogue. Tant qu'il reste de la place libre sur la disquette (des pistes ou des secteurs vierges), les choses en restent là. Mais dès que le manque de place se fait sentir, le système récupère les secteurs correspondants aux fichiers "effacés* pour les sauvegardes ultérieures. Si les emplacements à récupérer sont plus petits que le fichier à sauvegarder, celui-ci sera réparti sur des secteurs non contigus. Et voilà pourquoi votre fille est muette, et pourquoi vous entendrez parfois parler de fichiers éclatés, ou morcelés.

Une disquette de travail ayant servi à des bidouilles intensives ressemble à un vrai manteau d'arlequin, lorsqu'on l'examine avec la fonction MAPPING ou EXPLORATION d'un gestionnaire de disquettes. Cette fonction vous dessine la "carte" de la disquette, en indiquant ce qui appartient à chaque fichier, piste par piste et secteur par secteur.

Conséquences de tout cela ? Le morcellement des fichiers augmente, vous le comprendrez aisément, les temps de chargement en multipliant les accès à la disquette pour un même fichier.
Je vous donnerai le mois prochain une solution au problème ; en attendant, essayez d'en imaginer une. ce sera très formateur.

LE FORMATAGE

Pour sauvegarder, il vous faut une disquette formatée, comme je vous l'ai appris précédemment. Evitez de vous retrouver dans la situation très désagréable où vous venez de créer
en mémoire un programme ou un dessin d'écran assez conséquent, où vous n'avez plus assez de place sur la disquette de travail, et où vous avez oublié de formater à l'avance votre dernière disquette disponible ! Scénario-catastrophe ? Peut-être, mais ça arrive...
Pour formater une disquette, vous avez l'embarras du choix :
- travailler sous CP/M :

  • routine Disckit 2 sous CP/M 2.2 (sur 664, ou 464 avec lecteur externe),
  • routine Disckit 3 sous CP/M Plus (sur 6128),

- utiliser la fonction formatage de tout gestionnaire de disquettes qui se respecte,
- lancer un utilitaire de formatage publié en listing.

Dans la plupart des cas, le programme de formatage vous demandera :
- le type de format désiré : choisissez DATA, c'est le seul auquel vous aurez affaire pendant longtemps ;
- le nombre de pistes (40 ou 42) ou le N° de la dernière piste (39 ou 41).
La valeur 'classique* est 40 pistes (N° 0 à 39) ; Dlscklt n'en connaît pas d'autre. Mais il est possible d'Inscrire 2 pistes supplémentaires sur vos disquettes, si l'utilitaire peut le faire. Gain de place : 9216 octets en plus, soit 9 k pour le môme prix, ça ne se refuse pas. Mais II y a un hic. C'est que le système d'exploitation de l'Amstrad s'obstine à ne reconnaître que le nombre "classique" de pistes. Qu'à cela ne tienne, il suffit de le prévenir de ces nouvelles dispositions, en lançant le petit programme suivant :

10 OPENOUT"BIDON"
20 POKE &A8A8.&FF
30 POKE &A895,PEEK(&A895)+13
40 CLOSEOUT

Sauvez-le sous le nom INIT (pour INITIallsatlon), et commencez chaque séance de travail par RUN"INIT" après avoir placé dans le lecteur la disquette contenant INIT.BAS.

SAUVONS LES MEUBLES

Vous avez appris le mois dernier que les fichiers existaient en 3 types (Basic, Binaire et ASCII), et que le type ! de fichier était déterminé par la commande utilisée pour la sauvegarde.
Nous avons vu comment sauver dans le type Basic et sous le nom ESSAI la ou les lignes de Basic numérotées contenues en mémoire, par :

SAVE"ESSAI"

(je ne préciserai plus à chaque fols qu'une commande doit être validée par ENTER ou RETURN, maintenant que vous avez compris).

Vous pouvez aussi le sauver dans le type Basic Protégé par la commande :

SAVE"ESSAI",P

Cette commande a pour effet d'empêcher le chargement du programme par LOAD. On peut seulement le lancer par RUN"ESSAI" et on ne peut plus stopper son exécution par un Break (en appuyant 2 fois de suite sur ESC).

Et pourquoi donc ? Parce que sinon II est toujours possible d'examiner le programme avec la commande LIST, et de la modifier avec EDIT ou de le compléter. Pour couronner le tout, ce type de sauvegarde est irréversible avec les moyens dont vous disposez normalement. Pensez donc à sauver aussi ESSAI de la manière normale si vous avez besoin de la mettre à jour par la suite. Merveilleux, direz-vous, voilà mon oeuvre à l'abri des regards indiscrets et des intentions malveillantes. C'est vite dit, car le premier venu disposant d'Ocld Job le déprotègera en quelques secondes...

Le type Binaire, maintenant, un peu plus compliqué. Vous avez tapé un listing de Jeu ou d'utilitaire en Basic, mais constitué presque uniquement de lignes commençant par le mot-clé DATA, suM de codes ésotérlques. Ce genre de programme est un chargeur Basic de codes binaires (ou plus exactement hexadéclmaux). Après sauvegarde classique en Basic, le lancement de ce programme par RUN écrit en mémoire une série de nombres binaires, correspondant à une séquence d'instructions (donc un programme) en langage machine. SI le chargeur Basic ne sauvegarde pas ensuite automatiquement le programme binaire ainsi créé, c'est à vous de le faire dès l'affichage du Ready. Il faut préciser dans la commande :

  • que c'est du binaire (B),
  • l'adresse du chargement (début du code),
  • la longueur du code (en nombre d'octets),
  • facultativement, et seulement si elle est différente de l'adresse de chargement, l'adresse de lancement (point d'entrée du programme).

Exemple : SAVE"BIDULE",B,&A000,&40,&A010

Rassurez-vous, adresses et longueur (en hexadécimal, parfois en décimal) sont toujours précisées avec le programme listé, si ce dernier ne procède pas à la sauvegarde automatique.
Mais il n'y a pas que les programmes en langage machine à être sauvés sous forme de fichiers binaires. Je vous ai dit que les dessins d'écran étalent des fichiers-Images. Une image-écran n'est que la transcription, sous forme de points allumés ou non, de différentes couleurs, de la valeur des octets de la mémoire écran, c'est-à-dire des nombres binaires qui y sont écrits. Voici la commande, toujours la même car adresse de chargement et longueur sont constantes :

SAVE"ECRAN",B,4C0O0,&4000
ou SAVE"ECRAN",B,49152,16384

Il est maintenant possible de définir ce qu'est concrètement une sauvegarde, de type Basic ou Binaire. C'est tout simplement la recopie sur disquette de la portion de la RAM contenant les informations ou les instructions à sauver.

Le système doit savoir à partir d'où, et sur quelle longueur, il doit recopier les octets écrits dans la RAM :

  • pour un programme binaire, début et longueur sont variables. Il faut donc les préciser ;
  • pour une image-écran (codée en binaire dans la RAM écran), il faut quand même préciser le début et la longueur de cette RAM écran, même si ces données sont constantes ;
  • pour un programme Basic, des pointeurs Internes renseignent le système sur les adresses de début (toujours la même) et de fin du programme (dépendant de sa longueur) : il n'y a donc pas à les préciser.

LE TYPE ASCII

D'abord, que représente ce slgle ? ASCII = American Standard Code for Information Interchange, Code Standard Américain pour l'Echange d'Informations. Echange entre machines.
bien sûr. Les systèmes pouvant être différents, il était nécessaire d'uniformiser ta représentation interne des
caractères affichables ou Imprimables (caractères alphanumériques, plus divers signes).
Dans le code ASCII, chacun est codé sur un octet, donc représenté par un code numérique compris entre 0 et 255 en décimal.

Cette standardisation ne porte en fait que sur les codes ASCII 32 à 127. De 0 à 31, il s'agit des caractères de contrôle, qui sont des commandes. Leur effet et leur représentation graphique sont souvent variables d'un système à l'autre. Ils agissent différemment sur un ordinateur et une imprimante. Du code 128 au code 255, c'est une joyeuse anarchie (caractères dits semi-graphiques).
Ainsi, un fichier de type ASCII est un fichier de caractères (donc du texte). C'est une suite d'enregistrements, de 255 caractères chacun au maximum, séparés par des retours-chariot (code ASCII:13).
Dans un fichier texte, chaque enregistrement est une variable alphanumérique correspondant à une ligne de texte.
Dans un fichier de données, un enregistrement correspond à une ou plusieurs variables, alphanumériques et/ ou numériques, pouvant être séparées par d'autres délimiteurs (virgules ou guillemets). Pour les variables numériques, ce n'est pas leur valeur qui est enregistrée, mais sa transcription en chiffres représentés par leurs codes ASCII. Exactement comme lorsque vous écrivez à la main un nombre décimal.
Créer un fichier ASCII, c'est y sauvegarder des variables contenues en mémoire. Il suffit de dire au système d'écrire (PRINT) sur disquette (canal 9) le contenu de telle ou telle variable, en la désignant simplement par son nom, suivi du symbole de son type si ce n'est pas le type de variable par défaut. Dans cette sauvegarde un peu particulière, il faut au préalable ouvrir (OPEN) le fichier en sortie (OUT). C'est à ce moment qu'on indique sous quel nom de fichier doit se faire la sauvegarde. Une fois terminée l'opération d'écriture. Il ne faut pas oublier de refermer (CLOSE) le fichier en sortie (OUT).

Vous avez défini les variables :

  • C$=CHRS(34)+" Flute, un bug" + CHR$(34)+", éructa Olivier", de type chaine de caractères (alphanumérique),
  •  R!=1234.567, de type réel, ou à virgule flottante (numérique) ; attention c'est le point numérique qu'il faut utiliser à la place de la virgule ;
  • E%=458, de type entier (numérique).

Pour les sauvegarder dans le fichier DONNEES de type ASCII, exécutez le programme ECRITURE suivant :

10 OPENOUT"DONNEES"
20 PRINT#9,C$
30 PRINT#9,R!
40 PRINT#9,E%
50 CLOSEOUT

Vous pouvez aussi sauvegarder des constantes (PRINT#9,*BONJOUR" ou PRINT#9,123). Contrairement à ce qu'affirme le manuel, H est déconseillé d'utiliser WRITE#9 pour enregistrer les variables alphanumériques. Le réserver aux variables numériques (léger gain de place).
Dans un fichier ASCII, les variables sont disposées dans l'ordre où elles ont été enregistrées (fichier SEQUENTIEL).

Pour accéder à une variable déterminée. Il faut d'abord lire toutes celles qui précèdent (que l'enregistrement ait eu lieu sur cassette ou sur dlsquette).
La fin du fichier est marquée par le code ASCII 26 (EOF, End Of File), Inscrit par la commande CLOSEOUT. Vous pouvez d'ailleurs remplacer CLOSEOUT par PRINT#9,CHR$(26) ; au lieu de taper CHR$(26), vous pouvez aussi appuyer simultanément sur CONTROL et Z (c'est la même chose).
Notre programme Basic ESSAI peut également être sauvé en ASCII par : SAVE" ESSAI",A
C'est indispensable sur 464 pour pouvoir appliquer à ESSAI les commandes MERGE et CHAIN MERGE ; ça ne l'est plus sur 664 et 6128.

Un programme Basic est enregistré en ASCII exactement comme il se présente à l'écran, sous forme de texte. Ah bon, parce que ce n'est pas comme ça qu'il est sauvé en Basic ? Non mes bons amis, la sauvegarde en Basic recopie la mémoire, et un programme Basic en mémoire n'a pas du tout l'aspect qu'il a à l'écran. Les mots-clés du Basic notamment, sont codés sur un seul octet quelle que soit leur longueur : on appelle ce code un TOKEN Oeton en anglais).

PERMETTONS-NOUS QUELQUES FANTAISIES

Il y a 3 types de fichiers, et 3 types correspondants d'extensions par défaut, plus l'extension BAK, d'accord. Et la liberté d'appeler ses fichiers comme on veut, alors ? Sachez qu'elle
est totale, dans la limite des caractères autorisés et de la longueur maxi permise.
Vous avez parfaitement le droit de sauver, en Basic, le programme Basic ESSAI en lui donnant l'extension BIN ou : Il faut alors clairement le préciser dans la commande.
Plus sérieusement, le libre choix du nom et de l'extension vous permettent :
- de donner à vos fichiers des désignations plus claires. plus mnémoniques (c'est on ne peut plus recommandable) ;
- dans une même application utilisant plusieurs fichiers différents, d^employer :

  • un préfixe ou un suffixe commun dans le nom, séparé par un tiret,
  • le même nom, et des extensions différentes.

La seconde possibilité est à proscrire. En cas de mises à jour portant successivement sur les différents fichiers, vous n'aurez toujours qu'un seul fichier BAK (puisque le nom est le même), et vous pourriez vous en mordre les doigts. Il faut privilégier la première solution : des extensions différentes exprimant la fonction de chaque fichier, c'est très bien, mais les noms aussi doivent être différents (au moins d'un caractère).
Par ailleurs, les extensions "maison" doivent être clairement précisées au chargement ou à l'utilisation des fichiers ainsi sauvegardés.

CHARGEMENT DES FICHIERS EN MEMOIRE

Rappel : les extensions BAS, BIN et espaces sont des INDICATEURS DE TYPE. Si l'extension n'est pas précisée à la sauvegarde, elle est automatiquement donnée par le système, en accord avec le type mentionné dans l'en-tête pour les 2 premières, en l'absence d'en-tête pour la troisième (extension par défaut).
Oui, mais nous avons vu la possibilité d'attribuer à un fichier une extension ne correspondant pas à son type. Que se passera-t-il si nous lançons la commande LOAD"ESSAI" sans préciser d'extension ? Sans se préoccuper le moins du monde du type (mentionné dans l'en-tête, ou exprimé par l'absence d'entêté), une telle commande va rechercher :

  • d'abord le fichier ESSAI.,
  • à défaut, le fichier ESSAI.BAS,
  • à défaut, le fichier ESSAI.BIN.

Le premier fichier trouvé dans cet ordre sera chargé en mémoire. SI c'est un fichier ASCII de texte, vous obtiendrez le message d'erreur "Direct Command Found". Le système considère qu'il pourrait bien s'agir d'un programme Basic sauvé en ASCII, mais ne pourrait bien s'agir d'un programme Basic sauvé en ASCII, mais ne trouvant pas de numéro de ligne. Il proteste contre l'intrusion de 'commandes en mode direct" dans ce "programme". Un fichier de données numériques donnera le message "Line Does Not Exist". Bien sûr que cette ligne de programme n'existe pas !
SI aucun fichier ne correspond à ces 3 désignations. Il vous fait part de sa déconvenue : "ESSAI. Not Found".
Moralité : toutes les autres extensions (y compris BAK) doivent être spécifiées au chargement.

EXECUTION !

Une fols le programme chargé en mémoire. Il faut l'exécuter. SI c'est un programme Basic,1 suffit de taper RUN. S'il s'agit d'un programme Basic sauvé en ASCII, le fait de le charger par LOAD l'a retransformé en Token, Il est donc possible de le tancer par RUN ou de le sauver en Basic, comme si on venait de le taper au clavier. C'est le seul genre de fichier ASCII qu'on peut charger par LOAD, puis afficher par LIST, ou lancer directement par RUN. Il y a là quelque chose de très Important. Vous venez de voir que pour créer un fichier ASCII, il suffit de quelques instructions simples, qui peuvent faire partie d'un programme Basic. Les variables alphanumériques ainsi sauvegardées peuvent très bien être composées d'Instructions Basic diverses, combinées par le programme et précédées d'un numéro. Elles ne présentent donc aucune différence avec des lignes de Basic sauvegardées en ASCII, d'accord ? Dans ce cas, le fichier ainsi créé peut être lancé directement par RUN.

Il est ainsi relativement facile de concevoir un programme :

  • qui crée de toutes pièces des programmes d application indépendants,
  • ou qui s'automodifle, en s'adjoignant automatiquement par CHAIN MERGE les lignes qu'il a créé, et en se sauvegardant lui-même en fin de programme. Fabuleux, non?

L'exécution d'un programme en langage machine se fait par la commande :

CALL

Même chose si c'est une RSX (Résident System extension, ou extension des commandes Basic), mais en plus il faudra, chaque fois qu'on aura besoin de cette commande, la taper ou l'inclure dans le programme Basic associé, précédée de : (ou ù).
Si c'est une Image-écran, le chargement dans la RAM écran affiche l'image aussitôt.
Les programmes en Basic ou en Binaire peuvent également être lancés directement par RUN*nom du fichier". SI l'extension n'est pas précisée, la hiérarchie de recherche est la môme qu'avec LOAD. Pour un programme en langage machine, et contrairement à CALL, l'exécution directe par RUN"fichier.BIN" n'a pas besoin de l'adresse de chargement ou de lancement (elle est indiquée dans l'en-téte).
Si un programme en Basic et un autre en Binaire doivent cohabiter en mémoire (cas des RSX, notamment), il est IMPERATIF d'Isoler la zone de mémoire réservée au Binaire de toute intrusion par les variables du Basic. La commande :

MEMORY UN CLOU CHASSE L'AUTRE, MAIS PAS TOUJOURS...

Le chargement d'un programme Basic par LOAD ou RUN, non seulernent remplace le programme Basic précédent, mais annule également toutes ses variables.

Si vous venez à conserver ces variables, pour les réutiliser dans le programme suivant, il faut placer dans le premier programme la commande :

CHAIN "nom du second programme"

Facultativement, vous pouvez faire suivre la commande du numéro de ligne où doit démarrer le nouveau programme (équivalent d'un GOTO), séparé de la commande par une virgule. Par défaut, le programme est lancé à la première ligne.
En plus des variables, vous avez peut-être aussi envie de conserver tout ou partie du premier programme. Dans ce cas, placez dans celui-ci, à l'endroit adéquat, la commande :

CHAIN MERGE"nom du second programme"

Si dans les deux programmes existent des numéros de ligne identiques, celles du premier sont écrasées.
Comme précédemment, vous pouvez préciser à quelle ligne doit être lancé le programme résultant de la fusion (par défaut, au début). En plus, toujours séparé de la commande par une virgule, vous pouvez préciser un ensemble de lignes du premier programme à supprimer, si elles ne sont pas écrasées par le second. Exemple :

CHAIN MERGE"ESSAI",N° de llgne,DELETE

Attention : si vous utilisez la seconde option (DELETE) et pas la première, vous devez Insérer DEUX virgules entre l'option et la commande.

SAVE, LOAD, RUN & CO , G. DUBUS , CPC Infos n°28

Page précédente : Edito Save Load Run And Co 13 - Differents Types de Fichiers

CPCrulez[Content Management System] v8.7-desktop/cache
Page créée en 105 millisecondes et consultée 1508 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.