Cet article est la suite de deux précédents articles. Le premier, en plusieurs parties, était l'implémentation de l'affichage d'un « gros pixel » sur l'écran du VG5000µ. Le second était celui sur la possibilité (ou plutôt la difficulté) d'ajouter des commandes au BASIC du VG5000µ.
Il existe cependant une façon d'ajouter des commandes au BASIC... ou presque. Cette possibilité est évoquée brièvement dans le livre « Clefs pour VG5000 » page 98. À charge au lecteur de se débrouiller.
Cette méthode, indiquée dans le livre, est à vrai dire celle qui est utilisée par l'implémentation BASIC de la machine. Chaque routine d'instruction démarre avec HL
qui pointe dans le buffer du texte BASIC sur l'octet suivant le token d'instruction, et donc sur ses éventuels paramètres.
C'est donc le cas, comme les autres, de l'instruction CALL
. La routine de l'instruction se charge de lire l'adresse puis de l'appeler. Par lecture de ce paramètre, HL
a été positionné après celui-ci et c'est donc dans cet état que la routine utilisateur est appelée.
Exemple
Voici un exemple rapide d'une commande qui peut s'appeler par CALL &"7000",X,Y
, X et Y étant les coordonnées du point à afficher. La routine setpoint
est celle de l'article cité au début.
L'idée derrière le premier jp
est de commencer par une série de jp
qui amène aux différentes routines qui seront donc CALL &"7000"
, CALL &"7003"
, CALL &"7006"
,...
On peut même aller jusqu'à mettre l'adresse dans une variable pour obtenir quelque chose comme CALL SP,X,Y
(les variables ont deux caractères maximum significatif sur VG5000µ).
defc chkchr = $8
defc getbyt = $0086
org $7000
entry:
jp call_setpoint
call_setpoint:
push bc ; Sauvegarde des registres, sauf HL, dont on a besoin
push af
push de
rst chkchr ; Il doit y avoir une virgule, ou c'est une erreur de syntaxe
defb ','
call getbyt ; Puis une expression 8 bits entière pour la première coordonnée X dans A et (D)E
push de ; Sauve cette valeur sur la pile
rst chkchr ; Il doit y avoir une virgule, ou c'est une erreur de syntaxe
defb ','
call getbyt ; Puis une expression 8 bits entière pour la seconde coordonnée Y dans A et (D)E
ex (sp), hl ; Récupère la coordonnée X (dans L) en échange du pointeur sur le texte BASIC
ld h, a ; Place la coordonnée Y dans H
call setpoint ; Appel l'affichage du point avec les coordonnées dans HL
pop hl ; Restaure les registres, dont HL
pop de
pop af
pop bc
ret
D'autres choses ?
Le livre indique aussi la possibilité d'utiliser deint ($0083)
. Ce n'est cependant pas possible directement. Cette fonction prend ce qui est dans l'accumulateur flottant et le place en tant qu'entier dans DE
. Mais il faut donc au préalable charger l'accumulateur flottant.
C'est possible avec eval_num_ex ($284d)
, qui doit donc être appelé au préalable, car c'est cette routine qui analyse l'expression et vérifie qu'elle est numérique.
Conclusion
Grâce à cette méthode, il est donc possible de créer une petite bibliothèques de routines assembleurs appelable avec des paramètres depuis le BASIC.