★ CODING ★ CLASSEURS WEKA ★ Comment exploiter toutes les ressources et augmenter les performances de votre AMSTRAD CPC ★ |
4/1.6.4 - Utilisation des vecteurs du système d'exploitation sous Basic (14e Complément) | Coding Classeurs Weka |
4/0 - Langages du CPC4/1.6 - Basic approfondi 4/1.6.4 Utilisation des vecteurs du système d'exploitation sous Basic I. Présentation Dans les entrailles de la mémoire RAM des AMSTRAD CPC se trouvent des points d'accès à des routines intéressantes du moniteur du système d'exploitation. Les points d'accès (appelés points d'entrée ou encore vecteurs) sont situés à partir de l'adresse &BBOO et sont composés de sauts aux adresses de traitement dans la ROM moniteur. Vous trouverez en partie 4, chapitre 2.7, page 1 et suivantes, la liste détaillée de ces vecteurs, de leurs conditions d'appel et des résultats en sortie de la routine. Les programmeurs confirmés en langage d'assemblage utilisent en général ces vecteurs, ce qui leur évite de réécrire des routines complètes assurant la même fonction. Le programmeur en Basic, hésitant à utiliser l'Assembleur et son rebutant code machine, se sent quelque peu frustré à l'idée d'être privé de l'accès à ces vecteurs. Bien sûr, certains sont accessibles directement à partir du Basic, par exemple la commande souvent utilisée : CALL &BB06 rend un grand service en économisant les lignes de programme suivantes : 10 A$ = inkey$gourmandes en mémoire. Mais les vecteurs de ce type sont rares et ne permettent pas une utilisation complète de leurs possibilités. |
Pile paramètre | ||
IX+&11 | Adresse haute | Adresse de la routine |
IX+&10 | Adresse basse | |
IX+&0F | Adresse A% haut | Registre A |
IX+&0E | Adresse A% bas | |
IX+&0D | Adresse F% haut | Registre flags |
IX+&0C | Adresse F% bas | |
IX+&0B | Adresse B% haut | Registre B |
IX+&0A | Adresse B% bas | |
IX+&09 | Adresse C% haut | Registre C |
IX+&08 | Adresse C% bas | |
IX+&07 | Adresse D% haut | Registre D |
IX+&06 | Adresse D% bas | |
IX+&05 | Adresse E% haut | Registre E |
IX+&04 | Adresse E% bas | |
IX+&03 | Adresse H% haut | Registre H |
IX+&02 | Adresse H% bas | |
IX+&01 | Adresse L% haut | Registre L |
IX+&00 | Adresse L% bas |
Le principe consistera donc, dans l'ordre, à :
— récupérer les paramètres affectant les registres,
— récupérer et placer l'adresse de saut au vecteur,
— effectuer le saut avec les registres positionnés,
— récupérer les paramètres rendus par la routine,
— retourner au Basic.
L'organigramme
(Organigrammes pages 5 et 6)
On remarquera la sauvegarde provisoire des paramètres dans la pile système, car les registres sont momentanément utilisés pour le traitement.
L'adresse est récupérée et placée en mémoire juste après le code d'une instruction CALL.
Les registres sont dépilés juste avant d'effectuer le saut.
Au retour de la routine, on empile à nouveau les registres pour les récupérer un à un et les réaffecter dans les variables grâce aux pointeurs transmis.
On remarquera aussi la remise à sa valeur initiale de la valeur du point IX de la pile paramètre (ayant été incrémenté &11 fois, il faut lui retirer ensuite cette valeur — nous verrons dans le programme comment retirer ce nombre au registre HL).
LE PROGRAMME ASSEMBLEUR
Voici le programme Assembleur accompagné de larges commentaires pour en faciliter la compréhension.
|
Commentaires :
— Lignes 31 à 33 : le code &C9 (RET) est placé au début de la routine d'installation pour éviter une nouvelle installation, qui provoquerait une erreur.
— Ligne 65 : chacun des registres, ayant été assemblé sous forme de registre double (AF, BC, DE, HL) dans le registre DE, celui-ci est empilé (4 fois donc).
— Lignes 69 à 73 : l'adresse de saut récupérée dans la pile paramètre est sauvegardée juste après le code &CD (CALL) en lignes 87 à 89.
— Ligne 77 : il fallait retirer le nombre hexadécimal &0011 au registre HL pour restaurer le registre IX (étudiez le passage par la pile SP pour l'échange), nous allons en fait utiliser l'opération inverse, c'est-à-dire l'addition, mais cette fois-ci du complément à deux de ce nombre (le complément à deux d'un nombre est un nombre tel que les deux nombres ajoutés, on obtienne zéro, sans tenir compte de la retenue. De plus, le complément à deux d'un nombre s'effectue dans un format donné, ici sur deux octets). Le nombre que nous devons ajouter aura donc la valeur &FFEF.
Les lignes suivant le saut ne devraient pas poser de problème de compréhension, celles-ci reproduisant en fait le phénomène inverse pour redonner aux variables leurs nouvelles valeurs.
Utilisation
Après assemblage, le programme sera sauvegardé sur support entre les adresses &A000 et &A082.
Pour l'utiliser, il suffira, après chargement, de frapper la commande CALL &A000 et la nouvelle instruction
III. Le chargeur Basic
Nous vous proposons ci-après le programme permettant sous Basic de charger les codes de la routine assembleur.
|
Après chargement et sauvegarde, vous pourrez initialiser la routine en frappant les commandes suivantes :
Remarque :
Prenez soin de ne pas oublier la virgule juste après l'instruction ùCALL, sous peine de risquer un plantage lors de l'appel de certains vecteurs.
Conseils d utilisation
Afin de passer les pointeurs de variables à l'instruction sous Basic, il faut en premier lieu, les définir, ce qui implique que votre programme devra comporter, à son tout début, l'affectation de valeur à ces variables, par exemple :
Les variables non utilisées ne seront pas obligatoirement affectées, mais
Il est obligatoire de spécifier tous les paramètres dans l'instruction ùCALL...
Exemples d utilisations
Nous vous proposons d'abord un programme permettant d'expérimenter les routines qui vous semblent intéressantes avant de les inclure dans un programme.
Signalons d'abord que certains vecteurs ne vous apporteront aucun effet visible sous Basic, car lorsque vous êtes sous l'interpréteur Basic, le moniteur effectue les remises à jour de différents paramètres périodiquement (tous les 1/300® ou 1/50* de secondes). Par exemple le curseur est affecté, ce qui implique qu'il vous sera impossible de l'allumer ou de l'éteindre à volonté.
|
En reprenant le programme d'expérimentation, il vous suffira de modifier les différents paramètres en ligne 130 et l'adresse du vecteur en ligne 60010.
Le programme vous permet de visualiser après exécution, la valeur décimale, hexadécimale et binaire des différents registres retournés.
L'état binaire est surtout important pour le registre de flags F%, dont les indicateurs (C, Z, S, ...) sont repris au dessous. Voici l'organisation des différents flags dans le registre F% :
Les différents registres de la ligne 130 à affecter sont H% pour la première colonne, D% pour la deuxième colonne, L% pour la première ligne, E% pour la deuxième ligne, et B% pour le sens haut ou bas. Vous placerez en ligne 60010 l'adresse &BC50 au lieu de &BB06, ainsi que l'instruction STOP en ligne 175 pour éviter l'affichage des variables.
Après un RUN sur un écran rempli de caractères, vous pourrez observer la zone déplacée.
Bien d'autres utilisations sont encore possibles, les vecteurs sont nombreux, depuis la gestion des unités de cassettes ou disquettes, des fonctions graphiques, et de la gestion des imprimantes (essayez le vecteur en &BD2E, voir Partie 4, Chap. 2.7, page 62), souvenez-vous seulement que certains vecteurs n'auront pas d'effet apparent, à cause de la remise en ordre effectuée par l'interpréteur Basic, et là, seul le langage machine est le dernier recours.
Page précédente : 4/1.6.3 - La gestion des variables dans les Amstrad CPC |
|
Page créée en 107 millisecondes et consultée 326 fois L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko. |