CODINGLA BIBLE DU CPC 6128

La bible du CPC 6128 : 2.04.00 Le traitement des interruptions dans le système d'exploitation

La possibilité la plus rapide et la plus puissante de réagir à l'intérieur du système d'exploitation à certains événements est sans doute la technique des interruptions.
Vous savez certainement ce que c'est. Sinon, voici l'essentiel de ce qu'on peut dire à ce sujet:

Une interruption est en général un événement d'ordre électronique qui informe un programme en train de tourner qu'il vient de se produire. En fonction de cet événement, le logiciel doit entreprendre des actions correspondantes et ce, le plus vite possible, suivant le niveau d'urgence. Une telle action sera par exemple le scrolling de l'écran pendant la phase sombre du rayon électronique, de façon à ce que l'image soit le plus nette possible.
Cette technique d'interruption présente l'avantage de n'interrompre le déroulement du programme que lorsqu'il y a vraiment une action à effectuer, de sorte que le logiciel n'est pas constamment obligé de contrôler s'il se passe quelque chose ou non.
Il y a naturellement de nombreuses possibilités pour intégrer une telle fonction dans un système d'exploitation mais nous devons reconnaître que nous n'avions jamais encore rencontré une variante du type de celle qui fonctionne sur le CPC.
Il s'agit ici d'un mélange raffiné d'interruption hardware (interruption lorsque nécessaire) et de polling (examen régulier de ce qui se passe). Le programmeur de la routine correspondante décide du niveau d'urgence d'une 'demande'. En clair Il n'y a qu'une seule interruption dans la machine, le timer (appelé fast ticker dans le système), qui produit une interruption tous les 300èmes de seconde. Tout le reste en découle, comme vous allez voir.

Il est maintenant temps d'introduire quelques concepts que vous rencontrerez souvent à partir de maintenant, y compris dans le commentaire de la ROM.

  1. EVENT signifie tout simplement événement. Comprenez qu'il s'agit d'une sorte d'interruption commandée par logiciel.
  2. FRAME FLYBACK n'est rien d'autre que le retour déjà évoqué du rayon de l'écran, ce qui se produit tous les SOèmes de seconde.
  3. TICKER est un multiple du fast ticker qui apparaît également tous les 50èmes de seconde.

Le tout est traité de façon à ce que le programmeur, donc éventuellement vous même, puisse définir quelles routines de son programme devront être appelées automatiquement, sans aucune intervention supplémentaire, et avec quelle fréquence elles devront être appelées au moment du flyback, ticker ou même fast ticker. Comme préparation, il suffit, outre quelques petits détails, de communiquer une fois l'adresse de cette ou de ces routines. Cette information à préparer s'appelle EVENT BLOCK. Ici est indiqué avec quelle fréquence et quant la routine doit être appelée, si elle est ou non prioritaire par rapport à d'autres routines, etc..

A l'entrée du Ticker, Fast Ticker ou Frame Fly, le système d'exploitation regarde s'il y a des Event blocks correspondants. Si oui, ils sont appelés, en fonction de leur degré de priorité. Certains event blocks existent en permanence, comme par exemple l'action qui consiste à alimenter le registre de couleur au moment du Frame Fly.

Les blocs affectés à un événement déterminé sont également reliés ensemble par le pointeur, de sorte que le système d'exploitation peut osciller de l'un à l'autre. Il est donc sans importance de savoir à quelle adresse figure un tel bloc, tant qu'il se trouve dans les 32K centraux de la RAM. Cette petite réserve doit être faite car cette zone est la seule à laquelle il soit possible d'accéder en permanence, indépendamment de la configuration de la ROM.

Si un tel bloc doit être exécuté, il est rangé dans ce qu'on appelle Pending Queue. Ce procédé est appelé Kicking.

La Pending Queue est traitée à la fin de la routine d'interruption propre du système. Vous vous dites certainement qu'un bloc existant doit naturellement être exécuté. Pourquoi faut-il donc le ranger dans une queue?

En fait, les choses ne sont pas aussi simples car vous avez tout à fait la possibilité de suspendre le traitement d'un bloc pour un certain temps, sans que vous ayez à l'extraire de la queue primaire; ceci est d'ailleurs très facile à réaliser avec les event blocks de la ticker queue.

