APPLICATIONSPROGRAMMATION ★ 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
retour. Les quelques remarques qui parsèment le listing source, suffisent à expliquer simplement le principe de fonctionnement de notre programme. Appliquons-nous plutôt à détailler les différentes routines-système concernant nos fameuses interruptions, en espérant qu'elles vous serviront à mieux élaborer vos propres réalisations.

  • CALL &BCD7 ; initialise et dépose un bloc événement qui sera activé lors d'une interruption en provenance du Z80, c'est-à-dire à chaque balayage de l'écran.
  • CALL &BCE0: initialise et dépose un bloc d'événement qui sera activé lors d'une interruption rapide (tous les 1/300e de seconde).
  • CALL &BCEF: initialise un bloc d'événement.

Pour ces trois vecteurs, il faut charger préalablement :

  • HL avec l'adresse du bloc d'événement pour lequel 7 octets ont été réservés.
  • DE avec l'adresse de votre routine.
  • C avec le numéro de la ROM supérieure (si une est utilisée).
  • B avec la classe de l'événement. Voici comment déterminer cette classe :
    • Le bit 0 donne la location approximative de la routine. S'il est à 0, l'adresse continue dans HL est en ROM supérieure, sinon, elle se trouve en ROM inférieure ou en RAM.
    • Les bits 1 à 4 déterminent la priorité et le bit 5 doit être à 0.
    • Le bit 6 à 1 donne une priorité d'ordre supérieur.
    • Le bit 7 à 1 permet au bloc de rester constamment dans la “Pending Queue”.

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.

  • CALL &BCDA : dépose un bloc d'événement devant être traité lors d'une interruption en provenance du Z80.
  • CALL &BCE3 : dépose un bloc d'événement devant être traité lors d'une interruption rapide (1 /300e de seconde).
  • CALL &BCDD : enlève un bloc d'événement de la liste des interruptions Z80.
  • CALL &BCE6 : enlève un bloc d'événement de la liste des interruptions rapides.
  • CALL &BCEC : enlève un bloc d'événement de la liste des interruptions normales.
    Il suffit d'entrer dans ces routines avec l'adresse du bloc d'événement chargée dans le double registre HL, pour l'obtention sans plantage du résultat désiré. Notre extraordinaire dévouement à votre égard, nous oblige à vous offrir une dernière routine importante.
  • CALL &BCE9 : dépose un bloc d'événement devant être traité lors d'une interruption normale (1/50 sec).

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...

AMMAG n°32

★ EDITEUR: AM-MAG
★ ANNÉE: 1988
★ CONFIG: ???
★ LANGAGE:
★ LiCENCE: LISTING
★ AUTEURS: Denis Jarril et Jean-Claude Paulin
 

★ AMSTRAD CPC ★ DOWNLOAD ★

Type-in/Listing:
» Star  Wars  sous  Interruption    FRENCHDATE: 2020-04-22
DL: 249
TYPE: ZIP
SiZE: 5Ko
NOTE: 40 Cyls
.HFE: Χ

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Applications » Keymouse (CPC Amstrad International)
» Hardware » MEDL Tracker Balls / TrackBall RB2
» Applications » Firmware: mouse support ROMs
» Hardware » Souris - Joystick Mouse
» Hardware » AMX Mouse mk2
» Hardware » Souris - Kempston Mouse (Computing With the Amstrad)
Je participe au site:
» Vous avez des infos personnel, des fichiers que nous ne possédons pas concernent ce programme ?
» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 219 millisecondes et consultée 2120 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.