Triceraprog
La programmation depuis le Crétacé

VG5000µ, Set Point assembleur depuis le BASIC ()

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.

Affichage des résultats de tests dans MAME