Le VG5000 pour les programmeurs Basic

Révision du 05/06/2016



Ce petit document contient un certain nombre d'informations utiles ou pas à tout programmeur Basic.


Les bugs spécifiques au Basic 1.0

Le Basic 1.0, made in Microsoft, contient malheureusement quelques jolies pétouilles. Ces erreurs sont corrigées par la version 1.1. Si vous voulez que vos programmes soient compatibles avec tous les VG5000, il faut tenir compte de ces erreurs :

Bug commande ACTION :
Si une interface VG5200 ou VU0001 n'est pas connectée sur l'ordinateur, la commande ACTION(0) ou ACTION(1) retournera systématiquement un 1 (soit bouton enfoncé). C'est l'erreur la plus grave car elle n'est pas contournable.

Bug utilisation notation hexadécimale :
Certaines commandes ne fonctionnent pas correctement si on utilise des valeurs numériques en hexadécimal. Le bug se produit lorsque la valeur est suivi d'un espace.

Ex :

IF PEEK(&"7FFF")=&"F3" THEN GOTO 100 : incorrect !
IF PEEK(&"7FFF")=&"F3"THEN GOTO 100 : correct


Sur une boucle FOR .. NEXT, c'est la même chose.

FOR I=&"7F00" TO &"7F01":PRINT:NEXTI : incorrect !
FOR I=&"7F00"TO &"7F01" :PRINT:NEXTI : incorrect !
FOR I=&"7F00"TO &"7F01":PRINT:NEXTI : correct !


Bug CALL dans un IF :
On ne peut pas utiliser la commande CALL après l'instruction IF. Cette erreur a été détectée dans le jeu Strip 21.

10 C=1:IF C=1 THEN CALL &"5880":GOTO 20 ' plante !

10 C=1:CALL &"5880":IF C=1 THEN GOTO 20 ' ok


Les bugs et bizarreries du Basic (toutes versions)

On ne peut pas faire suivre l'instruction CLOAD" par une autre commande si on charge un fichier binaire. On se retrouve alors avec une erreur fantaisiste "Erreur en ligne xx".

10 CLEAR 50,&"5FFF":CLOAD"TEST",&"6000":PRINT ' plante
10 CLEAR 50,&"5FFF":CLOAD"TEST",&"6000" ' ok

Ce qui suit n'est pas un bug, mais mérite d'être signalé.
La commande RND(1) n'est pas aléatoire et tire toujours la même suite de valeurs entre 0 et 1. Tapez et exécuter le programme suivant après avoir fait un reset de la machine :

10 A=RND(1)
20 PRINT A

Je peux déjà vous donner le résultat : .245121 !

Ce comportement peut s'avérer gênant dans des jeux de hasard, car l'utilisateur aura alors l'impression de toujours refaire la même partie. On peut contourner ce désagrément avec une boucle qui demande au joueur de taper sur une touche tout en tirant des numéros.

Autre particularité du VG5000, cette fois-ci sur une commande pourtant classique, INPUT. Si lors de la saisie l'utilisateur valide directement, l'ancienne valeur de la variable utilisée est conservée ! Ceci est valable autant pour les variables numériques que pour les chaînes.

10 A$="COUCOU"
20 INPUT A$
30 PRINT A$

Si vous tapez sur la touche "ENTREE" quand l'ordinateur vous demande de saisir une donnée, le message "COUCOU" s'affichera bien gentiment :-).



Les commandes manquantes du Basic VG5000

Si vous avez l'habitude de travailler avec d'autres langages Basic, vous serez surpris de l'absence de certaines commandes usuelles ou astuces pourtant bien utiles. Autant en prendre son parti.

- Pas de commande de suppression d'un ensemble de lignes dans un programme (typiquement, la commande DELETE dans d'autres Basic). Pour supprimer plusieurs lignes, il faut taper leurs numéros et valider.

- Impossibilité de sortir d'une boucle FOR I=... NEXT I avec un GOTO. On peut toujours accélérer la sortie d'une boucle en mettant la variable compteur à son maximum :

