★ APPLICATIONS ★ PROGRAMMATION ★ STAR WARS SOUS INTERRUPTIONS (AM-MAG) ★ |
Star Wars sous Interruptions (AM-Mag) | Applications Programmation |
Lorsque le microprocesseur reçoit un signal dit “d'interruption”, il stoppe son travail en cours, en sauvegard (empile) les données et exécute une routine spécifique pour s'enquérir de l'état d'un périphérique (le clavier par exemple). Si rien de spécial n'est détecté, il récupère (dépile) ses données et reprend l'ouvrage un instant délaissé. Dans le cas contraire, il agit en conséquence. On peut utiliser les interruptions de manière judicieuse, afin d'exécuter une routine maison parallèlement à un programme principal. L'exemple de programmation “sous interruption” le plus fréquent est l'horloge, mais on peut aussi animer de la sorte un décor, ou adjoindre une musique à un programme sans en gêner le déroulement. C'est le cas de notre routine.Après lancement, le programme peut être supprimé par un NEW. Dès lors, quoique vous fassiez (un programme par exemple), quelques mesures du thème bien connu de “STAR WARS” viendront régulièrement bercer vos oreilles de mélomane. Les interruptions Sur CPC, les interruptions appellées “événements" sont gérées de façon spéciale. Le noyau (Kermel) les traite dans une chaîne appelée “Pending Queue" en fonction de leur niveau de priorité. La plus grande de ces priorités est bien sûr la scrutation du clavier, mais les interruptions telles que : les sons programmés sous Basic par l'instruction SOUND, les changements d'encre générés par SPEED INK, les sous-programmes avec EVERY ou AFTER, ou toute autre fonction que vous pourriez intégrer, sont également prises en compte par ce buffer de traitement. Une priorité doit être attribuée à la routine que l'on désire implanter, selon la manière stricte ou asynchrone de son exécution, sa rapidité (tous les trois-centièmes de seconde), sa lenteur (tous les cinquantièmes de seconde), ou sa réaction à ce qui se passe sur l'écran (synchronisation avec le balayage). Tout ceci pour vous conseiller d'utiliser de préférence les routines systèmes appropriées (et décrites plus loin) afin d'implanter vos chef-d'œuvre. Le CALL &BCD7 utilisé dans notre exemple, est facile d'emploi (un seul appel pour l'initialisation et le dépôt d'un bloc d'événement) et suffisamment rapide pour la musique malgré son affectation normale à l'écran. Un CALL &BCE9 aurait convenu, mais nécessité un CALL supplémentaire, vu qu'il dépose un bloc d'événement sans l'initialiser. Vient ensuite une zone réservée au système pour ledit bloc d'événement, puis une petite routine chargée banalement d'envoyer des données au PSG. A signaler que tous les registres utilisés sont sauvegardés par précaution, afin de ne pas nuire au programme principal lors du
Pour ces trois vecteurs, il faut charger préalablement :
La combinaison des bits 6 et 7 à 1, fixe une absolue priorité à votre routine qui peut même détrôner le scanning clavier de sa pôle position. Une fois le saut effectué, votre bloc est opérationnel, mais encore faut-il porter une attention toute particulière à son troisième octet. En effet, tant que sa valeur est supérieure à 0 (inférieure à 128), le bloc est reconnu et votre routine exécutée. Dans le cas contraire, elle ne sera pas prise en compte jusqu'au retour du compteur à la valeur normale d'exécution. Tout ceci pour justifier dans notre exemple, la mise à 1 de cet octet à chaque passage dans la routine. Essayez l'assemblage sans ces deux instructions et observez la flagrante différence. Après cette légère mise au point, retournons à nos fameux vecteurs système.
Il faut entrer dans ce vecteur avec l'adresse du bloc d'événement dans HL et la valeur initiale du compteur dans DE. Celui-ci décrémenté à chaque interruption, n'activera la routine qu'à 0. Il sera rechargé de la valeur placée dans BC. En principe, tout est dit sur ce délicat sujet. Nous vous laissons à vos cogitations et à vos découvertes. La difficulté réside dans l'application des quelques consignes chaleureusement promulguées ci-dessus. A titre d'exemple, changez le CALL &BCD7 en un CALL &BCE0 et étonnez-vous du résultat...
|