Oui, tout ce qui concerne l'accès au vdp est très difficile à comprendre car peu et mal documenté. J'ai eu beaucoup de mal à tout reconstituer, et je crois que je n'y serais jamais arrivé sans la doc technique fournie par Jean-Louis.
LVDP et WVDP ne sont pas des instructions 7020, mais des mnémoniques définis par Exelmax. Pour éviter les malentendus, je préfère utiliser les vraies instructions :
- MOVP A, P46 pour écrire l'octet du registre A en ram vdp
- MOVP P36, A pour lire un octet de ram vdp dans le registre A
Pour compliquer les choses, il est possible de définir des instructions microcodées en modifiant la rom du TMS7020. C'est à dire choisir un code instruction et lui faire faire autre chose. C'est ce qui a été fait pour le SWAP. On trouve dans le code du moniteur système EXL100 tout plein de SWAP R40, ou SWAP R0, ou SWAP n'importe quoi.
Ce ne sont pas des SWAP. L'instruction SWAP n'existe pas dans l'EXL100 ni dans l'EXELTEL. Elle a été remplacée par une lecture ram VDP qui retourne l'octet lu dans le registre A. C'est un piège où sont tombés des informaticiens chevronnés
L'avantage est la rapidité d'exécution : 5 cycles d'horloge, contre 11 pour le MOVP. Mais il y a aussi une petite subtilité supplémentaire : le SWAP n'est pas rigoureusement équivalent à MOVP P36,A. Les deux lisent un octet, mais n'ont pas la même action sur l'affectation des pointeurs ACMP et ACMPXY du vdp. D'après mes déductions, le SWAP est équivalent à deux instructions :
- MOVP P40, A Initialisation en lecture
- MOVP P36, A Lecture d'un octet
Il fait exactement la même chose en 5 cycles au lieu de 22. Imaginez la lenteur du Basic si le SWAP n'était pas utilisé : Quatre fois plus lent pour lire en mémoire
Je ne détaillerai pas davantage les règles de sélection des pointeurs ram VDP, c'est trop difficile à expliquer en quelques lignes. Les deux pages de la doc Texas Instrument sur le sujet sont d'ailleurs incompréhensibles. Pourtant, quand on les relit après avoir tout compris, il n'y a pas d'erreur. Uniquement un manque de précision.