Envoyer un e-mail à Collection ThomsonCollection Thomson
EditoForum 2002Liens
Nanoreseau
Docs
Logiciels
Matériel
Imprimer le document
Retour à la liste

WHY???

Dans beaucoup de cas, les programmeurs sous Basic aimeraient pouvoir afficher les messages d'erreur sans sortir du programme en cours. On peut toujours afficher la valeur de ERR et de ERL. Mais ERR ne donne que le code de l'erreur survenue. Pour afficher le message correspondant, il faudrait recourir à l'instruction ERROR qui, bien malheureusement, stoppe net le processus du programme Basic.

Il est toujours possible de dresser une liste de messages correspondant aux différentes erreurs que l'on peut rencontrer. Mais cela impose une perte importante de place en mémoire. De plus, le programmeur peut oublier certains messages.

Pourquoi, dans le cas de programmes tournant sur MO6/TO9/TO8/TO8D/TO9+, ne pas faire appel aux messages d'erreur offerts par l'ExtraMoniteur, si pratiques, si... anglais et dont tous les utilisateurs connaissent la signification?

Le programme de gestion d'erreur s'en trouve effectivement réduit, d'autant plus qu'il serait du coup capable d'afficher le message de toutes les erreurs connues du Basic.

Cela nécessiterait quand même la mise au point d'un programme en langage machine, entièrement translatable, qui ne prendrait pas plus que 35 octets:

CC 0014           LDD    #$0014        A=Code d'erreur/B=Code programme
30 8C 03          LEAX   <MESS,PCR     Pointeur sur buffer de message
7E EC0C           JMP    $EC0C         Envoie à l'ExtraMoniteur
           MESS   RMB    26            Buffer de réception du message

Dans A (adresse d'implantation +1) sera poké le code d'erreur rendu par ERR. Dans B se trouve le code d'appel pour l'ExtraMoniteur "ERRMSG" ($14). Et dans X le pointeur sur le tampon mémoire dans lequel vous trouverez, après appel de l'ExtraMoniteur, le message d'erreur lisible.

Le programme Basic suivant affichera donc votre message d'erreur dans son intégralité, comme le Basic lui-même en est capable:

10 BANK0:CLEAR1000,&H8000                 Réserve la mémoire
20 POKE&H8000,CHR$(204)+CHR$(0)+CHR$(20)  |
+CHR$(48)+CHR$(140)+CHR$(3)+CHR$(126)+CH  | Implante le programme machine
R$(236)+CHR$(12)                          |
30 ON ERROR GOTO 1010                     Dirige le traitement des erreurs
.....
1010 POKE&H8001,ERR                       Initialise le code d'erreur
1020 EXEC&H8000                           Récupère le message
1030 A$=PEEK$(&H8009,30)                  Message dans A$
1040 PRINT                                Passe une ligne
1050 PRINT LEFT$(A$,INSTR(A$,CHR$(0)))+"  | Affiche le message d'erreur
    in";ERL;CHR$(24)                      | et efface la fin de la ligne
1060 BEEP                                 Génère un bip
1070 RESUME 190                           Boucle sur la suite

Pour le MO6, le principe est le même que sur les TO de dernière génération. Il faudra commuter sur la banque de l’ExtraMoniteur avant d’exécuter l’une de ses fonctions. Cela revient à mettre le bit 5 de $A7C0 à 0 : JSR $EFFB nous en offre un raccourci (le registre U est altéré). Le programme en assembleur, couvrant maintenant 48 octets :

BD EFFB           JSR    $EFFB        Passe en banque ExtraMoniteur
CC 0014           LDD    #$0014       A=Code d’erreur / B=Code programme
30 8C 03          LEAX   <MESS,PCR    Pointeur sur buffer de message
103F              SWI2                Envoie à l’ExtraMoniteur
39                RTS                 Retour au Basic
           MESS   RMB    26           Buffer de réception du message

...et le programme Basic qui en découle :

10 BANK0 :CLEAR,&H3FFF                         Réserve la mémoire
20 POKE&H4000,CHR$(189)+CHR$(239)+             |
     CHR$(251)+CHR$(204)+CHR$(0)+CHR$(20)+     | Implante le
     CHR$(48)+CHR$(140)+CHR$(3)+CHR$(16)+      | programme machine
     CHR$(63)+CHR$(57)                         |
30 ON ERROR GOTO 1010                          Dirige le traitement des erreurs
.......
1010 POKE&H4004,ERR                            Initialise le code d’erreur
1020 EXEC&H4000                                Récupère le message
1030 A$=PEEK$(&H400C,30)                       Message dans A$
1040 PRINT                                     Passe une ligne
1050 PRINT LEFT$(A$,INSTR(A$,CHR$(0)))+        | Affiche le message d’erreur
       " in" ;ERL ;CHR$(24)                    | et efface la fin de la ligne
1060 BEEP                                      Génère un bip
1070 RESUME 190                                Boucle sur la suite

Libre à vous de personnaliser vos messages d’erreur!

Site
Plus
Forums
Code
Créations

*Site en favoris
*Page en favoris
*Site en démarrage
*Page en démarrage


Haut de page

Collection Thomson 2015 © Ghislain Fournier & François Mouret