A propos: ne croyez pas qu'il n'y ait que cette interruption dans l'ordinateur. Les fanas de l'électronique ont tout à fait la possibilité de produire une interruption à travers le bus d'extension (asynchron), mais il faut bien sûr qu'il y ait une routine correspondante qui puisse 'kicker' l'event block correspondant.

Devenons plus concret. Que faut-il faire lorsque vous voulez utiliser ce mécanisme?
Il faut bien sûr commencer par créer un event block dont la structure est définie ci-après. La partie suivante est commune à toutes sortes d'événements:

Octets 0+1 adresse de chaîne pour la pending queue. Ce champ ne doit être alimenté que par le système d'exploitation!

Octet 2 compteur
Tant que le compteur est > 0, le bloc reste dans la pending queue, c'est-à-dire que la routine est exécutée jusqu'à ce qu'il soit égal à 0.

Si le compteur est < 0 (c'est-à-dire > 127), le bloc reste dans la chaîne correspondante (ticker etc.). Le kicking ne conduit pas non plus dans ce cas à une exécution de la routine, alors que cela aurait normalement pour effet d'augmenter le compteur et donc de provoquer un saut à la prochaine occasion.

Octet 3 classe

Bit 0 = 1 = L'adresse de saut est une Near Adress, c'est-à-dire qu'elle se trouve dans la RAM centrale ou dans la ROM inférieure.

Bit 0 = 0 = L'adresse de saut est une Far Address, donc à rechercher dans la ROM supérieure.
Les bits 1-4 déterminent la priorité.

Bit 5 doit toujours valoir 0 !

Bit 6 = 1 = Express. Les express events ont une priorité supérieure à celle des événements normaux de la plus grande priorité.

Bit 7 = 1 = Asynchron Event. Ces événements n'ont pas de file d'attente et ils sont rangés immédiatement dans Pinterrupt pending queue lors du kicking (KL EVENT).
S'il s'agit même d'un express, cette routine est exécutée immédiatement, sinon seulement à la fin de la routine d'interruption.
Attention: la routine pour les événements asynchrones doit absolument se trouver dans la RAM centrale!


Octets 4+5 Adresse de la routine

Octet 6 ROM Select, si l'adresse de saut est du type Far, sinon inutilisé.

Octet 7 Ici commence le champ de l'utilisateur qui peut être aussi long que souhaité. Il peut servir à la transmission de paramètres à la routine. Lors de l'appel d'une event routine, hl contient l'adresse de l'octet 5 de l'event block, s'il s'agit d'une near adress, sinon l'adresse de l'octet 6.
Ceci permet de créer plusieurs blocs pour une même routine qui peut déterminer, en fonction des paramètres, par quel bloc elle a été appelée.


Suivant le type d'événement, Ticker, Fast Ticker ou Frame Fly, deux ou six octets sont encore placés avant la partie commune. Dans le cas de Fast Ticker et Frame Fly, ce ne sont que deux octets pour le chaînage (ne pas les modifier!) dans la Fast Ticker List ou la Frame Fly List.

Les six octets pour le Ticker ont la signification suivante:

Octets 0+1 Chaînage pour Ticker List (ne pas modifier!)

Octets 2+3 Tick Count détermine combien de fois un ticker doit apparaître, avant que le bloc ne soit kické une fois.

Octets 4+5 Reload Count indique quelle valeur doit être chargée dans le Tick Count après son écoulement.

Après donc que vous ayez alimenté votre bloc avec ces valeurs, pour autant que vous les connaissiez, (ce devraient être les 5 derniers octets (event count=0) de la partie commune et, pour le ticker, également les compteurs), vous n'avez plus qu'à charger l'adresse de début de votre bloc dans hl, puis, suivant le cas, à appeler la routine KL ADD TICKER, KL ADD FAST TICKER ou KL ADD FRAME FLY.

Pour extraire le bloc de la liste, utilisez les routines KL DEL TICKER, etc.. HL devant cette fois également contenir l'adresse du bloc à retirer.

Essayez et observez comment le système d'exploitation procède, car les procédures qui reviennent sans cesse sont également traitées à travers le mécanisme des événements.

★ ANNÉE: ???

Page précédente : La bible du CPC 6128 : 2.03.00 Utilisation des routines du système d'exploitation (!)
Je participe au site:

» 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 306 millisecondes et consultée 1653 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.