★ CODING ★ CLASSEURS WEKA ★ Comment exploiter toutes les ressources et augmenter les performances de votre AMSTRAD CPC ★ |
4/1.6.6 - Accélérez vos programmes Basic Les tokens (15e Complément) | Coding Classeurs Weka |
4/0 - Langages du CPC4/1.6 - Basic approfondi 4/1.6.6 - Accélérez vos programmes Basic Les tokens Vous le savez tous, le langage de programmation Basic n'est pas la Formule 1 des langages existants. Ceux qui désirent écrire des programmes performants, en vitesse d'exécution, ce qui est le cas pour bon nombre de jeux d'arcades, de programmes de tri de données, ou de gestion graphique, se sont vite heurtés à la lenteur du Basic. Beaucoup se sont alors intéressés aux langages compilables auxquels le système d'exploitation CP/M leur permet d'accéder : TURBO-PASCAL et C-BASIC. D'autres, au vu des faibles possibilités graphiques de ces langages, ont dû recourir à l'assembleur. Outre une mise en œuvre plus fastidieuse (il faut d'abord charger CP/M, appeler ensuite le langage, puis compiler, et enfin revenir à CP/M pour lancer le programme créé), ces programmes demandent une étude structurée qui peut sembler rebutante à certains, surtout à ceux qui ont une expérience de longue date sur Basic. Nous allons dans ce chapitre vous proposer des trucs, des commandes et un programme qui vous permettront d'accélérer les performances des vôtres. Hormis les quelques trucs utilisables sur tous CPCs, il vous faudra néanmoins posséder une unité de disquette pour l'utilisation du programme que nous avons dénommé "ANTI-REM”. Préambule Votre première impression après avoir lu les lignes précédentes est peut-être de vous demander pourquoi nous n'avons pas utilisé toutes les astuces que nous détaillerons dans les paragraphes suivants (élimination des espaces inutiles au fonctionnement, des instructions REM ou '). Sachez que c'est tout d'abord dans un esprit de clarté que nous introduisons parfois des espaces, séparant le nom d'une variable d'un opérateur. Il en est de même dans les noms des variables, quelquefois longs, mais certainement plus significatifs que l'utilisation de la suite A1, A, A3, ..., B$, C$, ... n'ayant pas de rapport avec l'affectation qui leur sont données. Notre souci est aussi de vous permettre de relire et d'étudier plus facilement les programmes que nous vous proposons. I. Basic-Tortue Le langage Basic est lent parce que c'est un langage interprété. Sans nous étendre sur le fonctionnement précis de l'interpréteur Basic de votre Amstrad, sachez que chaque ligne d'un programme, avant exécution, est traduite par les logiciels des ROMs. Chaque instruction est étudiée puis comparée aux instructions en ROM, les variables sont lues une à une pour reformer leur nom qui sera ensuite recherché dans la RAM, éventuellement créé s'il n'existe pas, etc. Même dans une boucle, tout ce processus est réitéré à chaque passage ainsi dans les lignes : 10 WHILE A < 10000 |
octet | 08 | 00 | 0A | 00 | AD | 20 | 10 | 00 |
adresse | &170 | &171 | &172 | &173 | &174 | &175 | &176 | &177 |
où 08 00 indique le nombre d'octets comportant la ligne, y compris ces deux valeurs (à remettre dans l'ordre : 0008), 0A00 est le numéro de la ligne (retranscrit en inversant : 000A = 10), AD est le code de MODE (voir le tableau ci-après), 20 l'espace, 10 le code de la constante 2 et 00 signalant la fin de la ligne. Ensuite débute la ligne suivante sous le même principe.
Vous pourrez remarquer que pour le nom des variables, il est ajouté la valeur &80 à la valeur ASCII de la dernière lettre.
Vous pouvez ainsi modifier directement le contenu d'une ligne, par exemple en remplaçant le token AD de MODE, en position &174 par le token de PAPER: &BA. Frappez :
et admirez le résultat.
Il est même possible de modifier un numéro de ligne en pokant à l'adresse &173 ou & 172 une autre valeur. Si vous listez, vous aurez la surprise de constater que le numéro de ligne est modifié, par contre sa position est identique.
Nous vous fournissons ci-dessous la liste des tokens utilisés par l'interpréteur Basic, pour vous permettre d'approfondir le sujet.
Grâce à un désassemblage de la ROM du CPC 6128, nous avons retrouvé la liste des tokens Basic de ce modèle, qui ne doivent pas différer des autres, à part les quelques instructions supplémentaires.
80 | AFTER | 81 | AUTO | 82 | BORDER |
83 | CALL | 84 | CAT | 85 | CHAIN |
86 | CLEAR | 87 | CLG | 88 | CLOSEIN |
89 | CLOSEOUT | 8A | CLS | 8B | CONT |
8C | DATA | 8D | DEF | 8E | DEFINT |
8F | DEFREAL | 90 | DEFSTR | 91 | DEG |
92 | DELETE | 93 | DIM | 94 | DRAW |
95 | DRAWR | 96 | EDIT | 97 | ELSE |
98 | END | 99 | ENT | 9A | ENV |
9B | ERASE | 9C | ERROR | 9D | EVERY |
9E | FOR | 9F | GOSUB | A0 | GOTO |
A1 | IF | A2 | INK | A3 | INPUT |
A4 | KEY | A5 | LET | A6 | LINE |
A7 | LIST | A8 | LOAD | A9 | LOCATE |
AA | MEMORY | AB | MERGE | AC | MID$ |
AD | MODE | AE | MOVE | AF | MOVER |
B0 | NEXT | B1 | NEW | B2 | ON |
B3 | ON BREAK | B4 | ON ERROR | B5 | ON SO |
B6 | OPENIN | B7 | OPENOUT | B8 | ORIGIN |
B9 | OUT | BA | PAPER | BB | PEN |
BC | PLOT | BD | PLOTR | BE | POKE |
BF | C0 | ' | C1 | RAD | |
C2 | RANDOMIZE | C3 | READ | C4 | RELEASE |
C5 | REM | C6 | RENUM | C7 | RESTORE |
C8 | RESUME | C9 | RETURN | CA | RUN |
CB | SAVE | CC | SOUND | CE | STOP |
CF | SYMBOL | D0 | TAG | D1 | TAGOFF |
D2 | TRON | D3 | TROFF | D4 | WAIT |
D5 | WEND | D6 | WHILE | D7 | WIDTH |
D8 | WINDOW | D9 | ZONE | DA | WRITE |
DB | DI | DC | EI | DD | FILL |
DE | GRAPHICS | DF | MASK | E0 | FRAME |
E1 | CURSOR | E2 | non défini | E3 | ERL |
E4 | FN | E5 | SPS | E6 | STEP |
E7 | SWAP | E8 | non défini | E9 | non défini |
EA | TAB | EB | THEN | EC | TO |
ED | USING | EE | > | EF | = |
F0 | > = | F1 | < | F2 | < > |
F3 | < = | F4 | + | F5 | |
F6 | * | F7 | / | F8 | |
F9 | \ | FA | AND | FB | MOD |
FC | OR | FD | XOR | FE | NOT |
FF 00 | ABS | FF 01 | ASC | FF 02 | ATN |
FF 03 | CHR$ | FF 04 | CINT | FF 05 | COS |
FF 06 | CREAL | FF 07 | EXP | FF 08 | FIX |
FF 09 | FRE | FF 0A | INKEY | FF 0B | INP |
FF 0C | INT | FF 0D | JOY | FF 0E | LEN |
FF 0F | LOG | FF 10 | LOG10 | FF 11 | LOWER$ |
FF 12 | PEEK | FF 13 | REMAIN | FF 14 | SGN |
FF 15 | SIN | FF 16 | SPACE$ | FF 17 | SQ |
FF 18 | SQR | FF 19 | STR$ | FF 1A | TAN |
FF 1B | UNT | FF 1C | UPPER$ | FF 1D | VAL |
FF 1E à FF 3F NON AFFECTES | |||||
FF 40 | EOF | FF 41 | ERR | FF 42 | HIMEM |
FF 43 | INKEY$ | FF 44 | PI | FF 45 | RND |
FF 46 | TIME | FF 47 | XPOS | FF 48 | YPOS |
FF 49 | DERR | FF 4A à FF 70 NON AFFECTES | |||
FF 71 | BIN$ | FF 72 | DEC$ | FF 73 | HEX$ |
FF 74 | INSTR | FF 75 | LEFT$ | FF 76 | MAX |
FF 77 | MIN | FF 78 | POS | FF 79 | RIGHT$ |
FF 7A | ROUND | FF 7C | TEST | ||
FF 7D | TESTR | FF 7F | VPOS |
En plus de ces tokens concernant les instructions, on trouve les tokens signalant les fins de blocs d'instructions, les variables, les constantes, les valeurs de tout type, et fin de ligne :
00 fin de ligne
01 fin de bloc d'instruction
02 variable entière suivie du nom codé en ASCII (plus &80 pour le code ASCII du dernier caractère)
03 variable de caractère (identique à ci-dessus)
04 variable réelle (identique à ci-dessus)
0D variable non définie (identique à ci-dessus)
0E chiffre 0
0F chiffre 1
10 chiffre 2
11 chiffre 3
12 chiffre 4
13 chiffre 5
14 chiffre 6
15 chiffre 7
16 chiffre 8
17 chiffre 9
18 non défini
19 valeur sur un octet suivi de la valeur
1A valeur décimale (2 octets)
1B valeur binaire (2 octets)
1C valeur hexadécimale (2 octets)
1D adresse de ligne
1E numéro de ligne
1F valeur en virgule flottante (5 octets)
Remarques :
Les tokens &1D et &1E :
Lorsque vous entrez une ligne du type :
le renvoi à la ligne 20 est codé une première fois par le numéro de ligne en hexadécimal (on trouvera donc le code &1E le précédant). Puis, lors d'une exécution, l'interpréteur recherche la position de la ligne dans la mémoire, puis remplace le numéro de ligne par son adresse effective, ce qui permettra d'accélérer ensuite l'exécution. Il signale l'adresse en remplaçant le code &1E par le code &1D.
Lors d'un listing, d'une insertion de ligne, ou d'une destruction, il lui sera ensuite facile de retrouver le numéro de ligne, puisqu'il se trouve en troisième et quatrième position à partir de l'adresse.
La sauvegarde ASCII
Sachant, que, lorsque vous sauvegardez le programme Basic sous la forme habituelle :
vous comprendrez après toutes les explications précédentes qu'il va devenir fastidieux de traiter tous ces tokens. De plus l'utilisation de l'instruction :
pour récupérer les codes provoque le message d'erreur :
File type error
La solution est de sauvegarder le fichier sous sa forme ASCII, c'est-à-dire caractère par caractère par la commande :
III. La bonne utilisation des variables
Une première modification possible, mais manuelle, vous permettra de gagner en vitesse d'exécution, notamment dans les boucles de type FOR ... NEXT, WHILE ... WEND et dans les sous-programmes souvent appelés par GOSUB ou ON GOSUB...
Il vous faudra manuellement repérer les variables qui sont utilisées dans le format ENTIER, c'est-à-dire qui ne comporteront que des valeurs de - 32768 à + 32767. Vous pourrez alors les définir de type ENTIER par l'instruction :
DEFINT liste de variables
Par la même occasion, repérer les variables réelles et chaîne de caractères que vous définirez par :
DEFREAL et DEFSTR.
Si cela est possible, utilisez des noms de variables courts, car le programme les relit entièrement avant de les rechercher dans la mémoire.
Vous pourrez aussi regrouper des lignes de programmes non concernées par les branchements de type GOTO, GOSUB... ou les tests (condition IF... THEN... ELSE), en une seule ligne, mais ceci est préjudiciable à la clarté du programme ; vous éviterez donc de l'effectuer sur la version originale.
D'autres possibilités vous sont offertes pour améliorer les temps d'exécutions, nous vous proposons ci-après des programmes qui permettront d'automatiser les actions à effectuer.
IV. Eliminons les blancs inutiles
Un truc connu probablement par beaucoup d'entre vous, pour permettre à l'interpréteur d'éliminer automatiquement les espaces indésirables, est de frapper la commande :
POKE &AC00,1 avant toute entrée de ligne de programme.
Seulement, pour des facilités de corrections ultérieures en cas d'erreur, nous vous conseillons d'entrer nos programmes tels qu'ils sont décrits, ou de frapper les vôtres sans être avare d'espaces.
Nous vous conseillons dans un premier temps de sauvegarder le programme sous une forme de fichier ASCII par la commande :
SAVE "PROG.ASC'',A Une autre possibilité pour sauvegarder le programme sous forme ASCII est d'ouvrir un fichier au nom du programme par l'instruction OPENOUT, puis de lister le programme par l'intermédiaire de l'unité de sauvegarde : OPENOUT "PROG.ASC"
Vous pourrez ensuite utiliser la case mémoire précédente (&AC00) pour éliminer les blancs, mais sous une forme différente. Le truc étant de recharger le programme précédent après avoir frappé le POKE salutaire. Voici donc l'ordre des opérations à effectuer :
Vous disposerez ainsi sur votre unité de sauvegarde de deux versions du programme : la version ASCII que vous pourrez réutiliser ultérieurement afin d'y effectuer des modifications ou des études sur certaines portions, et la version Basic sans blanc, plus optimisée pour l'exécution.
V. Fini le blabla...
Tout comme les espaces, l'instruction REM, utilisée pour ajouter des commentaires, allonge considérablement les temps d'exécution, surtout dans les boucles.
Nous avons donc conçu un programme qui enlève automatiquement les instructions REM et leurs commentaires associés.
La réflexion, qui s'est imposée, concerna les différentes façons d'écrire l'instruction dans un programme.
Si l'on supprime toute l'instruction, il nous restera une ligne vide portant le numéro 10. Deux cas peuvent alors se présenter :
— soit il est possible de supprimer la ligne sans porter préjudice au fonctionnement du programme ;
— soit une autre ligne fait référence à celle-ci, et dans ce cas il est hors de question de la supprimer, sous peine de plantage.
Il vous appartiendra de vérifier ce deuxième cas, et d'effectuer les modifications nécessaires, pour utiliser l'une ou l'autre version du programme que nous vous proposons.
20 PRINT "PROGRAMME MACHIN":REM AFFICHAGE
Notre programme devra donc supprimer la fin de la ligne REM + commentaire, mais aussi le caractère : devenu inutile.
30 FLAGREM = 2 Il ne faudrait pas supprimer le REM et sa suite.
Ce qui serait quelque peu embarrassant pour la compréhension du programme, voire son déroulement.
Nous avons de plus réservé la possibilité quelquefois intéressante de pouvoir mettre des instructions en remarques, instructions qui se trouveraient replacées dans le programme, suite à l'utilisation du logiciel que nous vous proposons. Il suffirait d'insérer le caractère : (deux points) entre la remarque et l'instruction.
L'algorigramme
L'étude des quatre cas précédents nous a permis de préciser le schéma général du programme, que nous avons décomposé en sous-programmes reconnaissant les différentes possibilités.
Voici l'algonigramme proposé pour le programme principal :
|
On s'aperçoit, qu'après avoir demandé le nom du programme à traiter (en ASCII) le programme va ouvrir un fichier temporaire en écriture pour y sauvegarder les lignes traitées.
Tant que la fin du fichier n'est pas atteinte, chaque ligne sera lue et traitée caractère par caractère. Le compteur est affiché pour signaler au programmeur que le programme n'est pas planté (dans le cas de programmes longs).
Vous remarquerez que lorsque l'instruction REM a été détectée, le compteur est incrémenté sans sauvegarde du caractère en cours de traitement.
Le sous-programme de recherche de guillemets aura la structure suivante :
On remarquera que la variable FLAG (ou indicateur) est une variable que l'on pourrait appeler à bascule, puisqu'elle prendra la valeur 1 si un guillemet est détecté une première fois, puis 0 lorsque l'on refermera ces guillemets.
REM sera traité selon l'algonigramme suivant :
La reconnaissance des deux points signalant la fin d'une instruction REM aura la forme :
Enfin avant de sauvegarder chaque ligne, il faudra vérifier si elle est vide, ce qui sera réalisé par le sous-programme page suivante.
Après lecture du numéro de ligne, signalée par la présence du premier ESPACE de la ligne, le programme recherche si un caractère se présente avant la fin de la ligne, smon il crée une variable de sauvegarde vide.
Le programme
Des algongrammes précédents, voici le programme Basic commenté
|
Le listing ci-dessus considère qu'aucun saut n'est effectué à une ligne contenant uniquement une instruction REM, donc élimine ces dernières sans pitié.
Au cas où le programme contient des sauts à des adresses de commentaires, vous pouvez modifier la ligne contenant les instructions :
Nous allons récapituler la procédure d'amélioration de la rapidité de vos programmes :
a) Sauvegardez une version originale sous forme ASCII par SAVE "PROG1 .ASC",A
b) Déclarez si possible toutes les variables selon leur utilisation.
c) Regroupez les lignes pouvant l'être en une seule ligne.
d) Sauvegardez le programme sous forme ASCII par SAVE "PROG2.ASC",A
e) Entrez POKE &AC00,1 puis chargez le programme par LOAD "PROG2.ASC", que vous resauvegardez aussitôt sous le même nom, et en ASCII comme ci-dessus.
f) Lancez la version que vous aurez choisi du programme suppresseur de REM (il faut obligatoirement un lecteur de disquette à partir de cette étape).
g) Chargez la version temporaire du programme, qui est sauvegardée en ASCII (LOAD "TEMP.ASC") et sauvegardez-la aussitôt en Basic sous le nom final (SAVE "PROG.BAS").
|
Page créée en 061 millisecondes et consultée 470 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. |