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 lExtraMoniteur
avant dexécuter lune 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 derreur / B=Code programme
30 8C 03 LEAX <MESS,PCR Pointeur sur buffer de message
103F SWI2 Envoie à lExtraMoniteur
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 derreur
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 derreur
" 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 derreur!
|