10 FOR I=1 TO 10
20 IF I=5 THEN I=10:GOTO 40
30 PRINT I
40 NEXT I

Une simple sortie de la boucle FOR n'est pas possible, car le Basic considère alors que la boucle n'est pas terminée. A la prochaine boucle FOR...NEXT avec la même variable compteur, la boucle ne commencera pas à la valeur que vous avez indiquée, mais à celle de la précédente boucle FOR...NEXT. Ca n'est pas clair ? Vous trouverez plus d'explications dans le document "VG5000_Technical bulletin_Basic 1.1.pdf" disponible sur le site http://vg5000.free.fr .

- La commande NEXT doit toujours être suivie d'une variable. Dommage pour l'optimisation mémoire...

- Pas de ELSE à la suite d'un IF ... THEN ... C'est clairement la plus grosse lacune du Basic.

- Pas de commande de gestion des erreurs ni de variable remontant la dernière erreur rencontrée dans un programme.

- Pas de commande permettant de sauvegarder un tableau de chaînes.

- Pas de commande pour convertir une chaîne de caractères en majuscules/minuscules.


Mon programme plante mais le message d'erreur ne s'affiche pas !

En fonction de l'endroit où votre programme se bloque, les paramètres d'affichage (texte ou graphique et couleurs) ne permettent pas de voir le message d'erreur retourné par le Basic. Là, on peut vraiment parler de gros défaut !

Il faut ruser et taper directement sous la ligne où devrait se trouver le message d'erreur.

FOR I=16385 TO 18385 STEP 80:POKE I,230:NEXTI

Evidemment, c'est plus facile à faire avec l'émulateur DcVG5k en utilisant la fonction "Simuler le clavier" qu'avec un vrai VG5000.


Optimiser l'espace mémoire d'un programme

- Le Basic du VG5000 a été conçu pour une machine ayant peu de mémoire vive. Il est de ce fait capable au niveau syntaxique de se passer d'espaces entre les instructions.

exemple :

10 FOR I=1 TO 100:PRINT "COUCOU":NEXT I ' standard

10 FORI=1TO100:PRINT"COUCOU":NEXTI ' sans les espaces !

Si la lisibilité devient hasardeuse, le gain en octets n'est pas à négliger lorsque votre programme est au point et rentre au chausse-pied dans la mémoire de la machine.

Certaines commandes ne peuvent se passer d'espaces. Vous pouvez les entrer sans, mais le VG5000 rajoutera automatiquement des blancs lorsque vous listerez la ligne concernée. Il s'agit commandes prenant comme paramètre une adresse de ligne : GOTO, GOSUB, RESTORE.
En fait, l'espace n'est pas stocké en mémoire, il est simplement rajouté par la machine lorsqu'elle affiche la ligne Basic.

- Vous pouvez limiter le nom des variables au maximum à deux caractères. Au dessus, c'est de l'espace gaspillé car le VG5000 n'en tient pas compte. Pire, il va confondre les variables.

coucou est équivalent à co

- Si la dernière commande d'une ligne est un PRINT"texte" ou l'assignation d'une chaîne de caractères dans une variable (A$="COUCOU"), vous pouvez supprimer le dernier guillemet : un octet de gagné !


- Trivial mais efficace : si vous redéfinissez des caractères avec les commandes SETEG ou SETET, faites-le dans un loader avant le chargement du programme principal. Les rédéfinitions sont conservées dans la mémoire de la puce vidéo !


- Si une variable numérique dans la commande IF doit être différente de zéro, un simple IF sans comparateur suffit.

Exemple :

10 IF K<>0 THEN PRINT "COUCOU"

est identique à :

10 IF K THEN PRINT "COUCOU"

- Limitez autant que possible l'usage de la notation hexadécimale. C'est parfois moins lisible, mais une valeur en hexadécimal occupe en mémoire deux octets de plus que son équivalent décimal. Accessoirement, cela vous évitera d'avoir à traquer des bugs sur la version 1.0 du Basic.